diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..f1861cfdd2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +*.v -text -diff +*.s -text -diff +*.scn -text -diff +*.sh eol=lf +*.jpg -text -diff +*.png -text -diff +*.gif -text -diff +*.pdf -text -diff +*.eps -text -diff diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a332c811a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,66 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Compiled Python +__pycache__/ +*.py[cod] + + +# Executables +*.exe +*.out +*.app + +# CMake temporary output + +CMakeCache.txt +CMakeFiles +cmake_install.cmake +install_manifest.txt + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc + +## Intermediate documents: +*.dvi + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + + +# Common editor backups +~$* +*~ +*.bak + +# Ignore Visual Studio User-specific files +*.suo +*.user +*.sln.docstates + + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..9b4ad178f2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,33 @@ +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. + +# avoid warning about WIN32 no longer defined in CYGWIN +set(CMAKE_LEGACY_CYGWIN_WIN32 0) + +PROJECT(STIR) + +SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) +# require 2.8.3 to get FOLDER properties support (without that, we only need cmake 2.6) +cmake_minimum_required(VERSION 2.8.3) + +# add project source to cmake path such that it can use our find_package modules and .cmake files +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/src/cmake) + +#### enable support for ctest +ENABLE_TESTING() + +ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(scripts) \ No newline at end of file diff --git a/GPL.txt b/GPL.txt new file mode 100644 index 0000000000..b409c58b43 --- /dev/null +++ b/GPL.txt @@ -0,0 +1,94 @@ +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. + +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + + + +Everyone is permitted to copy and distribute verbatim copies + +of this license document, but changing it is not allowed. + +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +· a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +· b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + +· c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +· a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +· b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +· c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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 + + diff --git a/LGPL.txt b/LGPL.txt new file mode 100644 index 0000000000..821d455464 --- /dev/null +++ b/LGPL.txt @@ -0,0 +1,154 @@ +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. + +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Everyone is permitted to copy and distribute verbatim copies + +of this license document, but changing it is not allowed. + + + +[This is the first released version of the Lesser GPL. It also counts + + as the successor of the GNU Library Public License, version 2, hence + + the version number 2.1.] + +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +· a) The modified work must itself be a software library. + +· b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + +· c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + +· d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + +· a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + +· b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + +· c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + +· d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + +· e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + +· a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + +· b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000000..50224ba7c9 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,294 @@ +Licensing information for STIR 3.0beta +---------------------------------- + +See for more info http://stir.sourceforge.net, section Registration. + +Most files contain a copyright statement. For those files where this is missing, the +following holds: + +Files in the following subdirectories are covered by the +GNU General Public License (see GPL.txt for text): + recon_test + utilities + analytic/FBP3DRP/FBP* + iterative/OSMAPOSL + include/stir/OSMAPOSL + +Files in all other subdirectories are covered by the +GNU Lesser General Public License (see LGPL.txt for text). + +Some files are in addition covered by the PARAPET license +(see PARAPETLICENSE.txt). This is always indicated in the file, but +a complete list is also given at the end of this file. + +SeparableMetzArrayFilter.cxx uses a (modified) fft routine from +Numerical Recipes. If you use this file, you need to comply with +their license policy (which requires you to buy the book). +We hope to replace this routine soon. + + +Explicit list of files that carry the PARAPET license +---------------------------------------------------- +./.git/index +./documentation/STIR-general-overview.tex +./documentation/STIR-glossary.tex +./documentation/STIR-UsersGuide.tex +./recon_test_pack/run_ecat_tests.sh +./recon_test_pack/run_tests.sh +./src/analytic/FBP2D/FBP2DReconstruction.cxx +./src/analytic/FBP2D/RampFilter.cxx +./src/analytic/FBP3DRP/ColsherFilter.cxx +./src/analytic/FBP3DRP/FBP3DRP.cxx +./src/analytic/FBP3DRP/FBP3DRPReconstruction.cxx +./src/buildblock/Array.cxx +./src/buildblock/ByteOrder.cxx +./src/buildblock/DataSymmetriesForViewSegmentNumbers.cxx +./src/buildblock/DiscretisedDensity.cxx +./src/buildblock/error.cxx +./src/buildblock/IndexRange.cxx +./src/buildblock/interfile_keyword_functions.cxx +./src/buildblock/KeyParser.cxx +./src/buildblock/line.cxx +./src/buildblock/linear_regression.cxx +./src/buildblock/NumericType.cxx +./src/buildblock/overlap_interpolate.cxx +./src/buildblock/ProjData.cxx +./src/buildblock/ProjDataFromStream.cxx +./src/buildblock/ProjDataGEAdvance.cxx +./src/buildblock/ProjDataInfo.cxx +./src/buildblock/ProjDataInfoCylindrical.cxx +./src/buildblock/ProjDataInfoCylindricalArcCorr.cxx +./src/buildblock/recon_array_functions.cxx +./src/buildblock/RelatedViewgrams.cxx +./src/buildblock/Scanner.cxx +./src/buildblock/Segment.cxx +./src/buildblock/SegmentBySinogram.cxx +./src/buildblock/SegmentByView.cxx +./src/buildblock/Sinogram.cxx +./src/buildblock/utilities.cxx +./src/buildblock/Viewgram.cxx +./src/buildblock/VoxelsOnCartesianGrid.cxx +./src/buildblock/warning.cxx +./src/buildblock/zoom.cxx +./src/display/display_array.cxx +./src/display/gen.c +./src/display/gen.h +./src/display/mathlinkhelp.c +./src/display/screen.c +./src/display/screen.h +./src/display/screengen.c +./src/eval_buildblock/ROIValues.cxx +./src/include/stir/analytic/FBP2D/FBP2DReconstruction.h +./src/include/stir/analytic/FBP2D/RampFilter.h +./src/include/stir/analytic/FBP3DRP/ColsherFilter.h +./src/include/stir/analytic/FBP3DRP/FBP3DRPReconstruction.h +./src/include/stir/Array.h +./src/include/stir/Array.inl +./src/include/stir/Array1d.h +./src/include/stir/ArrayFunction.h +./src/include/stir/ArrayFunction.inl +./src/include/stir/BasicCoordinate.h +./src/include/stir/BasicCoordinate.inl +./src/include/stir/Bin.h +./src/include/stir/Bin.inl +./src/include/stir/ByteOrder.h +./src/include/stir/ByteOrder.inl +./src/include/stir/CartesianCoordinate2D.h +./src/include/stir/CartesianCoordinate2D.inl +./src/include/stir/CartesianCoordinate3D.h +./src/include/stir/CartesianCoordinate3D.inl +./src/include/stir/common.h +./src/include/stir/config/gcc.h +./src/include/stir/config/visualc.h +./src/include/stir/convert_array.h +./src/include/stir/convert_range.inl +./src/include/stir/Coordinate2D.h +./src/include/stir/Coordinate2D.inl +./src/include/stir/Coordinate3D.h +./src/include/stir/Coordinate3D.inl +./src/include/stir/Coordinate4D.h +./src/include/stir/Coordinate4D.inl +./src/include/stir/CPUTimer.h +./src/include/stir/CPUTimer.inl +./src/include/stir/DataSymmetriesForViewSegmentNumbers.h +./src/include/stir/DiscretisedDensity.h +./src/include/stir/DiscretisedDensity.inl +./src/include/stir/DiscretisedDensityOnCartesianGrid.h +./src/include/stir/DiscretisedDensityOnCartesianGrid.inl +./src/include/stir/display.h +./src/include/stir/display.inl +./src/include/stir/doxygen_doc_for_boost.h +./src/include/stir/error.h +./src/include/stir/evaluation/ROIValues.h +./src/include/stir/FullArrayIterator.h +./src/include/stir/FullArrayIterator.inl +./src/include/stir/HighResWallClockTimer.h +./src/include/stir/IndexRange.h +./src/include/stir/IndexRange.inl +./src/include/stir/IndexRange2D.h +./src/include/stir/IndexRange2D.inl +./src/include/stir/IndexRange3D.h +./src/include/stir/IndexRange3D.inl +./src/include/stir/IndexRange4D.h +./src/include/stir/IndexRange4D.inl +./src/include/stir/interpolate.h +./src/include/stir/IO/ecat6_types.h +./src/include/stir/IO/ecat6_utils.h +./src/include/stir/IO/interfile.h +./src/include/stir/IO/InterfileHeader.h +./src/include/stir/IO/stir_ecat6.h +./src/include/stir/IO/stir_ecat7.h +./src/include/stir/IO/stir_ecat_common.h +./src/include/stir/KeyParser.h +./src/include/stir/line.h +./src/include/stir/linear_regression.h +./src/include/stir/linear_regression.inl +./src/include/stir/NestedIterator.h +./src/include/stir/NestedIterator.inl +./src/include/stir/NumericInfo.h +./src/include/stir/numerics/divide.h +./src/include/stir/numerics/divide.inl +./src/include/stir/numerics/overlap_interpolate.h +./src/include/stir/NumericType.h +./src/include/stir/NumericType.inl +./src/include/stir/NumericVectorWithOffset.h +./src/include/stir/NumericVectorWithOffset.inl +./src/include/stir/OSMAPOSL/OSMAPOSLReconstruction.h +./src/include/stir/PixelsOnCartesianGrid.h +./src/include/stir/PixelsOnCartesianGrid.inl +./src/include/stir/ProjData.h +./src/include/stir/ProjData.inl +./src/include/stir/ProjDataFromStream.h +./src/include/stir/ProjDataFromStream.inl +./src/include/stir/ProjDataGEAdvance.h +./src/include/stir/ProjDataInfo.h +./src/include/stir/ProjDataInfo.inl +./src/include/stir/ProjDataInfoCylindrical.h +./src/include/stir/ProjDataInfoCylindrical.inl +./src/include/stir/ProjDataInfoCylindricalArcCorr.h +./src/include/stir/ProjDataInfoCylindricalArcCorr.inl +./src/include/stir/recon_array_functions.h +./src/include/stir/recon_buildblock/AnalyticReconstruction.h +./src/include/stir/recon_buildblock/BackProjectorByBin.h +./src/include/stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h +./src/include/stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h +./src/include/stir/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.h +./src/include/stir/recon_buildblock/DataSymmetriesForBins.h +./src/include/stir/recon_buildblock/DataSymmetriesForBins.inl +./src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h +./src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.inl +./src/include/stir/recon_buildblock/distributable.h +./src/include/stir/recon_buildblock/distributableMPICacheEnabled.h +./src/include/stir/recon_buildblock/distributable_main.h +./src/include/stir/recon_buildblock/ForwardProjectorByBin.h +./src/include/stir/recon_buildblock/ForwardProjectorByBin.inl +./src/include/stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h +./src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h +./src/include/stir/recon_buildblock/FourierRebinning.h +./src/include/stir/recon_buildblock/IterativeReconstruction.h +./src/include/stir/recon_buildblock/ProjMatrixByBin.h +./src/include/stir/recon_buildblock/ProjMatrixByBin.inl +./src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h +./src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.h +./src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.inl +./src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.h +./src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.inl +./src/include/stir/recon_buildblock/RayTraceVoxelsOnCartesianGrid.h +./src/include/stir/recon_buildblock/Reconstruction.h +./src/include/stir/recon_buildblock/RelatedBins.h +./src/include/stir/recon_buildblock/RelatedBins.inl +./src/include/stir/recon_buildblock/RelatedDensels.h +./src/include/stir/recon_buildblock/RelatedDensels.inl +./src/include/stir/recon_buildblock/SymmetryOperation.h +./src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.h +./src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.inl +./src/include/stir/RelatedViewgrams.h +./src/include/stir/RelatedViewgrams.inl +./src/include/stir/RunTests.h +./src/include/stir/Scanner.h +./src/include/stir/Scanner.inl +./src/include/stir/Segment.h +./src/include/stir/Segment.inl +./src/include/stir/SegmentBySinogram.h +./src/include/stir/SegmentBySinogram.inl +./src/include/stir/SegmentByView.h +./src/include/stir/SegmentByView.inl +./src/include/stir/Sinogram.h +./src/include/stir/Sinogram.inl +./src/include/stir/stream.h +./src/include/stir/stream.inl +./src/include/stir/Succeeded.h +./src/include/stir/TimedBlock.h +./src/include/stir/TimedObject.h +./src/include/stir/TimedObject.inl +./src/include/stir/Timer.h +./src/include/stir/Timer.inl +./src/include/stir/utilities.h +./src/include/stir/utilities.inl +./src/include/stir/VectorWithOffset.h +./src/include/stir/VectorWithOffset.inl +./src/include/stir/Viewgram.h +./src/include/stir/Viewgram.inl +./src/include/stir/ViewSegmentNumbers.h +./src/include/stir/ViewSegmentNumbers.inl +./src/include/stir/VoxelsOnCartesianGrid.h +./src/include/stir/VoxelsOnCartesianGrid.inl +./src/include/stir/zoom.h +./src/IO/ecat6_utils.cxx +./src/IO/interfile.cxx +./src/IO/InterfileHeader.cxx +./src/IO/stir_ecat6.cxx +./src/IO/stir_ecat_common.cxx +./src/iterative/OSMAPOSL/OSMAPOSL.cxx +./src/iterative/OSMAPOSL/OSMAPOSLReconstruction.cxx +./src/recon_buildblock/AnalyticReconstruction.cxx +./src/recon_buildblock/BackProjectorByBin.cxx +./src/recon_buildblock/BackProjectorByBinUsingInterpolation.cxx +./src/recon_buildblock/BackProjectorByBinUsingInterpolation_3DCho.cxx +./src/recon_buildblock/BackProjectorByBinUsingInterpolation_linear.cxx +./src/recon_buildblock/BackProjectorByBinUsingInterpolation_piecewise_linear.cxx +./src/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.cxx +./src/recon_buildblock/DataSymmetriesForBins.cxx +./src/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.cxx +./src/recon_buildblock/DataSymmetriesForDensels.cxx +./src/recon_buildblock/distributable.cxx +./src/recon_buildblock/distributableMPICacheEnabled.cxx +./src/recon_buildblock/ForwardProjectorByBin.cxx +./src/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.cxx +./src/recon_buildblock/ForwardProjectorByBinUsingRayTracing.cxx +./src/recon_buildblock/ForwardProjectorByBinUsingRayTracing_Siddon.cxx +./src/recon_buildblock/FourierRebinning.cxx +./src/recon_buildblock/IterativeReconstruction.cxx +./src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx +./src/recon_buildblock/ProjMatrixByBin.cxx +./src/recon_buildblock/ProjMatrixByBinUsingRayTracing.cxx +./src/recon_buildblock/ProjMatrixElemsForOneBin.cxx +./src/recon_buildblock/RayTraceVoxelsOnCartesianGrid.cxx +./src/recon_buildblock/Reconstruction.cxx +./src/recon_buildblock/SymmetryOperation.cxx +./src/recon_buildblock/SymmetryOperations_PET_CartesianGrid.cxx +./src/recon_test/bcktest.cxx +./src/recon_test/fwdtest.cxx +./src/test/test_Array.cxx +./src/test/test_ByteOrder.cxx +./src/test/test_convert_array.cxx +./src/test/test_coordinates.cxx +./src/test/test_display.cxx +./src/test/test_filename_functions.cxx +./src/test/test_IndexRange.cxx +./src/test/test_interpolate.cxx +./src/test/test_linear_regression.cxx +./src/test/test_proj_data_info.cxx +./src/test/test_VectorWithOffset.cxx +./src/test/test_VoxelsOnCartesianGrid.cxx +./src/utilities/compare_image.cxx +./src/utilities/compare_projdata.cxx +./src/utilities/display_projdata.cxx +./src/utilities/do_linear_regression.cxx +./src/utilities/ecat/convecat6_if.cxx +./src/utilities/ecat/conv_to_ecat6.cxx +./src/utilities/ecat/conv_to_ecat7.cxx +./src/utilities/extract_segments.cxx +./src/utilities/manip_image.cxx +./src/utilities/manip_projdata.cxx +./src/utilities/postfilter.cxx diff --git a/PARAPETLICENSE.txt b/PARAPETLICENSE.txt new file mode 100644 index 0000000000..3edebff4ff --- /dev/null +++ b/PARAPETLICENSE.txt @@ -0,0 +1,42 @@ +Parapet Project Software Distribution Agreement + +This agreement regulates the distribution of the software developed in +the Parapet project. Under this agreement and by downloading the +Parapet Software, the recipient of the software agrees to the +following principles and conditions: + +1. The software is copyright the Parapet Consortium comprising the + partners of the Parapet Esprit Long Term Research Project Number + 23493 (Parapet Project). + +2. The software may be used for any purpose provided the partners in + the Parapet Project are individually acknowledged in that use. + +3. The software and accompanying documentation are supplied without + warranty, without maintenance and without acceptance by any of the + partners in the Parapet Project of any liability for any outcomes + of their use. The Parapet software is provided as is and with no + guarantees as to its performance or its appropriateness for any + specific situation. The partners of the Parapet Project are not + responsible for any data loss, equipment damage, property loss, or + injury to subjects or patients resulting from the use or misuse the + Parapet software. Diagnoses drawn from using the Parapet software + are at the users full responsibility. Special care should be taken + in a setting where misinterpretations could injure a patient or + subject. The Parapet Partners make no warranty that the Parapet + software is free of programming or conceptual errors. Provision of + the Parapet software does not imply or ensure any additional + support especially after changes in operating software releases for + the platforms used. There is also no guarantee that the user will + be notified of any programming errors that are discovered or that + the user will be provided with future updated versions of this + tool. The partners of the Parapet Project disclaim all liability + for direct or indirect damage resulting from the use of the Parapet + software. + +4. Licensing of third party software embedded in the software is the + responsibility of the recipient organisation who agrees to obtain + appropriate licences. + + + diff --git a/VERSION.txt b/VERSION.txt new file mode 100644 index 0000000000..be0e0a5670 --- /dev/null +++ b/VERSION.txt @@ -0,0 +1 @@ +3.0beta diff --git a/documentation/.gitignore b/documentation/.gitignore new file mode 100644 index 0000000000..31cb41cc13 --- /dev/null +++ b/documentation/.gitignore @@ -0,0 +1,9 @@ +# Output files +STIR-UsersGuide.pdf +STIR-developers-overview.pdf +STIR-general-overview.pdf +STIR-glossary.pdf +STIR-version2-vs-version1.pdf + +# Directory made by AucTeX +auto/ diff --git a/documentation/Makefile b/documentation/Makefile new file mode 100644 index 0000000000..edf932dade --- /dev/null +++ b/documentation/Makefile @@ -0,0 +1,35 @@ +# Author Kris Thielemans +# Copyright (C) 2004-2007, Hammersmith Imanet Ltd +# Copyright (C) 2014, University College London +# This file is part of STIR, and is distributed under the +# terms of the GNU Lesser General Public Licence (LGPL) Version 2.1. + + +all: STIR-glossary.pdf STIR-general-overview.pdf \ + STIR-developers-overview.pdf \ + STIR-UsersGuide.pdf \ + STIR-version2-vs-version1.pdf + +clean: + $(RM) -rf STIR-*.pdf *.log *.dvi *.aux *.toc *.out STIR-UsersGuide/ + +doc_as_html: STIR-UsersGuide/homepage.html + + +.PHONY: all clean doc_as_html + +# rule to make pdf from tex source +# note: need to run twice to get page refs etc ok. +%.pdf: %.tex + pdflatex $< + pdflatex $< + +STIR-UsersGuide/homepage.html: STIR-UsersGuide.pdf + rm -rf STIR-UsersGuide; + latex2html -no_auto_link -split 7 -local_icons STIR-UsersGuide.tex; + pushd STIR-UsersGuide/; + rm *.pl *.tex *.log WARNINGS; + cp STIR-UsersGuide.html index.html + cp STIR-UsersGuide.html homepage.html + popd + diff --git a/documentation/STIR-UsersGuide.tex b/documentation/STIR-UsersGuide.tex new file mode 100644 index 0000000000..a1505d701c --- /dev/null +++ b/documentation/STIR-UsersGuide.tex @@ -0,0 +1,4725 @@ + +\batchmode +\documentclass{article} +\usepackage{geometry} +%\usepackage{a4wide} +%\usepackage{layout} + +\geometry{ + margin=2.cm +} +\usepackage{setspace} +\usepackage{longtable} +\usepackage{hyperref} +\def\url#1#2{\mbox{\href{#1}{\tt #2}}} +\newcommand{\tab}{\hspace{5mm}} +% attempt to define lower levels than subsubsections +% This does not work very well as you need to put them in extra {} +% to avoid the fonts being messed up etc. +% However, it does work for automatic numbering +%\newtheorem{subsubsubsection}{{}}[subsubsection] +%\newtheorem{subsubsubsubsection}{{}}[subsubsubsection] +\newcommand{\subsubsubsection}[1]{\paragraph{#1}\mbox{} \\} +\newcommand{\subsubsubsubsection}[1]{\subparagraph{#1} \mbox{} \\} +% a simple definition for formatting command lines +\newcommand{\cmdline}[1]{\par \noindent $>$ \texttt{#1}\par} +\setcounter{tocdepth}{4} +\setcounter{secnumdepth}{4} +\begin{document} + +\begin{spacing}{2} +\begin{center} + +\textbf{ +{\Huge STIR} +\huge +\\[1cm] +\textit{ Software for Tomographic \\ Image Reconstruction} +} +\\[3cm] + +\textbf{{\huge User's Guide\\ + Version 3.0}} +\end{center} + +\end{spacing} + +\large + +\noindent +K. Thielemans \\ +{\it \small Hammersmith Imanet Ltd; Algorithms and Software Consulting Ltd; University College London}\\ +Ch. Tsoumpas\\ +{\it \small Hammersmith Imanet Ltd; Imperial College London; King's College London}\\ +D. Sauge, C. Labb\'e, C. Morel \\ +{\it \small Hopital Cantonal Gen\`eve}\\ +M. Jacobson \\ +{\it \small Technion University}\\ +A. Zverovich \\ +{\it \small Brunel University} \\ +T. Beisel \\ +{\it \small Univ. of Paderborn} \\ +C. Falc\'{o}n \\ +{\it \small Univ. of Barcelona} + +\begin{center} +License +\end{center} + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + Parts of this file are licensed under the PARAPET license. + See STIR/LICENSE.txt for details. + +\newpage + +\tableofcontents + + +\section{ +Introduction} + +The objective of this document is to give practical information +about the use of the object-oriented library for 3D Reconstruction +of PET and SPECT data, called \textit{STIR}. The most recent version of this +document (and the library) can be found on \\ +\url{http://stir.sourceforge.net}{http://stir.sourceforge.net}. + + +This library was originally developed by the PARAPET +project (funded by the European Union during 1997-2000), extended by Hammersmith +Imanet and made into an Open Source project. \\ +The current library has different license restrictions than the +original PARAPET distribution. Details on licensing are to be +found during the registration process, and the file \textbf{STIR/LICENSE.txt} +that comes with the distribution. + +See the publications section of the STIR website for information on which reference +to use for STIR. You will want to read {[}Thi12], see {[}Fus13] for SPECT additions +since STIR 3.0 (for \textit{STIR} 1.x, use [Lab99a], [Lab99b]). + + + +This guide attempts to give end users an overview of all the functionality +in \textit{STIR}. It mainly provides +procedures for downloading and installing the necessary gnu g++ +compiler tools and the \textit{STIR} reconstruction building blocks. +Then a brief explanation is given about how to run reconstruction +algorithms as well as additional utilities. A description of +the reconstruction building block library can be found on our +web site (section \textit{documentation}). A short (but out-dated) review of analytic +and iterative reconstruction methods is available in [PAR1.3] +(available on the STIR web-site). + +\section{ +A general note on documentation in STIR} + +Although we attempt to keep all documentation up-to-date, we +recommend to read documentation in the following order: +\begin{itemize} +\item general overview documents, such as this User's Guide +\item the \url{http://sourceforge.net/apps/mediawiki/stir}{STIR Wiki} +\item +online generated documentation (produced by doxygen). This is +produced from comments and (partly) code in the source files. +\item check the source itself if in any doubt. +\end{itemize} +Many questions have already been answered via the mailing lists. See the +web-site on how to search these. + +Any comments on documentation, and especially contributions are +always welcome. Please use the stir-users mailing list. + +\section{ +Installation} + +\subsection{ +Installing source files} + +Download the source at the \textit{STIR} site: +\begin{center} +\url{http://stir.sourceforge.net }{http://stir.sourceforge.net} +\end{center} +\noindent (Section \textbf{Registered Users}).\\ +Download the source files in the zip format. You can then use unzip from \\ +\url{http://www.info-zip.org/pub/infozip/}{http://www.info-zip.org/pub/infozip/}. +Extract using +\cmdline{unzip -a file.zip} + + +The \texttt{-a} option makes sure that files are extracted using the +end-of-line convention appropriate for your system. Note that +other programs that can handle zip files (such as WinZip) should +work as well, although you might have problems with the EOL convention. + + +Note that you can put the distribution in any location (it does +not have to be your home directory). + + +The result is a \textbf{STIR} directory and subdirectories, described +in the annex section. + +\subsection{ +Installing external software} +STIR relies on some external software and a few external libraries which enable certain functionality. +On most systems, you should be able to get these using your package manager. +Please check the Wiki for most up-to-date information. + +\subsubsection{BOOST} +The only required external library is the well-respected \textit{boost} library. If it +is not installed on your system, you can download it from +\url{http://www.boost.org}{http://www.boost.org}. Currently \textit{STIR} only +uses the include files from \textit{boost} (so you do not need to build +the boost libraries). However, you will need to tell your compiler +where to find the \texttt{boost/} directory with all the include files +(see section \ref{sec:UsingCMake}). + + +\subsubsection{ +C++ Compiler} + +In order to compile and run the \textit{STIR} programs, you will need a compiler +and associated tools. These days, any compiler should work. See the +\url{http://sourceforge.net/apps/mediawiki/stir}{STIR Wiki} for more +specific information of which compilers we have tried. +We would love +to hear from any attempts of using another compiler. + +\subsubsection{ +Enabling ECAT 7 support} +\label{sec:ECAT67support} +Older CTI (Siemens) scanners use a file format called ECAT\texttrademark{}. +At present, \textit{STIR} uses parts of the Louvain la Neuve ecat library (called LLN in +the rest of this document).\footnote{\textit{STIR} versions 1.? came with +specific files for ECAT6 support without the need for the LLN library. +However, due to license restrictions this is now no longer the case.} +The library might still be available on +\url{ftp://ftp.topo.ucl.ac.be/pub/ecat }{ftp://ftp.topo.ucl.ac.be/pub/ecat}. +It is also available for GATE users. + +You have to download that library and issue 'make --f Makefile.unix' +(or 'make --f Makefile.cygwin' if you are using CYGWIN on Windows) +in the new ecat directory first. Please get a recent version +of this library (dated 20 July 2004 or later) as Merence Sibomana +has introduced various bug fixes, some of which solve problems +that you would otherwise experience when using \textit{STIR} and ECAT7 +files. + +\subsubsection{ +Enabling GE RDF and VOLPET support} +\label{sec:RDFsupport} +We have software that reads VOLPET and RDF data for all GE scanners, but this can currently +not be distributed due to licensing restrictions. If you have the +GE PET Toolbox proprietary package you can ask Kris Thielemans for VOLPET and RDF +support in \textit{STIR}. + +\subsection{ +Compilation} +\subsubsection{ +Using CMake} +\label{sec:UsingCMake} +Since version 2.2, \textit{STIR} contains files to build using the platform-independent +\url{"http://www.cmake.org"}{CMake}. This is the recommended way to build STIR as +it is easier for configuration and finding system dependencies. + +Normal build procedure on Linux/Unix would be something like + +\cmdline{cd /somewhere/nice/STIRbuild/Release} +\cmdline{cmake-gui /somewhere/else/where/the/source/is/STIR\&} + +This will bring up a basic interface where you might to have to choose your prefered +build system (i.e. \texttt{make} on Linux/Unix) and do an initial configuration. Then +you specify build variables. You can press \texttt{c} to do additional configurations, \texttt{g} for generating +your build files, \texttt{q} to quit. After this step, you will have to run your build system (e.g.\ on Linux etc, +type \texttt{make}, then \texttt{make test}, then \texttt{make install}). +More information on using CMake is on the STIR Wiki. + +For example, if CMake cannot find \textit{boost}, you will have to set \texttt{BOOST\_ROOT}. +\newlength{\MakeTableFirstCol} +\newlength{\MakeTableSecondCol} +\setlength{\MakeTableFirstCol}{1.5in} +\setlength{\MakeTableSecondCol}{\textwidth} +\addtolength{\MakeTableSecondCol}{-\MakeTableFirstCol} + +\begin{longtable}{|p{\MakeTableFirstCol}|p{\MakeTableSecondCol}|} +\hline +% ROW 1 +{\raggedright \textit{GRAPHICS}} & +{\raggedright Possible values: X, PGM, MATHLINK, NONE. X (default) uses basic +X windows graphics, PGM writes the graphics to a .pgm file, MATHLINK +uses the (external) MathLink library which could be used to send +data directly to Mathematica, NONE switches off all graphics. See also section \ref{sec:display}. +} \\ +\hline +% ROW +{\raggedright \textit{STIR\_MPI}} & +{\raggedright Toggles between ON, OFF. Enable parallel processing using MPI.\\ +\textit{STIR} contains code for running \texttt{OSMAPOSL} and \texttt{OSSPS} in parallel-mode. +See section \ref{sec:RunningWithMPI} for information on how to run programs using MPI. +\footnote{In fact, any algorithm that uses \texttt{PoissonLogLikelihoodWithLinearModelForMeanAndProjData}. +This functionality was contributed mainly by Tobias Beisel, Univ. of Paderborn). You need a version of the MPI library +to get this to work. We have tested this using \url{http://www.open-mpi.org/}{OpenMPI} 1.4.2 and 1.4.5}.\footnote{ +{When using MPI, you can set a compiler define \texttt{STIR\_MPI\_TIMINGS=1}} to +enable additional timings for all send/receive pairs +(see \textbf{distributed\_functions.h} in \textbf{include/stir/recon\_buildblock}. +This should only be used for testing purposes as it can slow down +STIR dramatically.} +} \\ +\hline +% ROW +{\raggedright \textit{STIR\_OPENMP}} & +{\raggedright Toggles between ON, OFF. Enable threaded processing using OPENMP. +\footnote{Since version 2.0, \textit{STIR} contains preliminary code for running \texttt{FBP2D} in threaded mode +(contribution by Tobias Beisel, Univ. of Paderborn). You need a compiler that +supports \texttt{OPENMP}. Note however, that this code doesn't presently result +in a decent speed-up of \texttt{FBP2D}.} +See section \ref{sec:RunningWithOPENMP} for information on how to run programs using OPENMP. +} \\ +\hline +% ROW +{\raggedright \textit{STIR\_LOCAL}} & +{\raggedright Specify location of directy with your own extensions to STIR. See +the developer's guide.}\\ +\hline +\end{longtable} + +You can also (optionally) specify locations of some external libraries for additional IO +capabilities of STIR. +\begin{itemize} +\item LLN files for ECAT support via \texttt{LLN\_INCLUDE\_DIRS} and \texttt{LLN\_LIBRARIES}. +\item AVW\texttrademark{} (a commercial library\footnote{See \url{http://www.mayo.edu/bir/Software/AVW/AVW1.html} +{www.mayo.edu/bir/Software/AVW/AVW1.html}.} +via \texttt{AVW\_ROOT\_DIR}. See section \ref{sec:convAVW} for usage. +\item ITK\_DIR, use IO from \url{http://www.itk.org}{ITK}, a large open source library. Specifying this + enables NRRD, MetaIO and Nifti IO. +\item GE RDF\texttrademark{} support via \texttt{RDF\_INCLUDE\_DIRS} and \texttt{RDF\_LIBRARIES} (requires the GE proprietary PET Toolbox). +\end{itemize} + +Note that you can use e.g. \textit{DISABLE\_LLN\_MATRIX} to \textit{not} +use the LLN ECAT library, even if cmake found it. + +Finally, do not forget to set +\begin{itemize} +\item CMAKE\_BUILD\_TYPE to \texttt{Release}, \texttt{Debug} or \texttt{RelWithDebug}, +\item CMAKE\_INSTALL\_PREFIX to specify where the final installation has to occur. CMake +provides normally a default in a system location, but you could set it for instance to +\texttt{./install} to put thef iles inside your build directory. +\end{itemize} + +On Windows or MacOSX, the procedure is essentially the same, except that you will likely have +to specify more locations When using Visual Studio, XCode or other IDEs as your build system, +you do not need to specify the Build Type, as you will be able to select that in +your IDE. + + + +\subsubsection{ +Operating system specifics} + +{ \subsubsubsection{Mac OS} +} + +The lln library does not compile on Mac OS. + +{ \subsubsubsection{All Unix/Linux flavours} +} + +If you want to use the X windows display routines, CMake +should work out-of-the-box if you have suitable libraries installed, see the wiki +for required packages. + +{ \subsubsubsubsection{X development libraries} +} + +If you experience compilation +or linking problems mentioning X11, you have to check if the +X development libraries are installed on your system. You can +check this by doing +\cmdline{find /usr -name Xlib.h -print} + +If this file is not found, you'll have to install these libraries +somehow. + +{ \subsubsubsubsection{X display depth} +} + +\textit{STIR} version 1.0 required that your Xserver worked in 8bit +mode (or Pseudocolor mode in X terminology). This is no longer +necessary. However, if you are experiencing problems with the +display, you could try 8bit mode anyway. + + + +{ \subsubsubsection{Cygwin on Windows} +} + +Cygwin is a must-have if you are using Windows but would like +to have nearly everything that Linux/Unix has to offer (at least +from a user's point of view). Check out http://cygwin.com. + +{ \subsubsubsubsection{Using X windows on cygwin} +} +\begin{itemize} +\item Install the Xorg-x11 packages using the cygwin setup utility +(you need the devel package). +\item +install ncurses-devel if you don't have it yet (use the cygwin +Net setup). +\item make sure that /usr/X11R6/bin is in your PATH (necessary +for DLLs) +\end{itemize} + +You can start the Xorg X server by executing the startxwin.sh +script (you might want to modify this a bit to suit your taste). + +Other decent X servers should work as well (Kris Thielemans used Exceed at +some point). + + +\subsection{ +Running tests} + +We \textbf{highly recommend} running test programs after building. There are currently two +sets of tests. The first set tests various components of \textit{STIR}. This process is described on the Wiki. +The second set of tests is available via the \textit{STIR} web-site, where we +we provide test reconstructions as part of the +\textbf{recon\_test\_pack}, with an +automated procedure to see if you can reproduce the correct results. +You really should download this and run it. + + +Note that if you are using a non-standard scanner, +you might want to run one reconstruction on your data with +the debug version of the reconstruction program, to see if everything +works as intended. You'll probably want to choose a small value +for the `maximum absolute segment number to process' parameter +in your reconstruction (see Section \ref{sec:OSMAPOSL}), as this will be \textbf{\textit{very}} +slow. + + + + +\section{ +Running \textit{STIR} programs} + +Here we describe: +\begin{itemize} +\item documentation and program conventions +\item supported file formats +\item rebinning algorithms +\item reconstruction programs +\item utility programs +\item user-selectable components +\item display properties +\end{itemize} + +\textit{STIR} is highly configurable and modular. It is therefore difficult to give a complete (and readable) +description of all the options in this guide. Moreover, many options are common to many +programs. For instance, a forward projector will be needed in many places, and there are +different forward projectors implemented in \textit{STIR}, each with their own set of +parameters. Your best bet might be to start with some of the sample parameter files, and then +come back to this guide. In particular, section \ref{sec:user-selectablecomponents} +on user-selectable components gives more detail on what options are available +and what their parameters are. + +\subsection{ +Conventions} +\label{sec:conventions} +When discussing command line parameters of the \textit{STIR} executables, +the following format is used in this documentation (and the usage messages): +\cmdline{executable\_name parameter1 parameter2 {\textbackslash}\\ +{[}optional\_parameter3 [optional\_parameter4 etc]]} + + +This means that the first 2 parameters are mandatory, but a 3$^{rd}$ +parameter can be given, or 4 parameters. A single parameter is +usually given as one word, but sometimes as a string between +\texttt{<} \texttt{>}. + + +All parameters have to be on a single command line. This is indicated +by the backslash {\textbackslash}, as in Unix this is the standard way +of continuing a command line on the next line. + + +All executables are supposed to be located in the path of the +command shell used. + + +Most \textit{STIR} programs accept a single parameter on the command +line, which is sometimes optional + +\cmdline{executable\_name [parameter\_filename]} + + +The parameter file is a text file which uses an Interfile-like +syntax. It is composed of keywords, corresponding to the names +of the various parameters, with the values entered next to them. +Spaces and tabs are normally irrelevant. Parameters omitted from +the parameter file are assigned a default value. +Comments are indicated via a semi-colon (;) at the start of the line. Do +not put a comment before the first keyword in the file. + +If a parameter file is not passed to the executable, some +programs will prompt the user +for the required information. For questions that +ask for a number, the format is as follows: + + +\tab What number do you want to enter today \\ +\tab [minimum, maximum, D: default]: + + +If a simple Carriage Return is entered, the default value is +selected. + + +Sample parameter files for particular programs (or part of a +parameter file relevant to a particular common component) are +presented in subsequent sections. See also the files in \textbf{STIR}/\textbf{samples}. + + +\subsection{ +Error handling etc} +\textit{STIR} executables tend to write a lot of information to the terminal on what is happening. +Check for lines starting with \texttt{WARNING} and \texttt{ERROR}. +After an error, the executable will stop\footnote{On some systems there is at the end +a somewhat confusing error about +exceptions thrown, but ignore that and check the ERROR line.}.Information on some of the common +causes for errors is on the Wiki. + +All \textit{STIR} executables return a status value to signify success +or failure. What value this is depends on your Operating System. +On Unix, Linux and Windows variations, success is indicated by +a status of 0, and failure by anything else. There is currently +no differentiation between the reasons for failure. + +\subsection{ +Running programs using MPI \label{sec:RunningWithMPI}} +If you have compiled with STIR\_MPI, you need run the executables in such a way that +they know about the availables nodes. How to do this is system/MPI version specific. The following +should work with OpenMPI on Linux: + +\cmdline{mpirun -np 12 --hostfile ~/myconf.txt OSMAPOSL mypars.par} + +\noindent +where the host file describes your set-up, e.g. if you have 3 nodes with differing number of cores, the +host file could look like this: +\begin{verbatim} +# The Hostfile for Open MPI +beo-09 slots=4 +beo-10 slots=8 +beo-11 slots=8 +\end{verbatim} +Without host file, the executables will normally be run on the host where you executed the command, which +is useful for multi-processor/core machines. + +\textit{MPICH} would use a similar line using \texttt{mpiexec}. + +If you have a queueing system that supports MPI such as +\url{http://www.clusterresources.com/products/torque-resource-manager.php}{Torque}, it is better to use +that system for sorting out available resources etc. For example, to use 2 nodes with 4 processes each, +the following should work + +\cmdline{qsub -I -l nodes=2:ppn=4} + +This will open a interactive prompt on one node where you just type + +\cmdline{mpirun OSMAPOSL mypars.par} + +Of course, you can use \texttt{qsub} to submit a job as opposed to getting an interactive prompt. + +\subsection{ +Running programs using OPENMP \label{sec:RunningWithOPENMP}} +If you have compiled with OPENMP support, the executables should run as normal. +The environment variable \texttt{OMP\_NUM\_THREADS} can be set to the number of processes to be used for OpenMP. +Without using this, the number of threads is defined as the number of cores on your system. It is probably +useful to reduce the number of threads as currently performance is limited by the available cache in your +processor. + +\subsection{ +File formats} + +The STIR utility and reconstruction programs frequently need +to read and write files of image and projection data. Files formats +are encountered in which data and header information are maintained +in separate files (e.g. interfile). In other formats, data files +carry header information (e.g. the native GE Advance sinogram +format). + +When reading a file, \textit{STIR} will automatically discover its file format +(independent of its name). See section \ref{sec:outputfileformats} for supported output file formats. In addition, +utilities are available for converting ECAT6 and ECAT7 to/from +interfile (see Section \ref{sec:convertingdata}). + +\subsubsection{Interfile} + +The most comprehensively supported file format in the library +is a newly proposed version of interfile. More details about +this type can be found in the ''Other info'' section of the \textit{STIR} website. + +\begin{itemize} +\item For PET projection data, we use the proposed Interfile version. You can +find sample Interfile headers in the \textbf{recon\_test\_pack} or by using +\texttt{create\_projdata\_template}. + +\item For SPECT projection data, we use Interfile version 3.3 (with a few small changes). +You can find a sample SPECT Interfile header in the \textbf{samples} directory. + +\item For images, we use the proposed Interfile version. Currently, images have to +be written as PET data, even for SPECT. +\end{itemize} + +Interfile is currently the only format supported for writing projection +data (except by the \textit{conv\_to\_ecat?} utilities\textit{)}. Projection +data files are written in pairs:\\ +\textit{projdata\_filename.hs, +projdata\_filename.s}\\ +where \textit{projdata\_filename.hs} is the header text file and \textit{projdata\_filename.s} +is the data file. Please read section \ref{sec:outputinterfile} for info regarding +images written by \textit{STIR} in Interfile. + +\subsubsection{VOLPET sinograms} + +The GE VOLPET sinogram format is supported for reading, but for +the GE Advance only and data files must have a single data set, maximum ring +difference 11 and contain 281 bins * 256 segments * 336 views. +See section \ref{sec:RDFsupport} for enabling support for other scanners and +data in the GE RDF format. + +\subsubsection{ECAT6 and ECAT7 data} +See section \ref{sec:ECAT67support} for enabling support for ECAT data. + +ECAT6 images can be read without conversion. However, only the +first frame (ECAT matrix 1,1,1,0,0) will be read. + +ECAT7 sinograms, attenuation files and images can be read without +conversion. However, only the first frame (ECAT matrix 1,1,1,0,0) +will be read for static reconstruction. + +\textbf{Warning} The calibration factor field in the main header of ECAT7 images +is currently ignored. + +For dynamic or gated data, conversion can be used, see \ref{sec:convertingdata}. + +\subsubsection{Image IO using the AVW library} +See the \texttt{conv\_AVW} utility (section \ref{sec:convAVW}). + +\subsubsection{Image IO using the ITK library \label{sec:ITKIO}} +If you compiled \textit{STIR} such that it could find the \textit{ITK} library, you will be read +all image formats supported by \textit{ITK}, see \url{http://www.itk.org/Wiki/ITK/File_Formats}{the ITK Wiki} +for some information. However, many file formats do not specify geometric information (e.g jpg). For those +that do, \textit{STIR} currently ignores orientation, offset and timing. +Note that as DICOM files often store only a single slice, \textit{STIR} attempts to find +other slices belonging to the same series/time frame/gate. + +\subsubsection{SimSET files} +There are some preliminary files to make it easier to use SimSET and \textit{STIR} together in the +\textbf{SimSET} directory. See the README.txt in that directory for more info. + +\subsection{ +List mode processing} + +Some scanners produce list mode data, which is essentially a +list of events. \textit{STIR} provides utilities to use +the list mode files, for example to convert them to sinograms. It is +also possible to reconstruct images directly from list mode data, although +this has not been tested very well yet as of \textit{STIR 2.1}. + +Currently supported list mode formats are specific to the ECAT +HR+ and ECAT EXACT 3D scanners. There are some unfinished classes +available on the \textit{STIR} web-site to read \textit{LMF} format files, +in conjunction with the \textit{LMF} library. However, these might be obsolete +as the OpenGATE project might be distributing files +to enable STIR to read \textit{LMF} format files. + +See the \textit{STIR} web-site for an independent project that allows reading +\textit{ROOT} files and convert it to \textit{STIR}-compatible Interfile projection data. + +\subsubsection{ +lm\_to\_projdata} + +This utility can be used to bin (or ``sort'') the list mode data +into 'projection data' (also known as \textbf{3D sinograms}. +This can then be processed further by other \textit{STIR} utilities. It +needs to be run as follows: + +\cmdline{lm\_to\_projdata par\_filename} + + +See \textbf{STIR/samples/lm\_to\_projdata.par} for an example file. Please +check out the online documentation (as generated by doxygen) +for more info. + +Currently, each time frame is written in a different file (as Interfile). Gating +will be supported in a future version. + +\subsubsection{ +lm\_to\_projdata\_bootstrap} +As before, but using bootstrapping (with replication). This is useful to generate multiple realisations +from a single list mode file to study variance. + +You can use it as follows: + +\cmdline{lm\_to\_projdata\_bootstrap par\_filename seed} + +The seed is a positive integer (do not use $0$). Specifying different seeds will give you different noise realisations. +You can use the same parameter file as for \texttt{lm\_to\_projdata}. + +\subsubsection{ +lm\_fansums} +Computes fan-sums, i.e. for each detector, sum all data that are in coincidence with that detector. +Results are written as a simple text file. This could be used to check if all detectors are working +properly for instance. + +\subsubsection{ +list\_lm\_events} +Allows inspecting the events in a list mode file. Run without arguments to see a usage message. + +\subsection{ +Rebinning algorithms} + +In 3D PET, the name \textit{rebinning} is used for the +process of manipulating the 3D projection data set to the equivalent +of 2D projection data. This reduces the number of segments (see +\textit{STIR} Glossary) to 1. Popular rebinning algorithms are SSRB, FORE +and variations such as FOREX, and FOREJ. Rebinning is often used +before reconstruction to decrease total reconstruction time. + + +\subsubsection{ +SSRB} +\label{sec:SSRB} +The \textit{Single Slice Rebinning} algorithm [Dau87] is the oldest +and simplest rebinning algorithm. It essentially ignores the +obliqueness of a Line of Response and moves data to the axial +position in segment 0 such that z-resolution on the axis of the +scanner is preserved. + + +The \textit{STIR} implementation of SSRB is a generalisation that applies +the same idea while still allowing preserving some of the obliqueness. +For instance, for a dataset with 9 segments, \textbf{SSRB} can produce +a new dataset with only 3 segments. This essentially increases +the axial compression (or \textit{span} in CTI terminology), see the +\textit{STIR} Glossary on axial compression. In addition, \textbf{SSRB} can +introduce extra \textit{mashing} (see the \textit{STIR} Glossary) of the data, +i.e. add views together. + + +\textit{Usage:} + +\cmdline{SSRB output\_filename input\_projdata\_name {\textbackslash} \\ +num\_segments\_to\_combine [num\_views\_to\_combine {\textbackslash}\\ +{[}do\_normalisation [max\_in\_segment\_num\_to\_process ]]]} + +\begin{description} +\item[num\_segments\_to\_combine] has to be odd. It is used as the +number of segments in the original data to combine. +\item[num\_views\_to\_combine] has to be at least 1 (which +is the default). It is used as the number of views in the original +data to combine. +\item[do\_normalisation] has to be 1 (default) or 0. When it is 1, +the result is normalised, i.e. divided by \textit{num\_segments\_to\_combine*num\_views\_to\_combine}. +This is appropriate for rebinning data where normalisation has +already been applied, but inappropriate otherwise. + +\item[max\_in\_segment\_num\_to\_process] defaults to all segments. +Can be used to ignore the most oblique segments in the input +data. Note that the most oblique segments that cannot be rebinned +completely will be ignored automatically. For instance, when +the input data has 7 segments, and \textit{num\_segments\_to\_combine} is +3, only 3 segments are used from the input (and 1 output segment +produced), as 9 input segments would be necessary to produce +3 'complete' output segments. +\end{description} + + +\subsection{ +Image reconstruction programs} + + + + +\subsubsection{ +Iterative algorithms} + +Two statistical reconstruction algorithms are currently implemented: +\begin{description} +\item[OSMAPOSL] an implementation +of the OSEM-One Step Late algorithm with various additional refinements +and capabilities. See [Jac00] for a description of many details of the +implementation. +\item[OSSPS] an implementation of the Ordered Subsets Paraboloidal +Surrogate algorithm by Erdogan and Fessler, and Ahn and Fessler [Ahn2003]. +\end{description} + +Since \textit{STIR} 2.0, all iterative algorithms use a \textit{generalised objective +function}\footnote{We call them \textit{generalised} because they do not +necessarily have to correspond to a function. Most algorithms only require +that we can compute some kind of gradient. As an example, the update +of OSEM with the Median Root Prior (MRP) does not correspond to the +gradient of a function.} which the algorithm tries to maximise. The result +of the algorithm will obviously depends very much on the objective function +used. + +Currently, only Poisson-based objective functions are implemented in \textit{STIR}. We +have an objective function for static projection data (\textit{aka} sinograms), +list mode data and parametric images from dynamic projection data +(currently only using the Patlak model). + +Most parameters are shared between algorithms and objective functions. Therefore, +once you understand how to run e.g. OSEM, it should be easy to understand OSSPS etc. +This guide therefore describes the case of running OSMAPOSL on projection data in detail +first. Other algorithms (and objective functions) are then described as variations on this +case. + +{ \subsubsubsection{Running OSMAPOSL on static projection data} +} +\label{sec:OSMAPOSL} + +The program \textbf{OSMAPOSL} executes the IF-OSEM-OSL algorithm. +This is a generalisation of the One Step Late algorithm [Gre90] but allowing +inter-iteration filtering and/or a prior. Note that this +algorithm is in general not convergent. + +\textbf{OSMAPOSL} +allows \\ +-\tab +the use of subsets, similar to the OSEM algorithm [Hud94]. OSMAPOSL +will only work when the subsets are approximatelly balanced (i.e. +the number of subsets has to be a divisor of the number of views). +In fact, by default this implementation\footnote{In fact, this assumption +is part of the \texttt{PoissonLogLikelihoodWithLinearModel} class, which is +the base class of the objective function that OSMAPOSL uses.} assumes that the +subsensitivity image is proportional to the total sensitivity image, +but this can be switched off .\\ +-\tab +inter-update filtering (applying a filter to the image before +it is multiplied with the update image) [Jac00]\\ +-\tab +inter-iteration filtering (applying a filter after the rest of +the image update is performed), sometimes called EMS [Sil90], +see also [Mus04].\\ +-\tab +post-filtering (apply a filter after the last subiteration)\\ +-\tab +applying the prior information in an additive or multiplicative +way [Mus01]\\ +-\tab +random permutation of the order of the subsets in each iteration + + +See [Jac00] for more information, and also the online documentation +for the class \textbf{OSMAPOSLReconstruction.} + + +The successive image iterates of the algorithm are saved at pre-specified +subiteration intervals in a sequence of image files. The files +are named with a pre-specified output file prefix with the subiteration +number appended after an underscore. + + +As described in Section \ref{sec:conventions}, +the recommended manner of running \textbf{OSMAPOSL} +is to pass the executable a parameter file argument which specifies +the relevant parameters of the reconstruction. Parameters omitted +from the file are assigned a default value. If a parameter file +is not used, the program prompts the user for the required information. + + + +The form of a typical parameter file\footnote{Parameter values used here are for +illustration only and are \textit{not} recommended.} is as follows: + +{\small +\begin{verbatim} +OSMAPOSLParameters := +;lines starting with semicolons are comments +objective function type:= \ + PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= +; input, sensitivity and prior parameters here + +input file := projection_data_filename.hs + +; use -1 to use the maximum available +maximum absolute segment number to process := 4 +zero end planes of segment 0 := 1 + +; keywords that specify the projectors to be used +Projector pair type := Matrix + Projector Pair Using Matrix Parameters := + ; Use the PET Ray-tracing matrix. + ; This needs to be changed to SPECT UB when using SPECT data + Matrix type := Ray Tracing + Ray Tracing Matrix Parameters:= + End Ray Tracing Matrix Parameters:= + End Projector Pair Using Matrix Parameters := + +; background (e.g. randoms) +additive sinogram := 0 + +; sensitivity related keywords + ; time frame info used for dead-time calculation when using ECAT7 + ;time frame definition filename:= + ;time frame number:= 1 + + ; normalisation and attenuation info + ; Bin Normalisation type:= None + + recompute sensitivity := 1 + use subset sensitivities:=1 ; recommended + ; optional filename to store/read the sensitivity image + ; (if use subset sensitivity is off) + ;sensitivity filename:= + ; optional filename to store/read the subsensitivities + ; use %d where you want the subset-number (a la printf) + subset sensitivity filenames:= sens_%d.hv + +; keywords for specifying the prior information +prior type := None + +; next keywords can be used to specify image size, but will be removed +; they are ignored when using an initial image +zoom := 1 +; use --1 for default sizes that cover the whole field of view +XY output image size (in pixels) := -1 +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + +; set output file format, if omitted a default value will be used +Output file format := Interfile +Interfile Output File Format Parameters := +; byte order := little-endian +; number format := signed integer +; number of bytes per pixel := 2 +End Interfile Output File Format Parameters := + +initial estimate:= initial_image_filename.hv +enforce initial positivity condition:=1 +number of subsets:= 6 +start at subset:= 0 +number of subiterations:= 30 +start at subiteration number:=1 + +output filename prefix := out_file +save estimates at subiteration intervals:= 2 +uniformly randomise subset order:= 1 + + +; keywords that specify the filtering that occurs after every subiteration +; warning: do not normally use together with a prior +inter-iteration filter subiteration interval := 4 +inter-iteration filter type := Separable Cartesian Metz + ; keywords below will depend on the filter type (see text) + separable cartesian metz filter parameters := + x-dir filter fwhm (in mm) := 6 + y-dir filter fwhm (in mm) := 6 + z-dir filter fwhm (in mm) := 6 + ; use some sharpening here as example (not really recommended though) + x-dir filter metz power := 2 + y-dir filter metz power := 2 + z-dir filter metz power := 2 + end separable cartesian metz filter parameters := + + +; keywords that specify the filtering that occurs at the end +; of the reconstruction +post-filter type := None + +; keywords that specify the filtering that occurs before +; multiplying with the update image + +inter-update filter subiteration interval := 4 +; would have to be filled in. +inter-update filter type := None + +map model := additive + +; keywords for preventing too drastic (multiplicative) updates +; below just set to their default values +maximum relative change := 3.40282e+38 +minimum relative change := 0 + +; enabling this will write the multiplicative update images +; every sub-iteration +write update image := 0 + +END := +\end{verbatim} +} + +See \textbf{STIR/samples/} for example parameter files. + +The following gives a brief explanation of the parameters. Where +appropriate, the notation \textit{[min, max, default]} is used to +specify allowable numeric ranges. Values of \textit{\ensuremath{\infty}} indicate +that the largest value possible for the numeric type of the parameter +value is allowed. + +{ \subsubsubsubsection{Objective function related parameters (Poisson statistics)} +} +\label{sec:PoissonProjectionDataObjectiveFunction} + +\begin{description} + +\item[input file] +The name of the file for the measured projection data. + + +\item[zero end planes of segment 0] +If this is set to 1, the reconstruction pretends that the projection +data measured in the extreme-most rings of the scanner (the end +planes of segment 0) are zero. See also the discussion in Section +\ref{sec:OSMAPOSLtechnotes}. + + +\item[time frame definition filename] +See \textit{Bin Normalisation type} + +\item[time frame number] +Defaults to 1. Currently only used for finding the frame number and hence dead-time (in ECAT7). +See \textit{Bin Normalisation type}. + +\item[Bin Normalisation type] +This keyword is used to set both normalisation factors and attenuation +correction factors. See section \ref{sec:binnormalisation}. + +\item[use subset sensitivities] +Defaults to 1 (recommended). +If you set this to 0, it is assumed that all subset sensitivities are equal, and therefore proportional +to the total sensitivity. We can then save some memory by internally storing only the total sensitivity. +However, in many cases and in particular f you have non-uniform attenuation, +this assumption will generate some artefacts in the image. + +\item[recompute sensitivity] +Defaults to 0. If \textit{sensitivity filename} or \textit{subset sensitivity filenames} +are specified and recomputation is switched off, the sensitivity data will be read +from file, and the +\textit{Bin Normalisation type} keyword will be effectively ignored. +On the other hand, if the filename is set and recomputation is switched on, the +(subset) sensitivity will be written to that filename. This parameter might be useful +to avoid recomputing the sensitivity if it does not change. + +\item[sensitivity filename] +The sensitivity image is an important ingredient of +likelihood-based reconstruction algorithms of PET or SPET emission data +\footnote{In \textit{STIR} 2.0, this is generalised to the sensitivity for +any problem with Poisson statistics where the data are linear +combinations of the variables of interest.} +For each voxel, it represents the total probability of detection of an +event originating in that voxel (up to a global proportionality factor). +It is computed by backprojecting projection data with all elements set to 1. + +The name of the file containing the sensitivity image. The +default is to compute it from the previous keywords. You could +set it to 1, which is am image uniformly 1 over all voxels. +Using this is generally a bad idea however. It is +only somewhat appropriate when using fully precorrected data +in 2D PET. Even in that case, you will get an image with the +wrong scale factor. + +Note that when no attenuation nor normalisation was used, +the sensitivity will be computed based on geometrical backprojection +only. This only appropriate when reconstructing +from pre-corrected projection data. + +\item[subset sensitivity filenames] +This should be used instead of \textit{sensitivity filename} when using subset +sensitivities. It should provide a pattern \'{a} la \texttt{printf}\footnote{In fact, +\texttt{boost::format} is used, so the pattern can be more flexible.} to allow +constructing different filenames for each subset. + + +\item[Projector pair type] +Specifies the back/forward projector pair to be used in the reconstruction. +See Section \ref{sec:projectorpairs} for possible values. We recommend using matching +projectors (\textit{e.g.} based on a single projection matrix). + + +\item[additive\_sinogram] +This parameter can be used to take randoms or scatter into account. +It is a constant background term that will be added to the forward +projected data in the denominator of the MAP-OSL algorithm. Please +note that currently the forward projector produces 'geometric' +data. This is because the normalisation and attenuation coefficients +can be cancelled out between the forward and backprojector. They +then remain only in the sensitivity image and the background +term. This means that in effect, a normalised and attenuation +corrected randoms sinogram would have to be passed as 'additive +sinogram'. By suitably adding a term to the input projection +data, the Shifted Poisson version of OSL can be run as well. + + +\item[maximum absolute segment number to process] +Denoting the input value by \textit{num\_segments}, this indicates +that the reconstruction will be carried out using segment numbers +-\textit{num\_segments} through +\textit{num\_segments} of the measured +projection data. Defaults to use all segments in the input data. + + +\item[prior type] +The type of prior information. See Section \ref{sec:priors} for the list +of possible values. + +\item[zoom] +The zoom factor. Defaults to 1 which gives x,y voxel size equal +to the bin size of the projection data\footnote{{\small This is different +from the CTI convention which involves some factors like the +number of elements and 128.}}. Larger than 1 means smaller voxel +size. This parameter is ignored when an \textit{initial estimate} is specified. +\textit{This parameter will be removed in a future version.} + +\item[XY output image size (in pixels)] +Number of pixels to use in x,y direction. Default (-1) covers +the whole FOV as determined from the projection data and gives +an odd number of pixels. This parameter is ignored when an \textit{initial +image} is specified. \\ +\textit{This parameter will be removed in a future version.} + +\end{description} + + +{ \subsubsubsubsection{Algorithm settings} +} +\label{sec:IterativeReconSettings} +\begin{description} + +\item[output filename prefix] + The output filename prefix. When image iterates are saved, subiteration +numbers are appended to this prefix after an underscore. + +\item[output file format type] +Set output file format, if omitted a default value will be used. +Subsequent parameters will depend on the type of output file +format. See section \ref{sec:outputfileformats}. + + +\item[initial estimate] +The name of the image file with which the algorithm is initialised. +The default is an image which is uniformly 1 over all voxels. +The default can be specified by giving the parameter an input +of 1. Using an input of 0 will use a uniformly 0 image, but this +is inappropriate for OSMAPOSL. + + +\item[enforce initial positivity condition] +If this parameter is not set to 0, the program will set all non-positive +voxel values in the initial estimate to small positive ones. + + +\item[number of subsets] [1, num\_views, 1 {]} +The number of subsets. For symmetric balancing among subsets, +it is advisable to select a number which divides evenly into \textit{num\_views}, +or even \textit{num\_views/4}, depending on the symmetries used by the projector. + + +\item[uniformly randomise subset order] +When set to 1, the order of the subsets for each full iteration +is randomly permuted (uniformly). + + +\item[start at subset] [0, num\_subsets-1, 0{]} +Specifies with which subset in the ordered subset sequence to +start, where the subsets are enumerated from \textit{0} to \textit{num\_subsets-1}. + +\item[number of subiterations] [1,\ensuremath{\infty}, 1{]} +The number of subiterations to run. + + +\item[start at subiteration number] [1,\ensuremath{\infty}, 1 {]} +Initializes the subiteration counter to the input value. Useful +for resuming reconstructions (for example, the continuity of +output image file numbering may be preserved). + + +\item[save estimates at subiteration intervals] [1, num\_subiterations,0{]} +Specifies at what intervals (in subiterations) the iterates of +the algorithm are saved. The final iteration is always saved. + + + +\item[inter-iteration filter subiteration interval] [0, num\_subiterations, 0{]} +Specifies at what intervals (in subiterations) inter-iteration +filtering is carried out. A value of 0 disables inter-iteration +filtering. + + +\item[inter-iteration filter type] +The type name of the inter-iteration filter. See Section \ref{sec:filters} +for the list of possible values. + +\item[post-filter type] +The type name of the post filter. See Section \ref{sec:filters} for the list +of possible values. + + +\item[inter-update filter subiteration interval] [0, num\_subiterations, 0{]} +Specifies at what intervals (in subiterations) inter-update filtering +is carried out (see [Jac00]). A value of 0 disables inter-update filtering.\\ +\textit{(OSMAPOSL specific)} + +\item[inter-update filter type] +The type name of the inter-update filter. See Section \ref{sec:filters} for +the list of possible values.\\ +\textit{(OSMAPOSL specific)} + + +\item[map model : additive{\textbar}multiplicative] +The default choice \textit{additive} applies the prior on the image +as is, the other choice \textit{multiplicative} applies it essentially +on the image times the sensitivity image. See [Mus01] for more +details.\\ +\textit{(OSMAPOSL specific)} + +\item[maximum relative change] [0, 3.40282e+38, 3.40282e+38{]} +The multiplicative update image will be thresholded from above +with this value (at every subiteration except the first) \textit{i.e.}, +before multiplying it with the old image to get the new one. +The default value does not impose any thresholding (as in strict +OSMAPOSL). However, we find that when subsets are used, a value +of about 10 is beneficial.\\ +\textit{(OSMAPOSL specific)} + + +\item[minimum relative change] [0, 3.40282e+38, 0{]} +The multiplicative update image will be thresholded from below +with this value (at every subiteration except the first).\\ +\textit{(OSMAPOSL specific)} + + +\item[write update image] [0, 1, 0{]} +When this is set to 1, OSMAPOSL will write the multiplicative +update images every sub-iteration.\\ +\textit{(OSMAPOSL specific)} + +\end{description} + + +{ +\subsubsubsection{ +Notes and technical issues regarding the selection of parameters} +} +\label{sec:OSMAPOSLtechnotes} + +\textbf{\textit{Application of filters:}} \\ +In addition to the remarks in section \ref{sec:filters} on filtering, +one should +note the following + + +(i) Inter-iteration filtering (or inter-update filtering) generally +results in resolution that is object dependent and space varying. +This is probably not what you want. See [Mus04,Mus02] for more +details. + + + +(ii) If a strictly positive Metz power parameter is chosen, a +non-trivial Metz filter results whose frequency response possesses +an amplifying middle frequency band. In this case, it is potentially +hazardous to choose too small a corresponding FWHM parameter. +For then, the amplifying mid-band may coincide with the high +frequencies of the noise components of the image and hence strengthen +these components. Empirically, we have found that good lesion +detectability is obtained by IMF-OSEM with Metz powers of 1, +together with FWHMs of 40\%-75\% the relevant dimensions of the +lesion (see also [Jac00]). + + + +(iii) All filtering operations in all iterative algorithms currently +implemented in the library apply post-thresholding +to ensure positivity at each iteration. Future +releases may allow users to vary the thresholding rule or de-activate +it. + + +\textbf{\textit{Zeroing end planes of segment 0}}: + + +The ``zero end planes of segment 0'' option is made available +to help users of the \textit{STIR} reconstruction software overcome +a modelling difficulty created by an awkward image discretisation +convention. So that images reconstructed using the \textit{STIR} software +can be compared to those of other reconstruction software, the \textit{STIR} +library defaults to an image discretisation scheme that has become +common among most commercial analytic reconstruction software +packages. In this scheme, images are discretised on a voxel grid +in which there are 2*num\_rings-1 transaxial slices of voxels, +num\_rings denoting the number of rings in the scanner. The axial +extent of each slice is half that of the detector rings and the +extreme-most voxel slices are centered about the mid-plane of +the extreme-most detector rings. A consequence of this set-up +is that the voxel grid does not cover the entire length of the +scanner, but rather leaves a gap at each end of the scanner whose +axial extent is half the axial length of a detector ring. + + + +We have discovered that this creates a problem for iterative +MLE algorithms when reconstructing activity distributions that +extend into these ``end gaps''. For the activity present in the +gaps is surely detected by the scanner. However, the restricted +extent of the voxel grid imposes a model of the projection data +statistics in which the activity in the gaps is zero. As a result, +the algorithm assigns an excess of activity to the end planes +of the image grid, seemingly because they are the next most likely +origins of the annihilations in the end gaps. In turn, the reconstructed +images exhibit excessively bright end planes. + + + +From a theoretical point of view, there is nothing ``wrong'' with +such reconstruction results. The image observed approximates +a maximum likelihood estimate consistent with the parametric +model assumed. From a practical point of view, however, it is +obvious that the parametric model assumed is an inferior one, +since it does not reflect the physical reality that activity +is present in the end gaps. In turn, poor quantification of the +end plane activity results. + + + +We have found that using the ``zero end planes of segment 0'' +option can often remedy this problem. This causes the reconstruction +to pretend that the detector pairs in the extreme-most detector +rings detected no counts. For the scanners currently supported +by the library, we have verified that only the measurements of +these detector pairs can be influenced by the end gap activity. +By setting this option, one models +the acquisition as one where the end ring detector pairs had +zero efficiency. This provides a more realistic model for the +truncated projection data. Note also that the acquisition software +of some scanners (e.g. the Positron HZL/R) automatically discards +the end plane data. For the same reasons, it is advisable to +use the ``zero end planes of segment 0'' in these cases as well. + + + +The method of zeroing end planes, unfortunately, does not apply +well to scanners whose 2D projection data includes merged cross-planes +(e.g. the GE scanners or all recent Siemens scanners). +This is because the currently supported +projectors yield a relatively poor model of the detection probabilities +associated with the end planes of such scanners. Excluding the +end detector pairs from the computation degrades the model still +further. Consequently, some of the voxel values in the end planes +may get very large (i.e. noisy) with increasing iterations. For such scanners, we +advise that users forego the ``zero end planes of segment 0'' +option. Doing so still yields very reasonable results in the +interior part of the reconstructed image. Moreover, future development +of the \textit{STIR} library's suite of projector functions will remedy +most of the problems discussed in this section. + + +Finally, for phantom studies in which the activity is known to +lie within the space covered by the voxel grid, the end plane +phenomenon does not arise. + +{\subsubsubsection{Extra parameters the MPI version}} +When running the MPI version of \texttt{OSMAPOSL} on distributed memory +systems, the following extra parameters can be set in the .par files. + +\begin{description} +\item[enable distributed caching] (default: 0) +Enables/disables the caching algorithm to save some communication overhead (according +to Tobias Beisel's tests, this makes only makes a difference with very large files). + +\item[enable distributed tests] (default : 0) +Tests to check whether the distributed functions work. This is of no use if you're +not developing new code for the parallel version. It could be thrown out of the code at some point. + +\item[enable message timings] (default : 0) +Prints timings of send and receive operations, to see where the time gets lost. +Could be used for later optimization. + +\item[message timings threshold] (default : 1.0) +Defines a threshold of the above timings, so that not all messages are timed, but those which +consume a serious amount of time. + +\item[enable rpc timings] (default : 0) +Measures the total time and the average slave time spend on RPC\_process\_related\_viewgrams\_gradient() function. +Gives some indication of how much time you save by calculating in parallel. +\end{description} + +See [Bei08] for some info on performance. + +{ \subsubsubsection{OSSPS} +} +\label{sec:OSSPS} + { \subsubsubsubsection{Algorithm description} + } + OSSPS is a relaxed preconditioned sub-gradient descent algorithm: + + \[ \lambda^\mathrm{new} = \lambda + \zeta D \nabla \Psi \] + + with $\lambda$ the parameters to be estimated, + $\Psi$ the objective function, + $D$ a dagional matrix (the preconditioner) + and $\zeta$ an iteration-dependent number called the relaxation parameter (see below). + + $D$ depends on $\Psi$. The data-dependent term in the preconditioner + suggested in Ahn and Fessler turns out to be equal to the product of the Hessian of + $\Psi$ summed over all columns (while using the data plug-in approach for + approximating the Hessian close to the solution). Therefore, this OSSPS + implementation uses this prescription in general and can be applied to any objective + function implemented in \textit{STIR}. + + Note that the exact paraboloidal surrogate algorithm by Erdogan and Fessler is currently + not implemented. + + The relaxation value for the additive update follows the suggestion from Ahn and Fessler: + + \begin{equation} + \zeta= { \alpha \over 1+ \gamma n } \label{eq:OSSPSrelaxation} + \end{equation} + + Note that because of the nature of the preconditioner, the OSSPS algorithm does not + perform very well in our experience when there is no ``additive sinogram''. + +{ \subsubsubsubsection{Running OSSPS} +} + + Most of what has been described above for OSMAPOSL applies verbatim for OSSPS. + See \textbf{STIR/samples/} for example parameter file(s). The + following describes the parameters that are specific to OSSPS: + + \begin{description} + \item[precomputed denominator] + if you do not specify this keyword, the data-dependent part of the + precomputed denominator will be computed automatically (and saved using + \texttt{output filename prefix}). You can use this parameter to + re-use the file from a previous run. \\ + Note: setting the value to 1 will use an images full of ones (which is not a good idea!) + + \item[relaxation parameter] + $\alpha$ in the formula \ref{eq:OSSPSrelaxation} above + \item[relaxation gamma] + $\gamma$ in the formula \ref{eq:OSSPSrelaxation} above + + \item[upper bound] + you can give an upper bound on the image values (the lower bound is always zero). The upper + bound defaults to a very large value. +\end{description} + +{ \subsubsubsection{Using list mode data as input} +} +\label{sec:ListmodeIterativeAlgorithms} +Since \textit{STIR} 2.0, you can specify an objective function that takes list mode data as input +and uses a projection matrix. This can be used to do a static image reconstruction +without any resolution loss etc. + +\textbf{WARNING: The current implementation has not been thoroughly tested.} Please use +the mailing lists for questions and results. + +The following gives the main parameters to use for OSMAPOSL. +{ \small +\begin{verbatim} +OSMAPOSLParameters := + objective function type:=\ + PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin + PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin Parameters:= + list mode filename:= listmodefile.lm + time frame definition filename:= timeframes.fdef + ; time frame to use data for the reconstruction + time frame number:=1 + ; maximum ring difference (defaults to all ring differences) + ;max ring difference num to process:= + ; matrix to use for forward and back projection (defaults to ray tracing) + ;Matrix type:= using ray tracing + ; background term + additive sinogram:= + sensitivity filename:=filename + + ; other usual objective function parameters + + End PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin Parameters:= + + ; normal OSMAPOSL algorithm parameters + +End:= +\end{verbatim} +} + +Currently, the sensitivity filename needs to be specified as the code to compute it using +a bin normalisation type has not yet been copied to the +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin +class. You could run OSMAPOSL first with projection data without axial compression (and view +``mashing'') to create the sensitivity filename. Similarly, if you want to use OSSPS, +you will need to run the projection data version first to get the ``precomputed denominator''. + +The additive sinogram is as discussed in \ref{sec:PoissonProjectionDataObjectiveFunction}, +but needs to be without axial compression (and view ``mashing''). + +{ \subsubsubsection{Parametric image estimation algorithms} +} +\label{sec:ParametricImageIterativeAlgorithms} +Both OSMAPOSL and OSSPS work have implementations to estimate parametric images from +dynamic data, called \textbf{POSMAPOSL} and \textbf{POSSPS} respectively. +Their parameters are identical to the static versions of the algorithms, except that +they need a different type of objective function. Currently, the only defined version is +where the input is dynamic projection data and the Patlak linear model is used to go from +dynamic images to parametric images. See section {sec:KineticModels} for more information. + +Currently, the input and output has to be in ECAT7 format. + +Below is an excerpt of a possible parameter for file POSMAPOSL. A complete parameter file +can be found in \textbf{STIR/samples/}. The only change is the fact that dynamic data +form the input, and that a (linear) kinetic model has to be specified. + +\begin{verbatim} +OSMAPOSLParameters := + objective function type:=\ + PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData + PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + + ; input dynamic projection data with emission + input file := SOME_DYNAMIC_PROJDATA.S + ; specify additive (dynamic) projection data to handle randoms or so + additive sinograms := SCATTER_AND_RANDOMS_ADDED_ECAT7.S + + ; kinetic model specification + Kinetic Model type := Patlak Plot + Patlak Plot Parameters := + ;; see the Patlak model description elsewhere + end Patlak Plot Parameters := + + ; other parameters such as projectors and sensitivity + ; identical to the static case + + end PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:= + + ; normal OSMAPOSL algorithm parameters + +End:= +\end{verbatim} + +\subsubsection{ +Filtered back projection (FBP2D)} + +This implements SSRB+FBP. Currently, data have to be completely +precorrected before-hand (arc-correction will be performed automatically +if necessary).\\ +The implementation is careful about the implementation of the +ramp-filter to avid problems with the DC component (see RampFilter.cxx +for more details). + + + +As described in Section \ref{sec:conventions}, the recommended manner of running \textbf{FBP2D} +is to pass the executable a parameter file argument which specifies +the relevant parameters of the reconstruction. Parameters omitted +from the file are assigned a default value. If a parameter file +is not used, the program prompts the user for the required information. + + +A sample.par file can be found in the \textbf{samples/} directory. +Below are the parameters you probably need. + + +\begin{verbatim} +fbp2dparameters := + +input file := input.hs +output filename prefix := output + +; output image parameters +; zoom defaults to 1 +zoom := 1 +; image size defaults to whole FOV +xy output image size (in pixels) := 180 + +; can be used to call SSRB first +; default means: +; if no axial compression, use 3 +; otherwise, use 1 +;num segments to combine with ssrb := -1 + +; filter parameters, default to pure ramp +alpha parameter for ramp filter := 1 +cut-off for ramp filter (in cycles) := 0.5 + +; keywords that specify the filtering that occurs at the end +; of the reconstruction +post-filter type := None + +end := +\end{verbatim} + +The filter parameters can be used to specify an apodising window with 2 parameters: +a cut-off frequency $\mathrm{fc}$ and $\alpha$ which specifies the usual + Hamming window (although I'm not so sure about the terminology here). +\[ + (\alpha + (1 - \alpha) * cos(\pi * f / \mathrm{fc})) +\] + + The actual implementation works differently to overcome problems with defining the ramp in frequency + space (with a well-known DC offset as consequence). We therefore compute the ramp*Hanning in + "ordinary" space in continuous form, do the sampling there, and then DFT it. + +\textbf{Warning:} the current version of the interpolating backprojector, +the default backprojector used by FBP2D, has a central artefact +on some systems (including Sparc and 64-bit AMD and Intel processors). + + +\subsubsection{ +3D Reprojection Algorithm (FBP3DRP)} + +This implements Kinahan and Rogers FBP algorithm with reprojection +of the missing data [Kin89]. The implementation is fairly generic +and should be able to handle non-standard data (e.g. with less +or more sinograms in a segment than you would normally have). +Also, the Colsher filter is numerically computed at a finer grid +in an initial stage to avoid DC problems. + + +A sample.par file can be found in the \textbf{samples/} +directory. See separate documentation on FBP3DRP, the doxygen documentation +(or the source) for more info. Similar to FBP2D, an apodizing window can be specified. +FBP3DRP defaults to using the ``pure'' Colsher filter. \\ +\textbf{Warning:} the current version of the interpolating backprojector, +the default backprojector used by FBP3DRP, has a central artefact +on some systems (including Sparc and 64-bit AMD and Intel processors). + +\subsection{ +Scatter Correction} +Coincidence events where one or more of the photons are scattered form a major contribution to the data +in 3D PET. This scatter background needs to be estimated and taken into account during reconstruction. In +\textit{STIR 2.1}, a version of the Single Scatter Simulation ( \textit{SSS}) algorithm [Wat96, Wat00, +Wat97, Wat04, Wer02, Poe03] has been implemented and evaluated [Tso04]. +Polycarpou et al describe in detail how to perform scatter correction +using STIR [Pol11]. + +\subsubsection{Data Initialisation \label{sec:scatter_data_initialisation}} +\begin{itemize} +\item Apply randoms correction and normalisation on emission data (this will be used to scale the scatter estimate) +\item Reconstruct attenuation image (ideally use odd number of voxels for zoom\_image step below). +\item Use \textbf{create\_tail\_mask\_from\_ACFs} to estimate the region that will be used for scaling +\item Reconstruct emission image without scatter correction +\item Construct a ``sub-sampled sinogram" template (i.e. same geometrical characteristics but +less rings and detectors without arc-correction) as suggested in literature (e.g. in [Tso04]). This template +sinogram should have no compression (number of views = half the number of detectors per ring, and span = 1 (see the +STIR glossary). +Use a number of tangential positions that is (Number of detectors per ring - 1) to cover all possible +detector pairs. You can reduce this if your scanner has a narrower FOV, but be careful that you do not +make it too small (otherwise you will get strange behaviour at the edge when upsampling the scatter estimate). +Because of a limitation in the upsampling routine, it is currently recommended to have ring difference 0 only in this +template. +\item Construct a ``subsampled" attenuation image using \texttt{zoom\_image} and \texttt{stir\_math}. + STIR SSS will select 1 scatter point per voxel in this attenuation image. This can be used to speed up your + calculation. When caching line integrals (which is the default), it also means that the scatter estimation + needs less memory.\\ + Careful: \texttt{zoom\_image} will scale the voxel values with the product of the zoom-factors in each dimension. + You need to undo this scaling for the ``subsampled'' image. + For example + \begin{verbatim} + # zoom to larger voxels + zoom_image zoomed.hv image_mu.hv 21 .25 0 0 5 .1626 + # correct back to mu-values + stir_math --accumulate --including-first --times-scalar .1626 \ + --times-scalar .25 --times-scalar .25 zoomed.hv + \end{verbatim} + The exact number of voxels and zoom does not matter too much (as long as you cover the + whole object), but the offset parameters to zoom\_image + \textbf{HAVE TO BE ZERO} and the number of voxels (in both input and output image) + \textbf{HAVE TO BE ODD}\footnote{See the Wiki for more information on offset conventions.} +\end{itemize} + +\cmdline{% +create\_tail\_mask\_from\_ACFs --ACF-filename \textbackslash \\ + --ACF-threshold \textbackslash \\ + --output-filename \textbackslash \\ + --safety-margin <0>% +} +\begin{description} +\item[ACF-filename] Attenuation Correction Factors Projection Data Filename +\item[ACF-threshold] Value used to threshold ACF and creates the mask, defaults to 1.01 +\item[safety-margin] This dilates the mask for a number of safety bins in tangential direction +\item[output-filename] The file that new projection data will be stored +\end{description} + +\subsubsection{SSS} +The actual scatter estimation process consists of $2$ steps: +\begin{itemize} +\item Use \textbf{estimate\_scatter} to find subsampled (single) scatter estimate from current emission image +\item Use \textbf{upsample\_and\_fit\_single\_scatter} +\end{itemize} +These steps are now discussed in more detail.\\[1cm] + +\cmdline{estimate\_scatter scatter.par} +Example \texttt{scatter.par} +\begin{verbatim} +Scatter Estimation Parameters:= +; threshold below which not to bother putting a scatter point +; in a voxel (in cm^-1) + attenuation_threshold :=.01 +; Place the scatter points in a random position of a voxel or in the centre + random := 1 +; Caching (of the line integrals) speeds up the estimation drastically. + use_cache := 1 +; The resolution of the scanner (at 511 keV) as given in the literature +; given as a ratio (example value is 22%) + energy_resolution :=.22 +; Acquisition settings + lower_energy_threshold :=350 + upper_energy_threshold :=650 + activity_image_filename := ACTIVITY_IMAGE + density_image_filename := DENSITY_IMAGE + density_image_for_scatter_points_filename := LOW_RESOLUTION_DENSITY_IMAGE + template_proj_data_filename := SUBSAMPLED_PROJECTION_DATA_TEMPLATE + output_filename_prefix := OUTPUT_PROJECTION_DATA +End Scatter Estimation Parameters:= +\end{verbatim} +\begin{description} +\item[activity\_image] +current estimate of the activity (or emission) image +\item[density\_image] mu-map or attenuation image (at 511 keV and in units cm$^{-1}$), +used to compute the line-integrals (in the exponentials) in the Klein-Nishina formula. +\item[density\_image\_for\_scatter\_points] "subsampled" attenuation image (at 511 keV and in units cm${}^{-1}$), +used to select scatter points (and their corresponding mu), +as discussed in section \ref{sec:scatter_data_initialisation} +\item[template\_proj\_data] +``subsampled sinogram'' template, +as discussed in section \ref{sec:scatter_data_initialisation} +\end{description} +The reason we use $2$ different attenuation images is to be able to investigate if the sampling used for +the attenuation in those $2$ situations makes any difference. Unfortunately, we didn't complete that +investigation so cannot recommend what to use for the original attenuation image (for large uniform +objects, it won't make any difference, for objects with small features of high attenuation, it might). +As discussed in the literature however, you can safely reduce the number of scatter points and still get +good estimates. +\\[1cm] +\cmdline{% +upsample\_and\_fit\_single\_scatter \textbackslash \\ + --min-scale-factor \textbackslash \\ + --max-scale-factor \textbackslash \\ + --remove-interleaving <1|0> \textbackslash \\ + --half-filter-width \textbackslash \\ + --output-filename \textbackslash \\ + --data-to-fit \textbackslash \\ + --data-to-scale \textbackslash \\ + --weights % +} +\begin{description} +\item[min-scale-factor,max-scale-factor]: Both min and max scale factors are set such that the scaling does not explode for some reason. +STIR's scatter routine is scaled such that scale-factor=1 is appropriate to model single scatter only. +For human patients, the presence of multiple scatter and out-of-FOV scatter means that the actual +scale factor will be a bit more than 1. How much will depend +on your scanner, the size of the patient etc. In most cases it shouldn't be +more than 2. Therefore, limiting the scale factor between 0.9 and 2 is probably a good idea. +\item[remove-interleaving]: Remove the interleaving in the coarse scatter estimate before upscaling (it is recommended to set this to 1) +\item[half-filter-width]: width of filter to apply on estimated scale factors (in axial direction). The filter is a simple boxcar. +\item[output-filename]: Scatter projection data at the emission data settings +\item[data-to-fit]: Normalised Emission sinogram (corrected for randoms) +\item[data-to-scale]: Course scatter sinogram +\item[weights]: This is the mask sinogram, or any other weighting factors on projection space that is used to define the region of scaling. +\end{description} +The procedure of scaling involves B-Splines interpolation for the tangential (Cubic), axial (Cubic) and +view (Linear) dimensions, while for oblique segments, currently the interpolation is achieved by applying the +pseudo-inverse transform of Single Slice Rebinning as described in [Tso05]. + +\subsubsection{Iterative loop (if necessary)} +The scatter estimation is based on images that do not include scatter, therefore an iterative procedure +is needed such that scatter is eliminated progressively. In the first iteration, scatter (B.2) is +overestimated and thus images are overcorrected (B.3) for it. Then, in the second iteration (B.2) scatter +is underestimated. The mean value of the two scatter estimates can be used for scatter correction. Two +iterations are usually enough to estimate a good approximation of scatter. + +\begin{itemize} +\item Reconstruct emission image with scatter estimate\\ +Two options exist: +\begin{itemize} +\item FBP: Correct the scatter estimate for attenuation and subtract from the precorrected emission data. +Run FBP with sufficient filtering. + \[\mathrm{Image} = \mathrm{FBP}\left(\mathrm{ACF}*(N*(P-R)-S)\right) \] +\item Iterative (e.g. OSEM or OSSPS): Use the following for the additive sinogram (\textit{A}). + \[A=(R*N+S)*(\mathrm{ACF}) \] +\end{itemize} +where + \begin{description} + \item[N] Normalization Factors, + \item[ACF] Attenuation Correction Factors, + \item[R] Random Projection Data, + \item[S] Scatter Projection Data as estimated using \textit{STIR}, + \item[P] Measured Projection Data (prompts) + \end{description} +\end{itemize} + +\subsubsection{Limitations} +The three separate executables need to be merged in one together with the iterative loop. The +\textit{SSS} can estimate 3D scatter that is measured by indirect rings but no interpolation of indirect +rings is currently in place. Therefore, upsampling of oblique sinograms is currently handled in a simple +way i.e. (pseudo)-inverse SSRB but ideally interpolation of the 3D sinograms will be useful. In the +current version, we have only \textit{SSS} in \textit{STIR} with scaling per sinogram of the scatter +sinograms for taking consideration of the out of field of view activity and multiple scattering +events. This generally seems to produce good results in most instances [Thi07]. + + +\subsection{ +Parametric Image Construction using kinetic modelling} +\label{sec:KineticModels} +A parametric image class (\textbf{ParametricDiscretisedDensity}) has been implemented that at the moment +can hold two parameters\footnote{Most relevant \textit{STIR} classes are templated in the number of parameters +and would therefore work with numbers. There are some preprocessor defines however to shorten the code in +a few places. Currently this uses \texttt{\#DEFINE NUM\_PARAMS 2}.}. +In this release \textit{Patlak plot} [Pat83, Pat85], i.e. a linear kinetic +model for tracers with irreversible kinetic behavior, has been implemented. The \textbf{PatlakPlot} class +is derived from the \textbf{KineticModel} class. + +The user will need to provide information about: +\begin{itemize} +\item File of input function (e.g. plasma activity or reference tissue activity values); +\item Calibration Factor (i.e. scale factor that sets the projection data to the same units with the input function) +\item Starting frame to apply \textit{Patlak Plot} +\item Delay between input function and PET measurement +\item Time-frame definition file. +\item The boolean \textit{In total counts} is 0 or 1 depending if the counts are total or mean over each frame +\item In correct scale should be set to 1 if \textit{STIR} has already scaled correctly the images according to \textit{x\_voxel\_size} +\end{itemize} +Example Sample File: \texttt{PatlakPlot.par} + +\begin{verbatim} +Patlak Plot Parameters:= + +time frame definition filename := +starting frame := UNSIGNEDINT +calibration factor := FLOAT +scale factor := FLOAT +blood data filename := plasma.if +; In seconds +Time Shift := FLOAT +In total counts := 1 +In correct scale := 1 + +end Patlak Plot Parameters:= +\end{verbatim} + +Current assumptions are that an \textit{F-18} tracer is used; the input function is not decay corrected and it +is given in a text file with three columns (i.e. \textbf{PlasmaSample}): time in \textit{seconds}, plasma-activity in +\textit{kBq/cm-3}, and blood-activity in \textit{kBq/cm-3}) +%HARRY TODO "and multiple" ? +and multiple the total number of \textbf{PlasmaSample} +is usually given in the very first row. Currently, the parametric image +has to be in \textbf{ECAT7} format with \textbf{num\_frames} being equal to \textbf{num\_params}. + +How to Run \textit{Patlak Plot}: + +\cmdline{% +apply\_patlak\_to\_images \textbackslash \\ + output-parametric-image input-dynamic-image patlak-plot.par} + +How to Estimate Dynamic Images using \textit{Patlak Plot} Parametric Images: +\cmdline{% +get\_dynamic\_images\_from\_parametric\_images \textbackslash \\ + output-dynamic-image input-parametric-image patlak-plot.par} + +Of course the reference tissue model can also be applied: + +\begin{verbatim} +Patlak Plot Parameters:= + +time frame definition filename := +starting frame := UNSIGNEDINT +calibration factor := 1 +scale factor := 1 +blood data filename := tac.roi +; In seconds +Time Shift := 0 +In total counts := 1 +In correct scale := 1 + +end Patlak Plot Parameters:= +\end{verbatim} + +\textbf{Important Note}: The current version of indirect reconstruction does not consider any special weighting for the time frames. This is a good approximation only if the counts at each frame is very similar which is mostly true for frames with the same duration. If the user needs to use \textit{weighted least-squares}, the code will need minor modification. + +Moreover, two direct reconstruction version of linear kinetic models have been also implemented, evaluated [Tso08, Tso07] and optimised [Ang11]. These are the parametric versions of \textbf{OSEM} and \textbf{OSSPS} therefore called \textbf{POSEM} and \textbf{POSSPS}. +P +\cmdline{POSMAPOSL POSEM.par} +\cmdline{POSSPS POSSPS.par} + + +The parameter files include the information of the kinetic model as described for the indirect case and the declaration of the new objective function type\\ +\texttt{PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData}. + +%TODO More information could be included for \textbf{MAP} estimation e.g. \textbf{quadratic priors}. + +\textbf{Important Note}: \textit{Patlak plot} Parameters are highly correlated thus \textbf{POSEM} and \textbf{POSSPS} will struggle to compute the parameters [Tso07]. However, for (non-negative) kinetic models that correlation is minimum it is expected that they will work fine. + + +\subsection{ +Motion Correction} +Motion correction has become an important task in PET imaging. Amongst several approaches to +motion-correct PET data, two are the most common: reconstruct-transform-average (RTA) [Kle96] and +motion-compensated image reconstruction (MCIR) [Li06]. In RTA, separate images are reconstructed for each +motion "state" (or "frame"), which are then transformed to one reference frame and averaged to produce a +motion-corrected image. In MCIR, the projection data from all frames are reconstructed together by +including the motion information into the reconstruction system matrix, so that a motion-corrected image +is produced directly. In both cases it is assumed that an accurate description of the motion is +available. + +In STIR, the motion compensation can happen either before or during reconstruction. Two research papers +have validated the implementation of RTA and MCIR in STIR [Pol12], [Tso13]. As these are based on +OSMAPOSL their names are RTA-OSMAPOSL and MCIR-OSMAPOSL. The implementation has been validated only for +the additive median-root-prior (MRP), but it is compatible with any MAP reconstruction of STIR. +Furthermore, the implementation can also work for OSSPS \textbf{but the current version of MCIR-OSSPS + needs further debugging}. + +During RTA, motion correction is performed by first reconstructing independently the raw data of each +respiratory position using a conventional iterative algorithm, such as the ordered subsets expectation +maximisation (OSEM).Then the reconstructed image of each gate is transformed to the reference position +using known motion fields. The transformed gates are then averaged to produce a motion-corrected image. +For example, when using MRP: + +\begin{equation} +\begin{array}{rrr} +\Lambda_{\nu g}^{(s+1)}=\Lambda_{\nu g}^{(s)}\frac{1}{ \sum\limits_{b\in S_{l}}P_{\nu b}A_{bg}+\beta_{g} \nabla_{\Lambda_{\nu}} E_{\nu}^{(s)}}\sum\limits_{b\in S_{l}}P_{\nu b}\frac{Y_{bg}}{\sum\limits_{\tilde{\nu}}P_{b\tilde{\nu}}\Lambda_{\tilde{\nu} g}^{(s)}+\frac{B_{bg}}{A_{bg}}} +\end{array} +\end{equation} +\noindent where +\begin{equation} +\begin{array}{rrr} +\beta_{g} \nabla_{\Lambda_{\nu}} E_{\nu}^{(s)} \equiv \beta_{g}\frac{\Lambda_{{\nu}g}^{(s)}-M_{{\nu}}^{(s)}}{M_{{\nu}}^{(s)}} +\end{array} +\end{equation} + +% TODO needs modification with ``time-duration'' +\begin{equation} +\begin{array}{rrr} +\Lambda_{\nu}=\frac{1}{G}\sum\limits_{g}\sum\limits_{\nu'}\hat{W}^{-1} _{\nu'g\rightarrow \nu}\Lambda_{\nu'g} +\end{array} +\end{equation} +The transform-and-average operation is performed by the +\texttt{warp\_and\_accumulate\_gated\_images} utility. + +For MCIR the motion transformations are incorporated directly into reconstruction. The motion corrected +image is reconstructed using the following iterative formula which is based on conventional OSEM +including motion via the forward / backward transformation operators, as well. Again using the Median Root Prior, we get + +% TODO needs modification with ``time-duration'' +\begin{equation} +\begin{array}{lcl} +\Lambda_{\nu}^{(s+1)}&&=\Lambda_{\nu}^{(s)} \frac{1}{ \sum\limits_{b\in S_{l}, g} \sum\limits_{\nu'} \hat{W}^{-1} _{\nu'g\rightarrow \nu}P_{\nu' b}A_{bg}+\beta \nabla_{\Lambda_{\nu}} E_{\nu}^{(s)}}\\ +&&\times \sum\limits_{b\in S_{l}, g} \sum\limits_{\nu'}\left(\hat{W}^{-1} _{\nu'g\rightarrow \nu}P_{\nu' b}\frac{Y_{bg}}{\sum\limits_{\tilde{\nu}}P_{b\tilde{\nu}}\sum\limits_{\tilde{\nu}'}\hat{W} _{\tilde{\nu}'\rightarrow \tilde{\nu}g}\Lambda_{\tilde{\nu}'}^{(s)}+\frac{B_{bg}}{A_{bg}}}\right) +\end{array} +\end{equation} + + + +Notation: +\begin{itemize} +\item $\Lambda_{\nu}^{(s)}$ is the radioactivity distribution at voxel ${\nu}$ and subiteration number $s$; + +\item $Y_{bg}$ is the number of coincident photons of each detector pair (bin) $b$ that belongs to the $lth$ subset $S$ and gate $g$; + +\item $S_{l}$ corresponds to the $lth$ subset of the projection space, which is divided into $L$ total subsets; + +\item $s$ is the subiteration number and $l = s$ mod $L$. A set of $L$ subiterations comprises a full iteration; + +\item $P_{b\nu}$ is the system projection matrix; + +\item $\hat{W}$ , $\hat{W}^{-1}$ represent the forward / backward warping operations of the image that move the activity from voxel $\nu'$ to the voxel $\nu$ using the motion fields and linear interpolation; + +\item $E$ is the ``potential'' function; + +\item $M_{\nu}$ corresponds to the median $3\times3\times3$ mask width of neighbourhood voxels centred at voxel $\nu$; + +\item $G$ is the total number of gates; + +\item $\beta$, $\beta_{g}$ are the penalisation factors for MCIR and RTA, respectively. Note that $\beta$ = $G\times\beta_{g}$, but for simplicity all cases are displayed with respect to $\beta_{g}$; + +\item $A_{bg}$ and $B_{bg}$ are the attenuation coeffecient and background term (e.g. scatter) for each bin and gate, respectively. +\end{itemize} + +Both RTA-OS-MAP-OSL and MCIR-OS-MAP-OSL are using the same routines for warping each respiratory gate to +the reference gate. However, MCIR requires two motion fields: the forward ($\hat{W}$) motion fields and the +backward ($\hat{W}^{-1}$) motion fields (i.e. the same as used in RTA). The forward operator practically warps all +frames to the reference frame, while the backward operator 'unwarps' the reference frame to each frame so +that they can be compared with the corresponding projection gates in the numerator. It is important that +the forward and backward projectors are consistent with each other, if not the result might not converge +to a solution. In future we plan to include an alternative option for the backward motion fields to be +the transpose matrix of the forward motion fields. + +\noindent \textbf{Warning:}\\ +The current implementation has been tested for respiratory gating, where each gate has the same number of +counts. If this is not the case, or if there is for instance radioactive decay between frames in dynamic +PET, the implementation likely needs minor modifications. For instance, the different gate duration could +be accounted for by normalising for the time duration [Rah08]. +A simple temporary solution is to rescale the +normalisation sinogram to take into account time duration, e.g. for two +gates with the first gate having $80$\% of the total duration and the second +gate $20$\%, the normalisation sinogram for the first gate should be divided +by a factor $0.8$ and the second by $0.2$. + + + +\subsubsection{Data Preparation} + +Multiple +Files (one for each position): Emission sinogram, Multiplicative corrections +(attenuation, normalisation), additive corrections (scatter, randoms), motion +vectors, and gate definitions filename. + +\begin{itemize} +\item Sinograms for each position: +These have a standard suffix \_g\#, e.g. \textit{sinogram\_g1.hs} is the header of the +position 1. To read the sinogram you will need also have set the corresponding +definition file for the positions, e.g. \textit{sinogram.gdef} + +\item Images: +These have a similar suffix \_g\#, e.g. \textit{image\_g1.hv} is the header of the +position 1. To read the image you will need also to set the corresponding +definition file for the positions, e.g. \textit{image.gdef} + +\item Motion Vectors: +These have a standard suffix \_g\#d\%, e.g. \textit{motion\_g1d1.hv} is the header of the motion +corresponding to the position 1 and the first direction (i.e. axial according +to STIR coordinate system); \textit{d2} corresponds to the vertical axis +direction and \textit{d3} to the horizontal axis direction. To read the files you +will need also to have set the corresponding definition file for the positions, +e.g. \textit{motion.gdef}. The image has exactly the same characteristics as the +reconstructed PET image. This currently creates a minor burden as the final +voxel sizes and the number of voxels have to predefined on the motion vector +images. We hope to change this in future releases. +\end{itemize} + +{\subsubsubsection{Coordinate system for motion vectors: }} + +Although motion is designed for general motion +information such as rigid motion, affine etc, currently only MotionVectors on a +Cartesian grid are implemented. Information is stored in millimeter using the normal +STIR coordinate system and axes (see the developer's guide). + +\textbf{Important} STIR (as many other programs) uses a +\textit{pull interpolation} warping, i.e.\ for each voxel in the target +(i.e.\ motion-corrected) image, the motion vector +at that voxel is added to its coordinates, the corresponding location (i.e.\ before motion correction) +in the original image is found and the new value is obtained by interpolating +between the values of the surrounding voxels of the original image. + +One way to understand this is as follows: if a point-source is in a voxel at location $\vec r$ in the motion-corrected image +and the motion field at that voxel is $\vec m_1$ for gate $1$, then this means that the point source +was at location $\vec r + \vec m_1$ in gate $1$. + +A nice illustration can be found (at the time of writing) at\\ +{ \small +\url{http://www.bioen.utah.edu/wiki/index.php?title=Geometric_Transformation_and_Interpolation}{http://www.bioen.utah.edu/wiki/index.php?title=Geometric\_Transformation\_and\_Interpolation}}. + +\subsubsection{Motion Correction} + +{ \subsubsubsection{RTA} +} +See section \ref{sec:motionRelatedUtilities}. + +{ \subsubsubsection{MCIR} +} + +The procedure involves warping operation by the use of linear interpolation (based +on B-Splines) in each forward/backward step. Note that the current release +assumes no weighting over the respiratory positions but this could be manually +included in the multiplicative sinogram. + +As the main reconstruction algorithm is exactly the same as for ordinary image +reconstruction, we can use the normal OSMAPOSL program, but with a different +objective function. + +\cmdline{OSMAPOSL OSMAPOSL\_with\_motion\_correction.par} + +An example parameter file would be as follows +{ +\small +\begin{verbatim} +OSMAPOSLParameters := +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion + +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion Parameters:= +input filename := INPUT +projector pair type := Matrix +Projector Pair Using Matrix Parameters := +Matrix type := Ray Tracing +Ray Tracing Matrix Parameters:= + ; use a slightly better approximation than simple ray tracing + number of rays in tangential direction to trace for each bin := 10 +End Ray Tracing Matrix Parameters:= +End Projector Pair Using Matrix Parameters := + +use subset sensitivities := 1 + +; This input is to read the multiplicative factors +; (normalisation*attenuation). The suffix of each file is _g# +normalisation sinograms := ATTENNORMFACTORS + +; The input is to read the additive term +; (randoms + scatter). The suffix of each file is _g# +additive sinograms := added_sinos + +Gate Definitions filename := MOTION.gdef + +; The Motion Vectors are in image file format and their suffix is _g#d% +; where % corresponds to the dimension (1, 2 or 3) +Motion Vectors filename prefix := MOTION +Reverse Motion Vectors filename prefix := INVERTEDMOTION + +; here comes the MRP stuff +prior type := FilterRootPrior +FilterRootPrior Parameters := + penalisation factor := 1 + ; you can use any image processor here + ; the next parameters specify a 3x3x3 median + Filter type := Median + Median Filter Parameters := + mask radius x := 1 + mask radius y := 1 + mask radius z := 1 + End Median Filter Parameters:= +END FilterRootPrior Parameters := + +end PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjectionDataWithMotion Parameters:= + +number of subsets:= 23 +number of subiterations:= 460 +save estimates at subiteration intervals:= 23 +output filename prefix := MOTIONCORRECTEDIMAGE + +END:= +\end{verbatim} +} + +\subsubsection{Regularisation and Noise} +According to [Tso13], regularisation is generally advised for either RTA or MCIR. +Currently, MRP is validated. Further tests on quadratic prior and OSSPS +implementation are recommended to the researchers using STIR. Otherwise, two +iterations are usually enough to obtain a relatively good image if followed by +postfiltering. + + +\subsubsection{Further Extensions for the Future} +More robust testing: Currently the tests are performed based on basic tests. + +OSSPS: Needs further debugging as it seems the current settings do not reconstruct the +motion compensated image. + +Scatter Estimation: Assumed to have it already estimated prior to reconstruction. + +\subsubsection{Realistic Datasets and other info} +An extensive +database of realistic simulated PET data with motion is available at\\ +\url{http://www.isd.kcl.ac.uk/pet-mri/simulated-data/}{http://www.isd.kcl.ac.uk/pet-mri/simulated-data}. + +Motion fields of these data have been estimated using a local hierarchical affine +registration algorithm developed by Christian Buerger [Bue11]. This independent +library is available at +\url{http://www.isd.kcl.ac.uk/internal/hyperimage}{http://www.isd.kcl.ac.uk/internal/hyperimage}. +The library is working with GIPL (Guy's Image Processing Lab) File Format and we provide in STIR two utilities two convert +them to/from Interfile format (conv\_gipl\_to\_interfile and +conv\_interfile\_to\_gipl). Note that special care need to be taken with respect +to the orientation the original files have been stored in gipl format. + + +\subsection{ +Utilities} + +Programs are given in the \textbf{STIR/utilities} directory, that +allow the user to display, manipulate and convert \textbf{interfile} +data, either image or projection data. + +Utilities specific to files in ECAT 6 or 7 format or in the \textbf{ecat} +sub-directory. + +\subsubsection{ +Displaying and performing operations on data} + +The programs are \textbf{manip\_image}, \textbf{stir\_write\_pgm}, \textbf{list\_image\_info}, +\textbf{list\_image\_values} and \textbf{find\_maxima\_in\_image} +for image data and \textbf{manip\_projdata}, + \textbf{display\_projdata}, \textbf{extract\_segments}, +\textbf{list\_projdata\_info} for +projection data and \textbf{stir\_math} for both. Run them with the +name of the image or projection data file as an argument. For +example, for \textbf{manip\_image}: +\cmdline{manip\_image file\_name.hv} + + +See also section \ref{sec:SSRB} for the use of \textbf{SSRB} to manipulate projection +data. + + +The program \textbf{get\_time\_frame\_info} is \textit{STIR}'s first (small!) +step into supporting dynamic data. + + +\textbf{Note}: The displaying functionality is \textit{really} basic, and +only intended for a quick check how your data looks like. For +any serious work, use a decent viewer. For example, \textit{AMIDE} +is a free viewer that can read \textit{STIR} image data +\footnote{\url{http://amide.sourceforge.net }{http://amide.sourceforge.net}}. Alternatively, +convert your \textit{STIR} data to another format using (X)medcon +\footnote{\url{http://xmedcon.sourceforge.net }{http://xmedcon.sourceforge.net}}. + +{ \subsubsubsection{list\_image\_info} +} + +A utility that lists information about an image on stdout. This includes number of voxels, +physical sizes, bounding boxes, etc. It also prints min/max/sum of the data. + +{ \subsubsubsection{stir\_write\_pgm} +} + +A utility that writes a PGM file for a single slice of an image. You can specify min and max threshold, +orientation and slice number. PGM files can be displayed for instance via ImageMagick. +This utility is mainly useful for shell/batch scripts. + +{ \subsubsubsection{manip\_image} +} + +This program works on two modes. Additionally to the display +possibility, the main mode allows to retrieve information about +the image: + +\begin{itemize} +\item the minimum and maximum values; either for a plane or for an +entire 3D image. +\item the number of counts. +\item the voxel value profile; either for an image slice or for any +row 1D row through the image. +\end{itemize} +Within this mode, a truncation (here called trim) of the data +can be performed; it results in the circular resetting to zero +of pixels at the image edges. + + +The other mode (math mode) lets one perform arithmetic operations +between two images, or between an image and a scalar. The result +of each calculation is kept in a math mode buffer which becomes +the input to the next calculation. Hence, a sequence of mathematical +operations can be carried out on the input image within math +mode. The math buffer contents can also be displayed inside the +mode. + +{ \subsubsubsection{manip\_projdata} +} + +This utility is the counterpart of manip\_image for projection +data. A menu is displayed with the following options: + +\begin{itemize} +\item viewgram-wise / sinogram-wise display. +\item computation of minimum and maximum values and total counts. +\item arithmetic operations between two projection data arrays or +between a projection data array and a scalar. +\item binarisation of the sinogram, positive values are set to 1, +negative values to 0. +\item truncation of the negative values. +\item application of a tangential truncating window (e.g. all data +for bins greater than a specified distance from the scanner axis +may be set to 0). +\item application of an axial truncating window to segment 0 (e.g. +end plane data may be set to zero). +\end{itemize} +Each time an operation results in a new projection data array, +the user is prompted for the name of an output file, to which +the result is written. This output file then automatically becomes +the input file to the next selected operation. Similar to manip\_image, +this allows new projection data files to be generated from a +sequence of operations. + + +\textbf{Warning}: the user must ensure that all input and output projection +data arrays in a given operation are read from / written to separate +files. + +{ \subsubsubsection{display\_projdata} +} + +This utility should be preferred to \textbf{manip\_projdata} when the +goal is to display the data by view or by segment for a defined +segment number (ring difference). + +{ \subsubsubsection{list\_projdata\_info} +} + +A utility that lists size info of the projection data on stdout. Optionally +it also prints min/max/sum of the data. +Use this if you think there is something wrong with how \textit{STIR} +reads your projection data. + +{ \subsubsubsection{create\_projdata\_template} +} + +This utility is mainly useful to create a template that can then +be used for other \textit{STIR} utilities (such as forward\_project, lm\_to\_projdata +etc.). +\cmdline{create\_projdata\_template output\_filename} + +This will ask questions to the user about the scanner, the data +size, etc. It will then output new projection data (in Interfile +format). However, the binary file will not contain any data. + +It currently only supports PET data. For SPECT, you will have to copy the +sample Interfile header from the \textbf{samples} directory and edit it by hand. +You will also need to provide a file with the binary data (but this can be empty if +you are only going to use this as a template). + +{ \subsubsubsection{extract\_segments} +} + +This utility extracts projection data by segment into a sequence +of 3d image files. It is mainly useful to import segments into +external image display/manipulation programs which do not understand +3D-PET projection data, but can read Interfile images. + + +The user will be asked if the images should correspond to SegmentByView +or SegmentBySinogram data. In the first, data are stored as a +stack of viewgrams (one for each view), in the second as a stack +of sinograms (one for each axial position). (See the \textit{STIR} glossary). + +{ \subsubsubsection{stir\_math} +} +\label{sec:stir_math} + +This is a command line utility for adding or multiplying data +and other numerical operations, with a somewhat awkward syntax. +Just execute \texttt{stir\_math} for a usage message. + +Since \textit{STIR} 2.1, this utility also supports parametric or dynamic data using +the command line switches \texttt{--parametric} and \texttt{--dynamic}. + +\textit{Examples} +\begin{itemize} +\item +Adding 3 images +\cmdline{stir\_math output in1 in2 in3} + +Sets \textit{output=in1+in2+in3}\\ +\item +Subtracting 2 images +\cmdline{stir\_math --times-scalar -1 output in1 in2} + + +Sets \textit{output=in1-in2}\\ +\item +Sum the square of each images +\cmdline{stir\_math --power 2 --including-first output in1 in2} + + +Sets \textit{output=in1}$^{\mathit{2}}$ \textit{+ in2}$^{\mathit{2}}$\\ +\item +Dividing 2 projection data files +\cmdline{stir\_math -s --mult --power -1 output in1 in2} + + +Sets \textit{output=in1/in2}\\ +\item +Dividing 2 projection data files avoiding division by 0 by thresholding +the 2$^{nd}$ data-set. +\cmdline{stir\_math -s --mult --min-threshold .1 --power -1 {\textbackslash}\\ +output in1 in2} + + +Sets \textit{output=in1/max(in2,.1)}\\ +\item +Dividing 2 files, with first file set to the quotient +\cmdline{stir\_math --accumulate --mult --power -1 in1 in2} + + +Sets \textit{in1=in1/in2}\\ +\item +Linear combination of 3 files +\cmdline{stir\_math --times-scalar 5 --divide-scalar 2.5 output {\textbackslash}\\ +in1 in2 in3} + + +Sets \textit{output=in1+2*in2+2*in3} +\end{itemize} + +\textbf{Warning} There is no check that the data sizes and other info +are compatible and the output will have the largest data size +in the input, and the characteristics (like voxel-size or so) +are taken from the first input data. Hence, lots of funny effects +can happen if data are not compatible. + + +\textbf{Warning} When \texttt{'--accumulate'} is not used, the output file +HAS to be different from all the input files. + +\textbf{Warning} The result of using non-integral powers on negative +numbers is probably system-dependent. + +{ \subsubsubsection{generate\_image} +} + +This program can be used to generate +images containing geometric shapes such as cylinders, spheres +etc. See the online documentation generated by doxygen for more +info. + +{ \subsubsubsection{zoom\_image} +} + +This can be used to reinterpolate +images to different voxel sizes and/or dimensions. See the online +documentation generated by doxygen for more info. + +{ \subsubsubsection{get\_time\_frame\_info} +} +\label{sec:get_time_frame_info} +This simple program allows display of time frame info for a given +file. The specified file can be an ECAT6 or an ECAT7 file, or +a simple text file specifying the number of time frames and their +durations. See the class documentation for \textit{TimeFrameDefinitions} +for the format of this text file. + + +\noindent +Basic Usage: +\cmdline{get\_time\_frame\_info filename frame\_number} + + +Using no arguments will give a more extensive usage message showing +some options to select which data to print. + +{ \subsubsubsection{list\_ROI\_values} +} + +This is a test-release of a program that can be used to find +ROI values for an image. See the online documentation generated +by doxygen for more info. + + +\subsubsection{ +Converting data} +\label{sec:convertingdata} +This program is used to convert CTI ECAT 6 data (either image +or projection data) into interfile data. It normally should be +run as follows +\cmdline{convecat6\_if output\_file\_name\_without\_extension {\textbackslash}\\ +cti\_data\_file\_name [scanner\_name]} + + +The optional \textit{scanner\_name} can be used to force to a particular +scanner (ignoring the system\_type in the main header). \textit{scanner\_name} +has to be recognised by the Scanner class (see STIR/buildblock/Scanner.cxx). +Examples are: ECAT 953, ART, ECAT HR+, Advance etc. If the \textit{scanner\_name} +contains a space, the scanner name has to be surrounded by double +quotes when used as a command line argument. + + +If there are no command line parameters, the user is asked for +these parameters instead. + + +The program asks if all frames should be written or not. If so, +all sinograms/images are converted for a fixed 'data' number. +For each data set, a suffix is added to the output\_filename +of the form \texttt{\_f\#g\#b\#d\#} where the \# are replaced +by the corresponding number of the frame, gate, bed, data. + + + +\textbf{Warning} CTI ECAT 6 files seem to have a peculiarity that +frames and gates are numbered from 1, while bed positions are +numbered from 0. Similarly, the number of bed positions in the +main header seems to be 1 less than the actual number present. +This is at least the case for single bed studies. If this is +not true for multi-bed studies, the code would have to be adapted. + + +\textbf{Warning} Most of the data in the ECAT 6 headers is ignored +(except dimensions) + + +\textbf{Warning} Data are multiplied with the subheader.scale\_factor, +In addition, for emission sinograms, the data are multiplied +with subheader.loss\_correction\_fctr (unless the loss correction +factor is \texttt{<} 0, in which case it is assumed to be 1). + + +\textbf{Warning} Currently, the decay correction factor is ignored + +\textbf{Warning} Note that sinogram data have to be 'corner-swapped', +see section \ref{sec:ecat_swap_corners}. + +{ \subsubsubsection{conv\_to\_ecat6} +} +This program is used to convert image or projection data into +CTI ECAT 6 data (input can be any format currently supported +by the library). It normally should be run as follows: + + +for images: +\cmdline{conv\_to\_ecat6 [-k] [-i] outputfilename.img {\textbackslash}\\ +input\_filename1 [input\_filename2 \dots ] scanner} + + +for projection data: +\cmdline{conv\_to\_ecat6 -s[2] [-k] [-i] outputfilename.scn {\textbackslash}\\ +input\_filename1 [input\_filename2 \dots ]} + + +If there are no command line parameters, the user is asked for +the filenames and options instead. Unless the --\textit{i} option is +used, the data will be assigned a frame number in the order that +they occur on the command line. + + +See \textbf{STIR/buildblock/Scanner.cxx} for supported scanner names, +but examples are ``ECAT 953'', ``ART'', +``Advance''. + + +{ \subsubsubsubsection{Command line options} +}\begin{description} +\item[-s2] This option forces output to 2D sinograms (ignoring higher +segments). +\item[-k] the existing ECAT6 file will NOT be overwritten, but added +to. Any existing data in the ECAT6 file with the same \texttt{<}frame,gate,data,bed\texttt{>} +specification will be overwritten. +\item[-i] ask for \texttt{<} frame,gate,data,bed\texttt{>} for each dataset +\end{description} + +Note that to store projection data in ECAT6, a 3D sinogram cannot +be axially compressed (CTI \textit{span}=1).\\ +\textbf{Warning} This utility does \textit{not} corner-swap 3D projection +data back to the `raw' convention, see section \ref{sec:ecat_swap_corners}. + +{ \subsubsubsection{conv\_to\_ecat7} +} +This program is used to convert image or projection data into +CTI ECAT7 data (input can be any format currently supported by +the library). \textbf{conv\_to\_ecat7} uses the Louvain la Neuve ecat +library, see section \ref{sec:ECAT67support}. This means it will only work on those +systems supported by that library. It normally should be run +as follows + + +for images: +\cmdline{conv\_to\_ecat7 output\_ECAT7\_name input\_filename1 {\textbackslash}\\ +{[}input\_filename2 \dots ] scanner} + + +for emission projection data +\cmdline{conv\_to\_ecat7 --s output\_ECAT7\_name input\_filename1 {\textbackslash}\\ +{[}input\_filename2 \dots ]\tab } + + +for sinogram-attenuation data +\cmdline{conv\_to\_ecat7 -a output\_ECAT7\_name orig\_filename1 {\textbackslash}\\ +{[}orig\_filename2...]} + + +If there are no command line parameters, the user is asked for +the filenames and options instead. The data will be assigned +a frame number in the order that they occur on the command line. + + +See \textbf{buildblock/Scanner.cxx} for supported scanner names, but +examples are ``ECAT 953'', ``ART'', ``Advance''. + + +{ \subsubsubsection{ifheaders\_for\_ecat7: ECAT7 support for reading} +} +The current release includes some support for making Interfile +headers that point towards and ECAT 7 file. This is possible +because ECAT7 normally stores the data with single subheaders +per frame/gate/bed/data. \textbf{ifheaders\_for\_ecat} uses the Louvain +la Neuve ecat library, see section \ref{sec:ECAT67support}. +This means it will only work on those systems +supported by that library. \\ +This program writes Interfile headers that 'point into' an ECAT +7 file. That is, the binary data are NOT rewritten. So, the result +of this program is a collection of Interfile headers for every +data set in the ECAT 7 file. They are called \textit{ecat7\_filename\_extension\_f1g1d0b0.* +etc}, indicating which frame, gate, bed, data number the dataset +corresponds to. Run the program as follows +\cmdline{ifheaders\_for\_ecat7 ecat7\_filename.extension} + + +This only works with some CTI file\_types. In particular, it +does NOT work with the ECAT6-like file\_types, as then there +are subheaders 'in' the datasets.\\ +\textbf{Warning} This utility does \textit{not} take corner-swapping of +3D projection data into account, see section \ref{sec:ecat_swap_corners}.\\ +Note that you do not have to use this utility if you want to +read only ``frame 1, gate 1, data 0, bed 0''. In this case, you +can pass the ECAT7 file directly to any \textit{STIR} program. +\\ +\textbf{Warning} The calibration factor field in the main header of ECAT7 images +is currently ignored. + +\subsubsubsection{ecat\_swap\_corners} +\label{sec:ecat_swap_corners} +{ \subsubsubsubsection{Usage} +} +\cmdline{ecat\_swap\_corners out\_name in\_name} + +{ \subsubsubsubsection{What does it do?} +} +For some historical reason, CTI scanners store 3D sinograms sometimes +in a 'corner-swapped' mode. What happens is that some corners +of the positive and negative segments are interchanged. (As a +consequence, segment 0 is never affected).\\ +Below is a summary of what Kris Thielemans understood about corner-swapping +from various emails with CTI people. However, he might have totally +misunderstood this, so beware! + + + +For ECAT6 data, corner-swapped mode occurs \textbf{\textit{always}} for +data straight from the scanner. However, data which have been +normalised using the import\_3dscan utility from CTI are already +corner-swapped correctly. Unfortunately, there is no field in +the ECAT6 header that allows you to find out which mode it is +in. + + + +For ECAT7 data, the situation is even more confusing. Data acquired +directly in projection data have to be corner-swapped when the +acquisition was in 'volume-mode' (i.e. stored by sinograms), +but NOT when acquired in 'view-mode' (i.e. stored by view). It +seems that bkproj\_3D\_sun follows this convention by assuming +that any ECAT7 projection data stored in 'volume-mode' has to +be corner swapped, and when it writes projection data in 'view-mode', +it does the corner swapping for you. So, although there is strictly +speaking no field in the ECAT7 header concerning corner swapping, +it seems that the `storage mode' field determines the corner swapping +as well.\\ +When the data is acquired in listmode, this changes somewhat. +Apparently, there is a parameter in the set-up of listmode scans +that allows you to put the ACS in 'volume-mode' or 'view-mode'. +The resulting listmode files encode the sinogram coordinates +then with corner-swapping or without. After the acquisition, +the listmode data has then to be binned into projection data. +It is then up to the binning program to take this corner-swapping +into account. This is easiest to do by generating 'volume-mode' +projection data when a 'volume-mode' when the listmode setup +was in 'volume-mode', and similar for 'view-mode'. + + +If this sounds confusing to you, KT would agree. Here seems to +be the best thing to do: + + +\textit{Do all acquisitions in 'view-mode', set-up your listmode +scan in 'view-mode', bin the data in 'view-mode'. Forget about +corner-swapping.} + + +If you cannot do this, then this utility will corner-swap the +projection data for you. + +{ \subsubsubsubsection{Who implemented this and how was it tested?} +} +The actual corner swapping code was supplied by Christian Michel, +based on code by Larry Byars. KT has tested it by performing +a very long cylinder scan in 'volume-mode' on the ECAT 966, and +looking at the delayeds. The oblique segments had obvious discontinuities +in the efficiency patterns. After applying this utility, these +discontinuities appeared. + + + +\textbf{Warning} This utility does not (and cannot) check for you +if the data has to be corner-swapped or not. So, it can do the +wrong thing. + +{ \subsubsubsection{copy\_ecat7\_header} +} +Allows copying header info between ECAT7 files. Check doxygen, or run without +parameters for usage info. + +{ \subsubsubsection{conv\_AVW} +} +\label{sec:convAVW} +If you have the \textit{AVW}\texttrademark library +\footnote{See \url{http://www.mayo.edu/bir/Software/AVW/AVW1.html} +{www.mayo.edu/bir/Software/AVW/AVW1.html}. +} installed on your system, the build process should have built \texttt{utilities/conv\_AVW}, +see also \ref{sec:UsingCMake}. +This utility allows to use the \textit{AVW} library to read an image, and then write it out +using \textit{STIR} as Interfile.\\ +\textbf{Warning:} the \textit{AVW} library seems to do flip some images depending +on the file format. For instance, it reads \textit{ECAT7} files using a z-flip compared +to \textit{STIR}. + +It normally should be run as follows: +\cmdline{conv\_AVW [ --flip\_z ] imagefile} + +It will require access to a run-time license for \textit{AVW}. + +{ \subsubsubsection{conv\_GATE\_projdata\_to\_interfile} +} +This program converts GATE raw sinogram output (.ima) into STIR interfile format. + +{ \subsubsubsection{conv\_gipl\_to\_interfile and conv\_interfile\_to\_gipl} +} +These programs convert from/to GIPL format. The latter program has a somewhat wrong name. +It will actually read an image in any format supported by STIR. + + +\subsubsection{ +Filtering image data} + +The \textbf{postfilter.cxx} program allows one to apply any available +image processor on an input image. \footnote{{\small The current version +does no longer allow to compute the impulse response (i.e. point +spread function) of a discretised filter. This is largely because +the image processors can be non-linear, in which case the PSF +concept does not apply. For linear filters, it would still be +possible to obtain the PSF by using as input image an image with +all 0s except a single pixel in the middle of the image.}} Review +Section \ref{sec:filters} for info on which filters you can apply. + + +The program is run as follows: +\cmdline{postfilter [\texttt{<}output filename\texttt{>} [\texttt{<}input file +name\texttt{>} {\textbackslash}\\ +{[}\texttt{<}postfilter\_par\_filename\texttt{>}]]]} + +where the square brackets denote optional parameters (their value +will be asked interactively). Example postfilter.par files can +be found in the \textbf{STIR/samples} directory. + + +\subsubsection{ +Comparing files} + +The two utilities \textbf{compare\_image} and \textbf{compare\_projdata} +can be used to see if 2 files are identical up to rounding errors. +(Note that running reconstructions on a different architecture, +or even when using different compilers will almost certainly +give rounding error differences.) They should be run with 2 command +line arguments, specifying the 2 filenames. Optional arguments +are as follows: +\cmdline{compare\_projdata file1 file1 +[maximum\_segment\_number\_to\_process]} +\cmdline{compare\_image [-r rim\_truncation\_in\_pixels] file1 file1} + + +where the \texttt{rim\_truncation} argument to \textbf{compare\_image} says +how many pixels it should ignore at the radial rim of the image. + + + +\subsubsection{ +Precorrecting (or uncorrecting) projection data} + +The \textbf{correct\_projdata} utility located in STIR/\textbf{utilities} +is useful to perform precorrections such as randoms and/or scatter +subtraction, normalisation and attenuation correction. It can +also be used to 'uncorrect' the data which might be useful if +you get completely precorrected data out from the scanner (or +FORE) and want to reverse some of the corrections. + + +It is run as +\cmdline{correct\_projdata correct\_projdata\_par\_filename} + + +A sample parameter file is given in \textbf{STIR}/\textbf{samples} and +is more or less as follows + +\begin{verbatim} +correct_projdata Parameters := +input file := trues.hs + +; Current way of specifying time frames, pending modifications to +; STIR to read time info directly from the headers + +; The specified file can be an ECAT6 or an ECAT7 file, or a simple +; text file. See also section \ref{sec:get_time_frame_info}. +time frame definition filename := frames.fdef + +; if a frame definition file is specified, you can say that +; the input data corresponds to a specific time frame +; the number should be between 1 and num\_frames and defaults to 1 +; this is currently only used to pass the relevant time +; to the normalisation +time frame number := 1 + +; output file +; for future compatibility, do not use an extension in the name of +; the output file. It will be added automatically +output filename := precorrected + +; default value for next is -1, meaning 'all segments' +; maximum absolute segment number to process := + +; use data (1) or set to one (0) := + +; apply (1) or undo (0) correction := + +; parameters specifying correction factors +; if no value is given, the corresponding correction will +; not be performed + +; random coincidences estimate, subtracted before anything else +; is done +; randoms projdata filename := random.hs + +; normalisation (or binwise multiplication) +Bin Normalisation type := from projdata +Bin Normalisation From ProjData := +normalisation projdata filename:= norm.hs +End Bin Normalisation From ProjData:= + +; scatter term to be subtracted AFTER norm(+atten correction) +; WARNING This is not the same as the output of the scatter estimation +; defaults to 0 +;scatter projdata filename := scatter.hs +END:= +\end{verbatim} + + +Time frame definition is only necessary when the normalisation +type uses this time info for dead-time correction (which is not +supported yet in the current (public) version of \textit{STIR}). + + +The following gives a brief explanation of the non-obvious parameters. + +\begin{description} + +\item[use data (1) or set to one (0)] +Use the data in the input file, or substitute data with all 1's. +This is useful to get correction factors only. Its value defaults +to 1. + +\item[apply (1) or undo (0) correction] +Precorrect data, or undo precorrection. Its value defaults to +1. + +\item[Bin Normalisation type] +Normalisation (or binwise multiplication, so can contain attenuation +factors as well). See Section \ref{sec:binnormalisation}. + + +\item[attenuation image filename] \textbf{obsolete} +Specify the attenuation image, which will be forward projected +to get attenuation factors. Has to be in units \textit{cm}$^{\mathit{-1}}$. + + +This parameter will be removed. Use instead a \textit{chained} +bin normalisation (section \ref{sec:chainedbinnormalisation}) +with a bin normalisation +\textit{from attenuation image} (section \ref{sec:binnormalisationfromattenuationimage}). + + +\item[forward\_projector type] \textbf{obsolete} +Forward projector used to estimate attenuation factors, defaults +to Ray Tracing. See Section \ref{sec:forwardprojectors}. + +This parameter will be removed. +\end{description} + +The \textbf{calculate\_attenuation\_coefficients} utility (located in STIR/\textbf{utilities}) +can also convert an attenuation image to attenuation (correction) factors. It is less +flexible than \textbf{correct\_projdata} though. For example, using the \texttt{--ACF} switch, +it will compute the attenuation correction factors (ACFs)\footnote{roughly +\texttt{log(-ray\_tracing(image))}}, which can then be used in other STIR programs. + + +The \textbf{attenuation\_coefficients\_to\_projections} utility +(located in STIR/\textbf{utilities}) is a (simplistic) example to convert +attenuation (correction) coefficients to projections by taking the logarithm. +For real-world use, it is recommended to pre-filter the data first, to reduce noise +and remove negatives. + + +\subsubsection{ +Generating Poisson noise} + +For simulation purposes, it is often useful to be able to generate +multiple noise realisations given the `true' mean projection data. +For PET and SPECT, the appropriate statistics is very closely +Poisson\footnote{{\small For a given scan, the actual distribution of +the detected raw counts is binomial. However, for acquisition +times that are shorter than the half life of the radio-isotope, +the Poisson approximation is very good.}}, +at least for uncorrected counts. \textit{STIR} includes the following +utility to find a noise realisation given the mean projection +data. + + +Usage: +\cmdline{poisson\_noise [-p {\textbar} --preserve-mean] output\_filename +{\textbackslash}\\ +mean\_projdata\_filename scaling\_factor seed-unsigned-int} + + +The \textit{scaling\_factor} is used to multiply the input data before +generating the Poisson random number. This means that a \textit{scaling\_factor} +larger than 1 will result in less noisy data. + + +The seed value for the random number generator has to be strictly +positive. Passing different seeds will result in different noise +realisations.\\ +Without the -p option, the mean of the output data will be equal +to \textit{scaling\_factor*mean\_of\_input}, otherwise it will be equal +to \textit{mean\_of\_input}. + + +The options -p and --preserve-mean are identical. + + +\subsubsection{Motion related utilities} +\label{sec:motionRelatedUtilities} +{ \subsubsubsection{warp\_image} +} +This program warps an image to another position using as input given motion vectors + +{ \subsubsubsection{warp\_and\_accumulate\_gated\_images} +} +\cmdline{warp\_and\_accumulate\_gated\_images \textbackslash \\ +\,\,\,\,output\_filename filename\_prefix motion\_vectors\_prefix} + +\begin{description} +\item[filename prefix] The images that need to be placed in the +same reference position. + +\item[motion vectors prefix] motion vector images +\end{description} + +The +procedure involves a warping operation by the use of linear interpolation (based +on B-Splines). Note that the current release assumes no weighting over the +respiratory positions, but this could be manually included if the images are +scaled according to duration of each position prior to the correction. + + +{ \subsubsubsection{zeropad\_planes} +} +This program zero pads the start and end planes of an image. + +{ \subsubsubsection{shift\_image\_origin} +} +This utility can be used to simply +change the origin in the interfile header of an image. + +{ \subsubsubsection{shift\_image} +} +This utility can be used to +apply translations to an image. The translations are applied with no +interpolation, but the entire image moves for an given integer number of +voxels. + +\subsubsection{ +Using projectors} + +\subsubsubsection{ +Utilities for forward or back-projection} +\textbf{forward\_project} and \textbf{back\_project} will perform a single projection given +input data and a ``template'' for the output. The template is used to know what data sizes and +characteristics to use. Both utilities optionally allow passing a parameter file with settings +which projector to use (see \ref{sec:forwardprojectors} for forward projection +and \ref{sec:backprojectors} for back-projection). +Run these utilities for a usage message. + +\subsubsubsection{Utilities for testing} +The \textbf{fwdtest} and \textbf{bcktest} programs located in \textbf{STIR/recon\_test/} can +be used to examine forward or back projectors. They allow to +project only subregions of the data, but can also do the whole +projection in one go. These programs are really only intended for testing though. +Normally, you would use \textbf{forward\_project} and \textbf{back\_project}. + +The \textbf{fwdtest} and \textbf{bcktest} programs located in \textbf{STIR/recon\_test/} can +be used to examine forward or back projectors. They allow to +project only subregions of the data, but can also do the whole +projection in one go. These programs are really only intended for testing though. +Normally, you would use \textbf{forward\_project} and \textbf{back\_project}. + + +\subsubsection{ +Interfacing with SimSET} +\textit{STIR} contains some routines to make it easier to reconstruct data from SimSET [Lew98], +a popular Monte Carlo simulator for PET and SPECT. This +is all preliminary. Check out the \texttt{README.txt} in the \textbf{STIR/SimSET} directory. + + +\subsection{ +User-selectable components} +\label{sec:user-selectablecomponents} +The software design of \textit{STIR} has a heavy emphasis on object-oriented +programming. For the user, the main benefit of this is that it +is possible to select at \textit{run-time} what particular type of +e.g. forward projector to use. The following is a list of all +available components where this type of run-time selection is +currently available. In the doxygen documentation, look at the +class documentation for \textbf{RegisteredObject}. + + +For each component, there are different types, each with its +own unique name. Each type has its specific set of parameters. + +\textbf{Conventions used in this section}\\ +Each component has its own section, and each type has its subsection. +The name of the subsection is the unique identifier of the type. + + +In a parameter file, the selection of the type would look for +instance as + +\begin{verbatim} +This Program Parameters:= +some parameter:= +filter type := my preferred filter type +my preferred filter type parameters:= ; REQUIRED keyword +par 1:= +... +end my preferred filter type parameters := ; REQUIRED keyword +another program parameter := +;etc +end := +\end{verbatim} + + +Please note that the first and last keywords of a particular +type \textit{have} to be included in the parameter file, even if no +additional parameters are given. + + +\subsubsection{ +Available output file formats} +\label{sec:outputfileformats} + +\textit{STIR} can write images in a number of different formats. Currently, +a single 3D image is written per file, \textit{i.e.} no multi-frame +or gate files yet. The only exceptions to this rule are the \textbf{conv\_to\_ecat6} +and \textbf{conv\_to\_ecat7} utilities.\\ +Currently, the default output file format is Interfile (see below), +although this could be changed (for most \textit{STIR} programs) by +editing the file\\ + \textbf{include/stir/IO/DefaultOutputFileFormat.h}\\ +(not recommended). + +{ \subsubsubsection{Common parameters} +} +\label{ref:outputcommonparameters} +The following parameters are common to all file formats. However, +the implementation for a particular file format could ignore +the value of these parameters if it does not support it. These +parameters follow the Interfile 3.3 syntax, \textit{except} that the +``short float'' and ``long float'' values for ``number format'' +keyword are not supported. Use ``float'' instead. + + +\begin{description} +\item[byte order] \texttt{<}string\texttt{>}\linebreak +\raggedright + values: littleendian {\textbar} bigendian\linebreak + default: native byte order + +\item[number format] \texttt{<}string\texttt{>}\linebreak +\raggedright + values: bit {\textbar} ascii +{\textbar} signed integer {\textbar} + unsigned integer {\textbar} float;\linebreak +default: float +\item[number of bytes per pixel] \texttt{<}integer\texttt{>}\linebreak + default: 4 +\end{description} + + +If ``byte order'' is omitted, the default value corresponds to +the native byte order of the computer the program runs on.\\ +Summarising: if none of these keywords is specified, data are +written as 4-byte floats in the native byte order, unless the +specific file format has another default. + + + +\textbf{Warning:} Note that only essential information is written +in the headers. In particular, frame duration etc are currently \textit{not} +filled in. + +{ \subsubsubsection{Interfile} +} +\label{sec:outputinterfile} +The most comprehensively supported file format in the library +is a newly proposed version of interfile. More details about +this type can be found on the \textit{STIR} website. +Interfile image files are written as a pair of files +\textit{image\_filename.hv, +image\_filename.v}\\ +where \textit{image\_filename.hv} is the header text file and \textit{image\_filename.v} +is the data file. In addition, we currently write a \textit{.ahv} +file which uses Interfile 3.3 conventions, with a tweak for the +\texttt{slice thickness} keyword to work-around an Analyze\texttrademark{} +bug\footnote{See the comments for write\_basic\_interfile\_image\_header() +in \textbf{STIR}/\textbf{IO/interfile.cxx}}. The \textit{.ahv} file is probably +also readable by other programs capable of reading Interfile +3.3. + + +If this output file format is used, and a filename without extension +is specified for output, or when the filename has an extension \textit{.hv}, +the above naming conventions hold. If a filename with another +extension is specified, this name is used for the name of the +binary file. + + +When a file must be specified for reading as a parameter for +a \textit{STIR} utility or reconstruction program, the name of the \textit{.hv} +header file should be given. + + + +\textbf{Warning} The interfile 3.3 standard does not allow to specify +scale factors for the data. Hence, the \textit{.ahv} file has no scale +factors. This means that any program that reads the \textit{.ahv} +file \textbf{will have improperly scaled images}, unless the scale +factor is 1. However, when using float output, \textit{STIR} automatically +writes data with scale factor equal to 1, so as long as your +non-\textit{STIR} program knows about float data, everything will +be all right. The newly proposed Interfile standard does use +a scale factor, and the \textit{.hv} file follows this convention. +However, currently probably only \textit{STIR} programs know about +this convention.\footnote{{\small The utilities distributed by the UCL, +Louvain-la-Neuve, Belgium on \url{ftp://ftp.topo.ucl.ac.be/pub/ecat }{ftp://ftp.topo.ucl.ac.be/pub/ecat} +follow a different convention of reading the scale factor. Currently, \textit{STIR} +writes \textit{.hv} files that can be read correctly by those utilities, +including the \textit{mediman} image viewer and (x)medcon. Note however +that \textit{mediman} cannot read float data.}} + +{ \subsubsubsubsection{Parameters} +} +This file format currently has no extra parameters, except for +the start and stop keywords. + +\begin{verbatim} +Interfile Output File Format Parameters := +; any parameters common to all file formats +End Interfile Output File Format Parameters := +\end{verbatim} + +Currently, data is written always in the native byte order, and +only signed short, unsigned short or float data are supported +(although this could easily be extended to 1 or 4 byte integers +or doubles). + +{ \subsubsubsection{ITK} +} +If this output file format is used, \textit{ITK} IO is used, see also \ref{sec:ITKIO}. +In this case, the actual file format will be determined by the extension of the filename. +Therefore, this can be used to write Nifti (.nii), Teem (.nhdr), +MetaIO (.mhdr), etc. + +A default extension can be set that will be appended if a filename without extension is used. + +\begin{verbatim} +ITK Output File Format Parameters:= + default extension:= .nhdr ; current default value +End ITK Output File Format Parameters:= +\end{verbatim} + +{ \subsubsubsection{ECAT6} +} +If this output file format is used, and a filename without extension +is specified for output, \textit{.img} will be added to the filename. + +{ \subsubsubsubsection{Parameters} +} +This file format currently has only 1 extra parameter, except +for the start and stop keywords. + +\begin{verbatim} +ECAT6 Output File Format Parameters := +; any parameters common to all file formats +default scanner name := +End ECAT6 Output File Format Parameters := +\end{verbatim} + +The scanner name has to be one of the values listed in \textbf{buildblock/Scanner.cxx}, +but generally follows the format \textit{ECAT 953} (this is the default). +Currently, the value of this keyword is \textit{always} used, even +for other images reconstructed from data from other scanners. + +Currently, data is written always in the little-endian byte order, +and only signed short data are supported. + +{ \subsubsubsection{ECAT7} +} +The file format is only available when the ECAT7 support is enabled +during compilation, see section \ref{sec:ECAT67support}.\\ +If this output file format is used, and a filename without extension +is specified for output, \textit{.img} will be added to the filename. + +{ \subsubsubsubsection{Parameters} +} +This file format currently has only 1 extra parameter, except +for the start and stop keywords. + +\begin{verbatim} +ECAT7 Output File Format Parameters := +; any parameters common to all file formats +default scanner name := +End ECAT7 Output File Format Parameters := +\end{verbatim} + +The scanner name has to be one of the values listed in \textbf{buildblock/Scanner.cxx}, +but generally follows the format \textit{ECAT 962} (this is the default). +Currently, the value of this keyword is \textit{always} used, even +for other images reconstructed from data from other scanners. + + +Currently, data is written always in the big-endian byte order, +and only signed short data are supported. + + + +\subsubsection{ +Available filters or data processors} +\label{sec:filters} +Reconstruction algorithms and some utilities use filters, or in +general data processing algorithm. In \textit{STIR} 1.x the data-type was restricted +to images, but now other data-types can in principle be used. Some +of the available data processors can work on any data type, but most +only work on images. + +The type of data processors +available to programs is fully extendable (at compile time). +How to do this is beyond the scope of this document. Here we +only discuss how to specify a particular data processor at run-time, +and list the currently available ones. Samples of their parameters +should be available in \textbf{STIR/samples}. + + +Each data processor has a unique name associated to it (given +as the head of its subsection below). This name has to be used +as value of a filter type keyword (or interactive question). +Depending on the filter type, different parameters have to be +given in the.par file (or will be asked interactively). + + +In addition, it is possible to specify the name \textit{None}. This +is the default for all keywords that ask for the type of +the data processor . + + +See also the online documentation for the class \textbf{DataProcessor}. + +{ \subsubsubsection{Separable Convolution} +} +This implements spatial non-periodic convolution with a 3D separable +filter. The kernel is given in voxel units (\textit{not} in Fourier +space).\\ +This filter applies a 1D convolution in all directions (z,y,x) +with potentially a different filter kernel for every direction.\\ +When parsing, the filter coefficients are read as a list of numbers +for each direction. The following conventions is used:\\ +{\textbullet}\tab +A list of 0 length (which is the default) corresponds to no filtering.\\ +{\textbullet}\tab When the list contains an even number of data, a 0 is +appended (at the end).\\ +{\textbullet}\tab +After this, the central element of the list corresponds to the +0-th element in the kernel, see below. + + +Convolution is non-periodic. In each direction, the following +is applied: +\[ +\mathrm{out}_i = \sum_{j} \mathrm{kernelforthisdirection}_{j} \mathrm{in}_{i-j} +\] + +Note that for most kernels, the above convention means that the +zero-index of the kernel corresponds to the peak in the kernel. + + + +Elements of the input array that are outside its index range +are considered to be 0. + + +\textbf{Warning} There is NO check if the kernel coefficients add +up to 1. This is because not all filters need this (e.g. edge +enhancing filters). + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Separable Convolution Filter Parameters:= +x-dir filter coefficients:= list_of_numbers +y-dir filter coefficients:= list_of_numbers +z-dir filter coefficients:= list_of_numbers +END Separable Convolution Filter Parameters:= +\end{verbatim} + +{ \subsubsubsubsection{Example input for a low-pass filter in x,y, no filtering +in z} +} +\begin{verbatim} +Separable Convolution Parameters := +x-dir filter coefficients := {0.25,.5,.25} +y-dir filter coefficients := {0.25,.5,.25} +;z-dir filter coefficients := +END Separable Convolution Parameters := +\end{verbatim} + +{ \subsubsubsection{Separable Cartesian Metz} +} +This is a separable 3D Metz filter for images discretised on +a Cartesian voxel grid. These filters are composed of 3 1D filter +kernels, one for the x,y and z directions each. Each 1D filter +is specified by a Full Width at Half Maximum (FWHM) parameter +(in millimetres), Metz power parameter and maximum spatial kernel +width. + + + +With each triple of parameters, one can associate a 1D continuous +Metz filter kernel whose frequency response \textit{M(f)} is given +by the formula + +\[ +M(f)= +{1-(1-G(f)^2)^{N+1} +\over +G(f) +} +\] + +Where \textit{G(f)} is the frequency response (\textit{G(0)} =1) of a zero-mean +Gaussian distribution function with the associated FWHM and \textit{N} +is the associated Metz power parameter. Note that in the special +case \textit{N}=0, the filter reduces to the Gaussian filter \textit{G(f)}. +If a strictly positive Metz power parameter is chosen, a non-trivial +Metz filter results whose frequency response possesses an amplifying +middle frequency band (see also [Jac00]). + + + +The filtering routines apply the filter by computing discretised +versions of the 1D continuous filter kernels in the space domain +and convolving with the image in the appropriate direction. The +following rules apply to the construction and application of +filters: + + + +(i) The value 0.0 mm is permissible for the filter FWHM parameter. +Selecting a FWHM of 0.0 mm produces trivial filter kernels, i.e. +impulse functions, enabling one to disable the filter in any +direction. + + + +(ii) In accordance with sampling theory, the routine that constructs +the 1D filter kernels bandlimits the continuous filter to the +hypothesized Nyquist frequency of the image (i.e. 1/(2*voxel\_size) +of the image in the associated direction). Note that this is +equivalent to convolving with a sinc function in the space domain +and may yield negative kernel values where unexpected (e.g. in +a Gaussian filter kernel). In general, when reasonably large +FWHMs are selected (a few multiples of the voxel dimension), +the bandlimiting has no effect on the filter construction. + + + +(iii) The spatial kernel width can be limited, which will set +any other values to 0. If this is not done, the kernel width +is determined by the first value which is smaller in absolute +value than 10{\textasciicircum}-6 times the central kernel value. + + + +(iv) Filter kernels computed by the software may contain non-positive +values. This is partly because, in general, a 1D continuous Metz +filter response function may contain non-positive value and so +also will its samples. In addition, non-positive kernel values +may arise due to the bandlimiting operations described in (ii). + + + +Consequently, filtered positive images may likewise contain non-positive +values. + +{ \subsubsubsubsection{Parameters} +} +Sample parameters are given below +\begin{verbatim} +separable cartesian metz filter parameters := +x-dir filter fwhm (in mm) := 6 +y-dir filter fwhm (in mm) := 6 +z-dir filter fwhm (in mm) := 6 +x-dir filter metz power := 2 +y-dir filter metz power := 2 +z-dir filter metz power := 2 +x-dir maximum kernel size := 129 +y-dir maximum kernel size := 129 +z-dir maximum kernel size := 31 +end separable cartesian metz filter parameters := +\end{verbatim} + + +An explanation of these parameters is given here for the x-direction +(others are obvious extensions) +\begin{description} +\item[x-dir filter FWHM (in mm)] +The Full Width at Half Maximum of the Gaussian filter kernel +from which the \textit{x} direction Metz filter kernel are derived. + +\item[x-dir filter Metz power] +The exponent parameter for the \textit{x} direction Metz filter kernel. + +\item[x-dir maximum kernel size] +The maximum width of the kernel (in pixels). Prior to version +0.93 of the PARAPET library this was fixed to the number of pixels +in the input image (in that direction). +\end{description} + +{ \subsubsubsection{Median} +} +\label{sec:median} +This applies a straightforward 3D (or 2D) median filter on the +image. + +{ \subsubsubsubsection{Parameters} +} +Sample parameters are given below +\begin{verbatim} +Median Filter Parameters := +mask radius x := 1 +mask radius y := 1 +mask radius z := 1 +End Median Filter Parameters:= +\end{verbatim} + + +A radius of 0 means no filtering in that direction, a radius +of 1 means the median will be computed over a mask of 3 pixels, +and so on. + + +{ \subsubsubsection{Truncate To Cylindrical FOV} +} +This image processor will set all voxels to 0 outside a certain radius. +TODO this needs updating. +{ \subsubsubsubsection{Parameters} +} +Sample parameters are given below +\begin{verbatim} +Truncate To Cylindrical FOV Parameters:= +; default use x^2 + y^2 < R^2 +; if set to 0, will use <= +strictly_less_than_radius:=1 +End Truncate To Cylindrical FOV Parameters:= +\end{verbatim} + +{ \subsubsubsection{Threshold Min To Small Positive Value} +} +This is a generic data processor that will work on any type of data. + +Since strict positivity is a preferred property of images in +many circumstances, a post-thresholding of the filtered data +is sometimes applied to truncate non-positive values. The thresholding +rule currently used is:\\ +(1)\tab +If the entire filtered data is non-positive, the data is uniformly +set to a hard-coded strictly positive parameter SMALL\_NUM\texttt{<}\texttt{<}1.\\ +(2)\tab +Otherwise, all non-positive entries in the data are set to SMALL\_NUM +times the minimum strictly positive value. + + +{ \subsubsubsection{Chained Data Processor} +} +This is a generic data processor that will work on any type of data. + +This data processor allows subsequent application of 2 other +data processors on the image. It can for example be used to +first Metz filter an image and then threshold it. + +{ \subsubsubsubsection{Parameters} +} +Example parameters are given by +\begin{verbatim} +Chained Data Processor Parameters := +Data Processor to apply first := None +Data Processor to apply second := None +END Chained Data Processor Parameters := +\end{verbatim} + +Obviously, in normal practice the Data Processor keywords will +have values given by any of the listed data processors in this +section (including Chained Data Processor again). + + + +\subsubsection{ +Incorporating prior information} +\label{sec:priors} +Some iterative reconstruction algorithms allow the incorporation +of \textit{a priori} information, for instance the One Step Late algorithm +(implemented as OSMAPOSL). At the moment, 'generalised' priors +are used, where we mean that we need to know only the gradient +of the actual (log of the) prior function.\\ +Which priors are available to programs is fully extendable (at +compile time). How to do this is beyond the scope of this document. +Here we only discuss how to specify a particular prior, and list +the currently available ones. Samples of their parameters should +be available in \textbf{STIR/samples}. + + + +Each prior has a unique name associated to it (given as the head +of its subsection below). This name has to be used as value of +a prior type keyword (or interactive question). Depending on +the prior type, different parameters have to be given in the.par +file (or will be asked interactively). + + +In addition, it is possible to specify the name \textit{None}. This +is the default for all prior keywords. + + +See also the online documentation for the class \textbf{GeneralisedPrior}. + + +{ \subsubsubsubsection{Parameters} +} +These are the keywords that can be used for all priors. + \begin{verbatim} + penalisation factor := + \end{verbatim} + \noindent where the \texttt{penalisation factor} is usually called + $\beta$ in the literature, and is just a global scale factor for the + prior. + +{ \subsubsubsection{FilterRootPrior} +} +This prior is an extension of the idea first developed for the +Median Root Prior [Ale97]. The prior takes any Data Processor +(i.e. a filter), and computes the prior 'gradient' as +\[ +G_{v\,} =\lambda _{v} /F_{v} -1 +\] +\noindent where +$\lambda _{v} $ + is the image where to compute the gradient, and +$F_{v} $ is the image obtained by filtering $\lambda $. + +Note that for nearly all filters, this is not really a prior, as +this 'gradient' is \textit{not} the gradient of a function. This can +be checked by computing the 'Hessian' (i.e. the partial derivatives +of the components of the gradient). For most (interesting) filters, +the Hessian will not be symmetric. + + +The Median Root Prior is obtained by using Median (see \ref{sec:median}) +as Data Processor. + +{ \subsubsubsubsection{Parameters} +} +These are the keywords that can be used in addition to the ones listed in \ref{sec:priors}.. + \begin{verbatim} + FilterRootPrior Parameters := + penalisation factor := 1 + ; you can use any data processor here + ; the next parameters specify a 3x3x3 median + Filter type := Median + Median Filter Parameters := + mask radius x := 1 + mask radius y := 1 + mask radius z := 1 + End Median Filter Parameters:= + + END FilterRootPrior Parameters := + \end{verbatim} + +{ \subsubsubsection{Quadratic} +} +This implements a quadratic Gibbs prior. The gradient of the prior is computed as follows: + \[ + g_r = \sum_dr w_{dr} (\lambda_r - \lambda_{r+dr}) * \kappa_r * \kappa_{r+dr} + \] + \noindent where $\lambda$ is the image where the gradient is computed + and $r$ and $dr$ are indices and the sum + is over the neighbourhood where the weights $w_{dr}$ are non-zero. + + The $\kappa$ image can be used to have spatially-varying penalties such as in + Jeff Fessler's papers. It should have identical dimensions to the image for which the + penalty is computed. If $\kappa$ is not set, this class will effectively + use 1 for all $\kappa$'s. + + By default, a 3x3 or 3x3x3 neigbourhood is used where the weights are set to + x-voxel\_size divided by the Euclidean distance between the points. + +{ \subsubsubsubsection{Parameters} +} + These are the keywords that can be used in addition to the ones listed in \ref{sec:priors}.. + \begin{verbatim} + Quadratic Prior Parameters:= + ; next defaults to 0, set to 1 for 2D inverse Euclidean weights, 0 for 3D + only 2D:= 0 + ; next can be used to set weights explicitly. Needs to be a 3D array (of floats). + ' value of only_2D is ignored + ; following example uses 2D 'nearest neighbour' penalty + ; weights:={{{0,1,0},{1,0,1},{0,1,0}}} + ; use next parameter to specify an image with penalisation factors (a la Fessler) + ; see class documentation for more info + ; kappa filename:= + ; use next parameter to get gradient images at every subiteration + ; see class documentation + gradient filename prefix:= + END Quadratic Prior Parameters:= + \end{verbatim} + +\subsubsection{ +Selecting different projector pairs} +\label{sec:projectorpairs} +Many algorithms use both a forward and a back projector. The +first step to select which one will be used is to say what kind +of projector pair you want to use, of which there are only 2 +candidates as given below. + + +Each projector pair has a unique name associated to it (given +as the head of its subsection below). This name has to be used +as value of a 'projector pair type' keyword (or interactive question). +Depending on the projector pair type, different parameters have +to be given in the.par file (or will be asked interactively). + + +Samples of OSMAPOSL reconstruction parameter files selecting +different types of projectors should be available in \textbf{STIR/samples}. + +\textbf{Warning: for most iterative algorithms, it is recommended +to use matching forward and back-projector. This is unfortunately +not the default due to historical reasons. It is recommended to replace +the default by using a projection matrix as detailed below.} + +{ \subsubsubsection{Matrix} +} +\label{sec:projectorpairusingmatrix} +Both projectors are based on a single projection matrix, as given +in Section \ref{sec:projmatrix}. + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Projector Pair Using Matrix Parameters:= +Matrix type := some value +; parameters relevant to this type of matrix +End Projector Pair Using Matrix Parameters:= +\end{verbatim} + +See Section \ref{sec:projmatrix} for possible values for the 'matrix type' keyword. + +{ \subsubsubsection{Separate Projectors } +} +Forward and back projectors are completely independent of each +other. In some programs this is necessary to handle images or +projection data of different sizes. \\ +Even if the projectors are used that both use the same type of +projection matrix, that matrix will not share the same cache +or memory. + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Projector Pair Using Separate Projectors Parameters:= +Forward projector type:= some value +Back projector type:= some value +End Projector Pair Using Separate Projectors Parameters:= +\end{verbatim} + +See Section \ref{sec:forwardprojectors} for possible values for the 'forward projector +type' keyword and Section \ref{sec:backprojectors} for the 'back projector type' +keyword. + + +\subsubsection{ +Selecting a forward projector} +\label{sec:forwardprojectors} +It is possible to select the forward projector used at run-time, +and extend the available ones at compile time. The mechanism +is exactly the same as for the ImageProcessor hierarchy. + + +Each projector has a unique name associated to it (given as the +head of its subsection below). This name has to be used as value +of a 'forward projector type' keyword (or interactive question). +Depending on the projector type, different parameters have to +be given in the.par file (or will be asked interactively). + +{ \subsubsubsection{Matrix} +} +This forward projector uses a projection matrix to compute its +result. + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Forward Projector Using Matrix Parameters:= +Matrix type := some value +End Forward Projector Pair Using Matrix Parameters:= +\end{verbatim} + +See Section \ref{sec:projmatrix} for possible values for the 'matrix type' keyword. + +{ \subsubsubsection{Ray Tracing} +} +This forward projector uses an optimisation of Siddon's algorithm +to compute its result. That is, it uses Length of Intersection. +As it avoids storing the matrix elements, it is currently faster +than using a forward projector using a ray tracing matrix (see +Section \ref{sec:projmatrixusingraytracing}). The result is identical though (up to rounding +errors and possibly the voxels at the edge of the FOV). + + +See also online documentation for class ForwardProjectorUsingRayTracing. + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Forward Projector Using Ray Tracing Parameters:= +End Forward Projector Using Ray Tracing Parameters:= +\end{verbatim} + +This projector currently has no user-selectable parameters. Nevertheless, +the 2 keywords given above have to follow the 'forward projector +type' keyword in a parameter file. + + +\subsubsection{ +Selecting a back projector} +\label{sec:backprojectors} +It is possible to select the type of back projector. The mechanism +is exactly the same as for the ForwardProjector hierarchy. + +{ \subsubsubsection{Matrix} +} +This back projector uses a projection matrix to compute its result. + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Back Projector Using Matrix Parameters:= +Matrix type := some value +Back Forward Projector Pair Using Matrix Parameters:= +\end{verbatim} + +See Section \ref{sec:projmatrix} for possible values for the 'matrix type' keyword. + +{ \subsubsubsection{Interpolation} +} +\label{sec:IncrementalInterpolationBackProjector} +This back projector uses incremental (piecewise)-linear interpolation +to compute its result. See [Egg98] for details. It can \textit{only} handle arc-corrected data. + + +\textbf{Warning:} The current implementation has problems (noticeable +sometimes at 45 and 135 degrees but mostly at the centre of the image) on Sun +Sparc, HP and 64-bit AMD and Intel processors (for certain optimisation settings +of the C++ compiler). + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Back Projector Using Interpolation Parameters:= +Use piecewise linear interpolation := 1 +Use exact Jacobian := 1 +End Back Projector Using Interpolation Parameters:= +\end{verbatim} + +The 'piecewise linear' keyword allows the user to choose between +ordinary linear interpolation or piecewise linear interpolation +[Thi99] in axial direction. The latter approximates Volume of +Intersection for axially uncompressed data. The piecewise linear +interpolation is only used when the axial voxel size is half +the axial\_sampling of the projection data (for the segment in +question), otherwise linear interpolation is used anyway. + + +The 'exact Jacobian' keyword selects if the exact or an approximate +version of the Jacobian is used. The approximation consists in +taking the value for the central tangential position and is often +used in analytic algorithms in the literature. + + +Even when all default values are used, the start and end keywords +given above have to follow the 'back projector type' keyword +in a parameter file. + + +See also online documentation for class BackProjectorByBinUsingInterpolation. + + + +\subsubsection{ +Selecting a projection matrix} +\label{sec:projmatrix} +It is possible to select these independently at run-time, and +extend the available ones at compile time. The mechanism is exactly +the same as for the ForwardProjector hierarchy. + +\textbf{Warning}: Currently, most projection matrices are implemented for PET. Using them for +SPECT data could lead to surprising results. + +{ \subsubsubsection{Common parameters to all projection matrices} +} +\label{sec:projmatrixcommon} +The following parameters can be used for all types of projection +matrices. There default values are indicated below. + +\begin{verbatim} +disable caching:= 0 +store only basic bins in cache:=1 +\end{verbatim} + +Here is an explanation of these parameters. + +\begin{description} +\item[disable caching] [0,1,0{]} +Normally the elements of the matrix are stored in memory (or +at least parts of it, see next keyword) after the first use. +This can be disabled, but this should normally only be done if +not enough RAM memory is available such that heavy swapping occurs. +The current procedure is an all-or-nothing cache. In the future, +it might become possible that an upper memory limit can be given. + + +\item[store only basic bins in cache] [0,1,1{]} +Most projectors use symmetries to reduce the number of elements +that need to be computed. For example, if the ring spacing of +the scanner is an integer multiple of the voxel size in z-direction, +it is only necessary to compute the matrix elements only for +1 ring(pair). When caching is enabled, by default only the independent +elements are cached. If you have plenty of RAM memory, you can +store all (non-zero) elements. If your system does not start +swapping, this will speed-up the computation. +\end{description} + +{ \subsubsubsection{Ray Tracing} +} +\label{sec:projmatrixusingraytracing} +This projection matrix uses an optimisation of Siddon's algorithm +to compute its result. That is, it uses Length of Intersection.\\ +Currently, the LOIs are divided by voxel\_size.x(), unless NEWSCALE +is \#defined during compilation time of ProjMatrixByBinUsingRayTracing.cxx. + +It is possible to use multiple LORs in tangential direction. +The result will then be the average of the various contributions. +Currently all these LORs are parallel. For a very high number +of LORs, the result approximates a strip integral (in tangential +direction). + +If the z voxel size is exactly twice the sampling in axial direction, +2 or 3 LORs are used, to avoid missing voxels. + +It is possible to use a cylindrical or cuboid FOV (in the latter +case it is going to be square in transaxial direction). In both +cases, the FOV is slightly 'inside' the image (i.e. it is about +1 voxel at each side smaller than the maximum possible). + +It is possible to reduce the number of symmetries used by this +matrix. This might be useful if you have plenty of RAM and want +to speed up the calculations. See also the discussion on caching +in section \ref{sec:projmatrixcommon}. + +\textbf{Warning} Care should be taken to select the number of rays +in tangential direction such that the sampling is not greater +than the x,y voxel sizes. + +\textbf{Warning} The current implementation assumes that z voxel size +is either smaller than or exactly twice the sampling in axial +direction of the segments. + +{ \subsubsubsubsection{Parameters} +} +The following parameters can be set (default values are indicated): +\begin{verbatim} +Ray Tracing Matrix Parameters := +; any parameters appropriate for all matrices +restrict to cylindrical FOV := 1 + +number of rays in tangential direction to trace for each bin := 1 + +do symmetry 90degrees min phi := 1 +do symmetry 180degrees min phi := 1 +End Ray Tracing Matrix Parameters := +\end{verbatim} + +\textbf{It is recommended to use a number of rays that is larger than 1 (e.g. 10) to +avoid some discretisation artefacts in the final image.} + +For the azimuthal angle $\phi$, the following angles are symmetry +related for a square grid: \\ +$\{\phi, 180^{o}-\phi, 90^{o}-\phi, 90^{o}+\phi\}$.\\ +Two boolean parameters allow to select which angles should be +considered as related: +\begin{description} +\item[all 4] + (do\_symmetry\_90degrees\_min\_phi=true, \\ +do\_symmetry\_180degrees\_min\_phi = true) +\item[only $\{ \phi, 180- \phi \}$] +(do\_symmetry\_90degrees\_min\_phi=false, \\ +do\_symmetry\_180degrees\_min\_phi = true) +\item[none] +(do\_symmetry\_90degrees\_min\_phi=false, \\ +do\_symmetry\_180degrees\_min\_phi = false) +\end{description} + +Note that when \texttt{do\_symmetry\_90degrees\_min\_phi=true}, +it is irrelevant what the value is +of \texttt{do\_symmetry\_180degrees\_min\_phi}. This is because +otherwise a non-consecutive range in $\phi$ would have to be used. + + +The symmetry in $\phi$ is automatically reduced for non-square grids +or when the number of views is not a multiple of 4. + + + +In addition, there is a keyword \texttt{use actual detector boundaries}. +However, changing its default value is currently not recommended. + + + + +Note that even when all default values are used, the start and +stop keywords given above have to follow the 'matrix type' keyword +in a parameter file. + + +See also online documentation for class ProjMatrixByBinUsingRayTracing. + + +{ \subsubsubsection{Interpolation} +} +\label{sec:projmatrixusinginterpolation} +This projection matrix uses interpolation in projection space as model. +When using this matrix for back-projection, the centre of a voxel is projected +into a ``viewgram'' (\textit{i.e.} roughly a projection plane but taking scanner +geometry into account), and its contribution is computed by linearly interpolating +between the surrounding values in the viewgram. + +It is intended to give +essentially the same results as the incremental-interpolation backprojector +\ref{sec:IncrementalInterpolationBackProjector}. +This matrix version allows using the same model for forward projection. + +\textbf{Note} The implementation does not use the incremental computations of +\ref{sec:IncrementalInterpolationBackProjector} and is therefore not affected +by rounding error. + +\textbf{Warning} The current implementation is quite slow in constructing the matrix. +If you need to use this multiple times, it might be worth writing it to disk and +then reading it (see \ref{sec:projmatrixfromfile}). + +{ \subsubsubsubsection{Parameters} +} +The following parameters can be set (default values are indicated): +\begin{verbatim} +Interpolation Matrix Parameters:= + ; any parameters appropriate for all matrices + + use_piecewise_linear_interpolation:=1 + use_exact_Jacobian:=1 + + do_symmetry_90degrees_min_phi:=1 + do_symmetry_180degrees_min_phi:=1 + do_symmetry_swap_segment:=1 + do_symmetry_swap_s:=1 + do_symmetry_shift_z:=1 +End Interpolation Matrix Parameters:= +\end{verbatim} + +See \ref{sec:IncrementalInterpolationBackProjector} for an explanation +of the first two parameters. + +{ \subsubsubsection{SPECT UB} +} +\label{sec:projmatrixSPECTUB} +This is a flexible implementation specific to SPECT data. See [Fus13] and [Fus14] for some information. +A sample is given below + +\begin{verbatim} +Projection Matrix By Bin SPECT UB Parameters:= + + ;PSF type of correction { 2D // 3D // Geometrical } + psf type:= 2D + ; next 2 parameters define the PSF. + ; They are ignored if psf_type is "Geometrical" + ; the PSF is modelled as a Gaussian with sigma dependent on the + ; distance from the collimator + ; sigma_at_depth = collimator_slope * depth_in_cm + collimator_sigma_0 + collimator slope := 0.0163 + collimator sigma 0(cm) := 0.1466 + + ;Attenuation correction { Simple // Full // No } + attenuation type := Simple + ;Values in attenuation map in cm-1 + attenuation map := attMapRec.hv + + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := Explicit Mask + mask file := mask.hv + + ; if next variable is set to 0, only a single view is kept in memory + keep all views in cache:=1 + +End Projection Matrix By Bin SPECT UB Parameters:= +\end{verbatim} + +The weight matrix or system matrix in tomographic reconstruction in SPECT is the matrix that stores the +percentual contribution of each voxel of the object into each bin in the projections. In the MLE +framework, weight ij can be though as the probability of one photon being emitted in the voxel i reached +the bin j. Each weight can be factorized in three components: geometry (PSF), attenuation and scattering. +This software can calculate the geometrical and the attenuation component. The correction for scattering +should be done using alternative strategies. The geometrical part is calculated as the integral of the +PSF (area 1) within the bin. The geometrical part is multiplied by the attenuation factor calculated +using a modified version of the Siddon algorithm. + +{ \subsubsubsubsection{Parameters} +} +\begin{description} +\item[maximum number of sigmas] [0,$\infty$,2{]} + + This is the number of sigmas to consider in PSF correction (float, typically 1.5 to 2.5). PSF are + modelled by Gaussian functions whose extension is infinite. To increase unnecessarily the number of + sigmas would produce an increase of the weight matrix size that would not result in a better correction + for PSF. It does not make sense to take into account very small contributions. A balance between the + precision of the correction for PSF and the size of the matrix and the time of the reconstruction + process should be done. + +%\item[spatial resolution PSF:= 0.00001] +% +% This is the spatial resolution in which to sample PSF distributions. PSF is modelled as a Gaussian or as a trapezoid (linear projection of a square) in case of no correction for PSF. The calculus of the area within the bin is calculated by means of the Gaussian distribution function (cumulative sum). The parameter indicates the discretization interval for such functions (float, cm, typically 0.001-0.02, depending on the voxel size) + +\item[psf type] + + The possible values are \{ 2D, 3D, Geometrical (default) \} to indicate, respectively, a planar + reconstruction (no information mixed between planes, planes reconstructed sequentially, 1d -PSF), + volumetric (mixed information between planes, volume reconstructed at once, 2d-PSF), or no correction + for PSF (in this case PSF is the trapezoid obtained by the projection of the square voxel). + +\item[collimator slope, collimator slope sigma 0 (cm)] (default 0) + + These two 2 parameters define the PSF. + They are ignored if \textit{psf type} is \textit{Geometrical}. These values are mostly dependent on + your collimator. The PSF is modelled as a Gaussian with sigma dependent on the distance from the + collimator +\begin{equation} + \sigma(d) = \mathrm{slope} * d + \mathrm{\sigma_0} +\end{equation} \noindent + with $d$ the distance (in cm) of the voxel to the collimator radius. + + In the range of usual distances between the object and the detector, the dependence of the sigma with the + distance keeps perfectly linear for parallel collimators. You can adjust this dependence experimentally + or use analytical methods to determine it. + +\item[attenuation type] + + The possible values are \{ Simple, Full, No (default) \}. Attenuation is calculated as the negative + exponential of the sum of the length of the projection ray in each crossed voxel by its attenuation + coefficient. It requires an attenuation map (see next keyword). The simple option for correction for + attenuation is to consider that the whole PSF suffers the same attenuation (the attenuation of the + central ray). One single factor is applied to weight the contribution from one voxel to all the bins in + a detection plane. It is a very good approximation for uniform attenuation maps. The full option means + that a different attenuation coefficient is calculated for each voxel-bin contribution (that is obtained + along the voxel-bin pathway). It could be useful for very inhomogeneous attenuation maps. + + See [Fus14] for an evaluation and more explanation. + +\item[attenuation map] + + A filename giving the attenuation map as the attenuation coefficient at each voxel (in + $\mathrm{cm}^{-1}$). Currently, this file has the same geometric characteristics as the image to be + reconstructed (number of columns, row, slices and voxel dimensions, orientation). + +\item[mask type] + + This is a parameter to indicate if any mask should be applied to the volume, to reduce the matrix size + by removing weights from voxels that, according the prevoius information, do no contribute to the + projections. Possible values are: + \begin{description} + \item[Cylinder] the cylinder inscribed into the volume is used as a mask. The radius of the cylinder is + the maximum volume dimension (x-y), + \item[Attenuation Map] the attenuation map is used as a mask. No weight is calculated where the + attenuation map is zero ( assiming no attenuation=no activity). NaNs values are set to zero. + \item[Explicit Mask] the mask is defined in a file. The mask should have the same geometrical + prescription than the image. It could be useful for instance to remove the weight of voxels from the + table (no activity but attenuation) or to reduce the matrix size when no attenuation for correction is + considered. + \item[No] (default). No attenuation correction. + \end{description} + +\item[mask file] + + A filename with the mask (if the mask type is set to \textit{Explicit Mask}). Any voxels which are + (exactly) zero in the mask will be ignored. + Currently, this file has the same geometric characteristics as the image to be + reconstructed (number of columns, row, slices and voxel dimensions, orientation). + +\item[keep all views in cache] [0,1,0{]} + + If this variable is set to 0 (default), only a single view is kept in memory. This avoids running + out-of-memory but means that the matrix has to be recomputed at every iteration. + +\end{description} + +{ \subsubsubsection{From File} } +\label{sec:projmatrixfromfile} +You can use \texttt{write\_proj\_matrix\_by\_bin} to write a projection matrix to file. You can +then read the matrix back into memory. This +could be useful if it takes a long time to generate the matrix, or if you have an external program +to write the matrix (see below for more information on what you will need to do). + + +{ \subsubsubsubsection{Parameters} +} +The necessary parameters to include in the par file are: +\begin{verbatim} +ProjMatrixByBinFromFile Parameters:= + Version := 1.0 + symmetries type := PET_CartesianGrid + PET_CartesianGrid symmetries parameters:= + do_symmetry_90degrees_min_phi:= + do_symmetry_180degrees_min_phi:= + do_symmetry_swap_segment:= + do_symmetry_swap_s:= + do_symmetry_shift_z:= + End PET_CartesianGrid symmetries parameters:= + ; example projection data of the same dimensions as used + ; when constructing the matrix + template proj data filename:= + ; example image of the same dimensions as used + ; when constructing the matrix + template density filename:= + ; binary data with projection matrix elements + data_filename:= +End ProjMatrixByBinFromFile Parameters:= +\end{verbatim} +The symmetries all default to true, but it is best to include the values in the file in all cases. + +You need to be careful that these parameters match the matrix written to file. To make this easier, +\texttt{write\_proj\_matrix\_by\_bin} will write these to file for you. In the current version +of STIR, you will need to copy these into the .par file (this will change in a future version of STIR). + +Note that image and projection data characteristics are read from the \texttt{template} files. Their geometric +characteristics have to match those of the data that you want to process with the stored matrix +(the stored matrix could have more segments or tangential positions than the data). This will be +checked at run-time. + +{ \subsubsubsubsection{Information on how to write your own projection matrix to file} +} +The projection matrix is stored as a sparse matrix (in the file dennoted by the \texttt{data\_filename} +parameter). The format is reasonably simple. For each element (``bin'') in the projection data, the +Line of Response (LOR) is encoded as follows: +\begin{verbatim} + segment_num (int32_t) + view_num (int32_t) + axial_pos_num (int32_t) + tangential_pos_num (int32_t) + num_voxels_in_LOR (uint32_t) + for_each voxel + z (int16_t) + y (int16_t) + x (int16_t) + matrix_value (float) + end +\end{verbatim} +The order of bins is not important, neither is the order of the voxels (although you will get better +performance if these are stored such that voxels are listed consecutively). + +To reduce data size, symmetries can be used to store only ``basic'' Lines Of Responses (LORs). +The exact definition of the symmetries is unfortunately +not easy and not documented fully here. If you want to use your own code to write the matrix and want to use +symmetries you will need to check the \texttt{DataSymmetriesForBins} class or a derived class. In case all +symmetries are enabled, the following should hold: +\begin{verbatim} +0<=segment_num +0<=view_num<=num_views/4 +axial_pos_num==0 +0<=tangential_pos_num +\end{verbatim} +Check the STIR developer's guide and the Wiki for information on coordinate systems used by STIR. In particular, +note the STIR convention about index numbering in section 2.2 of the developer's guide. + +A final note: currently the sparse matrix is read completely into memory before it is used (but of course +keeping only the ``basic'' part of the matrix taking the symmetries into account). This restricts the size +of the matrix according to how much memory your system has available. + +\subsubsection{ +Selecting a bin normalisation procedure} +\label{sec:binnormalisation} +In PET, a procedure called 'normalisation' is used which is essentially +a calibration procedure for every detector pair. It provides +a multiplicative factor for every bin, or element of the projection +data.\\ +The library can provide different types of normalisation procedures. +It is possible to select these independently at run-time, and +extend the available ones at compile time. The mechanism is exactly +the same as for the ForwardProjector hierarchy. + + +In addition to the types listed below, you can also enter 'None', +which means that the data won't normalised at all. + +{ \subsubsubsection{From Projdata} +} +This can be used when the normalisation factors are stored simply +as projection data. Currently, these data have to have exactly +the same characteristics (size etc.) as the projection data which +are going to be normalised. Note that the stored factors have +to be the ones you'd apply to normalise the data (and not their +reciprocal). + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Bin Normalisation From ProjData := +normalisation projdata filename:= norm.hs +End Bin Normalisation From ProjData:= +\end{verbatim} + +See also online documentation for class BinNormalisationFromProjData. + +{ \subsubsubsection{From ECAT7} +} +This can be used when normalising ECAT7 data. CTI/Siemens stores +the normalisation data in a files normally ending on +\texttt{.n} or \texttt{.N}. Dead-time correction is also +supported, although awkwardly. To get dead-time correction +to work, you need to specify the singles rates for the +scan\footnote{In future, hopefully this will not be necessary. +This work-around is needed because \textit{STIR} currently does not +directly read any of the meta-data in the headers of sinograms etc.} +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Bin Normalisation From ECAT7:= + normalisation filename:= STUDY.n + singles rates := Singles From ECAT7 File + Singles Rates From ECAT7 File:= + ECAT7_filename := ecat7_sinogram.S + End Singles Rates From ECAT7:= +End Bin Normalisation From ECAT7:= +\end{verbatim} + +In addition, you currently have to set the time frame information in the .par file. + +See also online documentation for class BinNormalisationFromECAT7. + +{ \subsubsubsection{From Attenuation Image} +} +\label{sec:binnormalisationfromattenuationimage} +This can be used for attenuation correction factors (ACFs) if +you do not have the ACFs but an attenuation image (or mu-map). +The ACFs are found by forward projecting the attenuation image, +multiplying the result with -1, and exponentiating, i.e. using +Beer's law. + + + +\textbf{Warning} Attenuation image data are supposed to be in units \textit{cm}$^{-1}$. +(Reference: water has $\mu=.096 \mathit{cm}^{-1}$.) + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Bin Normalisation From Attenuation Image:= +attenuation_image_filename := +forward projector type := +End Bin Normalisation From Attenuation Image := +\end{verbatim} + + +Default forward projector is ForwardProjectorByBinUsingRayTracing +(see section \ref{sec:forwardprojectors}). + + +See also online documentation for class BinNormalisationFromAttenuationImage. + +{ \subsubsubsection{Chained } +} +\label{sec:chainedbinnormalisation} +This can be used to apply two normalisation one after the other. +For example, a first one could be the 'usual' normalisation factor, +while a second one could be the attenuation factors. + +{ \subsubsubsubsection{Parameters} +} +\begin{verbatim} +Chained Bin Normalisation Parameters:= +Bin Normalisation to apply first:= some_bin_normalisation_type +; parameters for this type + +Bin Normalisation to apply second:= some_bin_normalisation_type +; parameters for this type + +END Chained Bin Normalisation Parameters:= +\end{verbatim} + +See also online documentation for class ChainedBinNormalisation. + + + +\subsection{ +Display} + +Some of the programs (e.g. in utilities/, recon\_tests/) use +the display routines. Which version is actually used depends +on the compilation settings (in particular the \textit{GRAPHICS} cmake +variable), see section \ref{sec:UsingCMake}. + + +\subsubsection{ +X Windows display} +\label{sec:display} +This provides a (very basic) way of displaying bitmaps when using +X windows. This works by creating a new window where some of +the bitmaps are displayed. To proceed, you have to make this +window the 'focus' (how to do this depends on your window manager +but usually you have to move the cursor over it, or click the +title bar) and then press any key. In your original terminal +window you will then be asked if you want to continue with the +next set of bitmaps until no more are left. + + +In addition, when your X server supports the Pseudocolor visual, +you can cycle between 4 different colour scales by pressing Mouse +button 2 while the 'bitmap' window is selected. + + +\textbf{Warning} In the current implementation, it seems to happen +occasionally that not all colours in the colour scale have been +allocated properly. This can be seen by looking at the side bar +displaying the colour scale. Unfortunately, this effect might +give you wrongly coloured regions (usually spots) in the image. + + +\subsubsection{ +PGM display} + +This 'display' mode actually writes out a file in the Portable +Greyscale Map format, which can be read by various graphics programs +(like Paint Shop Pro or xv). + + +\subsubsection{ +MathLink display} + +This mode is (somewhat) useful if you have \textit{Mathematica\texttrademark}, +and want to pipe the data into \textit{Mathematica}. (It is probably +easier to read the binary data from file though using the \textit{Mathematica} command \texttt{BinaryRead}). +Sample \textit{Mathematica} statements: + +\begin{verbatim} +(* create link before starting the (first) display in your STIR +program*) + +link=LinkCreate[``STIR'']; + +(* read data from link *) +data3d=LinkRead[link]; + + +(* display the 3rd image *) +ListPlot3D[data3d[[3]], Mesh->False]; +(* read data from link from next display *) +nextdata3d=LinkRead[link]; +(* and so on *) + +(* close link at end of STIR program *) +LinkClose[link]; +\end{verbatim} + + +\section{B-spline interpolation in STIR} + +\label{sec:BSplines} +Special classes to interpolate data using B-Splines [Uns99] have been implemented in STIR. +The B-Splines coefficients are estimated with a fast method that incorporates FIR and IIR +filters [Uns93]. The level of B-splines that are currently available are 0, 1 (linear), +2 (quadratic), 3 (cubic), 4 (quartic) and 5 (quintic). Moreover, a synthetic spline has also been +implemented based on B-splines for maximum order interpolation but minimal support, i.e. MOMS +splines [Blu01]. In all cases no regularization has been incorporated during the interpolation +procedures, therefore special care should be taken when higher than the first order B-splines +are used, as noise may be enhanced at the interpolated data. Interpolation can be also performed +in sinogram space. However this space is regular only in axial, and not in radial, angular and +azimuthal directions. Therefore, the current interpolation can be cubic only in axial direction +while for the rest directions a choice of linear interpolator is safer. In future with some +additional classes, reconstruction could be performed to obtain B-spline coefficients directly +from the projection sinograms, which can be useful for better noise properties [Nic02]. + +\section{ +Directories in the STIR tree} +\textit{STIR} can roughly be split into a library applications and applications. +\footnote{The distinction is not complete as some applications are implemented +in terms of classes that actually end up in the library.} + +See the doxygen documentation for an overview of the directory tree with brief descriptions. + +\section{ +Future developments and Support} + +The \textit{STIR} library, in its current state, possesses many capabilities. +The developers, however, look forward to still further increases +in the flexibility and power of the software. Some of the developments +being discussed are: + +\begin{itemize} +\item +expanded library of polymorphic classes (e.g. image grids, and +ordered subsets) +\item +additional scanners, also for SPECT +\item +additional data formats support, without conversion to Interfile. +\item +point-spread function reconstruction +\end{itemize} + + +While support for the library is on a voluntary basis, users +of the library are encouraged to subscribe to relevant \textit{STIR} +mailing lists (see the `Mailing Lists' section of the \textit{STIR} website +\url{http://stir.sourceforge.net/ }{http://stir.sourceforge.net}) +where they can follow developments of the software and obtain +helpful information from other users. Questions will ONLY be +answered (if at all) when directed to the mailing list. + +Commercial support is available from \url{http://asc.uk.com}{Algorithms and +Software Consulting Ltd}. + +Below, we list of some of the features that might make it into the next releases. +However, which feature is actually finalised/implemented depends +on the needs of the developers. If you want one of these features +and are willing to help, let us know. +\begin{itemize} +\item +More automatic testing programs +\item +More algorithms: potentially ART, +OSCB [Ben99b] +\item +More projectors +\item +More priors +\item +Extending the parallelisation of OSMAPOSL and OSSPS to FBP3DRP etc, or using OPEMMP +\item +Compatibility of the interpolating backprojector with recent +processors. +\item +More kinetic models: Spectral Analysis, Logan Plot +\end{itemize} + + + + + +\section{ +References} + +{[}Ahn2003] S. Ahn and J. A. Fessler, \textit{Globally convergent image reconstruction for +emission tomography using relaxed ordered subsets algorithms,} IEEE +Trans. Med. Imag., vol. 22, no. 3, pp. 613-626, May 2003. + +{[}Ale97] Alenius S and Ruotsalainen U \textbf{(1997)} Bayesian image +reconstruction for emission tomography based on median root prior. \textit{European +Journal of Nuclear Medicine} , Vol. 24 No. 3: 258-265. + +{[}Ang11] Angelis G I, Thielemans K, Tziortzi A C, Turkheimer F E and Tsoumpas C +\textbf{(2011)}. Convergence Optimization of Parametric MLEM Reconstruction for Estimation of Patlak Plot Parameters. +\textit{Computerized Medical Imaging and Graphics}, 35:407-416, +\textit{doi:10.1016/j.compmedimag.2011.01.002} + +{[}Ben99] Ben-Tal A, Margalit T and Nemirovski A \textbf{(1999)} The +ordered subsets mirror descent optimization method with application +to tomography. \textit{Research report \#2/99, March 1999, MINERVA +Optimization Center, Faculty of Industrial Engineering and Management, +Technion -- Israel Institute of Technology}. + +{[}Ben99b] Ben-Tal A and Nemirovski A \textbf{(1999)} The conjugate +barrier method for non-smooth, convex optimization. \textit{Research +report \#5/99, October 1999, MINERVA Optimization Center, Faculty +of Industrial Engineering and Management, Technion -- Israel Institute +of Technology.} + +[Bei08] Beisel T, Lietsch S, and Thielemans K \textbf{(2008)} +A Method for OSEM PET Reconstruction on Parallel Architectures Using STIR. +\textit{Proc. of the IEEE Medical Imaging Conference, Dresden, Germany, 2008}. + +{[}Blu01] Blu T, Thcvenaz P, Unser M \textbf{(2001)}. MOMS: maximal-order interpolation of minimal support. \textit{IEEE Trans Image Processing} 10(7): 1069-1080. + +[Bue12] Buerger, C., T. Schaeffter, and A. P. King \textbf{(2011)}, Hierarchical adaptive +local affine registration for fast and robust respiratory motion estimation. +Medical Image Analysis, vol. 15, pp. 551-564, +\url{http://dx.doi.org/10.1016/j.media.2011.02.009}{doi 10.1016/j.media.2011.02.009} + +{[}Bou97] Boudraa \textsc{A E O} \textbf{(1997)} Automated detection of the +left ventricular region in magnetic resonance images by Fuzzy +C-Means model. \textit{Int J of Cardiac Imag} ; 13: 347-355. + +{[}Dau86] Daube-Witherspoon M E and Muehllener G \textbf{(1986)} An +iterative space reconstruction algorithm suitable for volume +ECT. \textit{IEEE Trans. Med. Imaging}, vol. MI-5: 61-66. + +{[}Dau97] Daube-Witherspoon M E and Muehllehner G \textbf{(1987)} +Treatment of axial data in three-dimensional PET, +J. Nucl. Med. 28, 171-1724. + +{[}Def95] Defrise M. \textbf{(1995)} ``A factorization method for the +3D X-ray transform'' \textit{Inverse Problems,} \textbf{11} pp. 983-994. + + +{[}Def97] Defrise M, Kinahan P E, Townsend D W, Michel C, Sibomana +M and Newport D F \textbf{(1997)} Exact and approximate rebinning +algorithms for 3-D PET data. \textit{IEEE Trans. Med. Imaging}, MI-16: +145-158. + +{[}Egg98] Egger M L, Joseph C and Morel C \textbf{(1998)} Incremental +beamwise backprojection using geometrical symmetries for 3D PET +reconstruction in a cylindrical scanner geometry. \textit{Phys Med. +Biol.}, 43: 3009-3024. + + +{[}Gem84] Geman S and Geman D \textbf{(1984)} Stochastic relaxation, +Gibbs distributions, and the Bayesian restoration of images. \textit{IEEE +Trans PAMI}, 6: 721-741. + +{[}Gem85] Geman S and McClure D \textbf{(1985)} Bayesian image analysis: +an application to single photon emission tomography. \textit{in Proc. +American Statistical Society, Statistical Computing Section (Washington, +DC)} 12-18. + + + {[}Gre90] Green P J \textbf{(1990)} Bayesian reconstruction from emission +tomography data using a modified EM algorithm. \textit{IEEE Trans. +Med. Imaging}, MI-9: 84-93. + + +{[}Heb89] Hebert T J and Leahy R M \textbf{(1989)} A generalized EM +algorithm for 3-D Bayesian reconstruction from Poisson data using +Gibbs priors. \textit{IEEE Trans. Med. Imaging}, MI-8: 194-202. + + +{[}Her80] Herman G T \textbf{(1980)} Image Reconstruction from Projections: +The fundamentals of Computational Tomography. \textit{Academic Press, +New York}. + +{[}Hud94] Hudson H M and Larkin R S \textbf{(1994)} Accelerated image +reconstruction using ordered subsets of projection data. \textit{IEEE +Trans. Med. Imaging}, MI-13: 601-609. + +{[}Fus13] Berta Marti Fuster, Carles Falcon, Charalampos Tsoumpas, Lefteris Livieratos, Pablo Aguiar, Albert Cot, Domenec Ros and Kris Thielemans, + \textbf{ (2013)} + Integration of advanced 3D SPECT modeling into the open-source STIR framework, + \textit{Med. Phys. 40}, 092502; http://dx.doi.org/10.1118/1.4816676 + +[Fus14{]} Berta Marti Fuster, Kjell Erlandsson, Carles Falcon, Charalampos Tsoumpas, Lefteris + Livieratos, Domenec Ros, Kris Thielemans, \textbf{(2014)} + Evaluation of the novel 3D SPECT Modelling Algorithm in the + STIR Reconstruction Framework: Simple vs. full attenuation correction, + \textit{proc. IEEE MIC 2013}, Seoul, Korea. + +{[}Jac00] Jacobson M, Levkovitz R, Ben-Tal A, Thielemans K, Spinks +T, Belluzzo D, Pagani E, Bettinardi V, Gilardi M C, Zverovich +A and Mitra G \textbf{(2000)} Enhanced 3D PET OSEM Reconstruction +using inter-update Metz filters. \textit{Phys. Med. Biol}. \textbf{45} No.8 +(2000) 2417-2439\textit{l.} + + +{[}Kin89] Kinahan P E and Rogers J G \textbf{(1989)} Analytic 3D image +reconstruction using all detected events. \textit{IEEE Trans. Nucl. +Sci.}, 36: 964-968. + + +[Kle96] +Klein, G. J., B. W. Reutter, and R. H. Huesman \textbf{(1996)}, Non-rigid summing of gated PET via optical flow, \textit{1996 IEEE Nuclear +Science Symposium Conference Record}, +vol. 2, pp. 1339-1342, +\url{http://dx.doi.org/10.1109/NSSMIC.1996.591692}{doi 10.1109/NSSMIC.1996.591692} + +{[}Lab97] Labbe C, Ashburner J, Koepp M, Spinks T, Richardson M +and Cunningham V \textbf{(1997)} Accurate PET quantification using +correction for partial volume effects within cerebral structures. \textit{Neuroimage}, +5: B12. + + +{[}Lab99a] Labb\'{e} C, Thielemans K, Belluzzo D, Bettinardi V, Gilardi +MC, Hague DS, Jacobson MW, Kaiser S, Levkovitz R, Margalit T, +Mitra G, Morel C, Spinks T, Valente P, Zaidi H and Zverovich A\textit{: +An object-Oriented Library for 3D PET Reconstruction using Parallel +Computing}, Proceedings of Bildverarbeitung fuer die Medizin +1999, Algorithmen-Systeme-Anwendungen, \textit{Informatik} +\textit{aktuell, Springer}, Eds. H. Evers, G. Glombitza, T. Lehmann, +H.-P. Meinzer, pp 268-272. + +{[}Lab99b] Labb\'{e} C, Thielemans K, Zaidi H and Morel C: An object-oriented +library incorporating efficient projection/backprojection operators +for volume reconstruction in 3D PET\textit{. Proc. of 3D99 Conference}, +June 1999, Egmond aan Zee, The Netherlands + + +{[}Lal93] Lalush D S and Tsui M W \textbf{(1993)} A general Gibbs prior +for Maximum a posteriori reconstruction in SPET. \textit{Phys. Med. +Biol.}, 38: 729-741. + +{[}Lan90] Lang K \textbf{(1990)} Convergence of EM Image reconstruction +algorithms with Gibbs smoothing. \textit{IEEE Trans. Med. Imaging}, +MI-9: 4. + +{[}Lew98] Lewellen T K, Harrison R L and Vannoy S \textbf{(1998)} +The SimSET program, +\textit{ Monte Carlo Calculations in Nuclear Medicine: +Applications in Diagnostic Imaging ed M Ljungberg, S-E Strand and M A King (Bristol: Institute of Physics +Publishing)} pp 77-92. + +[Li06] Li, T., B. Thorndyke, E. +Schreibmann, \textit{et al} \textbf{(2006)}, Model-based image reconstruction for +four-dimensional PET. \textit{Med Phys} vol. 2, pp. 1288-1298 +\url{http://link.aip.org/link/doi/10.1118/1.2192581}{doi 10.1118/1.2192581} + +{[}Man97] Manders Jones H \textbf{(1997)} A Computational Investigation +of the solution of large scale Optimization problems. \textit{Ph.D +Thesis, Department of Mathematics and Statistics. Brunel, The +University of West London. Oct 1997}. + + +{[}Mar99] Margalit T, Gordon E, Jacobson M, Ben-Tal A, Nemirovski +A and Levkovitz R \textbf{(1999)} The ordered sets mirror descent and +conjugate barrier optimization algorithms adapted to the 3D PET +reconstruction problem. Technion internal report and PhD thesis of T. Margalit + +{[}Mus01] Mustafovic S and Thielemans K, \textbf{(2001)} Additive and Multiplicative +versions of the Maximum A Posteriori Algorithm with the Median +Root Prior. poster at \textit{IEEE Med. Img. Conf. 2001.} + +{[}Mus04] Mustafovic S and Thielemans K, \textbf{(200}\textbf{4}\textbf{)} \textit{Object +Dependency of Resolution in Reconstruction Algorithms with Inter-Iteration +Filtering Applied to PET} , IEEE Trans. Med. Im. 23 (4): (2004) +433-446. + +{[}Mus02] Mustafovic S and Thielemans K, \textit{,} \textbf{(2002)} Comparison +of Unconventional Inter-Filtering Methods to Penalised-likelihood +for Space-invariant Tomographs, poster at \textit{IEEE Medical Imaging +Conf. 2002}. + +{[}Nem78] Nemirovski A and Yudin D \textbf{(1978)} Problem complexity +and method efficiency in optimization. \textit{Nauka Publishers, +Moscow, 1978 (in Russian); English translation: John Wiley \& +Sons, 1983}. + +{[}Nic02] Nichols, T. E., J. Qi, E. Asma and R. M. Leahy \textbf{(2002)}. Spatiotemporal reconstruction of list-mode PET data. \textit{IEEE Trans Med Imaging} 21(4): 396-404. + +{[}Pat83] Patlak C S, Blasberg R G, Fenstermacher J D \textbf{(1985)} Graphical evaluation of blood-to-brain +transfer constants from multiple-time uptake data. \textit{J Cereb Blood Flow Metab} 3(1): p. 1-7. + +{[}Pat85] Patlak C S, Blasberg R G \textbf{(1985)} Experimental and Graphical evaluation of blood-to-brain +transfer constant from multiple-time uptake data: Generalizations. \textit{J Cereb Blood Flow Metab} 5: p. 584-90. + +{[}Poe03{]} Poenisch F, Enghardt W, and Lauckner K \textbf{(2003)}, +Attenuation and scatter correction for in-beam positron emission tomography +monitoring of tumour irradiations with heavy ions. \textit { Phys Med Biol } 48(15): 2419-2436. + + {[}PAR1.3] Levkovitz R, Zibulevsky M, Labbe C, Zaidi H and Morel +C \textbf{(1997)} Determination of a Set of Existing Algorithms for +Comparative Evaluation. \textit{PARAPET documentation for D1.3, Geneva +University Hospital and Technion}. \\ +Available at \url{http://stir.sourceforge.net }{http://stir.sourceforge.net}. + +[Pol 11] Polycarpou I, Thielemans K, Manjeshwar R, Aguiar P, Marsden PK, +Tsoumpas C (2011) Comparative evaluation of scatter correction in 3D PET +using different scatter-level approximations. Ann Nucl Med, 25(9): +643-649, doi: 10.1007/s12149-011-0514-y. + +[Pol12] Polycarpou, I., C. +Tsoumpas and P. K. Marsden \textbf{(2012)}, Analysis and +comparison of two methods for motion correction in PET imaging +\textit{Med Phys} vol. 39, 3586-3590, +\url{http://dx.doi.org/10.1118/1.4754586}{doi 10.1118/1.4754586}. + + +[Rah08] Rahmim, A., K. +Dinelle, \textit{et al} \textbf{(2008)}, Accurate event-driven motion compensation +in high-resolution PET incorporating scattered and random events. \textit{IEEE Trans +Med Imaging}, vol. 27, 1018-1033, +\url{http://dx.doi.org/10.1109/TMI.2008.917248}{doi 10.1109/TMI.2008.917248}. + + + {[}Rea98] Reader A J, Visvikis A, Erlandsson K, Ott R J, and Flower +M A \textbf{(1998)} Intercomparison of four reconstruction techniques +for positron volume imaging with rotating planar detectors. \textit{Phys. +Med. Biol.}, 43: 823-34. + + +{[}She82] Shepp L A and Vardi Y \textbf{(1982)} Maximum likelihood reconstruction +for emission tomography. \textit{IEEE Trans. Med. Imaging}, 1: 113-122. + + +{[}Sil90] Silverman B W, Jones M C, Wilson J D, and Nychka D W \textbf{(1990)} +A smoothed EM approach to indirect estimation problems, with +particular reference to stereology and emission tomography. \textit{J. +Roy. Stat. Soc}., 52: 271-324. + +{[}Thi07{]} Thielemans K, Manjeshwar R, Tsoumpas C and Jansen F\textbf{(2007)}, +A new algorithm for scaling of PET scatter estimates using all coincidence events. +\textit { IEEE Nucl Sci Symp Med Imaging Conf } 3586 - 3590. + +{[}Thi12] Kris Thielemans, Charalampos Tsoumpas, Sanida Mustafovic, Tobias Beisel, Pablo Aguiar, Nikolaos Dikaios, and Matthew W Jacobson, +STIR: Software for Tomographic Image Reconstruction Release 2, +\textit{Physics in Medicine and Biology, 57 (4), 2012 pp.867-883}. + +{[}Tso04{]} Tsoumpas C, Aguiar P, Nikita K S, Ros D and Thielemans K\textbf{(2004)}, +Evaluation of the single scatter simulation algorithm implemented in the STIR library. +\textit { IEEE Nucl Sci Symp Med Imaging Conf } 3361-3365. + +{[}Tso07{]} Tsoumpas C, Turkheimer F E and Thielemans K \textbf{(2007)}, +Convergence properties of algorithms for direct parametric estimation of linear models in dynamic PET. +\textit{IEEE Nucl Sci Symp Med Imaging Conf} 3034-3037 + +{[}Tso08{]} Tsoumpas C, Turkheimer F E and Thielemans K \textbf{(2008)}, Study of direct and indirect +parametric estimation methods of linear models in dynamic positron emission tomography. \textit{Med. Phys.} +35(4): p. 1299-1309. + +[Tso13] Tsoumpas, C., I. +Polycarpou, K. Thielemans, \textit{et al} \textbf{(2013)}, The effect of +regularisation in motion compensated PET image reconstruction: A realistic +numerical 4D simulation study. \textit{Phys Med Biol}, vol. 58, 1759-1773, +\url{http://dx.doi.org/10.1088/0031-9155/58/6/1759}{doi 10.1088/0031-9155/58/6/1759}. + + +{[}Uns93] Unser M, Aldroubi A, Eden M \textbf{(1993)}. B-Spline Signal Proccessing: Part II - Efficient Design and Applications. \textit{IEEE Trans Signal Processing} 41(2): 834-848. + +{[}Uns99] Unser M. \textbf{(1999)}. Splines: A Perfect Fit for Signal and Image Processing. \textit{IEEE Signal Processing Magazine}: 22-38. + +{[}Wat96{]} Watson C C, Newport D, and Casey M E\textbf{(1996)}, +A single-scatter simulation technique for scatter correction in 3D PET. +\textit { Fully 3D Image Recon Radiol Nucl Med} Kluwer Academic: 255-268. + +{[}Wat97a{]} Watson C C, Newport D, Casey M E, deKemp R A, Beanlands R S, and Schmand M +\textbf{(1997)}, Evaluation of Simulation-Based Scatter Correction for 3-D PET Cardiac Imaging. +\textit { IEEE Trans Nucl Sci }, 44(1): 90-97. + +{[}Wat97b{]} Watson C C, Newport D, Casey M E, Beanlands R S, Schmand M, and deKemp R A +\textbf{(1997)}, A technique for measuring the energy response of a PET tomograph using a compact scattering source. +\textit { IEEE Trans Nucl Sci }, 44(6): 2500-2508. + +{[}Wat00{]} Watson C C \textbf{(2000)}, New, faster, image-based scatter correction for 3D PET. +\textit { IEEE Trans Nucl Sci } 47(4): 1587-1594. + +{[}Wat04{]} Watson C C, Casey M E, Michel C, Bendriem B\textbf{(2004)}, +Advances in scatter correction for 3D PET/CT. \textit { IEEE Nucl Sci Symp Med Imaging Conf } 3008 - 3012. + +{[}Wer02{]} Werling A, Bublitz O, Doll J, Adam L E, and Brix G\textbf{(2002)}, +Fast implementation of the single scatter simulation algorithm and its use in iterative image +reconstruction of PET data. \textit { Phys Med Biol } 47(16): 2947-2960. + +\end{document} diff --git a/documentation/STIR-developers-overview.tex b/documentation/STIR-developers-overview.tex new file mode 100644 index 0000000000..13eee0c614 --- /dev/null +++ b/documentation/STIR-developers-overview.tex @@ -0,0 +1,1264 @@ +%&LaTeX +\batchmode +\documentclass{article} +%\usepackage{setspace} +\usepackage{graphicx} +%\usepackage{amsmath} +\usepackage{hyperref} +\usepackage{a4wide} +\def\R2Lurl#1#2{\mbox{\href{#1}{\tt #2}}} + +\newcommand{\tab}{\hspace{5mm}} + + +\begin{document} +\begin{center} +\textbf{{\huge STIR \\ +Overview for developers}}\\ +\textbf{Kris Thielemans}\\ +\textbf{\textit{version 2.0}} + + +\end{center} + +\tableofcontents + + +\section{ +Introduction} + +The objective of this document is to describe the STIR common +building blocks library.\\ +The library has been designed so that it can be used for many +different algorithms and scanner geometries, including both cylindrical +PET scanners and dual-head rotating coincidence gamma cameras +(although the latter needs some work). The library contains classes +and functions to run parts of the reconstruction in parallel +on distributed memory architectures, but the parallel features +are not discussed here.\\ +The building block classes discussed in this document are: +\begin{itemize} +\item +Classes for images (2D and 3D) +\item +Classes for projection data (i.e. the measured data) +\item +Forward projection, back projection and projection matrix classes. +\item +Classes for iterative reconstruction algorithms +\item IO +\end{itemize} + +The documentation +for the STIR library is generated automatically from the source +using the \textit{doxygen} program (\R2Lurl{http://www.doxygen.org/ }{http://www.doxygen.org/}). +This can produce an HTML version but also various other output +formats (you can get e.g. RTF or LaTeX output by simply running +doxygen on the source files that come in the STIR distribution). + + +\section{ +General conventions} + + + +\subsection{ +Units } + +Distances are in millimetre.\\ +Angles are in radians.\\ +Relative times are in seconds. + +\subsection{ +Coordinate system for image data } + +Although STIR is prepared for general images such as blobs on +bcc grids (see the online documentation for class \textbf{DiscretisedDensity}), +currently only voxels on a Cartesian grid are implemented (class \textbf{VoxelsOnCartesianGrid}). +The coordinate axes for Cartesian grids are chosen as follows. +\begin{description} +\item[x-axis] : horizontal axis, pointing right when looking from +the bed into the gantry +\item[y-axis] : vertical axis, pointing downwards +\item[z-axis] : the scanner axis, pointing from the gantry towards +the bed +\end{description} +The origin of the X and Y axes are located on the central axis +of the PET scanner and the Z origin (z=0) is located in the middle +of the first ring (i.e at the opposite side of the bed). Note +that for images with an even size in x and y, the axis of the +scanner \textit{does} coincide with the centre of a pixel. In particular, +for range of \textit{2n}, the (internal) image coordinates would run +from \textit{-n} to \textit{(n-1)}. + + + +\subsection{ +Info on projection data} + +Conventional axes and units used for projection data are shown +in Figures \ref{scanner-image-units} and \ref{image-units}.. + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=2in, height=2in]{graphics/STIR-developers-overviewFig1} +\caption{ Axes and units within one transaxial +slice of the target image. The transaxial section of the field +of view is shown as a grey circle. The number of measured projection +elements along the s-axis is odd, so that s =0 is positioned +at the centre of the central projection element. The angles \ensuremath{\theta} +and \ensuremath{\phi} define the direction of the line-of-response } +\label{image-units} +\end{center} +\end{figure} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=4in, height=2in]{graphics/STIR-developers-overviewFig2} +\caption{Sketch of main axes, units and angles used in the cylindrical +scanner geometry (axial section, not to scale)} +\label{scanner-image-units} +\end{center} +\end{figure} + + +See the STIR glossary for some info on naming conventions for +projection data. + + +In 3D PET, two data storage modes are generally used for a \textbf{segment}\footnote{{The +GE Advance file format does \textit{not} store the data per segment, +but per view. In addition, the segments are then mixed. However, +once read into STIR, this organisation is no longer available. +\\ +The ECAT6 sinograms also have no easy way to understand which +ring-pair corresponds to which sinogram number for 3D PET. This +is the main reason why STIR does not attempt to read ECAT6 sinograms +directly, but leaves this to a separate conversion utility.}} +\begin{itemize} +\item +where the 3D data is ordered by \textbf{sinogram} (i.e \textbf{axial position}, \textbf{view +angle}, \textbf{tangential position}) (CTI terminology: \textit{Volume} mode) +(see Figure \ref{fig:sinogramstorage}) +\item where the 3D dataset is ordered by \textbf{view} (i.e \textbf{view angle}, \textbf{axial +position}, \textbf{tangential position}) (CTI terminology: \textit{View} +mode) (see Figure \ref{fig:viewgramstorage}) +\end{itemize} + +This notation means that for a sinogram, the tangential position +runs fastest.\\ +In both modes, the 3D dataset has been stored in several segments +where the number of axial positions in each \textbf{segment} depends +on the \textbf{axial compression (span)}.\\ +Note that we find the CTI terminology confusing, so you will +see it nowhere in STIR except in this document. + + +From both modes, 2 different types of 2D datasets can be obtained +: +\begin{itemize} +\item Sinogram i.e (View, tangential position) for a fixed axial +position. +\item Viewgram i.e (axial position, tangential position) for a fixed +view. +\end{itemize} + + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=2.7in, height=2.7in]{graphics/STIR-developers-overviewFig3} +\caption{By sinogram storage.} +\label{fig:sinogramstorage} +\end{center} +\end{figure} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=2.7in, height=2.7in]{graphics/STIR-developers-overviewFig4} +\caption{By viewgram storage.} +\label{fig:viewgramstorage} +\end{center} +\end{figure} + + +For an \textit{N} ring scanner, if there is \textit{no} axial compression, +there are \textit{N-abs(segment\_num)} sinograms (or axial positions) +in each segment. The first sinogram always corresponds to a coincidence +in the first ring of the scanner (ring\_num=0), where the other +ring would obviously be \textit{ring\_num=abs(ring\_diff)=abs(segment\_num)}. +\\ +Well ok, this is really true unless you messed around with the +data and removed/added some sinograms. + +The situation with axial compression is more complicated. +Obviously there is more than 1 ring-difference in a segment now. +This makes it kind of hard to count how many sinograms/axial\_positions +you will have and which ring-pairs sit in which segment. You +can find some documentation on how we do this in ProjDataInfoCylindrical.cxx. +See also the Michelogram documentation in the STIR glossary document. + + +In any case, currently STIR always assumes for each segment that +the middle of the scanner corresponds to the middle of the set +of sinograms (taking into account the ring difference). + +View 0 currently corresponds to a vertical projection (for some +scanners, this is not true. STIR currently ignores this, so will +reconstruct a rotated image). Finally, in STIR code, the first +ring of the scanner is the ring furthest from the bed. This corresponds +to how the data are stored in ECAT6,7 and Interfile files. + +\section{ +Code conventions} + + +\subsection{ +Configuration file} + +The file \textit{stir}/\textit{common.h} contains general configuration +info and tries to iron out some incompatibilities for certain +compilers. If you include any STIR \textit{.h} file, you are guaranteed +to have included \textit{stir}/\textit{common.h} as well, hence it should +never be included explicitly by a 'user'. + +\subsection{ +Namespace} + +The STIR library has its own C++ namespace: \textit{stir}. All symbols +are within this namespace. The effect of this is that conflicts +with other symbols are impossible (except when somebody else +is using the same namespace). STIR also uses sub-namespaces for +certain things. This usage will probably be expanded in the future.\\ +For older compilers, the namespace can be disabled (see \textit{stir}/\textit{common.h}). +For this reason, we have introduced some macros such as \textit{START\_NAMESPACE\_STIR.} You +could use the macros in your own code as well, although people +with a compiler that does not support namespace really should +upgrade. + +\subsection{ +Naming conventions } + +Types start with capitals, every word is capitalised, no underscores, +e.g. \textit{DiscretisedDensity}.\\ +Variables, methods and members are lower case, underscores between +different words, e.g. \textit{voxel\_size}.\\ +Variables, methods and members indicating +\begin{itemize} +\item +a variable or member used to indicate the number of things starts +with \textit{num}, e.g. \textit{num\_gates}. +\item +the number of an item in a sequence end with \textit{num}, e.g. \textit{gate\_num}. +\item +a relative time (normally with respect to the scan start) end +with \textit{rel\_time}, e.g. \textit{tracer\_injection\_rel\_time}. +\item +Pointers to an object called \textit{something\_ptr}. Currently there +is no naming distinction between shared pointers etc. This is +probably a bad idea. For new code, we recommend to use \textit{something\_sptr} +for shared pointers, and \textit{something\_aptr} for auto\_ptrs (see +section \ref{sect:sharedptr}). +\end{itemize} + +In most cases, access to data of a class is via a \textit{get\_something(), +set\_something()} pair.\\ +In general, names are descriptive and hence long. We often take +longer to decide about the name than to write the actual code. +If you write new code, do the same. You will be grateful when +you look back at the code a few months later (and not vilified +by your successor). + +\subsection{ +File conventions } + +Most classes have their own \textit{.h,} .\textit{inl}, \textit{.txx} and/or \textit{.cxx} files. +File names of such classes are simply \textit{ClassName.h} {\nobreakspace}etc. +(preserving capitals). In general, looking at +the \textit{.h} file should give enough information on what a class/function +does. \\ +The \textit{.inl} files contain inline code +for functions. The main purpose for this is to keep the \textit{.h} +files as short and clean as possible. \\ +The \textit{.txx} files are similar to the \textit{.inl} files. They contain non-inline +definitions of template classes (or functions). They should only be included by the +corresponding \textit{.cxx} file where the template is then instantiated for any desired types. +This makes it easier or a user to instantiate a template for a new type without modifying the +original STIR code.\footnote{The \textit{.txx} extension as used because the Insight Toolkit (ITK) +uses it as well. It stands for template C++ presumably.} + + +All STIR include files should be included as \textit{\#include ``stir/maybe\_a\_subdir/name.h''}\\ +The \textit{doxygen} comments generally occur in the \textit{.h} file, unless +they are very extensive. In this case, the \textit{.h} file contains +a brief comment, while the \textit{.inl} or \textit{.cxx} file contains +the longer description.\\ +To avoid unnecessary interdependencies between \textit{.h} files (and +hence unnecessary rebuilds when modifying one \textit{.h} file), we +avoid including \textit{.h} files for 'supporting' classes as much +as possible. Instead, we only declare the classes needed, e.g. \textit{class +Bin;} instead of \textit{\#include stir/Bin.h.} + + + +\subsection{ +Class definitions} + +Class definitions follow generally the following format (ignoring \textit{doxygen} +comments). + +\begin{verbatim} +class A +{ +public: + enumerated types and other typedefs + static member functions + data members + constructors + destructors + member functions +protected: + enumerated types and other typedefs + static member functions + data members + constructors + destructors + member functions +private: + enumerated types and other typedefs + friends if any + static member functions + data members + constructors + destructors + member functions +}; +\end{verbatim} + + +Inline member functions are defined in the \textit{.inl} file, and +are ordered (where possible) such that if inline member function +a() calls inline member function b(), +then b should be defined first. (Otherwise very +few compilers are able to inline the call to b +from a.) + + + +\subsection{ +Argument order conventions} + +When passing output arguments (by reference or by pointer), those +arguments occur FIRST in the list. For instance +\begin{verbatim} +void some_function(int& output, const SomeType& some_input_argument, ...); +\end{verbatim} + + +This order of arguments allows the use of default arguments. +Note that the standard C++ library does not use this convention. + +\subsection{ +Error handling } + +Problem reporting is via two functions \textit{error()} and \textit{warning()}. +Currently, \textit{error()} simply aborts the programme (after writing +a diagnostic message). \\ +In many places, validity of input arguments or of the state of +an object is checked by \textit{assert} macros. This code is only +compiled when the \textit{NDEBUG} preprocessor macro is not defined, +such that a production version of the programs +is not slowed down. If an assertion is false, the program aborts +with info on the file and line number where the assertion failed. + +\subsection{ +Advanced (?) C++ features used} + +We attempted to follow the ANSI C++ standard as close as possible. +We expect to have some marginal problems with a 'strict' ANSI +C++ compiler, although there should now be very few cases(as +gcc warns about a lot of stuff). We have used some preprocessor +macros (see \textit{stir/common.h}) to isolate work-arounds for older +compilers. Ideally, all these \#ifdefs should disappear at a +later development stage of the library. We gradually give up +on supporting older compilers anyway. + + +The library uses templates very often. This allows us to write +'generic' code, independent of specific types. For instance, +multi-dimensional arrays correspond to + +\begin{verbatim} +template +class Array; +\end{verbatim} + + +To avoid linking problems, the templates which we use are explicitly +instantiated in the relevant \textit{.cxx} files. If a user needs +other types, (s)he will have to add the instantiations (or use +a more recent compiler).\\ +We do use partial class template specialisation in some places. +However, (very ugly) work-arounds are provided for compilers +that do not support this feature.\\ +Very occasionally we use member templates (in such a form that +it can be compiled by Visual C++, i.e. inline in the class definition). +It would be possible, but slightly tedious, to write explicit +code for older compilers, but we did not do this.\\ +Another fairly recent C++ feature that we use is Run Time Type +Information (RTTI). We almost exclusively use this to check validity +of pointer (or reference) casts down a hierarchy ('down-casting'). +See section \ref{sect:classhierarchies} +for an example. If a compiler does not support +RTTI, it would be possible to declare a (essentially empty) {\small dynamic\_cast} +template function such that the above code would compile. The +resulting programme would become inherently type-unsafe though, +and we recommend that you upgrade your compiler. Some code does +rely on explicit type checking, you would have to check this +in detail if you don't have RTTI. + +\subsubsection{ +Iterators} + +An important C++ concept, used fairly often in STIR, is an \textit{iterator.} The +easiest way to think about iterators is as a sort of generalised +pointer, used to iterate through a collection of objects of the +same type. For instance, the following code would add 2 to all +the elements of a vector: + +\begin{verbatim} +void f(vector& v) +{ + for (vector::iterator iter = v.begin(); iter != v.end(); ++iter) + *iter += 2; +} +\end{verbatim} + + +So, just as pointers, you increment an iterator to go to the +next element of the vector, and you use \textit{*iter} to access the +object that the iterator refers to. However, the advantage is +that the above code would just as well work for any other type +of collection, as long as it provides an iterator interface. +So, typical code in C++ would look as follows: + +\begin{verbatim} +template +void f(Container& v) +{ + for (Container::iterator iter = v.begin(); iter != v.end(); ++iter) + *iter += 2; +} +\end{verbatim} + + +Iterators are used with great success in the C++ Standard Template +Library (STL), and STIR provides iterators for its container +classes. In particular, for multi-dimensional arrays, it is possible +to iterate through the array in 2 ways: using \textit{Array\texttt{<}n,T\texttt{>}::iterator} +whose iterators point to arrays of dimensions \textit{n-1}, or using \textit{Array\texttt{<}n,T\texttt{>}::full\_iterator} which +essentially provides a one-dimensional look at the whole array. +So, adding 2 to all the elements of a multi-dimensional array +can be done as follows + +\begin{verbatim} +template +void f(Array& a) +{ + for (Array::full_iterator iter = a.begin_all(); + iter != a.end_all(); ++iter) + *iter += 2; +} +\end{verbatim} + +Note that use of the \textit{begin\_all()} and \textit{end\_all()} members +which return \textit{full\_iterator} objects. \\ +Of course, the above function is just an illustration, as in +STIR this can be done by using: + + +\begin{verbatim} +Array a = ...; +a += 2; +\end{verbatim} + + +\subsubsection{ +Shared pointers and other smart pointers \label{sect:sharedptr}} + +STIR uses the \textit{shared\_ptr} class considerably. Shared pointers +are a specific type of 'smart pointers'. These have the advantage +that they essentially clean up after you. That is, you do not +have to call \textit{delete} on them. They are even exception proof +(something which you cannot achieve with an ordinary pointer). +Generally, the destructor of the smart pointer will make sure +that the object it points to is deleted (when appropriate).\\ +\textit{std::auto\_ptr} is a standard smart pointer class which is +suitable for pointers to objects where there's only one smart +pointer for each object. Unfortunately, its syntax has been decided +rather late in ANSI C++ and its implementation requires some +advanced C++ features, leading to a non-standard implementation +of auto\_ptr in older compilers (including VC 6.0). For this +reason, we do not use this smart pointer class too much, and +generally use shared\_ptr instead. This is somewhat unfortunate +as these two smart pointers are generally quite different concepts. +\\ +\textit{shared\_ptr} is a STIR (or boost) smart pointer class which +is suitable when there are (potentially) more than one pointer +pointing to the same object. It keeps a reference count such +that the object is (only) deleted when the last shared pointer +that references it is destructed. \\ +Caveat: if you modify the object of 1 shared\_ptr, the change +obviously applies to all shared\_ptrs sharing that object.\\ +Caveat: if you assign an ordinary pointer to a shared\_ptr, you +cannot delete the ordinary pointer anymore (it will be done by +the shared\_ptr). As a consequence, you cannot assign an ordinary +pointer twice to a shared\_ptr. It is thus better to go all the +way, and not have any ordinary pointers anymore.\\ +Caveat: do not initialise a shared\_ptr with a pointer that cannot/should +not be deleted. For instance, initialising it with the address +of a local variable, or even a reference, will cause a delete +on an object that is not allocated on the heap, and so probably +crash your program.\\ +It is clear that smart pointers are very useful, but also somewhat +dangerous. For this reason, most classes do not return shared\_ptrs +to their members (even if they store one). Instead, they return +a pointer to a const object. This prevents a user of a class +to inadvertently change members of the class-object. This does +involve a performance penalty when the user then needs to create +a shared\_ptr himself. For example, you'll see code like this + +\begin{verbatim} +ProjData proj_data(...); +ProjDataInfo const * proj_data_info_ptr = + proj_data.get_proj_data_info_ptr(); +shared_ptr new_proj_data_info_sptr = + proj_data_info_ptr->clone(); +// now do something with new_proj_data_info_sptr +\end{verbatim} + + +We provide the convenience function \textit{stir::is\_null\_ptr()} +to test if a pointer is `null', i.e. does not point to anything. \textit{is\_null\_ptr} +works with ordinary pointers, shared\_ptrs and auto\_ptrs. Use +it to avoid that your code depends on what type of (smart) pointer +you are using. + +\subsection{Generic functionality of STIR classes} +This is a (very incomplete) section describing some functionality that +many STIR classes have in common. + +\subsubsection{Copying objects} +When using pointers or references to objects of an abstract type, you can copy +them using \texttt{clone()}, see section \ref{sect:sharedptr}. + + +When you only want to create an object of the same characteristics, but without +copying the data itself (e.g. images of the same size), use \texttt{get\_empty\_copy()}. + +\subsubsection{Comparing objects} +Many STIR classes implement comparison using the usual \texttt{==} and +\texttt{!=} operators. The implementation of these operators is somewhat +tricky in class hierarchies. We try to follow the approach described in +\textit{Overriding the C++ Operator==, An approach that uses the +Template Method design pattern} By Daniel E. Stevenson and Andrew T. Phillips, +Dr. Dobb's Journal, June 2003, +\R2Lurl{http://www.ddj.com/184405409}{http://www.ddj.com/184405409}. + +For some classes, you might want to check only if two objects are of the same +type. For instance, if images have the same sizes, origin etc, but not +necessarily the same voxel values. This can be done using the member +function \texttt{has\_same\_characterics}. + +\subsubsection{Parsing from text files} +Many class-hierarchies allow to construct an object by parsing a +text file, which uses an Interfile-like syntax. Examples +are given in the User's guide. see section \ref{sect:parsing}. + +All these classes (and some others) have a member function +\texttt{parameter\_info()} which returns a string with all parameters +of the object. + +Note that many STIR classes are not completely constructed by parsing. +Usually, it is necessary to call a \texttt{set\_up} function to make +the object usable. + +\subsubsection{typedefs} +Many class hierarchies use the same typedefs. For example: +\begin{verbatim} +class ProjDataInfo +{ +protected: + typedef ProjDataInfo root_type; // root of hierarchy + +}; +class ProjDataInfoCylindrical: public ProjDataInfo +{ +private: + typedef ProjDataInfo base_type; + typedef ProjDataInfoCylindrical self_type; +}; +\end{verbatim} + +\section{ +Overview of classes} + +This section provides an overview of the main ingredients of +the library. Detailed description of these classes is in the documentation. +Below we only mention some general features. + + + +\subsection{ +Images} + +Iterative algorithms generally assume that the activity density +can be discretised in some way. That is, the continuous density +can be approximated by having a linear combination of some basis-functions. +The reconstruction problem will try to estimate the coefficients $\lambda_{ijk}$ of +the discretised density + + +$\sum_{ ijk}\lambda _{ijk} \,b_{ijk} (\widehat{x}) $ + +The base class corresponding to this kind of data is \textit{DiscretisedDensity.}\\ +We assume that the set of basisfunctions can be characterised +by 3 indices\footnote{{\small Actually most of the image hierarchy is +templated in the number of dimensions. This means it can be used +for 2D and 3D images, but also for higher dimensional cases (say +temporal information).}} $(ijk)$ such that $i$ runs over a +range of integers $i_1..i_2$,$j$ runs over a +similar range that can however depend on $i$, and $k$ runs +over a similar range that can depend on $i$ and $j$. +This +concept of ranges is embodied in the \textit{IndexRange} class. Multi-dimensional +arrays which have such ranges are encoded by the \textit{Array} class. +This forms the data structure for the set of coefficients of +the basisfunctions, hence \textit{DiscretisedDensity} is derived from +the \textit{Array}. + + +In most useful cases, the basisfunctions will be translations +of a single function \textit{b(x)} (although scaling etc could occur +depending on \textit{ijk)}. This means that the discretisation has +a certain grid, corresponding to the centre of the basisfunctions. +This structure is the next level in the image hierarchy. Currently +we have the class \textit{DiscretisedDensityOnCartesianGrid} to implement +the case where the grid is formed by an orthogonal set of vectors. +Another case would be e.g. \textit{DiscretisedDensityOnCylindricalGrid} +(for a cylindrical coordinate system), but we have not implemented +this yet.\\ +The next level in the hierarchy is then finally the specification +of the basis functions themselves. We currently have only voxels +and pixels, but another useful case would be to use Kaiser-Bessel +functions as the translated basisfunction \textit{b(x)} (this is called \textit{Blobs} +in the literature). This leads us to the example image hierarchy +in Figure \ref{image-hierarchy}.\\ +\begin{figure}[htbp] +\begin{center} +\includegraphics[bb = 0 0 1613 303, scale=0.25]{graphics/STIR-developers-overviewFig7} +\caption{ Hierarchy of classes for images. Only two +of the bottom classes are currently implemented.} +\label{image-hierarchy} +\end{center} +\end{figure} + + +Although a Cartesian grid seems the logical choice for images, +there are two reasons why one would like to use different types +of grid. One important reason would be sampling efficiency. As +an example, in 3D one needs less sampling points with a BCC grid +while still being able to represent the same spatial frequencies. +This becomes particularly important when using more complicated +basis functions than voxels, like Kaiser-Bessel functions ('blobs'). +In this case, calculations to perform the projections are much +more expensive, so having less grid points becomes important. +A second reason for changing the image grid is to increase the +symmetry of the projection matrix. For example, for cylindrical +scanners using a cylindrical grid would maximise the amount of +repetition in the projection matrix. In particular, this would +allow even for large PET scanners pre-calculation of the 'independent' +part of the projection matrix, and loading it completely into +memory when doing the reconstruction. This will not only speed +up the reconstruction, but also enable more accurate models of +the acquisition to be used, resulting in potentially better resolution +and noise behaviour. We believe that this hierarchy can accommodate +all known cases used for reconstructions in 3D PET. + + + +\subsection{ +Projection data classes} + +Different manufacturers use different sampling of projection +space. As an example, the HiDAC uses 'polar' sampling. Similarly, +Single Photon Emission Tomography (SPET) or Computed Tomography +(CT) data are very similar to PET. By having projection data +classes that allow for different geometries and file formats, +our library should be useful for these image modalities as well.\\ +The general class to access projection data is called \textit{ProjData}. +As in 3D-PET, the projection data are potentially huge, we do +not generally store the whole data in memory. Instead, \textit{ProjData} +has methods for getting subsets of the data, i.e. \textit{SegmentByView, +SegmentBySinogram, Viewgram, Sinogram, RelatedViewgrams} (see section +\ref{sect:sect:symmetries}). +In addition, the \textit{ProjData} class provides access to a \textit{ProjDataInfo} +object (see Figure \ref{projdatainfo-hierarchy}). This object completely describes the +geometry of the data. + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=4in, height=1.6in]{graphics/STIR-developers-overviewFig8} +\caption{ Hierarchy of classes for (geometric) information +of the projection data.} +\label{projdatainfo-hierarchy} +\end{center} +\end{figure} + + +Different file formats (or potentially other types of projection +data) are handled by having derived classes of \textit{ProjData}, +which provide specific implementations for the data access methods. +This hierarchy is at the moment very simple, but can easily be +extended to accommodate different file formats. + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=5.103in, height=1.251in]{graphics/STIR-developers-overviewFig9} +\caption{ File formats for projection data} +\end{center} +\end{figure} + + +Currently missing is support for fan-beam data.\\ +List-mode data is experimentally supported since version 1.2. + +\subsection{ +Data (or image) processor hierarchy} + +We provide a hierarchy for functions that modify an image, \textit{e.g.} by +filtering or thresholding it. The base class is \textit{DataProcessor}, +which is templated in \texttt{DataT}, to allow using other types, not +only images. +Aside from the virtual functions that specify the interface to +an image processor, it also provides the basics for a registry +of all data processors. See section \ref{sect:registries} for some details. +Note that the registry is specific to every \texttt{DataT}. + +\subsection{ +Projector classes} + +The next important type of ingredient for an iterative algorithm +are the projection operations. The forward projection models +the measurement. Generally, reconstruction algorithms are some +kind of inversion procedure for the following problem + + +\[y_{b} =\sum\limits_{v}P_{bv} \lambda _{v} \] + + +where $y_b$ are the measured data. The exact interpretation +of the projection matrix depends on the algorithm (it is most +of the time probabilistic, in the sense that the above equation +would only hold 'on average' ). However, this need not concern +us here.\\ +Many algorithms (in particular EM-type algorithms) can be written +solely in terms of multiplication with the projection matrix +(\textit{forward projection}) or with its transpose (\textit{back projection}). +This is why we have a \textit{ForwardProjectorByBin} and \textit{BackProjectorByBin} +hierarchy. The basic objects handled by these projector classes +are \textit{RelatedViewgrams} and (a derived class from) \textit{DiscretisedDensity}. +Other algorithms (for instance ART or listmode algorithms) need +more detailed access to the elements of the projection matrix, +and hence will work with a \textit{ProjMatrixByBin} object\footnote{{\small Some +algorithms would need column-wise access to the projection matrix +(i.e. by voxels). We did not implement any of these algorithms, +so we do not have appropriate projection classes for them. Modification +of the row-wise classes is straightforward though.}}. + + +\subsubsection{ +Symmetries \label{sect:sect:symmetries}} + +An important feature of geometric projectors is that several +parts of the projection matrix are the same. This is because +different (generalised) voxels and bins are related by symmetry. +It is important to make use of these symmetries for two reasons. +It allows storing only a part of the projection matrix (useful +for disk storage and caching), and in on-the-fly projection operations +it can be used to speed up the computation, as there is no need +to recompute the related elements. As the number of projection +data elements related by symmetry depends on the specific geometries +(e.g which class derived from \textit{DiscretisedDensity} is used), +we need classes (e.g. \textit{RelatedViewgrams}) that store all related +data, classes for describing the symmetries (e.g. \textit{DataSymmetriesForViewSegmentNumbers}), +and the necessary operations (\textit{SymmetryOperation}). \\ +At the moment, the only symmetries implemented are specific for +Cartesian grids. A discussion of these symmetries is presented +in [Par4.1], but also in the online documentation. + +\subsubsection{ +ForwardProjectorByBin hierarchy} + +We provide two derived classes of \textit{ForwardProjectorByBin}: +\begin{itemize} +\item +\textit{ForwardProjectorByBinUsingRayTracing} computes the $P_{bv}$ +elements as the length of intersection of one Line Of Response +with the voxel. The actual implementation uses a version of Siddon's +algorithm, enhanced to use all possible symmetries. This implementation +was discussed in [Par4.1]. +\item +\textit{ForwardProjectorByBinUsingProjMatrix} performs forward projection +for any \textit{ProjMatrix}. Indeed, all functionality is already +provided by the \textit{ProjMatrix} class. The current class only +provides the implementation of the \textit{ForwardProjectorByBin} +interface, such that algorithms can use any \textit{ProjMatrix} object +available. +\end{itemize} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[bb = 0 0 543 79, scale=0.52]{graphics/STIR-developers-overviewFig10} +\caption{Forward projectors} +\end{center} +\end{figure} +This hierarchy is uses the registry mechanism discussed in section +\ref{sect:registries}. + +\subsubsection{ +BackProjectorByBin hierarchy} + +This is very similar to the previous section. We provide two +derived classes of \textit{BackProjectorByBin}: +\begin{itemize} +\item +\textit{BackProjectorByBinUsingInterpolation} computes the $P_{bv}$ +elements via interpolation between the projection data for the +LOR through the centre of the voxel. We have two different interpolation +mechanisms (linear, and piece-wise linear) as discussed in [Par4.1]. +\item +\textit{BackProjectorByBinUsingProjMatrix} performs back projection +for any \textit{ProjMatrixByBin}. +\end{itemize} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[bb = 0 0 503 79, scale=0.52]{graphics/STIR-developers-overviewFig11} +\caption{Back projectors} +\end{center} +\end{figure} + +This hierarchy is uses the registry mechanism discussed in section +\ref{sect:registries}. + +\subsubsection{ +ProjMatrixByBin hierarchy} + +This is a base class for row-wise access to the projection matrix $P_{bv}$. +This class provides 2 essential mechanisms aside from the virtual +functions that will be used to get the row of the matrix: +\begin{itemize} +\item +It can cache the elements of the projection matrix. This caching +is obviously useful if you can store the part of the matrix that +you need in memory (for instance, a slave might not need the +whole matrix). However, even if you cannot store the whole matrix, +most algorithms need access to a subset of these elements more +than once (for instance, OSEM would need them for forward projecting +and for back projecting). Caching can be disabled. +\item +The application of symmetries is provided at base-class level: +the derived classes do not have to bother about this, and can +concentrate on computing the 'independent' part of $P_{bv}$. +\end{itemize} + + +At the moment, we have two derived classes: +\begin{itemize} +\item +\textit{ProjMatrixByBinUsingRayTracing} uses essentially the same +implementation as \textit{ForwardProjectorByBinUsingRayTracing}, but +returns the row of the projection matrix. However, because symmetries +are not handled 'in-line', and elements need to be stored, using +a \textit{ProjMatrixByBinUsingRayTracing} object for forward projection +is not as efficient as using \textit{ForwardProjectorByBinUsingRayTracing}. +\item +\textit{ProjMatrixByBinFromFile} handles the case where the projection +matrix is stored on disk [not distributed yet]. Because of the +support provided by \textit{ProjMatrixByBin}, only the 'independent' +part of the projection matrix needs to be stored. Our current +implementation does not yet provide a very compact format for +storing the elements (although they are of course stored sparsely). +\end{itemize} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[bb = 0 0 407 79, scale=0.52]{graphics/STIR-developers-overviewFig12} +\caption{Projection matrix classes} +\end{center} +\end{figure} + +This hierarchy uses the registry mechanism discussed in section +\ref{sect:registries}. + + +\subsubsection{ +ProjMatrixElementsForOneBin } + +This class provides sparse storage for a row of the projection +matrix. It has methods to access the data using an STL-style +iterator (which is essentially a generalised pointer). This means +that the actual way to store the data is hidden from the user. +In principle, this format could be very compact, or alternatively +very efficient. At the moment, we provide a format that is somewhere +in between. For instance, image indices are not stored incrementally, +as although it would allow very compact storage, it is detrimental +for speed. + +\subsection{Objective functions} +Many iterative (reconstruction) algorithms can be formulated in terms +of an objective function, which is the algorithms tries to +maximise (or minimise). Since STIR 2.0, this is implemented +as a class hierarchy based on \texttt{GeneralisedObjectiveFunction}, +where we use the convention that the objective function is maximised. + +Some iterative algorithms use an 'objective function' only in a +loose sense. They might for instance allow generalisations +which no longer optimise a function. For example in the case +of EMML with non-matching forward and back projectors, the 'gradient' +that is computed is generally not the gradient of the +log-likelihood that corresponds to the forward projector. +However, one hopes that it still points towards the optimum. +The corresponding objective function is implemented in the class +\texttt{PoissonLogLikelihoodWithLinearModelForMeanAndProjData}. + +There can be different objective function that use common operations. +For instance, the objective function could implement a least squares +criterion, or a Poisson log-likelihood. Both of these have a model +for the mean of the measured data (given an image). Generally speaking, +STIR implements those common operations using a separate class. +As an example, projection operations are implemented via a pointer to a +\texttt{ProjectorByBinPair}, which in itself is a small +class hierarchy using either a \texttt{ProjMatrixByBin} object, +or a \texttt{ForwardProjectorByBin/BackProjectorByBin} pair. + +Often, one includes a penalty (or prior) in the objective function +(see doxygen documentation for the class \texttt{GeneralisedPrior}). +The penalty is expected to be a function that increases with higher +penalty, so it will be \textit{subtracted} +from the unregularised case. + +See the doxygen documentation \texttt{GeneralisedObjectiveFunction} for +more details. + +\subsection{ +Reconstruction classes} + +The final ingredient for performing reconstructions is the reconstruction +algorithm itself. We also have a hierarchy for this, as many +iterative algorithms are similar, and differ only in some minor +steps. We do not discuss the actual 'leaves' of the Reconstruction +tree here. +\\ +The tree starts at the abstract Reconstruction base class. Classes +ending in ``\textit{Reconstruction}'' are abstract base classes for +a family of algorithms. Classes including the name of an algorithm +are concrete ones whose principal purpose is to implement the +reconstruction method of the algorithm. + +Certain algorithms will only work with particular objective functions, +while others (such as gradient ascent) might work with arbitrary +objective functions. + +This arrangement gives the users +of the library a flexible range of implementation choices, allowing +them to experiment with new algorithms and new variations of +old ones with minimal coding effort. + +The \texttt{Reconstruction} hierarchy is (since STIR 2.0) templated in +\texttt{TargetT}. This is the type of the output, i.e. normally +the image type. Templating this type gives flexibility to have +different output-types, such as parametric images or even +normalisation factors. + +\section{ +Parsing from text files (or strings)\label{sect:parsing}} +Many STIR classes are based on the \texttt{ParsingObject} class, and hence +are able to +\begin{itemize} +\item +ask the parameters to the user interactively +\item +read the parameters from an Interfile-style file +\item +return parameter info such that an Interfile-style input file +can be created from the current set of parameters. +\end{itemize} + +In the simplest case, the only thing you need to do is to add the variables +and keywords to the keymap. All functionality will then follow. See the +following example. + +\begin{verbatim} + class A : public ParsingObject + { + private: + typedef ParsingObject base_type; + + int number; float a; + + void initialise_keymap() + { + base_type::initialise_keymap(); + this->parser.add_start_key("My Class Parameters"); + this->parser.add_key("number", &number); + this->parser.add_key("width", &a); + this->parser.add_stop_key("END My Class Parameters"); + } + + void set_defaults() + { + base_type::set_defaults(); + // specify defaults for the parameters in case they are not set. + number = 1; + a = 2.4F; + } + }; + + int main(int argc, char **argv) + { + A a; + // parse a file (first argument on the command line) + a.parse(argv[1]); + // list them back to cout + std::cout << a.parameter_info(); + return EXIT_SUCCESS; + } +\end{verbatim} + +Check the doxygen documentation for +\texttt{ParsingObject}. + +\section{ +IO \label{sect:IO}} + +\subsection{Images} +For images, output file formats and (since version 2.0) input file format are represented +by objects as well, as instantiations of classes derived from +\texttt{OutputFileFormat} and \texttt{InputFileFormat} respectively. All of +the file formats supported by STIR are stored in registries (see section \ref{sect:registries}). + +Currently recommended way to read an image is as follows: +\begin{verbatim} + typedef DiscretisedDensity<3,float> DataType ; + std::auto_ptr density_aptr = read_from_file(filename); +\end{verbatim} +You will have to include \texttt{stir/IO/read\_from\_file.h} for this to work. The function +\texttt{read\_from\_file} will open the file, read an initial block of data, check +if that corresponds to the signature of any of the file formats in the +default registry, and use the first matching file format to read the data. + +For output, you can use +\begin{verbatim} + typedef DiscretisedDensity<3,float> DataType ; + shared_ptr output_format_sptr = + OutputFileFormat::default_sptr(); + output_format_sptr->write_to_file(filename, density); +\end{verbatim} +You will have to include \texttt{stir/IO/OutputFileFormat.h} for this to work. +Currently, the default output file format in STIR is Interfile (see the User's Guide). + +At present, STIR does not provide a way to open an image file for reading and writing. +Patient/study information etc is currently ignored. More dangerously, image orientation +as well. + +It is relatively straightforward to add a new file format by deriving a new class +from \texttt{InputFileFormat} (for input), and adding that to the default registry +(see section \ref{sect:registries} for more details). + +\subsection{Numerical arrays} +There are some functions to read/write numerical vectors/arrays from +file. Check \texttt{stir/IO/read\_data.h} (and \texttt{write\_data.h}) for +binary IO, and \texttt{stir/stream.h} for text-based IO. + +\subsection{Projection data} +At present, there is no registry yet for file formats of projection data. For reading, use +\begin{verbatim} + shared_ptr proj_data_sptr = ProjData::read_from_file(filename); +\end{verbatim} +This has an optional argument for read/write access to the file. + +For writing, you could use +\begin{verbatim} + ProjDataInterfile proj_data(proj_data_info_sptr, filename); +\end{verbatim} +We currently have no easy way to copy all data across from one \texttt{ProjData} +object to another. You will have to write an explicit loop over segments. + +\subsection{Dynamic or gated data} +STIR 2.0 does not provide any direct facilities for reading 4D data (aside from +the ECAT conversion utilities). Basic support should come in version 2.1. +In the mean time, there is some preliminary functionality via the +\texttt{TimeFrameDefinitions} class and the \texttt{get\_time\_frame\_info} +utility. + +\section{ +Registries of classes \label{sect:registries}} + +Several class hierarchies in STIR keep a registry of all \textit{leaf} +derived classes (i.e. classes at the end of the hierarchy). This +registry allows the user to select \textit{at run-time} which image +processor, projector, matrix, output file format etc. (s)he +wants to use. It is fairly easy to add your own leaf class to +the hierarchy such that it will be added to the registry\textit{.} How +to do this needs more documentation, but see the doxygen +documentation of classes \textit{RegisteredObject} and \textit{RegisteredParsingObject.} +\\ +The recommended way to add your own class (as always) is to take +a look at an existing leaf in the hierarchy, copy the files and +change what you need. Also make sure you new class gets linked +in by adding it to one of the *registries.cxx files. +\\ +See also section \ref{sect:extendingSTIR}. + + + +\section{ +Using class hierarchies \label{sect:classhierarchies}} + +The main strength of object-oriented programming is that you +can write code that is as generic as possible\footnote{{In C++, +another very powerful way to write generic code are templates. +But you will have to read about those somewhere else.}}. In STIR, +we have tried to use this feature as much as possible (although +there are still remaining generalisations to be implemented). +This works by having a base class and a bunch of derived classes. +Examples of class hierarchies are given above. The question is +however how you use these hierarchies. Some attempt is given +here to answer this, but of course, for serious work, you really +should read a good C++ book.\\ +We will use the DiscretisedDensity hierarchy as an example, but +the same holds for nearly all other hierarchies in STIR (or indeed +C++). In addition, you will see some templates being used.\\ +\textbf{Rule 1}: You should try to write your code using the type +of the base-class. If this is not possible, use a class as close +to the base-class as you can.\\ +\textbf{Example}: If you have a function that manipulates images, +write it in terms of DiscretisedDensity, not of VoxelsOnCartesianGrid.\\ +\textbf{Rule 2}: Pass references or smart pointers as arguments of +functions. Use references if you can (such that your code would +work for any type of pointer). Never (or almost never) return +references, but return smart pointers (or a const pointer to +an object that is guaranteed to stay alive long enough).\\ +\textbf{Example}: + +\begin{verbatim} +template +shared_ptr< DiscretisedDensity > +do_something(const DiscretisedDensity& density1, + const DiscretisedDensity& density2); +\end{verbatim} + + +This is necessary, as you generally cannot construct an object +of the type of the base-class. Similarly, it is impossible to +copy an object of a base-class. This is solved by using the \textit{virtual +copy constructor} idiom: + +\begin{verbatim} +shared_ptr< DiscretisedDensity<3,float> > new_density_sptr = + density.clone(); +\end{verbatim} + +This constructs an object of the same type as the given density.\\ +Of course, many functions do need to know the actual type of +the parameters, either because they can work with only one type +(for instance, ForwardProjectorByBinUsingRayTracing handles only +VoxelsOnCartesianGrid), or because the processing will be different +for different types. This can be solved by using C++ Run Time +Type Information (RTTI), preferably in the form of dynamic\_cast. + +\begin{verbatim} +template +void f(DiscretisedDensity<3, elemT>& density) +{ + VoxelsOnCartesianGrid * voxels_ptr = + dynamic_cast< VoxelsOnCartesianGrid * > (&density); + if (voxels_ptr == NULL) + error("f: can only handle images of type VoxelsOnCartesianGrid\n"); + ... +} +\end{verbatim} + + +Note that dynamic\_cast of pointers allows easy checking if the +types matched. When using references, a non-matching type will +cause an exception to be thrown. There currently is no code in +STIR using/catching exceptions, so if you do not catch the exception +yourself, your program will abort mysteriously. + +\section{ +Extending STIR with your own files \label{sect:extendingSTIR}} + +If you want to add your own files to the libraries, or have your +own main programs, you can of course set-up your own directory +and +\begin{itemize} +\item +make sure that your compiler finds the STIR include files in \textbf{STIR/include} +\item +make sure that you link with \textbf{STIR/opt/libstir.a} (replace \textbf{opt} +with whatever value you used for the \textit{DEST} option of make) +\item +make sure that you link with the *\_registries +\end{itemize} + +All of this is made easier by using + + +{\small make install-all INSTALL\_PREFIX=/my/favorite/location} + + +Nevertheless, wipping up your own makefile is slightly painful, +so we provide the following alternative. \\ +Put all your files in (subdirectories of) \textbf{STIR/local} (the distribution +will never contain any files in that directory)\\ +Create a file \textbf{STIR/local/extra\_dirs.mk} containing a list +of your subdirectories (see \textbf{STIR/samples/local/} for an example). +This file (if it exists) will be imported by \textbf{STIR/Makefile}. +Put in each of your subdirectories one or more files called \textbf{lib.mk}, \textbf{exe.mk}, \textbf{test.mk} +which list all files you want to compile. These files have to +be in a specific (but simple) format. The easiest way to do this +is to copy for instance \textbf{buildblock/lib.mk}, \textbf{utilities/exe.mk}, \textbf{test/test.mk} +and change the list of filenames. \\ +The result will be that, when you use the relevant \textit{make} command +in the \textbf{STIR} directory, +\begin{itemize} +\item +all your files listed in one of the \textbf{lib.mk} will be included +in \textbf{libstir.a} +\item +all your executables will be build and/or installed +\item +all your test programs will be run +\end{itemize} + + + +\section{ +Conclusion} + +In many cases, a reconstruction algorithm does not have to know +about the type of the image it gets. In our set-up this means +it can/should be implemented in terms of a \textit{DiscretisedDensity} +object, and \textit{ForwardProjectorByBin} and \textit{BackProjectorByBin} +objects (or \textit{ProjMatrixByBin} object). This means that once +for instance EM is implemented, it can be used on voxels, blobs, +different grids etc. without having to rewrite the algorithm +itself (of course, the projectors do depend on the actual type +of image, so you would have to write those).\\ +The STIR library allows maximal code re-use when implementing +new functionality. Its structure and its documentation features +make it into a unique resource for the PET community. + +\end{document} diff --git a/documentation/STIR-general-overview.tex b/documentation/STIR-general-overview.tex new file mode 100644 index 0000000000..0bc823e932 --- /dev/null +++ b/documentation/STIR-general-overview.tex @@ -0,0 +1,600 @@ +%&LaTeX +\batchmode +\documentclass{article} +\usepackage{setspace} +\usepackage{graphicx} +\usepackage{hyperref} +\def\R2Lurl#1#2{\mbox{\href{#1}{\tt #2}}} +\newcommand{\tab}{\hspace{5mm}} + + +\begin{document} + + +\begin{center} + +\begin{spacing}{1.5} +\textbf{{\huge STIR \\ +General Overview}}\\ +\textbf{Kris Thielemans}\\ +\textbf{\textit{version 2.3}} + + +\end{spacing} + +\end{center} + +\tableofcontents +%\section{Contents} +%\begin{itemize} +%\item Overview +%\item A bit more detail on the library +%\item Reconstruction algorithms currently distributed +% \begin{itemize} +% \item Ordered Subsets Maximum A Posteriori using the One Step Late algorithm +% \end{itemize} +%\item Optimisation +%\item Software testing strategy +%\item Currently supported systems +% \begin{itemize} +% \item Computing platforms +% \begin{itemize} +% \item Serial versions of algorithms +% \item Parallel versions of algorithms +% \end{itemize} +% \item Compilers +% \item PET scanners +% \item File formats +% \end{itemize} +%\item References +%\end{itemize} + + +\section{ +Disclaimer} +Many names used below are trademarks owned by various companies. They are +is fully acknowledged, but not explicitly stated. + +\section{ +Overview} + +STIR (\textit{Software for Tomographic Image Reconstruction}) is Open +Source software (written in C++) consisting of classes, functions +and utilities for 3D PET image reconstruction, although it is +general enough to accommodate other imaging modalities. An overview +of STIR 2.x is given in [Thi12], which you ideally refer to in your paper. + +STIR consists of 2 parts. +\begin{itemize} +\item +A library providing building blocks for image and projection +data manipulation and image reconstruction. +\item +Applications using this library including basic image manipulations, +file format conversions and of course image reconstructions. +\end{itemize} + +The library has been designed so that it can be used for many +different algorithms and scanner geometries. The library contains +classes and functions to run parts of the reconstruction in parallel +on distributed memory architectures, although these are not distributed +yet. This will enable the software to be run not only on single +processors, but also on massively parallel computers, or on clusters +of workstations. \\ +STIR is portable on all systems supporting the GNU C++ compiler +or MS Visual C++ (or hopefully any ANSI C++ compliant compiler). +The library is fully documented.\\ +The object-oriented features make this library very modular and +flexible. This means that it is relatively easy to add new algorithms, +filters, projectors or even a different type of image discretisation. +It is even possible to select at run-time which version of these +components you want to use.\\ +The software is \textbf{freely available} for downloading under the +GNU LPGL (the library) or GNU GPL (the applications) license, +see the 'Registration' section of our web-site. \\ +\textbf{It is the hope of the collaborators of the STIR project that +other researchers in the PET community will use this library +for their own work, extending it and making their work available +as well.} Please subscribe to some of our mailing +lists if you are interested. \\ +In its current status, the software is mainly a research tool. +It is probably not friendly enough to use in a clinical setting. In any +case, \textbf{STIR should not be used to generate images for diagnostic +purposes}, as there is no warranty, and most definitely no FDA approval + + + + +\section{ +A bit more detail on the library} + +The STIR software library uses the object-oriented features of +C++: + +\begin{itemize} + +\item self-contained objects hide implementation details from the user +(\textit{encapsulation}); +\item specialisation of concepts is implemented with hierarchies +of classes (\textit{inheritance}); +\item conceptually identical operations are implemented using +functions with identical names (\textit{polymorphism}). +\end{itemize} + +The building block classes included in this library are as follows: + +\begin{itemize} +\item information about the data (scanner characteristics, study type, +algorithm type, etc.); +\item multi-dimensional arrays (any dimension) with various +operations, including numeric manipulations; +\item reading and writing (I/O) data in Interfile format (for +which a 3D PET extension is proposed), reading of GE Advance +sinogram data, limited reading and writing of ECAT6 and ECAT7 +and conversion between ECAT6 and Interfile; +\item classes of projection data (complete data set, segments, +sinograms, viewgrams) and images (2D and 3D); +\item various filter transfer functions (1D, 2D and 3D); +\item forward projection and backprojection operators; +\item classes for sparse projection matrices, both for on-the-fly +computation and pre-stored; +\item trimming and zooming utilities on projection and image +data; +\item classes for scatter estimation +\item classes for normalisation and attenuation correction +\item classes for iterative reconstruction algorithms; +\item some classes for kinetic modelling and parametric imaging +\item stream-based classes for message passing between different +processes, built on top of MPI +\end{itemize} + +Examples of hierarchies are given in the following figures: +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=5.667in, height=1.137in]{graphics/STIR-general-overviewFig1} +\caption{Current hierarchy for back projectors.} +\end{center} +\end{figure} + + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=4.100in, height=2.984in]{graphics/STIR-general-overviewFig2} +\caption{Current image hierarchy} +\end{center} +\end{figure} + +These figures are extracted from the documentation which is available +in HTML, LaTeX and PDF. This documentation is generated automatically +from the source files of the library using the \R2Lurl{http://www.doxygen.org/ }{doxygen} +tool. This means that it requires minimal effort to keep the +documentation up-to-date. + +The advantages of such a library are (a) modularity and flexibility +of the reconstruction building blocks to implement new reconstruction +algorithms, (b) possibility to compare analytic and iterative +methods within a common framework, (c) the possibility to use +the same software implementation of the building blocks to perform +image reconstruction on different scanner geometries and (d) +independence of the computer platform on which the software runs. + + + +\section{ +Reconstruction algorithms currently distributed} + +\subsection{FBP} +Optionally with SSRB first. + +\subsection{3DRP} +The 3DRP [Kin89] algorithm is often considered the 'reference' +algorithm for 3D PET. It is a 3D FBP algorithm which uses reprojection +to fill in the missing data. + +\subsection{ +Ordered Subsets Maximum A Posteriori using the One Step Late +algorithm} + +The Expectation Maximization (EM) algorithm [She82] as well as +its accelerated variant OSEM (Ordered Set Expectation Maximization) +[Hud94] are iterative methods for computing the maximum likelihood +estimate of the tracer distribution based on the measured projection +data. Their benefits have been examined in various reports. Notably, +it has been found (e.g. [Rea98b]) that 3D OSEM can produce images +of higher quality, in terms of both resolution and contrast, +than analytic algorithms of common commercial use such as the +reprojection (3DRP) algorithm [Kin89]. + +One drawback of OSEM is its tendency to develop noise artefacts +with increasing iterations. As a remedy, various modifications +of the image updating mechanism have been investigated for EM +and OSEM to drive the image estimate sequence toward a smoother +limit. These include the addition of a smoothing step between +iterations (e.g. [Sil90]) and Bayesian methods which incorporate +prior information about the smoothness of the object to be reconstructed +(e.g. [Gem84], [Heb89]). + + +\begin{spacing}{1.5} +\textit{Filtering} + + +\end{spacing} + +Different types of filtering strategies are possible (and implemented +in STIR). Post-filtering is the most common choice. Inter-iteration +filtering filters the image after every (sub)iteration, or at +a lower frequency. It probably was poineered in [Sil90] for EMML +where it was called Expectation Maximisation Smoothing (EMS). +Inter-update filtering is similar. Forward +projection of the current image iterate is done first in order to +compute the usual ML-EM image of multiplicative weights. These weights are +then applied to a filtered version of this image to generate the next +iterate, for further details see [Jac99].\\ +See [Sli98] for a comparison between post- and inter-iteration +filtering, where it is claimed that both give similar results. +[Mus01a],[Mus01b] discusses resolution properties of EMS and +shows that it can generate resolution which is object-dependent. + + + +\begin{spacing}{1.5} +\textit{Maximum A Posteriori (Bayesian)} + + +\end{spacing} + +Bayes theorem allows the introduction of a prior distribution +into the reconstruction process that describes properties of +the unknown image. Maximisation of this \textit{a posteriori} probability +over a set of possible images results in a MAP estimate. Priors +may be added one by one into the estimation process, assessed +individually, and used to guarantee a fast working implementation +of preliminary versions of the algorithms [LAL93], [LAN90]. + +Markov Random Fields (MRF) are used to describe the relationship +between adjacent pixels. Gibbs Random Fields (GRF) represent +a subset of MRFs which originate from statistical physics, where +the problem is to estimate large scale properties of a lattice +system from its local properties. Hence, the Bayesian model can +utilise a Gibbs prior to describe the spatial correlation of +neighbouring regions as was first suggested by Geman et al. in +1984 [GEM84]. The Gibbs prior is controlled by three parameters: +one determines the overall weight placed on the prior in the +reconstruction process, the two others affect the relative smoothing +of noise versus edges in the reconstructed image estimates. Their +derivative will act as a penalty term that enforces conditions +required by the prior. + +The STIR executable OSMAPOSL allows to run a MAP algorithm +known as the One Step Late [Gre90] modification of MLEM obtained +by multiplying the ML-EM equation by a factor that uses the derivative +of an \textit{energy function}. This algorithm works fine +for small weights of the prior term, however becomes unstable +for larger values. + +As prior we currently only distribute the ``quadratic penalty'', i.e. a +Gibbs prior with a qudratic potential function, and a generalisation of the +Median Root prior (MRP) [Ale97]. In the MRP case, the assumption +is that the desired image is locally monotonic, and that the +most probable value of the pixel is close to the local median. +MRP has shown very interesting properties in terms of noise reduction, +quantitative accuracy, and convergence, see [Bett01]. Our (obvious) +generalisation consists in allowing to use other filters than +the Median. Other priors can easily be added with some coding. + + +\subsection{OSSPS} +An implementation of OSSPS [Ahn03] is included since STIR version 2.1. +This algorithm is designed for penalised reconstruction (MAP). When used +with a decreasing relaxation constant, it is theoretically convergent [Ahn03]. +In practice, it works best when initialised fairly close to the final solution, +and when a non-zero background term (e.g. randoms or scatter) is present. + +As OSSPS is implemented using the same framework as OSMAPOSL, it is possible +to use inter-iteration filtering for OSSPS. Interestingly, +[Mus01a],[Mus01b] showed that when used with spatially uniform filtering, +this algorithm has nearly object-independent +resolution properties, in contrast to EMS. + +\subsection{Other} + +We distribute an implementation of FORE [Def97]. It is an efficient +rebinning algorithm to reduce the data-size from 3D-PET to 2D-PET. + +PARAPET code for +Ordered Subsets Conjugate Barrier (OSCB) [Mar99] exists but needs +a bit of work to convert to STIR. Please let us know if you +want to help. + +With respect to dynamic and gated imaging +techniques, we have direct estimation of Patlak +parameters [Tso08] (using Parametric OSMAPOSL or OSSPS). +We plan to release motion compensated image reconstruction [Thi06] as +implemented by Tsoumpas et al [Tso11]. + +\section{ +Optimisation} + +Optimisation of the implementation for any particular hardware +architecture or intercommunication topology is not attempted +in STIR. Therefore the main goals of optimisation and parallelisation +were: +\begin{itemize} +\item to allow evaluation of the reconstruction algorithms to be +carried out within a reasonable time frame; indeed, the parallel +versions of the reconstruction algorithms have been extensively +used during algorithm evaluation; +\item to improve clinical usability of the results of the project; +this has been achieved by providing parallel implementations +of the algorithms that allow clinicians to run the selected variety +of reconstruction algorithms even for very large PET-scanners +on MIMD-parallel systems without any knowledge of parallel computing. +\end{itemize} + + +\section{ +Software testing strategy} + +As the STIR software library is quite extensive, it was essential +to test its components separately. Due to its modular design, +it was possible to have a fairly comprehensive test strategy. + +Nearly all basic building blocks have their own test class, checking +a lot of test cases. Running of these tests is fully automated. + +The projectors have in a first stage been tested interactively. +For the forward projector this consisted in forward projecting +various images and comparing with the known result. Results were +also compared with an independent implementation of a ray-tracing +forward projection. For the interpolating backprojector the test +which revealed most problems was to backproject uniform data, +as this should give (locally) uniform images. The resulting image +was also calculated analytically and compared with the building +blocks result. Finally, different groups of symmetry were used, +cross-checking different parts of the code. Once these tests +confirmed properly working projectors, our main strategy consisted +in checking results of new versions with the established results. + +Aside from these checks, all algorithms can run in a debugging +mode where assertions check consistency and validity. + +Finally, the web-site also provide the \texttt{recon\_test\_pack}. +The distributed script contains consistency checks on the reconstruction +(forward simulation followed by reconstruction with various algorithms) and +a number of data-sets and expected end-results. + + +\section{ +Currently supported systems} + +These are the systems we tested our software on. We think that +it will work in other cases as well with minor tuning. Experience +will tell\dots + + + +\subsection{ +Computing platforms} + + +\subsubsection{ +Serial versions of algorithms} +A lot of STIR was developed kust before 2000. Therefore, the code +contains in various places work-arounds for deficient C++ compilers +(e.g. GNU g++ 2.95.2 or Microsoft Visual C++ 6.0 service pack 3). +However, we are no longer +testing STIR on such older systems. It might be possible to revive this, +but we strongly recommend that you get a recent compiler instead. +\begin{itemize} +\item +Intel based PCs using Windows XP or higher (NT probably still works if you +find a compiler for it). These were tested with Microsoft Visual C++ 2003, 2005 up to +Visual Studio 2010, +and various GNU g++ versions (up to at least 4.5.3) via CYGWIN (http://cygwin.com). +\item +Linux using GNU g++ (from 3.5 to 4.6). +Intel's C++ compiler 12.1.0 works fine (tested on Linux), older versions had some problems with the Fourier transform code but the reconstruction itself was fine. +\item +MacOS using GNU g++. +\end{itemize} +However, people run STIR on various other systems, including Solaris. Please +check the mailing lists. + +\textbf{Warning}: +We currently have a problem +in the incremental backprojection routines due to different rounding +of floating point calculations on Sparc, HP and Opteron processors. +Thanks to a fix of Bing Bai this problem might have disappeared on your processor, but it is still there on recent 64-bit processors. +You will find out if this problem still exists when you run the +recon\_text\_pack available on the STIR web-site. Please let us know. +See the User's Guide for how to use another backprojector. + + +\subsubsection{ +Parallel versions of algorithms} +\begin{itemize} +\item a parallel version of \texttt{OSMAPOSL} and \texttt{OSSPS} using MPI +\item a threaded version of FBP2D using OPENMP, but for most systems, there is no performance gain. +\end{itemize} + + + + +\subsection{ +PET scanners} +\begin{itemize} +\item +GE Advance, Discovery LS, Discovery ST, Discvoery STE, Discovery RX, +Discovery 600 +\item +PRT-1 +\item +ECAT 921, 931, 953, 951, 962, 966 (and most other ECAT systems) +\item +HRRT apparently works as well +\item Philips Allegro (using its convention of having a ``virtual'' extra crystal to cover the gaps). +\end{itemize} + +Other cylindrical PET scanners can easily be added. This can be done +without modifying the code (see the Wiki). + + +\subsection{ +File formats} +\begin{itemize} +\item +An extension of the Interfile standard (see the ''Other info'' section of the STIR website.) +\item +The commercial AnalyzeAVW library from the BIR, Mayo University, can be used +to read images via a conversion utility. +\item +GE Advance VOLPET sinogram format, but for reading only (with +very limited support for the header). If you have a research contract with GE, +you might be able to get a STIR extension to read Discovery ST, STE and RX data in both +VOLPET and RDF format. +\item +ECAT 7 matrix format for reading only (for reading multiple +frames/gates, an Interfile +header has to be created using a utility we provide). Single +frame/gate/bed images can be directly read or written. Single +frame/gate/bed sinograms can be directly read. +However, this file format needs the ECAT Matrix library (developed +previously by M. Sibomana and C. Michel at Louvain la Neuve, Belgium). +This library is no longer maintained however. +\item +ECAT 6 matrix format was supported in previous version of STIR, but +is currently broken on some systems (probably due to a bug in the ECAT +MATRIX library for ECAT 6). ECAT6 was supported by using conversion +utilities to and from +Interfile. Single frame/gate/bed images could be directly read +or written. +\end{itemize} + +See the User's Guide for more detail on the supported file formats.\\ +In addition, a separate set of classes is avalailable +to read list-mode +data. Only a few scanners are currently supported (such as the +ECAT HR+ and HR++), although it should not be too difficult to +add your own (if you know the list-mode file format!). + + + +\section{ +References} + +{[}Ale97{]} Alenius S and Ruotsalainen U \textbf{(1997)} Bayesian image +reconstruction for emission tomography based on median root prior. \textit{European +Journal of Nuclear Medicine} , Vol. 24 No. 3: 258-265.\\ +{[}Ahn03{]}S. Ahn, J. A. Fessler. \textbf{2003} +Globally convergent image reconstruction for emission tomography using relaxed ordered subsets algorithms. +\textit{IEEE Trans. Med. Imag.}, 22(5):613-626. \\ +{[}Bar97{]} Barrett H, White T and Parra L C \textbf{(1997)} List mode +likelihood. \textit{J. Opt. Soc. Am.}, A 14: 2914-2923.\\ +{[}Ben99a{]} Ben-Tal A, Margalit T and Nemirovski A \textbf{(1999)} The +ordered subsets mirror descent optimization method with application +to tomography. \textit{Research report \#2/99, March 1999, MINERVA +Optimization Center, Faculty of Industrial Engineering and Management, +Technion -- Israel Institute of Technology}.\\ +{[}Ben99b{]} Ben-Tal A and Nemirovski A \textbf{(1999)} The conjugate +barrier method for non-smooth, convex optimization. R\textit{esearch +report \#5/99, October 1999, MINERVA Optimization Center, Faculty +of Industrial Engineering and Management, Technion -- Israel Institute +of Technology.}\\ +{[}Bett01{]} V. Bettinardi, E. Pagani, M. C. Gilardi, S. Alenius, +K. Thielemans, M. Teras and F. Fazio \textbf{(2001)}, Implementation +and evaluation of a 3D one-step late reconstruction algorithm +for 3D positron emission tomography brain studies using median +root prior, \textit{Eur. J. Nucl. Med, in press.}\\ +{[}Dau86{]} Daube-Witherspoon M E and Muehllener G \textbf{(1986)} An +iterative space reconstruction algorithm suitable for volume +ECT. \textit{IEEE Trans. Med. Imaging}, vol. MI-5: 61-66.\\ +{[}Def97{]} Defrise M, Kinahan P E, Townsend D W, Michel C, Sibomana +M and Newport D F \textbf{(1997)} Exact and approximate rebinning +algorithms for 3-D PET data. \textit{IEEE Trans. Med. Imag}ing, MI-16: +145-158.\\ +{[}Gem84{]} Geman S and Geman D \textbf{(1984)} Stochastic relaxation, +Gibbs distributions, and the Bayesian restoration of images. \textit{IEEE +Trans PAMI}, 6: 721-741.\\ +{[}Gem85{]} Geman S. and McClure D \textbf{(1985)} Bayesian image analysis: +an application to single photon emission tomography. \textit{in Proc. +American Statistical Society, Statistical Computing Section (Washington, +DC)} 12-18.\\ +{[}GEMS{]} General Electric Medical Systems homepage {\underline {http://www.gems.com}}.\\ +{[}Gre90{]} Green P J \textbf{(1990)} Bayesian reconstruction from emission +tomography data using a modified EM algorithm. \textit{IEEE Trans. +Med. Imaging}, MI-9: 84-93.\\ +{[}Heb89{]} Hebert T J and Leahy R M \textbf{(1989)} A generalized EM +algorithm for 3-D Bayesian reconstruction from Poisson data using +Gibbs priors. \textit{IEEE Trans. Med. Imaging}, MI-8: 194-202.\\ +{[}Her80{]} Herman G T \textbf{(1980)} Image Reconstruction from Projections: +The fundamentals of Computational Tomography. \textit{Academic Press, +New York}.\\ +{[}Hud94{]} Hudson H M and Larkin R S \textbf{(1994)} Accelerated image +reconstruction using ordered subsets of projection data. \textit{IEEE +Trans. Med. Imaging}, MI-13: 601-609.\\ +{[}Jac99{]} Jacobson M, Levkovitz R, Ben-Tal A, Thielemans K, Spinks +T, Belluzzo D, Pagani E, Bettinardi V, Gilardi M C, Zverovich +A and Mitra G \textbf{(1999)} Enhanced 3D PET OSEM Reconstruction +using inter-update Metz filters. in Press in \textit{Phys. Med. Biol.}\\ +{[}Kin89{]} Kinahan P E and Rogers J G \textbf{(1989)} Analytic 3D image +reconstruction using all detected events. \textit{IEEE Trans. Nucl. +Sci.}, 36: 964-968. \\ +{[}Lal93{]} Lalush D S and Tsui M W \textbf{(1993)} A general Gibbs prior +for Maximum a posteriori reconstruction in SPET. \textit{Phys. Med. +Biol.}, 38: 729-741.\\ +{[}Lan90{]} Lang K \textbf{(1990)} Convergence of EM Image reconstruction +algorithms with Gibbs smoothing. \textit{IEEE Trans. Med. Imaging}, +MI-9: 4.\\ +{[}Mus01a{]} S. Mustafovic, K.Thielemans, D. Hogg and P. Bloomfield \textbf{(2001)} +\textit{Object Dependency of Resolution and Convergence Rate in OSEM +with Filtering,} proc. of 3D-2001 conference.\\ +{[}Mus01b{]} S. Mustafovic, K.Thielemans, D. Hogg and P. Bloomfield \textbf{(2001)} \textit{Object +Dependency of Resolution and Convergence Rate in OSEM with Filtering}, +proc. of IEEE Medical Imaging Conf. 2001.\\ +{[}Mar99{]} Margalit T, Gordon E, Jacobson M, Ben-Tal A, Nemirovski +A, Levkovitz R \textbf{(1999)} The ordered sets mirror descent and +conjugate barrier optimization algorithms adapted to the 3D PET +reconstruction problem. Submitted to \textit{IEEE Trans. Med. Im.}aging.\\ +{[}Nem78{]} Nemirovski A and Yudin D \textbf{(1978)} Problem complexity +and method efficiency in optimization. \textit{Nauka Publishers, +Moscow, 1978 (in Russian); English translation: John Wiley \& +Sons, 1983}.\\ +{[}Rea98a{]} Reader A J, Erlandsson K, Flower M A and Ott R J \textbf{(1998)} +Fast accurate iterative reconstruction for low statistics positron +volume imaging. \textit{Phys. Med. Biol.}, 43: 835-846.\\ +{[}Rea98b{]} Reader A J, Visvikis A, Erlandsson K, Ott R J, and Flower +M A \textbf{(1998)} Intercomparison of four reconstruction techniques +for positron volume imaging with rotating planar detectors. \textit{Phys. +Med. Biol.}, 43: 823-34.\\ +{[}She82{]} Shepp L A and Vardi Y \textbf{(1982)} Maximum likelihood reconstruction +for emission tomography. \textit{IEEE Trans. Med. Imaging}, 1: 113-122.\\ +{[}Sil90{]} Silverman B W, Jones M C, Wilson J D, and Nychka D W \textbf{(1990)} +A smoothed EM approach to indirect estimation problems, with +particular reference to stereology and emission tomography. \textit{J. +Roy. Stat. Soc}., 52: 271-324.\\ +{[}Sli98{]} Slijpen E T P, Beekman F J \textbf{(1998)} Comparison of post-filtering +and filtering between iterations for SPECT reconstruction. \textit{in +Proc. IEEE Nucl. Sci. Symp. and Med. Imaging Conf.}, 2: 1363-6.\\ +{[}Thi06{]} Thielemans, K., Manjeshwar, R. M., Xiaodong T., and Asma E. +\textbf{(2006)}, Lesion detectability in motion compensated +image reconstruction of respiratory gated PET/CT. \textit { 2006 IEEE +Nuclear Science Symposium and Medical Imaging Conference} 3278-3282. +{[}Thi99{]} Thielemans K, Jacobson M W, Belluzzo D \textbf{(1999)} On +various approximations for the projectors in iterative reconstruction +algorithms for 3D-PET. \textit{in Proceedings of the 3D99 Conference, +Egmond Aan Zee}, (June 1999): 232-235. +[Thi12] Kris Thielemans, Charalampos Tsoumpas, Sanida Mustafovic, Tobias Beisel, Pablo Aguiar, Nikolaos Dikaios, and Matthew W Jacobson, +\textit{STIR: Software for Tomographic Image Reconstruction Release 2}, +Physics in Medicine and Biology, 57 (4), 2012 pp.867-883. +{[}Tso08{]} Tsoumpas C, Turkheimer F E, Thielemans K \textbf{(2008)}, +Study of direct and indirect parametric estimation methods of linear +models in dynamic positron emission tomography. \textit{Med. Phys.} 35(4): +p. 1299-1309. +{[}Tso11{]} Tsoumpas, C., et al \textbf{(2011)}, The effect of +regularisation in motion compensated image reconstruction. \textit { IEEE +Nucl Sci Symp Med Imaging Conf }. + + + +\end{document} diff --git a/documentation/STIR-glossary.tex b/documentation/STIR-glossary.tex new file mode 100644 index 0000000000..2ad0b916d3 --- /dev/null +++ b/documentation/STIR-glossary.tex @@ -0,0 +1,271 @@ +%&LaTeX +\batchmode +\documentclass{article} +\usepackage{graphicx} + +\newcommand{\tab}{\hspace{5mm}} + + +\begin{document} + +\begin{center} +\textbf{{\huge Glossary for STIR}}\\ +\textbf{C. Labb\'{e}, H. Zaidi, C. Morel, K. Thielemans, C. Tsoumpas} +\end{center} + +\begin{center} +\textit{Version 2.3}\\ +Originally based on PARAPET Deliverable 4.1, +Extended for Quantitative Reconstruction and motion compenstation + +\end{center} + +\section*{Basics} + +\begin{description} +% ROW 2 +\item[Geometry] +A cylindrical geometry has been chosen to describe positron +tomographs made of a number of adjacent detector rings and reconstructed +image volumes. The geometry supports consequently two principal +directions \textit{axially} along the scanner cylinder and \textit{transaxially} +perpendicular to the cylinder axis. +% ROW 3 +\item[Scanner] +Geometrically associated to the cylindrical volume defined by +the inner dimensions of the positron tomograph. +% ROW 4 +\item[Detector ring ] +Geometrically associated to the cylindrical volume defined by +the dimensions of a detector ring. Note that because currently +Depth of Interaction is not taken into account, the effective ring radius +used in the building blocks is the sum of the inner ring radius +and an average depth of interaction (e.g. \ensuremath{\sim} 1cm for BGO). +% ROW 5 +\item[Detector] +Sometimes called \textbf{detector crystal}. Geometrically associated +to the inner face of a detector element. The \textbf{scanner} is then +considered as a tessellation of \textbf{detectors} constructing adjacent \textbf{rings}. +For many scanners, detectors are organized in a block. For instance, +on the HR+ scanner, a detector block consists of 8x8 detectors. +% ROW 6 +\item[LOR (Line-Of-Response)] +Line joining the centres of two \textbf{detectors}. Ignoring scatter, +attenuation and other physical effects, the average number of +coincidences observed between two detectors can be estimated +as the line integral of the tracer distribution along the \textbf{LOR}. +This does not take the finite width of the \textbf{TOR} into account, +nor scatter within the detectors. It can be shown that this line +integral approximation works best for LORs that do not run parallel +to edges within the object. We say that the projector that uses +this model is a \textbf{ray tracing} projector. +% ROW 7 +\item[TOR (Tube of response)] +Tube joining two \textbf{detectors}. +% ROW 8 +\item[Sinogram] +Set of \textbf{bins} corresponding to 1 segment and 1 \textbf{axial} position. +Before \textbf{axial compression,} this corresponds to LORs in a \textbf{detector} \textbf{ring} +(\textit{direct} \textit{sinogram}) or between two different \textbf{detector} \textbf{rings} +(\textit{oblique} \textit{sinogram}). For a \textbf{scanner} of $n$ \textbf{detector +rings}, there are $n$ \textbf{direct sinograms} and $n^2-1$ \textbf{oblique +sinograms} for a total of $n^2$ \textbf{sinograms}. With \textbf{axial +compression}, the number of \textbf{direct sinograms} is $2n-1$. Conventionally, +the \textbf{view} angle in an oblique sinogram runs only over 180 +degrees, meaning that only half of the detectors in each ring +are covered. The other half corresponds to the \textbf{sinogram} in +the opposite \textbf{segment} (with minus the average ring difference), +% ROW 9 +\item[View] +The azimuthal angle of an \textbf{LOR} (ignoring \textbf{interleaving}, +see the documentation of the ProjDataInfoCylindricalNoArcCorr +class, and \textbf{mashing}). +% ROW 10 +\item[Bin] +A single element in a sinogram, completely specified by its \textbf{segment, +axial} \textbf{position, view} and \textbf{tangential position}. +% ROW 11 +\item[Ring difference] +Number of \textbf{rings} between two \textbf{rings} associated to a \textbf{sinogram}. +If \textit{ringA} and \textit{ringB} are the ring numbers, the \textbf{ring +difference} is given by \textit{ringB} -- \textit{ringA}. Thus there can be \textit{positive} +and \textit{negative} \textbf{ring differences}. \linebreak +The (average) \textbf{ring difference} of a \textbf{direct sinogram} is +zero. +% ROW 12 +\item[Michelogram] +Representation of \textbf{sinograms} on a square grid as shown in +Annex 1. If \textit{ringA} and \textit{ringB} are the ring numbers associated +to a \textbf{sinogram}, \textit{ringA} is represented on the horizontal +axis and \textit{ringB} on the vertical axis. \textbf{Positive ring differences} +are below the line representing \textbf{direct sinograms} and \textbf{negative +ring differences} above this line. +% ROW 13 +\item[Segment] +Set of \textbf{merged} \textbf{sinograms} with a common average \textbf{ring +difference} as shown in Annex 1. +% ROW 14 +\item[Viewgram] +Set of equal azimuth \textbf{merged} \textbf{LORs} of a \textbf{segment}. +% ROW 15 +\item[Projection data] +The set of all (measured) LORs, normally split into \textbf{segments} etc. +The word ``projection'' is used because after various corrections and +ignoring noise, the measured data can be approximated as line integrals +through the object. +\item[FOV (Field-Of-View)] +Geometrically associated to the volume for which there is at +least 1 \textbf{bin} with non-zero detection probability\textbf{.} In many +cases, the term is also used for the smaller volume for which +there is at least 1 \textbf{bin} with non-zero detection probability +for every \textbf{view}. The latter FOV is usually cylindrical. +% ROW 16 +\item[Image slice] +Geometrically associated to a cylindrical volume defined by +a slice of the \textbf{FOV}. By convention, a \textbf{slice} is half the +width of a \textbf{ring}. For a \textbf{scanner} of \textit{n} \textbf{detector} \textbf{rings}, +there are 2\textit{n}--1 \textbf{image slices}. +% ROW 17 +\item[Direct plane] +\textbf{Image slice} centered on a \textbf{ring}. For a \textbf{scanner} of \textit{n} \textbf{detector} \textbf{rings}, +there are \textit{n} \textbf{direct planes}. The \textbf{FOV} is ended by two \textbf{direct +planes} centered on the first and last \textbf{rings}. +% ROW 18 +\item[Cross plane] +\textbf{Image slice} in between two consecutive \textbf{direct planes}. \textbf{Direct +planes} are adjacent to \textbf{cross planes}. For a \textbf{scanner} of \textit{n} \textbf{detector} \textbf{rings}, +there are 2\textit{n}--1 \textbf{cross planes}. +\end{description} + +\section*{Different data compressions used in PET data} +\begin{description} +% ROW 21 +\item[Trimming] +Reduction of the number of \textbf{bins} in tangential direction without +changing the size of \textbf{bins}. \textbf{Trimming} is a type of \textbf{bin} +truncation. +% ROW 22 +\item[Angular compression (Mashing)] +Reduction of the number of \textbf{views} by a multiple of two. As +an example, doing a \textbf{mashing} of 2 means that pairs of \textbf{views} +have been added 2 by 2 to form only one \textbf{view}. +% ROW 23 +\item[Axial compression (Span)] +Reduction of the number of \textbf{sinograms} at different \textbf{ring +differences} as shown in Annex 1. \textbf{Span} is a number used by +CTI to say how much axial compression has been used. It is always +an odd number. Higher span, more axial compression. Span 1 means +no axial compression. Note that the GE Advance uses mixed data, +where segment 0 has span 3, while other segments have span 1. +\end{description} + +\section*{Terms used in quantitative PET reconstruction} +\begin{description} +% ROW 24 +\item[Scatter Point] +Coordinate where a scatter event takes place. +% ROW 25 +\item[SSS - Single scatter simulation] +Estimation of the probability to measure a coincidence event that one of +the two photons has been scattered only once. +% ROW 26 +\item[B-Splines] +Basis splines are a set of polynomial functions that have minimal support with +respect to a given degree, smoothness, and domain partition. In imaging they +are useful for performing very fast multidimensional interpolation calculations. +% ROW 27 +\item[Inverse-SSRB] +It is the pseudo-inverse operation of single slice rebinning which can be used +as the simplest way to extrapolate direct sinograms into indirect sinograms. +% ROW 28 +\item[Plasma Data] +Radioactivity concentration in plasma (and blood) during the scanning acquisition. +Usually it is measured in $\mathit{kBq/cm^3}$ over a time window of 1 second. +% ROW 29 +\item[Dynamic Data/Images] +A stack of projection data or images through time. +% ROW 30 +\item[Kinetic Model] +The kinetic model describe the tracer exchange between plasma and tissue +and between tissue compartments. +% ROW 31 +\item[Kinetic Parameters] +The parameters of the kinetic model which are estimated such that +the model is in agreement with the acquired data. +% ROW 32 +\item[(Kinetic) Model Matrix] +Linear kinetic models can be written with compact matrix operations, which +relate the dynamic images and the kinetic parameters with the kinetic model matrix. +This matrix can be seen as the application of the transformation from parametric +domain to the temporal domain. +% ROW 33 +\item[Patlak Plot] +For irreversible tracers, after a certain period from tracer injection, +the free tracer in tissue reaches equilibrium with the radiotracer in plasma and +then the original model simplifies to a linear plot known as the Patlak Plot. +% ROW 34 +\item[Parametric Image] +An image whose voxels hold the values the kinetic parameters. +% ROW 35 +\item[Parametric Image Reconstruction (PIR)] +Estimation of the kinetic parameters from dynamic images for each voxel (indirect PIR). +The parametric images can also be reconstructed directly from dynamic projection data. +\end{description} + +\section*{Terms used in motion-compensated reconstruction} + +\begin{description} +\item[Gated Data/Images] +PET acquisitions can be gated according to an external signal (e.g. respiration, ECG). Gated projection data or gated images correspond to one cardiac/respiratory position of the cardiac/respiratory cycle. + + +\item[Motion Vectors] +3D vectors that store the information of the location where the activity was originally. Information is stored in x-y-z motion vectors and they relate the image at the reference position with the image at the corresponding gate. + + +\item[Motion Compensated Image Reconstruction (MCIR)] +Incorporates motion information within reconstruction so that a motion-free image is directly reconstructed. + +\item[Reconstruct-Transform-Average (RTA)] +Incorporates motion information after reconstruction to obtain a motion-free image. +\end{description} + +\newpage + \section*{ ANNEX 1 :Michelogram} + +Michelogram of data for the ART scanner with a maximum \textbf{ring +difference} of 17 and a \textbf{span} of 7. \\ +Segment 0 is on the diagonal. \\ +Each dot would correspond to a single sinogram if no axial compression +would be used. Axial compression consists in adding sinograms +together whose central LORs intersect the scanner axis +in the same point. This can be seen as a generalization of the +Single Slice Rebinning Algorithm. In the drawing below, the diagonal +lines connecting the dots indicate the sinograms that are added +together. The illustration is for \textbf{span} 7=4+3 (this terminology +was introduced because for some axial positions, 4 sinograms +are added, while for others only 3. Note that \textbf{span} is always +odd.).\\ +Note that STIR supports data with different \textbf{span} for each \textbf{segment}. +In particular, STIR currently interpretes the (3D) data organisation of the +GE Advance and Discovery scanners as using segment 0 with span=3, while +other segments are span=1. + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=6.in, height=6in]{graphics/STIR-glossaryFig1} +\caption{Michelogram with span=7. \textbf{Warning}: due to historical +reasons, the axis labels are wrong. The horizontal axis corresponds to +\textit{ringB}.} +\end{center} +\end{figure} + + +Legend: +\begin{description} +\item[rdmin] the minimum ring difference +\item[rdmax] the maximum ring difference +\item[average\_delta] the averaged ring difference. This is equal +to segment\_num*span if the span is the same for each segment. +\end{description} +\end{document} diff --git a/documentation/STIR-version2-vs-version1.tex b/documentation/STIR-version2-vs-version1.tex new file mode 100644 index 0000000000..3414a4982b --- /dev/null +++ b/documentation/STIR-version2-vs-version1.tex @@ -0,0 +1,463 @@ +%&LaTeX +\batchmode +\documentclass{article} +\usepackage{a4wide} +\usepackage{setspace} +%\usepackage{graphicx} +\usepackage{hyperref} +\def\R2Lurl#1#2{\mbox{\href{#1}{\tt #2}}} +%\newcommand{\tab}{\hspace{5mm}} + +\begin{document} + +\begin{center} +\begin{spacing}{1.5} +\textbf{{\huge Upgrading from STIR version 1.4 to 2.0}}\\ +\textbf{Kris Thielemans} +\end{spacing} +\end{center} + +\tableofcontents + +\section{Overview} +This document summarises what the differences are +between STIR version 2 and 1.4. + +The main change in STIR 2.0 is in the reconstruction code. +All iterative reconstructions use now an objective function hierarchy. See +the doxygen documentation for \texttt{GeneralisedObjectiveFunction}. This +will make it far easier to add different types of reconstruction +algorithms, and in particular applicable to something else than PET +emission data. For instance, in STIR 2.0 there is now a facility to reconstruct +list mode data as well. In addition, reconstruction classes have now been +templated in the type of the ``target'' data, i.e. the parameters that +need to be estimated. In STIR 1.4 this was fixed to images +(or in fact \texttt{DiscretisedDensity<3,float>} objects. +The following describes what the consequences are for you. + +Another change is that the ECAT6 code now relies on the LLN Matrix library, to avoid +problems with copyright issues. However, as the Matrix library is somewhat out-dated, this +is likely to generate problems (there are known aliasing problems on 64-bit systems). As a result, +ECAT6 support in STIR is now problematic. + +\section{For Users} +Generally, all utilities work in the same way as before. There are +changes in some parameters used for parsing. + +\subsection{Bugs fixed} +Various small bugs were fixed, but I am not aware of bugs that caused major problems, except +things listed below, such as a bug when using Euler angles when constructing shapes. + +Bing Bai found a work-around for the problem with the incremental interpolating backprojector. +This seems now to work on all system where we tested it. The code is still inherently unstable +though. + +\subsection{Incompatible behaviour} +\begin{itemize} +\item Old OSMAPOSL parameter files no longer work. See the section below on OSMAPOSL, + and sample files in the \texttt{samples} directory. Also, output is not necessarily + identical. See section \ref{sec:Reconstruction_programs} for details. +\item The parsing keyword \texttt{output file format} in the reconstruction hierarchy +and \texttt{generate\_image} has been changed to \texttt{output file format type} to +be consistent with other parameters (it was already called that way in \texttt{stir\_math}. +\item The format for the parameter files for \texttt{generate\_image} and + \texttt{list\_ROI\_values} changes somewhat. The only difference is the + specification of the origin of the shape as a single keyword specifying \{z,y,x\}. +\item Image-origin is now read from and saved to file for those file formats that + support it (at time of writing: Interfile, ECAT7 and ECAT6 for x,y info). + As this was ignored before (origin was set to 0,0,0), this might mean that + the images are now forward projected/reconstructed differently.\\ + \textbf{WARNING:} At present, origin info is not set/preserved for + projection data. This is a major deficiency and will be fixed at a later stage. + At present, the first sinogram of segment 0 is supposed to be at \texttt{z=0} and + the axis of the scanner at \texttt{x=y=0}. +\end{itemize} + +\subsection{New utilities} +\begin{description} +\item[conv\_AVW] +If you have the \textit{AVW}\texttrademark{} library +\footnote{See \R2Lurl{http://www.mayo.edu/bir/Software/AVW/AVW1.html}{www.mayo.edu/bir/Software/AVW/AVW1.html}. +} installed on your system, the make process should have built \texttt{utilities/conv\_AVW}. +This utility allows to use the \textit{AVW} library to read an image, and then write it out +using STIR as Interfile.\\ +\textbf{Warning:} the \textit{AVW} library seems to flip some images depending +on the file format. For instance, it reads \textit{ECAT7} files using a z-flip compared +to STIR. In general, STIR ignores any image orientation fields. This is dangerous of course. +\item[SimSET support] +There are some preliminary files for make it easier to use SimSET and STIR together in the +\textbf{SimSET} directory. See the README.txt in that directory for more info. +\item[list\_image\_values, find\_maxima\_in\_image] +Utilities for getting data from images from the command line +\item[attenuation\_coefficients\_to\_projections, calculate\_attenuation\_coefficients] +Utilities for processing of attenuation coefficients. +\item[find\_maxima\_in\_image, list\_image\_values] +Utilities to list voxel values and coordinates of maxima. +\item[write\_proj\_matrix\_by\_bin] +Write the elements of a projection matrix to a file (in a STIR-specific format). +This can later be used to re-read the same data as opposed to having to recalculate +all elements. +\item[copy\_ecat7\_header] +Allows copying header info between ECAT7 files. +Note that all ECAT utilities are now in the \texttt{utilities/ecat} sub-directory. +\end{description} + +\subsection{Filters \textit{aka} data processors} +The \texttt{ImageProcessor} hierarchy is now generalised to +\texttt{DataProcessor} that can work on different types than images. This is reflected +in the name of the parameters of some data processors. + +\begin{description} +\item[Chained Image Processor] +is now renamed to \texttt{Chained Data Processor}. +This data processor is used to allow you to specify two +data processors that will run in sequence. So, all its keywords have +been changed accordingly. +\begin{verbatim} +Chained Data Processor Parameters:= +Data Processor to apply first:= +Data Processor to apply second:= +END Chained Data Processor Parameters:= +\end{verbatim} + +\item[Threshold Min To Small Positive Value] +used to truncate to a cylindrical FOV. This facility no longer +exists. There is a new filter for this \texttt{Truncate To Cylindrical FOV}. +See also section \ref{sec:changes_in_OSMAPOSL_images}. +\end{description} + + +\subsection{Shapes} +The code to specify Euler angles is disabled +as it was buggy (get after set was not consistent). +You now have to use a matrix to define direction vectors. +(Note that in previous version the direction +vectors were ignored during parsing (this was a bug).) + +The origin is now also specified with a single keyword. +\begin{verbatim} +; next keyword can be used for non-default axes +; values below are give a rotation around y for 90 degrees (swapping x and z) +; Warning: this uses the STIR convention {z,y,x} +direction vectors (in mm):= { {0,0,1}, {0,1,0}, {-1,0,0}} +; origin w.r.t. to standard STIR coordinate system (middle of first plane) +origin (in mm):= {z,y,x} +\end{verbatim} + +The following 2 entries were contributed by C. Ross Schmidtlein and Assen S. Kirov. +See also the \texttt{contrib} sub-directory available in the documentation zip file. +\subsubsection{Box3D} +Allows to specify 3D boxes (or cuboids). + +\subsubsection{EllipsoidalCylinder} +Allows to specify specify angle parameters to specify a wedge of the +cylinder. + + +\subsection{Reconstruction programs} +\label{sec:Reconstruction_programs} +Analytic reconstruction algorithms have not changed, except that there +is now a new keyword +\begin{verbatim} +post filter type:= +\end{verbatim} +However, as mentioned above, iterative reconstruction code has been +changed dramatically. Because of this, the parameter format for +\texttt{OSMAPOSL} has changed. +Previous .par files are incompatible. However, this is mostly a +question of reordering the keywords. Generally speaking, everything +related to the input data, sensitivity and the prior +(except the \texttt{MAP model} keyword) +has now to be between +\begin{verbatim} +objective function type:= \ + PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= +; input, sensitivity and prior parameters here +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= +\end{verbatim} +Also, the \texttt{sensitivity} program no longer exists. Its functionality +is now fully integrated into \texttt{OSMAPOSL} (and other forthcoming +algorithms). See below for details. +. +\subsubsection{Keyword name changes} +Some keywords changed because the \texttt{OSMAPOSL} code can now work +on different ``target types'', i.e. not only images. +\begin{description} +\item[sensitivity image] is now \texttt{sensitivity filename}. +\item[save image at subiteration intervals] is now + \texttt{save estimate at subiteration intervals}. +\item[initial image] is now \texttt{initial estimate}. +\end{description} + +\subsubsection{Keywords (and functionality) that are no longer present} +\begin{description} +\item[do rim truncation] is now effectively always set to 0. See also +section \ref{sec:changes_in_OSMAPOSL_images}. +\end{description} + +\subsubsection{Changes for computing the sensitivity image} +In STIR 1.4, a separate executable \texttt{sensitivity} was used to compute +the sensitivity image. This is now a part of \texttt{OSMAPOSL} with +relevant keywords (with defaults indicated) +\begin{verbatim} +time frame definition filename:= +time frame number:= 1 +Bin Normalisation type:= None +sensitivity filename:= +recompute sensitivity := 0 +\end{verbatim} +The first three are used to specify normalisation and attenuation factors +as in \texttt{correct\_projdata}. +See the User\'s Guide for more information. + +\subsubsection{New functionality in OSMAPOSL} +There is a new keyword +\begin{verbatim} +use_subset_sensitivities +\end{verbatim} +which defaults to 0, which is the old behaviour. If set to 1, the denominator +term in OSMAPOSL uses sub-sensitivities as opposed to the total sensitivity image +(divided by the number of subsets). This avoids artefacts when using a larger +number of subsets and attenuation and/or normalisation in the model, at the +expense of using more memory. +At time of writing, this has to be combined with +\begin{verbatim} +recompute sensitivity := 1 +\end{verbatim} +The sub-sensitivities are not written to file. + +\subsubsection{Changes in reconstructed images when using OSMAPOSL} +\label{sec:changes_in_OSMAPOSL_images} + +In STIR 1.4, \texttt{OSMAPOSL} used ``rim truncation'' by default. This +set all voxels outside a cylindrical FOV to zero. In version 2.x, this facility +no longer exists. The main reason for this is that the +\texttt{OSMAPOSLReconstruction} class now works for target types which are +not images. In addition, you no longer have to jump through a lot of hoops +if you want to use a square FOV. + +Also, a bug was removed that prevented\\ +\texttt{enforce initial positivity condition:=1}\\ +to work. + +As a consequence, reconstructed images might not be identical. In the first +few iterations, the difference is only in the rim, but this then +induces differences in the whole image during subsequent iterations. Of course, +if you do see appreciable differences, it shows that there probably is something +wrong with your reconstructions, as most likely there should be no activity +in those rim voxels in any case. One potential reason is that you are +using randoms or scatter pre-corrected data, or do not use this corrections +at all. The theoretically recommended, and most numerically stable, + way is to use the \texttt{additive sinogram} parameter.\\ + + +\paragraph{Recommendations} +\begin{itemize} +\item No longer use rim truncation. If you need a cylindrical FOV, let the +projectors do this for you (they do this by default). +\item If you see pixels at the edge of the FOV which are very high, you +probably can solve this by using \texttt{additive sinogram} appropriately. +\end{itemize} + +\paragraph{Guidelines on how to obtain identical reconstructions\\} +Read this section if you really need compatibility. This is a bit +messy though, as there were some problems +with the rim truncation in STIR 1.4. So, we need to explain first +what happened. + +Rim truncation was applied in 3 different processing steps: +\begin{itemize} +\item After reading the initial image, if +\texttt{enforce initial positivity condition} was set to 1 (the default). +\item After dividing the updated image with the sensitivity image, if +\texttt{do rim truncation} was set to 1 (the default). +\item After applying the inter-iteration or inter-update filter (but +only if they were set). +\end{itemize} +This first and third step were a (potentially unexpected) consequence of using +the image processor \texttt{ThresholdMinToSmallPositiveValueImageProcessor}. + +Unfortunately, the first and third step used a FOV that could be +a few pixels larger than the second step. This is +because they +\footnote{Routines \texttt{threshold\_min\_to\_small\_positive\_value} +and \texttt{min\_positive\_value}.} + used a test $x^2+y^2 <= R^2$, while the explicit rim +truncation +\footnote{Routines \texttt{divide\_and\_truncate} and \texttt{truncate\_rim}} + used $x^2+y^2 < R^2$. +Finally, the origin used for this computation was shifted half a pixel in +x and y for even-sized images w.r.t. the standard STIR origin. + +The final piece of the puzzle is that the interpolating backprojector has a +FOV which is slightly smaller than the rim truncation routines used in +STIR 1.4. + +Conclusions +\begin{itemize} +\item Reconstructions should be identical if \texttt{OSMAPOSL} in +STIR 1.4 used\\ +\texttt{ +do rim truncation:=0\\ +enforce initial positivity condition:=0 +}\\ +and there was no inter-update nor inter-iteration filtering. + +\item Most likely, differences will be negligible if you use the interpolating +backprojector. + +\item Otherwise, you can use the \texttt{Truncate To Cylindrical FOV} +data processor in STIR 2.0. Use it with +\begin{verbatim} +strictly_less_than_radius:=0 +\end{verbatim} +to reproduce the first and third step in STIR 1.4 processing, and with +\begin{verbatim} +strictly_less_than_radius:=1 +\end{verbatim} +for the second step. Note however, that if +\texttt{do\_rim\_truncation} was switched on, the +\texttt{Truncate To Cylindrical FOV} filter would have to be used +as inter-iteration filter at every sub-iteration, which might not be +possible if you are using another inter-iteration filter.\\ +See the \texttt{OSMAPOSL\_test\_PM\_MRP.par} +and \texttt{postfilter\_truncate\_circular\_FOV.par} files in the +\textbf{recon\_test\_pack} for examples. +\end{itemize} + + +\subsubsection{New projection matrices} +A new ``Using Interpolation'' matrix attempts to reproduce results of the interpolating +backprojector. It is currently very slow though. + +A new ``From File'' matrix allows you to read a matrix (saved with \texttt{write\_proj\_matrix\_by\_bin}). + +\subsubsection{Parallelisation of OSMAPOSL using MPI} +Contribution by Tobias Beisel. Allows running OSMAPOSL in master-slave mode. +See some more info in the User's Guide. +\subsubsection{Parallelisation of FBP2D using OPENMP} +Contribution by Tobias Beisel. Allows running FBP2D using threads. +However, this does not really speed-up the reconstruction. This code could +serve as a basis for FBP3DRP however. + +\section{For Developers} + +Before reading this, it is recommended that you read the section for +users first. + +As mentioned before, the main changes are in the \texttt{Reconstruction} +hierarchy. This is now templated in \texttt{TargetT}. Moreover, +\texttt{IterativeReconstruction} now use an objective function hierarchy. See +the doxygen documentation for \texttt{GeneralisedObjectiveFunction}. This +reorganisation has had repercusions in various other places. Examples are +\begin{itemize} +\item Class \texttt{OutputFileFormat} is now also templated to allow +other types than images (or in fact \texttt{DiscretisedDensity<3,float>}). +\item Class \texttt{ImageProcessor} is now replaced by the templated +class \texttt{DataProcessor}. +\item Most functions in \texttt{buildblock/recon\_array\_functions.cxx} +were specific to images samples on cartesian grids +(or even (\texttt{VoxelsOnCartesianGrid} objects), and hence +could no longer be used. In addition, they had some ugly quircks +(see section \ref{sec:changes_in_OSMAPOSL_images}). So most of these +functions have now been removed. +\item Removed replace\_extension and add\_extension functions that work on char * as they were +unsafe (in case the array did not have enough memory). Use std::string versions instead. + +\end{itemize} + +Other relatively important changes are listed below +\begin{itemize} +\item On request, the reconstruction hierarchy has now \texttt{get/set} functions for +most parameters. Please email if some are missing. +\item There is now a new class \texttt{AnalyticReconstruction}. +\item \texttt{VectorWithOffset}: added + constructors and 1 member to be able to have vectors that use existing + data. This is useful when for example a C array with data needs to be + manipulated. + +\item \texttt{KeyParser}: + \begin{itemize} + \item use the 'parameter' member (of type + boost::any) for storing all values, making par\_int, par\_double etc + obsolete and enabling some nice use of macros to shorten the switch + statements. + \item made IntVect and DoubleVect private typedefs (and removed + UlongVect) + \item fix parameter\_info() for types that + output to more than 1 line (such as 2D arrays). We now add the usual + continuation character (a backslash), such that the output of + parameter\_info can be parsed without problems. + \item in parameter\_info(), + deleted an extra newline after calling parameter\_info() for a parsing + object. + \end{itemize} + +\item \texttt{distributable}: + no longer use global variables (for + projectors etc) in distributable\_computation. This means (among other + things) a better chance of thread-safety, although there's still work to + do there. + +\item in Reconstruction hierarchy: moved most checks + from post\_processing() to set\_up() and clarified in doxygen which function + is for what purpose + +\item \texttt{DiscretisedDensity} + \begin{itemize} + \item renamed get\_empty\_discretised\_density() to get\_empty\_copy(), using + covariant return types + \item added has\_same\_characteristics() + \item added functions to convert between \textit{physical} coordinates (in mm) + and index coordinates. + \end{itemize} + +\item New global function \texttt{read\_from\_file()} using an input file format +registry. This makes it much easier to add support for a new file format. See +class \texttt{InputFileFormatRegistry}. This is currently not yet used for ProjData though. + +\item New variables defined for \texttt{make} for \textit{AVW} support: +\texttt{AVW\_INCLUDE\_DIR}, \texttt{AVW\_LIBS} and \texttt{HAVE\_AVW}. They +are set in \texttt{config.mk} according to recommend \textit{AVW} values, +i.e. using the environment variables \texttt{AVW} and \texttt{TARGET}. +See the Users Guide. +\end{itemize} + +In addition, I have taken the opportunity to do some other bug fixing. +The main affected area is the \texttt{Shape3D} hierarchy, where the +Euler code had to be disabled and a different mechanism is now used to +spcify direction vectors. This means that most of this code is now +ready for templating in the number of dimensions. For other smaller +changes, please refer to the ChangeLog. + +\subsection{Additional new functionality} +This list is incomplete. Please refer to the ChangeLog. +\begin{itemize} +\item added \texttt{has\_same\_characteristics()} to \texttt{Sinogram}, \texttt{Viewgram}, + \texttt{RelatedViewgrams}, \texttt{Segment*} +\item added \texttt{operator==} to \texttt{Sinogram}, \texttt{Viewgram}, + \texttt{RelatedViewgrams}, \texttt{Segment*}, \texttt{DiscretisedDensity} + and symmetry classes. Updated \texttt{operator==} for \texttt{ProjDataInfo} + classes to check also fields specific to the leaf classes. +\item added \texttt{find\_centre\_of\_gravity\_in\_mm} for \texttt{VoxelsOnCartesianGrid} objects. +\end{itemize} + +\subsection{Additional incompatibilities} +This list is incomplete. Please refer to the ChangeLog. +\begin{itemize} +\item The \texttt{zoom\_image} functions have now much better defined behaviour + w.r.t the new index ranges and the origin (see the doxygen). In particular, + the z-range now starts from index 0, and the origin is updated such that + it remains physically correct. Another incompatibility is that previously, + the multiple argument versions of \texttt{zoom\_image} (i.e. specifying zoom etc + explicitly) modified the image in place. Now, the function with the same name + returns a new image instead. The previous functionality is now provided by + \texttt{zoom\_image\_in\_place}. + +\item \texttt{find\_centre\_of\_gravity\_in\_mm\_per\_plane} now returns a result that takes + \texttt{image.get\_origin()} into account properly. It no longer + shifts the z-direction to the centre of the image. There is currently no + utility that depends on this behaviour though. +\end{itemize} +\end{document} diff --git a/documentation/STIR_FBP3DRP.pdf b/documentation/STIR_FBP3DRP.pdf new file mode 100644 index 0000000000..845d3b8c30 Binary files /dev/null and b/documentation/STIR_FBP3DRP.pdf differ diff --git a/documentation/STIR_FBP3DRP.rtf b/documentation/STIR_FBP3DRP.rtf new file mode 100644 index 0000000000..28a7b3a14a --- /dev/null +++ b/documentation/STIR_FBP3DRP.rtf @@ -0,0 +1,16027 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff36\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2057{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;} +{\f5\fmodern\fcharset0\fprq1{\*\panose 02070409020205020404}Courier;}{\f8\froman\fcharset0\fprq2{\*\panose 02040503060506020304}New York{\*\falt Times New Roman};}{\f10\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f36\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times;}{\f129\froman\fcharset238\fprq2 Times New Roman CE;}{\f130\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f132\froman\fcharset161\fprq2 Times New Roman Greek;} +{\f133\froman\fcharset162\fprq2 Times New Roman Tur;}{\f134\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f135\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f136\froman\fcharset186\fprq2 Times New Roman Baltic;} +{\f137\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f149\fmodern\fcharset238\fprq1 Courier New CE;}{\f150\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f152\fmodern\fcharset161\fprq1 Courier New Greek;} +{\f153\fmodern\fcharset162\fprq1 Courier New Tur;}{\f154\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f155\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f156\fmodern\fcharset186\fprq1 Courier New Baltic;} +{\f157\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255; +\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{ +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\s1\qj \fi-432\li432\ri12\sb220\sa220\sl360\slmult0\keep\keepn\widctlpar +\jclisttab\tx432\tx560\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin12\lin432\itap0 \b\f4\fs24\up6\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 1;}{\s2\qj \fi-576\li576\ri12\sa80\sl360\slmult0\widctlpar +\jclisttab\tx576\tx680\aspalpha\aspnum\faauto\ls2\ilvl1\outlinelevel1\adjustright\rin12\lin576\itap0 \shading1000 \b\f4\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 2;}{\s3\qj \fi-720\li720\ri12\sb320\widctlpar\brdrt +\brdrdot\brdrw15 \jclisttab\tx720\tx860\aspalpha\aspnum\faauto\ls2\ilvl2\outlinelevel2\adjustright\rin12\lin720\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 3;}{ +\s4\qj \fi-864\li864\ri12\sb320\sa160\keep\keepn\widctlpar\jclisttab\tx864\tx1152\aspalpha\aspnum\faauto\ls2\ilvl3\outlinelevel3\adjustright\rin12\lin864\itap0 \f36\fs20\uld\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 4;}{ +\s5\qj \fi-1008\li1008\ri12\sb220\sl220\slmult0\keep\keepn\widctlpar\tx1152\jclisttab\tx1440\aspalpha\aspnum\faauto\ls2\ilvl4\outlinelevel4\adjustright\rin12\lin1008\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 +heading 5;}{\s6\qj \fi-1152\li1152\ri12\sb140\sl220\slmult0\keep\keepn\widctlpar\tx1152\jclisttab\tx1440\aspalpha\aspnum\faauto\ls2\ilvl5\outlinelevel5\adjustright\rin12\lin1152\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext0 heading 6;}{\s7\qj \fi-1296\li1296\ri12\sb140\sl220\slmult0\keep\keepn\widctlpar\tx1152\jclisttab\tx1800\aspalpha\aspnum\faauto\ls2\ilvl6\outlinelevel6\adjustright\rin12\lin1296\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 7;}{\s8\qj \fi-1440\li1440\ri12\sb140\sl220\slmult0\keep\keepn\widctlpar +\tx1152\jclisttab\tx1800\aspalpha\aspnum\faauto\ls2\ilvl7\outlinelevel7\adjustright\rin12\lin1440\itap0 \i\f4\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 8;}{\s9\qj \fi-1584\li1584\ri12\sb140\sl220\slmult0 +\keep\keepn\widctlpar\tx1152\jclisttab\tx2160\aspalpha\aspnum\faauto\ls2\ilvl8\outlinelevel8\adjustright\rin12\lin1584\itap0 \f4\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden +Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\qj \li1400\ri12\sl360\slmult0\widctlpar +\tx1152\tqr\tldot\tx8548\aspalpha\aspnum\faauto\adjustright\rin12\lin1400\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \sautoupd \ssemihidden toc 8;}{\s16\qj \li1200\ri12\sl360\slmult0\widctlpar +\tx1152\tqr\tldot\tx8548\aspalpha\aspnum\faauto\adjustright\rin12\lin1200\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \sautoupd \ssemihidden toc 7;}{\s17\qj \li1000\ri12\sl360\slmult0\widctlpar +\tx1152\tqr\tldot\tx8548\aspalpha\aspnum\faauto\adjustright\rin12\lin1000\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \sautoupd \ssemihidden toc 6;}{\s18\qj \li2200\ri580\sa80\sl220\slmult0\widctlpar +\tx3100\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin2200\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext18 \sautoupd \ssemihidden toc 5;}{\s19\qj \li1400\ri580\sa80\sl220\slmult0\widctlpar +\tx2260\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin1400\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext19 \sautoupd \ssemihidden toc 4;}{\s20\qj \li840\ri580\sa120\sl220\slmult0\widctlpar +\tx1540\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin840\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext20 \sautoupd \ssemihidden toc 3;}{\s21\qj \li300\ri580\sb120\sa120\sl220\slmult0\widctlpar +\tx1040\tqr\tldot\tx9340\aspalpha\aspnum\faauto\adjustright\rin580\lin300\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext21 \sautoupd \ssemihidden toc 2;}{\s22\qj \li0\ri580\sb120\sa120\sl220\slmult0\widctlpar +\tx580\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin0\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext22 \sautoupd \ssemihidden toc 1;}{ +\s23\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \sautoupd \ssemihidden index 1;}{\*\cs24 \additive \sbasedon10 line number;}{ +\s25\qj \li0\ri12\sl360\slmult0\widctlpar\tx1152\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 footer;}{\s26\qj \li0\ri12\sl360\slmult0\widctlpar +\tx1152\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 header;}{\*\cs27 \additive \fs16\up6 \sbasedon10 \ssemihidden footnote reference;}{ +\s28\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext28 \ssemihidden footnote text;}{\s29\qj \li1600\ri12\sl360\slmult0\widctlpar +\tx1152\tqr\tldot\tx8548\aspalpha\aspnum\faauto\adjustright\rin12\lin1600\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \sautoupd \ssemihidden toc 9;}{\*\cs30 \additive \sbasedon10 page number;}{ +\s31\qj \fi284\li0\ri12\sa80\sl480\slmult0\widctlpar\tx1152\tqc\tx2552\tqr\tx8505\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext31 IEEE Equation;}{ +\s32\qj \li20\ri-222\widctlpar\tx1152\aspalpha\aspnum\faauto\adjustright\rin-222\lin20\itap0 \f8\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 journal;}{\s33\qj \li0\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 blocks;}{\s34\qj \li300\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin300\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon33 \snext34 Retrait;}{\s35\qj \li840\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin840\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon34 \snext35 Retrait2;}{\s36\qc \li0\ri12\sl-480\slmult0\widctlpar +\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 IEEE Table;}{\s37\qj \fi300\li0\ri12\sl-260\slmult0\widctlpar +\tx1152\tqr\tx7371\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 Text-Diss;}{\s38\qj \li560\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin560\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext38 Retrait1;}{\s39\qj \li1120\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin1120\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext39 Retrait3;}{\s40\qj \li1380\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin1380\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon39 \snext40 Retrait4;}{\s41\qj \li1740\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin1740\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon40 \snext41 Retrait5;}{\s42\qj \li2000\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin2000\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon40 \snext42 Retrait6;}{\s43\qj \li2280\ri12\sl360\slmult0\widctlpar +\tx1152\tx1700\tx2800\tx7080\aspalpha\aspnum\faauto\adjustright\rin12\lin2280\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon40 \snext43 Retrait7;}{\s44\ql \li0\ri12\widctlpar +\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 Section2;}{\s45\ql \li0\ri12\widctlpar\tx1152\tx3420\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext45 Section1;}{\s46\qj \li0\ri12\sl360\slmult0\widctlpar\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext46 EngDoc;}{\s47\qr \fi-283\li283\ri12\sl360\slmult0\widctlpar\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin283\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext47 \sautoupd List Bullet;}{ +\s48\qr \li0\ri12\sa120\sl360\slmult0\widctlpar\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext48 Body Text;}{\s49\qj \fi-480\li480\ri12\sl360\slmult0\widctlpar +\tx1152\tqr\tldot\tx8306\aspalpha\aspnum\faauto\adjustright\rin12\lin480\itap0 \caps\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \ssemihidden table of figures;}{\s50\qj \li561\ri544\sa240\sl-220\slmult0\widctlpar +\tx1152\tqr\tx7371\aspalpha\aspnum\faauto\adjustright\rin544\lin561\itap0 \f36\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon37 \snext50 Abbildung;}{\s51\qj \fi301\li0\ri12\sl240\slmult0\widctlpar +\tx1152\tqr\tx7371\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon37 \snext51 Gleichung;}{\s52\qj \fi-567\li567\ri12\sl360\slmult0\widctlpar +\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin567\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon53 \snext52 biblio_parapet;}{\s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar +\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext53 parapet;}{\s54\qj \fi-567\li567\ri12\sl360\slmult0\widctlpar +\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin567\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon52 \snext54 bibl;}{\s55\qj \li0\ri12\sl360\slmult0\widctlpar\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon46 \snext55 Equation;}{\s56\qj \li284\ri12\sb120\sl-360\slmult0\widctlpar\tx560\tx7371\aspalpha\aspnum\faauto\adjustright\rin12\lin284\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon53 \snext53 \ssemihidden caption;}{\s57\qj \fi284\li0\ri12\sa80\sl480\slmult0\widctlpar\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext57 IEEE Body;}{\s58\qc \li0\ri12\sb320\sa160\sl480\slmult0\widctlpar\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\scaps\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext58 Main heading IEEE;}{\s59\qj \li0\ri12\sb160\sa160\sl480\slmult0\widctlpar\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext59 Subheading IEEE;}{\s60\qj \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\sbasedon53 \snext60 figure;}{\s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon60 \snext61 parapet10;}{ +\s62\qj \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon60 \snext62 figure10;}{\s63\qj \li0\ri12\sa80\sl-220\slmult0\widctlpar +\tx1152\tx1560\tqr\tx4820\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext63 IEEE Figure captions;}{\s64\qj \fi-4220\li4520\ri12\sa80\sl-240\slmult0\widctlpar +\tx560\tx4520\aspalpha\aspnum\faauto\adjustright\rin12\lin4520\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon53 \snext64 parapet_retrait;}{\s65\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar +\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \b\i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon53 \snext65 parapet_soustitre;}{\s66\qj \fi-4220\li4240\ri12\sa80\sl-360\slmult0\widctlpar +\tx560\tx4240\aspalpha\aspnum\faauto\adjustright\rin12\lin4240\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon53 \snext66 parapet_comment;}{\s67\qj \fi-2960\li3940\ri12\sl360\slmult0\widctlpar +\tx1120\tx1152\aspalpha\aspnum\faauto\adjustright\rin12\lin3940\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext67 Normal2;}{\s68\qj \fi-1700\li2260\ri12\sl360\slmult0\widctlpar +\tx2260\aspalpha\aspnum\faauto\adjustright\rin12\lin2260\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon34 \snext68 Retrait_para;}{\s69\qj \li0\ri0\sl360\slmult0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\b\f36\fs20\ul\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext69 Normal_soul;}{\s70\ql \li0\ri0\widctlpar\tx560\tx3420\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f5\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 +\sbasedon0 \snext70 Code;}{\s71\ql \li560\ri0\sb240\sa120\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin560\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 Titre5;}{\s72\ql \li300\ri0\widctlpar +\tx560\tx1160\tx1640\tx2720\tx3420\aspalpha\aspnum\faauto\adjustright\rin0\lin300\itap0 \f5\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon70 \snext72 Code2;}{\s73\ql \li300\ri0\sb220\sa80\sl220\slmult0\widctlpar +\tx1120\tx3420\aspalpha\aspnum\faauto\adjustright\rin0\lin300\itap0 \f5\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon70 \snext73 Code3;}{\s74\ql \li300\ri0\sb40\sa40\sl220\slmult0\widctlpar +\tx1120\tx3420\aspalpha\aspnum\faauto\adjustright\rin0\lin300\itap0 \f5\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon73 \snext74 Code3_wolinespace;}{\s75\qj \li0\ri12\sl360\slmult0\widctlpar +\tx1380\tx4220\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon53 \snext75 parapetsplit;}{\s76\qj \li0\ri12\sl360\slmult0\widctlpar +\tx560\tx1120\tx4220\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon75 \snext76 parapetclass;}{\s77\ql \li0\ri-20\widctlpar +\tx980\tqr\tx3560\tqr\tx4240\tqr\tx4900\tqr\tx5720\tqr\tx6480\tqr\tx7280\tqr\tx8040\tqr\tx8780\tqr\tx9540\aspalpha\aspnum\faauto\adjustright\rin-20\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext77 scanner;}{ +\s78\qj \fi-340\li340\ri0\sl-200\slmult0\widctlpar\tqr\tx284\aspalpha\aspnum\faauto\adjustright\rin0\lin340\itap0 \f36\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 IEEE Biblio;}{ +\s79\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext79 \ssemihidden endnote text;}{\s80\ql \li1077\ri0\sl240\slmult0 +\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \b\f5\fs18\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon48 \snext80 Source Code;}{\s81\ql \fi-1420\li2000\ri232\sb80\sa80\widctlpar +\tx1040\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin232\lin2000\itap0 \caps\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon21 \snext81 Tdm_Annexe;}{\*\cs82 \additive \ul\cf2 \sbasedon10 Hyperlink;}}{\*\listtable +{\list\listtemplateid1309149934\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listname +;}\listid-119}{\list\listtemplateid-2079658298{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'00;}{\levelnumbers\'01;}\fbias0 \s1\fi-432\li432\jclisttab\tx432\lin432 }{\listlevel +\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00.\'01;}{\levelnumbers\'01\'03;}\fbias0 \s2\fi-576\li576\jclisttab\tx576\lin576 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'05\'00.\'01.\'02;}{\levelnumbers\'01\'03\'05;}\fbias0 \s3\fi-720\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'07\'00.\'01.\'02.\'03;}{\levelnumbers\'01\'03\'05\'07;}\fbias0 \s4\fi-864\li864\jclisttab\tx864\lin864 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'09\'00.\'01.\'02.\'03.\'04;}{\levelnumbers\'01\'03\'05\'07\'09;}\fbias0 \s5\fi-1008\li1008\jclisttab\tx1440\lin1008 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'0b\'00.\'01.\'02.\'03.\'04.\'05;}{\levelnumbers\'01\'03\'05\'07\'09\'0b;}\fbias0 \s6\fi-1152\li1152\jclisttab\tx1440\lin1152 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'0d\'00.\'01.\'02.\'03.\'04.\'05.\'06;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d;}\fbias0 \s7\fi-1296\li1296\jclisttab\tx1800\lin1296 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'0f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f;}\fbias0 \s8\fi-1440\li1440\jclisttab\tx1800\lin1440 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08;}{\levelnumbers\'01\'03\'05\'07\'09\'0b\'0d\'0f\'11;}\fbias0 \s9\fi-1584\li1584\jclisttab\tx2160\lin1584 }{\listname ;}\listid352920082}{\list\listtemplateid-5878490\listhybrid{\listlevel +\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0{\leveltext\leveltemplateid1207459698\'01-;}{\levelnumbers;}\loch\af36\hich\af36\dbch\af0\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807557 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807553\'01\u-3913 ?;}{\levelnumbers +;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807555\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid134807557\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 } +{\listname ;}\listid1366177983}}{\*\listoverridetable{\listoverride\listid-119\listoverridecount0\ls1}{\listoverride\listid352920082\listoverridecount0\ls2}{\listoverride\listid1366177983\listoverridecount0\ls3}}{\*\rsidtbl \rsid608581\rsid1639708 +\rsid2571840\rsid3752688\rsid6909422\rsid9315117\rsid15669153\rsid15797121}{\*\generator Microsoft Word 10.0.4219;}{\info{\title Task4_2.PROMIS_Blocks}{\author Habib Zaidi}{\operator Kris Thielemans}{\creatim\yr2003\mo10\dy1\hr18\min9} +{\revtim\yr2004\mo11\dy25\hr17\min7}{\printim\yr2004\mo11\dy25\hr17\min7}{\version7}{\edmins27}{\nofpages10}{\nofwords2126}{\nofchars12122}{\*\company IRSL}{\nofcharsws14220}{\vern16469}}\paperw11900\paperh16820\margl1134\margr1134\margt1134\margb1134 +\deftab709\widowctrl\ftnbj\aenddoc\hyphhotz0\sprstsp\otblrul\brkfrm\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\sprstsm\truncex\nolead\nospaceforul\msmcap\lytprtmet\hyphcaps0\horzdoc\fracwidth\psover\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984 +\dghshow0\dgvshow0\jexpand\viewkind1\viewscale100\bdrrlswsix\nolnhtadjtbl\rsidroot3752688 \fet0\sectd \pgnrestart\linex0\cols2\endnhere\titlepg\sectdefaultcl\sftnbj {\footer \pard\plain +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \chpgn +\par +\par }}{\headerf \pard\plain \s26\qj \li0\ri12\sl360\slmult0\widctlpar\tx1152\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab \tab \tab \tab +\par }}{\footerf \pard\plain \s25\qj \li0\ri12\sl360\slmult0\widctlpar\tqc\tx4536\tqr\tx9072\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par +\par +\par +\par }\pard \s53\qj \li0\ri12\sa80\sl360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\b\fs72\insrsid6909422 STIR\tab +\par }\pard \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\insrsid6909422 +\par +\par }\pard \s53\qc \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\insrsid6909422 +\par +\par +\par }\pard\plain \s62\qj \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid3752688 +{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex28\picscaley28\piccropl0\piccropr0\piccropt0\piccropb0 +\picw19650\pich19650\picwgoal11140\pichgoal11140\wmetafile8\bliptag-1846729416\blipupi119{\*\blipuid 91ed253871111c974b9442e95fb0266f} +010009000003e6dc00000700be0200000000050000000b0200000000050000000c022d022d020500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e0007000000fc020000000000000000040000002d01000008000000fa02050001000000 +00000000040000002d01010086000000240341001601fa001901fa001c01fb001e01fc002101fc002301fe002501ff00280101012a0102012b0104012d010601 +2e01090130010b0130010e013101100132011301320116013201190131011b0130011e01300121012e0123012d0125012b0127012a01290128012b0125012d01 +23012e0121012f011e0130011c013101190131011601320113013101110131010e0130010b012f0109012e0107012d0105012b010301290101012701ff002501 +fe002301fd002101fc001e01fb001b01fb001901fa001601fb001301fb001001fc000e01fd000b01fe000901ff0006010101040103010201050101010701ff00 +0901fe000b01fc000e01fc001101fb001301fa001601fa004e000000240325003201160132011601320113013101100131010e0130010b012f0109012d010601 +2c0104012a010201280100012601ff002301fd002101fc001e01fb001c01fa001901fa001601fa001601fb001901fb001c01fb001e01fc002101fd002301fe00 +2501ff0027010101290103012b0105012d0107012e0109012f010b0130010e0131011001310113013101160131011601320116014e0000002403250016013201 +16013201190132011c0131011e0131012101300123012e0126012d0128012c012a012a012c0128012d0126012f0123013001210131011e0131011c0132011901 +32011601310116013101190131011b0130011e012f0121012e0123012d0125012b0127012901290127012b0125012d0123012e0121012f011e0130011c013101 +190131011601310116013101160132014e00000024032500fa001601fa001601fa001901fb001c01fb001e01fc002101fd002301ff0026010001280102012a01 +04012c0106012d0109012e010b0130010e0131011001310113013201160132011601310113013101110131010e0130010b012f0109012e0107012d0105012b01 +0301290101012701ff002501fe002301fd002101fc001e01fb001b01fb001901fb001601fb001601fa0016014e000000240325001601fa001601fa001301fa00 +1001fa000e01fb000b01fc000901fd000601ff00040100010201020100010401ff000601fd000901fc000b01fb000e01fb001001fa001301fa001601fb001601 +fb001301fb001001fc000e01fd000b01fe000901ff0007010101050103010301050101010701ff000901fe000b01fd000e01fc001101fb001301fb001601fb00 +1601fb001601fa008c000000240344008301160183011601830108018301fa008201ec008101de008001d1007f01c3007d01b7007b01aa0079019e0076019200 +7401860071017b006e0170006a01650067015b0063015100600148005c013f005701370053012f004f0128004a01210045011b00410115003c01100036010c00 +310108002c01050027010200210101001c0100001601ffff160100001b01000021010100260103002c0106003101090036010c003b0111004001160045011b00 +4a0122004e01280053013000570137005b0140005f0148006301520066015b006a0165006d01700070017b00730186007601920078019e007a01aa007c01b700 +7e01c4007f01d1008101de008101ec008201fa008301080183011601830116018e0000002403450016012d0216012d021c012c0221012b0227012a022c012702 +31012402360120023c011c0241011702450111024a010b024f0104025301fd015701f5015c01ed016001e4016301db016701d1016a01c7016e01bc017101b101 +7401a60176019a0179018e017b0182017d0175017f01690180015b0181014e018201400183013201830124018301160183011601830124018201320181014001 +81014e017f015b017e0168017c0175017a01820178018e0176019a017301a6017001b1016d01bc016a01c7016601d1016301da015f01e4015b01ec015701f501 +5301fc014e0104024a010a0245011102400116023b011b0236012002310123022c0126022601290221012b021b012c0216012c0216012c0216012d028e000000 +24034500a8001601a8001601a8002401a9003201aa004001ab004e01ac005b01ad006901af007501b1008201b3008e01b6009a01b800a601bb00b101be00bc01 +c100c701c500d101c800db01cc00e401d000ed01d400f501d900fd01dd000402e2000b02e6001102eb001702f0001c02f5002002fb0024020001270205012a02 +0b012b0210012c0216012d0216012c0210012c020b012b020601290200012602fb002302f6002002f1001b02ec001602e7001102e2000a02de000402d900fc01 +d500f501d100ec01cd00e401c900da01c600d101c200c701bf00bc01bc00b101b900a601b6009a01b4008e01b2008201b0007501ae006801ac005b01ab004e01 +aa004001aa003201a9002401a9001601a9001601a80016018e000000240345001601ffff1601ffff100100000b0101000501020000010500fb000800f5000c00 +f0001000eb001500e6001b00e2002100dd002800d9002f00d4003700d0003f00cc004800c8005100c5005b00c1006500be007000bb007b00b8008600b6009200 +b3009e00b100aa00af00b700ad00c300ac00d100ab00de00aa00ec00a900fa00a8000801a8001601a9001601a9000801aa00fa00aa00ec00ab00de00ac00d100 +ae00c400b000b700b200aa00b4009e00b6009200b9008600bc007b00bf007000c2006500c6005b00c9005200cd004800d1004000d5003700d9003000de002800 +e2002200e7001b00ec001600f1001100f6000c00fb00090000010600060103000b0101001001000016010000160100001601ffff8c000000240344006301c900 +6301c9005901bf004f01b5004401ac003a01a30030019a00250192001b018a001101820007017b00fc007400f2006e00e8006800de006200d5005d00cb005900 +c2005400b8005000af004d00a7004a009e004800960046008e004400860043007f00420078004200710043006a004400640045005f0047005a004a0055004d00 +510051005100520055004e005a004b005f004800650046006b00450071004400780043007f004300860044008e004500960046009e004800a6004b00af004e00 +b8005100c1005500cb005900d4005e00de006300e8006900f2006f00fc00750006017c00100183001b018a00250192002f019b003a01a3004401ac004e01b600 +5901bf006301c9006301c9008e00000024034500db01db01db01db01df01d701e201d201e501cd01e701c801e801c201e901bb01ea01b401ea01ad01e901a601 +e8019e01e6019601e4018e01e2018501df017d01dc017401d8016a01d4016101cf015701ca014e01c4014401be013a01b8012f01b1012501aa011b01a2011101 +9a0106019201fc008901f2008001e7007701dd006d01d3006301c9006301c9006d01d3007601dd008001e8008901f2009101fc009a010701a1011101a9011b01 +b0012601b7013001bd013a01c3014401c9014e01ce015801d3016101d7016b01db017401de017d01e1018601e4018e01e6019601e7019e01e801a601e901ad01 +e901b401e801bb01e701c101e601c701e401cd01e101d201de01d701da01db01da01db01db01db018e00000024034500c8006401c8006401d3006e01dd007701 +e7008001f2008901fc00920106019a011101a2011b01aa012501b1012f01b8013901be014301c4014d01ca015701cf016101d4016a01d8017301dc017c01df01 +8501e2018e01e5019601e7019e01e801a601e901ad01ea01b401ea01bb01e901c101e801c701e701cd01e501d201e201d701df01db01db01da01db01d601de01 +d201e201cd01e401c701e601c101e801bb01e901b401e901ad01e901a601e8019e01e7019601e6018e01e4018501e1017d01de017401db016a01d7016101d301 +5701ce014e01c9014401c3013a01be013001b7012601b0011b01a9011101a20107019a01fc009201f2008901e8008001dd007701d3006d01c9006301c9006301 +c80064018e0000002403450051005100510051004d0055004a005a0047005f004500650044006b00430071004200780042007f004300860044008e0045009600 +47009e004a00a7004d00b0005000b9005400c2005800cb005d00d5006200de006800e9006e00f3007400fd007b000701820011018a001b01920026019a003001 +a2003a01ab004501b5004f01be005901c8006401c9006301bf005901b5004f01ac004401a3003a019a003001920025018a001b01830011017c0006017500fc00 +6e00f2006800e8006300de005e00d4005900cb005500c1005100b8004e00af004b00a70048009e004600960045008e004400860043007f004300780043007100 +44006b004600650048005f004a005a004e0056005100520051005200510051008c000000240344001601a9001601a9000801a900f900a900ec00aa00de00ab00 +d000ac00c300ae00b600af00aa00b1009e00b3009100b6008600b9007b00bb007000be006500c2005b00c5005100c9004800cd003f00d1003700d5002f00d900 +2800dd002100e2001b00e7001500ec001000f1000c00f6000800fb00050000010200060101000b0100001101ffff1601000016010000110101000b0103000601 +050000010900fb000c00f6001100f1001600ec001b00e7002100e3002800de003000da003700d5004000d1004800cd005200c9005b00c6006500c2007000bf00 +7b00bc008600b9009200b7009e00b400aa00b200b700b000c300ae00d100ad00de00ac00ec00ab00f900aa000801aa001601a9001601a9008e00000024034500 +2d0216012d0216012c0210012b020b012a020501270200012402fb002002f5001c02f0001702eb001102e6000b02e2000402dd00fd01d900f501d500ed01d000 +e401cc00db01c900d101c500c701c100bc01be00b101bb00a601b8009a01b6008e01b3008201b1007501af006801ad005b01ac004e01ab004001aa003201a900 +2401a9001601a9001601a9002401aa003201aa004001ab004e01ac005b01ad006801ae007501b0008201b2008e01b4009a01b600a601b900b101bc00bc01bf00 +c601c200d101c600da01c900e301cd00ec01d100f501d500fc01d9000402de000a02e2001102e7001602ec001b02f1002002f6002302fb002602000129020601 +2b020b012c0210012c0216012c0216012d0216018e0000002403450016018401160184012401840132018301400182014e0181015b01800168017f0175017d01 +82017b018e0179019a017601a6017401b1017101bc016e01c7016b01d1016701db016301e4016001ed015c01f5015701fd01530104024f010b024a0111024501 +170241011c023c01200237012402310127022c012a0227012b0221012c021c012d0216012c0216012c021c012b0221012902260127022c012302310120023601 +1b023b0116024001110245010a024a0104024e01fc015301f5015701ec015b01e4015f01da016301d1016601c6016a01bc016d01b1017001a60173019a017601 +8e01780182017a0175017c0168017e015b017f014e0181014001820132018201240183011601830116018301160184018e00000024034500ffff1601ffff1601 +00001c01010021010200270105002c01080032010c00370110003c01150041011b00460121004a0128004f012f005301370058013f005c014800600151006401 +5b00670165006b0170006e017b00710186007401910077019e007901aa007b01b6007d01c3007f01d1008001de008101ec008201f90083010801840116018401 +1601830108018301f9008201ec008201de008101d1008001c3007e01b7007c01aa007a019e00780192007601860073017b00700170006d0165006a015b006701 +5200630148005f0140005b01370057013000530128004e0121004a011b0045011600400111003b010c0036010900310105002c01030027010100210100001c01 +0000160100001601ffff16018e00000024034500c800c900c800c900be00d300b500dd00ac00e800a300f2009a00fc00920007018a00110182001b017b002601 +740030016e003a016800440162004e015d0058015800610154006b01500074014d007d014a00860148008e014500970144009e014300a6014200ae014200b501 +4300bb014400c2014500c8014700cd014a00d3014d00d7015100db015200db014e00d7014b00d2014800cd014600c8014500c2014400bb014300b5014300ae01 +4400a60145009f014600970148008e014b0086014e007d015100740155006b01590061015e00580163004e01690044016f003a01750030017c00260183001c01 +8a001101920007019a00fd00a300f200ac00e800b500de00bf00d300c900c900c900c900c800c9008e00000024034500db015100db015100d7014d00d2014a00 +cd014700c7014500c1014400bb014300b4014200ad014200a60143009e014400960146008e01480085014a007c014d00730150006a0154006101590057015d00 +4d0163004301680039016e002f01750025017b001b01820011018a0006019200fc009a00f200a300e700ac00dd00b500d300bf00c800c900c900c900d300bf00 +dd00b600e800ac00f200a300fc009b000701920011018b001b01830026017c00300175003a016f00440169004e01630057015e00610159006a01550074015100 +7d014e0085014b008e014800960146009e014500a6014400ad014300b4014300bb014400c1014500c7014600cd014800d2014b00d6014e00da015100da015100 +db0151008e0000002403450063016401630164016d01590177014f018001450189013a01920130019a012601a2011b01aa011101b1010701b801fd00be01f200 +c401e800c901de00cf01d500d301cb00d801c200dc01b800df01af00e201a700e4019e00e6019600e8018e00e9018600e9017f00e9017800e9017100e8016b00 +e7016500e4015f00e2015a00df015500db015100da015100de015600e1015a00e4015f00e6016500e7016b00e8017100e9017800e9017f00e8018600e7018e00 +e6019600e4019e00e101a600de01af00db01b800d701c100d301cb00ce01d400c901de00c301e800bd01f200b701fc00b0010601a9011101a2011b019a012501 +9101300189013a018001440176014f016d0159016301630163016301630164018e000000240345005100db015100db015500df015a00e2015f00e5016500e701 +6b00e9017100ea017800ea017f00ea018600e9018e00e8019600e7019e00e501a700e201b000df01b900dc01c200d801cb00d401d500cf01df00ca01e800c401 +f200be01fd00b8010701b1011101aa011b01a20126019a01300192013a018a01450181014f01770159016e01630164016301630159016d014f01770144018001 +3a0189013001920125019a011b01a2011101a9010601b001fc00b701f200be01e800c401de00c901d400ce01cb00d301c100d701b800db01af00df01a700e201 +9e00e4019600e6018e00e8018600e9017f00e9017800e9017100e9016b00e8016500e6015f00e4015a00e2015600df015200db015200db015100db0107000000 +fc020000ff0000000000040000002d0102004600000024032100b2011d01b3011d01b5011e01b7011f01b8012001b9012101ba012301bb012401bb012601bb01 +2801ba012a01b9012b01b8012d01b7012e01b5012f01b3012f01b2012f01b0012f01ae012f01ad012e01ab012d01aa012b01a9012a01a9012801a9012601a901 +2401a9012301aa012101ab012001ad011f01ae011e01b0011d01b2011d0146000000240321002601720027017200290172002b0173002c0174002d0176002e01 +77002f0179002f017b002f017d002e017e002d0180002c0181002b0182002901830027018400260184002401840022018300210182001f0181001e0180001d01 +7e001d017d001d017b001d0179001d0177001e0176001f0174002101730022017200240172002601720046000000240321007b00fd007d00fd007f00fe008000 +fe0082000001830001018400020184000401840006018400080184000a0183000b0182000c0180000e017f000e017d000f017b000f0179000f0178000e017600 +0e0175000c0174000b0173000a017200080172000601720004017300020174000101750000017600fe007800fe007900fd007b00fd0046000000240321000401 +a9010601a9010701aa010901ab010a01ac010b01ad010c01af010d01b0010d01b2010d01b4010c01b6010b01b7010a01b9010901ba010701bb010601bb010401 +bb010201bb010001bb01ff00ba01fe00b901fc00b701fc00b601fb00b401fb00b201fb00b001fc00af01fc00ad01fe00ac01ff00ab010001aa010201a9010401 +a901040000002d01000004000000f00102002e00000024031500bb012601bb012601bb012401ba012301b9012101b8011f01b7011e01b5011d01b4011d01b201 +1d01b2011d01b3011e01b5011e01b7011f01b8012001b9012101ba012301ba012401ba012601ba012601bb0126012e00000024031500b2013001b2013001b401 +2f01b5012f01b7012e01b8012d01b9012c01ba012a01bb012801bb012601ba012601ba012801ba012a01b9012b01b8012c01b7012d01b5012e01b3012f01b201 +2f01b2012f01b20130012e00000024031500a8012601a8012601a8012801a9012a01aa012c01ab012d01ac012e01ae012f01b0012f01b2013001b2012f01b001 +2f01ae012e01ad012d01ac012c01aa012b01aa012a01a9012801a9012601a9012601a80126012c00000024031400b2011d01b2011d01b0011d01ae011d01ac01 +1e01ab011f01aa012101a9012301a8012401a8012601a9012601a9012401aa012301aa012101ac012001ad011f01ae011e01b0011e01b2011d01b2011d012e00 +0000240315002f017b002f017b002f0179002e0177002d0175002c0174002b0173002901720028017100260171002601720027017200290173002b0173002c01 +75002d0176002e0177002e0179002e017b002e017b002f017b002e00000024031500260184002601840028018400290183002b0183002c0181002d0180002e01 +7e002f017d002f017b002e017b002e017d002e017e002d0180002c0181002b01820029018300270183002601830026018300260184002e000000240315001c01 +7b001c017b001c017d001d017e001e0180001f0181002001830022018300240184002601840026018300240183002201830021018200200181001e0180001e01 +7e001d017d001d017b001d017b001c017b002e0000002403150026017100260171002401710022017200200173001f0174001e0175001d0177001c0179001c01 +7b001d017b001d0179001e0177001e017600200175002101730022017300240172002601720026017200260171002e0000002403150085000601850006018400 +040184000201830001018200ff008000fe007f00fd007d00fd007b00fd007b00fd007d00fd007f00fe008000ff00810000018200010183000301840004018400 +060184000601850006012e000000240315007b0010017b0010017d000f017f000f0180000e0182000d0183000b0184000a018400080185000601840006018400 +08018300090182000b0181000c0180000d017f000e017d000f017b000f017b000f017b0010012c0000002403140072000601720006017200080172000a017300 +0b0174000d0176000e0178000f0179000f017b0010017b000f0179000f0178000e0176000d0175000c0174000b01730009017300080172000601720006012c00 +0000240314007b00fd007b00fd007900fd007800fd007600fe007400ff0073000101720002017200040172000601720006017300040173000301740001017500 +00017600ff007800fe007900fd007b00fd007b00fd002c000000240314000d01b2010d01b2010d01b0010d01af010c01ad010b01ac010901aa010801aa010601 +a9010401a9010401aa010601aa010701aa010901ab010a01ac010b01ad010c01af010c01b0010d01b2010d01b2012e000000240315000401bc010401bc010601 +bc010801bb010901ba010b01b9010c01b8010d01b6010d01b4010d01b2010d01b2010c01b4010c01b6010b01b7010a01b8010901ba010701ba010601bb010401 +bb010401bb010401bc012c00000024031400fb00b201fb00b201fb00b401fb00b601fc00b801fd00b901ff00ba010001bb010201bc010401bc010401bb010201 +bb010101ba01ff00ba01fe00b801fd00b701fc00b601fb00b401fb00b201fb00b2012e000000240315000401a9010401a9010201a9010001aa01ff00aa01fd00 +ac01fc00ad01fb00af01fb00b001fb00b201fb00b201fb00b001fc00af01fd00ad01fe00ac01ff00ab010101aa010201aa010401aa010401aa010401a9010700 +0000fc0200000066bf000000040000002d010200c200000024035f003c01c0005101c9006501cd006501cd006501ce006401ce006401cf006401d0006401d000 +6301d1006301d1006201d1006201d2006201d2006201d3006101d4006001d5005f01d6005e01d7005e01d7005e01d7005d01d8005d01d9005c01da005a01db00 +5901dc005701dd005701dd005701dd005601de005601df005501e0005301e1005101e1004e01e2004e01e2004e01e2004e01e3004e01e3004e01e3004d01e400 +4d01e4004c01e4004b01e5004b01e5004a01e5004901e6004701e6004601e6004501e6004301e6004301e7004201e7004101e7004001e8003f01e9003d01e900 +3b01e9003801e9003801e9003801e9003801e9003801ea003701ea003701ea003601ea003601ea003501ea003401ea003301eb003201eb003101eb002f01eb00 +2e01eb002c01eb002b01eb002b01eb002901ec002801ec002601ec002401ec002301ec002101eb002101eb002001eb001f01eb001e01eb001d01eb001c01eb00 +1a01eb001a01ea001a01cc002501c6002d01be003c01c0008a000000240343001a01db001a01db001b01dc001b01dc001d01dc001e01dc001f01dc002101dc00 +2201dc002301dc002401dc002601dc002701dc002901dc002b01dc002d01dc002f01db003101db003301db003501da003801da003a01d9003c01d9003e01d800 +4101d7004301d7004501d6004601d5004801d4004901d2004b01d1004c01d0004d01cf004e01ce004f01cd005001cc005001cb005101cb005101ca005101ca00 +5101c9005101c9005001c9005001c9004f01c9004e01c8004d01c8004c01c8004c01c8004b01c8004a01c8004901c9004701c9004501ca004201cb004001cc00 +3d01cc003b01cd003801ce003601cf003401d0003201d0003101d1003001d1002f01d1001a01d5001a01db0007000000fc0200000059b2000000040000002d01 +030004000000f00102008a000000240343002201db002301db002401db002601db002701db002901db002b01db002d01db002f01da003101da003301da003501 +d9003801d9003a01d8003c01d8003e01d7004101d7004301d6004501d5004601d4004801d3004901d2004b01d1004c01d0004d01cf004e01ce004f01cd004f01 +cc005001cb005001ca005101ca005101ca005101c9005101c9005001c9005001c9004f01c9004e01c8004d01c8004c01c8004c01c8004b01c8004a01c8004901 +c9004701c9004501ca004201cb004001cc003d01cc003b01cd003801ce003601cf003401d0003201d0003101d1003001d1002f01d1001a01d5001a01db001a01 +db001b01db001c01db001d01db001e01db001f01db002101db002201db0007000000fc020000004da6000000040000002d01020004000000f00103008a000000 +240343002201db002301db002401db002601db002701da002901da002b01da002d01da002f01da003101d9003301d9003501d9003701d8003a01d8003c01d700 +3e01d6004001d6004201d5004401d4004601d3004801d2004901d1004b01d0004c01cf004d01ce004e01cd004f01cc004f01cc005001cb005001ca005001ca00 +5001c9005101c9005001c9005001c9004f01c9004f01c9004e01c8004d01c8004c01c8004c01c8004b01c8004a01c8004901c9004701c9004501ca004201cb00 +4001cc003d01cc003b01cd003801ce003601cf003401d0003201d0003101d1003001d1002f01d1001a01d5001a01da001a01da001b01da001c01da001d01da00 +1e01da001f01da002101db002201db0007000000fc020000004099000000040000002d01030004000000f00102008a000000240343002301da002301da002501 +da002601da002701da002901da002b01d9002d01d9002f01d9003101d9003301d8003501d8003701d7003a01d7003c01d6003e01d6004001d5004201d4004401 +d3004601d2004801d1004901d1004a01d0004c01cf004d01ce004d01cd004e01cc004f01cb004f01cb005001ca005001ca005001c9005001c9005001c9005001 +c9004f01c9004e01c9004e01c8004d01c8004c01c8004c01c8004b01c8004a01c8004901c9004701c9004501ca004201cb004001cc003d01cc003b01cd003801 +ce003601cf003401d0003201d0003101d1003001d1002f01d1001a01d5001a01d9001a01d9001b01da001c01da001d01da001e01da001f01da002101da002301 +da0007000000fc02000000338c000000040000002d01020004000000f00103008a000000240343002301d9002401d9002501d9002601d9002701d9002901d900 +2b01d9002d01d8002f01d8003101d8003301d7003501d7003701d6003a01d6003c01d5003e01d5004001d4004201d3004401d2004601d2004801d1004901d000 +4a01cf004b01ce004c01cd004d01cc004e01cc004f01cb004f01ca004f01ca005001c9005001c9005001c9005001c9004f01c9004f01c9004e01c9004d01c800 +4d01c8004c01c8004c01c8004b01c8004a01c8004901c9004701c9004501ca004201cb004001cc003d01cc003b01cd003801ce003601cf003401d0003201d000 +3101d1003001d1002f01d1001a01d5001a01d9001a01d9001b01d9001c01d9001d01d9001e01d9001f01d9002101d9002301d90007000000fc02000000267f00 +0000040000002d01030004000000f00102008a000000240343002301d8002401d8002501d8002601d8002801d8002901d8002b01d8002d01d8002f01d7003101 +d7003301d7003501d6003701d6003a01d5003c01d4003e01d4004001d3004201d2004401d2004601d1004801d0004901cf004a01ce004b01ce004c01cd004d01 +cc004e01cb004e01cb004f01ca004f01ca004f01c9004f01c9004f01c9004f01c9004f01c9004f01c9004e01c8004d01c8004d01c8004c01c8004c01c8004b01 +c8004a01c8004901c9004701c9004501ca004201cb004001cc003d01cc003b01cd003801ce003601cf003401d0003201d0003101d1003001d1002f01d1001a01 +d5001a01d8001a01d8001b01d8001c01d8001d01d8001e01d8002001d8002101d8002301d80007000000fc020000001a73000000040000002d01020004000000 +f00103008a000000240343001a01d7001a01d7001b01d7001c01d7001d01d7001e01d7002001d7002101d7002301d8002401d8002501d8002601d7002801d700 +2901d7002b01d7002d01d7002f01d6003101d6003301d6003501d5003701d5003a01d4003c01d4003e01d3004001d2004201d2004401d1004601d0004701cf00 +4901cf004a01ce004b01cd004c01cc004d01cc004d01cb004e01ca004e01ca004f01c9004f01c9004f01c9004f01c9004f01c9004f01c9004e01c9004e01c800 +4d01c8004d01c8004c01c8004c01c8004b01c8004a01c8004901c9004701c9004501ca004201cb004001cc003d01cc003b01cd003801ce003601cf003401d000 +3201d0003101d1003001d1002f01d1001a01d5001a01d70007000000fc0200000066bf000000040000002d01030004000000f00102004a0100002403a3001a01 +ea001a01eb001c01eb001d01eb001e01eb001f01eb002001eb002101eb002101eb002301ec002401ec002601ec002801ec002901ec002b01eb002b01eb002c01 +eb002e01eb002f01eb003101eb003201eb003301eb003401ea003501ea003601ea003601ea003701ea003701ea003801ea003801e9003801e9003801e9003801 +e9003a01e9003d01e9003f01e9004001e8004101e8004201e7004301e7004301e6004501e6004601e6004701e6004901e6004a01e5004b01e5004b01e5004c01 +e4004d01e4004d01e4004e01e3004e01e3004e01e3004e01e2004e01e2004e01e2005101e1005301e1005501e0005601df005601de005701dd005701dd005701 +dd005901dc005a01db005c01da005d01d9005d01d8005e01d7005e01d7005e01d7005f01d6006001d5006101d4006201d3006201d2006201d2006201d1006301 +d1006301d1006401d0006401d0006401cf006401ce006501ce006501cd006501cd005d01cb005d01cb005c01cc005c01cc005c01cc005b01cd005b01cd005b01 +ce005a01ce005a01ce005a01cf005a01cf005901d0005901d1005801d1005701d2005601d3005501d3005501d3005501d4005401d5005301d6005201d7005101 +d8004f01d8004f01d8004f01d9004e01d9004d01da004c01db004b01db004901dc004601dc004601dc004601dd004501dd004501de004301df004201df004001 +df003e01e0003e01e0003e01e0003e01e0003d01e1003b01e1003a01e1003701e2003401e2003401e2003301e2003201e2003101e3003001e3002e01e3002c01 +e4002a01e3002a01e3002901e4002801e4002601e4002501e4002301e4002101e4001f01e4001f01e4001f01e4001e01e4001d01e4001c01e4001b01e4001a01 +e4001a01e4001a01ea0007000000fc0200000072c4000000040000002d01020004000000f00103004a0100002403a3003f01e0003f01e1003f01e1003e01e100 +3d01e2003c01e2003a01e2003801e3003501e3003401e3003401e3003301e3003201e4003001e4002e01e4002c01e4002a01e4002a01e4002901e5002801e500 +2701e5002501e5002301e5002101e5002001e5001f01e5001f01e5001e01e5001d01e5001c01e5001b01e5001a01e5001a01e4001a01ea001a01eb001c01eb00 +1d01eb001e01eb001f01eb002001eb002101eb002101eb002301ec002401ec002601ec002801ec002901ec002b01eb002b01eb002c01eb002e01eb002f01eb00 +3101eb003201eb003301eb003401ea003501ea003601ea003601ea003701ea003701ea003801ea003801e9003801e9003801e9003801e9003a01e9003d01e900 +3f01e9004001e8004101e8004201e7004301e7004301e6004501e6004601e6004701e6004901e6004a01e5004b01e5004b01e5004c01e4004d01e4004d01e400 +4e01e3004e01e3004e01e3004e01e2004e01e2004e01e2005101e1005301e1005501e0005601df005601de005701dd005701dd005701dd005901dc005a01db00 +5c01da005d01d9005d01d8005e01d7005e01d7005e01d7005f01d6006001d5006101d4006201d3006201d2006201d2006201d1006301d1006301d1006401d000 +6401d0006401cf006401ce006501ce006501cd006501cd005e01cc005e01cc005d01cc005d01cc005d01cd005d01cd005c01ce005c01ce005b01ce005b01cf00 +5b01cf005b01d0005a01d0005a01d1005901d2005801d3005701d3005701d3005601d4005601d5005501d6005401d7005301d8005201d8005101d9005101d900 +5001d9005001da004f01db004d01db004c01dc004a01dd004801dd004801dd004701de004701de004601df004401e0004301e0004101e0003f01e00007000000 +fc0200000880c7000000040000002d01030004000000f00102004a0100002403a3004001e1003f01e2003f01e2003f01e2003e01e3003d01e3003b01e3003801 +e4003501e4003501e4003401e4003301e5003201e5003001e5002e01e5002c01e5002a01e5002a01e5002901e6002801e6002701e6002501e6002301e6002201 +e6002001e6002001e6001f01e6001e01e6001d01e6001c01e6001b01e6001a01e6001a01e5001a01ea001a01eb001c01eb001d01eb001e01eb001f01eb002001 +eb002101eb002101eb002301ec002401ec002601ec002801ec002901ec002b01eb002b01eb002c01eb002e01eb002f01eb003101eb003201eb003301eb003401 +ea003501ea003601ea003601ea003701ea003701ea003801ea003801e9003801e9003801e9003801e9003a01e9003d01e9003f01e9004001e8004101e8004201 +e7004301e7004301e6004501e6004601e6004701e6004901e6004a01e5004b01e5004b01e5004c01e4004d01e4004d01e4004e01e3004e01e3004e01e3004e01 +e2004e01e2004e01e2005101e1005301e1005501e0005601df005601de005701dd005701dd005701dd005901dc005a01db005c01da005d01d9005d01d8005e01 +d7005e01d7005e01d7005f01d6006001d5006101d4006201d3006201d2006201d2006201d1006301d1006301d1006401d0006401d0006401cf006401ce006501 +ce006501cd006501cd005f01cc005f01cc005f01cc005e01cd005e01cd005e01ce005e01ce005d01cf005d01cf005d01cf005d01cf005c01d0005c01d1005b01 +d1005a01d2005901d3005801d4005801d4005701d5005701d5005601d7005501d8005401d8005301d9005201d9005201d9005101da005101db005001db004f01 +dc004d01dd004b01de004901de004901de004801df004801df004701e0004501e0004401e1004201e1004001e10007000000fc020000128ccc00000004000000 +2d01020004000000f00103004a0100002403a3004001e2004001e2004001e3003f01e3003f01e4003d01e4003b01e4003901e5003601e5003501e5003501e500 +3401e6003201e6003101e6002f01e7002d01e7002b01e6002a01e6002a01e7002901e7002701e7002601e7002401e7002201e7002001e7002001e7001f01e700 +1e01e7001d01e7001c01e7001b01e7001a01e7001a01e6001a01ea001a01eb001c01eb001d01eb001e01eb001f01eb002001eb002101eb002101eb002301ec00 +2401ec002601ec002801ec002901ec002b01eb002b01eb002c01eb002e01eb002f01eb003101eb003201eb003301eb003401ea003501ea003601ea003601ea00 +3701ea003701ea003801ea003801e9003801e9003801e9003801e9003a01e9003d01e9003f01e9004001e8004101e8004201e7004301e7004301e6004501e600 +4601e6004701e6004901e6004a01e5004b01e5004b01e5004c01e4004d01e4004d01e4004e01e3004e01e3004e01e3004e01e2004e01e2004e01e2005101e100 +5301e1005501e0005601df005601de005701dd005701dd005701dd005901dc005a01db005c01da005d01d9005d01d8005e01d7005e01d7005e01d7005f01d600 +6001d5006101d4006201d3006201d2006201d2006201d1006301d1006301d1006401d0006401d0006401cf006401ce006501ce006501cd006501cd006001cc00 +6001cc006001cc006001cd005f01cd005f01ce005f01ce005e01cf005e01cf005e01cf005e01d0005d01d0005d01d1005c01d2005b01d3005a01d4005901d400 +5901d4005901d5005801d6005701d7005701d8005501d9005401da005301da005301da005201db005201db005101dc005001dd004e01de004c01de004a01df00 +4a01df004901df004901e0004801e1004601e1004501e2004301e2004001e20007000000fc0200001e99d1000000040000002d01030004000000f00102004a01 +00002403a3004101e3004101e3004101e4004001e4003f01e5003e01e5003c01e5003901e6003601e6003601e6003501e6003401e7003301e7003101e7002f01 +e7002d01e7002b01e7002b01e7002a01e8002901e8002701e8002601e8002401e8002201e8002001e8002001e8002001e8001f01e8001e01e8001c01e8001b01 +e8001a01e8001a01e7001a01ea001a01eb001c01eb001d01eb001e01eb001f01eb002001eb002101eb002101eb002301ec002401ec002601ec002801ec002901 +ec002b01eb002b01eb002c01eb002e01eb002f01eb003101eb003201eb003301eb003401ea003501ea003601ea003601ea003701ea003701ea003801ea003801 +e9003801e9003801e9003801e9003a01e9003d01e9003f01e9004001e8004101e8004201e7004301e7004301e6004501e6004601e6004701e6004901e6004a01 +e5004b01e5004b01e5004c01e4004d01e4004d01e4004e01e3004e01e3004e01e3004e01e2004e01e2004e01e2005101e1005301e1005501e0005601df005601 +de005701dd005701dd005701dd005901dc005a01db005c01da005d01d9005d01d8005e01d7005e01d7005e01d7005f01d6006001d5006101d4006201d3006201 +d2006201d2006201d1006301d1006301d1006401d0006401d0006401cf006401ce006501ce006501cd006501cd006101cc006101cc006101cd006101cd006101 +ce006001ce006001cf006001cf005f01d0005f01d0005f01d0005f01d1005e01d2005d01d2005d01d3005c01d4005a01d5005a01d5005a01d6005901d7005901 +d8005801d9005701da005501da005401db005401db005401db005301dc005201dd005101de004f01df004d01df004b01e0004b01e0004a01e0004a01e1004901 +e2004701e2004501e3004301e3004101e30007000000fc02000029a6d4000000040000002d01020004000000f00103004a0100002403a3004101e4004101e400 +4101e5004101e5004001e6003e01e6003c01e6003a01e7003701e7003601e7003601e7003501e8003301e8003101e8003001e9002d01e9002b01e8002b01e800 +2a01e9002901e9002801e9002601e9002401e9002201e9002101e9002001e9002001e9001f01e9001e01e9001d01e9001b01e9001a01e9001a01e8001a01ea00 +1a01eb001c01eb001d01eb001e01eb001f01eb002001eb002101eb002101eb002301ec002401ec002601ec002801ec002901ec002b01eb002b01eb002c01eb00 +2e01eb002f01eb003101eb003201eb003301eb003401ea003501ea003601ea003601ea003701ea003701ea003801ea003801e9003801e9003801e9003801e900 +3a01e9003d01e9003f01e9004001e8004101e8004201e7004301e7004301e6004501e6004601e6004701e6004901e6004a01e5004b01e5004b01e5004c01e400 +4d01e4004d01e4004e01e3004e01e3004e01e3004e01e2004e01e2004e01e2005101e1005301e1005501e0005601df005601de005701dd005701dd005701dd00 +5901dc005a01db005c01da005d01d9005d01d8005e01d7005e01d7005e01d7005f01d6006001d5006101d4006201d3006201d2006201d2006201d1006301d100 +6301d1006401d0006401d0006401cf006401ce006501ce006501cd006501cd006201cd006201cd006201cd006201cd006201ce006201cf006101cf006101d000 +6101d0006101d0006001d1006001d1005f01d2005f01d3005e01d4005d01d5005b01d5005b01d5005b01d6005b01d7005a01d8005901d9005801da005701db00 +5501db005501db005501dc005401dd005301de005201de005101df004f01e0004c01e1004c01e1004c01e1004b01e2004a01e3004801e3004601e4004401e400 +4101e40007000000fc02000033b3d9000000040000002d01030004000000f00102005a0100002403ab001a01ea001a01eb001c01eb001d01eb001e01eb001f01 +eb002001eb002101eb002101eb002301ec002401ec002601ec002801ec002901ec002b01eb002b01eb002c01eb002e01eb002f01eb003101eb003201eb003301 +eb003401ea003501ea003601ea003601ea003701ea003701ea003801ea003801e9003801e9003801e9003801e9003a01e9003d01e9003f01e9004001e8004101 +e8004201e7004301e7004301e6004501e6004601e6004701e6004901e6004a01e5004b01e5004b01e5004c01e4004d01e4004d01e4004e01e3004e01e3004e01 +e3004e01e2004e01e2004e01e2005101e1005301e1005501e0005601df005601de005701dd005701dd005701dd005901dc005a01db005c01da005d01d9005d01 +d8005e01d7005e01d7005e01d7005f01d6006001d5006101d4006201d3006201d2006201d2006201d1006301d1006301d1006401d0006401d0006401cf006401 +ce006501ce006501cd006501cd006301cd006301cd006301cd006301ce006301ce006301cf006301d0006201d0006201d0006201d0006201d1006101d2006101 +d2006001d3005f01d4005e01d5005d01d6005d01d6005c01d7005c01d8005b01d9005a01da005901db005801dc005601dc005601dc005601dd005501dd005401 +de005301df005201e0005001e1004d01e1004d01e2004d01e2004c01e3004b01e3004901e4004701e5004501e5004201e5004201e5004201e6004101e6004001 +e7003f01e7003d01e7003a01e8003701e8003701e8003701e8003701e8003601e8003601e8003501e9003401e9003401e9003301e9003201e9003101e9003001 +ea002f01ea002e01ea002d01e9002c01e9002b01e9002b01ea002a01ea002801ea002601ea002501ea002301ea002101ea002101ea002001ea001f01ea001e01 +ea001d01ea001b01ea001a01ea001a01e9001a01ea004000000024031e005d01d6004d01ce004d01ce004d01ce004d01cf004e01cf004e01cf004e01cf004f01 +cf004f01d0005001d0005101d1005201d1005401d2005601d3005701d4005901d5005901d5005a01d5005b01d6005b01d6005c01d6005c01d7005c01d7005c01 +d7005c01d7005c01d7005c01d7005d01d6005d01d60008000000fa0206000100000000002600040000002d01020008000000250302005e01d7004901cd000700 +0000fc020000000d66000000040000002d01040004000000f0010300040000002d01010004000000f001020010000000240306005e01d6005f01d6004a01cc00 +4a01cd005e01d7005e01d60007000000fc020000001f73000000040000002d01020004000000f001040010000000240306004a01cc004a01cd005c01d6005d01 +d5004a01cc004a01cc0007000000fc020000003382000000040000002d01030004000000f001020010000000240306004a01cc004a01cd005a01d5005b01d400 +4a01cc004a01cc0007000000fc02000000458f000000040000002d01020004000000f001030010000000240306004a01cc004a01cd005901d4005901d3004a01 +cc004a01cc0007000000fc02000000599e000000040000002d01030004000000f001020010000000240306004a01cc004a01cd005701d3005701d2004a01cc00 +4a01cc0007000000fc020000006bab000000040000002d01020004000000f001030010000000240306004a01cc004a01cd005501d2005501d1004a01cc004a01 +cc0007000000fc020000057fba000000040000002d01030004000000f001020010000000240306004a01cc004a01cd005301d1005301d0004a01cc004a01cc00 +07000000fc0200001791c7000000040000002d01020004000000f001030010000000240306004a01cc004a01cd005101d0005101d0004a01cc004a01cc000700 +0000fc02000029a6d6000000040000002d01030004000000f001020010000000240306004a01cc004a01cd004f01cf004f01cf004a01cc004a01cc0007000000 +fc02000038b8e3000000040000002d01020004000000f001030010000000240306004a01cc004a01cd004d01cf004e01ce004a01cc004a01cc0007000000fc02 +00004cccf2000000040000002d01030004000000f001020010000000240306004a01cc004a01cd004b01ce004c01cd004a01cc004a01cc0007000000fc020000 +33b3d9000000040000002d01020004000000f00103003800000024031a005601dc004801d2004801d2004801d3004901d3004a01d4004a01d4004b01d5004d01 +d6004e01d7005001d8005101d9005201da005301db005401db005401dc005501dc005501dc005501dd005601dd005601dd005601dd005601dd005601dd005601 +dd005601dc0008000000fa0206000100000000002600040000002d01030008000000250302005701dd004301cf0007000000fc020000000d6600000004000000 +2d01040004000000f0010200040000002d01010004000000f001030010000000240306005801dd005801dc004401ce004301cf005701dd005801dd0007000000 +fc020000001f73000000040000002d01020004000000f001040010000000240306004301cf004301cf005601dc005601db004401ce004301cf0007000000fc02 +0000003382000000040000002d01030004000000f001020010000000240306004301cf004301cf005401da005401da004401ce004301cf0007000000fc020000 +00458f000000040000002d01020004000000f001030010000000240306004301cf004301cf005201d9005201d8004401ce004301cf0007000000fc0200000059 +9e000000040000002d01030004000000f001020010000000240306004301cf004301cf005001d8005101d7004401ce004301cf0007000000fc020000006bab00 +0000040000002d01020004000000f001030010000000240306004301cf004301cf004e01d7004f01d6004401ce004301cf0007000000fc020000057fba000000 +040000002d01030004000000f001020010000000240306004301cf004301cf004c01d5004d01d5004401ce004301cf0007000000fc0200001791c70000000400 +00002d01020004000000f001030010000000240306004301cf004301cf004a01d4004b01d3004401ce004301cf0007000000fc02000029a6d600000004000000 +2d01030004000000f001020010000000240306004301cf004301cf004801d3004901d2004401ce004301cf0007000000fc02000038b8e3000000040000002d01 +020004000000f001030010000000240306004301cf004301cf004701d2004701d1004401ce004301cf0007000000fc0200004cccf2000000040000002d010300 +04000000f001020010000000240306004301cf004301cf004501d0004501d0004401ce004301cf0007000000fc02000033b3d9000000040000002d0102000400 +0000f00103003800000024031a004e01e2004101d6004101d6004201d6004201d7004301d8004301d8004401d9004501da004701dc004801dd004901de004a01 +df004b01e0004b01e1004c01e1004c01e2004d01e2004d01e2004d01e2004d01e3004d01e3004d01e3004d01e3004e01e2004e01e20008000000fa0206000100 +000000002600040000002d01030008000000250302004e01e2003d01d20007000000fc020000000d66000000040000002d01040004000000f001020004000000 +2d01010004000000f001030010000000240306004f01e2004f01e2003e01d2003e01d3004e01e3004f01e20007000000fc020000001f73000000040000002d01 +020004000000f001040010000000240306003e01d2003e01d3004d01e1004d01e0003e01d2003e01d20007000000fc020000003382000000040000002d010300 +04000000f001020010000000240306003e01d2003e01d3004b01e0004c01df003e01d2003e01d20007000000fc02000000458f000000040000002d0102000400 +0000f001030010000000240306003e01d2003e01d3004a01de004a01dd003e01d2003e01d20007000000fc02000000599e000000040000002d01030004000000 +f001020010000000240306003e01d2003e01d3004801dd004901dc003e01d2003e01d20007000000fc020000006bab000000040000002d01020004000000f001 +030010000000240306003e01d2003e01d3004701db004701db003e01d2003e01d20007000000fc020000057fba000000040000002d01030004000000f0010200 +10000000240306003e01d2003e01d3004501da004601d9003e01d2003e01d20007000000fc0200001791c7000000040000002d01020004000000f00103001000 +0000240306003e01d2003e01d3004401d8004401d8003e01d2003e01d20007000000fc02000029a6d6000000040000002d01030004000000f001020010000000 +240306003e01d2003e01d3004201d7004301d6003e01d2003e01d20007000000fc02000038b8e3000000040000002d01020004000000f0010300100000002403 +06003e01d2003e01d3004001d6004101d5003e01d2003e01d20007000000fc0200004cccf2000000040000002d01030004000000f00102001000000024030600 +3e01d2003e01d3003f01d4004001d3003e01d2003e01d20007000000fc02000033b3d9000000040000002d01020004000000f00103004000000024031e004301 +e6003801d8003801d8003801d8003901d8003901d8003901d9003901d9003901da003a01da003a01db003b01dc003c01dd003d01de003e01e0003f01e2003f01 +e3004001e4004001e4004101e5004101e5004101e6004101e6004201e6004201e6004101e7004101e7004201e7004201e6004301e60008000000fa0206000100 +000000002600040000002d01030008000000250302004301e6003501d40007000000fc020000000d66000000040000002d01040004000000f001020004000000 +2d01010004000000f001030010000000240306004301e6004401e6003601d4003601d4004301e7004301e60007000000fc020000001f73000000040000002d01 +020004000000f001040010000000240306003601d4003601d4004201e5004301e4003601d4003601d40007000000fc020000003382000000040000002d010300 +04000000f001020010000000240306003601d4003601d4004101e3004101e3003601d4003601d40007000000fc02000000458f000000040000002d0102000400 +0000f001030010000000240306003601d4003601d4003f01e2004001e1003601d4003601d40007000000fc02000000599e000000040000002d01030004000000 +f001020010000000240306003601d4003601d4003e01e0003f01df003601d4003601d40007000000fc020000006bab000000040000002d01020004000000f001 +030010000000240306003601d4003601d4003d01de003e01de003601d4003601d40007000000fc020000057fba000000040000002d01030004000000f0010200 +10000000240306003601d4003601d4003c01dc003c01dc003601d4003601d40007000000fc0200001791c7000000040000002d01020004000000f00103001000 +0000240306003601d4003601d4003a01db003b01da003601d4003601d40007000000fc02000029a6d6000000040000002d01030004000000f001020010000000 +240306003601d4003601d4003901d9003a01d8003601d4003601d40007000000fc02000038b8e3000000040000002d01020004000000f0010300100000002403 +06003601d4003601d4003801d7003901d7003601d4003601d40007000000fc0200004cccf2000000040000002d01030004000000f00102001000000024030600 +3601d4003601d4003701d6003701d5003601d4003601d40007000000fc02000033b3d9000000040000002d01020004000000f00103004000000024031e003801 +e9003001d9003001d9003001d9003001d9003001d9003001da003001da003101db003101db003101dc003201dd003201df003301e0003401e2003501e4003501 +e5003601e6003601e6003601e7003601e8003601e8003701e9003701e9003701e9003701e9003701e9003701e9003701e9003801e90008000000fa0206000100 +000000002600040000002d01030008000000250302003801e9002e01d40007000000fc020000000d66000000040000002d01040004000000f001020004000000 +2d01010004000000f001030010000000240306003901e9003901e9002f01d4002e01d5003801e9003901e90007000000fc020000001f73000000040000002d01 +020004000000f001040010000000240306002e01d5002e01d5003701e7003801e7002f01d4002e01d50007000000fc020000003382000000040000002d010300 +04000000f001020010000000240306002e01d5002e01d5003601e6003701e5002f01d4002e01d50007000000fc02000000458f000000040000002d0102000400 +0000f001030010000000240306002e01d5002e01d5003501e4003601e3002f01d4002e01d50007000000fc02000000599e000000040000002d01030004000000 +f001020010000000240306002e01d5002e01d5003401e2003501e1002f01d4002e01d50007000000fc020000006bab000000040000002d01020004000000f001 +030010000000240306002e01d5002e01d5003301e0003401e0002f01d4002e01d50007000000fc020000057fba000000040000002d01030004000000f0010200 +10000000240306002e01d5002e01d5003201de003301de002f01d4002e01d50007000000fc0200001791c7000000040000002d01020004000000f00103001000 +0000240306002e01d5002e01d5003101dc003201dc002f01d4002e01d50007000000fc02000029a6d6000000040000002d01030004000000f001020010000000 +240306002e01d5002e01d5003101da003101da002f01d4002e01d50007000000fc02000038b8e3000000040000002d01020004000000f0010300100000002403 +06002e01d5002e01d5003001d8003001d8002f01d4002e01d50007000000fc0200004cccf2000000040000002d01030004000000f00102001000000024030600 +2e01d5002e01d5002f01d6003001d6002f01d4002e01d50008000000fa0206000100000000002600040000002d01020008000000250302002c01eb002501d400 +07000000fc020000000d66000000040000002d01040004000000f0010300040000002d01010004000000f001020010000000240306002c01eb002d01eb002601 +d5002501d5002c01eb002c01eb0007000000fc020000001f73000000040000002d01020004000000f001040010000000240306002601d5002501d5002b01e900 +2c01e9002601d5002601d50007000000fc020000003382000000040000002d01030004000000f001020010000000240306002601d5002501d5002b01e7002b01 +e7002601d5002601d50007000000fc02000000458f000000040000002d01020004000000f001030010000000240306002601d5002501d5002a01e5002b01e500 +2601d5002601d50007000000fc02000000599e000000040000002d01030004000000f001020010000000240306002601d5002501d5002901e3002a01e3002601 +d5002601d50007000000fc020000006bab000000040000002d01020004000000f001030010000000240306002601d5002501d5002901e1002a01e1002601d500 +2601d50007000000fc020000057fba000000040000002d01030004000000f001020010000000240306002601d5002501d5002801df002901de002601d5002601 +d50007000000fc0200001791c7000000040000002d01020004000000f001030010000000240306002601d5002501d5002801dd002801dd002601d5002601d500 +07000000fc02000029a6d6000000040000002d01030004000000f001020010000000240306002601d5002501d5002701db002801db002601d5002601d5000700 +0000fc02000038b8e3000000040000002d01020004000000f001030010000000240306002601d5002501d5002601d9002701d9002601d5002601d50007000000 +fc0200004cccf2000000040000002d01030004000000f001020010000000240306002601d5002501d5002601d7002701d6002601d5002601d50008000000fa02 +06000100000000002600040000002d01020008000000250302002101eb001d01d40007000000fc020000000d66000000040000002d01040004000000f0010300 +040000002d01010004000000f001020010000000240306002101eb002201eb001e01d4001d01d5002101eb002101eb0007000000fc020000001f730000000400 +00002d01020004000000f001040010000000240306001d01d5001d01d5002001e9002101e9001e01d4001d01d50007000000fc02000000338200000004000000 +2d01030004000000f001020010000000240306001d01d5001d01d5002001e7002101e7001e01d4001d01d50007000000fc02000000458f000000040000002d01 +020004000000f001030010000000240306001d01d5001d01d5002001e5002101e5001e01d4001d01d50007000000fc02000000599e000000040000002d010300 +04000000f001020010000000240306001d01d5001d01d5001f01e3002001e3001e01d4001d01d50007000000fc020000006bab000000040000002d0102000400 +0000f001030010000000240306001d01d5001d01d5001f01e1002001e1001e01d4001d01d50007000000fc020000057fba000000040000002d01030004000000 +f001020010000000240306001d01d5001d01d5001f01df002001df001e01d4001d01d50007000000fc0200001791c7000000040000002d01020004000000f001 +030010000000240306001d01d5001d01d5001e01dd001f01dd001e01d4001d01d50007000000fc02000029a6d6000000040000002d01030004000000f0010200 +10000000240306001d01d5001d01d5001e01db001f01da001e01d4001d01d50007000000fc02000038b8e3000000040000002d01020004000000f00103001000 +0000240306001d01d5001d01d5001d01d9001e01d8001e01d4001d01d50007000000fc0200004cccf2000000040000002d01030004000000f001020010000000 +240306001d01d5001d01d5001d01d7001e01d6001e01d4001d01d50007000000fc02000033b3d9000000040000002d01020004000000f0010300400000002403 +1e006201d1005101cc005101cc005101cc005101cc005201cc005201cc005201cc005301cd005301cd005401cd005501ce005701ce005901cf005a01cf005c01 +d0005d01d1005e01d1005f01d1006001d1006001d2006101d2006101d2006101d2006101d2006101d2006101d2006201d2006201d2006201d10008000000fa02 +06000100000000002600040000002d01030008000000250302006201d1004e01ca0007000000fc020000000d66000000040000002d01040004000000f0010200 +040000002d01010004000000f001030010000000240306006301d1006301d1004e01ca004e01cb006301d2006301d10007000000fc020000001f730000000400 +00002d01020004000000f001040010000000240306004e01ca004e01cb006101d1006101d0004e01ca004e01ca0007000000fc02000000338200000004000000 +2d01030004000000f001020010000000240306004e01ca004e01cb005f01d0005f01cf004e01ca004e01ca0007000000fc02000000458f000000040000002d01 +020004000000f001030010000000240306004e01ca004e01cb005d01d0005d01cf004e01ca004e01ca0007000000fc02000000599e000000040000002d010300 +04000000f001020010000000240306004e01ca004e01cb005b01cf005b01ce004e01ca004e01ca0007000000fc020000006bab000000040000002d0102000400 +0000f001030010000000240306004e01ca004e01cb005901ce005901ce004e01ca004e01ca0007000000fc020000057fba000000040000002d01030004000000 +f001020010000000240306004e01ca004e01cb005701ce005801cd004e01ca004e01ca0007000000fc0200001791c7000000040000002d01020004000000f001 +030010000000240306004e01ca004e01cb005501cd005601cc004e01ca004e01ca0007000000fc02000029a6d6000000040000002d01030004000000f0010200 +10000000240306004e01ca004e01cb005301cd005401cc004e01ca004e01ca0007000000fc02000038b8e3000000040000002d01020004000000f00103001000 +0000240306004e01ca004e01cb005201cc005201cb004e01ca004e01ca0007000000fc0200004cccf2000000040000002d01030004000000f001020010000000 +240306004e01ca004e01cb005001cb005001ca004e01ca004e01ca0007000000fc0200000066bf000000040000002d01020004000000f0010300ea0000002403 +73005001c8005001c9005001c9005001c9004f01ca004f01ca004e01cb004d01cb004b01cb004b01cc004b01cc004a01cd004a01ce004901ce004701cf004501 +cf004301cf004301cf004301d0004201d1004201d1004001d2003f01d2003d01d3003b01d3003b01d3003b01d3003a01d4003901d4003801d5003601d5003501 +d5003301d4003201d5003201d5003101d5003001d6002f01d6002d01d6002c01d6002a01d5002a01d6002901d6002901d6002801d7002701d7002501d7002301 +d7002201d6002101d7002101d7002001d7001f01d7001d01d7001c01d7001b01d7001a01d6001a01d0001a01d0001b01d0001b01d0001c01d0001c01d1001d01 +d0001e01d0001f01d0002001d0002001d0002101d0002201d0002401d0002501d0002601d0002701cf002701cf002801cf002901cf002a01cf002b01cf002c01 +cf002d01cf002f01ce002f01ce002f01ce003001ce003101ce003301ce003401ce003501cd003601cd003701cd003701cd003801cd003901cd003a01cc003b01 +cc003c01cb003d01ca003d01ca003e01ca003f01ca004001ca004101ca004201c9004301c8004401c8004401c8004401c8004501c7004501c7004601c7004701 +c7004701c6004801c5005001c80007000000fc0200000072c4000000040000002d01030004000000f0010200ea000000240373004501c8004401c9004301ca00 +4201ca004101ca004001cb003f01cb003e01cb003e01cb003d01cc003c01cd003b01cd003a01cd003901cd003801cd003701cd003701cd003601ce003501cf00 +3301cf003201cf003101cf003001cf002f01cf002f01cf002e01d0002d01d0002c01d0002a01d0002901d0002801d0002801d0002801d0002701d1002501d100 +2401d1002301d1002201d1002101d1002001d1002001d1001e01d1001d01d1001d01d1001c01d1001b01d1001b01d1001a01d1001a01d1001a01d6001b01d700 +1c01d7001d01d7001f01d7002001d7002101d7002101d7002201d6002301d7002501d7002701d7002801d7002901d6002901d6002a01d6002a01d5002c01d600 +2d01d6002f01d6003001d6003101d5003201d5003201d5003301d4003501d5003601d5003801d5003901d4003a01d4003b01d3003b01d3003b01d3003d01d300 +3f01d2004001d2004201d1004201d1004301d0004301cf004301cf004501cf004701cf004901ce004a01ce004a01cd004b01cc004b01cc004b01cb004d01cb00 +4e01cb004f01ca004f01ca005001c9005001c9005001c9005001c8004901c6004801c6004801c7004701c7004601c8004601c8004501c8004501c8004501c800 +07000000fc0200000880c7000000040000002d01020004000000f0010300ea000000240373004601c8004501c9004401ca004301cb004201cb004101cb004001 +cc003f01cc003f01cc003e01cd003d01cd003b01ce003a01ce003901ce003901ce003801ce003801ce003701cf003501d0003401d0003301d0003101d0003001 +d0003001d0003001d0002e01d0002d01d1002c01d1002b01d1002a01d1002901d1002801d1002801d1002701d1002601d2002401d2002301d2002201d2002101 +d2002001d2002001d2001f01d2001e01d2001d01d2001c01d2001b01d2001b01d2001a01d2001a01d2001a01d6001b01d7001c01d7001d01d7001f01d7002001 +d7002101d7002101d7002201d6002301d7002501d7002701d7002801d7002901d6002901d6002a01d6002a01d5002c01d6002d01d6002f01d6003001d6003101 +d5003201d5003201d5003301d4003501d5003601d5003801d5003901d4003a01d4003b01d3003b01d3003b01d3003d01d3003f01d2004001d2004201d1004201 +d1004301d0004301cf004301cf004501cf004701cf004901ce004a01ce004a01cd004b01cc004b01cc004b01cb004d01cb004e01cb004f01ca004f01ca005001 +c9005001c9005001c9005001c8004a01c6004901c7004901c8004801c8004701c8004701c8004601c8004601c8004601c80007000000fc020000128ccc000000 +040000002d01030004000000f0010200ea000000240373004701c9004601ca004501cb004401cb004301cc004201cc004101cc004001cc004001cc003f01cd00 +3d01ce003c01ce003b01cf003a01cf003901cf003901cf003901cf003701d0003601d0003501d1003301d1003201d1003101d1003001d1003001d1002f01d100 +2e01d2002c01d2002b01d2002a01d2002901d2002801d2002801d2002701d2002601d2002501d3002301d3002201d3002101d3002101d3002001d3001f01d300 +1e01d3001d01d3001c01d3001b01d3001b01d3001a01d3001a01d3001a01d6001b01d7001c01d7001d01d7001f01d7002001d7002101d7002101d7002201d600 +2301d7002501d7002701d7002801d7002901d6002901d6002a01d6002a01d5002c01d6002d01d6002f01d6003001d6003101d5003201d5003201d5003301d400 +3501d5003601d5003801d5003901d4003a01d4003b01d3003b01d3003b01d3003d01d3003f01d2004001d2004201d1004201d1004301d0004301cf004301cf00 +4501cf004701cf004901ce004a01ce004a01cd004b01cc004b01cc004b01cb004d01cb004e01cb004f01ca004f01ca005001c9005001c9005001c9005001c800 +4b01c6004a01c7004a01c8004901c8004901c9004801c9004701c9004701c9004701c90007000000fc0200001e99d1000000040000002d01020004000000f001 +0300ea000000240373004801ca004701ca004601cb004501cc004401cc004301cd004201cd004101cd004101cd003f01ce003e01cf003d01cf003c01cf003b01 +d0003a01d0003901d0003901d0003801d1003701d1003501d1003401d1003301d1003101d1003101d1003101d1002f01d2002e01d2002d01d3002c01d3002a01 +d3002a01d2002901d2002901d2002801d3002601d3002501d3002401d4002301d4002201d4002101d3002101d3001f01d4001e01d4001d01d4001c01d4001b01 +d4001b01d4001a01d4001a01d4001a01d6001b01d7001c01d7001d01d7001f01d7002001d7002101d7002101d7002201d6002301d7002501d7002701d7002801 +d7002901d6002901d6002a01d6002a01d5002c01d6002d01d6002f01d6003001d6003101d5003201d5003201d5003301d4003501d5003601d5003801d5003901 +d4003a01d4003b01d3003b01d3003b01d3003d01d3003f01d2004001d2004201d1004201d1004301d0004301cf004301cf004501cf004701cf004901ce004a01 +ce004a01cd004b01cc004b01cc004b01cb004d01cb004e01cb004f01ca004f01ca005001c9005001c9005001c9005001c8004c01c7004c01c8004b01c8004a01 +c9004a01c9004901c9004801c9004801ca004801ca0007000000fc02000029a6d4000000040000002d01030004000000f0010200ea000000240373004901ca00 +4801cb004701cc004601cc004501cd004301cd004201ce004201ce004101ce004001cf003f01cf003e01d0003d01d0003b01d1003b01d1003a01d1003a01d100 +3901d2003701d2003601d2003401d2003301d2003201d2003101d2003101d2003001d3002f01d3002d01d3002c01d3002b01d3002a01d3002901d3002901d300 +2801d4002701d4002501d4002401d4002301d4002201d4002101d4002101d4002001d5001e01d5001d01d5001c01d5001b01d5001b01d5001a01d4001a01d400 +1a01d6001b01d7001c01d7001d01d7001f01d7002001d7002101d7002101d7002201d6002301d7002501d7002701d7002801d7002901d6002901d6002a01d600 +2a01d5002c01d6002d01d6002f01d6003001d6003101d5003201d5003201d5003301d4003501d5003601d5003801d5003901d4003a01d4003b01d3003b01d300 +3b01d3003d01d3003f01d2004001d2004201d1004201d1004301d0004301cf004301cf004501cf004701cf004901ce004a01ce004a01cd004b01cc004b01cc00 +4b01cb004d01cb004e01cb004f01ca004f01ca005001c9005001c9005001c9005001c8004d01c7004d01c8004c01c9004b01c9004b01ca004a01ca004901ca00 +4901ca004901ca0007000000fc02000033b3d9000000040000002d01020004000000f0010300ea000000240373005001c8005001c9005001c9005001c9004f01 +ca004f01ca004e01cb004d01cb004b01cb004b01cc004b01cc004a01cd004a01ce004901ce004701cf004501cf004301cf004301cf004301d0004201d1004201 +d1004001d2003f01d2003d01d3003b01d3003b01d3003b01d3003a01d4003901d4003801d5003601d5003501d5003301d4003201d5003201d5003101d5003001 +d6002f01d6002d01d6002c01d6002a01d5002a01d6002901d6002901d6002801d7002701d7002501d7002301d7002201d6002101d7002101d7002001d7001f01 +d7001d01d7001c01d7001b01d7001a01d6001a01d5001a01d5001b01d5001c01d6001c01d6001e01d6001f01d6002001d5002101d5002101d5002201d5002301 +d5002401d5002601d5002701d5002801d4002901d4002a01d4002a01d4002b01d4002c01d4002e01d4002f01d4003001d3003101d3003201d3003301d3003401 +d3003501d3003601d3003801d3003901d2003b01d2003b01d2003b01d1003c01d1003d01d1003f01d1004001d0004101cf004201ce004201ce004301ce004401 +ce004601cd004701cd004801cc004901cb004a01ca004a01ca004a01ca004b01ca004c01ca004c01ca004d01c9004e01c9004e01c8005001c80007000000fc02 +00000066bf000000040000002d01030004000000f00102009800000024034a001a01ce001a01ce001b01ce001b01ce001c01ce001c01ce001d01ce001e01ce00 +1f01ce001f01ce002001cd002001cd002101cd002101cd002201cc002301cc002301cc002401cd002501cc002701cc002801cc002901cb002a01cb002b01ca00 +2c01c9002d01c8002d01c8002e01c7002f01c6003001c6003101c6003201c6003301c6003501c6003601c6003801c6003901c5003a01c5003b01c4003c01c300 +3d01c1003d01c1003c01c1003c01c1003c01c0003b01c0003b01c0003a01bf003901bf003801bf003701bf003601bf003401bf003301c0003101c0002f01c100 +2e01c1002c01c2002a01c2002801c3002701c4002501c5002401c6002201c6002101c7001f01c9001e01ca001d01cb001c01cb001b01cc001b01cc001a01cc00 +1a01cc001a01ce0007000000fc0200000059b2000000040000002d01020004000000f00103009800000024034a003301c6003501c6003601c6003701c6003901 +c5003a01c5003b01c4003c01c3003c01c1003c01c1003c01c1003c01c1003c01c0003b01c0003b01c0003a01bf003901bf003801bf003701bf003601bf003401 +bf003301c0003101c0002f01c1002e01c1002c01c2002a01c2002801c3002701c4002501c5002401c6002201c6002101c7001f01c9001e01ca001d01cb001c01 +cb001b01cc001b01cc001a01cc001a01cc001a01ce001a01ce001b01ce001b01ce001c01ce001c01ce001d01ce001e01ce001e01cd001f01cd002001cd002001 +cd002101cc002101cc002201cc002201cc002301cc002401cc002501cc002601cc002801cc002901cb002a01ca002b01ca002c01c9002c01c8002d01c7002e01 +c6002e01c6002f01c6003001c5003101c5003301c60007000000fc020000004da6000000040000002d01030004000000f00102009800000024034a003301c500 +3401c5003601c5003701c5003801c5003a01c4003b01c4003c01c3003c01c1003c01c1003c01c1003c01c1003c01c0003b01c0003a01c0003a01bf003901bf00 +3801bf003701bf003601bf003401bf003301c0003101c0002f01c1002e01c1002c01c2002a01c2002801c3002701c4002501c5002401c6002201c6002101c700 +1f01c9001e01ca001d01cb001c01cb001b01cc001b01cc001a01cc001a01cc001a01cd001a01cd001b01cd001b01cd001b01ce001c01ce001d01ce001e01cd00 +1e01cd001f01cd002001cc002001cc002101cc002101cc002201cc002201cb002301cc002401cc002501cc002601cb002701cb002901cb002a01ca002b01c900 +2b01c8002c01c7002d01c6002d01c6002e01c5002f01c5003001c5003101c5003301c50007000000fc020000004099000000040000002d01020004000000f001 +03009800000024034a003201c5003401c5003501c5003701c5003801c5003901c4003b01c4003b01c2003c01c1003c01c1003c01c1003c01c1003c01c0003b01 +c0003a01c0003a01bf003901bf003801bf003701bf003601bf003401bf003301c0003101c0002f01c1002e01c1002c01c2002a01c2002801c3002701c4002501 +c5002401c6002201c6002101c7001f01c9001e01ca001d01cb001c01cb001b01cc001b01cc001a01cc001a01cc001a01cd001a01cd001b01cd001b01cd001b01 +cd001c01cd001d01cd001d01cd001e01cd001f01cc002001cc002001cc002101cb002101cb002201cb002201cb002301cb002401cb002501cb002601cb002701 +cb002801ca002901ca002a01c9002b01c8002c01c7002c01c6002d01c5002e01c5002f01c5003001c5003101c5003201c50007000000fc02000000338c000000 +040000002d01030004000000f00102009800000024034a001a01cd001a01cd001b01cd001b01cd001b01cd001c01cd001c01cd001d01cd001e01cc001f01cc00 +2001cc002001cb002101cb002101cb002201cb002201cb002301cb002401cb002501cb002601cb002701ca002801ca002901c9002a01c9002a01c8002b01c600 +2c01c5002d01c5002d01c4002e01c4002f01c4003001c4003201c4003301c5003501c5003601c5003801c5003901c4003a01c3003b01c2003c01c1003c01c100 +3c01c1003c01c1003b01c0003b01c0003a01c0003a01bf003901bf003801bf003701bf003601bf003401bf003301c0003101c0002f01c1002e01c1002c01c200 +2a01c2002801c3002701c4002501c5002401c6002201c6002101c7001f01c9001e01ca001d01cb001c01cb001b01cc001b01cc001a01cc001a01cc001a01cd00 +07000000fc02000033b3d9000000040000002d01020004000000f00103003800000024031a004a01cb003e01c5003e01c5003f01c5003f01c5004001c6004001 +c6004101c6004201c7004301c8004501c8004601c9004701ca004801ca004801ca004801cb004901cb004901cb004901cb004901cb004a01cb004a01cb004a01 +cb004a01cb004a01cb004a01cb0008000000fa0206000100000000002600040000002d01030008000000250302004b01cb003a01c20007000000fc020000000d +66000000040000002d01040004000000f0010200040000002d01010004000000f001030010000000240306004c01cb004c01cb003a01c1003a01c2004c01cc00 +4c01cb0007000000fc020000001f73000000040000002d01020004000000f001040010000000240306003a01c2003a01c2004a01cb004a01ca003a01c1003a01 +c20007000000fc020000003382000000040000002d01030004000000f001020010000000240306003a01c2003a01c2004801ca004901c9003a01c1003a01c200 +07000000fc02000000458f000000040000002d01020004000000f001030010000000240306003a01c2003a01c2004701c9004701c8003a01c1003a01c2000700 +0000fc02000000599e000000040000002d01030004000000f001020010000000240306003a01c2003a01c2004501c8004601c7003a01c1003a01c20007000000 +fc020000006bab000000040000002d01020004000000f001030010000000240306003a01c2003a01c2004301c7004401c7003a01c1003a01c20007000000fc02 +0000057fba000000040000002d01030004000000f001020010000000240306003a01c2003a01c2004201c7004201c6003a01c1003a01c20007000000fc020000 +1791c7000000040000002d01020004000000f001030010000000240306003a01c2003a01c2004001c6004101c5003a01c1003a01c20007000000fc02000029a6 +d6000000040000002d01030004000000f001020010000000240306003a01c2003a01c2003f01c5003f01c4003a01c1003a01c20007000000fc02000038b8e300 +0000040000002d01020004000000f001030010000000240306003a01c2003a01c2003d01c4003d01c3003a01c1003a01c20007000000fc0200004cccf2000000 +040000002d01030004000000f001020010000000240306003a01c2003a01c2003b01c3003c01c2003a01c1003a01c20007000000fc02000033b3d90000000400 +00002d01020004000000f001030030000000240316004301cf003901c6003901c6003901c6003901c7003901c7003a01c8003b01c8003c01c9003d01ca003e01 +cb003f01cc004001cd004001ce004101ce004201cf004201cf004201cf004201cf004201cf004201cf004301cf0008000000fa02060001000000000026000400 +00002d01030008000000250302004301d0003401c20007000000fc020000000d66000000040000002d01040004000000f0010200040000002d01010004000000 +f001030010000000240306004401cf004401cf003501c2003401c2004301d0004401cf0007000000fc020000001f73000000040000002d01020004000000f001 +040010000000240306003501c2003401c2004201cf004301ce003501c2003501c20007000000fc020000003382000000040000002d01030004000000f0010200 +10000000240306003501c2003401c2004101cd004101cd003501c2003501c20007000000fc02000000458f000000040000002d01020004000000f00103001000 +0000240306003501c2003401c2003f01cc004001cb003501c2003501c20007000000fc02000000599e000000040000002d01030004000000f001020010000000 +240306003501c2003401c2003e01cb003e01ca003501c2003501c20007000000fc020000006bab000000040000002d01020004000000f0010300100000002403 +06003501c2003401c2003c01ca003d01c9003501c2003501c20007000000fc020000057fba000000040000002d01030004000000f00102001000000024030600 +3501c2003401c2003b01c8003c01c8003501c2003501c20007000000fc0200001791c7000000040000002d01020004000000f001030010000000240306003501 +c2003401c2003a01c7003a01c6003501c2003501c20007000000fc02000029a6d6000000040000002d01030004000000f001020010000000240306003501c200 +3401c2003801c6003901c5003501c2003501c20007000000fc02000038b8e3000000040000002d01020004000000f001030010000000240306003501c2003401 +c2003701c5003701c4003501c2003501c20007000000fc0200004cccf2000000040000002d01030004000000f001020010000000240306003501c2003401c200 +3601c3003601c3003501c2003501c20007000000fc02000033b3d9000000040000002d01020004000000f00103004000000024031e003201d4002b01c8002c01 +c8002c01c9002c01c9002c01c9002c01ca002c01ca002d01cb002d01cb002d01cc002d01cc002e01cd002e01ce002f01cf002f01d0003001d1003001d2003001 +d2003101d3003101d3003101d4003101d4003101d4003101d4003101d4003101d4003101d4003201d4003201d40008000000fa02060001000000000026000400 +00002d01030008000000250302003201d5002901c30007000000fc020000000d66000000040000002d01040004000000f0010200040000002d01010004000000 +f001030010000000240306003301d5003301d4002b01c6002a01c6003301d5003301d50007000000fc020000001f73000000040000002d01020004000000f001 +040010000000240306002b01c6002a01c6003201d3003301d3002b01c6002b01c60007000000fc020000003382000000040000002d01030004000000f0010200 +10000000240306002b01c6002a01c6003101d2003201d2002b01c6002b01c60007000000fc02000000458f000000040000002d01020004000000f00103001000 +0000240306002b01c6002a01c6003001d1003101d0002b01c6002b01c60007000000fc02000000599e000000040000002d01030004000000f001020010000000 +240306002b01c6002a01c6002f01cf003001cf002b01c6002b01c60007000000fc020000006bab000000040000002d01020004000000f0010300100000002403 +06002b01c6002a01c6002f01ce003001ce002b01c6002b01c60007000000fc020000057fba000000040000002d01030004000000f00102001000000024030600 +2b01c6002a01c6002e01cd002f01cc002b01c6002b01c60007000000fc0200001791c7000000040000002d01020004000000f001030010000000240306002b01 +c6002a01c6002d01cb002e01cb002b01c6002b01c60007000000fc02000029a6d6000000040000002d01030004000000f001020010000000240306002b01c600 +2a01c6002c01ca002d01c9002b01c6002b01c60007000000fc02000038b8e3000000040000002d01020004000000f001030010000000240306002b01c6002a01 +c6002b01c9002c01c8002b01c6002b01c60007000000fc0200004cccf2000000040000002d01030004000000f001020010000000240306002b01c6002a01c600 +2b01c7002c01c7002b01c6002b01c60008000000fa0206000100000000002600040000002d01020008000000250302002a01d5002201c40007000000fc020000 +000d66000000040000002d01040004000000f0010300040000002d01010004000000f001020010000000240306002b01d6002b01d6002501c9002501c9002a01 +d6002b01d60007000000fc020000001f73000000040000002d01020004000000f001040010000000240306002501c9002501c9002a01d5002b01d4002501c900 +2501c90007000000fc020000003382000000040000002d01030004000000f001020010000000240306002501c9002501c9002901d4002a01d3002501c9002501 +c90007000000fc02000000458f000000040000002d01020004000000f001030010000000240306002501c9002501c9002901d3002a01d2002501c9002501c900 +07000000fc02000000599e000000040000002d01030004000000f001020010000000240306002501c9002501c9002801d1002901d1002501c9002501c9000700 +0000fc020000006bab000000040000002d01020004000000f001030010000000240306002501c9002501c9002801d0002801d0002501c9002501c90007000000 +fc020000057fba000000040000002d01030004000000f001020010000000240306002501c9002501c9002701cf002801cf002501c9002501c90007000000fc02 +00001791c7000000040000002d01020004000000f001030010000000240306002501c9002501c9002701ce002701cd002501c9002501c90007000000fc020000 +29a6d6000000040000002d01030004000000f001020010000000240306002501c9002501c9002601cd002701cc002501c9002501c90007000000fc02000038b8 +e3000000040000002d01020004000000f001030010000000240306002501c9002501c9002601cc002601cb002501c9002501c90007000000fc0200004cccf200 +0000040000002d01030004000000f001020010000000240306002501c9002501c9002501ca002601ca002501c9002501c90008000000fa020600010000000000 +2600040000002d01020008000000250302002101d7001e01c90007000000fc020000000d66000000040000002d01040004000000f0010300040000002d010100 +04000000f001020010000000240306002201d7002201d7001f01cb001e01cb002201d7002201d70007000000fc020000001f73000000040000002d0102000400 +0000f001040010000000240306001f01cb001e01cb002101d6002201d6001f01cb001f01cb0007000000fc020000003382000000040000002d01030004000000 +f001020010000000240306001f01cb001e01cb002101d5002201d4001f01cb001f01cb0007000000fc02000000458f000000040000002d01020004000000f001 +030010000000240306001f01cb001e01cb002101d4002201d3001f01cb001f01cb0007000000fc02000000599e000000040000002d01030004000000f0010200 +10000000240306001f01cb001e01cb002001d3002101d2001f01cb001f01cb0007000000fc020000006bab000000040000002d01020004000000f00103001000 +0000240306001f01cb001e01cb002001d1002101d1001f01cb001f01cb0007000000fc020000057fba000000040000002d01030004000000f001020010000000 +240306001f01cb001e01cb002001d0002101d0001f01cb001f01cb0007000000fc0200001791c7000000040000002d01020004000000f0010300100000002403 +06001f01cb001e01cb002001cf002001cf001f01cb001f01cb0007000000fc02000029a6d6000000040000002d01030004000000f00102001000000024030600 +1f01cb001e01cb001f01ce002001ce001f01cb001f01cb0007000000fc02000038b8e3000000040000002d01020004000000f001030010000000240306001f01 +cb001e01cb001f01cd002001cd001f01cb001f01cb0007000000fc0200004cccf2000000040000002d01030004000000f001020010000000240306001f01cb00 +1e01cb001f01cc002001cc001f01cb001f01cb0007000000fc02000033b3d9000000040000002d01020004000000f00103003800000024031a003a01d2003201 +c7003201c7003301c8003301c8003301c9003401c9003401ca003501cb003601cc003701cd003701cf003801cf003801d0003901d1003901d1003901d1003901 +d2003a01d2003a01d2003a01d2003a01d2003a01d2003a01d2003a01d2003a01d20008000000fa0206000100000000002600040000002d010300080000002503 +02003b01d3002f01c30007000000fc020000000d66000000040000002d01040004000000f0010200040000002d01010004000000f00103001000000024030600 +3c01d3003c01d2003001c2002f01c3003b01d3003c01d30007000000fc020000001f73000000040000002d01020004000000f001040010000000240306002f01 +c3002f01c3003a01d2003b01d1003001c2002f01c30007000000fc020000003382000000040000002d01030004000000f001020010000000240306002f01c300 +2f01c3003901d0003a01cf003001c2002f01c30007000000fc02000000458f000000040000002d01020004000000f001030010000000240306002f01c3002f01 +c3003801cf003901ce003001c2002f01c30007000000fc02000000599e000000040000002d01030004000000f001020010000000240306002f01c3002f01c300 +3701cd003801cd003001c2002f01c30007000000fc020000006bab000000040000002d01020004000000f001030010000000240306002f01c3002f01c3003601 +cc003601cb003001c2002f01c30007000000fc020000057fba000000040000002d01030004000000f001020010000000240306002f01c3002f01c3003501ca00 +3501ca003001c2002f01c30007000000fc0200001791c7000000040000002d01020004000000f001030010000000240306002f01c3002f01c3003301c9003401 +c8003001c2002f01c30007000000fc02000029a6d6000000040000002d01030004000000f001020010000000240306002f01c3002f01c3003201c7003301c700 +3001c2002f01c30007000000fc02000038b8e3000000040000002d01020004000000f001030010000000240306002f01c3002f01c3003101c6003201c5003001 +c2002f01c30007000000fc0200004cccf2000000040000002d01030004000000f001020010000000240306002f01c3002f01c3003001c4003101c4003001c200 +2f01c30007000000fc0200000066bf000000040000002d01020004000000f00103008a000000240343001a01cb002001c6002001c6002001c5001f01c4001f01 +c3001f01c1001f01c0002001bf002101bd002201bd002301bc002401bc002501bc002701bb002801bb002901bb002b01bb002d01bb002e01bc003001bc003201 +bd003501bd003701be003a01bf003c01c0003c01c1003c01c1003b01c2003b01c3003901c3003801c4003601c4003301c4003301c4003301c4003201c4003101 +c4002f01c3002e01c3002d01c3002c01c3002c01c3002c01c4002b01c5002b01c6002b01c7002a01c8002901c9002801c9002701ca002601ca002501ca002501 +ca002401ca002301ca002301ca002201ca002201ca002101ca002001cb001f01cc001e01cc001c01cd001b01cd001a01cc001a01cb00a6000000240351003b01 +c1003b01c1003b01c1003a01c0003a01c0003901c0003801bf003701bf003501be003401be003301bd003101bd003001bc002e01bc002d01bc002b01bc002a01 +bc002701bc002501bc002301bd002201be002101be002001bf002001c0002001c1002001c1002001c2002001c2002101c1002101c1002101c1002201c1002201 +c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601c1002701c1002701c1002801c1002801c1002901 +c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01c1002f01c1003001c1003101c1003201c1003301 +c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601c1003701c2003801c2003901c2003a01c2003a01c2003b01c1003b01 +c10007000000fc020000006bbf000000040000002d01030004000000f0010200a6000000240351002a01bc002801bd002501bd002401bd002201be002101bf00 +2001bf002001c0002001c1002001c1002001c2002001c2002101c1002101c1002101c1002201c1002201c1002301c1002301c1002301c1002401c1002401c100 +2401c1002501c1002501c1002601c1002601c1002601c1002701c1002701c1002801c1002801c1002901c1002901c1002a01c0002b01c0002b01c0002c01c000 +2c01c0002d01c0002d01c1002d01c1002e01c1002f01c1002f01c1003001c1003101c1003201c1003301c1003301c1003401c1003401c1003501c1003501c100 +3501c1003601c1003601c1003601c1003701c1003801c2003901c2003901c2003a01c2003b01c1003b01c1003b01c1003a01c1003a01c0003901c0003901c000 +3801bf003701bf003501be003401be003301be003101bd003001bd002f01bd002d01bc002c01bc002a01bc0007000000fc0200000073c2000000040000002d01 +020004000000f0010300a6000000240351002b01bd002801bd002601bd002401be002301be002101bf002101c0002001c0002001c1002001c1002001c1002001 +c1002101c1002101c1002101c1002201c1002201c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601 +c1002701c1002701c1002801c1002801c1002901c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01 +c1002f01c1003001c1003101c1003201c1003301c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601c1003701c1003801 +c2003901c2003901c2003a01c2003a01c2003b01c1003b01c1003a01c1003a01c1003901c0003801c0003801c0003701bf003601bf003401be003301be003201 +be003001bd002f01bd002e01bd002c01bd002b01bd0007000000fc0200000078c2000000040000002d01030004000000f0010200a6000000240351002b01bd00 +2901be002601be002501be002301bf002201bf002101c0002001c0002001c1002001c1002001c1002001c1002101c1002101c1002101c1002201c1002201c100 +2301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601c1002701c1002701c1002801c1002801c1002901c100 +2901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01c1002f01c1003001c1003101c1003201c1003301c100 +3301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601c1003701c1003801c2003801c2003901c2003a01c2003a01c2003a01c100 +3a01c1003a01c1003a01c1003901c0003801c0003801c0003701c0003601bf003501bf003301be003201be003101be003001be002e01bd002d01bd002b01bd00 +07000000fc0200000784c4000000040000002d01020004000000f0010300b6000000240359002c01be002b01bf002a01bf002801bf002701bf002601bf002501 +bf002401bf002401bf002301bf002201c0002201c0002101c0002101c0002101c1002001c1002001c1002001c1002001c1002001c1002101c1002101c1002101 +c1002201c1002201c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601c1002701c1002701c1002801 +c1002801c1002901c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01c1002f01c1003001c1003101 +c1003201c1003301c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601c1003701c1003801c2003801c2003901c2003901 +c2003a01c2003a01c1003a01c1003a01c1003901c1003901c1003801c1003801c0003701c0003601c0003501c0003401bf003301bf003201bf003001bf002f01 +bf002e01be002c01be0007000000fc0200000a87c4000000040000002d01030004000000f0010200b6000000240359002d01bf002c01bf002a01bf002901bf00 +2801bf002701bf002601bf002501bf002401c0002301c0002301c0002201c0002101c0002101c0002101c1002001c1002001c1002001c1002001c1002101c100 +2101c1002101c1002201c1002201c1002201c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601c100 +2701c1002701c1002801c1002801c1002901c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01c100 +2f01c1003001c1003101c1003201c1003301c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601c1003701c1003701c200 +3801c2003901c2003901c2003901c2003a01c2003901c2003901c1003901c1003901c1003801c1003801c1003701c0003601c0003501c0003401c0003301c000 +3201bf003101bf003001bf002e01bf002d01bf0007000000fc020000128fc7000000040000002d01020004000000f0010300b6000000240359002d01c0002c01 +c0002b01c0002901c0002801c0002701c0002601c0002501c0002401c0002401c0002301c0002201c0002201c0002101c1002101c1002101c1002001c1002001 +c1002001c1002101c1002101c1002101c1002201c1002201c1002201c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601 +c1002601c1002601c1002701c1002701c1002801c1002801c1002901c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01 +c1002e01c1002f01c1002f01c1003001c1003101c1003201c1003301c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601 +c1003701c1003701c2003801c2003801c2003901c2003901c2003901c2003901c2003901c2003901c1003901c1003801c1003801c1003701c1003601c1003501 +c0003501c0003401c0003301c0003101c0003001c0002f01c0002d01c00007000000fc0200001494c7000000040000002d01030004000000f0010200a6000000 +240351003901c2003901c2003801c1003801c1003601c1003501c1003301c0003101c0002e01c0002d01c0002b01c0002a01c0002901c0002801c0002601c000 +2601c0002501c0002401c0002301c0002201c0002201c1002101c1002101c1002101c1002001c1002001c1002001c1002101c1002101c1002101c1002201c100 +2201c1002201c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601c1002701c1002701c1002801c100 +2801c1002901c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01c1002f01c1003001c1003101c100 +3201c1003301c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601c1003701c1003701c1003801c2003801c2003901c200 +3901c2003901c20007000000fc0200000066bf000000040000002d01020004000000f0010300ce000000240365002001c1002101c1002101c1002201c1002201 +c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601c1002701c1002701c1002801c1002801c1002901 +c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01c1002f01c1003001c1003101c1003201c1003301 +c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003601c1003701c1003701c1003801c2003801c2003901c2003901c2003901 +c2003901c2003a01c2003a01c2003a01c3003901c3003901c3003801c3003801c4003701c4003601c4003501c4003401c4003301c4003201c4003101c4002f01 +c3002e01c3002d01c3002c01c3002c01c3002c01c3002c01c3002c01c3002b01c3002b01c3002b01c3002a01c3002a01c3002901c4002801c4002801c4002701 +c4002701c3002601c3002501c3002501c3002401c3002301c3002201c3002201c3002101c3002001c3002001c3002001c3002001c3002001c2002001c2002001 +c10007000000fc020000005cb5000000040000002d01030004000000f0010200ce000000240365002b01c3002b01c3002c01c3002c01c2002c01c2002c01c200 +2d01c2002e01c3002f01c3003101c3003201c3003301c3003401c4003501c4003601c4003701c3003701c3003801c3003901c3003901c3003901c3003a01c200 +3901c2003901c2003901c2003901c2003801c2003801c2003801c2003701c1003701c1003601c1003601c1003601c1003501c1003501c1003501c1003401c100 +3401c1003301c1003301c1003201c1003101c1003001c1002f01c1002f01c1002e01c1002d01c1002d01c1002d01c0002c01c0002c01c0002b01c0002b01c000 +2a01c0002901c1002901c1002801c1002801c1002701c1002701c1002601c1002601c1002601c1002501c1002501c1002401c1002401c1002401c1002301c100 +2301c1002301c1002201c1002201c1002101c1002101c1002001c1002001c2002001c2002001c2002001c3002001c3002101c3002101c3002201c3002301c300 +2301c3002401c3002501c3002501c3002601c3002701c3002701c3002801c3002801c3002901c3002a01c3002a01c3002b01c3002b01c3002b01c30007000000 +fc0200000052ab000000040000002d01020004000000f0010300ce000000240365002b01c3002b01c3002b01c2002c01c2002c01c2002c01c2002d01c2002e01 +c2002f01c3003101c3003201c3003301c3003401c3003501c3003601c3003601c3003701c3003801c3003801c3003901c3003901c2003901c2003901c2003901 +c2003901c2003901c2003801c2003801c2003801c2003701c1003701c1003601c1003601c1003601c1003501c1003501c1003501c1003401c1003401c1003301 +c1003301c1003201c1003101c1003001c1002f01c1002f01c1002e01c1002d01c1002d01c1002d01c0002c01c0002c01c0002b01c0002b01c0002a01c0002901 +c1002901c1002801c1002801c1002701c1002701c1002601c1002601c1002601c1002501c1002501c1002401c1002401c1002401c1002301c1002301c1002301 +c1002201c1002201c1002101c1002101c1002001c1002001c2002001c2002001c2002101c2002101c3002101c3002201c3002301c2002301c2002401c2002401 +c2002501c2002501c2002601c2002701c3002701c3002801c3002801c3002901c3002901c3002a01c3002b01c3002b01c3002b01c30007000000fc0200000048 +a1000000040000002d01030004000000f0010200ce000000240365002b01c2002b01c2002b01c2002c01c2002c01c2002c01c2002d01c2002e01c2002f01c200 +3101c2003201c2003301c3003401c3003501c3003601c3003601c3003701c3003701c3003801c2003801c2003901c2003901c2003901c2003801c2003801c200 +3801c2003801c2003801c2003701c2003701c1003701c1003601c1003601c1003601c1003501c1003501c1003501c1003401c1003401c1003301c1003301c100 +3201c1003101c1003001c1002f01c1002f01c1002e01c1002d01c1002d01c1002d01c0002c01c0002c01c0002b01c0002b01c0002a01c0002901c1002901c100 +2801c1002801c1002701c1002701c1002601c1002601c1002601c1002501c1002501c1002401c1002401c1002401c1002301c1002301c1002301c1002201c100 +2201c1002101c1002101c1002001c1002001c2002001c2002001c2002101c2002101c2002201c2002201c2002301c2002301c2002401c2002501c2002501c200 +2601c2002601c2002701c2002701c2002701c2002801c2002901c2002901c2002a01c2002a01c2002b01c2002b01c20007000000fc020000003d960000000400 +00002d01020004000000f0010300c6000000240361002b01c2002b01c2002b01c2002c01c2002c01c2002c01c2002d01c2002e01c2002f01c2003001c2003201 +c2003301c2003401c2003501c2003601c2003601c2003701c2003701c2003701c2003801c2003801c2003901c2003801c2003801c2003801c2003801c2003701 +c2003701c1003601c1003601c1003501c1003501c1003501c1003401c1003401c1003301c1003301c1003201c1003101c1003001c1002f01c1002f01c1002e01 +c1002d01c1002d01c1002d01c0002c01c0002c01c0002b01c0002b01c0002a01c0002901c1002901c1002801c1002801c1002701c1002701c1002601c1002601 +c1002601c1002501c1002501c1002401c1002401c1002401c1002301c1002301c1002301c1002201c1002201c1002101c1002101c1002001c1002001c2002001 +c2002101c2002101c2002201c2002201c2002301c2002301c2002401c2002401c2002501c2002501c2002601c2002601c2002701c2002701c2002701c2002801 +c2002901c2002901c2002a01c2002a01c2002a01c2002b01c20007000000fc02000000338c000000040000002d01030004000000f0010200d600000024036900 +2001c1002101c1002101c1002201c1002201c1002301c1002301c1002301c1002401c1002401c1002401c1002501c1002501c1002601c1002601c1002601c100 +2701c1002701c1002801c1002801c1002901c1002901c1002a01c0002b01c0002b01c0002c01c0002c01c0002d01c0002d01c1002d01c1002e01c1002f01c100 +2f01c1003001c1003101c1003201c1003301c1003301c1003401c1003401c1003501c1003501c1003501c1003601c1003601c1003701c1003701c2003801c200 +3801c2003801c2003801c2003801c2003801c2003701c2003701c2003701c2003601c2003601c2003501c2003501c2003401c2003301c2003201c2003001c100 +2f01c1002e01c1002d01c1002c01c1002c01c1002c01c1002b01c1002a01c1002a01c1002a01c1002a01c1002a01c1002901c1002801c1002801c1002701c100 +2701c1002701c1002601c1002601c1002501c1002501c1002501c1002401c1002401c1002301c1002301c1002301c1002201c1002201c1002201c1002201c100 +2201c2002101c2002101c2002101c2002001c2002001c2002001c2002001c2002001c10007000000fc02000073e8ff000000040000002d01020004000000f001 +03008e000000240345001a01cb002001c6002001c6002001c5001f01c4001f01c3001f01c1001f01c0002001bf002101bd002201bd002301bc002401bc002501 +bc002701bb002801bb002901bb002b01bb002d01bb002e01bc003001bc003201bd003501bd003701be003a01bf003c01c0003b01c1003b01c1003b01c1003a01 +c0003901c0003901c0003801bf003601bf003501be003401be003301bd003101bd003001bd002e01bc002d01bc002b01bc002a01bc002a01bc002901bc002901 +bc002801bc002701bc002601bc002501bd002401bd002401bd002401bd002301bd002301be002201be002101be002101bf002001c0002001c0002001c1002001 +c2002001c3002001c4002001c4002101c5002101c6001b01cb001a01cb0007000000fc020000001a73000000040000002d01030004000000f0010200ce000000 +240365001a01cb001a01cc001b01cd001c01cd001e01cc001f01cc002001cb002101ca002201ca002201ca002301ca002301ca002401ca002501ca002501ca00 +2601ca002701ca002801c9002901c9002a01c8002b01c7002b01c6002b01c5002c01c4002c01c3002c01c3002d01c3002e01c3002f01c3003101c4003201c400 +3301c4003301c4003301c4003601c4003801c4003901c3003b01c3003b01c2003c01c1003c01c1003c01c0003b01c1003b01c1003b01c1003a01c2003901c200 +3801c3003701c3003501c4003301c3003101c3003001c3002f01c3002d01c2002d01c2002c01c2002c01c2002b01c2002b01c2002b01c2002b01c3002b01c400 +2b01c4002b01c5002a01c6002a01c7002901c7002901c8002901c8002801c8002801c9002701c9002701c9002601c9002501ca002501ca002401ca002401ca00 +2301ca002301c9002201c9002201c9002201c9002201c9002101ca002101ca002001ca001f01cb001f01cb001e01cb001d01cc001d01cc001d01cc001c01cc00 +1c01cc001c01cc001b01cc001b01cc001b01cb001a01cb0007000000fc020100000000000000040000002d01020004000000f001030008000000fa0206000100 +000000000000040000002d0103009800000024034a001a01cb002001c6002001c6002001c6002001c5001f01c4001f01c3001f01c1001f01c0002001bf002101 +bd002101bd002201bd002301bc002401bc002501bc002701bb002801bb002901bb002b01bb002d01bb002e01bc003001bc003201bd003501bd003701be003a01 +bf003c01c0003c01c0003c01c1003c01c1003b01c2003b01c3003901c3003801c4003601c4003301c4003301c4003301c4003301c4003201c4003101c4002f01 +c3002e01c3002d01c3002c01c3002c01c3002c01c3002c01c4002b01c5002b01c6002b01c7002a01c8002901c9002801c9002801c9002701ca002601ca002501 +ca002501ca002401ca002301ca002301ca002201ca002201ca002201ca002101ca002001cb001f01cc001e01cc001c01cd001b01cd001a01cc001a01cb000800 +0000fa02060001000000c7ffff00040000002d0104006000000025032e003b01c1003b01c1003b01c1003b01c1003a01c0003901c0003901c0003801bf003601 +bf003501be003401be003301bd003101bd003001bd002e01bc002d01bc002b01bc002a01bc002a01bc002a01bc002901bc002901bc002801bc002701bc002601 +bc002501bd002401bd002401bd002401bd002401bd002301bd002301be002201be002101be002101bf002001c0002001c0002001c0002001c1002001c2002001 +c3002001c4002001c4002101c5002101c6001b01cb0008000000fa0206000100000033b3d900040000002d01050004000000f001040086000000250341003b01 +c1003b01c1003b01c1003b01c1003a01c2003901c2003801c3003701c3003501c4003301c3003301c3003101c3003001c3002f01c3002d01c2002d01c2002c01 +c2002c01c2002b01c2002b01c2002b01c2002b01c2002b01c3002b01c4002b01c4002b01c5002a01c6002a01c7002a01c7002901c7002901c8002901c8002801 +c8002801c9002701c9002701c9002601c9002601c9002501ca002501ca002401ca002401ca002301ca002301c9002201c9002201c9002201c9002201c9002201 +c9002101ca002101ca002001ca001f01cb001f01cb001e01cb001e01cb001d01cc001d01cc001d01cc001c01cc001c01cc001c01cc001b01cc001b01cc001b01 +cb0008000000fa0206000100000000002600040000002d01040004000000f001050084000000250340005001c8005001c8005001c9005001c9005001c9004f01 +ca004f01ca004e01cb004d01cb004b01cb004b01cb004b01cc004b01cc004a01cd004a01ce004901ce004701cf004501cf004301cf004301cf004301cf004301 +d0004201d1004201d1004001d2003f01d2003d01d3003b01d3003b01d3003b01d3003b01d3003a01d4003901d4003801d5003601d5003501d5003301d4003301 +d4003201d5003201d5003101d5003001d6002f01d6002d01d6002c01d6002a01d5002a01d5002a01d6002901d6002901d6002801d7002701d7002501d7002301 +d7002201d6002201d6002101d7002101d7002001d7001f01d7001d01d7001c01d7001b01d7001a01d600040000002d01030004000000f0010400cc0000002503 +64003c01c0005101c9006501cd006501cd006501cd006501ce006401ce006401cf006401d0006401d0006301d1006301d1006301d1006201d1006201d2006201 +d2006201d3006101d4006001d5005f01d6005e01d7005e01d7005e01d7005e01d7005d01d8005d01d9005c01da005a01db005901dc005701dd005701dd005701 +dd005701dd005601de005601df005501e0005301e1005101e1004e01e2004e01e2004e01e2004e01e2004e01e3004e01e3004e01e3004d01e4004d01e4004c01 +e4004b01e5004b01e5004a01e5004901e6004701e6004601e6004501e6004301e6004301e6004301e7004201e7004101e7004001e8003f01e9003d01e9003b01 +e9003801e9003801e9003801e9003801e9003801e9003801ea003701ea003701ea003601ea003601ea003501ea003401ea003301eb003201eb003101eb002f01 +eb002e01eb002c01eb002c01eb002b01eb002b01eb002901ec002801ec002601ec002401ec002301ec002101eb002101eb002101eb002001eb001f01eb001e01 +eb001d01eb001c01eb001a01eb001a01ea0007000000fc0200000066bf000000040000002d010400040000002d010100c200000024035f00f000c000db00c900 +c700cd00c700cd00c700ce00c700ce00c800cf00c800d000c800d000c900d100c900d100ca00d100ca00d200ca00d200ca00d300cb00d400cc00d500cd00d600 +ce00d700ce00d700ce00d700cf00d800cf00d900d000da00d200db00d300dc00d500dd00d500dd00d500dd00d500de00d600df00d700e000d900e100db00e100 +dd00e200dd00e200de00e200de00e300de00e300de00e300df00e400df00e400e000e400e100e500e100e500e200e500e300e600e500e600e600e600e700e600 +e900e600e900e700ea00e700eb00e700ec00e800ed00e900ef00e900f100e900f400e900f400e900f400e900f400e900f400ea00f500ea00f500ea00f600ea00 +f600ea00f700ea00f800ea00f900eb00fa00eb00fb00eb00fd00eb00fe00eb000001eb000101eb000101eb000301ec000401ec000601ec000801ec000901ec00 +0b01eb000b01eb000c01eb000d01eb000e01eb000f01eb001001eb001101eb001201ea001201cc000701c600ff00be00f000c0008a000000240343001201db00 +1201db001101dc001001dc000f01dc000e01dc000d01dc000b01dc000a01dc000901dc000801dc000601dc000501dc000301dc000101dc00ff00dc00fd00db00 +fb00db00f900db00f700da00f400da00f200d900f000d900ee00d800eb00d700e900d700e700d600e600d500e400d400e200d200e100d100e000d000df00cf00 +de00ce00dd00cd00dc00cc00dc00cb00db00cb00db00ca00db00ca00db00c900db00c900db00c900dc00c900dd00c900de00c800df00c800e000c800e000c800 +e100c800e200c800e300c900e500c900e700ca00ea00cb00ec00cc00ef00cc00f100cd00f400ce00f600cf00f800d000fa00d000fb00d100fc00d100fc00d100 +1201d5001201db0007000000fc0200000059b2000000040000002d01050004000000f00104008a000000240343000a01db000901db000801db000601db000501 +db000301db000101db00ff00db00fd00da00fb00da00f900da00f700d900f400d900f200d800f000d800ee00d700eb00d700e900d600e700d500e600d400e400 +d300e300d200e100d100e000d000df00cf00de00ce00dd00cd00dd00cc00dc00cb00dc00ca00db00ca00db00ca00db00c900db00c900dc00c900dc00c900dd00 +c900de00c800df00c800e000c800e000c800e100c800e200c800e300c900e500c900e700ca00ea00cb00ec00cc00ef00cc00f100cd00f400ce00f600cf00f800 +d000fa00d000fb00d100fc00d100fc00d1001201d5001201db001201db001101db001001db000f01db000e01db000d01db000b01db000a01db0007000000fc02 +0000004da6000000040000002d01040004000000f00105008a000000240343000901db000901db000701db000601db000501da000301da000101da00ff00da00 +fd00da00fb00d900f900d900f700d900f400d800f200d800f000d700ee00d600ec00d600e900d500e800d400e600d300e400d200e300d100e100d000e000cf00 +df00ce00de00cd00dd00cc00dd00cc00dc00cb00dc00ca00dc00ca00dc00c900db00c900dc00c900dc00c900dd00c900dd00c900de00c800df00c800e000c800 +e000c800e100c800e200c800e300c900e500c900e700ca00ea00cb00ec00cc00ef00cc00f100cd00f400ce00f600cf00f800d000fa00d000fb00d100fc00d100 +fc00d1001201d5001201da001201da001101da001001da000f01da000e01da000d01da000b01db000901db0007000000fc020000004099000000040000002d01 +050004000000f00104008a000000240343000901da000801da000701da000601da000501da000301da000101d900ff00d900fd00d900fb00d900f900d800f700 +d800f400d700f200d700f000d600ee00d600ec00d500e900d400e800d300e600d200e400d100e300d100e200d000e000cf00df00ce00df00cd00de00cc00dd00 +cb00dd00cb00dc00ca00dc00ca00dc00c900dc00c900dc00c900dc00c900dd00c900de00c900de00c800df00c800e000c800e000c800e100c800e200c800e300 +c900e500c900e700ca00ea00cb00ec00cc00ef00cc00f100cd00f400ce00f600cf00f800d000fa00d000fb00d100fc00d100fc00d1001201d5001201d9001201 +d9001101da001001da000f01da000e01da000d01da000b01da000901da0007000000fc02000000338c000000040000002d01040004000000f00105008a000000 +240343000901d9000801d9000701d9000601d9000501d9000301d9000101d900ff00d800fd00d800fb00d800f900d700f700d700f400d600f200d600f000d500 +ee00d500ec00d400e900d300e800d200e600d200e400d100e300d000e200cf00e100ce00e000cd00df00cc00de00cc00dd00cb00dd00ca00dd00ca00dc00c900 +dc00c900dc00c900dc00c900dd00c900dd00c900de00c900de00c800df00c800e000c800e000c800e100c800e200c800e300c900e500c900e700ca00ea00cb00 +ec00cc00ef00cc00f100cd00f400ce00f600cf00f800d000fa00d000fb00d100fc00d100fc00d1001201d5001201d9001201d9001101d9001001d9000f01d900 +0e01d9000d01d9000b01d9000901d90007000000fc02000000267f000000040000002d01050004000000f00104008a000000240343000901d8000801d8000701 +d8000601d8000401d8000301d8000101d800ff00d800fd00d700fb00d700f900d700f700d600f500d600f200d500f000d400ee00d400ec00d300ea00d200e800 +d200e600d100e400d000e300cf00e200ce00e100ce00e000cd00df00cc00de00cb00de00cb00dd00ca00dd00ca00dd00c900dd00c900dd00c900dd00c900dd00 +c900dd00c900de00c800df00c800df00c800e000c800e000c800e100c800e200c800e300c900e500c900e700ca00ea00cb00ec00cc00ef00cc00f100cd00f400 +ce00f600cf00f800d000fa00d000fb00d100fc00d100fc00d1001201d5001201d8001201d8001101d8001001d8000f01d8000e01d8000c01d8000b01d8000901 +d80007000000fc020000001a73000000040000002d01040004000000f00105008a000000240343001201d7001201d7001101d7001001d7000f01d7000e01d700 +0c01d7000b01d7000901d8000801d8000701d8000601d7000401d7000301d7000101d700ff00d700fd00d600fb00d600f900d600f700d500f400d500f200d400 +f000d400ee00d300ec00d200ea00d200e800d100e600d000e400cf00e300cf00e200ce00e100cd00e000cc00df00cc00df00cb00de00ca00de00ca00dd00c900 +dd00c900dd00c900dd00c900dd00c900dd00c900de00c900de00c800df00c800df00c800e000c800e000c800e100c800e200c800e300c900e500c900e700ca00 +ea00cb00ec00cc00ef00cc00f100cd00f400ce00f600cf00f800d000fa00d000fb00d100fc00d100fc00d1001201d5001201d70007000000fc0200000066bf00 +0000040000002d01050004000000f00104004a0100002403a3001201ea001101eb001001eb000f01eb000e01eb000d01eb000c01eb000b01eb000b01eb000901 +ec000801ec000601ec000401ec000301ec000101eb000101eb000001eb00fe00eb00fd00eb00fb00eb00fa00eb00f900eb00f800ea00f700ea00f600ea00f600 +ea00f500ea00f500ea00f400ea00f400e900f400e900f400e900f400e900f100e900ef00e900ed00e900ec00e800eb00e800ea00e700e900e700e900e600e700 +e600e600e600e500e600e300e600e200e500e100e500e100e500e000e400df00e400df00e400de00e300de00e300de00e300de00e200dd00e200dd00e200db00 +e100d900e100d700e000d600df00d500de00d500dd00d500dd00d500dd00d300dc00d200db00d000da00cf00d900cf00d800ce00d700ce00d700ce00d700cd00 +d600cc00d500cb00d400ca00d300ca00d200ca00d200ca00d100c900d100c900d100c800d000c800d000c800cf00c700ce00c700ce00c700cd00c700cd00cf00 +cb00cf00cb00d000cc00d000cc00d000cc00d000cd00d100cd00d100ce00d200ce00d200ce00d200cf00d200cf00d300d000d300d100d400d100d500d200d600 +d300d600d300d700d300d700d400d800d500d900d600da00d700db00d800dd00d800dd00d800dd00d900de00d900df00da00e000db00e100db00e300dc00e500 +dc00e600dc00e600dd00e600dd00e700de00e900df00ea00df00ec00df00ee00e000ee00e000ee00e000ee00e000ef00e100f000e100f200e100f500e200f800 +e200f800e200f900e200fa00e200fb00e300fc00e300fe00e3000001e4000201e3000201e3000301e4000401e4000601e4000701e4000901e4000b01e4000d01 +e4000d01e4000d01e4000e01e4000f01e4001001e4001101e4001201e4001201e4001201ea0007000000fc0200000072c4000000040000002d01040004000000 +f00105004a0100002403a300ed00e000ed00e100ed00e100ee00e100ef00e200f000e200f200e200f400e300f700e300f700e300f800e300f900e300fa00e400 +fc00e400fe00e4000001e4000201e4000201e4000301e5000401e5000501e5000701e5000901e5000b01e5000c01e5000d01e5000d01e5000e01e5000f01e500 +1001e5001101e5001201e5001201e4001201ea001101eb001001eb000f01eb000e01eb000d01eb000c01eb000b01eb000b01eb000901ec000801ec000601ec00 +0401ec000301ec000101eb000101eb000001eb00fe00eb00fd00eb00fb00eb00fa00eb00f900eb00f800ea00f700ea00f600ea00f600ea00f500ea00f500ea00 +f400ea00f400e900f400e900f400e900f400e900f100e900ef00e900ed00e900ec00e800eb00e800ea00e700e900e700e900e600e700e600e600e600e500e600 +e300e600e200e500e100e500e100e500e000e400df00e400df00e400de00e300de00e300de00e300de00e200dd00e200dd00e200db00e100d900e100d700e000 +d600df00d500de00d500dd00d500dd00d500dd00d300dc00d200db00d000da00cf00d900cf00d800ce00d700ce00d700ce00d700cd00d600cc00d500cb00d400 +ca00d300ca00d200ca00d200ca00d100c900d100c900d100c800d000c800d000c800cf00c700ce00c700ce00c700cd00c700cd00ce00cc00ce00cc00ce00cc00 +cf00cc00cf00cd00cf00cd00d000ce00d000ce00d000ce00d100cf00d100cf00d100d000d100d000d200d100d300d200d400d300d500d300d500d300d600d400 +d600d500d700d600d800d700d900d800da00d800db00d900db00d900dc00d900dc00da00dd00db00de00db00e000dc00e200dd00e400dd00e400dd00e500de00 +e500de00e600df00e800e000e900e000eb00e000ed00e00007000000fc0200000880c7000000040000002d01050004000000f00104004a0100002403a300ec00 +e100ec00e200ed00e200ed00e200ee00e300ef00e300f100e300f400e400f700e400f700e400f800e400f900e500fa00e500fc00e500fd00e500ff00e5000201 +e5000201e5000301e6000401e6000501e6000701e6000901e6000a01e6000c01e6000c01e6000d01e6000e01e6000f01e6001001e6001101e6001201e6001201 +e5001201ea001101eb001001eb000f01eb000e01eb000d01eb000c01eb000b01eb000b01eb000901ec000801ec000601ec000401ec000301ec000101eb000101 +eb000001eb00fe00eb00fd00eb00fb00eb00fa00eb00f900eb00f800ea00f700ea00f600ea00f600ea00f500ea00f500ea00f400ea00f400e900f400e900f400 +e900f400e900f100e900ef00e900ed00e900ec00e800eb00e800ea00e700e900e700e900e600e700e600e600e600e500e600e300e600e200e500e100e500e100 +e500e000e400df00e400df00e400de00e300de00e300de00e300de00e200dd00e200dd00e200db00e100d900e100d700e000d600df00d500de00d500dd00d500 +dd00d500dd00d300dc00d200db00d000da00cf00d900cf00d800ce00d700ce00d700ce00d700cd00d600cc00d500cb00d400ca00d300ca00d200ca00d200ca00 +d100c900d100c900d100c800d000c800d000c800cf00c700ce00c700ce00c700cd00c700cd00cd00cc00cd00cc00cd00cc00ce00cd00ce00cd00ce00ce00ce00 +ce00cf00cf00cf00cf00cf00cf00cf00cf00d000d000d000d100d100d100d200d200d300d300d400d400d400d400d400d500d500d500d600d700d700d800d800 +d800d900d900da00d900da00d900db00da00db00db00dc00db00dd00dc00df00dd00e100de00e300de00e300de00e400df00e400df00e500e000e700e000e800 +e100ea00e100ec00e10007000000fc020000128ccc000000040000002d01040004000000f00105004a0100002403a300ec00e200ec00e200ec00e300ed00e300 +ed00e400ef00e400f100e400f300e500f600e500f600e500f700e500f800e600fa00e600fb00e600fd00e700ff00e7000101e6000101e6000201e7000301e700 +0501e7000601e7000801e7000a01e7000c01e7000c01e7000d01e7000e01e7000f01e7001001e7001101e7001201e7001201e6001201ea001101eb001001eb00 +0f01eb000e01eb000d01eb000c01eb000b01eb000b01eb000901ec000801ec000601ec000401ec000301ec000101eb000101eb000001eb00fe00eb00fd00eb00 +fb00eb00fa00eb00f900eb00f800ea00f700ea00f600ea00f600ea00f500ea00f500ea00f400ea00f400e900f400e900f400e900f400e900f100e900ef00e900 +ed00e900ec00e800eb00e800ea00e700e900e700e900e600e700e600e600e600e500e600e300e600e200e500e100e500e100e500e000e400df00e400df00e400 +de00e300de00e300de00e300de00e200dd00e200dd00e200db00e100d900e100d700e000d600df00d500de00d500dd00d500dd00d500dd00d300dc00d200db00 +d000da00cf00d900cf00d800ce00d700ce00d700ce00d700cd00d600cc00d500cb00d400ca00d300ca00d200ca00d200ca00d100c900d100c900d100c800d000 +c800d000c800cf00c700ce00c700ce00c700cd00c700cd00cc00cc00cc00cc00cc00cc00cc00cd00cd00cd00cd00ce00cd00ce00cd00cf00ce00cf00ce00cf00 +ce00d000ce00d000cf00d100d000d200d100d300d200d400d300d400d300d400d300d500d400d600d500d700d500d800d700d900d800da00d900da00d900da00 +da00db00da00db00db00dc00dc00dd00de00de00e000de00e200df00e200df00e300df00e300e000e400e100e600e100e700e200e900e200ec00e20007000000 +fc0200001e99d1000000040000002d01050004000000f00104004a0100002403a300eb00e300eb00e300eb00e400ec00e400ed00e500ee00e500f000e500f300 +e600f600e600f600e600f700e600f800e700f900e700fb00e700fd00e700ff00e7000101e7000101e7000201e8000301e8000501e8000601e8000801e8000a01 +e8000c01e8000c01e8000c01e8000d01e8000e01e8001001e8001101e8001201e8001201e7001201ea001101eb001001eb000f01eb000e01eb000d01eb000c01 +eb000b01eb000b01eb000901ec000801ec000601ec000401ec000301ec000101eb000101eb000001eb00fe00eb00fd00eb00fb00eb00fa00eb00f900eb00f800 +ea00f700ea00f600ea00f600ea00f500ea00f500ea00f400ea00f400e900f400e900f400e900f400e900f100e900ef00e900ed00e900ec00e800eb00e800ea00 +e700e900e700e900e600e700e600e600e600e500e600e300e600e200e500e100e500e100e500e000e400df00e400df00e400de00e300de00e300de00e300de00 +e200dd00e200dd00e200db00e100d900e100d700e000d600df00d500de00d500dd00d500dd00d500dd00d300dc00d200db00d000da00cf00d900cf00d800ce00 +d700ce00d700ce00d700cd00d600cc00d500cb00d400ca00d300ca00d200ca00d200ca00d100c900d100c900d100c800d000c800d000c800cf00c700ce00c700 +ce00c700cd00c700cd00cb00cc00cb00cc00cb00cd00cb00cd00cb00ce00cc00ce00cc00cf00cc00cf00cd00d000cd00d000cd00d000cd00d100ce00d200ce00 +d200cf00d300d000d400d200d500d200d500d200d600d300d700d300d800d400d900d500da00d700da00d800db00d800db00d800db00d900dc00da00dd00db00 +de00dd00df00de00df00e100e000e100e000e100e000e200e100e300e200e500e200e700e300e900e300eb00e30007000000fc02000029a6d400000004000000 +2d01040004000000f00105004a0100002403a300ea00e400eb00e400eb00e500eb00e500ec00e600ee00e600ef00e600f200e700f500e700f600e700f600e700 +f700e800f900e800fb00e800fc00e900fe00e9000101e8000101e8000201e9000301e9000401e9000601e9000801e9000a01e9000b01e9000c01e9000c01e900 +0d01e9000e01e9000f01e9001101e9001201e9001201e8001201ea001101eb001001eb000f01eb000e01eb000d01eb000c01eb000b01eb000b01eb000901ec00 +0801ec000601ec000401ec000301ec000101eb000101eb000001eb00fe00eb00fd00eb00fb00eb00fa00eb00f900eb00f800ea00f700ea00f600ea00f600ea00 +f500ea00f500ea00f400ea00f400e900f400e900f400e900f400e900f100e900ef00e900ed00e900ec00e800eb00e800ea00e700e900e700e900e600e700e600 +e600e600e500e600e300e600e200e500e100e500e100e500e000e400df00e400df00e400de00e300de00e300de00e300de00e200dd00e200dd00e200db00e100 +d900e100d700e000d600df00d500de00d500dd00d500dd00d500dd00d300dc00d200db00d000da00cf00d900cf00d800ce00d700ce00d700ce00d700cd00d600 +cc00d500cb00d400ca00d300ca00d200ca00d200ca00d100c900d100c900d100c800d000c800d000c800cf00c700ce00c700ce00c700cd00c700cd00ca00cd00 +ca00cd00ca00cd00ca00cd00ca00ce00ca00cf00cb00cf00cb00d000cb00d000cb00d000cc00d100cc00d100cc00d200cd00d300ce00d400cf00d500d000d500 +d100d500d100d600d100d700d200d800d300d900d400da00d500db00d700db00d700db00d700dc00d800dd00d900de00da00de00db00df00dd00e000e000e100 +e000e100e000e100e100e200e200e300e400e300e600e400e800e400ea00e40007000000fc02000033b3d9000000040000002d01050004000000f00104005a01 +00002403ab001201ea001101eb001001eb000f01eb000e01eb000d01eb000c01eb000b01eb000b01eb000901ec000801ec000601ec000401ec000301ec000101 +eb000101eb000001eb00fe00eb00fd00eb00fb00eb00fa00eb00f900eb00f800ea00f700ea00f600ea00f600ea00f500ea00f500ea00f400ea00f400e900f400 +e900f400e900f400e900f100e900ef00e900ed00e900ec00e800eb00e800ea00e700e900e700e900e600e700e600e600e600e500e600e300e600e200e500e100 +e500e100e500e000e400df00e400df00e400de00e300de00e300de00e300de00e200dd00e200dd00e200db00e100d900e100d700e000d600df00d500de00d500 +dd00d500dd00d500dd00d300dc00d200db00d000da00cf00d900cf00d800ce00d700ce00d700ce00d700cd00d600cc00d500cb00d400ca00d300ca00d200ca00 +d200ca00d100c900d100c900d100c800d000c800d000c800cf00c700ce00c700ce00c700cd00c700cd00c900cd00c900cd00c900cd00c900ce00c900ce00c900 +cf00c900d000ca00d000ca00d000ca00d000ca00d100cb00d200cb00d200cc00d300cd00d400ce00d500cf00d600cf00d600d000d700d000d800d100d900d200 +da00d300db00d400dc00d600dc00d600dc00d600dd00d700dd00d800de00d900df00da00e000dc00e100df00e100df00e200df00e200e000e300e100e300e300 +e400e500e500e700e500ea00e500ea00e500ea00e600eb00e600ec00e700ed00e700ef00e700f100e800f500e800f500e800f500e800f500e800f600e800f600 +e800f700e900f800e900f800e900f900e900fa00e900fb00e900fc00ea00fd00ea00fe00ea00ff00e9000001e9000101e9000101ea000201ea000401ea000601 +ea000701ea000901ea000b01ea000b01ea000c01ea000d01ea000e01ea000f01ea001101ea001201ea001201e9001201ea004000000024031e00cf00d600df00 +ce00df00ce00df00ce00df00cf00de00cf00de00cf00de00cf00dd00cf00dd00d000dc00d000db00d100da00d100d800d200d600d300d500d400d300d500d200 +d500d200d500d100d600d100d600d000d600d000d700d000d700d000d700d000d700d000d700d000d700cf00d600cf00d60008000000fa020600010000000000 +2600040000002d0104000800000025030200ce00d700e300cd0007000000fc020000000d66000000040000002d01060004000000f0010500040000002d010100 +04000000f00104001000000024030600ce00d600ce00d700e200cd00e200cc00cd00d600ce00d60007000000fc020000001f73000000040000002d0104000400 +0000f00106001000000024030600e200cc00e200cc00cf00d500d000d600e200cd00e200cc0007000000fc020000003382000000040000002d01050004000000 +f00104001000000024030600e200cc00e200cc00d100d400d200d500e200cd00e200cc0007000000fc02000000458f000000040000002d01040004000000f001 +05001000000024030600e200cc00e200cc00d300d300d300d400e200cd00e200cc0007000000fc02000000599e000000040000002d01050004000000f0010400 +1000000024030600e200cc00e200cc00d500d200d500d300e200cd00e200cc0007000000fc020000006bab000000040000002d01040004000000f00105001000 +000024030600e200cc00e200cc00d700d100d700d200e200cd00e200cc0007000000fc020000057fba000000040000002d01050004000000f001040010000000 +24030600e200cc00e200cc00d900d000d900d100e200cd00e200cc0007000000fc0200001791c7000000040000002d01040004000000f0010500100000002403 +0600e200cc00e200cc00db00d000db00d000e200cd00e200cc0007000000fc02000029a6d6000000040000002d01050004000000f00104001000000024030600 +e200cc00e200cc00dc00cf00dd00cf00e200cd00e200cc0007000000fc02000038b8e3000000040000002d01040004000000f00105001000000024030600e200 +cc00e200cc00de00ce00df00cf00e200cd00e200cc0007000000fc0200004cccf2000000040000002d01050004000000f00104001000000024030600e200cc00 +e200cc00e000cd00e100ce00e200cd00e200cc0007000000fc02000033b3d9000000040000002d01040004000000f00105003800000024031a00d600dc00e400 +d200e400d200e400d300e300d300e200d400e200d400e100d500df00d600de00d700dc00d800db00d900da00da00d900db00d800db00d800dc00d700dc00d700 +dc00d700dd00d600dd00d600dd00d600dd00d600dd00d600dd00d600dd00d600dc0008000000fa0206000100000000002600040000002d010500080000002503 +0200d500dd00e900cf0007000000fc020000000d66000000040000002d01060004000000f0010400040000002d01010004000000f00105001000000024030600 +d400dd00d500dd00e900cf00e800ce00d400dc00d400dd0007000000fc020000001f73000000040000002d01040004000000f00106001000000024030600e900 +cf00e800ce00d600db00d600dc00e900cf00e900cf0007000000fc020000003382000000040000002d01050004000000f00104001000000024030600e900cf00 +e800ce00d800da00d800da00e900cf00e900cf0007000000fc02000000458f000000040000002d01040004000000f00105001000000024030600e900cf00e800 +ce00da00d800da00d900e900cf00e900cf0007000000fc02000000599e000000040000002d01050004000000f00104001000000024030600e900cf00e800ce00 +db00d700dc00d800e900cf00e900cf0007000000fc020000006bab000000040000002d01040004000000f00105001000000024030600e900cf00e800ce00dd00 +d600de00d700e900cf00e900cf0007000000fc020000057fba000000040000002d01050004000000f00104001000000024030600e900cf00e800ce00df00d500 +e000d500e900cf00e900cf0007000000fc0200001791c7000000040000002d01040004000000f00105001000000024030600e900cf00e800ce00e100d300e200 +d400e900cf00e900cf0007000000fc02000029a6d6000000040000002d01050004000000f00104001000000024030600e900cf00e800ce00e300d200e400d300 +e900cf00e900cf0007000000fc02000038b8e3000000040000002d01040004000000f00105001000000024030600e900cf00e800ce00e500d100e500d200e900 +cf00e900cf0007000000fc0200004cccf2000000040000002d01050004000000f00104001000000024030600e900cf00e800ce00e700d000e700d000e900cf00 +e900cf0007000000fc02000033b3d9000000040000002d01040004000000f00105003800000024031a00de00e200eb00d600eb00d600ea00d600ea00d700e900 +d800e900d800e800d900e700da00e500dc00e400dd00e300de00e200df00e100e000e100e100e000e100e000e200df00e200df00e200df00e200df00e300df00 +e300df00e300df00e300de00e200de00e20008000000fa0206000100000000002600040000002d0105000800000025030200de00e200ef00d20007000000fc02 +0000000d66000000040000002d01060004000000f0010400040000002d01010004000000f00105001000000024030600dd00e200dd00e300ee00d300ee00d200 +dd00e200dd00e20007000000fc020000001f73000000040000002d01040004000000f00106001000000024030600ee00d200ee00d200df00e000df00e100ee00 +d300ee00d20007000000fc020000003382000000040000002d01050004000000f00104001000000024030600ee00d200ee00d200e000df00e100e000ee00d300 +ee00d20007000000fc02000000458f000000040000002d01040004000000f00105001000000024030600ee00d200ee00d200e100dd00e200de00ee00d300ee00 +d20007000000fc02000000599e000000040000002d01050004000000f00104001000000024030600ee00d200ee00d200e300dc00e400dd00ee00d300ee00d200 +07000000fc020000006bab000000040000002d01040004000000f00105001000000024030600ee00d200ee00d200e500db00e500db00ee00d300ee00d2000700 +0000fc020000057fba000000040000002d01050004000000f00104001000000024030600ee00d200ee00d200e600d900e700da00ee00d300ee00d20007000000 +fc0200001791c7000000040000002d01040004000000f00105001000000024030600ee00d200ee00d200e800d800e800d800ee00d300ee00d20007000000fc02 +000029a6d6000000040000002d01050004000000f00104001000000024030600ee00d200ee00d200e900d600ea00d700ee00d300ee00d20007000000fc020000 +38b8e3000000040000002d01040004000000f00105001000000024030600ee00d200ee00d200eb00d500eb00d600ee00d300ee00d20007000000fc0200004ccc +f2000000040000002d01050004000000f00104001000000024030600ee00d200ee00d200ec00d300ed00d400ee00d300ee00d20007000000fc02000033b3d900 +0000040000002d01040004000000f00105004000000024031e00e900e600f400d800f400d800f400d800f300d800f300d800f300d900f300d900f300da00f200 +da00f200db00f100dc00f000dd00ef00de00ee00e000ed00e200ed00e300ec00e400ec00e400eb00e500eb00e500eb00e600eb00e600ea00e600ea00e600ea00 +e700eb00e700ea00e700ea00e600e900e60008000000fa0206000100000000002600040000002d0105000800000025030200e900e600f700d40007000000fc02 +0000000d66000000040000002d01060004000000f0010400040000002d01010004000000f00105001000000024030600e900e600e900e700f600d400f500d400 +e800e600e900e60007000000fc020000001f73000000040000002d01040004000000f00106001000000024030600f600d400f500d400e900e400ea00e500f600 +d400f600d40007000000fc020000003382000000040000002d01050004000000f00104001000000024030600f600d400f500d400eb00e300eb00e300f600d400 +f600d40007000000fc02000000458f000000040000002d01040004000000f00105001000000024030600f600d400f500d400ec00e100ed00e200f600d400f600 +d40007000000fc02000000599e000000040000002d01050004000000f00104001000000024030600f600d400f500d400ed00df00ee00e000f600d400f600d400 +07000000fc020000006bab000000040000002d01040004000000f00105001000000024030600f600d400f500d400ee00de00ef00de00f600d400f600d4000700 +0000fc020000057fba000000040000002d01050004000000f00104001000000024030600f600d400f500d400f000dc00f000dc00f600d400f600d40007000000 +fc0200001791c7000000040000002d01040004000000f00105001000000024030600f600d400f500d400f100da00f200db00f600d400f600d40007000000fc02 +000029a6d6000000040000002d01050004000000f00104001000000024030600f600d400f500d400f200d800f300d900f600d400f600d40007000000fc020000 +38b8e3000000040000002d01040004000000f00105001000000024030600f600d400f500d400f300d700f400d700f600d400f600d40007000000fc0200004ccc +f2000000040000002d01050004000000f00104001000000024030600f600d400f500d400f500d500f500d600f600d400f600d40007000000fc02000033b3d900 +0000040000002d01040004000000f00105004000000024031e00f400e900fc00d900fc00d900fc00d900fc00d900fc00d900fc00da00fc00da00fb00db00fb00 +db00fb00dc00fa00dd00fa00df00f900e000f800e200f700e400f700e500f600e600f600e600f600e700f600e800f600e800f500e900f500e900f500e900f500 +e900f500e900f500e900f500e900f400e90008000000fa0206000100000000002600040000002d0105000800000025030200f400e900fe00d40007000000fc02 +0000000d66000000040000002d01060004000000f0010400040000002d01010004000000f00105001000000024030600f300e900f400e900fe00d500fd00d400 +f300e900f300e90007000000fc020000001f73000000040000002d01040004000000f00106001000000024030600fe00d500fd00d400f400e700f500e700fe00 +d500fe00d50007000000fc020000003382000000040000002d01050004000000f00104001000000024030600fe00d500fd00d400f500e500f600e600fe00d500 +fe00d50007000000fc02000000458f000000040000002d01040004000000f00105001000000024030600fe00d500fd00d400f600e300f700e400fe00d500fe00 +d50007000000fc02000000599e000000040000002d01050004000000f00104001000000024030600fe00d500fd00d400f700e100f800e200fe00d500fe00d500 +07000000fc020000006bab000000040000002d01040004000000f00105001000000024030600fe00d500fd00d400f800e000f900e000fe00d500fe00d5000700 +0000fc020000057fba000000040000002d01050004000000f00104001000000024030600fe00d500fd00d400f900de00fa00de00fe00d500fe00d50007000000 +fc0200001791c7000000040000002d01040004000000f00105001000000024030600fe00d500fd00d400fa00dc00fa00dc00fe00d500fe00d50007000000fc02 +000029a6d6000000040000002d01050004000000f00104001000000024030600fe00d500fd00d400fb00da00fb00da00fe00d500fe00d50007000000fc020000 +38b8e3000000040000002d01040004000000f00105001000000024030600fe00d500fd00d400fb00d800fc00d800fe00d500fe00d50007000000fc0200004ccc +f2000000040000002d01050004000000f00104001000000024030600fe00d500fd00d400fc00d600fd00d600fe00d500fe00d50008000000fa02060001000000 +00002600040000002d01040008000000250302000001eb000701d40007000000fc020000000d66000000040000002d01060004000000f0010500040000002d01 +010004000000f001040010000000240306000001eb000001eb000701d5000601d500ff00eb000001eb0007000000fc020000001f73000000040000002d010400 +04000000f001060010000000240306000601d5000601d5000001e9000101e9000701d5000601d50007000000fc020000003382000000040000002d0105000400 +0000f001040010000000240306000601d5000601d5000001e7000101e7000701d5000601d50007000000fc02000000458f000000040000002d01040004000000 +f001050010000000240306000601d5000601d5000101e5000201e5000701d5000601d50007000000fc02000000599e000000040000002d01050004000000f001 +040010000000240306000601d5000601d5000201e3000301e3000701d5000601d50007000000fc020000006bab000000040000002d01040004000000f0010500 +10000000240306000601d5000601d5000201e1000301e1000701d5000601d50007000000fc020000057fba000000040000002d01050004000000f00104001000 +0000240306000601d5000601d5000301de000401df000701d5000601d50007000000fc0200001791c7000000040000002d01040004000000f001050010000000 +240306000601d5000601d5000401dd000401dd000701d5000601d50007000000fc02000029a6d6000000040000002d01050004000000f0010400100000002403 +06000601d5000601d5000401db000501db000701d5000601d50007000000fc02000038b8e3000000040000002d01040004000000f00105001000000024030600 +0601d5000601d5000501d9000601d9000701d5000601d50007000000fc0200004cccf2000000040000002d01050004000000f001040010000000240306000601 +d5000601d5000501d6000601d7000701d5000601d50008000000fa0206000100000000002600040000002d01040008000000250302000b01eb000f01d4000700 +0000fc020000000d66000000040000002d01060004000000f0010500040000002d01010004000000f001040010000000240306000b01eb000b01eb000f01d500 +0e01d4000a01eb000b01eb0007000000fc020000001f73000000040000002d01040004000000f001060010000000240306000f01d5000e01d4000b01e9000b01 +e9000f01d5000f01d50007000000fc020000003382000000040000002d01050004000000f001040010000000240306000f01d5000e01d4000b01e7000c01e700 +0f01d5000f01d50007000000fc02000000458f000000040000002d01040004000000f001050010000000240306000f01d5000e01d4000b01e5000c01e5000f01 +d5000f01d50007000000fc02000000599e000000040000002d01050004000000f001040010000000240306000f01d5000e01d4000c01e3000d01e3000f01d500 +0f01d50007000000fc020000006bab000000040000002d01040004000000f001050010000000240306000f01d5000e01d4000c01e1000d01e1000f01d5000f01 +d50007000000fc020000057fba000000040000002d01050004000000f001040010000000240306000f01d5000e01d4000c01df000d01df000f01d5000f01d500 +07000000fc0200001791c7000000040000002d01040004000000f001050010000000240306000f01d5000e01d4000d01dd000e01dd000f01d5000f01d5000700 +0000fc02000029a6d6000000040000002d01050004000000f001040010000000240306000f01d5000e01d4000d01da000e01db000f01d5000f01d50007000000 +fc02000038b8e3000000040000002d01040004000000f001050010000000240306000f01d5000e01d4000e01d8000f01d9000f01d5000f01d50007000000fc02 +00004cccf2000000040000002d01050004000000f001040010000000240306000f01d5000e01d4000e01d6000f01d7000f01d5000f01d50007000000fc020000 +33b3d9000000040000002d01040004000000f00105004000000024031e00ca00d100db00cc00db00cc00db00cc00db00cc00da00cc00da00cc00d900cc00d900 +cd00d900cd00d800cd00d700ce00d500ce00d300cf00d200cf00d000d000cf00d100ce00d100cd00d100cc00d100cc00d200cb00d200cb00d200cb00d200cb00 +d200cb00d200cb00d200ca00d200ca00d200ca00d10008000000fa0206000100000000002600040000002d0105000800000025030200c900d100de00ca000700 +0000fc020000000d66000000040000002d01060004000000f0010400040000002d01010004000000f00105001000000024030600c900d100c900d200de00cb00 +de00ca00c900d100c900d10007000000fc020000001f73000000040000002d01040004000000f00106001000000024030600de00ca00de00ca00cb00d000cb00 +d100de00cb00de00ca0007000000fc020000003382000000040000002d01050004000000f00104001000000024030600de00ca00de00ca00cd00cf00cd00d000 +de00cb00de00ca0007000000fc02000000458f000000040000002d01040004000000f00105001000000024030600de00ca00de00ca00cf00cf00cf00d000de00 +cb00de00ca0007000000fc02000000599e000000040000002d01050004000000f00104001000000024030600de00ca00de00ca00d100ce00d100cf00de00cb00 +de00ca0007000000fc020000006bab000000040000002d01040004000000f00105001000000024030600de00ca00de00ca00d300ce00d300ce00de00cb00de00 +ca0007000000fc020000057fba000000040000002d01050004000000f00104001000000024030600de00ca00de00ca00d400cd00d500ce00de00cb00de00ca00 +07000000fc0200001791c7000000040000002d01040004000000f00105001000000024030600de00ca00de00ca00d600cc00d700cd00de00cb00de00ca000700 +0000fc02000029a6d6000000040000002d01050004000000f00104001000000024030600de00ca00de00ca00d800cc00d900cd00de00cb00de00ca0007000000 +fc02000038b8e3000000040000002d01040004000000f00105001000000024030600de00ca00de00ca00da00cb00da00cc00de00cb00de00ca0007000000fc02 +00004cccf2000000040000002d01050004000000f00104001000000024030600de00ca00de00ca00dc00ca00dc00cb00de00cb00de00ca0007000000fc020000 +0066bf000000040000002d01040004000000f0010500ea00000024037300dc00c800dc00c900dc00c900dc00c900dd00ca00dd00ca00de00cb00df00cb00e100 +cb00e100cc00e100cc00e200cd00e200ce00e300ce00e500cf00e600cf00e900cf00e900cf00e900d000ea00d100ea00d100ec00d200ed00d200ef00d300f100 +d300f100d300f100d300f200d400f300d400f400d500f600d500f700d500f900d400fa00d500fa00d500fb00d500fc00d600fd00d600fe00d6000001d6000201 +d5000201d6000201d6000301d6000401d7000501d7000701d7000801d7000a01d6000b01d7000b01d7000c01d7000d01d7000f01d7001001d7001101d7001201 +d6001201d0001201d0001101d0001101d0001001d0001001d1000f01d0000e01d0000d01d0000c01d0000c01d0000b01d0000a01d0000801d0000701d0000601 +d0000501cf000501cf000401cf000301cf000201cf000101cf000001cf00fe00cf00fd00ce00fd00ce00fd00ce00fc00ce00fb00ce00f900ce00f800ce00f700 +cd00f500cd00f500cd00f500cd00f400cd00f300cd00f200cc00f100cc00f000cb00ef00ca00ef00ca00ee00ca00ed00ca00ec00ca00eb00ca00ea00c900e900 +c800e800c800e800c800e800c800e700c700e700c700e600c700e500c700e500c600e400c500dc00c80007000000fc0200000072c4000000040000002d010500 +04000000f0010400ea00000024037300e700c800e800c900e900ca00ea00ca00eb00ca00ec00cb00ed00cb00ee00cb00ee00cb00ef00cc00f000cd00f100cd00 +f200cd00f300cd00f400cd00f500cd00f500cd00f600ce00f700cf00f900cf00fa00cf00fb00cf00fc00cf00fd00cf00fd00cf00fe00d000ff00d0000001d000 +0201d0000301d0000401d0000401d0000401d0000501d1000701d1000801d1000901d1000a01d1000b01d1000c01d1000c01d1000d01d1000e01d1000f01d100 +1001d1001101d1001101d1001201d1001201d1001201d6001101d7001001d7000f01d7000d01d7000c01d7000b01d7000b01d7000a01d6000801d7000701d700 +0501d7000401d7000301d6000201d6000201d6000201d5000001d600fe00d600fd00d600fc00d600fb00d500fa00d500fa00d500f900d400f700d500f600d500 +f400d500f300d400f200d400f100d300f100d300f100d300ef00d300ed00d200ec00d200ea00d100ea00d100e900d000e900cf00e900cf00e600cf00e500cf00 +e300ce00e200ce00e200cd00e100cc00e100cc00e100cb00df00cb00de00cb00dd00ca00dd00ca00dc00c900dc00c900dc00c900dc00c800e300c600e400c600 +e400c700e500c700e600c800e600c800e700c800e700c800e700c80007000000fc0200000880c7000000040000002d01040004000000f0010500ea0000002403 +7300e600c800e700c900e800ca00e900cb00ea00cb00eb00cb00ec00cc00ed00cc00ed00cc00ee00cd00ef00cd00f100ce00f200ce00f300ce00f300ce00f400 +ce00f400ce00f500cf00f700d000f800d000f900d000fb00d000fc00d000fc00d000fc00d000fe00d000ff00d1000001d1000101d1000201d1000301d1000401 +d1000401d1000501d1000601d2000801d2000901d2000a01d2000b01d2000c01d2000c01d2000d01d2000e01d2000f01d2001001d2001101d2001101d2001201 +d2001201d2001201d6001101d7001001d7000f01d7000d01d7000c01d7000b01d7000b01d7000a01d6000801d7000701d7000501d7000401d7000301d6000201 +d6000201d6000201d5000001d600fe00d600fd00d600fc00d600fb00d500fa00d500fa00d500f900d400f700d500f600d500f400d500f300d400f200d400f100 +d300f100d300f100d300ef00d300ed00d200ec00d200ea00d100ea00d100e900d000e900cf00e900cf00e600cf00e500cf00e300ce00e200ce00e200cd00e100 +cc00e100cc00e100cb00df00cb00de00cb00dd00ca00dd00ca00dc00c900dc00c900dc00c900dc00c800e200c600e300c700e300c800e400c800e400c800e500 +c800e600c800e600c800e600c80007000000fc020000128ccc000000040000002d01050004000000f0010400ea00000024037300e500c900e600ca00e700cb00 +e800cb00e900cc00ea00cc00eb00cc00ec00cc00ec00cc00ed00cd00ef00ce00f000ce00f100cf00f200cf00f300cf00f300cf00f300cf00f500d000f600d000 +f700d100f900d100fa00d100fb00d100fc00d100fc00d100fd00d100fe00d2000001d2000101d2000201d2000301d2000401d2000401d2000501d2000601d200 +0701d3000901d3000a01d3000b01d3000b01d3000c01d3000d01d3000e01d3000f01d3001001d3001101d3001101d3001201d3001201d3001201d6001101d700 +1001d7000f01d7000d01d7000c01d7000b01d7000b01d7000a01d6000801d7000701d7000501d7000401d7000301d6000201d6000201d6000201d5000001d600 +fe00d600fd00d600fc00d600fb00d500fa00d500fa00d500f900d400f700d500f600d500f400d500f300d400f200d400f100d300f100d300f100d300ef00d300 +ed00d200ec00d200ea00d100ea00d100e900d000e900cf00e900cf00e600cf00e500cf00e300ce00e200ce00e200cd00e100cc00e100cc00e100cb00df00cb00 +de00cb00dd00ca00dd00ca00dc00c900dc00c900dc00c900dc00c800e100c600e200c700e200c800e300c800e300c900e400c900e500c900e500c900e500c900 +07000000fc0200001e99d1000000040000002d01040004000000f0010500ea00000024037300e400ca00e500ca00e600cb00e700cc00e800cc00e900cd00ea00 +cd00eb00cd00eb00cd00ed00ce00ee00cf00ef00cf00f000cf00f100d000f200d000f300d000f300d000f400d100f500d100f700d100f800d100f900d100fb00 +d100fb00d100fb00d100fd00d200fe00d200ff00d3000001d3000201d3000201d2000301d2000301d2000401d3000601d3000701d3000801d4000901d4000a01 +d4000b01d3000b01d3000d01d4000e01d4000f01d4001001d4001101d4001101d4001201d4001201d4001201d6001101d7001001d7000f01d7000d01d7000c01 +d7000b01d7000b01d7000a01d6000801d7000701d7000501d7000401d7000301d6000201d6000201d6000201d5000001d600fe00d600fd00d600fc00d600fb00 +d500fa00d500fa00d500f900d400f700d500f600d500f400d500f300d400f200d400f100d300f100d300f100d300ef00d300ed00d200ec00d200ea00d100ea00 +d100e900d000e900cf00e900cf00e600cf00e500cf00e300ce00e200ce00e200cd00e100cc00e100cc00e100cb00df00cb00de00cb00dd00ca00dd00ca00dc00 +c900dc00c900dc00c900dc00c800e000c700e000c800e100c800e200c900e200c900e300c900e400c900e400ca00e400ca0007000000fc02000029a6d4000000 +040000002d01050004000000f0010400ea00000024037300e300ca00e400cb00e500cc00e600cc00e700cd00e900cd00ea00ce00ea00ce00eb00ce00ec00cf00 +ed00cf00ee00d000ef00d000f000d100f100d100f200d100f200d100f300d200f500d200f600d200f800d200f900d200fa00d200fb00d200fb00d200fc00d300 +fd00d300ff00d3000001d3000101d3000201d3000301d3000301d3000401d4000501d4000701d4000801d4000901d4000a01d4000b01d4000b01d4000c01d500 +0d01d5000f01d5001001d5001101d5001101d5001201d4001201d4001201d6001101d7001001d7000f01d7000d01d7000c01d7000b01d7000b01d7000a01d600 +0801d7000701d7000501d7000401d7000301d6000201d6000201d6000201d5000001d600fe00d600fd00d600fc00d600fb00d500fa00d500fa00d500f900d400 +f700d500f600d500f400d500f300d400f200d400f100d300f100d300f100d300ef00d300ed00d200ec00d200ea00d100ea00d100e900d000e900cf00e900cf00 +e600cf00e500cf00e300ce00e200ce00e200cd00e100cc00e100cc00e100cb00df00cb00de00cb00dd00ca00dd00ca00dc00c900dc00c900dc00c900dc00c800 +df00c700df00c800e000c900e100c900e100ca00e200ca00e300ca00e300ca00e300ca0007000000fc02000033b3d9000000040000002d01040004000000f001 +0500ea00000024037300dc00c800dc00c900dc00c900dc00c900dd00ca00dd00ca00de00cb00df00cb00e100cb00e100cc00e100cc00e200cd00e200ce00e300 +ce00e500cf00e600cf00e900cf00e900cf00e900d000ea00d100ea00d100ec00d200ed00d200ef00d300f100d300f100d300f100d300f200d400f300d400f400 +d500f600d500f700d500f900d400fa00d500fa00d500fb00d500fc00d600fd00d600fe00d6000001d6000201d5000201d6000201d6000301d6000401d7000501 +d7000701d7000801d7000a01d6000b01d7000b01d7000c01d7000d01d7000f01d7001001d7001101d7001201d6001201d5001201d5001101d5001001d6000f01 +d6000e01d6000d01d6000c01d5000b01d5000a01d5000a01d5000901d5000701d5000601d5000501d5000401d4000301d4000201d4000201d4000101d400ff00 +d400fe00d400fd00d400fc00d300fa00d300fa00d300f900d300f800d300f700d300f600d300f400d300f300d200f100d200f100d200f100d100f000d100ef00 +d100ed00d100ec00d000eb00cf00ea00ce00e900ce00e900ce00e800ce00e600cd00e500cd00e400cc00e300cb00e200ca00e200ca00e200ca00e100ca00e000 +ca00e000ca00df00c900de00c900de00c800dc00c80007000000fc0200000066bf000000040000002d01050004000000f00104009800000024034a001201ce00 +1201ce001101ce001101ce001001ce001001ce000f01ce000e01ce000d01ce000d01ce000c01cd000b01cd000b01cd000b01cd000a01cc000901cc000901cc00 +0801cd000701cc000501cc000401cc000301cb000201cb000101ca000001c900ff00c800ff00c800fe00c700fd00c600fc00c600fb00c600fa00c600f900c600 +f700c600f600c600f400c600f300c500f200c500f100c400f000c300ef00c100ef00c100ef00c100f000c100f000c000f100c000f100c000f200bf00f300bf00 +f400bf00f500bf00f600bf00f800bf00f900c000fb00c000fd00c100fe00c1000001c2000201c2000401c3000501c4000701c5000801c6000a01c6000b01c700 +0d01c9000e01ca000f01cb001001cb001101cc001101cc001201cc001201cc001201ce0007000000fc0200000059b2000000040000002d01040004000000f001 +05009800000024034a00f900c600f700c600f600c600f500c600f300c500f200c500f100c400f000c300f000c100f000c100f000c100f000c100f000c000f100 +c000f100c000f200bf00f300bf00f400bf00f500bf00f600bf00f800bf00f900c000fb00c000fd00c100fe00c1000001c2000201c2000401c3000501c4000701 +c5000801c6000a01c6000b01c7000d01c9000e01ca000f01cb001001cb001101cc001101cc001201cc001201cc001201ce001201ce001101ce001101ce001001 +ce001001ce000f01ce000e01ce000d01cd000d01cd000c01cd000c01cd000b01cc000b01cc000a01cc000901cc000901cc000801cc000701cc000601cc000401 +cc000301cb000201ca000101ca000001c9000001c800ff00c700fe00c600fe00c600fd00c600fc00c500fa00c500f900c60007000000fc020000004da6000000 +040000002d01050004000000f00104009800000024034a00f900c500f800c500f600c500f500c500f400c500f200c400f100c400f000c300f000c100f000c100 +f000c100f000c100f000c000f100c000f100c000f200bf00f300bf00f400bf00f500bf00f600bf00f800bf00f900c000fb00c000fd00c100fe00c1000001c200 +0201c2000401c3000501c4000701c5000801c6000a01c6000b01c7000d01c9000e01ca000f01cb001001cb001101cc001101cc001201cc001201cc001201cd00 +1201cd001101cd001101cd001101ce001001ce000f01ce000e01cd000d01cd000d01cd000c01cc000c01cc000b01cc000b01cc000a01cc000a01cb000901cc00 +0801cc000701cc000601cb000501cb000301cb000201ca000101c9000101c8000001c700ff00c600ff00c600fe00c500fd00c500fc00c500fb00c500f900c500 +07000000fc020000004099000000040000002d01040004000000f00105009800000024034a00fa00c500f800c500f700c500f500c500f400c500f300c400f100 +c400f100c200f000c100f000c100f000c100f000c100f000c000f100c000f200c000f200bf00f300bf00f400bf00f500bf00f600bf00f800bf00f900c000fb00 +c000fd00c100fe00c1000001c2000201c2000401c3000501c4000701c5000801c6000a01c6000b01c7000d01c9000e01ca000f01cb001001cb001101cc001101 +cc001201cc001201cc001201cd001201cd001101cd001101cd001101cd001001cd000f01cd000e01cd000d01cd000d01cc000c01cc000c01cc000b01cb000b01 +cb000a01cb000a01cb000901cb000801cb000701cb000601cb000501cb000401ca000301ca000201c9000101c8000001c7000001c600ff00c500fe00c500fd00 +c500fc00c500fb00c500fa00c50007000000fc02000000338c000000040000002d01050004000000f00104009800000024034a001201cd001201cd001101cd00 +1101cd001101cd001001cd000f01cd000f01cd000d01cc000d01cc000c01cc000c01cb000b01cb000b01cb000a01cb000a01cb000901cb000801cb000701cb00 +0601cb000501ca000401ca000301c9000201c9000201c8000101c6000001c500ff00c500ff00c400fe00c400fd00c400fc00c400fa00c400f900c500f700c500 +f500c500f400c500f300c400f200c300f100c200f000c100f000c100f000c100f000c100f100c000f100c000f200c000f200bf00f300bf00f400bf00f500bf00 +f600bf00f800bf00f900c000fb00c000fd00c100fe00c1000001c2000201c2000401c3000501c4000701c5000801c6000a01c6000b01c7000d01c9000e01ca00 +0f01cb001001cb001101cc001101cc001201cc001201cc001201cd0007000000fc02000033b3d9000000040000002d01040004000000f0010500380000002403 +1a00e200cb00ee00c500ee00c500ed00c500ed00c500ec00c600ec00c600eb00c600ea00c700e900c800e700c800e600c900e500ca00e400ca00e400ca00e400 +cb00e300cb00e300cb00e300cb00e200cb00e200cb00e200cb00e200cb00e200cb00e200cb00e200cb0008000000fa0206000100000000002600040000002d01 +05000800000025030200e100cb00f200c20007000000fc020000000d66000000040000002d01060004000000f0010400040000002d01010004000000f0010500 +1000000024030600e000cb00e000cc00f200c200f100c100e000cb00e000cb0007000000fc020000001f73000000040000002d01040004000000f00106001000 +000024030600f200c200f100c100e200ca00e200cb00f200c200f200c20007000000fc020000003382000000040000002d01050004000000f001040010000000 +24030600f200c200f100c100e300c900e400ca00f200c200f200c20007000000fc02000000458f000000040000002d01040004000000f0010500100000002403 +0600f200c200f100c100e500c800e500c900f200c200f200c20007000000fc02000000599e000000040000002d01050004000000f00104001000000024030600 +f200c200f100c100e600c700e700c800f200c200f200c20007000000fc020000006bab000000040000002d01040004000000f00105001000000024030600f200 +c200f100c100e800c700e900c700f200c200f200c20007000000fc020000057fba000000040000002d01050004000000f00104001000000024030600f200c200 +f100c100ea00c600ea00c700f200c200f200c20007000000fc0200001791c7000000040000002d01040004000000f00105001000000024030600f200c200f100 +c100eb00c500ec00c600f200c200f200c20007000000fc02000029a6d6000000040000002d01050004000000f00104001000000024030600f200c200f100c100 +ed00c400ed00c500f200c200f200c20007000000fc02000038b8e3000000040000002d01040004000000f00105001000000024030600f200c200f100c100ef00 +c300ef00c400f200c200f200c20007000000fc0200004cccf2000000040000002d01050004000000f00104001000000024030600f200c200f100c100f000c200 +f100c300f200c200f200c20007000000fc02000033b3d9000000040000002d01040004000000f00105003000000024031600e900cf00f300c600f300c600f300 +c600f300c700f200c700f200c800f100c800f000c900ef00ca00ee00cb00ed00cc00ec00cd00ec00ce00eb00ce00ea00cf00ea00cf00ea00cf00ea00cf00ea00 +cf00ea00cf00e900cf0008000000fa0206000100000000002600040000002d0105000800000025030200e900d000f800c20007000000fc020000000d66000000 +040000002d01060004000000f0010400040000002d01010004000000f00105001000000024030600e800cf00e900d000f800c200f700c200e800cf00e800cf00 +07000000fc020000001f73000000040000002d01040004000000f00106001000000024030600f700c200f700c200e900ce00ea00cf00f800c200f700c2000700 +0000fc020000003382000000040000002d01050004000000f00104001000000024030600f700c200f700c200eb00cd00eb00cd00f800c200f700c20007000000 +fc02000000458f000000040000002d01040004000000f00105001000000024030600f700c200f700c200ec00cb00ed00cc00f800c200f700c20007000000fc02 +000000599e000000040000002d01050004000000f00104001000000024030600f700c200f700c200ee00ca00ee00cb00f800c200f700c20007000000fc020000 +006bab000000040000002d01040004000000f00105001000000024030600f700c200f700c200ef00c900f000ca00f800c200f700c20007000000fc020000057f +ba000000040000002d01050004000000f00104001000000024030600f700c200f700c200f000c800f100c800f800c200f700c20007000000fc0200001791c700 +0000040000002d01040004000000f00105001000000024030600f700c200f700c200f200c600f200c700f800c200f700c20007000000fc02000029a6d6000000 +040000002d01050004000000f00104001000000024030600f700c200f700c200f300c500f400c600f800c200f700c20007000000fc02000038b8e30000000400 +00002d01040004000000f00105001000000024030600f700c200f700c200f400c400f500c500f800c200f700c20007000000fc0200004cccf200000004000000 +2d01050004000000f00104001000000024030600f700c200f700c200f600c300f600c300f800c200f700c20007000000fc02000033b3d9000000040000002d01 +040004000000f00105004000000024031e00fa00d4000001c8000001c8000001c9000001c9000001c9000001ca000001ca00ff00cb00ff00cb00ff00cc00ff00 +cc00fe00cd00fe00ce00fd00cf00fc00d000fc00d100fc00d200fc00d200fb00d300fb00d300fb00d400fb00d400fb00d400fb00d400fb00d400fb00d400fb00 +d400fa00d400fa00d40008000000fa0206000100000000002600040000002d0105000800000025030200fa00d5000301c30007000000fc020000000d66000000 +040000002d01060004000000f0010400040000002d01010004000000f00105001000000024030600f900d500f900d5000201c6000101c600f900d400f900d500 +07000000fc020000001f73000000040000002d01040004000000f001060010000000240306000101c6000101c600f900d300fa00d3000201c6000101c6000700 +0000fc020000003382000000040000002d01050004000000f001040010000000240306000101c6000101c600fa00d200fb00d2000201c6000101c60007000000 +fc02000000458f000000040000002d01040004000000f001050010000000240306000101c6000101c600fb00d000fc00d1000201c6000101c60007000000fc02 +000000599e000000040000002d01050004000000f001040010000000240306000101c6000101c600fc00cf00fd00cf000201c6000101c60007000000fc020000 +006bab000000040000002d01040004000000f001050010000000240306000101c6000101c600fc00ce00fd00ce000201c6000101c60007000000fc020000057f +ba000000040000002d01050004000000f001040010000000240306000101c6000101c600fd00cc00fe00cd000201c6000101c60007000000fc0200001791c700 +0000040000002d01040004000000f001050010000000240306000101c6000101c600fe00cb00ff00cb000201c6000101c60007000000fc02000029a6d6000000 +040000002d01050004000000f001040010000000240306000101c6000101c600ff00c9000001ca000201c6000101c60007000000fc02000038b8e30000000400 +00002d01040004000000f001050010000000240306000101c6000101c6000001c8000001c9000201c6000101c60007000000fc0200004cccf200000004000000 +2d01050004000000f001040010000000240306000101c6000101c6000001c7000101c7000201c6000101c60008000000fa020600010000000000260004000000 +2d01040008000000250302000201d5000a01c40007000000fc020000000d66000000040000002d01060004000000f0010500040000002d01010004000000f001 +040010000000240306000101d6000201d6000701c9000601c9000101d6000101d60007000000fc020000001f73000000040000002d01040004000000f0010600 +10000000240306000701c9000601c9000101d4000201d5000701c9000701c90007000000fc020000003382000000040000002d01050004000000f00104001000 +0000240306000701c9000601c9000201d3000301d4000701c9000701c90007000000fc02000000458f000000040000002d01040004000000f001050010000000 +240306000701c9000601c9000201d2000301d3000701c9000701c90007000000fc02000000599e000000040000002d01050004000000f0010400100000002403 +06000701c9000601c9000301d1000401d1000701c9000701c90007000000fc020000006bab000000040000002d01040004000000f00105001000000024030600 +0701c9000601c9000301d0000401d0000701c9000701c90007000000fc020000057fba000000040000002d01050004000000f001040010000000240306000701 +c9000601c9000401cf000501cf000701c9000701c90007000000fc0200001791c7000000040000002d01040004000000f001050010000000240306000701c900 +0601c9000401cd000501ce000701c9000701c90007000000fc02000029a6d6000000040000002d01050004000000f001040010000000240306000701c9000601 +c9000501cc000601cd000701c9000701c90007000000fc02000038b8e3000000040000002d01040004000000f001050010000000240306000701c9000601c900 +0501cb000601cc000701c9000701c90007000000fc0200004cccf2000000040000002d01050004000000f001040010000000240306000701c9000601c9000601 +ca000701ca000701c9000701c90008000000fa0206000100000000002600040000002d01040008000000250302000a01d7000e01c90007000000fc020000000d +66000000040000002d01060004000000f0010500040000002d01010004000000f001040010000000240306000a01d7000a01d7000d01cb000d01cb000901d700 +0a01d70007000000fc020000001f73000000040000002d01040004000000f001060010000000240306000d01cb000d01cb000a01d6000b01d6000d01cb000d01 +cb0007000000fc020000003382000000040000002d01050004000000f001040010000000240306000d01cb000d01cb000a01d4000b01d5000d01cb000d01cb00 +07000000fc02000000458f000000040000002d01040004000000f001050010000000240306000d01cb000d01cb000a01d3000b01d4000d01cb000d01cb000700 +0000fc02000000599e000000040000002d01050004000000f001040010000000240306000d01cb000d01cb000b01d2000b01d3000d01cb000d01cb0007000000 +fc020000006bab000000040000002d01040004000000f001050010000000240306000d01cb000d01cb000b01d1000c01d1000d01cb000d01cb0007000000fc02 +0000057fba000000040000002d01050004000000f001040010000000240306000d01cb000d01cb000b01d0000c01d0000d01cb000d01cb0007000000fc020000 +1791c7000000040000002d01040004000000f001050010000000240306000d01cb000d01cb000b01cf000c01cf000d01cb000d01cb0007000000fc02000029a6 +d6000000040000002d01050004000000f001040010000000240306000d01cb000d01cb000c01ce000d01ce000d01cb000d01cb0007000000fc02000038b8e300 +0000040000002d01040004000000f001050010000000240306000d01cb000d01cb000c01cd000d01cd000d01cb000d01cb0007000000fc0200004cccf2000000 +040000002d01050004000000f001040010000000240306000d01cb000d01cb000c01cc000d01cc000d01cb000d01cb0007000000fc02000033b3d90000000400 +00002d01040004000000f00105003800000024031a00f200d200fa00c700f900c700f900c800f900c800f900c900f800c900f800ca00f700cb00f600cc00f500 +cd00f500cf00f400cf00f400d000f300d100f300d100f300d100f300d200f200d200f200d200f200d200f200d200f200d200f200d200f200d200f200d2000800 +0000fa0206000100000000002600040000002d0105000800000025030200f100d300fd00c30007000000fc020000000d66000000040000002d01060004000000 +f0010400040000002d01010004000000f00105001000000024030600f000d300f100d300fd00c300fc00c200f000d200f000d30007000000fc020000001f7300 +0000040000002d01040004000000f00106001000000024030600fc00c300fc00c200f100d100f200d200fd00c300fc00c30007000000fc020000003382000000 +040000002d01050004000000f00104001000000024030600fc00c300fc00c200f200cf00f300d000fd00c300fc00c30007000000fc02000000458f0000000400 +00002d01040004000000f00105001000000024030600fc00c300fc00c200f300ce00f400cf00fd00c300fc00c30007000000fc02000000599e00000004000000 +2d01050004000000f00104001000000024030600fc00c300fc00c200f400cd00f500cd00fd00c300fc00c30007000000fc020000006bab000000040000002d01 +040004000000f00105001000000024030600fc00c300fc00c200f500cb00f600cc00fd00c300fc00c30007000000fc020000057fba000000040000002d010500 +04000000f00104001000000024030600fc00c300fc00c200f700ca00f700ca00fd00c300fc00c30007000000fc0200001791c7000000040000002d0104000400 +0000f00105001000000024030600fc00c300fc00c200f800c800f800c900fd00c300fc00c30007000000fc02000029a6d6000000040000002d01050004000000 +f00104001000000024030600fc00c300fc00c200f900c700fa00c700fd00c300fc00c30007000000fc02000038b8e3000000040000002d01040004000000f001 +05001000000024030600fc00c300fc00c200fa00c500fb00c600fd00c300fc00c30007000000fc0200004cccf2000000040000002d01050004000000f0010400 +1000000024030600fc00c300fc00c200fb00c400fc00c400fd00c300fc00c30007000000fc0200000066bf000000040000002d01040004000000f00105008a00 +0000240343001201cb000c01c6000c01c6000c01c5000d01c4000d01c3000d01c1000d01c0000c01bf000b01bd000a01bd000901bc000801bc000701bc000501 +bb000401bb000301bb000101bb00ff00bb00fe00bc00fc00bc00fa00bd00f700bd00f500be00f200bf00f000c000f000c100f000c100f100c200f100c300f300 +c300f400c400f600c400f800c400f900c400f900c400fa00c400fb00c400fd00c300fe00c300ff00c3000001c3000001c3000001c4000001c5000101c6000101 +c7000201c8000301c9000401c9000501ca000601ca000701ca000701ca000801ca000901ca000901ca000a01ca000a01ca000b01ca000c01cb000d01cc000e01 +cc001001cd001101cd001201cc001201cb00a600000024035100f100c100f100c100f100c100f200c000f200c000f300c000f400bf00f500bf00f700be00f800 +be00f900bd00fb00bd00fc00bc00fe00bc00ff00bc000101bc000201bc000501bc000701bc000901bd000a01be000b01be000c01bf000c01c0000c01c1000c01 +c1000c01c2000c01c2000b01c1000b01c1000a01c1000a01c1000a01c1000901c1000901c1000901c1000801c1000801c1000801c1000701c1000701c1000601 +c1000601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101c0000001c0000001c000ff00c000ff00c100ff00 +c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700c100f700c100f700c100f600c100f600c100f600 +c100f500c200f400c200f300c200f200c200f200c200f100c100f100c10007000000fc020000006bbf000000040000002d01050004000000f0010400a6000000 +240351000201bc000401bd000601bd000801bd000a01be000b01bf000c01bf000c01c0000c01c1000c01c1000c01c2000c01c2000b01c1000b01c1000a01c100 +0a01c1000a01c1000901c1000901c1000901c1000801c1000801c1000801c1000701c1000701c1000601c1000601c1000601c1000501c1000501c1000401c100 +0401c1000301c1000301c1000201c0000101c0000101c0000001c0000001c000ff00c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100 +fa00c100f900c100f900c100f800c100f800c100f700c100f700c100f700c100f600c100f600c100f600c100f500c100f400c200f300c200f300c200f200c200 +f100c100f100c100f100c100f200c100f200c000f300c000f300c000f400bf00f500bf00f700be00f800be00f900be00fa00bd00fc00bd00fd00bd00ff00bc00 +0001bc000201bc0007000000fc0200000073c2000000040000002d01040004000000f0010500a6000000240351000101bd000401bd000601bd000801be000901 +be000a01bf000b01c0000c01c0000c01c1000c01c1000c01c1000c01c1000b01c1000b01c1000a01c1000a01c1000a01c1000901c1000901c1000901c1000801 +c1000801c1000801c1000701c1000701c1000601c1000601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101 +c0000001c0000001c000ff00c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700 +c100f700c100f700c100f600c100f600c100f600c100f500c100f400c200f300c200f300c200f200c200f200c200f100c100f100c100f200c100f200c100f300 +c000f300c000f400c000f500bf00f600bf00f800be00f900be00fa00be00fb00bd00fd00bd00fe00bd000001bd000101bd0007000000fc0200000078c2000000 +040000002d01050004000000f0010400a6000000240351000101bd000301be000601be000701be000901bf000a01bf000b01c0000c01c0000c01c1000c01c100 +0c01c1000c01c1000b01c1000b01c1000a01c1000a01c1000a01c1000901c1000901c1000901c1000801c1000801c1000801c1000701c1000701c1000601c100 +0601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101c0000001c0000001c000ff00c000ff00c100ff00c100 +fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700c100f700c100f700c100f600c100f600c100f600c100 +f500c100f400c200f400c200f300c200f200c200f200c200f200c100f200c100f200c100f200c100f300c000f400c000f400c000f500c000f600bf00f700bf00 +f800be00fa00be00fb00be00fc00be00fe00bd00ff00bd000101bd0007000000fc020000037dc2000000040000002d01040004000000f0010500b60000002403 +59000001be000101be000301be000401be000501be000601be000701bf000801bf000901bf000901bf000a01bf000a01c0000b01c0000b01c0000c01c1000c01 +c1000c01c1000c01c1000c01c1000c01c1000b01c1000b01c1000a01c1000a01c1000a01c1000901c1000901c1000901c1000801c1000801c1000801c1000701 +c1000701c1000601c1000601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101c0000001c0000001c000ff00 +c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700c100f700c100f700c100f600 +c100f600c100f600c100f500c100f400c200f400c200f300c200f200c200f200c200f200c100f200c100f200c100f300c100f300c100f400c000f400c000f500 +c000f600bf00f700bf00f800bf00f900bf00fb00be00fc00be00fd00be00ff00be000001be0007000000fc0200000784c4000000040000002d01050004000000 +f0010400b6000000240359000001be000101bf000201bf000401bf000501bf000601bf000701bf000801bf000801bf000901bf000a01c0000a01c0000b01c000 +0b01c0000b01c1000c01c1000c01c1000c01c1000c01c1000c01c1000b01c1000b01c1000a01c1000a01c1000a01c1000901c1000901c1000901c1000801c100 +0801c1000801c1000701c1000701c1000601c1000601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101c000 +0001c0000001c000ff00c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700c100 +f700c100f700c100f600c100f600c100f600c100f500c100f400c200f400c200f300c200f300c200f200c200f200c100f200c100f200c100f300c100f300c100 +f400c100f400c000f500c000f600c000f700c000f800bf00f900bf00fa00bf00fc00bf00fd00bf00fe00be000001be0007000000fc0200000a87c40000000400 +00002d01040004000000f0010500b600000024035900ff00bf000001bf000201bf000301bf000401bf000501bf000601bf000701bf000801c0000901c0000901 +c0000a01c0000b01c0000b01c0000b01c1000c01c1000c01c1000c01c1000c01c1000b01c1000b01c1000b01c1000a01c1000a01c1000a01c1000901c1000901 +c1000901c1000801c1000801c1000801c1000701c1000701c1000601c1000601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201 +c0000101c0000101c0000001c0000001c000ff00c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800 +c100f800c100f700c100f700c100f700c100f600c100f600c100f600c100f500c100f500c200f400c200f300c200f300c200f300c200f200c200f200c200f300 +c100f300c100f300c100f400c100f400c100f500c000f600c000f700c000f800c000f900c000fa00bf00fb00bf00fc00bf00fe00bf00ff00bf0007000000fc02 +0000128fc7000000040000002d01050004000000f0010400b600000024035900ff00c0000001c0000101c0000201c0000401c0000501c0000601c0000701c000 +0801c0000801c0000901c0000a01c0000a01c0000b01c1000b01c1000b01c1000c01c1000c01c1000c01c1000b01c1000b01c1000b01c1000a01c1000a01c100 +0a01c1000901c1000901c1000901c1000801c1000801c1000801c1000701c1000701c1000601c1000601c1000601c1000501c1000501c1000401c1000401c100 +0301c1000301c1000201c0000101c0000101c0000001c0000001c000ff00c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100 +f900c100f900c100f800c100f800c100f700c100f700c100f700c100f600c100f600c100f600c100f500c100f500c200f400c200f400c200f300c200f300c200 +f300c200f300c200f300c200f300c100f300c100f400c100f400c100f500c100f600c100f700c000f700c000f800c000f900c000fb00c000fc00c000fd00c000 +ff00c00007000000fc0200001494c7000000040000002d01040004000000f0010500a600000024035100f300c200f300c200f400c100f400c100f600c100f700 +c100f900c000fb00c000fe00c000ff00c0000101c0000201c0000301c0000401c0000501c0000601c0000701c0000801c0000901c0000a01c0000a01c1000b01 +c1000b01c1000b01c1000b01c1000c01c1000c01c1000b01c1000b01c1000b01c1000a01c1000a01c1000a01c1000901c1000901c1000901c1000801c1000801 +c1000801c1000701c1000701c1000601c1000601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101c0000001 +c0000001c000ff00c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700c100f700 +c100f700c100f600c100f600c100f600c100f500c100f500c100f400c200f400c200f300c200f300c200f300c20007000000fc0200000066bf00000004000000 +2d01050004000000f0010400ce000000240365000c01c1000b01c1000b01c1000a01c1000a01c1000901c1000901c1000901c1000801c1000801c1000801c100 +0701c1000701c1000601c1000601c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101c0000001c0000001c000 +ff00c000ff00c100ff00c100fe00c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700c100f700c100f700c100 +f600c100f600c100f600c100f500c100f500c100f400c200f400c200f300c200f300c200f300c200f300c200f200c200f200c200f200c300f300c300f300c300 +f400c300f400c400f500c400f600c400f700c400f800c400f900c400fa00c400fb00c400fd00c300fe00c300ff00c3000001c3000001c3000001c3000001c300 +0001c3000001c3000101c3000101c3000201c3000201c3000301c4000401c4000401c4000501c4000501c3000601c3000701c3000701c3000801c3000901c300 +0a01c3000a01c3000b01c3000c01c3000c01c3000c01c3000c01c3000c01c2000c01c2000c01c10007000000fc020000005cb5000000040000002d0104000400 +0000f0010500ce000000240365000101c3000101c3000001c3000001c2000001c2000001c200ff00c200fe00c300fd00c300fb00c300fa00c300f900c300f800 +c400f700c400f600c400f500c300f500c300f400c300f300c300f300c300f300c300f200c200f200c200f300c200f300c200f300c200f300c200f400c200f400 +c200f500c100f500c100f600c100f600c100f600c100f700c100f700c100f700c100f800c100f800c100f900c100f900c100fa00c100fb00c100fc00c100fd00 +c100fd00c100fe00c100ff00c100ff00c100ff00c0000001c0000001c0000101c0000101c0000201c0000301c1000301c1000401c1000401c1000501c1000501 +c1000601c1000601c1000601c1000701c1000701c1000801c1000801c1000801c1000901c1000901c1000901c1000a01c1000a01c1000b01c1000b01c1000c01 +c1000c01c2000c01c2000c01c2000c01c3000c01c3000b01c3000b01c3000a01c3000901c3000901c3000801c3000701c3000701c3000601c3000501c3000501 +c3000401c3000401c3000301c3000201c3000201c3000101c3000101c3000101c30007000000fc0200000052ab000000040000002d01050004000000f0010400 +ce000000240365000101c3000101c3000101c2000001c2000001c2000001c200ff00c200fe00c200fd00c300fb00c300fa00c300f900c300f800c300f700c300 +f600c300f500c300f500c300f400c300f400c300f300c300f300c200f300c200f300c200f300c200f300c200f300c200f400c200f400c200f400c200f500c100 +f500c100f600c100f600c100f600c100f700c100f700c100f700c100f800c100f800c100f900c100f900c100fa00c100fb00c100fc00c100fd00c100fd00c100 +fe00c100ff00c100ff00c100ff00c0000001c0000001c0000101c0000101c0000201c0000301c1000301c1000401c1000401c1000501c1000501c1000601c100 +0601c1000601c1000701c1000701c1000801c1000801c1000801c1000901c1000901c1000901c1000a01c1000a01c1000b01c1000b01c1000c01c1000c01c200 +0c01c2000c01c2000b01c2000b01c3000b01c3000a01c3000901c2000901c2000801c2000801c2000701c2000601c2000601c2000501c3000501c3000401c300 +0401c3000301c3000201c3000201c3000101c3000101c3000101c30007000000fc0200000048a1000000040000002d01040004000000f0010500ce0000002403 +65000101c2000101c2000101c2000001c2000001c2000001c200ff00c200fe00c200fd00c200fb00c200fa00c200f900c300f800c300f700c300f600c300f600 +c300f500c300f500c300f400c200f400c200f300c200f300c200f300c200f300c200f400c200f400c200f400c200f400c200f400c200f500c100f500c100f600 +c100f600c100f600c100f700c100f700c100f700c100f800c100f800c100f900c100f900c100fa00c100fb00c100fc00c100fd00c100fd00c100fe00c100ff00 +c100ff00c100ff00c0000001c0000001c0000101c0000101c0000201c0000301c1000301c1000401c1000401c1000501c1000501c1000601c1000601c1000601 +c1000701c1000701c1000801c1000801c1000801c1000901c1000901c1000901c1000a01c1000a01c1000b01c1000b01c1000c01c1000c01c2000c01c2000b01 +c2000b01c2000b01c2000a01c2000a01c2000901c2000901c2000801c2000701c2000701c2000601c2000601c2000501c2000501c2000401c2000401c2000301 +c2000301c2000201c2000201c2000101c2000101c20007000000fc020000003d96000000040000002d01050004000000f0010400d6000000240369000101c200 +0101c2000101c2000001c2000001c2000001c200ff00c200fe00c200fd00c200fc00c200fa00c200f900c200f800c200f700c200f600c200f600c200f500c200 +f500c200f500c200f400c200f400c200f300c200f300c200f400c200f400c200f400c200f400c200f400c200f500c200f500c100f500c100f600c100f600c100 +f600c100f700c100f700c100f700c100f800c100f800c100f900c100f900c100fa00c100fb00c100fc00c100fd00c100fd00c100fe00c100ff00c100ff00c100 +ff00c0000001c0000001c0000101c0000101c0000201c0000301c1000301c1000401c1000401c1000501c1000501c1000601c1000601c1000601c1000701c100 +0701c1000801c1000801c1000801c1000901c1000901c1000901c1000a01c1000a01c1000b01c1000b01c1000c01c1000c01c2000c01c2000b01c2000b01c200 +0b01c2000a01c2000a01c2000a01c2000a01c2000901c2000901c2000901c2000801c2000801c2000701c2000701c2000601c2000601c2000501c2000501c200 +0501c2000401c2000301c2000301c2000201c2000201c2000201c2000101c20007000000fc02000000338c000000040000002d01040004000000f0010500ce00 +0000240365000c01c1000b01c1000b01c1000a01c1000a01c1000901c1000901c1000901c1000801c1000801c1000801c1000701c1000701c1000601c1000601 +c1000601c1000501c1000501c1000401c1000401c1000301c1000301c1000201c0000101c0000101c0000001c0000001c000ff00c000ff00c100ff00c100fe00 +c100fd00c100fd00c100fc00c100fb00c100fa00c100f900c100f900c100f800c100f800c100f700c100f700c100f700c100f600c100f600c100f500c100f500 +c200f400c200f400c200f400c200f400c200f400c200f400c200f500c200f500c200f500c200f600c200f600c200f700c200f700c200f800c200f900c200fa00 +c200fc00c100fd00c100fe00c100ff00c1000001c1000001c1000001c1000101c1000201c1000201c1000201c1000201c1000201c1000301c1000301c1000401 +c1000501c1000501c1000501c1000601c1000601c1000701c1000701c1000701c1000801c1000801c1000901c1000a01c1000a01c1000a01c2000b01c2000b01 +c2000b01c2000c01c2000c01c2000c01c2000c01c2000c01c10007000000fc02000073e8ff000000040000002d01050004000000f00104008e00000024034500 +1201cb000c01c6000c01c6000c01c5000d01c4000d01c3000d01c1000d01c0000c01bf000b01bd000a01bd000901bc000801bc000701bc000501bb000401bb00 +0301bb000101bb00ff00bb00fe00bc00fc00bc00fa00bd00f700bd00f500be00f200bf00f000c000f100c100f100c100f100c100f200c000f300c000f300c000 +f400bf00f600bf00f700be00f800be00f900bd00fb00bd00fc00bd00fe00bc00ff00bc000101bc000201bc000201bc000301bc000301bc000401bc000501bc00 +0601bc000701bd000801bd000801bd000801bd000901bd000901be000a01be000a01be000b01bf000c01c0000c01c0000c01c1000c01c2000c01c3000c01c400 +0c01c4000b01c5000b01c6001101cb001201cb0007000000fc020000001a73000000040000002d01040004000000f0010500ce000000240365001201cb001201 +cc001101cd001001cd000e01cc000d01cc000c01cb000b01ca000a01ca000a01ca000901ca000901ca000801ca000701ca000701ca000601ca000501ca000401 +c9000301c9000201c8000101c7000101c6000001c5000001c4000001c3000001c300ff00c300fe00c300fd00c300fb00c400fa00c400f900c400f900c400f800 +c400f600c400f400c400f300c300f100c300f100c200f000c100f000c100f000c000f100c100f100c100f100c100f200c200f300c200f400c300f500c300f700 +c400f900c300fb00c300fc00c300fd00c300fe00c200ff00c2000001c2000001c2000001c2000001c2000101c2000101c3000101c4000101c4000101c5000201 +c6000201c7000301c7000301c8000301c8000401c8000401c9000401c9000501c9000601c9000601ca000701ca000801ca000801ca000901ca000901c9000901 +c9000a01c9000a01c9000a01c9000b01ca000b01ca000c01ca000d01cb000d01cb000e01cb000e01cc000f01cc000f01cc001001cc001001cc001001cc001101 +cc001101cc001101cb001201cb00040000002d01020004000000f0010400040000002d0103009800000024034a001201cb000c01c6000c01c6000c01c6000c01 +c5000d01c4000d01c3000d01c1000d01c0000c01bf000b01bd000b01bd000a01bd000901bc000801bc000701bc000501bb000401bb000301bb000101bb00ff00 +bb00fe00bc00fc00bc00fa00bd00f700bd00f500be00f200bf00f000c000f000c000f000c100f000c100f100c200f100c300f300c300f400c400f600c400f800 +c400f800c400f900c400f900c400fa00c400fb00c400fd00c300fe00c300ff00c3000001c3000001c3000001c3000001c4000001c5000101c6000101c7000201 +c8000301c9000401c9000401c9000501ca000601ca000701ca000701ca000801ca000901ca000901ca000a01ca000a01ca000a01ca000b01ca000c01cb000d01 +cc000e01cc001001cd001101cd001201cc001201cb0008000000fa02060001000000c7ffff00040000002d0104006000000025032e00f100c100f100c100f100 +c100f100c100f200c000f300c000f300c000f400bf00f600bf00f700be00f800be00f900bd00fb00bd00fc00bd00fe00bc00ff00bc000101bc000201bc000201 +bc000201bc000301bc000301bc000401bc000501bc000601bc000701bd000801bd000801bd000801bd000801bd000901bd000901be000a01be000a01be000b01 +bf000c01c0000c01c0000c01c0000c01c1000c01c2000c01c3000c01c4000c01c4000b01c5000b01c6001101cb0008000000fa0206000100000033b3d9000400 +00002d01050004000000f00104008600000025034100f100c100f100c100f100c100f100c100f200c200f300c200f400c300f500c300f700c400f900c300f900 +c300fb00c300fc00c300fd00c300fe00c200ff00c2000001c2000001c2000001c2000001c2000001c2000101c2000101c3000101c4000101c4000101c5000201 +c6000201c7000201c7000301c7000301c8000301c8000401c8000401c9000401c9000501c9000601c9000601c9000601ca000701ca000801ca000801ca000901 +ca000901c9000901c9000a01c9000a01c9000a01c9000a01c9000b01ca000b01ca000c01ca000d01cb000d01cb000e01cb000e01cb000e01cc000f01cc000f01 +cc001001cc001001cc001001cc001101cc001101cc001101cb0008000000fa0206000100000000002600040000002d01040004000000f0010500840000002503 +4000dc00c800dc00c800dc00c900dc00c900dc00c900dd00ca00dd00ca00de00cb00df00cb00e100cb00e100cb00e100cc00e100cc00e200cd00e200ce00e300 +ce00e500cf00e600cf00e900cf00e900cf00e900cf00e900d000ea00d100ea00d100ec00d200ed00d200ef00d300f100d300f100d300f100d300f100d300f200 +d400f300d400f400d500f600d500f700d500f900d400f900d400fa00d500fa00d500fb00d500fc00d600fd00d600fe00d6000001d6000201d5000201d5000201 +d6000201d6000301d6000401d7000501d7000701d7000801d7000a01d6000a01d6000b01d7000b01d7000c01d7000d01d7000f01d7001001d7001101d7001201 +d600040000002d01030004000000f0010400cc00000025036400f000c000db00c900c700cd00c700cd00c700cd00c700ce00c700ce00c800cf00c800d000c800 +d000c900d100c900d100c900d100ca00d100ca00d200ca00d200ca00d300cb00d400cc00d500cd00d600ce00d700ce00d700ce00d700ce00d700cf00d800cf00 +d900d000da00d200db00d300dc00d500dd00d500dd00d500dd00d500dd00d500de00d600df00d700e000d900e100db00e100dd00e200dd00e200dd00e200de00 +e200de00e300de00e300de00e300df00e400df00e400e000e400e100e500e100e500e200e500e300e600e500e600e600e600e700e600e900e600e900e600e900 +e700ea00e700eb00e700ec00e800ed00e900ef00e900f100e900f400e900f400e900f400e900f400e900f400e900f400ea00f500ea00f500ea00f600ea00f600 +ea00f700ea00f800ea00f900eb00fa00eb00fb00eb00fd00eb00fe00eb000001eb000001eb000101eb000101eb000301ec000401ec000601ec000801ec000901 +ec000b01eb000b01eb000b01eb000c01eb000d01eb000e01eb000f01eb001001eb001101eb001201ea0007000000fc0200000066bf000000040000002d010400 +040000002d010100880200002403420103011701040118010501190106011a0107011b0108011c0109011c010b011d010c011e010d011e010e011f010f011f01 +10011f011101200111012001120120011201200113012001140121011501210117012201190123011a0124011c0125011d0126011d0127011e0128011f012a01 +1f012b011f012c011f012e011e012f011d0131011c0131011c0132011b0133011b0133011a013401190134011801350118013501170135011601360115013601 +1401370114013701130137011201380111013801100139010f013a010e013a010e013b010d013c010c013d010c013d010b013e010b013f010a0140010a014101 +0a01420109014401090145010a0146010a0147010b0149010c014b010e014d010f014e011101500113015101140151011401510114014d0112014c0111014b01 +100149010f0148010e0147010e0146010d0145010e0144010e0143010e0142010f0141010f01400110013f0111013e0111013e0112013d0113013d0113013d01 +14013c0114013c0115013c0116013b0117013b0117013b0118013a0119013a011a0139011b0139011c0138011d0137011e0137011f0136012001350121013401 +220134012201330123013201230131012401300124012e0124012d0124012c0124012b0124012a01240128012401270123012601220124012201230121012201 +200121011f0120011e011f011d011f011c011e011a011d0119011d0118011c0117011c0116011b0115011b0114011a0113011a0112011a0111011a0111011901 +100119010f0119010e0118010d0118010c0117010b0117010a01160109011501080114010801140107011301070112010601100106010f0106010d0107010b01 +090109010a0108010c0107010e0106011001060111010501120105011301050114010501150105011601050118010401190104011a0104011c0104011d010401 +1e0103011f010301200103012101030122010301230103012301030124010201250102012601020127010201280101012a0101012b0100012c01ff002e01ff00 +2f01fe003001fd003101fb003201fa003201f8003301f7003301f5003301f3003301f2003301f0003301ef003201ee003201ed003101ec003101eb003001ea00 +2f01e9002e01e9002d01e8002d01e8002c01e7002b01e7002a01e6002901e6002701e6002601e5002501e5002401e5002301e5002201e5002101e5002101e500 +2001e5002001e5001f01e6001e01e6001e01e6001d01e6001d01e6001d01e6001c01e6001c01e6001b01e7001b01e7001b01e7001a01e7001a01e8001a01e800 +1a01e9001a01e9001a01ea001a01ea001a01eb001a01eb001b01eb001b01eb001c01eb001c01ec001d01ec001e01ec001e01ec001f01ec002001ec002001ec00 +2101ec002201ec002201ec002301ec002401ec002401ec002501ec002501ec002601ec002601eb002701eb002701eb002701eb002801eb002801eb002a01eb00 +2b01ec002c01ed002d01ee002d01f0002e01f2002e01f4002d01f6002c01f8002b01f9002a01fa002801fb002701fb002601fc002401fc002401fc002301fd00 +2201fd002101fd002001fd001f01fd001e01fd001d01fe001b01fe001a01fe001901fe001801fe001601fe001501ff001401ff001301ff001201ff001201ff00 +1101ff001001ff000f0100010d0100010c0100010b0101010a010101090101010801020107010301060104010401050103010601020107010101090100010a01 +00010c0100010e010001100100011201010115010301170107000000fc020000004aa6000000040000002d01050004000000f00104009800000024034a002901 +e9002801e9002701e9002701e9002601e9002601e9002601ea002501ea002501ea002401eb002201eb002101eb001f01eb001e01eb001c01eb001b01eb001b01 +eb001b01eb001c01eb001c01ec001d01ec001d01ec001e01ec001e01ec001f01ec002001ec002001ec002101ec002201ec002201ec002301ec002401ec002401 +ec002501ec002501ec002601ec002601eb002701eb002701eb002701eb002801eb002801eb002a01eb002b01ec002c01ed002d01ee002d01f0002e01f2002e01 +f4002d01f6002c01f7002b01f8002a01f9002901fa002801fb002701fb002601fc002a01fa002c01f9002d01f8002e01f7002f01f6002f01f4002f01f3002f01 +f1002f01f0002f01ee002e01ed002e01ec002d01eb002c01ea002a01ea002a01e9002901e90007000000fc020000002b8c000000040000002d01040004000000 +f00105009800000024034a002801e9002801e9002701e9002701e9002701e9002601ea002601ea002601ea002501eb002401eb002301eb002101eb002001eb00 +1e01eb001d01eb001c01eb001c01eb001c01eb001c01ec001c01ec001d01ec001d01ec001e01ec001e01ec001f01ec002001ec002001ec002101ec002201ec00 +2201ec002301ec002401ec002401ec002501ec002501ec002601ec002601eb002701eb002701eb002701eb002801eb002801eb002a01eb002b01ec002c01ed00 +2d01ee002d01f0002e01f2002e01f4002d01f6002c01f7002c01f8002b01f9002a01fa002901fa002801fb002801fb002b01f9002c01f8002d01f7002e01f600 +2f01f5002f01f4002f01f3002f01f1002f01f0002f01ef002e01ed002d01ec002c01eb002b01eb002a01ea002901ea002801e90007000000fc02000000107300 +0000040000002d01050004000000f00104009800000024034a002801ea002801ea002701e9002701e9002701ea002601ea002601ea002601ea002601eb002401 +eb002301ec002201ec002001ec001f01ec001e01ec001d01ec001d01ec001d01ec001d01ec001d01ec001d01ec001e01ec001e01ec001e01ec001f01ec002001 +ec002001ec002101ec002201ec002201ec002301ec002401ec002401ec002501ec002501ec002601ec002601eb002701eb002701eb002701eb002801eb002801 +eb002a01eb002b01ec002c01ed002d01ee002d01f0002e01f2002e01f4002d01f6002d01f7002c01f8002c01f8002b01f9002a01fa002a01fa002901fa002c01 +f8002d01f7002d01f7002e01f6002e01f5002e01f4002f01f3002f01f1002e01f0002e01ef002e01ee002d01ed002c01ec002b01eb002a01eb002901ea002801 +ea0007000000fc020000000059000000040000002d01040004000000f001050088000000240342002b01fa002b01f9002b01f9002c01f9002c01f8002d01f700 +2d01f7002d01f6002e01f4002e01f2002d01f0002d01ee002c01ed002b01ec002a01eb002801eb002801eb002701eb002701eb002701eb002601eb002601ec00 +2501ec002501ec002401ec002401ec002301ec002201ec002201ec002101ec002001ec002001ec001f01ec001e01ec001d01ec001d01ec001d01ec001e01ec00 +1e01ec001f01ec002101ec002201ec002301ec002501ec002601eb002701ea002701ea002701ea002801ea002901eb002a01eb002b01eb002c01ec002c01ed00 +2d01ee002e01ef002e01f0002e01f1002e01f3002e01f3002e01f4002e01f5002e01f6002d01f6002d01f7002b01fa0007000000fc020000004dab0000000400 +00002d01050004000000f0010400ce000000240365002901ff002701ff00260100012401000122010101210101011f0101011e0101011c0102011b0102011901 +02011801020117010201150103011401030113010301130103011201030111010301100103010f0104010f0104010e0104010d0104010c0105010b0105010a01 +05010901060109010601080106010701070107010701060108010601090105010b0105010c0106010e0106010f01060110010601100106011001060110010601 +0f0106010f0106010e0107010c0107010a01090109010a0108010c0107010e010601100106011101050112010501130105011401050115010501160105011801 +0401190104011a0104011c0104011d0104011e0103011f0103012001030121010301220103012301030123010301240102012501020126010201270102012801 +0101290101012b0100012c0100012d01ff002e01fe002f01fd003001fc003101fb003201f9003301f8003301f7003301f7003301f6003301f6003301f6003301 +f5003301f5003301f5003301f5003301f6003201f7003101f9003001fa002e01fc002c01fd002901ff0007000000fc020000003396000000040000002d010400 +04000000f0010500ce000000240365002901ff0028010001260100012401010123010101210101011f0102011e0102011c0102011b0102011901020118010301 +1701030116010301150103011401030113010301120103011101040111010401100104010f0104010e0104010d0105010d0105010c0105010b0105010a010601 +0a010601090106010801070108010701070108010701090106010a0106010c0106010d0106010e0106010f0106010f0106010f0106010f0106010f0106010e01 +06010e0107010c0108010a01090109010b0108010c0107010e010601100106011101050112010501130105011401050115010501160105011801040119010401 +1a0104011c0104011d0104011e0103011f0103012001030121010301220103012301030123010301240102012501020126010201270102012801010129010101 +2a0100012b0100012c01ff002e01fe002f01fe003001fd003001fb003101fa003201f9003201f8003201f8003201f8003201f7003201f7003201f7003201f600 +3201f6003201f6003201f7003101f8003101fa002f01fb002e01fd002c01fe002901ff0007000000fc020000001982000000040000002d01050004000000f001 +0400b600000024035900290100012801000126010101250101012301010121010201200102011e0102011d0103011b0103011a01030118010301170103011601 +030115010301140104011301040112010401100104010f0105010d0105010c0106010b0106010a010701080108010801090107010a0106010b0106010c010601 +0d0106010e0106010e0106010e0106010e0106010e0106010d0106010d0107010b0108010a01090109010b0108010c0107010e01060110010601110105011201 +05011301050114010501150105011601050118010401190104011a0104011c0104011d0104011e0103011f010301200103012101030122010301230103012301 +03012401020125010201260102012701020128010101290101012a0101012b0100012c01ff002d01ff002e01fe002f01fd003001fc003101fb003101fa003201 +f9003201f9003201f8003201f8003201f8003201f8003101f9003001fb002f01fc002e01fd002c01fe002901000107000000fc02000000006e00000004000000 +2d01040004000000f0010500b6000000240359002a0100012801000126010101250101012301020121010201200103011e0103011d0103011b0103011a010301 +19010301170104011601040115010401140104011301040112010401110105010f0105010e0105010d0106010c0106010b010701090108010801080108010901 +07010a0106010b0106010c0106010d0106010d0106010e0106010d0106010d0106010d0106010c0107010b0108010901090108010b0107010d0107010e010601 +1001060111010501120105011301050114010501150105011601050118010401190104011a0104011c0104011d0104011e0103011f0103012001030121010301 +220103012301030123010301240102012501020126010201270102012701020128010101290101012b0100012c0100012d01ff002d01fe002e01fe002f01fd00 +3001fc003101fb003101fa003101fa003101fa003101f9003101f9003101fa003101fb003001fc002f01fd002e01fe002c01ff002a01000107000000fc020000 +000059000000040000002d01050004000000f0010400b60000002403590006010d0106010c0106010c0106010c0106010c0107010a01080109010a0108010b01 +07010d0107010e0106011001060111010501120105011301050114010501150105011601050118010401190104011a0104011c0104011d0104011e0103011f01 +03012001030121010301220103012301030123010301240102012501020125010201260102012701020128010101290101012a0101012b0100012c0100012d01 +ff002e01fe002f01fd003001fd003001fc003101fb003101fb003101fb003101fb003101fb003101fb003001fc003001fc002f01fd002e01fe002c01ff002a01 +00012801010127010101250102012301020122010301200103011e0103011d0103011b0104011a01040119010401170104011601040115010401140104011301 +04011201050111010501100105010f0106010e0106010d0106010c0107010a010701090108010801090107010a0107010a0106010b0106010c0106010c010601 +0d0107000000fc0200000045a6000000040000002d01040004000000f001050096000000240349001e012f011e012f011e012f011e012e011f012e011f012d01 +20012b0120012a01200128011f0127011f0126011e0125011e0124011d0124011c0123011b0122011a01220119012101180120011701200115011f0114011f01 +13011f0112011e0111011e0110011e010f011d010e011d010d011c010c011c010b011b010a011b0109011b0108011a0107011a01060119010601190105011901 +0501190105011901040118010501190106011a0107011b0108011b0109011c010a011d010b011d010c011e010d011e010e011f010f011f0110011f0111012001 +11012001120120011201200113012001140121011501210117012201190123011a0124011c0125011d0126011d0127011e0128011f0129011f012a011f012c01 +1f012d011e012e011e012f0107000000fc02000000268c000000040000002d01050004000000f001040096000000240349001e012e011e012e011f012d011f01 +2d011f012c011f012b011f012a011f0129011f0128011e0127011e0126011d0125011d0124011c0124011b0123011a0122011901220118012101170121011601 +20011501200114011f0113011f0112011f0111011e0110011e0110011e010f011d010e011d010d011d010c011c010b011c010a011b0109011b0108011b010801 +1a0107011a0107011a0106011a0106011a0106011a0106011a0107011b0108011b0109011c010a011c010b011d010c011d010d011e010e011e010f011f011001 +1f0110011f011101200111012001120120011201200113012001140121011501210117012201190123011a0124011c0125011d0126011d0127011e0128011f01 +29011f012a011f012b011f012c011f012d011e012e0107000000fc020000000873000000040000002d01040004000000f001050076000000240339001f012c01 +1f012c011f012c011f012b011f012b011f012a011f0129011f0128011e0127011e0126011d0126011d0125011c0124011b0124011a0123011a01230119012201 +18012201170121011601210115012001140120011301200112011f0111011f0110011e010e011e010c011d010b011c0109011c0108011b0108011b0107011b01 +08011c010a011c010c011d010d011e010f011f0111011f01110120011201200113012001140121011501210117012201190123011a0124011c0125011d012601 +1d0127011e0128011f0129011f012a011f012a011f012b011f012c011f012c0107000000fc020000000059000000040000002d01050004000000f00104007600 +00002403390020012b0120012b0120012a011f012a011f0129011f0129011e0128011d0127011d0126011c0125011a0124011901230117012201150121011401 +2101130120011201200112012001110120010f011f010e011e010c011e010b011d010a011c0109011c0109011c010a011c010a011d010b011d010d011e010e01 +1e0110011f01110120011201200113012001140120011501210116012101170122011701220118012201190123011a0123011a0124011b0124011c0125011c01 +25011d0126011e0126011e0127011e0128011f0128011f0129011f012a0120012a0120012b0120012b0107000000fc0200000045a6000000040000002d010400 +04000000f0010500860000002403410023013001230130012201310122013101210132011f0134011e0135011c0136011b0137011a0137011901370118013801 +17013801160139011501390115013a0114013a0113013b0112013b0112013c0111013c0110013d0110013d010f013e010f013e010e0140010d0142010d014401 +0d0145010e0147010e0148010f0148010f0148010e0147010d0145010e0143010e0142010f01400110013f0111013e0112013d0113013d0113013d0114013c01 +14013c0115013c0116013b0117013b0117013b0118013a0119013a011a0139011b0139011c0138011d0137011e0137011f013601200135012101350121013401 +220133012201320123013201230131012301300107000000fc02000000268c000000040000002d01050004000000f00104007600000024033900220131012201 +32012201320121013301200133011f0134011e0135011d0136011b01370119013801180139011601390114013a0113013b0112013c0111013d0110013e010e01 +40010e0141010d0143010d0145010e0146010e0147010e0148010e0148010e0146010d0145010e0143010e0142010f01400110013f0111013e0112013d011301 +3d0113013d0114013c0114013c0115013c0116013b0117013b0117013b0118013a0119013a011a0139011b0139011c0138011d0137011e0137011f0136012001 +35012001350121013401210134012101330122013301220132012201310107000000fc020000000873000000040000002d01040004000000f001050076000000 +2403390021013301210133012101330120013401200134011f0135011e0136011d0136011b013701190138011801390117013a0115013a0114013b0113013c01 +12013d0111013e010f013f010e0141010e0142010d0144010d0145010e0146010e0147010e0147010d0146010d0144010e0143010e0141010f01400110013f01 +11013e0112013d0113013d0113013d0114013c0114013c0115013c0116013b0117013b0117013a0118013a0119013a011a0139011b0139011c0138011d013701 +1e0137011f013601200136012001350120013501210135012101340121013401210133012101330107000000fc020000000059000000040000002d0105000400 +0000f00104006e000000240335000d0146010d0145010d0144010e0142010e0141010f01400110013f0111013e0112013d0113013d0113013d0114013c011401 +3c0115013c0116013b0116013b0117013a0118013a0119013a011a0139011b0138011c0138011d0137011e0137011f0136012001350120013501200135012001 +35012001350120013501200135011f0135011f0136011e0136011d0137011b0138011a0139011801390117013a0116013b0115013b0114013c0113013d011101 +3d0110013f010f0140010e0142010d0143010d0144010d0145010d0146010d01460107000000fc0200000066bf000000040000002d01040004000000f0010500 +9e02000024034d011a01e9001a01e9001a01e8001a01e8001a01e7001b01e7001b01e7001b01e7001c01e6001c01e6001d01e6001d01e6001d01e6001e01e600 +1e01e6001f01e6002001e5002001e5002101e5002101e5002201e5002301e5002401e5002501e5002601e5002701e6002901e6002a01e6002b01e7002c01e700 +2d01e8002d01e8002e01e9002f01e9002f01ea003001ea003101eb003101ec003201ed003201ee003301ef003301f0003301f1003301f3003301f4003301f400 +3301f5003301f5003301f6003301f6003201f7003201f8003101f9003001fa002f01fb002e01fc002d01fd002b01fd002901fe002701ff002401ff002401ff00 +2401ff002301ff002201ff002001ff001f0100011d0100011b0100011901000117010101160101011401010112010201110102010f0102010e0103010c010301 +0a0104010901050107010601060107010501080104010a0104010c0104010c0104010d0104010e0105010f010501110106011301080114010a0116010b011701 +0c0117010d0118010e0119010f0119011001190111011a0112011a0113011a0114011a0115011b0116011b0117011c0118011c0119011d011a011d011c011e01 +1d011f011e011f011f012001200121012101220122012301220124012301250123012701240128012401290124012a0124012b0124012c0124012d0124012e01 +24012e0123012f0122013001210132011f0133011d0134011a0136011a0136011901360119013601180137011701370116013801140139011301390112013a01 +11013b010f013c010e013d010e013e010d013f010d0140010c0141010c0141010c0142010c0142010c0143010c0144010c0145010c0146010d0148010e014901 +0e014a010e014a010d014a010c014a010c0149010b0149010b0148010b0148010a0147010a0147010a0146010a0146010a014501090145010901450109014401 +0a0143010a0142010a0141010a0140010b013f010b013e010b013e010c013d010d013c010d013b010e013b010f013a010f013901100139011101380113013801 +140137011601360117013501180135011a0134011b0133011c0132011c0132011d0131011d0131011e0130011f012f0120012e0120012d0121012c0121012a01 +210129012101280120012601200125011f0124011d0122011c0121011b0121011a0120011901200118011f0117011f0116011e0115011e0115011e0114011d01 +13011d0112011d0111011c0110011c0110011c010f011c010e011b010d011b010d011b010c011b010b011a010a011a0109011901090119010801180107011701 +060117010601160105011501040114010301130103011201020111010201100101010f0101010d0101010c0101010a0101010901020109010201090103010701 +04010501050104010701030108010201090102010a0101010b0101010c0100010d0100010f0100011001ff001101ff001201ff001201ff001301ff001401ff00 +1501ff001601fe001701fe001801fe001901fe001b01fe001c01fe001d01fe001e01fd001f01fd002001fd002101fd002201fd002301fd002301fc002401fc00 +2501fc002601fc002801fc002901fb002b01fa002d01f9002f01f7002f01f6003001f5003001f4003001f3003001f2003001f0003001ef002f01ee002f01ed00 +2e01ec002d01eb002c01ea002b01e9002a01e9002901e8002801e8002801e8002701e8002701e8002701e8002601e8002601e8002501e8002501e8002501e800 +2401e9002401e9002401e9002301ea002201ea002101ea002001ea001e01ea001d01ea001c01ea001b01ea001a01ea001a01ea001a01ea001a01e90007000000 +fc0200000f7dcc000000040000002d01050004000000f0010400ae0200002403550121012c0121012d0120012e011f012f011e0130011e0131011d0131011c01 +32011c0132011b0133011a013401190135011701350116013601140137011301380111013801100139010f0139010f013a010e013b010d013b010d013c010c01 +3d010c013e010b013e010b013f010a0140010a0141010a0142010a0143010a0144010a0145010a0145010a0145010a0145010a0145010a0146010a0146010b01 +47010b0147010b0148010c0148010c0149010d0149010d0149010d0148010d0148010d0147010c0146010c0145010c0143010c0143010c0142010c0141010c01 +41010c0141010c0140010d013f010d013e010e013d010f013c0110013b0112013a01130139011401390115013801160137011801370118013601190136011901 +36011a0136011c0134011f013301200132012201300123012f0123012e0124012e0124012d0124012c0124012b0124012a012401290124012801230127012301 +2501220124012201230121012201200121011f0120011e011f011d011e011c011e011a011d0119011d0118011c0117011c0116011b0115011b0114011a011301 +1a0112011a0111011a01100119010f0119010e0119010d0118010c0117010b0117010a01160108011401060113010501110105010f0104010e0104010d010401 +0c0104010c0104010a01050108010601070107010601080105010a0104010c0103010e0102010f01020110010101120101011401010115010101170100011901 +00011b0100011d01ff001e01ff002001ff002101ff002301ff002301ff002401ff002401ff002701fe002901fe002b01fd002c01fc002e01fc002f01fb003001 +fa003101f9003101f8003201f7003201f6003301f6003301f5003301f5003301f4003301f4003301f3003301f1003301f0003301ef003201ee003201ed003101 +ec003101eb003001ea002f01ea002f01e9002e01e9002d01e8002d01e8002c01e7002b01e7002a01e6002901e6002701e6002601e5002501e5002401e5002301 +e5002201e5002101e5002101e5002001e5002001e5001f01e6001e01e6001e01e6001d01e6001d01e6001d01e6001c01e6001c01e6001b01e7001b01e7001b01 +e7001a01e7001a01e8001a01e8001a01e9001a01e9001a01e9001a01e9001b01e9001b01e9001c01ea001d01ea001e01ea002001ea002101e9002201e9002301 +e9002401e9002401e9002401e8002401e8002501e8002501e8002501e7002601e7002701e7002701e8002701e8002801e8002801e8002901e8002a01e8002b01 +e9002c01ea002d01eb002e01ec002f01ed002f01ee003001ef003001f0003101f2003101f3003001f4003001f5003001f6002f01f7002e01f8002d01f9002c01 +fa002b01fa002a01fb002901fb002801fc002801fc002701fc002601fc002501fc002501fc002401fd002401fd002401fd002301fd002301fd002201fd002101 +fd002001fd001f01fd001e01fd001d01fe001c01fe001b01fe001901fe001801fe001701fe001601fe001501ff001401ff001301ff001201ff001201ff001101 +ff001001ff000f0100010d0100010c0100010b0101010a0101010901010108010201070103010501040104010501030107010201080102010901020109010201 +0a0101010b0101010d0102010e0102011001030111010301120104011301040114010501150106011601060116010701170108011801090118010a0119010a01 +19010b011a010c011a010d011a010d011b010e011b010f011b0110011b0110011c0111011c0112011c0113011d0114011d0115011d0116011e0117011e011701 +1e0118011f0119011f011a0120011b0120011c0121011e0122011f0123012001250121012601210128012101290121012a0121012c0107000000fc0200002c94 +d9000000040000002d01040004000000f0010500ae0200002403550121012b0121012d0120012e0120012f011f0130011e0131011d0131011d0132011d013201 +1c0132011b0133011b0133011a013401190134011901350118013501170135011701360116013601150136011401370113013701130138011201380111013801 +100139010f0139010f013a010e013b010d013b010d013c010c013d010c013d010b013e010b013f010b0140010a0141010a0141010a0142010a0143010a014401 +0a0144010a0144010a0145010a0145010a0145010b0146010b0146010b0146010b0147010c0147010c0147010c0147010d0147010d0147010d0147010c014601 +0c0145010c0144010c0143010c0142010c0142010c0141010c0141010c0141010c0140010d013f010d013e010e013d010f013c0110013b0111013a0113013901 +14013801150138011601370117013701180136011901360119013601190136011c0134011e013301200131012201300123012f0123012e0124012d0124012d01 +24012c0124012b0124012a0124012901230128012301260123012501220124012101230121012201200121011f0120011e011f011d011e011b011e011a011d01 +19011d0118011c0117011c0116011b0115011b0114011a0113011a0112011a0111011a01100119010f0119010e0119010d0118010c0117010b0117010a011601 +08011401060113010501110104010f0104010e0104010d0104010c0104010c0104010a01050108010501070107010501080104010a0103010c0102010e010201 +0f0101011001010112010101130100011501000117010001190100011b01ff001d01ff001e01ff002001ff002101ff002201ff002301fe002401fe002401fe00 +2601fe002901fe002a01fd002c01fc002d01fb002f01fa003001fa003001f9003101f8003201f7003201f6003201f6003201f5003301f5003301f4003301f400 +3301f3003301f1003301f0003201ef003201ee003101ed003101ec003001eb003001ea002f01ea002e01e9002e01e9002d01e8002d01e8002c01e7002b01e700 +2a01e6002901e6002701e6002601e5002501e5002401e5002301e5002201e5002101e5002101e5002001e5002001e5001f01e6001e01e6001e01e6001d01e600 +1d01e6001d01e6001c01e6001c01e6001b01e7001b01e7001b01e7001a01e7001a01e8001a01e8001a01e9001a01e9001a01e9001a01e9001b01e9001b01e900 +1c01e9001d01e9001e01e9002001e9002101e9002201e9002301e9002301e9002401e8002401e8002401e8002401e7002501e7002501e7002601e7002701e700 +2701e7002701e7002801e7002801e7002901e8002a01e8002b01e9002c01e9002d01ea002e01eb002f01ec003001ee003001ef003001f0003101f2003101f300 +3101f4003001f5003001f6002f01f7002e01f8002d01f9002c01fa002b01fa002a01fb002a01fb002901fc002801fc002701fc002601fc002501fd002501fd00 +2401fd002401fd002401fd002301fd002301fd002201fd002101fd002001fd001f01fd001e01fd001d01fe001c01fe001b01fe001901fe001801fe001701fe00 +1601fe001501ff001401ff001301ff001201ff001201ff001101ff001001ff000f0100010d0100010c0100010b0101010a010101090101010801020107010301 +06010401040105010301060102010801020108010201090102010a0102010b0102010d0102010e01020110010301110104011301050115010701160108011701 +0a0118010b0119010d011a010e011b010f011b0110011b0110011b0111011b0112011c0113011c0114011c0115011d0116011d0117011e0118011e0118011e01 +19011f011a011f011b0120011c0120011e0122011f0123012001240121012601210127012101290122012a0121012b0107000000fc02000047aae50000000400 +00002d01050004000000f00104008e0200002403450122012b0121012d0121012e0120012f011f0130011e0131011d0131011d0132011d0132011c0132011c01 +33011b0133011a0134011a01340119013501180135011701350117013601160136011501360114013701130137011301380112013801110138010f0139010e01 +3b010d013c010c013d010b013f010b0140010a0142010a0144010a0144010a0144010b0145010b0145010b0146010c0146010c0146010c0145010c0144010c01 +43010c0142010c0142010c0141010c0141010c0141010c0141010c0140010c013f010d013e010e013d010f013c0110013b0111013a0112013901140138011501 +38011601370117013701180136011901360119013601190136011c0134011e013301200131012101300122012f0123012e0123012d0123012d0124012c012401 +2b0124012a01230129012301270123012601220125012201240121012301200122011f0121011e0120011d011f011c011e011b011e011a011d0119011c011801 +1c0117011b0116011b0115011b0114011a0113011a0112011a0111011a01100119010f0119010e0119010d0118010c0118010b0117010a011601080114010601 +13010501110104010f0104010e0104010d0104010c0104010c0104010a01040108010501070107010501080104010a0103010c0102010e0101010f0101011001 +0101120100011301000115010001170100011901ff001b01ff001c01ff001e01ff002001fe002101fe002201fe002301fe002401fe002401fe002601fe002801 +fd002a01fd002c01fc002d01fb002e01fa002f01f9003001f9003101f8003101f7003201f6003201f6003201f5003201f5003201f4003201f4003201f3003201 +f1003201f0003201ef003201ee003101ed003101ec003001eb003001ea002f01ea002e01e9002e01e9002d01e8002d01e8002c01e7002b01e7002a01e6002901 +e6002701e6002601e5002501e5002401e5002301e5002201e5002101e5002101e5002001e5002001e5001f01e6001e01e6001e01e6001d01e6001d01e6001d01 +e6001c01e6001c01e6001b01e7001b01e7001b01e7001a01e7001a01e8001a01e8001a01e8001b01e9001b01e9001b01e9001b01e9001b01e9001c01e9001d01 +e9001e01e9002001e9002101e9002201e9002301e8002301e8002401e8002401e8002401e7002401e7002501e7002501e7002601e7002701e7002701e7002801 +e7002801e7002801e7002901e7002a01e8002c01e8002d01e9002e01ea002e01eb002f01ec003001ed003001ef003101f0003101f1003101f3003101f4003001 +f5003001f6002f01f7002e01f8002d01f9002d01fa002c01fb002b01fb002a01fc002901fc002801fc002701fc002601fd002501fd002501fd002401fd002401 +fd002401fd002301fd002301fd002201fd002101fd002001fd001f01fd001e01fe001d01fe001c01fe001b01fe001901fe001801fe001701fe001601fe001501 +ff001401ff001301ff001201ff001201ff001101ff001001ff000f0100010d0100010c0100010b0101010a010101090101010801020107010301060104010501 +05010401060103010801020108010201090102010a0102010b0102010d0102010e010301100103011101050113010601140107011601080117010a0118010b01 +19010d011a010e011a010f011a0110011b0110011b0111011b0112011b0113011c0114011c0115011c0116011d0117011d0118011e0119011e011a011e011b01 +1f011b0120011c0120011e0121011f0123012001240121012601210127012201290122012a0122012b0107000000fc02000063c2f2000000040000002d010400 +04000000f00105009e02000024034d0122012b0122012d0121012e0120012f011f0130011e0131011e0131011d0132011d0132011c0132011c0133011b013301 +1a0134011a01340119013501180135011801350117013601160136011501360114013701130137011301380112013801110138010f0139010e013b010d013c01 +0c013d010b013f010b0140010b0142010b0143010b0143010b0144010b0144010b0144010b0145010c0145010c0145010c0144010c0143010b0143010b014201 +0b0141010c0141010c0141010c0141010c0141010c0140010c013e010d013d010e013d010f013c0110013b0111013a0112013901130138011501380116013701 +17013601180136011801360119013601190136011c0134011e013301200131012101300122012f0123012e0123012d0123012d0123012c0123012b0123012a01 +230128012301270123012601220125012201240121012301200122011f0121011e0120011d011f011c011e011b011e011a011d0119011c0118011c0117011b01 +16011b0115011b0114011a0113011a0112011a0111011a01100119010f0119010e0119010d0118010c0118010b0117010a011601080115010601130105011101 +04010f0104010e0104010d0104010c0104010c0104010a0104010801050106010601050108010401090103010b0102010d0101010e0101011001000111010001 +130100011501ff001701ff001901ff001b01ff001c01fe001e01fe002001fe002101fe002201fe002301fe002401fe002401fe002601fd002801fd002a01fc00 +2b01fc002d01fb002e01fa002f01f9003001f8003001f8003101f7003101f6003101f6003201f5003201f5003201f4003201f4003201f3003201f1003201f000 +3201ef003101ee003101ed003001ec003001eb002f01ea002f01ea002e01e9002e01e9002d01e8002d01e8002c01e7002b01e7002a01e6002901e6002701e600 +2601e5002501e5002401e5002301e5002201e5002101e5002101e5002001e5002001e5001f01e6001e01e6001e01e6001d01e6001d01e6001d01e6001c01e600 +1c01e6001b01e7001b01e7001b01e7001a01e7001a01e8001a01e8001a01e8001b01e8001b01e8001b01e8001b01e8001b01e8001c01e8001d01e8001e01e800 +2001e8002101e8002201e8002301e8002301e8002401e8002401e7002401e7002401e7002501e7002501e6002601e6002601e6002701e7002801e7002801e700 +2801e7002901e7002b01e7002c01e8002d01e9002e01ea002f01eb002f01ec003001ed003001ef003101f0003101f1003101f3003101f4003101f5003001f600 +3001f7002f01f8002e01f9002d01fa002c01fb002b01fb002a01fc002901fc002801fc002701fd002601fd002501fd002501fd002401fd002401fd002401fd00 +2301fd002301fd002201fd002101fd002001fd001f01fd001e01fe001d01fe001c01fe001a01fe001901fe001801fe001701fe001601fe001501ff001401ff00 +1301ff001201ff001201ff001101ff001001ff000f0100010d0100010c0100010b0101010a010101090101010801020107010301060104010501050104010601 +03010801030108010301090103010a0102010b0102010c0103010e0103010f0104011101050113010601140107011601090117010a0118010b0119010d011901 +0e011a010f011a0110011a0111011a0111011b0112011b0113011b0114011c0115011c0116011c0117011d0118011d0119011e011a011e011b011e011c011f01 +1d0120011d0120011e0121011f0122011f01220120012301200124012101250121012501210126012201270122012801220129012201290122012a0122012b01 +22012b0107000000fc0200007fd9ff000000040000002d01050004000000f00104009e02000024034d011b01e8001b01e8001a01e8001a01e8001a01e7001b01 +e7001b01e7001b01e7001c01e6001c01e6001d01e6001d01e6001d01e6001e01e6001e01e6001f01e6002001e5002001e5002101e5002101e5002201e5002301 +e5002401e5002501e5002601e5002701e6002901e6002a01e6002b01e7002c01e7002c01e8002d01e8002e01e9002e01e9002f01ea002f01ea003001eb003001 +ec003101ed003101ee003101ef003101f0003201f2003201f3003101f4003101f4003101f5003101f5003101f6003101f6003001f7003001f8002f01f8002f01 +f9002e01fa002d01fb002b01fb002a01fc002801fd002601fd002401fe002301fe002301fe002201fe002101fe001f01fe001e01fe001c01fe001a01fe001801 +ff001701ff001501ff001301ff0011010001100100010e0100010d0100010b010101090102010801030106010501050106010401080104010a0103010c010301 +0c0103010d0104010e0104010f010501110106011301070115010a0116010b0117010c0118010d0118010e0119010f0119011001190111011a0112011a011301 +1a0114011a0115011b0116011b0117011b0118011c0119011c011a011d011b011e011c011e011d011f011e0120011f0121012001220121012301210124012201 +25012301260123012701230128012301290123012b0123012c0123012d0123012d0122012d0122012e01210130011f0131011e0133011b013401180135011801 +36011801360117013601160136011501370114013701130138011201390111013a010f013a010e013b010d013c010d013d010c013e010c013f010c0140010c01 +40010b0141010b0141010b0141010b0141010b0142010b0142010b0143010b0143010b0144010b0144010b0144010b0143010b0143010b0143010b0143010b01 +41010b0140010c013f010c013d010d013c010e013a010f0139011101380112013801130138011301370114013701150136011601360117013601180135011801 +3501190135011a0134011b0134011b0134011c0133011d0133011d0132011d0132011e0131011f0131012001300120012f0121012e0122012d0122012b012201 +2b0122012a01220129012201290122012801220127012201260121012501210124012101230120012301200122011f0121011e0120011e0120011d011f011c01 +1f011b011e011a011e0119011d0118011d0117011c0116011c0115011b0114011b0113011b0112011b0111011a0111011a0110011a010f011a010e0119010d01 +19010c0118010a011701090117010801150106011401050112010401110104010f0103010e0103010c0103010b0103010a010301090103010801030108010401 +060105010501060103010701030108010201090101010a0101010b0101010c0100010d0100010f0100011001ff001101ff001201ff001201ff001301ff001401 +ff001501ff001601fe001701fe001801fe001901fe001a01fe001c01fe001d01fe001e01fe001f01fd002001fd002101fd002201fd002301fd002301fd002401 +fd002401fd002401fd002501fd002501fd002601fd002701fd002801fd002901fc002a01fc002b01fb002c01fb002d01fa002e01f9002f01f8003001f7003001 +f6003101f5003101f4003101f3003101f1003101f0003101ee003001ed002f01ec002f01eb002e01ea002d01e9002c01e8002b01e7002a01e7002801e6002801 +e6002801e6002701e6002701e6002601e6002501e6002501e6002401e7002401e7002401e7002401e7002301e7002301e8002201e8002101e8002001e8001e01 +e8001d01e8001c01e8001c01e8001b01e8001b01e8001b01e8001b01e800040000002d01020004000000f0010500040000002d010300be02000024035d010301 +170103011701040118010501190106011a0107011b0108011c0109011c010b011d010c011e010d011e010e011f010f011f0110011f0111012001110120011201 +2001120120011201200113012001140121011501210117012201190123011a0124011c0125011d0126011d0126011d0127011e0128011f012a011f012b011f01 +2c011f012e011e012f011d0131011d0131011c0131011c0132011b0133011b0133011a0134011901340118013501180135011701350116013601150136011401 +37011401370113013701120138011101380111013801100139010f013a010e013a010e013b010d013c010c013d010c013d010b013e010b013f010a0140010a01 +41010a01420109014401090145010a0146010a0147010a0147010b0149010c014b010e014d010f014e011101500113015101140151011401510114014d011401 +4d0112014c0111014b01100149010f0148010e0147010e0146010d0145010e0144010e0143010e0142010f0141010f01400110013f0111013e0111013e011201 +3d0112013d0113013d0113013d0114013c0114013c0115013c0116013b0117013b0117013b0118013a0119013a011a0139011b0139011c0138011d0137011e01 +37011f0136011f0136012001350121013401220134012201330123013201230131012401300124012e0124012d0124012c0124012b0124012a01240128012401 +27012301260122012401220124012201230121012201200121011f0120011e011f011d011f011c011e011a011d0119011d0118011c0117011c0116011b011501 +1b0114011a0113011a0112011a0112011a0111011a0111011901100119010f0119010e0118010d0118010c0117010b0117010a01160109011501080114010801 +140107011301070112010601100106010f0106010f0106010d0107010b01090109010a0108010c0107010e010601100106011101050111010501120105011301 +050114010501150105011601050118010401190104011a0104011c0104011d0104011e0103011f01030120010301210103012201030123010301230103012301 +030124010201250102012601020127010201280101012a0101012b0100012c01ff002e01ff002f01fe003001fd003101fb003201fa003201f8003301f7003301 +f7003301f5003301f3003301f2003301f0003301ef003201ee003201ed003101ec003101eb003001ea002f01e9002e01e9002d01e8002d01e8002c01e7002b01 +e7002b01e7002a01e6002901e6002701e6002601e5002501e5002401e5002301e5002201e5002201e5002101e5002101e5002001e5002001e5001f01e6001e01 +e6001e01e6001d01e6001d01e6001d01e6001d01e6001c01e6001c01e6001b01e7001b01e7001b01e7001a01e7001a01e7001a01e8001a01e8001a01e9001a01 +e9001a01ea001a01ea001a01eb001a01eb001a01eb001b01eb001b01eb001c01eb001c01ec001d01ec001e01ec001e01ec001f01ec001f01ec002001ec002001 +ec002101ec002201ec002201ec002301ec002401ec002401ec002401ec002501ec002501ec002601ec002601eb002701eb002701eb002701eb002801eb002801 +eb002801eb002a01eb002b01ec002c01ed002d01ee002d01f0002e01f2002e01f4002e01f4002d01f6002c01f8002b01f9002a01fa002801fb002701fb002601 +fc002401fc002401fc002401fc002301fd002201fd002101fd002001fd001f01fd001e01fd001d01fe001b01fe001a01fe001901fe001801fe001601fe001501 +ff001401ff001301ff001301ff001201ff001201ff001101ff001001ff000f0100010d0100010c0100010b0101010b0101010a01010109010101080102010701 +0301060104010401050103010601020107010101090100010a0100010c0100010e010001100100011201010115010301170107000000fc0200000066bf000000 +040000002d010400040000002d0101008a0000002403430018014f011801500118015001190150011a0151011a0152011b0152011c0153011c0154011c015401 +1c0154011d0155011d0156011d0157011d0158011d0159011d015a011d015b011d015c011c015c011c015d011b015e011b015f011a0160011901600118016101 +16016201150163011401640113016601130167011301690115016b0115016d0114016d0114016d0113016c0112016c0112016a01110169011101670111016501 +110165011101650111016401110164011201630112016201130161011501600116015f0117015e0118015d0119015c011a015b011a015a011a0159011a015701 +1a0157011a0157011a0157011a0156011901560119015501180155011801540118014f0107000000fc020000000d66000000040000002d01050004000000f001 +04004800000024032200130168011301670113016601140164011501630116016201170162011801610119016001190160011a0160011a015f011a015f011b01 +5f011b015e011b015e011c015e011b015e011b015e011b015e011a015f0119015f01180160011701600116016101150161011501620114016301130164011301 +6501130165011301660113016701130168014a0000002403230018015201180154011801550119015501190156011a0156011a0157011a0157011a0157011a01 +57011a0158011a0159011a015a011a015b011a015b0119015c0119015c0118015d0119015d0119015c0119015c011a015b011b015b011b015a011b0159011b01 +58011b0156011b0155011b0155011a0154011a0154011901530119015301190152011801520107000000fc02000042b0e8000000040000002d01040004000000 +f0010500c000000024035e00110165011101650111016401110164011101630112016301120162011301610115016001150160011501600115015f0115015f01 +16015f0116015f0117015f0117015e0118015e0118015d0119015d0119015d011a015c011a015c011a015c011b015b011b015b011c015a011c0159011c015901 +1c0158011c0157011c0157011c0156011c0156011c0155011c0155011c0155011c0154011b0153011a0153011a01520119015101180151011801510118015101 +18014f011801500118015001190150011a0151011a0152011b0152011c0153011c0154011c0154011c0154011c0155011c0155011d0156011d0156011d015701 +1d0158011d0158011d0158011d0159011d015a011c015a011c015b011b015c011a015d0119015d0118015e0117015f0115016001140161011301620112016301 +120163011201640112016401120165011201660112016701120168011201690113016a0113016a01120169011201690112016901120168011101670111016601 +11016501040000002d01020004000000f0010400040000002d0103009a00000024034b0018014f0118014f011801500118015001190150011a0151011a015201 +1b0152011c0153011c0154011c0154011c0154011c0154011d0155011d0156011d0157011d0158011d0159011d015a011d015a011d015b011d015c011c015c01 +1c015d011b015e011b015f011a01600119016001190160011801610116016201150163011401640113016601130167011301690115016b0115016d0115016d01 +14016d0114016d0113016c0112016c0112016a011101690111016701110165011101650111016501110165011101640111016401120163011201620113016101 +150160011501600116015f0117015e0118015d0119015c011a015b011a015a011a0159011a0157011a0157011a0157011a0157011a0157011a01560119015601 +19015501180155011801540118014f0107000000fc020000730000000000040000002d010400040000002d01010012000000240307001601c4001a01c4001701 +740116017401150174011201c4001601c40007000000fc0200008a0000000000040000002d01050004000000f001040012000000240307001701740116017401 +150174011201c4001601c4001a01c4001701740107000000fc020000a1000d000000040000002d01040004000000f00105001200000024030700170174011601 +7401150174011301c4001601c4001901c4001701740107000000fc020000ba002e000000040000002d01050004000000f0010400120000002403070017017401 +16017401150174011301c4001601c4001801c4001701740107000000fc020000d1264f000000040000002d01040004000000f001050012000000240307001601 +740116017401150174011401c4001601c4001801c4001601740107000000fc020000e84c70000000040000002d01050004000000f00104001200000024030700 +1601740116017401160174011501c4001601c4001701c4001601740107000000fc020000ff99a8000000040000002d01040004000000f0010500120000002403 +07001601c4001701c4001601740116017401160174011501c4001601c400040000002d01020004000000f0010400040000002d01030012000000240307001601 +c4001a01c4001701740116017401150174011201c4001601c40007000000fc0200000066bf000000040000002d010400040000002d0101005600000024032900 +1601c6001701c5001801c5001801c5001901c5001a01c4001b01c4001b01c3001c01c2001c01c2001c01c2001c01c1001d01c1001d01c0001d01c0001d01bf00 +1d01bf001d01bd001c01bc001c01bb001b01ba001a01b9001901b8001701b8001601b8001501b8001301b8001201b9001101ba001001bb001001bc000f01bd00 +0f01bf000f01c0001001c1001001c2001101c3001201c4001301c5001501c5001601c60056000000240329001601c1001701c1001701c1001801c1001801c100 +1901c0001901c0001901c0001a01bf001a01bf001a01bf001a01be001a01be001a01be001b01bd001b01bd001b01bd001b01bc001a01bb001a01ba001901b900 +1901b9001801b8001701b8001601b8001501b8001401b8001301b9001301b9001201ba001201bb001101bc001101bd001101be001201be001201bf001301c000 +1301c0001401c1001501c1001601c10007000000fc020000077ac9000000040000002d01050004000000f001040056000000240329001601c0001501c0001401 +c0001401c0001301bf001301bf001201be001201bd001201bc001201bc001201bb001301ba001301b9001401b9001401b9001501b8001601b8001701b8001801 +b9001801b9001901b9001901ba001a01bb001a01bc001a01bc001a01bd001a01bd001a01bd001a01bd001a01be001a01be001a01be001901bf001901bf001901 +bf001801c0001801c0001801c0001701c0001701c0001601c00007000000fc0200001c92d4000000040000002d01040004000000f00105004e00000024032500 +1601c0001501bf001501bf001401bf001401bf001301be001301bd001301bd001301bc001301bb001301bb001301ba001401ba001401b9001501b9001501b900 +1601b9001701b9001701b9001801b9001801ba001901ba001901bb001901bb001901bc001901bd001901bd001901be001901be001901be001801bf001801bf00 +1801bf001701bf001701bf001601c0001601c00007000000fc02000033a6de000000040000002d01050004000000f00104004e000000240325001601bf001501 +bf001501be001401be001401be001401bd001301bd001301bc001301bc001301bb001301bb001401ba001401ba001401b9001501b9001501b9001601b9001701 +b9001701b9001801b9001801ba001801ba001901bb001901bb001901bc001901bc001901bd001901bd001801bd001801be001801be001801be001701be001701 +be001701bf001601bf001601bf0007000000fc0200004abdeb000000040000002d01040004000000f001050046000000240321001601be001501be001501be00 +1501bd001401bd001401bd001401bc001401bc001401bc001401bb001401bb001401ba001401ba001501ba001501b9001501b9001601b9001601b9001701b900 +1701ba001801ba001801ba001801bb001801bb001801bc001801bc001801bc001801bc001801bd001801bd001701be001701be001601be0007000000fc020000 +5fd4f5000000040000002d01050004000000f00104002e000000240315001601bd001501bd001501bc001401bc001401bb001401ba001501ba001501ba001601 +b9001701ba001701ba001801ba001801bb001801bb001801bc001801bc001701bc001701bd001701bd001601bd001601bd0007000000fc02000099f7ff000000 +040000002d01040004000000f00105002e000000240315001601bc001601bc001701bc001701bc001701bc001701bb001701bb001701bb001701bb001701ba00 +1701ba001601ba001601ba001501ba001501ba001501ba001501bb001501bb001501bc001501bc001601bc0007000000fc0200000066bf000000040000002d01 +050004000000f00104004e000000240325001d01c1001c01c1001c01c2001c01c2001c01c2001b01c3001b01c4001a01c4001901c5001801c5001801c5001701 +c5001601c6001501c5001401c5001301c5001201c4001101c3001001c3001001c2000f01c1001001c1001001c1001101c1001101c1001201c2001401c2001501 +c2001601c2001701c2001901c2001a01c2001b01c1001b01c1001c01c1001c01c1001d01c10007000000fc0200000059b2000000040000002d01040004000000 +f00105004e000000240325001601c2001701c2001901c2001a01c2001b01c2001b01c2001c01c1001c01c1001c01c1001c01c2001c01c2001c01c2001b01c300 +1b01c3001a01c4001a01c4001901c5001801c5001801c5001701c5001601c6001501c5001401c5001301c5001201c4001101c4001101c3001001c2001001c100 +1001c1001001c1001101c2001201c2001301c2001401c2001501c2001601c20007000000fc020000004da6000000040000002d01050004000000f00104004e00 +0000240325001601c3001701c3001901c3001a01c2001a01c2001b01c2001b01c2001c01c2001c01c2001c01c2001b01c3001b01c3001b01c3001a01c4001a01 +c4001901c5001901c5001801c5001801c5001701c5001601c6001501c5001401c5001301c5001201c4001201c4001101c3001101c3001001c2001001c2001101 +c2001101c2001201c2001301c3001401c3001501c3001601c30007000000fc020000004099000000040000002d01040004000000f00105004e00000024032500 +1601c3001701c3001801c3001901c3001a01c3001b01c3001b01c2001b01c2001b01c2001b01c3001b01c3001b01c3001a01c4001a01c4001a01c4001901c500 +1901c5001801c5001701c5001701c5001601c6001501c5001401c5001301c5001201c4001201c4001101c3001101c3001101c2001101c3001101c3001201c300 +1201c3001301c3001401c3001501c3001601c30007000000fc02000000338c000000040000002d01050004000000f00104004e000000240325001601c4001701 +c3001801c3001901c3001a01c3001a01c3001b01c3001b01c3001b01c3001b01c3001b01c4001a01c4001a01c4001a01c4001901c5001901c5001901c5001801 +c5001701c5001701c5001601c6001501c5001401c5001301c5001201c4001201c4001201c4001101c3001101c3001101c3001201c3001201c3001201c3001301 +c3001401c4001501c4001601c40007000000fc02000000267f000000040000002d01040004000000f00105004e000000240325001b01c4001b01c4001a01c400 +1a01c4001a01c5001901c5001901c5001901c5001801c5001801c5001701c5001701c6001601c6001501c5001401c5001301c5001301c5001201c4001201c400 +1201c4001201c4001201c4001201c4001201c4001301c4001301c4001401c4001501c4001601c4001701c4001801c4001901c4001a01c4001a01c4001a01c400 +1b01c4001b01c400040000002d01020004000000f0010400040000002d0103006000000024032e001601c6001601c6001701c5001801c5001801c5001901c500 +1a01c4001b01c4001b01c3001c01c2001c01c2001c01c2001c01c2001c01c1001d01c1001d01c0001d01c0001d01bf001d01bf001d01bf001d01bd001c01bc00 +1c01bb001b01ba001a01b9001901b8001701b8001601b8001601b8001501b8001301b8001201b9001101ba001001bb001001bc000f01bd000f01bf000f01bf00 +0f01c0001001c1001001c2001101c3001201c4001301c5001501c5001601c60007000000fc02000033b3d9000000040000002d010400040000002d0101004e00 +0000240325001001be001001be001001be001001bf001001c0001001c1001101c2001201c3001301c4001301c4001301c4001301c4001401c4001401c4001401 +c4001401c3001301c3001301c3001301c3001201c2001201c2001101c2001101c1001101c0001001c0001001bf001001bf001001be001001be001001be001001 +bd001001bd001001bd001001bd001001bd001001bd001001be0007000000fc0200007fd9ff000000040000002d01050004000000f00104003600000024031900 +1101c1001001c1001001c1001001c0001001c0001001c0001001c0001001c0001001c0001001c0001001c0001001c0001001c0001101c0001101c1001101c100 +1101c1001101c1001101c1001101c1001101c1001101c1001101c1001101c1001101c10007000000fc02000033b3d9000000040000002d01040004000000f001 +05004e000000240325001c01be001c01be001c01be001c01bf001c01c0001c01c1001b01c2001a01c3001901c4001901c4001901c4001901c4001801c4001801 +c4001801c4001801c3001901c3001901c3001901c3001a01c2001a01c2001b01c2001b01c1001b01c0001c01c0001c01bf001c01bf001c01be001c01be001c01 +be001c01bd001c01bd001c01bd001c01bd001c01bd001c01bd001c01be0007000000fc0200007fd9ff000000040000002d01050004000000f001040036000000 +240319001b01c1001b01c1001c01c1001c01c0001c01c0001c01c0001c01c0001c01c0001c01c0001c01c0001b01c0001b01c0001b01c0001b01c0001b01c100 +1b01c1001b01c1001b01c1001b01c1001b01c1001b01c1001b01c1001b01c1001b01c1001b01c10007000000fc0200000066bf000000040000002d0104000400 +0000f0010500880200002403420129011701280118012701190126011a0125011b0124011c0123011c0121011d0120011e011f011e011e011f011d011f011c01 +1f011b0120011b0120011a0120011a012001190120011801210116012101150122011301230112012401100125010f0126010f0127010e0128010d012a010d01 +2b010d012c010d012e010e012f010f0131010f013101100132011101330111013301120134011301340113013501140135011501350116013601170136011701 +370118013701190137011a0138011b0138011c0139011d013a011e013a011e013b011f013c0120013d0120013d0121013e0121013f0122014001220141012201 +4201220144012301450122014601220147012101490120014b011e014d011c014e011b01500119015101180151011801510118014d011a014c011b014b011c01 +49011d0148011e0147011e0146011f0145011e0144011e0143011e0142011d0141011d0140011c013f011b013e011b013e011a013d0119013d0119013d011801 +3c0118013c0117013c0116013b0115013b0115013b0114013a0113013a011201390111013901100138010f0137010e0137010d0136010c0135010b0134010a01 +34010a01330109013201090131010801300108012e0108012d0108012c0108012b0108012a010801280108012701090126010a0124010a0123010b0122010c01 +21010d0120010e011f010f011f0110011e0111011d0113011d0114011c0115011c0116011b0117011b0118011a0119011a011a011a011a011a011b0119011c01 +19011d0119011e0118011f01180120011701210117012201160123011501240114012401140125011301250112012601100126010f0126010d0125010b012301 +090122010801200107011e0106011c0106011b0105011a01050119010501180105011701050116010501140104011301040112010401100104010f0104010e01 +03010d0103010b0103010b0103010a0103010901030109010301080102010701020106010201050102010301010102010101010100010001ff00fe00ff00fd00 +fe00fc00fd00fb00fb00fa00fa00fa00f800f900f700f900f500f900f300f900f200f900f000f900ef00f900ee00fa00ed00fb00ec00fb00eb00fc00ea00fd00 +e900fe00e900fe00e800ff00e8000001e7000101e7000201e6000301e6000501e6000601e5000701e5000801e5000901e5000a01e5000b01e5000b01e5000c01 +e5000c01e5000d01e6000d01e6000e01e6000e01e6000f01e6000f01e6001001e6001001e6001101e7001101e7001101e7001201e7001201e8001201e8001201 +e9001201e9001201ea001201ea001201eb001201eb001101eb001101eb001001eb001001ec000f01ec000e01ec000e01ec000d01ec000c01ec000c01ec000b01 +ec000a01ec000a01ec000901ec000801ec000801ec000701ec000701ec000601ec000601eb000501eb000501eb000501eb000401eb000401eb000201eb000101 +ec000001ed00ff00ee00fe00f000fe00f200fe00f400ff00f6000001f8000101f9000201fa000401fb000501fb000601fc000801fc000801fc000901fd000a01 +fd000b01fd000c01fd000d01fd000e01fd000f01fe001101fe001201fe001301fe001401fe001601fe001701ff001801ff001901ff001901ff001a01ff001b01 +ff001c01ff001d0100011f0100012001000121010101220101012301010124010201250103012601040127010501290106012a0107012b0109012c010a012c01 +0c012c010e012c0110012c0112012b0115012901170107000000fc020000004aa6000000040000002d01050004000000f00104009800000024034a000301e900 +0401e9000501e9000501e9000601e9000601e9000601ea000701ea000701ea000801eb000a01eb000b01eb000d01eb000e01eb001001eb001101eb001101eb00 +1101eb001001eb001001ec000f01ec000f01ec000e01ec000e01ec000d01ec000c01ec000c01ec000b01ec000a01ec000a01ec000901ec000801ec000801ec00 +0701ec000701ec000601ec000601eb000501eb000501eb000501eb000401eb000401eb000201eb000101ec000001ed00ff00ee00fe00f000fe00f200fe00f400 +ff00f6000001f7000101f8000201f9000301fa000401fb000501fb000601fc000201fa000001f900ff00f800fe00f700fd00f600fd00f400fc00f300fc00f100 +fd00f000fd00ee00fe00ed00fe00ec00ff00eb000001ea000101ea000201e9000301e90007000000fc020000002b8c000000040000002d01040004000000f001 +05009800000024034a000401e9000401e9000501e9000501e9000501e9000601ea000601ea000601ea000701eb000801eb000901eb000b01eb000c01eb000e01 +eb000f01eb001001eb001001eb001001eb001001ec000f01ec000f01ec000f01ec000e01ec000e01ec000d01ec000c01ec000c01ec000b01ec000a01ec000a01 +ec000901ec000801ec000801ec000701ec000701ec000601ec000601eb000501eb000501eb000501eb000401eb000401eb000201eb000101ec000001ed00ff00 +ee00fe00f000fe00f200fe00f400ff00f600ff00f7000001f8000101f9000201fa000301fa000401fb000401fb000101f9000001f800ff00f700fe00f600fd00 +f500fd00f400fd00f300fd00f100fd00f000fd00ef00fe00ed00ff00ec000001eb000101eb000201ea000301ea000401e90007000000fc020000001073000000 +040000002d01050004000000f00104009800000024034a000401ea000401ea000501e9000501e9000501ea000501ea000601ea000601ea000601eb000801eb00 +0901ec000a01ec000c01ec000d01ec000e01ec000f01ec000f01ec000f01ec000f01ec000f01ec000f01ec000e01ec000e01ec000e01ec000d01ec000c01ec00 +0c01ec000b01ec000a01ec000a01ec000901ec000801ec000801ec000701ec000701ec000601ec000601eb000501eb000501eb000501eb000401eb000401eb00 +0201eb000101ec000001ed00ff00ee00fe00f000fe00f200fe00f400ff00f600ff00f7000001f8000001f8000101f9000201fa000201fa000301fa000001f800 +ff00f700ff00f700fe00f600fe00f500fd00f400fd00f300fd00f100fe00f000fe00ef00fe00ee00ff00ed000001ec000101eb000201eb000301ea000401ea00 +07000000fc020000000059000000040000002d01040004000000f001050090000000240346000101fa000101f9000101f9000001f9000001f800ff00f700ff00 +f700ff00f600fe00f400fe00f200fe00f000ff00ee000001ed000101ec000201eb000401eb000401eb000501eb000501eb000501eb000601eb000601ec000701 +ec000701ec000801ec000801ec000901ec000a01ec000a01ec000b01ec000c01ec000c01ec000d01ec000e01ec000e01ec000f01ec000f01ec000e01ec000e01 +ec000d01ec000b01ec000a01ec000901ec000701ec000601eb000601eb000501ea000501ea000501ea000501ea000501ea000501ea000401ea000301eb000201 +eb000101eb000001ec000001ed00ff00ee00fe00ef00fe00f000fe00f100fe00f300fe00f300fe00f400fe00f500fe00f600ff00f600ff00f7000101fa000700 +0000fc020000004dab000000040000002d01050004000000f0010400ce000000240365000301ff000501ff000601000108010001090101010b0101010d010101 +0e0101011001020111010201130102011401020115010201160103011801030118010301190103011a0103011b0103011c0103011d0104011d0104011e010401 +1f0104012001050121010501220105012301060123010601240106012501070125010701260108012601090126010b0126010c0126010e0126010f0126011001 +26011001260110012601100126010f0126010f0126010e0125010c0125010a012301090122010801200107011e0106011c0106011b0105011a01050119010501 +180105011701050116010501140104011301040112010401100104010f0104010e0103010d0103010b0103010b0103010a010301090103010901030108010201 +07010201060102010501020104010101030101010101000100010001ff00ff00fe00fe00fd00fd00fc00fc00fb00fb00fa00f900f900f800f900f700f900f700 +f900f600f900f600f900f600f900f500f900f500f900f500f900f500f900f600fa00f700fb00f900fc00fa00fe00fc000001fd000301ff0007000000fc020000 +003396000000040000002d01040004000000f0010500ce000000240365000301ff00040100010601000108010101090101010b0101010c0102010e0102011001 +020111010201120102011401030115010301160103011701030118010301190103011a0103011b0104011b0104011c0104011d0104011e0104011f0105011f01 +050120010501210105012201060122010601230106012401070124010701250108012501090126010a0126010c0126010d0126010e0126010f0126010f012601 +0f0126010f0126010f0126010e0126010e0125010c0124010a012301090121010801200107011e0106011c0106011b0105011a01050119010501180105011701 +050116010501140104011301040112010401100104010f0104010e0103010d0103010b0103010b0103010a010301090103010901030108010201070102010601 +02010501020104010101030101010201000101010001ff00ff00fe00fe00fd00fe00fc00fd00fb00fb00fb00fa00fa00f900fa00f800fa00f800fa00f800fa00 +f700fa00f700fa00f700fa00f600fa00f600fa00f600fa00f700fa00f800fb00fa00fd00fb00fe00fd000001fe000301ff0007000000fc020000001982000000 +040000002d01050004000000f0010400b60000002403590002010001040100010601010107010101090101010b0102010c0102010e0102010f01030111010301 +120103011401030115010301160103011701030118010401190104011a0104011c0104011d0105011f0105012001060121010601220107012401080124010901 +25010a0126010b0126010c0126010d0126010e0126010e0126010e0126010e0126010e0126010d0126010d0125010b0124010a01230109012101080120010701 +1e0106011c0106011b0105011a01050119010501180105011701050116010501140104011301040112010401100104010f0104010e0103010d0103010b010301 +0b0103010a010301090103010901030108010201070102010601020105010201040101010301010102010101010100010001ff00ff00ff00fe00fe00fd00fd00 +fc00fc00fb00fb00fb00fa00fa00f900fa00f900fa00f800fa00f800fa00f800fa00f800fb00f900fc00fb00fd00fc00fe00fd000001fe000201000107000000 +fc02000000006e000000040000002d01040004000000f0010500b60000002403590002010001040100010601010107010101090102010b0102010c0103010e01 +03010f01030111010301120103011301030115010401160104011701040118010401190104011a0104011b0105011d0105011e0105011f010601200106012101 +070123010801240108012401090125010a0126010b0126010c0126010d0126010d0126010e0126010d0126010d0126010d0126010c0125010b01240109012301 +0801210107011f0107011e0106011c0106011b0105011a01050119010501180105011701050116010501140104011301040112010401100104010f0104010e01 +03010d0103010b0103010b0103010a0103010901030109010301080102010701020106010201050102010501020104010101020101010101000100010001ff00 +ff00fe00fe00fe00fe00fd00fd00fc00fc00fb00fb00fb00fa00fb00fa00fb00fa00fb00f900fb00f900fb00fa00fb00fb00fc00fc00fd00fd00fe00fe000001 +ff000201000107000000fc020000000059000000040000002d01050004000000f0010400b60000002403590026010d0126010c0126010c0126010c0126010c01 +25010a012401090122010801210107011f0107011e0106011c0106011b0105011a01050119010501180105011701050116010501140104011301040112010401 +100104010f0104010e0103010d0103010b0103010b0103010a010301090103010901030108010201070102010601020106010201050102010401010103010101 +020101010101000100010001ff00ff00fe00fe00fd00fd00fc00fd00fc00fc00fb00fb00fb00fb00fb00fb00fb00fb00fb00fb00fb00fb00fc00fc00fc00fc00 +fd00fd00fe00fe000001ff0002010001040101010501010107010201090102010a0103010c0103010e0103010f01030111010401120104011301040115010401 +160104011701040118010401180104011a0105011b0105011c0105011d0106011e0106011f0106012001070122010701230108012401090125010a0125010a01 +26010b0126010c0126010c0126010d0107000000fc0200000045a6000000040000002d01040004000000f001050096000000240349000e012f010e012f010e01 +2f010d012e010d012e010d012d010c012b010c012a010c0128010d0127010d0126010e0125010e0124010f012401100123011101220112012201130121011401 +20011501200117011f0118011f0119011f011a011e011b011e011c011e011d011d011e011d011f011c0120011c0121011b0122011b0123011b0124011a012501 +1a012601190126011901270119012701190127011901280118012701190126011a0125011b0124011b0123011c0122011d0121011d0120011e011f011e011e01 +1f011d011f011c011f011b0120011b0120011a0120011a012001190120011801210116012101150122011301230112012401100125010f0126010f0127010e01 +28010d0129010d012a010d012c010d012d010e012e010e012f0107000000fc02000000268c000000040000002d01050004000000f00104008600000024034100 +0e012e010e012e010d012d010d012d010d012c010d012b010d012a010d0129010d0128010d0127010e0126010f0125010f012401100124011101230112012201 +130122011401210115012101160120011701200118011f0119011f011a011f011b011e011c011e011e011d0120011c0122011b0124011b0125011a0126011a01 +26011a0125011a0125011b0124011b0123011c0122011c0121011d0120011d011f011e011e011e011d011f011c011f011c011f011b0120011b0120011a012001 +1a012001190120011801210116012101150122011301230112012401100125010f0126010f0127010e0128010d0129010d012a010d012b010d012c010d012d01 +0e012e0107000000fc020000000873000000040000002d01040004000000f001050076000000240339000d012c010d012c010d012c010d012b010d012b010d01 +2a010d0129010d0128010e0127010e0126010f0126010f0125011001240111012401120123011201230113012201140122011501210116012101170120011801 +2001190120011a011f011b011f011c011e011e011e0120011d0121011c0123011c0124011b0124011b0125011b0123011c0122011c0120011d011f011e011d01 +1f011b011f011b0120011a012001190120011801210116012101150122011301230112012401100125010f0126010f0127010e0128010d0129010d012a010d01 +2a010d012b010d012c010d012c0107000000fc020000000059000000040000002d01050004000000f001040076000000240339000c012b010c012b010c012a01 +0d012a010d0129010d0129010e0128010f0127010f012601100125011201240113012301150122011601210118012101190120011a0120011a0120011b012001 +1d011f011e011e0120011e0121011d0122011c0123011c0123011c0122011c0122011d0121011d011f011e011e011e011c011f011a0120011a01200119012001 +1801200117012101160121011501220115012201140122011301230112012301120124011101240110012501100125010f0126010e0126010e0127010e012801 +0d0128010d0129010d012a010c012a010c012b010c012b0107000000fc0200000045a6000000040000002d01040004000000f001050086000000240341000901 +300109013001090131010a0131010b0132010c0134010e013501100136011101370112013701130137011401380115013801160139011701390117013a011801 +3a0119013b011a013b011a013c011b013c011c013d011c013d011d013e011d013e011e0140011f0142011f0144011f0145011e0147011e0148011d0148011d01 +48011e0147011e0145011e0143011e0142011d0140011c013f011b013e011a013d0119013d0119013d0118013c0118013c0117013c0116013b0115013b011501 +3b0114013a0113013a011201390111013901100138010f0137010e0137010d0136010c0135010b0135010b0134010a0133010a01320109013201090131010901 +300107000000fc02000000268c000000040000002d01050004000000f001040076000000240339000a0131010a0132010a0132010b0133010c0133010d013401 +0e0135010f0136011101370113013801140139011601390117013a0119013b011a013c011b013d011c013e011d0140011e0141011f0143011f0145011e014601 +1e0147011e0148011e0148011e0146011f0145011e0143011e0142011d0140011c013f011b013e011a013d0119013d0119013d0118013c0118013c0117013c01 +16013b0115013b0115013b0114013a0113013a011201390111013901100138010f0137010e0137010d0136010c0135010c0135010b0134010b0134010b013301 +0a0133010a0132010a01310107000000fc020000000873000000040000002d01040004000000f001050076000000240339000b0133010b0133010b0133010b01 +34010c0134010d0135010e0136010f01360111013701130138011401390115013a0117013a0118013b0119013c011a013d011b013e011d013f011e0141011e01 +42011f0144011f0145011e0146011e0147011e0147011f0146011f0144011e0143011e0141011d0140011c013f011b013e011a013d0119013d0119013d011801 +3c0118013c0117013c0116013b0115013b0115013a0114013a0113013a011201390111013901100138010f0137010e0137010d0136010c0136010c0135010c01 +35010b0135010b0134010b0134010b0133010b01330107000000fc020000000059000000040000002d01050004000000f00104006e000000240335001f014601 +1f0145011f0144011e0142011e0141011d0140011c013f011b013e011a013d0119013d0119013d0118013c0118013c0117013c0116013b0115013b0115013a01 +14013a0113013a011201390111013801100138010f0137010e0137010d0136010c0135010c0135010c0135010c0135010c0135010c0135010c0135010c013501 +0d0136010e0136010f01370111013801120139011401390115013a0116013b0117013b0118013c0119013d011a013d011c013f011d0140011e0142011f014301 +1f0144011f0145011f0146011f01460107000000fc0200000066bf000000040000002d01040004000000f00105009e02000024034d011201e9001201e9001201 +e8001201e8001201e7001101e7001101e7001101e7001001e6001001e6000f01e6000f01e6000e01e6000e01e6000d01e6000d01e6000c01e5000c01e5000b01 +e5000b01e5000a01e5000901e5000801e5000701e5000601e5000501e6000301e6000201e6000101e7000001e700ff00e800ff00e800fe00e900fd00e900fd00 +ea00fc00ea00fb00eb00fb00ec00fa00ed00f900ee00f900ef00f900f000f900f100f800f300f900f400f900f400f900f500f900f500f900f600f900f600fa00 +f700fa00f800fb00f900fc00fa00fd00fb00fe00fc00ff00fd000101fd000301fe000501ff000801ff000801ff000801ff000901ff000a01ff000c01ff000d01 +00010f01000111010001130100011501010116010101180101011a0102011b0102011d0102011e01030120010301220104012301050125010601260107012701 +080128010a0128010c0128010c0128010d0128010e0127010f012701110126011301240114012201160121011701200117011f0118011e0119011d0119011c01 +19011b011a011a011a0119011a0118011a0117011b0116011b0115011c0114011c0113011d0111011d0110011e010f011f010e011f010d0120010c0121010b01 +22010a0123010a0124010901250108012701080128010801290108012a0108012b0108012c0108012d0108012e0108012e0109012f010a0130010b0132010d01 +33010f0134011201360112013601130136011301360114013701150137011601380118013901190139011a013a011b013b011c013c011d013d011e013e011f01 +3f011f01400120014101200141012001420120014201200143012001440120014501200146011f0148011e0149011e014a011e014a011f014a0120014a012001 +49012101490121014801210148012201470122014701220146012201460122014501230145012301450123014401220143012201420122014101220140012101 +3f0121013e0120013e0120013d011f013c011f013b011e013b011d013a011d0139011c0139011b01380119013801180137011601360115013501130135011201 +34011101330110013201100132010f0131010f0131010e0130010d012f010c012e010b012d010b012c010b012a010b0129010b0128010c0126010c0125010d01 +24010f0122011001210111012101120120011301200114011f0115011f0116011e0117011e0117011e0118011d0119011d011a011d011b011c011c011c011c01 +1c011d011c011e011b011f011b011f011b0120011b0121011a0122011a0123011901230119012401180125011701260117012601160127011501280114012901 +1301290112012a0111012a0110012b010f012b010d012b010c012b010a012b0109012a0109012a01090129010701280105012701040125010301240102012301 +02012201010121010101200100011f0100011d0100011c01ff001b01ff001a01ff001901ff001901ff001801ff001701ff001601fe001501fe001401fe001201 +fe001101fe001001fe000f01fe000e01fd000d01fd000c01fd000b01fd000a01fd000901fd000801fc000801fc000701fc000601fc000401fc000301fb000101 +fa00ff00f900fd00f700fc00f600fc00f500fc00f400fc00f300fc00f200fc00f000fc00ef00fd00ee00fd00ed00fe00ec00ff00eb000001ea000101e9000201 +e9000301e8000401e8000401e8000501e8000501e8000501e8000601e8000601e8000701e8000701e8000701e8000801e9000801e9000801e9000901ea000a01 +ea000b01ea000c01ea000e01ea000f01ea001001ea001101ea001201ea001201ea001201ea001201e90007000000fc0200000f7dcc000000040000002d010500 +04000000f0010400ae020000240355010b012c010b012d010c012e010d012f010d0130010e0131010f0131010f01320110013201110133011201340113013501 +150135011601360118013701190138011b0138011c0139011d0139011d013a011e013b011f013b011f013c0120013d0120013e0121013e0121013f0122014001 +22014101220142012201430122014401220145012201450122014501220145012201450122014601220146012101470121014701210148012001480120014901 +1f0149011f0149011f0148011f0148011f0147012001460120014501200143012001430120014201200141012001410120014101200140011f013f011e013e01 +1e013d011d013c011c013b011a013a01190139011801390117013801150137011401370114013601130136011201360112013601100134010d0133010b013201 +0a01300109012f0108012e0108012e0108012d0108012c0108012b0108012a01080129010801280109012701090125010a0124010a0123010b0122010c012101 +0d0120010e011f010f011e0110011e0112011d0113011d0114011c0115011c0116011b0117011b0118011a0119011a011a011a011b011a011c0119011d011901 +1e0119011f01180120011701210117012201160124011401260113012701110127010f0128010e0128010d0128010c0128010c0128010a012701080126010701 +250106012401050122010401200103011e0102011d0102011c0101011a01010118010101170101011501000113010001110100010f01ff000e01ff000c01ff00 +0b01ff000901ff000901ff000801ff000801ff000501fe000301fe000101fd000001fc00fe00fc00fd00fb00fc00fa00fb00f900fb00f800fa00f700fa00f600 +f900f600f900f500f900f500f900f400f900f400f900f300f900f100f900f000f900ef00fa00ee00fa00ed00fb00ec00fb00eb00fc00ea00fd00ea00fd00e900 +fe00e900ff00e800ff00e8000001e7000101e7000201e6000301e6000501e6000601e5000701e5000801e5000901e5000a01e5000b01e5000b01e5000c01e500 +0c01e5000d01e6000d01e6000e01e6000e01e6000f01e6000f01e6001001e6001001e6001101e7001101e7001101e7001201e7001201e8001201e8001201e900 +1201e9001201e9001201e9001101e9001101e9001001ea000f01ea000e01ea000c01ea000b01e9000a01e9000901e9000801e9000801e9000801e8000801e800 +0701e8000701e8000601e7000601e7000501e7000501e8000501e8000401e8000401e8000301e8000201e8000101e9000001ea00ff00eb00fe00ec00fd00ed00 +fd00ee00fc00ef00fc00f000fb00f200fb00f300fc00f400fc00f500fc00f600fd00f700fe00f800ff00f9000001fa000101fa000201fb000301fb000401fc00 +0401fc000501fc000601fc000701fc000701fc000801fd000801fd000801fd000801fd000901fd000a01fd000b01fd000c01fd000d01fd000e01fd000f01fe00 +1001fe001101fe001201fe001401fe001501fe001601fe001701ff001801ff001901ff001901ff001a01ff001b01ff001c01ff001d0100011f01000120010001 +21010101220101012301010124010201250103012701040128010501290107012a0108012a0109012a0109012a010a012b010b012b010d012a010e012a011001 +29011101290112012801130128011401270115012601160125011601250117012401180123011801220119012201190121011a0120011a011f011a011f011b01 +1e011b011d011b011c011b011c011c011b011c011a011c0119011d0118011d0117011d0116011e0115011e0115011e0114011f0113011f011201200111012001 +100121010e0122010d0123010c0125010b0126010b0128010b0129010b012a010b012c0107000000fc0200002c94d9000000040000002d01040004000000f001 +0500ae020000240355010b012b010b012d010c012e010c012f010d0130010e0131010f0131010f0132010f013201100132011101330111013301120134011201 +34011301350114013501150135011501360116013601170136011801370119013701190138011a0138011b0138011c0139011d0139011d013a011e013b011f01 +3b011f013c0120013d0120013d0121013e0121013f01210140012201410122014101220142012201430122014401220144012201440122014501220145012201 +4501210146012101460121014601210147012001470120014701200147011f0147011f0147011f01470120014601200145012001440120014301200142012001 +4201200141012001410120014101200140011f013f011f013e011e013d011d013c011c013b011b013a0119013901180138011701380116013701150137011401 +3601130136011301360113013601100134010e0133010c0131010a01300109012f0109012e0108012d0108012d0108012c0108012b0108012a01080129010801 +280109012601090125010a0124010b0123010b0122010c0121010d0120010e011f010f011e0111011e0112011d0113011d0114011c0115011c0116011b011701 +1b0118011a0119011a011a011a011b011a011c0119011d0119011e0119011f01180120011701210117012201160124011401260113012701110127010f012801 +0e0128010d0128010c0128010c0128010a012701080126010701250105012401040122010301200102011e0102011d0101011c0101011a010101190100011701 +000115010001130100011101ff000f01ff000e01ff000c01ff000b01ff000a01ff000901fe000801fe000801fe000601fe000301fe000201fd000001fc00ff00 +fb00fd00fa00fc00fa00fc00f900fb00f800fa00f700fa00f600fa00f600f900f500f900f500f900f400f900f400f900f300f900f100f900f000fa00ef00fa00 +ee00fb00ed00fb00ec00fc00eb00fc00ea00fd00ea00fd00e900fe00e900ff00e800ff00e8000001e7000101e7000201e6000301e6000501e6000601e5000701 +e5000801e5000901e5000a01e5000b01e5000b01e5000c01e5000c01e5000d01e6000d01e6000e01e6000e01e6000f01e6000f01e6001001e6001001e6001101 +e7001101e7001101e7001201e7001201e8001201e8001201e9001201e9001201e9001201e9001101e9001101e9001001e9000f01e9000e01e9000c01e9000b01 +e9000a01e9000901e9000901e9000801e8000801e8000801e8000701e7000701e7000701e7000601e7000501e7000501e7000501e7000401e7000401e7000301 +e8000201e8000101e9000001e900ff00ea00fe00eb00fd00ec00fc00ee00fc00ef00fb00f000fb00f200fb00f300fb00f400fc00f500fc00f600fd00f700fe00 +f800ff00f900ff00fa000001fa000101fb000201fb000301fc000401fc000501fc000601fc000701fd000701fd000801fd000801fd000801fd000801fd000901 +fd000a01fd000b01fd000c01fd000d01fd000e01fd000f01fe001001fe001101fe001301fe001401fe001501fe001601fe001701ff001801ff001901ff001901 +ff001a01ff001b01ff001c01ff001d0100011f0100012001000121010101220101012301010124010201250103012601040128010501290106012a0108012a01 +08012a0109012a010a012a010b012a010d012a010e012a011001290111012801130127011501250116012401170122011801210119011f011a011e011b011d01 +1b011c011b011b011b011b011b011a011c0119011c0118011c0117011d0116011d0115011e0114011e0113011e0113011f0112011f0111012001100120010e01 +22010d0123010c0124010b0126010b0127010b0129010a012a010b012b0107000000fc02000047aae5000000040000002d01050004000000f00104008e020000 +240345010a012b010b012d010b012e010c012f010d0130010e0131010f0131010f0132010f013201100132011001330111013301120134011201340113013501 +14013501150135011501360116013601170136011801370119013701190138011a0138011b0138011c0139011e013b011f013c0120013d0121013f0121014001 +22014201220144012201440122014401210145012101450121014601200146012001460120014501200144012001430120014201200142012001410120014101 +20014101200141012001400120013f011f013e011e013d011d013c011c013b011b013a011a013901180138011701380116013701150137011401360113013601 +1301360113013601100134010e0133010c0131010b0130010a012f0109012e0109012d0108012d0108012c0108012b0108012a01090129010901270109012601 +090125010a0124010b0123010c0122010c0121010d0120010e011f0110011e0111011e0112011d0113011c0114011c0115011b0116011b0117011b0118011a01 +19011a011a011a011b011a011c0119011d0119011e0119011f01180120011801210117012201160124011401260113012701110128010f0128010e0128010d01 +28010c0128010c0128010a012801080127010701250105012401040122010301200102011e0101011d0101011c0101011a010001190100011701000115010001 +1301ff001101ff001001ff000e01ff000c01fe000b01fe000a01fe000901fe000801fe000801fe000601fe000401fd000201fd000001fc00ff00fb00fe00fa00 +fd00f900fc00f900fb00f800fb00f700fa00f600fa00f600fa00f500fa00f500fa00f400fa00f400fa00f300fa00f100fa00f000fa00ef00fa00ee00fb00ed00 +fb00ec00fc00eb00fc00ea00fd00ea00fe00e900fe00e900ff00e800ff00e8000001e7000101e7000201e6000301e6000501e6000601e5000701e5000801e500 +0901e5000a01e5000b01e5000b01e5000c01e5000c01e5000d01e6000d01e6000e01e6000e01e6000f01e6000f01e6001001e6001001e6001101e7001101e700 +1101e7001201e7001201e8001201e8001201e8001101e9001101e9001101e9001101e9001101e9001001e9000f01e9000e01e9000c01e9000b01e9000a01e900 +0901e8000901e8000801e8000801e8000801e7000801e7000701e7000701e7000601e7000501e7000501e7000401e7000401e7000401e7000301e7000101e800 +0001e800ff00e900fe00ea00fe00eb00fd00ec00fc00ed00fc00ef00fb00f000fb00f100fb00f300fb00f400fb00f500fc00f600fd00f700fe00f800fe00f900 +ff00fa000001fb000101fb000201fc000301fc000401fc000501fc000601fd000701fd000701fd000801fd000801fd000801fd000801fd000901fd000a01fd00 +0b01fd000c01fd000d01fd000e01fe000f01fe001001fe001101fe001301fe001401fe001501fe001601fe001701ff001801ff001901ff001901ff001a01ff00 +1b01ff001c01ff001d0100011f010001200100012101010122010101230101012401020125010301260104012701050128010601290108012a0108012a010901 +2a010a012a010b012a010d012a010e0129011001290111012701130126011401250116012301170122011801210119011f011a011e011a011d011a011c011b01 +1b011b011b011b011a011b0119011c0118011c0117011c0116011d0115011d0114011e0113011e0112011e0111011f0111012001100120010e0121010d012301 +0c0124010b0126010b0127010a0129010a012a010a012b0107000000fc02000063c2f2000000040000002d01040004000000f00105009e02000024034d010a01 +2b010a012d010b012e010c012f010d0130010e0131010e0131010f0132010f013201100132011001330111013301110134011201340113013501140135011401 +35011501360116013601170136011801370118013701190138011a0138011b0138011c0139011e013b011f013c0120013d0121013f0121014001210142012101 +43012101430121014401210144012101440121014501200145012001450120014401200143012101430121014201200141012001410120014101200141012001 +41012001400120013e011f013d011e013d011d013c011c013b011b013a011a013901190138011701380116013701150136011401360114013601130136011301 +3601100134010e0133010c0131010b0130010a012f0109012e0109012d0109012d0109012c0109012b0109012a010901280109012701090126010a0125010a01 +24010b0123010c0122010d0121010e0120010f011f0110011e0111011e0112011d0113011c0114011c0115011b0116011b0117011b0118011a0119011a011a01 +1a011b011a011c0119011d0119011e0119011f01180120011801210117012201160124011501260113012701110128010f0128010e0128010d0128010c012801 +0c0128010a012801080127010601260105012401040122010301210102011f0101011e0101011c0100011b010001190100011701ff001501ff001301ff001101 +ff001001fe000e01fe000c01fe000b01fe000a01fe000901fe000801fe000801fe000601fd000401fd000201fc000001fc00ff00fb00fe00fa00fd00f900fc00 +f800fc00f800fb00f700fb00f600fa00f600fa00f500fa00f500fa00f400fa00f400fa00f300fa00f100fa00f000fa00ef00fb00ee00fb00ed00fb00ec00fc00 +eb00fc00ea00fd00ea00fe00e900fe00e900ff00e800ff00e8000001e7000101e7000201e6000301e6000501e6000601e5000701e5000801e5000901e5000a01 +e5000b01e5000b01e5000c01e5000c01e5000d01e6000d01e6000e01e6000e01e6000f01e6000f01e6001001e6001001e6001101e7001101e7001101e7001201 +e7001201e8001201e8001201e8001101e8001101e8001101e8001101e8001001e8001001e8000f01e8000e01e8000c01e8000b01e8000a01e8000901e8000901 +e8000801e8000801e7000801e7000801e7000701e7000701e6000601e6000501e6000501e7000401e7000401e7000401e7000301e7000101e7000001e800ff00 +e900fe00ea00fd00eb00fd00ec00fc00ed00fc00ef00fb00f000fb00f100fb00f300fb00f400fb00f500fc00f600fc00f700fd00f800fe00f900ff00fa000001 +fb000101fb000201fc000301fc000401fc000501fd000601fd000701fd000701fd000801fd000801fd000801fd000801fd000901fd000a01fd000b01fd000c01 +fd000d01fd000e01fe000f01fe001001fe001101fe001301fe001401fe001501fe001601fe001701ff001801ff001901ff001901ff001a01ff001b01ff001c01 +ff001d0100011f01000120010001210101012201010123010101240102012501030126010401270105012801060129010801290108012901090129010a012901 +0b0129010c0129010e0129010f01280111012701130126011401250116012301170122011801210119011f0119011e011a011d011a011c011a011b011a011b01 +1b011a011b0119011b0118011c0117011c0116011c0115011d0114011d0113011e0112011e0111011e0110011f010f0120010f0120010e0121010d0122010c01 +22010c0123010b0124010b0125010b0125010a0126010a0127010a0128010a0129010a0129010a012a010a012b010a012b0107000000fc0200007fd9ff000000 +040000002d01050004000000f00104009e02000024034d011101e8001101e8001201e8001201e8001201e7001101e7001101e7001101e7001001e6001001e600 +0f01e6000f01e6000e01e6000e01e6000d01e6000d01e6000c01e5000c01e5000b01e5000b01e5000a01e5000901e5000801e5000701e5000601e5000501e600 +0301e6000201e6000101e7000001e700ff00e800ff00e800fe00e900fe00e900fd00ea00fd00ea00fc00eb00fc00ec00fb00ed00fb00ee00fb00ef00fa00f000 +fa00f200fa00f300fa00f400fa00f400fb00f500fb00f500fb00f600fb00f600fb00f700fc00f800fd00f800fd00f900fe00fa00ff00fb000101fb000201fc00 +0401fd000601fd000801fe000901fe000901fe000a01fe000b01fe000c01fe000e01fe001001fe001201fe001301ff001501ff001701ff001901ff001b010001 +1c0100011e0100011f01000121010101230102012401030126010501270106012801080128010a0129010c0129010c0129010d0128010e0128010f0127011101 +26011301240115012201160121011701200118011f0118011e0119011d0119011c0119011b011a011a011a0119011a0118011a0117011b0116011b0115011b01 +14011c0113011c0112011d0111011e0110011e010f011f010e0120010d0121010c0122010b0123010a0124010a01250109012601090127010901280109012901 +09012b0109012c0109012d0109012d0109012d010a012e010b0130010d0131010e01330111013401130135011401360114013601150136011601360117013701 +18013701190138011a0139011b013a011c013a011e013b011e013c011f013d0120013e0120013f01200140012001400120014101200141012101410121014101 +2101420121014201210143012101430121014401210144012101440121014301210143012101430121014301210141012101400120013f0120013d011f013c01 +1e013a011c0139011b0138011a013801190138011801370118013701170136011601360115013601140135011401350113013501120134011101340111013401 +100133010f0133010f0132010f0132010e0131010d0131010c0130010c012f010b012e010a012d010a012b010a012b010a012a010a0129010a0129010a012801 +0a0127010a0126010a0125010b0124010b0123010c0123010c0122010d0121010e0120010e0120010f011f0110011f0111011e0112011e0113011d0114011d01 +15011c0116011c0117011b0118011b0119011b011a011b011a011a011b011a011c011a011d011a011e0119011f01190120011801220117012301170124011501 +26011401270112012801110128010f0129010e0129010c0129010b0129010a012901090129010801290108012801060127010501260103012501030124010201 +230101012201010121010101200100011f0100011d0100011c01ff001b01ff001a01ff001901ff001901ff001801ff001701ff001601fe001501fe001401fe00 +1301fe001201fe001001fe000f01fe000e01fe000d01fd000c01fd000b01fd000a01fd000901fd000801fd000801fd000801fd000801fd000701fd000701fd00 +0601fd000501fd000401fd000301fc000201fc000101fb000001fb00ff00fa00fe00f900fd00f800fc00f700fc00f600fb00f500fb00f400fb00f300fb00f100 +fb00f000fb00ee00fc00ed00fd00ec00fd00eb00fe00ea00ff00e9000001e8000101e7000201e7000401e6000401e6000401e6000501e6000501e6000601e600 +0701e6000701e6000801e7000801e7000801e7000801e7000901e7000901e8000a01e8000b01e8000c01e8000e01e8000f01e8001001e8001001e8001101e800 +1101e8001101e8001101e800040000002d01020004000000f0010500040000002d010300be02000024035d012901170129011701280118012701190126011a01 +25011b0124011c0123011c0121011d0120011e011f011e011e011f011d011f011c011f011b0120011b0120011a0120011a0120011a0120011901200118012101 +16012101150122011301230112012401100125010f0126010f0126010f0127010e0128010d012a010d012b010d012c010d012e010e012f010f0131010f013101 +0f013101100132011101330111013301120134011301340113013501140135011501350116013601170136011701370118013701190137011a0138011b013801 +1b0138011c0139011d013a011e013a011e013b011f013c0120013d0120013d0121013e0121013f01220140012201410122014201220144012301450122014601 +22014701220147012101490120014b011e014d011c014e011b01500119015101180151011801510118014d0118014d011a014c011b014b011c0149011d014801 +1e0147011e0146011f0145011e0144011e0143011e0142011d0141011d0140011c013f011b013e011b013e011a013d011a013d0119013d0119013d0118013c01 +18013c0117013c0116013b0115013b0115013b0114013a0113013a011201390111013901100138010f0137010e0137010d0136010d0136010c0135010b013401 +0a0134010a01330109013201090131010801300108012e0108012d0108012c0108012b0108012a010801280108012701090126010a0124010a0124010a012301 +0b0122010c0121010d0120010e011f010f011f0110011e0111011d0113011d0114011c0115011c0116011b0117011b0118011a0119011a011a011a011a011a01 +1a011a011b0119011c0119011d0119011e0118011f01180120011701210117012201160123011501240114012401140125011301250112012601100126010f01 +26010f0126010d0125010b012301090122010801200107011e0106011c0106011b0105011b0105011a0105011901050118010501170105011601050114010401 +1301040112010401100104010f0104010e0103010d0103010b0103010b0103010a01030109010301090103010901030108010201070102010601020105010201 +0301010102010101010100010001ff00fe00ff00fd00fe00fc00fd00fb00fb00fa00fa00fa00f800f900f700f900f700f900f500f900f300f900f200f900f000 +f900ef00f900ee00fa00ed00fb00ec00fb00eb00fc00ea00fd00e900fe00e900fe00e800ff00e8000001e7000101e7000101e7000201e6000301e6000501e600 +0601e5000701e5000801e5000901e5000a01e5000a01e5000b01e5000b01e5000c01e5000c01e5000d01e6000d01e6000e01e6000e01e6000e01e6000f01e600 +0f01e6001001e6001001e6001101e7001101e7001101e7001201e7001201e7001201e8001201e8001201e9001201e9001201ea001201ea001201eb001201eb00 +1201eb001101eb001101eb001001eb001001ec000f01ec000e01ec000e01ec000d01ec000d01ec000c01ec000c01ec000b01ec000a01ec000a01ec000901ec00 +0801ec000801ec000801ec000701ec000701ec000601ec000601eb000501eb000501eb000501eb000401eb000401eb000401eb000201eb000101ec000001ed00 +ff00ee00fe00f000fe00f200fe00f400fe00f400ff00f6000001f8000101f9000201fa000401fb000501fb000601fc000801fc000801fc000801fc000901fd00 +0a01fd000b01fd000c01fd000d01fd000e01fd000f01fe001101fe001201fe001301fe001401fe001601fe001701ff001801ff001901ff001901ff001901ff00 +1a01ff001b01ff001c01ff001d0100011f010001200100012101010121010101220101012301010124010201250103012601040127010501290106012a010701 +2b0109012c010a012c010c012c010e012c0110012c0112012b0115012901170107000000fc0200000066bf000000040000002d010400040000002d0101008a00 +00002403430014014f011401500114015001130150011201510112015201110152011001530110015401100154010f0154010f0155010f0156010f0157010f01 +58010f0159010f015a010f015b010f015c010f015c0110015d0111015e0111015f01120160011301600114016101160162011701630118016401190166011901 +67011901690117016b0117016d0118016d0118016d0119016c011a016c011a016a011b0169011b0167011b0165011b0165011b0165011b0164011b0164011a01 +630119016201190161011701600116015f0115015e0114015d0113015c0112015b0112015a011201590112015701120157011201570112015701120156011301 +560113015501140155011401540114014f0107000000fc020000000d66000000040000002d01050004000000f001040048000000240322001901680119016701 +19016601180164011701630116016201150162011401610113016001130160011201600112015f0112015f0111015f0111015e0111015e0110015e0111015e01 +11015e0111015e0112015f0113015f01140160011501600116016101170161011701620118016301190164011901650119016501190166011901670119016801 +4a0000002403230014015201140154011401550113015501130156011201560112015701120157011201570112015701120158011201590112015a0112015b01 +12015b0113015c0113015c0114015d0113015d0113015c0112015c0112015b0111015b0111015a01110159011101580111015601110155011101550112015401 +120154011301530113015301130152011401520107000000fc02000042b0e8000000040000002d01040004000000f0010500c000000024035e001b0165011b01 +65011b0164011b0164011a0163011a016301190162011901610117016001170160011701600117015f0116015f0116015f0116015f0115015f0115015e011401 +5e0114015d0113015d0113015d0112015c0112015c0112015c0111015b0111015b0110015a011001590110015901100158011001570110015701100156011001 +5601100155011001550110015501100154011101530112015301120152011301510114015101140151011401510114014f011401500114015001130150011201 +5101120152011101520110015301100154011001540110015401100155010f0155010f0156010f0156010f0157010f0158010f0158010f0158010f0159010f01 +5a0110015a0110015b0111015c0112015d0113015d0114015e0115015f01160160011801610119016201190163011a0163011a0164011a0164011a0165011a01 +66011a0167011a0168011a01690119016a0119016a01190169011a0169011a0169011a0168011b0167011b0166011b016501040000002d01020004000000f001 +0400040000002d0103009a00000024034b0014014f0114014f011401500114015001130150011201510112015201110152011001530110015401100154011001 +54010f0154010f0155010f0156010f0157010f0158010f0159010f015a010f015a010f015b010f015c010f015c0110015d0111015e0111015f01120160011301 +6001130160011401610116016201170163011801640119016601190167011901690117016b0117016d0117016d0118016d0118016d0119016c011a016c011a01 +6a011b0169011b0167011b0165011b0165011b0165011b0165011b0164011b0164011a0163011901620119016101170160011701600116015f0115015e011401 +5d0113015c0112015b0112015a01120159011201570112015701120157011201570112015701120156011301560113015501140155011401540114014f01040000002701ffff030000000000}}{\insrsid6909422 +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par +\par +\par \sect }\sectd \sbknone\pgnrestart\linex0\endnhere\titlepg\sectdefaultcl\sftnbj {\footer \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\chpgn +\par +\par }}\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par +\par +\par }\pard \s53\qj \li0\ri12\sa80\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\b\fs48\insrsid6909422 Description of the STIR implementation of FBP 3DRP }{\insrsid6909422 +\par }\pard \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\insrsid6909422 +\par Authors: Claire Labb\'e9, Habib Zaidi, Christian Morel. (H\'f4pital Cantonal de Gen\'e8ve) +\par }{\insrsid15669153 (updated by Kris Thielemans, Hammersmith Imanet Ltd) +\par }{\insrsid6909422 +\par +\par Version 0.9}{\insrsid15669153 1}{\insrsid6909422 +\par }{\insrsid15669153 \sect }\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\footer \pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par +\par }}\pard\plain \s22\qj \li0\ri580\sb120\sa120\sl220\slmult0\widctlpar\tx580\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin0\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field\fldedit{\*\fldinst {\insrsid6909422 + TOC \\o "1-3" \\h \\z }}{\fldrslt {\field\fldedit{\*\fldinst {\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164560"}{ +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360030000000}}}{\fldrslt {\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 1}{ +\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 INTRODUCTION}{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst +{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164560 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360030000000}} +}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 3}}}}}{\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }{\field\fldedit{\*\fldinst {\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164561"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 + }{\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360031000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2}{\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 +Description of 3DRP}{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164561 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360031000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 3}}}}}{ +\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }\pard\plain \s21\qj \li300\ri580\sb120\sa120\sl220\slmult0\widctlpar\tx1040\tqr\tldot\tx9340\aspalpha\aspnum\faauto\adjustright\rin580\lin300\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field\fldedit{\*\fldinst { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164562"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360032000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.1}{\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 +Overview of the 3DRP Reconstruction Algorithm}{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164562 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 +{\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360032000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 3}}}}}{ +\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }{\field\fldedit{\*\fldinst {\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164563"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 + }{\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360033000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.2}{\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 +More details on 3DRP}{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164563 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360033000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 4}}}}}{ +\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }{\field\fldedit{\*\fldinst {\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164564"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 + }{\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360034000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.3}{\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 Colsher Filter} +{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164564 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360034000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 6}}}}}{ +\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }\pard\plain \s20\qj \li840\ri580\sa120\sl220\slmult0\widctlpar\tx1540\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin840\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field\fldedit{\*\fldinst { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164565"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360035000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.3.1}{\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 Algorithm}{ +\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164565 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360035000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 6}}}}}{ +\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }{\field\fldedit{\*\fldinst {\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164566"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 + }{\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360036000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.3.2}{\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 +Implementation of the Colsher filter}{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164566 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 +{\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360036000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 8}}}}}{ +\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }\pard\plain \s21\qj \li300\ri580\sb120\sa120\sl220\slmult0\widctlpar\tx1040\tqr\tldot\tx9340\aspalpha\aspnum\faauto\adjustright\rin580\lin300\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field\fldedit{\*\fldinst { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164567"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360037000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.4}{\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 +Forward Projection}{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164567 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360037000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 8}}}}}{ +\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }\pard\plain \s20\qj \li840\ri580\sa120\sl220\slmult0\widctlpar\tx1540\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin840\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field\fldedit{\*\fldinst { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164568"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360038000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.4.1}{\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 Description}{ +\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164568 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360038000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 8}}}}}{ +\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }{\field\fldedit{\*\fldinst {\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164569"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 + }{\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360039000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 2.4.2}{\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 +Extending the effective axial length of the scanner (rmin and rmax)}{\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164569 \\h }{ +\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500360039000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 8}}}}}{ +\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }\pard\plain \s22\qj \li0\ri580\sb120\sa120\sl220\slmult0\widctlpar\tx580\tqr\tldot\tx9320\aspalpha\aspnum\faauto\adjustright\rin580\lin0\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field\fldedit{\*\fldinst { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{\lang1024\langfe1024\noproof\insrsid15669153 HYPERLINK \\l "_Toc89164570"}{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 }{ +\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500370030000000}}}{\fldrslt { +\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 3}{\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 \tab }{\cs82\ul\cf2\lang1024\langfe1024\noproof\insrsid15669153\charrsid14963900 REFERENCES}{ +\lang1024\langfe1024\noproof\webhidden\insrsid15669153 \tab }{\field{\*\fldinst {\lang1024\langfe1024\noproof\webhidden\insrsid15669153 PAGEREF _Toc89164570 \\h }{\lang1024\langfe1024\noproof\insrsid6909422 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000d0000005f0054006f006300380039003100360034003500370030000000}}}{\fldrslt {\lang1024\langfe1024\noproof\webhidden\insrsid6909422 10}}}}}{ +\b0\f0\fs24\lang1024\langfe1024\noproof\langnp2057\langfenp2057\insrsid15669153 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 }}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\expnd-2\expndtw-10\up6\insrsid6909422 \sect }\sectd \sbknone\linex0\headery1077\footery1077\colsx709\endnhere\sectdefaultcl\sftnbj {\footer \pard\plain \ql \li0\ri0\widctlpar +\tqc\tx4800\tqr\tx9920\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\insrsid6909422 \tab \tab }{\insrsid6909422 \chpgn }{\b\insrsid6909422 +\par }}{\listtext\pard\plain\s1 \b\f4\up6\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af4\dbch\af0\loch\f4 1\tab}\pard\plain \s1\qj \fi-432\li432\ri12\sb220\sa220\sl360\slmult0\keep\keepn\widctlpar +\jclisttab\tx432\tx560\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin12\lin432\itap0 \b\f4\fs24\up6\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \page {\*\bkmkstart _Toc89164560}INTRODUCTION{\*\bkmkend _Toc89164560} +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab +The reprojection algorithm of Kinahan and Rogers, so called 3DRP (3D Reprojection), or PROMIS (PROjection MISsing data) in the commercial implementation of C +TI, is the most widely used 3D reconstruction algorithm. This algorithm is based on an exact method whereby the data incompleteness inherent in the 3D acquisition method is addressed by forward projection. The objective of this document is to explain the +3DRP reconstruction algorithm and give some details on the implementation in STIR. +\par This document is essentially a cut-down version of Deliverable 4.2 of the PARAPET project, with some minor modifications by Kris Thielemans. It lacks details on the actual implementation, a description of the parameters etc. +\par {\*\bkmkstart _Toc89164561}{\listtext\pard\plain\s1 \b\f4\up6\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af4\dbch\af0\loch\f4 2\tab}}\pard\plain \s1\qj \fi-432\li432\ri12\sb220\sa220\sl360\slmult0\keep\keepn\widctlpar +\jclisttab\tx432\tx560\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin12\lin432\itap0 \b\f4\fs24\up6\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Description of 3DRP{\*\bkmkend _Toc89164561} +\par }\pard\plain \s54\qj \fi-567\li567\ri12\sl-20\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin567\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par {\*\bkmkstart _Toc89164562}{\listtext\pard\plain\s2 \b\f4\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af4\dbch\af0\loch\f4 2.1\tab}}\pard\plain \s2\qj \fi-576\li576\ri12\sa80\sl360\slmult0\widctlpar +\jclisttab\tx576\tx680\aspalpha\aspnum\faauto\ls2\ilvl1\outlinelevel1\adjustright\rin12\lin576\itap0 \shading1000 \b\f4\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Overview of the 3DRP Reconstruction Algorithm +{\*\bkmkend _Toc89164562} +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab +Three-dimensional reconstruction is complicated by the fact that all the oblique 2D projections (corresponding in a multi-ring scanner to coincidences with a ring difference larger than one) are incompletely measured due to the finite length of the scanne +r (Figure II.1). +\par +\par }\pard\plain \s62\qc \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid3752688 +{\pict{\*\picprop\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw14746\pich11924\picwgoal8360\pichgoal6760\wmetafile8\bliptag-1925426868\blipupi120{\*\blipuid 8d3c514c48c60a37981a14b5ecb495b6} +01000900000304830200070030d200000000050000000b0200000000050000000c025201a2010500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff00000000000008000000fa020600020000000000 +0000040000002d010000050000001402be006b01050000001302be00760107000000fc020000ffffff000000040000002d01010008000000fa02060001000000 +00000000040000002d01020004000000f00100000e000000240305006201bd006e01c3006a01bd006e01b7006201bd0008000000fa0206000200000000000000 +040000002d010000050000001402be007601050000001302d0007601050000001402fd006b01050000001302fd007601040000002d01020004000000f0010000 +0e000000240305006201fc006e0102016a01fc006e01f6006201fc0008000000fa0206000200000000000000040000002d01000005000000140283006b010500 +0000130283009001040000002d01020004000000f00100000e00000024030500620182006e0188006a0182006e017c006201820008000000fa02060002000000 +00000000040000002d01000005000000140283009001050000001302d00090010500000014023101900105000000130231016b01040000002d01020004000000 +f00100000e00000024030500620130016e012a016a0130016e013601620130010500000007010300000030d20000430f2000cc000000a700d600000000004a00 +4d000200160128000000d6000000a7000000010018000000000000000000eb0a0000eb0a00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000003800003800003800003800003800003800003e00004400004400004400004400004400004400004400004400004400 +004400004400004400004400004900004900004e00005400005400005400005900005900005400005400004e00004e00004e00004900004400003e00003e0000 +3e000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000 +00003800003800003800003800003800003800003800003800003800000000003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000 +00000000000038000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038 +00003800003800003800000000000000000000003800003800003800003800003800003800003800003800003e00003e00003e00003e00003e00004400003e00 +003e00003e0000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000 +3800000000000000000000000000003800003800003800003800003800004900005400005f00006b000071000076000076000076000076000076000076000076 +00007100007100007100007100007600007c00008200008800009300009300009800009d00009d00009800009800008d00008800008800007c00007100006b00 +006500006500005f00005f00005f00005900005400004e00004400003e0000380000380000380000380000000000000000000000000000000000000000000000 +0000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003e00003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800004400004e00005400005f00006500006500006b00006b00006b000071 +00006b00006b00006500005f00005400005400004e00004900003e00003800003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800004900005900006b00007c00008800008d0000980000980000980000980000980000 +9800009800009300009300009300009300009800009d0000a90001af0011ba0011ba0018c00020c60027cc0020c60018c00009b50000a90000a900009d000093 +00008d00008800008200007c00007600007600007600006b00006500005900004e00004400004400003800003800003800000000000000000000000000000000 +000000003800003800003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003e00003e0000440000440000440000 +3e00003e00003e00003800003800003800003800003800003e00003e00004400004400004400004400003e000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +003e00003e00003800003800003800003800003800003800003800003800003800004900004900005400005f00006b00007100007c0000820000820000820000 +8800008800008200008200007c00007100006b00006b00005f00005400004e00004400003e000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800004400004400005900006b0000820000930000a30001af0011ba0011ba0011ba0011ba00 +11ba0011ba0011ba0009b50009b50009b50009b50011ba0018c00027cc0036d70044e20044e20053ed0053ed005af30053ed004be7003edd002fd2002fd20018 +c00009b50001af0000a300009d00009800009300009300008d00008200007c00006b00005f00004e00004e000044000038000038000038000000000000000000 +00000000000000003800003800003800003e00004400004400004400004400003e00003800003800003800003800003800003e00004400004900004e00004e00 +004e00004900004900004400003e00003e00003800003e00004400004400004400004900004900004e00004900004400003e0000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e000044 +00004400004400004400004400003e00003e00003800003800003800003800003800004400005400005400005f00007100007c00008800009300009800009800 +009800009d00009d00009800009800008d00008800007c00007c00007100006500005900004e00004900004400004400003e0000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800004900004900005f0000710000880000980000a90009b50018c00018c00018c0 +0020c60018c00018c00018c00018c00018c00018c00018c00020c60027cc0036d7003edd004be7004be70053ed005af3005af30053ed004be70044e20036d700 +36d70027cc0018c00011ba0001af0000a90000a300009d00009d00009800008d00008800007600006b00005900005900004e00003e0000380000380000380000 +0000000000000000000000003800003800003800003800003e00003e00003e00003e00003800003800003800003800003800003800003e000044000049000049 +00004900004900004400004400003e00003800003800003800003800003e00003e00003e00004400004400004400004400003e00003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000 +3e00003e00004400004400004400003e00003e00003e00003800003800003800003800003e00004400004e00004e00005f00006b00007c00008200008d00008d +00009300009300009300009300008d00008800008200007c00007100007100006b00005f00005900004e00004900004400004400003e00003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003e00004e00004e00006500007600008d00009d0001af0011ba0020c60020 +c60020c60027cc0027cc0027cc0027cc0027cc0027cc0027cc0027cc002fd20036d7003edd0044e2004be7004be70053ed005af3005af30053ed0053ed0044e2 +003edd003edd0036d70027cc0020c60011ba0009b50001af0000a90000a90000a300009800009300008200007600006500006500005900004900003e00003800 +003800003800000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000440000 +4400004400004900004400003e00003e00003800003800003800003800003800003800003800003800003800003e00003e000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003e00004400004e00004e00005900006b00007600007c0000 +8800008800008800008800008800008800008200007c00007600007100006b00006b00005f00005900005400004e00004900004400004400003e000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00004e00006500007600008d00009d0001af0011ba00 +20c60020c60020c60027cc0027cc0027cc0027cc0027cc0027cc0027cc0027cc002fd20036d7003edd0044e2004be7004be70053ed005af3005af30053ed0053 +ed0044e2003edd003edd0036d70027cc0020c60011ba0009b50001af0000a90000a90000a300009800009300008200007600006500006500005900004900003e +00003800003800003800000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +004400004400004400004900004400003e00003e00003800003800003800003800003800003800003800003800003800003e00003e0000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003e00004400004e00004e00005900006b00007600 +007c00008800008800008800008800008800008800008200007c00007600007100006b00006b00005f00005900005400004e00004900004400004400003e0000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800004400005900005900006b0000820000930000a30009b5 +0018c00027cc0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d70036d7003edd003edd0044e2004be7004be70053ed0053ed0053ed00 +53ed004be70044e20044e20044e20036d7002fd20027cc0020c60018c00011ba0001af0001af0000a900009d00009800008d00007c00007100007100005f0000 +54000049000038000038000038000038000038000038000000000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003e00004400004400004400004400003e00003e00003e00003800003800003800003e00003e00003e00003e00004400004400004400004400003e00 +003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003e00003e00003e00004400004400003e00003e00003e00003800003800003800003e00004400004e00004e000059000065 +00007100007600007c00007c00007c00007c00007600007600007100006b00006500006500005f00005f00005900005400004e00004e00004900004400004400 +003e0000380000380000380000380000380000380000380000000000000000000000000000000000380000380000380000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004900005f00005f0000710000880000980000 +a90011ba0020c6002fd2002fd2002fd20036d70036d7003edd003edd003edd003edd003edd003edd003edd003edd0044e20044e20044e20044e2004be7004be7 +004be7004be7004be7004be70044e20044e2003edd0036d7002fd20027cc0020c60018c00011ba0011ba0001af0000a900009d00009300008800007600007600 +006b00005f00004e0000440000380000380000380000380000380000000000000000000000000000380000380000380000380000380000380000380000380000 +3800003800003800003800003e00003e00004400003e00003e00003e00003e00003e00003e000044000044000049000049000049000049000049000049000049 +00004900004400004400004400003e00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003e00003e00004400004400004400004400004400003e00003e00003e00003e00004400004400004e00004e0000 +5900005f00006b00007100007100007100007100007100006b00006500005f00005900005900005400005400005400004e00004e00004e000049000049000044 +00004400003e00003e00003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400004e00006500006500007600008d00 +00a30001af0018c00027cc0036d70036d70036d7003edd003edd0044e20044e20044e20044e20044e20044e20044e20044e2003edd003edd003edd003edd003e +dd0044e20044e20044e20044e20044e20044e20044e20044e2003edd0036d7002fd20027cc0020c60011ba0011ba0009b50000a90000a300009800008d000082 +00008200007100006500005400004900003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800003e00003e00004400004400004400004400004400004900004900004e0000540000540000590000590000590000590000 +5900005400005400005400004e00004e00004e000049000044000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003e00003e00003e00004400004900004900004900004900004900004400004400004400003e00004400004900004e00 +004e00005900005f00006500006500006b00006500005f00005f00005900005400004e00004e0000490000490000490000490000490000490000490000440000 +4400004400004400003e000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400005400006b00006b00007c +0000930000a90009b50020c6002fd2003edd003edd003edd0044e2004be7004be7004be7004be7004be7004be7004be70044e20044e2003edd003edd0036d700 +36d70036d70036d70036d7003edd003edd0044e20044e20044e20044e20044e2003edd0036d7002fd20020c60018c00018c00011ba0001af0000a300009d0000 +9300008800008800007600006b00005900004e00003e000038000038000038000000000000000000000000000000000000000000000000000000000000000000 +00000000000000003800003800003800003800003800003e00004400004400004900004900004e00005400005900005f00005f00006500006500006500006500 +006500006500006500006500005f00005f00005f00005900005400004e00004400003e0000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003e00003e00004400004900004900004e00004e00004e00004e000049000049000044000044000049000049 +00004e00004e00005400005900005f00005f00005f00005900005400005400004e00004400004400003e00003e00003e00003e00003e00003e00003e00004400 +004400004400003e00003e00003e0000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000490000590000710000 +710000820000980001af0011ba0027cc0036d7003edd003edd0044e2004be7004be70053ed004be7004be7004be7004be7004be70044e2003edd003edd0036d7 +002fd2002fd2002fd2002fd2002fd20036d70036d70036d7003edd003edd003edd003edd0036d7002fd20027cc0020c60011ba0011ba0009b50000a90000a300 +009800008d00008200008200007600006b00005900004e00003e0000380000380000380000000000000000000000000000000000000000000000000000000000 +0000000000000000000000003800003800003800003800004400004900004e00005400005900005900005f00006500007100007600007c000082000082000082 +00008200008200008200007c00007c00007600007600007600007100006b00005f00005400004e00004400004400003e00003800003800003800003800003800 +003800003800003800003800003800003800003800003e00004400004400004900004900004e00004e00004e00004e00004e0000490000490000490000440000 +4900004900004e00004e00005400005400005900005900005400004e00004900004900004400003e000038000038000038000038000038000038000038000038 +00003e00003e00003e00003e00003e00003e00003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004e00005f00 +007600007600008800009d0009b50018c0002fd20036d70044e20044e2004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be70044e2003edd0036 +d7002fd20027cc0027cc0027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd20027cc0020c60018c00011ba0011ba0001af0000a9 +00009d00009800008d00008200008200007600006b00005900004e00003e00003800003800003800000000000000000000000000000000000000000000000000 +000000000000000000000000003800003800003800003800003e00004900005400005900005f00006b00006b00007600007c00008800008d0000930000980000 +9d00009d00009d00009800009800009800009300009300008d00008d00008800008200007600006b00005900004e00004e00004900003e00003e000038000038 +00003800003800003800003800003800003800003800003e00003e00004400004400004900004e00004e00005400005400004e00004e00004e00004900004900 +004400004900004900004e00004e00004e00005400005400005400004e00004900004400004400003e0000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e +00005f00007600007600008d0000a30009b50020c60036d7003edd004be7004be7004be70053ed0053ed0053ed0053ed0053ed0053ed0053ed004be70044e200 +3edd0036d7002fd20027cc0027cc0020c60020c60020c60020c60027cc0027cc0027cc0027cc0027cc0027cc0027cc0020c60018c00011ba0009b50009b50001 +af0000a300009d00009300008800007c00007c00007100006500005900004900003e000038000038000038000000000000000000000000000000000000000000 +00000000000000000000000000000000003800003800003800003e00004900005900005f00006b00007600007c00007c0000880000930000980000a30000a900 +01af0001af0001af0001af0001af0000a90000a90000a300009d00009d00009d00009800009300008800007c00007100005f00005f00005900004e0000490000 +4400003e00003e00003800003800003800003800003800003e00003e00004400004900004900004e00004e00005400005400005400005400005400004e000049 +00004900004400004400004900004900004900004e00004e00005400004e00004900004400003e00003e00003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3e00004e00006500007c00007c0000930000a30011ba0027cc0036d70044e2004be7004be70053ed005af3005af3005af3005af30053ed0053ed0053ed004be7 +0044e2003edd0036d7002fd20027cc0027cc0020c60020c60018c00018c00020c60020c60020c60020c60020c60020c60020c60018c00011ba0011ba0001af00 +01af0000a90000a300009800008d00008800007c00007c00007100006500005400004900003e0000380000380000380000000000000000000000000000000000 +0000000000000000000000000000000000003800003800003e00003e00004900005900006500007100007c0000880000930000930000980000a30001af0011ba +0018c00020c60020c60020c60020c60018c00011ba0011ba0009b50001af0001af0001af0000a90000a300009800008d00008200007600007600006b00005f00 +005400004e00004900004400003e00003e00003e00003e00003e00003e00003e00004400004900004900004e0000540000540000540000540000540000540000 +4e00004900004900004400004400004900004900004900004e00004e00004e00004900004900003e000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003e00004e00006500007c00007c0000930000a30011ba0027cc0036d70044e2004be7004be70053ed005af3005af3005af3005af30053ed0053ed0053 +ed004be70044e2003edd0036d7002fd20027cc0027cc0020c60020c60018c00018c00020c60020c60020c60020c60020c60020c60020c60018c00011ba0011ba +0001af0001af0000a90000a300009800008d00008800007c00007c00007100006500005400004900003e00003800003800003800000000000000000000000000 +000000000000000000000000000000000000000000003800003800003e00003e00004900005900006500007100007c0000880000930000930000980000a30001 +af0011ba0018c00020c60020c60020c60020c60018c00011ba0011ba0009b50001af0001af0001af0000a90000a300009800008d00008200007600007600006b +00005f00005400004e00004900004400003e00003e00003e00003e00003e00003e00003e00004400004900004900004e00005400005400005400005400005400 +005400004e00004900004900004400004400004900004900004900004e00004e00004e00004900004900003e0000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003e00004e00006500007c00007c0000930000a90011ba0027cc003edd0044e20053ed0053ed0053ed005af3005af3005af3005af3005af300 +5af30053ed0053ed004be70044e2003edd0036d7002fd2002fd20027cc0020c60018c00018c00018c00018c00018c00018c00018c00018c00018c00011ba0011 +ba0009b50001af0001af0000a900009d00009300008d00008200007600007600006b00005f00005400004900003e000038000038000038000000000000000000 +00000000000000000000000000000000000000000000000000003800003800004900004900005900006b0000760000820000930000980000a30000a30001af00 +11ba0018c00027cc0027cc002fd2002fd2002fd2002fd20027cc0020c60020c60018c00011ba0011ba0011ba0009b50001af0000a900009d0000930000880000 +8800007c00007100006500005f00005400004e00004900004900004400004400003e00003e00004400004900004900004900004e000054000054000054000054 +00004e00004e00004e00004900004400004400004400004400004900004900004900004e00004e00004900004900003e00003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd004be70053ed0053ed005af3005af3005af3005af3005af3 +005af3005af3005af30053ed004be7004be7003edd0036d7002fd2002fd20027cc0020c60018c00018c00011ba0011ba0011ba0011ba0011ba0011ba0011ba00 +11ba0009b50001af0000a90000a90000a300009800009300008800007c00007100007100006500005900004e0000440000380000380000380000380000000000 +0000000000000000000000000000000000000000000000000000003800003800004400005400005400006b00007c00008d0000980000a30001af0011ba0011ba +0018c00027cc002fd2003edd003edd0044e20044e20044e2003edd0036d70036d7002fd20027cc0020c60020c60020c60020c60018c00011ba0009b50000a900 +009d00009d00009300008800007600006b00006500005900004e00004e00004900004400004400004400004400004900004e00004e00004e0000540000540000 +5400005400004e00004e00004900004400004400003e00004400004400004400004400004900004900004900004900004400003e000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +00380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000 +000000000000003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd004be70053ed0053ed005af3005af3005af3005a +f3005af3005af3005af3005af30053ed0053ed004be70044e2003edd0036d70036d7002fd20027cc0020c60020c60018c00018c00018c00018c00018c00018c0 +0018c00011ba0011ba0009b50000a90000a90000a300009800008d00008800007c00007100007100006500005900004e00004400003800003800003800003800 +00000000000000000000000000000000000000000000000000000000380000380000440000540000650000650000760000880000980000a30009b50011ba0020 +c60020c60027cc0036d7003edd003edd0044e20044e2003edd003edd003edd0036d7002fd20027cc0020c60020c60020c60020c60020c60020c60018c00011ba +0009b50001af0001af0000a300009800008800007c00007100006500005900005900005400004e00004900004900004900004e00005400005400005400005900 +005900005900005900005400005400004e00004900004400003e00004400004400004400004400004900004900004900004900004400003e0000380000380000 +38000038000038000038000038000038000038000038000000000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000 +00000000000000000000003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd0044e20053ed0053ed005af3005af300 +5af3005af3005af3005af3005af3005af3005af30053ed0053ed004be70044e2003edd003edd0036d7002fd20027cc0027cc0020c60020c60020c60020c60020 +c60020c60018c00018c00011ba0009b50001af0001af0000a300009800008d00008200007600006b00006b00005f000054000049000044000038000038000038 +00003800003800000000000000000000000000000000000000000000003800003800003e00004e00005f0000710000710000880000980000a90009b50018c000 +20c6002fd2002fd20036d7003edd0044e20044e20044e20044e2003edd003edd0036d7002fd20027cc0020c60018c00018c00018c00018c00020c60020c60020 +c60020c60018c00011ba0011ba0009b50000a900009800008d00008200007100006500006500005f00005400004e00004e00004e000054000054000054000059 +00005f00005f00005f00005900005400005400004e00004900004400004400004400004400004400004400004900004900004900004900004400003e00003800 +00380000380000380000380000380000380000380000000000000000000000000000000000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800000000000000000000000000003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd0044e20053ed0053ed0053ed +005af3005af3005af3005af3005af3005af3005af3005af3005af3005af30053ed004be7004be7004be70044e2003edd0036d7002fd20027cc0027cc0027cc00 +27cc0027cc0027cc0020c60020c60018c00011ba0001af0001af0000a300009800008d00008200007600006b00006b00005f00005400004e00004400003e0000 +3800003800003800003800003800000000000000000000003800003800003800003800003e0000490000590000710000820000820000930000a30001af0011ba +0020c6002fd20036d70036d7003edd0044e20044e2004be70044e20044e20036d70036d7002fd20027cc0018c00018c00011ba0011ba0018c00018c00020c600 +27cc0027cc0027cc0027cc0020c60020c60018c00009b50000a900009800008d00007c00007100007100006500005f0000590000540000540000590000590000 +5900005f00006500006500006500005f00005900005900005400004e00004900004400004400003e000044000044000044000049000049000049000044000044 +00003e00003e00003800003800003800003800003800003800000000000000000000000000000000003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800000000000000000000000000000000003800003800003800004400005400006b0000820000820000980000a90018c00027cc003edd0044e20053ed0053 +ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af3005af3005af30053ed0053ed0053ed004be70044e2003edd0036d70036d7002fd2 +002fd2002fd2002fd2002fd2002fd20027cc0020c60018c00009b50009b50000a900009d00009300008200007600006b00006b00005f00005900004e00004400 +003e00003800003800003800003800003800003800003800003800003800003800003800003e00004e00005900006b00007c00008d00008d00009d0001af0011 +ba0020c6002fd20036d7003edd003edd0044e2004be7004be7004be70044e2003edd0036d70036d70027cc0020c60011ba0009b50009b50009b50011ba0011ba +0018c00027cc0027cc002fd2002fd2002fd2002fd20027cc0018c00009b50000a900009800008800007c00007c00007100006500005f00005f00005900005f00 +005f00005f00006500006500006500006500006500005f00005f00005900004e00004900004400004400003e0000440000440000440000490000490000490000 +4900004400003e00003e000038000038000038000038000038000000000000000000000000000000000000000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +0000380000380000000000000000000000000000000000380000380000380000440000590000710000820000820000980001af0018c0002fd2003edd004be700 +53ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af30062f90062f90062f9005af3005af3005af30053ed004be70044e20044e2003e +dd003edd003edd003edd0036d70036d70036d7002fd20027cc0018c00009b50009b50000a900009d00009300008800007c00007100007100006500005f000054 +00004e00004900004400003e00003e00003e00003800003800003800003e00003e00004900004900005400005f00006b00007c00008d0000980000980000a900 +09b50018c00020c6002fd20036d7003edd003edd0044e20044e20044e20044e2003edd0036d70027cc0027cc0018c00011ba0001af0001af0000a90001af0009 +b50009b50011ba0020c60027cc002fd2002fd2002fd2002fd20027cc0020c60011ba0001af00009d00009300008200008200007600006b00006500005f00005f +00005f00006500006500006500006b00006b00006b00006500006500006500005900005400004e00004400004400003e00003e00003e00004400004400004900 +004900004400004400003e00003e0000380000380000380000380000380000380000000000000000000000000000000000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800000000000000000000000000000000003800003800003e00004900005f00007600008800008800009d0001af0020c6002fd20044e2 +004be70053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af30062f90062f90062f90062f90062f90062f9005af30053ed0053ed00 +4be7004be7004be70044e20044e20044e20044e2003edd0036d70027cc0020c60011ba0011ba0001af0000a300009800008d00008200007600007600006b0000 +6500005900005400004e00004e00004900004900004900004900004900004900004e00005400005f00005f00006500007100008200008d0000980000a30000a3 +0001af0011ba0018c00020c6002fd20036d70036d70036d7003edd0044e2003edd003edd0036d70027cc0018c00018c00009b50001af0000a30000a300009d00 +00a30000a90000a90009b50018c00020c6002fd2002fd2002fd2002fd20027cc0027cc0018c00009b50000a300009800008d00008d00007c00007600006b0000 +6500006500006500006500006500006b00006b00006b00007100006b00006500006500005f00005900004e00004900004400003e00003e00003e00003e000044 +00004400004400004400004400003e00003e00003800003800003800003800003800003800003800003800000000003800003800003800003800003800003800 +003800003800003e00003e00003e0000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800000000000000000000000000000000003800003800003e00004900005f00007600008800008800009d0001af0020c6002f +d20044e2004be70053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af30062f90062f90062f90062f90062f90062f9005af30053ed +0053ed004be7004be7004be70044e20044e20044e20044e2003edd0036d70027cc0020c60011ba0011ba0001af0000a300009800008d00008200007600007600 +006b00006500005900005400004e00004e00004900004900004900004900004900004900004e00005400005f00005f00006500007100008200008d0000980000 +a30000a30001af0011ba0018c00020c6002fd20036d70036d70036d7003edd0044e2003edd003edd0036d70027cc0018c00018c00009b50001af0000a30000a3 +00009d0000a30000a90000a90009b50018c00020c6002fd2002fd2002fd2002fd20027cc0027cc0018c00009b50000a300009800008d00008d00007c00007600 +006b00006500006500006500006500006500006b00006b00006b00007100006b00006500006500005f00005900004e00004900004400003e00003e00003e0000 +3e00004400004400004400004400004400003e00003e000038000038000038000038000038000038000038000038000000000038000038000038000038000038 +00003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800000000003800003800003800003800003800004400005400006500007c00008d00008d0000a30009b500 +27cc0036d70044e20053ed005af3005af3005af3005af3005af3005af3005af30053ed0053ed005af3005af30062f90062f90062f90062f90062f90062f9005a +f3005af30053ed0053ed004be7004be70044e20044e20044e2003edd003edd0036d7002fd20020c60018c00018c00009b50000a90000a300009800008d000088 +00008800007c00007600006b00006500005f00005f00005f00005f00005f00005f00005f00006500006500006b00007600007600007c00008800009300009d00 +00a90001af0001af0011ba0018c00020c60020c60027cc002fd2002fd2002fd2002fd20036d7002fd2002fd20027cc0018c00009b50009b50001af0000a30000 +9d00009800009800009d0000a30000a30001af0011ba0018c00020c60027cc0027cc0027cc0027cc0020c60011ba0009b50000a300009800008d00008d000082 +00007600006b00006500006500006500006500006500006500006b00006b00006b00006b00006500006500005f00005900005400004900004400003e00003e00 +003e00003e00004400004400004400004400004400003e00003e00003e0000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003e00003e00003e00003e000038000038000038000038000038000038000038000038000038000038000038000000000000 +00000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000490000590000710000820000980000980000a9 +0011ba0027cc003edd004be70053ed005af3005af30062f90062f9005af3005af30053ed0053ed0053ed0053ed005af3005af30062f90062f90062f90062f900 +62f90062f9005af3005af30053ed004be7004be70044e20044e20044e2003edd003edd0036d7002fd20027cc0018c00018c00011ba0001af0000a90000a30000 +9d00009300009300008d00008200007c00007600007600007600007100007100007600007600007600007c00008200008200008d00008d0000930000980000a3 +0001af0009b50011ba0011ba0018c00020c60020c60020c60020c60020c60027cc0027cc0027cc0027cc0027cc0020c60018c00009b50001af0001af0000a300 +00980000930000930000930000980000a30000a30000a90009b50011ba0018c00020c60020c60020c60020c60018c00011ba0009b50000a300009800008d0000 +8d00008200007600006b00006b00006500006500006500006500006500006500006b00006b00006b00006b00006b00006500005f00005400004e000049000044 +00004400004400003e00004400004400004400004900004400004400004400003e00003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003e00003e00003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000380000380000 +38000038000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400005400006500007600008800009d0000 +9d0001af0018c0002fd2003edd0053ed005af30062f90062f90062f90062f9005af3005af30053ed0053ed0053ed0053ed0053ed005af30062f90062f90062f9 +0062f90062f90062f9005af30053ed0053ed004be7004be70044e20044e2003edd003edd0036d70036d7002fd20027cc0020c60020c60018c00011ba0009b500 +01af0000a90000a30000a300009d00009800008d00008d00008800008800008d00008d00008d00009300009300009300009800009d0000a30000a30000a90001 +af0009b50011ba0018c00020c60020c60027cc0020c60020c60020c60018c00018c00018c00018c00018c00018c00011ba0011ba0001af0000a900009d00009d +00009800009300008d00008d00009300009800009d00009d0000a30001af0009b50011ba0011ba0018c00018c00018c00011ba0009b50001af0000a300009800 +008d00008d00008200007600006b00006500006500005f00005f00005f00005f00006500006500006b00006b00006b00006b0000650000650000590000540000 +4e00004900004400004400004400004400004400004900004900004900004400004400004400003e00003e000038000038000038000038000038000038000038 +00003800003800003800003800003800003e00003e00003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800003800003800 +00380000380000380000380000380000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400004e00005900006b00007c00009300 +00a30000a30009b50020c60036d70044e20053ed005af30062f90062f90062f90062f90062f9005af30053ed0053ed0053ed0053ed0053ed005af3005af30062 +f90062f90062f90062f9005af3005af30053ed0053ed004be70044e20044e20044e2003edd0036d70036d7002fd2002fd20027cc0027cc0027cc0020c60020c6 +0018c00018c00011ba0009b50009b50001af0000a90000a30000a300009d00009d0000a30000a30000a30000a90000a90001af0001af0009b50011ba0011ba00 +11ba0018c00020c60027cc002fd2002fd2002fd2002fd20027cc0027cc0020c60018c00011ba0009b50009b50009b50001af0001af0000a90000a300009d0000 +9300009300008d00008d00008800008d00008d00009300009d00009d0000a30000a90001af0009b50009b50009b50009b50009b50009b50001af0000a900009d +00009800008d00008d00008200007600006b00006500005f00005f00005f00005f00005f00005f00006500006500006b00006b00006b00006b00006500005f00 +005900005400004e00004900004900004400004400004900004900004900004900004900004900004900004400004400003e00003e00003e0000380000380000 +3800003800003800003800003800003e00003e00003e00003e00004400003e00003e00003e00003e00003e000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800000000000000000000000000380000380000380000380000380000380000380000380000380000 +3800003800003800003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400004e00005f000071000082 +0000930000a30000a30009b50020c60036d70044e20053ed005af30062f90062f90062f90062f9005af30053ed0053ed004be7004be7004be70053ed0053ed00 +53ed005af3005af3005af3005af3005af30053ed0053ed004be70044e20044e2003edd003edd003edd0036d70036d70036d70036d7002fd2002fd2002fd2002f +d2002fd2002fd20027cc0027cc0020c60020c60018c00011ba0009b50009b50001af0001af0009b50009b50009b50011ba0011ba0018c00018c00018c00020c6 +0020c60020c60027cc002fd2002fd20036d70036d70036d70036d7002fd20027cc0020c60011ba0009b50000a90000a90000a90000a300009d00009d00009800 +009300008d00008d00008800008800008800008d00009300009800009d00009d0000a30000a90001af0001af0001af0009b50009b50009b50001af0001af0000 +a90000a300009800008d00008d00008800007c00007600007100006b00006500006500006500006500006b00006b000071000076000076000076000076000076 +00007100006b00006500005900005400005400004e00004e00004e00004e00004e00004e00004e00004e00004900004900004900004900004900004400004400 +004400003e00003e00003800003800003800003800003800003800003800003e00003e00003e0000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000000000000000000000000003800003800003800003800003800003800003800003800 +003800003800003800003e00003e00004400004400003e00003e00003800003800003800003800003800003800003800003e00003e00004900005400005f0000 +710000820000930000a30000a30009b50020c60036d70044e20053ed005af3005af3005af3005af3005af3005af30053ed004be7004be7004be7004be7004be7 +004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be70044e20044e2003edd003edd003edd0036d70036d70036d70036d70036d70036d7003edd00 +3edd003edd003edd003edd003edd0036d70036d70036d7002fd20027cc0020c60020c60018c00018c00018c00018c00020c60020c60027cc0027cc0027cc0027 +cc002fd2002fd2002fd2002fd20036d7003edd003edd003edd003edd003edd0036d7002fd20018c00009b50000a900009d00009d00009d00009800009300008d +00008d00008800008800008800008200008800008800009300009800009d0000a30000a30000a90000a90000a90001af0001af0001af0001af0001af0001af00 +00a90000a90000a300009800009300009300008800008200007c00007600007100007100006b00006b00007100007100007600007c0000820000820000820000 +8800008800008200007c00007100006b00006500006500005900005900005400005400005400004e00004e00004e00004e00004e00004e00004e00004e00004e +00004900004900004900004400003e00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000000000000000000000000038000038000038000038000038000038000038 +00003800003800003e00003e00003e00004400004400004400004400003e00003800003800003800003800003800003800003800003800003800004400004e00 +005f0000710000820000930000a30000a30009b50020c6002fd2003edd004be70053ed005af3005af3005af3005af30053ed0053ed004be7004be7004be7004b +e7004be7004be7004be7004be70053ed004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd003edd003edd003edd003edd0044e20044e2 +0044e20044e2004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd20027cc0027cc0027cc0027cc0027cc0027cc0027cc002fd2002fd200 +2fd2002fd2002fd2002fd2002fd20036d7003edd003edd0044e20044e20044e20044e20036d7002fd20018c00001af0000a300009800009800009300008d0000 +8800008800008200008200008200008200008200008800008d00009800009d0000a30001af0001af0001af0001af0001af0001af0001af0001af0001af0001af +0001af0001af0000a90000a90000a300009d00009d00009300008d00008800008800008200008200007c00007c00008200008200008800008d00009300009800 +009800009d00009d00009800009300008800007c00007600007600006b00006500005f0000590000590000590000590000590000590000590000590000590000 +5900005400005400005400004e00004900003e000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003e00003e00003e00003e00003800003800003800003800003800003800000000000000000000000000380000380000380000380000380000 +3800003800003800003800003e00003e00004400004400004900004900004400004400003e00003e000038000038000038000038000038000038000038000044 +00004e00005900006b00007c0000930000a30000a30009b50018c0002fd2003edd0044e2004be70053ed0053ed0053ed0053ed0053ed004be7004be7004be700 +4be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e20044e2003edd003edd003edd003edd0044e20044e2004b +e7004be70053ed0053ed0053ed0053ed005af30053ed0053ed004be7004be70044e2003edd0036d70036d7002fd2002fd2002fd2002fd2002fd20036d70036d7 +0036d70036d70036d70036d70036d70036d7003edd003edd0044e20044e20044e20044e20044e20036d70027cc0011ba0001af00009d00008d00008d00008800 +008200008200007c00007c00007c00007c00007c00008200008800009300009d0000a90001af0009b50009b50009b50009b50009b50001af0001af0001af0001 +af0001af0001af0001af0001af0001af0000a90000a30000a30000a300009d00009800009300009300009300009300009300009300009800009d0000a30000a9 +0001af0001af0009b50009b50001af0000a900009d00009300008800008800007c00007100006b00006500005f00005f00005f00005f00005f00005f00005f00 +006500005f00005f0000590000590000540000490000440000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003e00003e00003e00003e00003e000038000038000038000038000038000038000000000000000000003800003800003800003800003800 +003800003800003800003800003800003e00003e00004400004900004900004900004400003e00003e00003e0000380000380000380000380000380000380000 +3800003800004400005400006500007600008d00009d00009d0001af0018c00027cc0036d70044e20044e2004be7004be7004be70053ed004be7004be7004be7 +004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e20044e2004be7004be7004be700 +53ed0053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd2002fd2002fd2002fd2002f +d2002fd20036d7002fd2002fd2002fd2002fd2002fd20036d70036d7003edd0044e20044e20044e20044e20036d70027cc0011ba0000a3000098000088000088 +00008200007c00007c00007c00007c00007c00008200008200008800008d0000980000a30001af0009b50011ba0011ba0011ba0011ba0011ba0009b50009b500 +01af0001af0009b50009b50009b50009b50011ba0011ba0009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0009b50009b50018c00020 +c60027cc002fd2002fd20036d70036d7002fd20020c60011ba0000a900009d00009d00008d00008200007600007100006b00006b00006b00006b00006b00006b +00006b00006b00006b00006b00005f00005f00005900004e00004400003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003e00003e00003e00003e00003e00003e0000380000380000380000380000380000380000000000000000000038000038000038000038 +00003800003800003800003800003800003800003e00003e00004400004900004900004900004400003e00003e00003e00003800003800003800003800003800 +003800003800003800004400005400006500007600008d00009d00009d0001af0018c00027cc0036d70044e20044e2004be7004be7004be70053ed004be7004b +e7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e20044e2004be7004be7 +004be70053ed0053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd2002fd2002fd200 +2fd2002fd2002fd20036d7002fd2002fd2002fd2002fd2002fd20036d70036d7003edd0044e20044e20044e20044e20036d70027cc0011ba0000a30000980000 +8800008800008200007c00007c00007c00007c00007c00008200008200008800008d0000980000a30001af0009b50011ba0011ba0011ba0011ba0011ba0009b5 +0009b50001af0001af0009b50009b50009b50009b50011ba0011ba0009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0009b50009b500 +18c00020c60027cc002fd2002fd20036d70036d7002fd20020c60011ba0000a900009d00009d00008d00008200007600007100006b00006b00006b00006b0000 +6b00006b00006b00006b00006b00006b00005f00005f00005900004e000044000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800000000000000000000380000380000 +3800003800003800003800003800003800003800003e00003e00003e00004400004900004900004900004400003e000038000038000038000038000038000038 +00003800003800003800003800003e00004e00005f0000710000880000980000980000a90011ba0027cc002fd2003edd003edd0044e20044e2004be7004be700 +4be7004be70053ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70053 +ed0053ed005af3005af30062f90069ff0069ff0069ff0071ff0069ff0069ff0062f9005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd20027cc +0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d7003edd003edd003edd003edd003edd002fd20020c60009b500009d00 +009300008200008200007c00007600007600007600007600007c00008200008200008800009300009d0001af0011ba0018c00020c60020c60020c60020c60018 +c00011ba0011ba0009b50009b50009b50011ba0011ba0018c00020c60020c60020c60020c60020c60020c60020c60020c60020c60027cc0027cc0027cc002fd2 +0036d7003edd004be70053ed005af3005af30062f90062f90053ed0044e20036d70020c60009b50009b50000a300009300008800008200007600007600007600 +007600007600007600007600007600007600007100006b00006b00005f00004e0000440000380000380000380000380000000000000000000000000000380000 +3800003800003800003800003800003800003e00003e00003e00003e00003e00003e000038000038000038000038000038000038000000000000000000003800 +003800003800003800003800003800003800003800003800003e00004400004400004400004900004900004400004400003e0000380000380000380000380000 +3800000000003800003800003800003800003800004900005f0000710000880000980000980001af0011ba0027cc002fd2003edd003edd0044e20044e2004be7 +004be7004be70053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70053ed00 +53ed0053ed0053ed005af30062f90062f90069ff0069ff0069ff0071ff0069ff0069ff0062f9005af30053ed0053ed0044e2003edd0036d7002fd20027cc0027 +cc0020c60020c60020c60020c60027cc0027cc0027cc0027cc0020c60020c60020c60027cc0027cc002fd2002fd2002fd2002fd2002fd20020c60011ba0000a9 +00009800008d00008200008200007c00007600007600007c00007c00008200008800008800009300009d0000a90009b50018c00020c60027cc0027cc0027cc00 +20c60020c60018c00018c00011ba0011ba0018c00018c00020c6002fd2002fd20036d7003edd003edd003edd0044e20044e20044e20044e20044e20044e20044 +e2004be70053ed005af30069ff0071ff0080ff0080ff0080ff0788ff0078ff0071ff005af30044e2002fd2002fd20018c00001af0000a300009800009300008d +00008d00008d00008d00008d00008d00008d00008800008200007600007600006b00005900004900003800003800003800003800000000000000000000000000 +000000003800003800003800003800003800003800003800003800003e0000380000380000380000380000380000380000380000380000380000000000000000 +00003800003800003800003800003800003800003800003800003800003e00004400004400004400004400004400004400003e00003800003800003800003800 +00380000000000000000000000000000000000380000380000490000590000710000880000980000980001af0011ba0027cc002fd2003edd003edd0044e20044 +e2004be7004be70053ed0053ed0053ed005af3005af3005af3005af30053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed +0053ed0053ed0053ed005af3005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0062f9005af30053ed004be7004be70044e20036d7002fd20027cc00 +20c60020c60018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00020c60020c60020c60020c60020c60020c60011ba0001 +af0000a300009300008800007c00007c00007c00007600007c00007c00008200008800008d00008d0000980000a30001af0011ba0020c60020c60027cc0027cc +0027cc0027cc0027cc0020c60020c60020c60020c60020c60027cc0036d7003edd0044e20053ed005af3005af3005af30062f90062f90062f90062f90062f900 +62f90062f90069ff0069ff0078ff0788ff2797ff369eff369eff42a4ff52abff369eff2797ff0080ff0069ff0053ed0053ed003edd0027cc0011ba0009b50000 +a90000a30000a30000a30000a30000a300009d00009d00009800009300008800008800007600006500004e00003e000038000038000038000000000000000000 +00000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000 +0000000000000000003800003800003800003800003800003800003800003e00003e00004400004400004400004400004400003e000038000038000038000038 +00003800000000000000000000000000000000000000003800003800004900005f00007600008d00009d00009d0009b50018c0002fd20036d7003edd0044e200 +44e20044e2004be7004be70053ed0053ed005af3005af3005af3005af3005af30053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053 +ed0053ed0053ed0053ed0053ed0053ed005af3005af30062f90069ff0069ff0069ff0069ff0062f9005af30053ed004be70044e20044e2003edd0036d70027cc +0020c60018c00018c00011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba00 +01af0000a900009800008d00008800007c00007c00007c00007c00008200008200008800008d00009800009800009d0000a90009b50011ba0020c60027cc002f +d2002fd20027cc0027cc0027cc0020c60020c60027cc0027cc002fd20036d70044e20053ed005af30069ff0071ff0071ff0078ff0078ff0078ff0078ff0078ff +0078ff0071ff0071ff0078ff0080ff0788ff2797ff42a4ff62b3ff62b3ff71bbff81c2ff71bbff62b3ff369eff178fff0078ff0078ff005af3004be70036d700 +27cc0018c00018c00011ba0011ba0011ba0011ba0009b50009b50001af0000a30000930000930000880000710000590000440000380000380000380000000000 +00000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000 +000000000000000000000000003800003800003800003800003800003800003e00003e00004400004400004400004400004400004400003e0000380000380000 +3800003800003800000000000000000000000000000000000000003800003800004e00006500007c0000930000a30000a30011ba0020c6002fd20036d7003edd +0044e20044e20044e2004be7004be70053ed005af3005af3005af3005af3005af3005af30053ed0053ed0053ed004be70053ed0053ed0053ed0053ed0053ed00 +53ed0053ed0053ed0053ed0053ed0053ed0053ed005af3005af3005af30062f90062f90062f90062f9005af30053ed004be70044e2003edd003edd0036d7002f +d20027cc0020c60018c00011ba0009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0001af +0000a90000a300009d00009300008d00008200007c00007c00008200008200008200008800008d00009300009d00009d0000a30001af0009b50018c00020c600 +27cc002fd2002fd2002fd20027cc0027cc0027cc0027cc002fd2002fd20036d70044e20053ed0062f90071ff0080ff0788ff0788ff178fff2797ff2797ff178f +ff178fff0788ff0788ff0788ff0788ff178fff2797ff42a4ff62b3ff91caff91caffa0d1ffc0e0ffb0d9ffa0d1ff81c2ff52abff2797ff2797ff0080ff0069ff +005af3004be7003edd0036d7002fd2002fd2002fd20027cc0027cc0027cc0018c00011ba0000a30000a300009300007c00005f00004900003800003800003800 +00000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000000000000000 +00000000000000000000000000000000000000003800003800003800003800003800003e00003e00004400004400004400004400003e00003e00003800003800 +003800003800003800003800000000000000000000003800003800003800003800004900005f00007600008d0000a30009b50009b50020c6002fd2003edd0044 +e20044e2004be7004be7004be7004be7004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be70044e20044e20044e2004be7004be7004be7004be7 +0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70053ed0053ed0053ed004be7004be7004be70044e20044e2003edd0036d7002fd2002fd200 +27cc0027cc0020c60018c00011ba0009b50001af0001af0001af0001af0001af0001af0001af0001af0001af0001af0000a90000a90000a30000a30000a30000 +a30000a300009d00009800009800008d00008800008800008200008200008200008800008800008d00009300009800009d00009d0000a30001af0009b50011ba +0020c60020c60027cc0027cc0027cc0020c60020c60020c60027cc002fd2002fd2003edd004be7005af30071ff0080ff178fff2797ff2797ff369eff369eff36 +9eff2797ff178fff0788ff0080ff0080ff0080ff0080ff0788ff2797ff52abff71bbff71bbff91caffb0d9ffc0e0ffc0e0ffa0d1ff81c2ff52abff52abff369e +ff0788ff0071ff0062f9005af30053ed004be7004be70044e20044e20044e2003edd002fd20027cc0009b50009b50000a3000088000071000054000038000038 +00003800000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800000000000000 +0000000000000000000000000000000000000000000000003800003800003800003800003800003e00004400004400004400004400004400003e000038000038 +00003800003800003800003800003800000000003800003800003800003800003800004400005900007100008800009d0009b50020c60020c60036d7003edd00 +4be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd003edd0044e20044e20044 +e2004be7004be7004be70053ed004be7004be7004be7004be70044e20044e20044e20044e2003edd003edd003edd0036d70036d7002fd20027cc0027cc0027cc +0027cc0020c60020c60018c00011ba0011ba0009b50001af0001af0000a90000a90000a90000a90000a90000a90000a30000a30000a300009d00009d00009800 +009800009800009800009300009300008d00008d00008800008800008800008800008800008d00008d00009300009800009d0000a30000a30000a90001af0009 +b50011ba0018c00018c00020c60020c60018c00018c00018c00020c60027cc002fd2002fd20044e20053ed0069ff0080ff178fff369eff42a4ff42a4ff52abff +52abff52abff369eff2797ff0788ff0078ff0078ff0078ff0071ff0078ff0788ff369eff62b3ff62b3ff81c2ffb0d9ffc0e0ffcfe8ffc0e0ffb0d9ff91caff91 +caff62b3ff42a4ff178fff0080ff0071ff0069ff0062f90062f90062f90062f9005af3005af3004be7003edd0027cc0027cc0009b500009800007c00005f0000 +3e000038000038000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000000000000 +000000000000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400004400004400004400003e00003e0000 +3800003800003800003800003800003800003800003800003800003800003800004400004400005400006b0000820000980001af0018c0002fd2002fd20044e2 +004be70053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd2002fd2002fd2002fd20036d700 +36d7003edd0044e2004be7004be70053ed004be7004be7004be7004be70044e20044e2003edd0036d70036d7002fd2002fd20027cc0020c60020c60018c00018 +c00018c00018c00018c00018c00011ba0011ba0009b50001af0000a90000a90000a30000a30000a30000a30000a300009d00009d00009d00009d000098000093 +00009300009300009300009300009300008d00008d00008d00008d00008d00008d00008d00008d00009300009800009800009d0000a30000a90000a90000a900 +01af0009b50011ba0018c00018c00018c00018c00018c00018c00018c00018c00027cc002fd2002fd20044e2005af30071ff0788ff2797ff42a4ff52abff52ab +ff62b3ff62b3ff52abff42a4ff2797ff0788ff0078ff0078ff0071ff0069ff0069ff0071ff0788ff369eff369eff62b3ff91caffa0d1ffc0e0ffb0d9ffa0d1ff +81c2ff81c2ff62b3ff369eff178fff0080ff0078ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff005af30053ed0036d70036d70020c60000a900008800 +006b0000490000380000380000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000 +00000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400004400004400004400003e00 +003e00003800003800003800003800003800003800003800003800003800003800003800004400004400005400006b0000820000980001af0018c0002fd2002f +d20044e2004be70053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd2002fd2002fd2002fd2 +0036d70036d7003edd0044e2004be7004be70053ed004be7004be7004be7004be70044e20044e2003edd0036d70036d7002fd2002fd20027cc0020c60020c600 +18c00018c00018c00018c00018c00018c00011ba0011ba0009b50001af0000a90000a90000a30000a30000a30000a30000a300009d00009d00009d00009d0000 +9800009300009300009300009300009300009300008d00008d00008d00008d00008d00008d00008d00008d00009300009800009800009d0000a30000a90000a9 +0000a90001af0009b50011ba0018c00018c00018c00018c00018c00018c00018c00018c00027cc002fd2002fd20044e2005af30071ff0788ff2797ff42a4ff52 +abff52abff62b3ff62b3ff52abff42a4ff2797ff0788ff0078ff0078ff0071ff0069ff0069ff0071ff0788ff369eff369eff62b3ff91caffa0d1ffc0e0ffb0d9 +ffa0d1ff81c2ff81c2ff62b3ff369eff178fff0080ff0078ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff005af30053ed0036d70036d70020c60000a9 +00008800006b00004900003800003800000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800 +0038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400004400003e00003e +00003e00003800003800003800003800003800003800003800003800003800003800003800004400005400005400006500007c0000930000a90018c0002fd200 +3edd003edd0053ed0053ed005af3005af30053ed0053ed004be7004be7004be70044e20044e2003edd003edd0036d70036d7002fd20027cc0020c60020c60020 +c60027cc002fd2002fd20036d7003edd004be7004be70053ed004be7004be7004be7004be70044e2003edd0036d7002fd20027cc0020c60020c60018c00011ba +0009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0000a90000a30000a300009d00009800009800009800009800009800009300009300 +009300009300008d00008d00008d00008d00008d00008d00008d00008d00008d00008d00009300009300009300009800009800009d00009d0000a30000a30000 +a90000a90001af0009b50011ba0011ba0018c00018c00011ba0011ba0011ba0011ba0011ba0018c00020c6002fd2002fd20044e2005af30078ff178fff369eff +52abff62b3ff62b3ff71bbff71bbff62b3ff52abff369eff0788ff0078ff0078ff0069ff005af3005af30062f90071ff0788ff0788ff369eff62b3ff81c2ffa0 +d1ffa0d1ffa0d1ff81c2ff81c2ff62b3ff369eff178fff0788ff0078ff0078ff0078ff0078ff0078ff0078ff0078ff0078ff0071ff0069ff004be7004be70036 +d70009b500009800007600005400003e00003e000038000000000000000000000000000000000000000000000000000038000038000038000038000038000038 +000038000038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e0000440000440000440000 +3e00003e00003800003800003800003800003800003800003800003800003800003800003800004400005400006500006500007600008d0000a30011ba002fd2 +0044e20053ed0053ed005af30062f90062f9005af3005af30053ed004be7004be70044e20044e2003edd0036d7002fd20027cc0027cc0020c60018c00011ba00 +11ba0011ba0018c00027cc0027cc002fd2003edd0044e2004be70053ed0053ed004be7004be7004be70044e20036d7002fd20027cc0018c00011ba0011ba0009 +b50001af0000a90000a90000a90000a90000a90001af0001af0001af0001af0000a90000a300009d00009d00009800009300009300008d00008d00008d00008d +00008d00008d00008800008800008800008800008800008800008d00008d00009300009300009800009800009d00009d00009d0000a30000a30000a30000a900 +00a90001af0001af0009b50009b50011ba0011ba0018c00018c00011ba0011ba0011ba0009b50011ba0011ba0020c6002fd2002fd20044e20062f90078ff178f +ff369eff62b3ff71bbff71bbff81c2ff71bbff71bbff52abff42a4ff178fff0078ff0078ff0069ff0053ed004be7004be7005af30069ff0069ff0080ff2797ff +52abff71bbff71bbff71bbff52abff52abff369eff178fff0080ff0078ff0071ff0071ff0071ff0071ff0078ff0080ff0080ff0788ff0080ff0078ff0062f900 +62f90044e20020c60000a900008800005f0000440000440000380000000000000000000000000000000000000000000000000000380000380000380000380000 +38000038000038000038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003e00003e00004400004400 +004400003e00003e00003800003800003800003800003800003800003800003800003800003800004400004e00005f00007600007600008d0000a30011ba0027 +cc003edd0053ed0062f90062f90069ff0069ff0069ff0062f9005af30053ed004be7004be70044e2003edd0036d7002fd20027cc0018c00018c00011ba0001af +0001af0000a90001af0009b50018c00018c00027cc0036d70044e2004be70053ed0053ed0053ed0053ed004be70044e20036d70027cc0020c60011ba0001af00 +01af0000a90000a300009d00009d00009d0000a30000a30000a30000a90000a90000a90000a300009d0000980000980000930000880000880000880000820000 +8200008200008200008200008200008200008200008200008800008800008d00009300009800009800009d0000a30000a30000a30000a90000a90000a90001af +0001af0001af0009b50009b50009b50011ba0018c00018c00018c00018c00011ba0011ba0011ba0009b50009b50011ba0020c6002fd2002fd2004be70062f900 +78ff178fff42a4ff62b3ff71bbff71bbff81c2ff81c2ff81c2ff62b3ff52abff178fff0078ff0078ff0062f9004be70044e20036d70044e2004be7004be70062 +f90080ff178fff42a4ff42a4ff42a4ff369eff369eff178fff0080ff0071ff0069ff0062f90069ff0071ff0071ff0078ff0080ff0788ff178fff178fff0788ff +0071ff0071ff005af30036d70011ba00009300007100004e00004e00003800003800000000000000000000000000000000000000000000003800003800003800 +0038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e000044 +00004400003e00003800003800003800003800003800003800003800003800003800003800003800003e00004900005400006500007c00007c0000930000a900 +18c0002fd20044e20053ed0062f90062f90069ff0062f90062f9005af30053ed004be70044e20044e20044e2003edd0036d70036d70027cc0020c60020c60011 +ba0009b50001af0001af0001af0009b50018c00018c00027cc002fd2003edd0044e2004be70044e20044e20044e2003edd0036d7002fd20020c60011ba0009b5 +0000a90000a90000a300009d00009800009800009800009800009800009d00009d0000a300009d00009d00009800009300009300008d00008200008200007c00 +007c00007c00007c00007c00007c00008200008200008800008d00009300009300009800009d0000a30000a90001af0009b50009b50009b50009b50011ba0011 +ba0011ba0011ba0018c00018c00018c00020c60027cc0027cc0027cc002fd20027cc0020c60020c60020c60018c00018c00020c60027cc0036d70036d7004be7 +0062f90078ff178fff42a4ff62b3ff71bbff71bbff91caff91caffa0d1ff81c2ff71bbff42a4ff178fff178fff0071ff005af30044e20036d70036d7003edd00 +3edd004be70062f90071ff0080ff0080ff0080ff0071ff0071ff0069ff005af30053ed004be7004be7005af30062f90062f90071ff0080ff178fff2797ff2797 +ff2797ff0080ff0080ff0069ff0044e20020c600009d00007c000059000059000038000038000000000000000000000000000000000000000000000038000038 +00003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000380000380000380000380000 +3e00004400003e00003e00003800003800003800003800003800003800003800003800003800003800003800003e00004e000059000071000082000082000098 +0001af0020c60036d70044e2005af3005af3005af30062f90062f9005af30053ed004be70044e20044e20044e2003edd003edd003edd0036d7002fd20020c600 +20c60018c00009b50001af0001af0001af0009b50018c00018c00020c6002fd20036d7003edd003edd003edd003edd003edd0036d70027cc0020c60018c00009 +b50001af0000a90000a900009d00009d00009800009300009300009300009300009800009800009800009800009800009300008d00008d00008800008200007c +00007600007600007600007600007600007c00007c0000820000880000930000980000980000a30000a90009b50011ba0018c00018c00020c60020c60020c600 +20c60020c60020c60027cc0027cc002fd2002fd20036d70036d7003edd003edd003edd0036d70036d70036d7002fd20027cc0027cc0027cc0036d70044e20044 +e20053ed0069ff0080ff178fff42a4ff62b3ff81c2ff81c2ffa0d1ffa0d1ffb0d9ffb0d9ffa0d1ff71bbff42a4ff42a4ff0788ff0062f9004be70036d7002fd2 +0027cc0027cc0036d70044e2004be7005af3005af30053ed004be7004be70044e20036d7002fd20036d70036d70044e2005af3005af30071ff0080ff178fff42 +a4ff42a4ff42a4ff178fff178fff0078ff0053ed002fd20000a90000820000650000650000440000380000000000000000000000000000000000000000380000 +38000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000003800003800003800 +003800003800003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400004e00005f0000760000880000 +8800009d0009b50020c60036d70044e20053ed005af3005af3005af3005af30053ed004be70044e20044e20044e20044e20044e20044e2003edd003edd0036d7 +002fd2002fd20020c60018c00009b50001af0009b50009b50011ba0011ba0018c00020c60027cc002fd2002fd2002fd20027cc0027cc0020c60018c00011ba00 +09b50000a90000a300009d00009d00009800009800009300009300008d00008d00008d00008d00009300009300009300008d00008d0000880000880000820000 +7c00007600007600007600007600007600007600007c0000820000880000930000980000a30000a30001af0011ba0018c00027cc002fd2002fd20036d70036d7 +0036d70036d70036d70036d7003edd003edd0044e20044e2004be7004be70053ed0053ed0053ed004be70044e20044e2003edd0036d70036d70036d70044e200 +4be7004be7005af30069ff0080ff178fff42a4ff62b3ff81c2ff81c2ffa0d1ffb0d9ffcfe8ffc0e0ffc0e0ff91caff62b3ff62b3ff178fff0069ff004be7002f +d20027cc0018c00018c00020c60027cc002fd2003edd0036d70036d7002fd2002fd20027cc0020c60018c00027cc002fd20044e2005af3005af30071ff0788ff +369eff52abff52abff52abff2797ff2797ff0788ff005af30036d70001af00008800006b00006b00004900003800003800000000000000000000000000000000 +00380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000038000038 +00003800003800003800003e00003800003800003800003800003800003800003800003800003800003800003800003800003e00004400005400006500007c00 +008d00008d0000a30011ba0027cc003edd0044e20053ed0053ed0053ed0053ed0053ed004be70044e20044e20044e2003edd003edd0044e20044e20044e20044 +e2003edd0036d70036d7002fd20020c60018c00009b50009b50009b50011ba0011ba0011ba0018c00020c60020c60020c60018c00018c00018c00011ba0009b5 +0000a90000a30000a300009d00009800009800009300009300008d00008d00008800008800008800008800008800008800008800008800008800008200008200 +007c00007600007600007100007100007100007600007600007c00008200008d0000980000a30001af0001af0011ba0020c6002fd20036d7003edd0044e20044 +e20044e20044e20044e20044e2004be7004be70053ed005af3005af30062f90062f90069ff0062f90062f9005af30053ed0053ed004be70044e20044e20044e2 +004be70053ed0053ed0062f90071ff0080ff178fff42a4ff62b3ff81c2ff81c2ffb0d9ffc0e0ffdfefffdfefffdfefffb0d9ff81c2ff81c2ff369eff0071ff00 +53ed002fd20018c00009b50009b50009b50011ba0018c00020c60018c00018c00011ba0011ba0009b50009b50009b50011ba0020c6003edd0053ed0053ed0071 +ff178fff42a4ff62b3ff62b3ff71bbff42a4ff42a4ff178fff0062f9003edd0009b500009300007100007100004e000038000038000038000000000000000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004900005900006b +00007c0000930000930000a90011ba0027cc0036d70044e2004be7004be7004be7004be7004be70044e20044e2003edd003edd0044e20044e20044e2004be700 +53ed0053ed0053ed004be7004be7003edd0036d70027cc0018c00018c00011ba0011ba0011ba0009b50009b50009b50009b50001af0000a90000a90000a90000 +a300009d00009800009300009300009300008d00008d00008d00008d00008800008800008200008200008200007c00008200008200008200008200008200007c +00007c00007c00007600007600007600007600007600007c00007c00008200008d0000980000a30009b50018c00018c00027cc0036d70044e2004be70053ed00 +53ed005af3005af3005af3005af3005af3005af30062f90069ff0071ff0071ff0078ff0078ff0078ff0078ff0071ff0069ff0062f90062f9005af3005af30053 +ed0053ed005af30062f90062f90069ff0071ff0080ff178fff42a4ff62b3ff91caff91caffb0d9ffcfe8ffeff7ffeff7ffeff7ffc0e0ff81c2ff81c2ff369eff +0071ff004be70027cc0011ba0001af0001af0000a90000a90001af0009b50009b50009b50001af0001af0001af0001af0001af0018c00027cc0044e20062f900 +62f90080ff369eff62b3ff81c2ff81c2ff71bbff42a4ff42a4ff178fff0062f9003edd0009b500009300007100007100004e00003e0000380000380000380000 +3800003800003800003800003800003800003e00003e00003e000038000038000038000038000038000038000038000038000038000000000000000000000000 +000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000490000 +5900006b0000820000980000980000a90018c00027cc0036d7003edd0044e20044e20044e20044e2003edd003edd003edd003edd003edd0044e20044e2004be7 +0053ed005af30062f90062f9005af3005af30053ed0044e20036d70027cc0020c60011ba0009b50009b50001af0000a90000a300009d00009d00009800009300 +009300008d00008800008800008200008200008200008800008800008800008800008200008200007c00007600007600007600007600007600007c00007c0000 +7c00007c00007c00007c00007600007600007600007600007c0000820000820000880000980000a30009b50018c0002fd2002fd2003edd004be7005af30062f9 +0069ff0069ff0069ff0069ff0069ff0069ff0071ff0071ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff0788ff0080ff0078ff0078ff0071ff00 +69ff0069ff0062f90069ff0069ff0069ff0071ff0078ff0080ff178fff369eff62b3ff91caff91caffc0e0ffdfefffffffffffffffffffffc0e0ff91caff91ca +ff369eff0071ff004be70020c60009b50000a30000a300009d00009d00009d0000a30000a30000a30000a30000a30000a30000a90001af0018c0002fd2004be7 +0071ff0071ff178fff52abff71bbffa0d1ff91caff81c2ff52abff52abff178fff0062f9003edd0009b500009300007100007100005400004400003800003800 +003800003800003800003800003800003800003800003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000000000000000 +00000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +004900005900006b0000820000980000980000a90018c00027cc0036d7003edd0044e20044e20044e20044e2003edd003edd003edd003edd003edd0044e20044 +e2004be70053ed005af30062f90062f9005af3005af30053ed0044e20036d70027cc0020c60011ba0009b50009b50001af0000a90000a300009d00009d000098 +00009300009300008d00008800008800008200008200008200008800008800008800008800008200008200007c00007600007600007600007600007600007c00 +007c00007c00007c00007c00007c00007600007600007600007600007c0000820000820000880000980000a30009b50018c0002fd2002fd2003edd004be7005a +f30062f90069ff0069ff0069ff0069ff0069ff0069ff0071ff0071ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff0788ff0080ff0078ff0078ff +0071ff0069ff0069ff0062f90069ff0069ff0069ff0071ff0078ff0080ff178fff369eff62b3ff91caff91caffc0e0ffdfefffffffffffffffffffffc0e0ff91 +caff91caff369eff0071ff004be70020c60009b50000a30000a300009d00009d00009d0000a30000a30000a30000a30000a30000a30000a90001af0018c0002f +d2004be70071ff0071ff178fff52abff71bbffa0d1ff91caff81c2ff52abff52abff178fff0062f9003edd0009b5000093000071000071000054000044000038 +00003800003800003800003800003800003800003800003800003e00003e00003e00003e00003e00003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00004400004e00005f0000710000880000980000980001af0018c00027cc0036d70036d7003edd003edd003edd003edd003edd0036d7003edd003edd0044e200 +4be7004be70053ed0062f90062f90069ff0069ff0062f90062f9005af3004be7003edd002fd20020c60011ba0001af0001af0000a900009d0000980000930000 +8d00008800008200008200007c00007c00007600007600007600007c00007c00007c00007c00007c00007c00007600007100007100007100006b000071000071 +00007100007600007600007c00007c00007c00007600007c00007c00007c00008200008d00008d0000930000a30001af0018c0002fd2003edd003edd004be700 +5af30062f90062f90069ff0069ff0069ff0069ff0069ff0069ff0071ff0078ff0080ff0788ff178fff178fff2797ff2797ff2797ff178fff0788ff0080ff0078 +ff0078ff0071ff0069ff0069ff0069ff0071ff0071ff0071ff0078ff0078ff0788ff178fff42a4ff62b3ff91caff91caffc0e0ffdfefffffffffffffffeff7ff +b0d9ff71bbff71bbff178fff0062f9003edd0018c00001af00009d00009d00009d00009800009d0000a30000a90000a90000a90000a90001af0009b50011ba00 +2fd20044e20062f90788ff0788ff369eff71bbff91caffb0d9ff91caff81c2ff42a4ff42a4ff0788ff005af3002fd20001af00008d0000710000710000540000 +4400003800003800003800003800003800003800003800003800003e00003e00003e00003e000038000038000038000038000038000038000038000038000038 +00000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3e00003e00004900005400006500007600008d00009d00009d0001af0018c00027cc0036d70036d70036d70036d70036d70036d70036d70036d70036d7003edd +0044e20053ed0053ed005af30069ff0071ff0078ff0071ff0069ff0069ff0062f90053ed0044e2002fd20020c60009b50000a90000a900009d00009800008d00 +008800008200007c00007600007600007100006b00006b00006b00006b00007100007100007100007600007600007100007100006b0000650000650000650000 +6500006b00006b00007100007600007600007600007c00007c00007c00007c00008200008800009300009300009d0001af0018c0002fd20044e2004be7004be7 +005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0069ff0071ff0078ff0078ff0788ff178fff2797ff2797ff2797ff2797ff2797ff178fff0788ff00 +80ff0078ff0078ff0071ff0071ff0071ff0071ff0078ff0078ff0078ff0078ff0080ff0788ff178fff42a4ff71bbffa0d1ffa0d1ffcfe8ffeff7ffc4e2ffeff7 +ffdfefffa0d1ff52abff52abff0080ff0053ed002fd20009b50000a300009800009800009800009800009d0000a30000a90001af0009b50009b50011ba0018c0 +0027cc003edd005af30078ff2797ff2797ff62b3ff91caffb0d9ffc0e0ffa0d1ff81c2ff42a4ff42a4ff0080ff0053ed0027cc0000a900008800007100007100 +005400004400003800003800003800003800003800003800003800003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000 +38000038000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003e00003e00004900005400006500007c00008d00009d00009d0001af0018c00027cc002fd20036d70036d70036d70036d7002fd2002fd2002fd20036 +d7003edd004be70053ed0053ed0062f90071ff0071ff0078ff0071ff0071ff0071ff0062f90053ed003edd002fd20018c00009b50000a30000a300009800008d +00008200007c00007600007100006b00006b00006500006500005f00005f00006500006500006b00006b00007100006b00006b00006500006500005f00005f00 +005f00005f00006500006b00007100007600007600007600007c00007c00008200008200008800008d00009d00009d0000a90011ba002fd2003edd0053ed005a +f3005af30069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0071ff0078ff0788ff178fff2797ff2797ff2797ff2797ff178fff0788ff +0080ff0078ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0078ff0078ff0080ff0080ff0788ff2797ff52abff71bbffa0d1ffa0d1ffdfefffeff7ffff +ffffeff7ffcfe8ff81c2ff369eff369eff0071ff0044e20020c60000a900009d0000930000930000980000980000a30000a90001af0011ba0018c00018c00020 +c6002fd2003edd0053ed0071ff178fff52abff52abff81c2ffb0d9ffc0e0ffc0e0ffa0d1ff81c2ff369eff369eff0078ff004be70020c60000a300008200006b +00006b00005400004900003e00003800003800003800003800003800003800003e00003e00003e00003e00003800003800003800003800003800003800003800 +00380000380000380000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800004400004400004e00005900006b00007c00008d0000a30000a30009b50018c00027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd200 +2fd20036d70044e2004be7005af3005af30069ff0078ff0078ff0080ff0078ff0071ff0071ff0062f90053ed003edd002fd20018c00001af00009d00009d0000 +8d00008200007600007100006b00006500005f00005f00005f00005900005900005900005900005f00006500006500006500006500006500005f000059000059 +00005900005400005900005f00006500006b00007100007c00007c00007c00008200008200008800008d0000980000a90000a90009b50027cc003edd0053ed00 +62f90069ff0069ff0071ff0071ff0071ff0069ff0062f90062f90062f90062f90062f90069ff0071ff0078ff0788ff178fff2797ff2797ff2797ff178fff178f +ff0080ff0078ff0071ff0069ff0069ff0071ff0071ff0078ff0078ff0080ff0080ff0080ff0080ff0788ff178fff2797ff52abff81c2ffb0d9ffb0d9ffdfefff +eff7ffffffffdfefffb0d9ff62b3ff178fff178fff005af3002fd20011ba00009d00009800008d00008d0000930000980000a30001af0009b50018c00027cc00 +27cc002fd20044e20053ed0069ff0788ff42a4ff71bbff71bbffa0d1ffcfe8ffcfe8ffcfe8ffa0d1ff71bbff2797ff2797ff0071ff0044e20018c000009d0000 +7c00006b00006b00005400004900003e00003e00003800003e00003e00003e00003e00003e00003e00003e000038000038000038000038000038000038000038 +00003800003800000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003e00003e00004900005900006b00007c00008d00009d00009d0001af0018c00027cc002fd2002fd20036d7002fd2002fd2002fd2 +002fd20036d7003edd0044e20053ed0062f90062f90069ff0078ff0078ff0078ff0071ff0062f90062f90053ed0044e20036d70020c60009b50000a900009800 +009800008d00008200007600007100006b00006500006500006500005f00005900005900005900005f00006500006500006500006b00006500006500005f0000 +5900005400005400005400005900005f00006500007100007600008200008200008800008800008d00009300009d0000a30009b50009b50018c00036d7004be7 +005af30069ff0071ff0071ff0071ff0069ff0069ff0062f9005af30053ed0053ed0053ed0053ed005af30062f90071ff0078ff0788ff0788ff0788ff178fff07 +88ff0080ff0078ff0071ff0069ff0062f90062f90069ff0071ff0078ff0080ff0080ff0788ff0788ff0788ff178fff2797ff42a4ff62b3ff91caffc0e0ffc0e0 +ffeff7ffeff7ffffffffcfe8ffa0d1ff42a4ff0078ff0078ff004be70020c60001af00009800009300008d00008d00009300009d0000a30001af0011ba0020c6 +002fd2002fd2003edd004be7005af30071ff178fff42a4ff81c2ff81c2ffa0d1ffc0e0ffc0e0ffc0e0ffa0d1ff71bbff2797ff2797ff0071ff003edd0011ba00 +009d00007c00006b00006b00005400004900004400003e00003e00003e00003e00003e00003e00003e00003e00003e0000380000380000380000380000380000 +38000038000038000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003e00003e00004900005400006500007600008d00009d00009d0001af0018c00027cc002fd2002fd20036d70036d70036 +d7002fd20036d70036d70044e2004be7005af30062f90062f90071ff0078ff0071ff0071ff0062f9005af3005af3004be70036d70027cc0018c00001af0000a3 +00009300009300008800007c00007600007100006b00006b00006500006500005f00005f00005f00005f00006500006500006b00006b00006b00006500006500 +005900005400005400005400005400005900005f00006b00007600007c00008800008800008d00009300009800009d0000a90001af0018c00018c0002fd20044 +e2005af30069ff0078ff0071ff0071ff0071ff0069ff005af30053ed004be70044e20044e20044e20044e2004be7005af30062f90071ff0078ff0080ff0080ff +0080ff0078ff0078ff0069ff0062f90062f9005af3005af30062f90069ff0071ff0080ff0788ff178fff178fff2797ff2797ff42a4ff52abff81c2ffa0d1ffcf +e8ffcfe8ffeff7ffffffffffffffc0e0ff91caff2797ff0069ff0069ff003edd0011ba0000a300009300008d00008d00008d00009300009d0000a90009b50018 +c00027cc0036d70036d70044e20053ed0069ff0080ff2797ff52abff81c2ff81c2ffa0d1ffc0e0ffc0e0ffc0e0ff91caff62b3ff178fff178fff0069ff003edd +0011ba00009800007c00006500006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e00003800003800003800003800003800 +00380000380000380000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800004400004e00005f0000710000880000980000980000a90018c00027cc0036d70036d70036d700 +36d70036d70036d7003edd003edd004be70053ed005af30069ff0069ff0071ff0071ff0071ff0069ff0062f90053ed0053ed0044e20036d70027cc0018c00009 +b50000a300009800009800008d00008200007c00007600007100006b00006500006500006500005f00005f00005f00006500006b00006b00006b00007100006b +00006500005f00005900005400005400005400005900006500007100007c0000880000930000930000980000a30000a90001af0009b50018c00027cc0027cc00 +3edd004be70062f90069ff0078ff0071ff0071ff0069ff0062f90053ed004be7003edd003edd0036d70036d7003edd0044e2004be7005af30062f90071ff0071 +ff0071ff0071ff0069ff0069ff005af30053ed0053ed0053ed0053ed005af30062f90071ff0080ff0788ff178fff178fff2797ff369eff42a4ff52abff81c2ff +a0d1ffc0e0ffc0e0ffeff7ffeff7ffdfefffb0d9ff71bbff178fff005af3005af30036d70009b50000a300009300008d00008d00008d00009300009d0000a900 +09b50018c00027cc0036d70036d70044e20053ed0062f90078ff178fff42a4ff71bbff71bbff91caffb0d9ffb0d9ffb0d9ff91caff62b3ff178fff178fff0069 +ff003edd0011ba00009800007c00006500006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e000038000038000038000038 +00003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800004400004e00005900006b0000820000980000980000a90011ba0027cc0036d70036d7 +003edd003edd003edd003edd0044e20044e20053ed005af30062f90069ff0069ff0071ff0071ff0071ff0069ff005af30053ed0053ed0044e20036d70027cc00 +18c00009b50000a900009d00009d00009300008800007c00007600007100006b00006500006500006500005f00006500006500006b0000710000710000710000 +7100006b00006500005f00005900005900005900005400005f00006500007600008200009300009d00009d0000a90001af0009b50018c00020c60027cc0036d7 +0036d70044e2005af30069ff0071ff0078ff0071ff0071ff0069ff005af3004be7003edd0036d7002fd2002fd2002fd20036d7003edd0044e20053ed005af300 +62f90062f90062f90069ff0062f9005af30053ed004be7004be7004be7004be70053ed0062f90071ff0078ff0788ff178fff178fff2797ff369eff42a4ff52ab +ff81c2ffa0d1ffc0e0ffc0e0ffdfefffcfe8ffcfe8ff91caff52abff0080ff0053ed0053ed0027cc0001af00009d00008d00008d00008d00008d00009300009d +0000a90009b50018c00020c6002fd2002fd2003edd0053ed0062f90078ff0788ff369eff62b3ff62b3ff81c2ffa0d1ffa0d1ffa0d1ff81c2ff62b3ff178fff17 +8fff0069ff003edd0011ba00009800007c00006500006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e0000380000380000 +38000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003e00004400005400006500007c0000930000930000a90011ba0027cc0036 +d7003edd0044e2004be7004be7004be7004be70053ed005af30062f90069ff0071ff0071ff0071ff0071ff0069ff0069ff005af30053ed0053ed004be7003edd +0036d70027cc0018c00009b50000a90000a900009d00009300008800007c00007600007100006b00006b00006500006500006500006500006b00007100007600 +007600007600007100006b00006500005f00005f00005f00005900006500007100007c00008d00009d0000a90000a90009b50018c00027cc002fd20036d7003e +dd004be7004be70053ed0062f90069ff0069ff0071ff0069ff0069ff0062f90053ed0044e20036d7002fd2002fd20027cc0027cc002fd20036d7003edd004be7 +0053ed005af3005af3005af30053ed004be70044e2003edd003edd003edd0044e20044e2004be7005af30069ff0078ff0080ff178fff178fff2797ff2797ff42 +a4ff52abff71bbff91caffa0d1ffa0d1ffc0e0ffb0d9ffb0d9ff71bbff369eff0071ff004be7004be70027cc0001af00009d00008d00008d00008d00008d0000 +9800009d0000a30001af0011ba0018c00027cc0027cc0036d70044e20053ed0069ff0080ff178fff42a4ff42a4ff62b3ff81c2ff91caff91caff71bbff52abff +178fff178fff0069ff003edd0011ba00009d00007c00006500006500005400004900003e00003e00003e00003e00003e00003e00003e00003e00003800003800 +00380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003e00004400005400006500007c0000930000930000a90011ba00 +27cc0036d7003edd0044e2004be7004be7004be7004be70053ed005af30062f90069ff0071ff0071ff0071ff0071ff0069ff0069ff005af30053ed0053ed004b +e7003edd0036d70027cc0018c00009b50000a90000a900009d00009300008800007c00007600007100006b00006b00006500006500006500006500006b000071 +00007600007600007600007100006b00006500005f00005f00005f00005900006500007100007c00008d00009d0000a90000a90009b50018c00027cc002fd200 +36d7003edd004be7004be70053ed0062f90069ff0069ff0071ff0069ff0069ff0062f90053ed0044e20036d7002fd2002fd20027cc0027cc002fd20036d7003e +dd004be70053ed005af3005af3005af30053ed004be70044e2003edd003edd003edd0044e20044e2004be7005af30069ff0078ff0080ff178fff178fff2797ff +2797ff42a4ff52abff71bbff91caffa0d1ffa0d1ffc0e0ffb0d9ffb0d9ff71bbff369eff0071ff004be7004be70027cc0001af00009d00008d00008d00008d00 +008d00009800009d0000a30001af0011ba0018c00027cc0027cc0036d70044e20053ed0069ff0080ff178fff42a4ff42a4ff62b3ff81c2ff91caff91caff71bb +ff52abff178fff178fff0069ff003edd0011ba00009d00007c00006500006500005400004900003e00003e00003e00003e00003e00003e00003e00003e000038 +00003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00005f00007600008d00008d0000a3 +0011ba0027cc003edd0044e2004be70053ed0053ed0053ed005af3005af30062f90069ff0069ff0071ff0071ff0071ff0071ff0069ff0062f9005af30053ed00 +53ed004be70044e2003edd0036d70027cc0018c00009b50009b50000a900009800008d00008200007c00007100006b00006b00006500006500006500006b0000 +7100007600007c00007c00007c00007600007100006b00006500006500006500005f00006b0000760000880000980000a90011ba0011ba0020c60036d7003edd +004be7004be70053ed005af3005af30062f90069ff0069ff0069ff0069ff0062f90062f90053ed004be7003edd002fd20027cc0027cc0027cc0027cc0027cc00 +2fd20036d70044e20044e2004be7004be7004be70044e2003edd0036d7002fd2002fd20036d70036d70036d70044e20053ed0062f90071ff0080ff0788ff0788 +ff178fff2797ff369eff42a4ff62b3ff71bbff91caff91caffa0d1ff91caff91caff52abff178fff0069ff003edd003edd0020c60000a900009d000093000093 +00009300009300009800009d0000a30000a90001af0011ba0020c60020c60027cc003edd004be7005af30071ff0788ff2797ff2797ff52abff71bbff81c2ff81 +c2ff71bbff52abff178fff178fff0069ff003edd0018c000009d00007c00006500006500004e00004900003e00003e00003e00003e00003e00003e00003e0000 +3e000038000038000038000038000038000038000038000038000038000038000000000038000038000000000000000000000000000000000000000000000000 +000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004900005900007100008d0000 +8d0000a30011ba0027cc003edd004be70053ed005af3005af30062f90062f90069ff0069ff0071ff0071ff0071ff0071ff0071ff0069ff0069ff0069ff0069ff +0062f90062f90062f90062f9005af30053ed0044e20036d70020c60020c60011ba0000a900009800008d00007c00007600006b00006b00006500005f00006500 +006b00007100007600007600007600007c00007600007100006b00006500006500006500006500007100007c00008d00009d0009b50020c60020c6002fd20044 +e20053ed005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff005af3005af30053ed0044e2003edd0036d70027cc0027cc0027cc0027cc +0027cc0027cc002fd20036d70036d7003edd0036d70036d7002fd20027cc0020c60018c00018c00020c60027cc0027cc002fd2003edd004be7005af30062f900 +71ff0071ff0071ff0078ff0080ff0080ff178fff2797ff42a4ff42a4ff52abff52abff42a4ff178fff0078ff005af30036d70036d70020c60001af0000a30000 +9d00009d00009d00009d00009d0000a30000a90001af0009b50011ba0020c60020c6002fd2003edd004be70062f90071ff0788ff369eff369eff52abff71bbff +71bbff81c2ff62b3ff42a4ff0788ff0788ff0062f90036d70009b500009800007600005f00005f00004900004400003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000003800003800003800003800003800000000000000000000000000003800003800003800003800004400005900007100 +008800008800009d0011ba0027cc003edd004be7005af30062f90062f90069ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0069ff0069ff0069 +ff0071ff0071ff0071ff0078ff0078ff0078ff0071ff0062f90053ed003edd003edd0027cc0011ba0000a300009300008200007600006b00006b00006500005f +00006500006500006b00007100007600007600007600007600007100006b00006500006b00006b00006b0000760000820000980000a90011ba002fd2002fd200 +44e2005af30062f90071ff0071ff0078ff0071ff0071ff0071ff0071ff0071ff0069ff0062f9005af3005af30053ed0044e2003edd0036d70027cc0027cc0020 +c60020c60027cc0027cc0027cc002fd20027cc0027cc0020c60020c60018c00011ba0001af0001af0001af0009b50011ba0011ba0018c00027cc0036d70044e2 +004be70053ed0053ed005af3005af3005af30062f90069ff0071ff0078ff0078ff0788ff0788ff0080ff0071ff0062f90044e2002fd2002fd20018c00009b500 +00a90000a30000a30000a90000a90000a90000a90001af0001af0009b50011ba0020c60020c6002fd2003edd004be70062f90078ff0788ff369eff369eff52ab +ff71bbff71bbff71bbff52abff369eff0080ff0080ff0062f90036d70001af000093000071000059000059000044000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000038000038000038000000000000000000000000000000000000000000000038000038000044000054 +00006b00008800008800009d0009b50027cc003edd0053ed0062f90069ff0069ff0071ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff0071ff0069ff00 +69ff0071ff0078ff0080ff0080ff0788ff178fff0788ff0788ff0078ff0069ff004be7004be70036d70018c00001af00009800008800007600006b00006b0000 +6500005f00006500006500006b00007100007600007600007600007100007100006b00006b00006b00006b00007100007c0000880000980001af0018c00036d7 +0036d7004be70062f90071ff0078ff0078ff0080ff0078ff0078ff0078ff0071ff0071ff0069ff0062f90053ed0053ed004be70044e20036d7002fd20027cc00 +20c60020c60020c60020c60020c60020c60020c60018c00018c00011ba0011ba0001af0000a90000a300009d00009d0000a30000a90000a90009b50011ba0020 +c6002fd20036d7003edd003edd003edd003edd003edd0044e20044e2004be7005af3005af30062f90062f90062f90053ed004be70036d70027cc0027cc0018c0 +0011ba0009b50009b50009b50009b50009b50009b50009b50011ba0011ba0018c00020c60027cc0027cc0036d70044e2005af30069ff0080ff178fff42a4ff42 +a4ff52abff71bbff71bbff71bbff52abff369eff0078ff0078ff0053ed0027cc0000a900008800006b00005400005400003e0000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000 +3e00004e00006b00008200008200009d0009b50027cc003edd0053ed0062f90071ff0071ff0078ff0080ff0080ff0080ff0080ff0078ff0071ff0071ff0071ff +0069ff0071ff0071ff0080ff178fff178fff2797ff42a4ff369eff369eff178fff0080ff0062f90062f90044e20027cc0009b500009d00008800007c00006b00 +006b00006500005f00006500006500006b00007100007100007100007600007100007100006b00006b00006b00006b00007100007c00008d00009d0009b50020 +c6003edd003edd0053ed0069ff0078ff0080ff0788ff0788ff0080ff0080ff0078ff0071ff0069ff0062f9005af30053ed0053ed004be7003edd0036d7002fd2 +0027cc0020c60018c00018c00018c00011ba0011ba0011ba0009b50001af0000a90000a90000a30000980000930000930000930000930000980000980000a300 +00a90009b50011ba0018c00020c60020c60020c60020c60020c60020c60027cc002fd20036d70036d7003edd003edd003edd0036d70036d70027cc0020c60020 +c60018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00020c60027cc002fd2002fd2003edd0053ed0062f90078ff0788ff2797ff +52abff52abff62b3ff81c2ff71bbff71bbff42a4ff2797ff0071ff0071ff004be70020c60000a300008200006500004e00004e00003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000003800 +003800003e00004e00006500007c00007c0000980001af0020c6003edd0053ed0062f90071ff0071ff0080ff0080ff0788ff0788ff0788ff0080ff0078ff0078 +ff0071ff0069ff0071ff0078ff0788ff2797ff2797ff369eff52abff52abff42a4ff2797ff0080ff0062f90062f90044e20027cc0009b500009d00008800007c +00006b00006b00006b00006500006500006b00007100007100007100007100007100007100006b00006b00006500006b00006b00007100007c00008d00009d00 +01af0020c6003edd003edd0053ed0069ff0071ff0080ff0080ff0080ff0078ff0078ff0078ff0071ff0069ff0062f9005af3004be7004be70044e2003edd002f +d20027cc0020c60018c00011ba0011ba0009b50009b50001af0001af0000a90000a300009d00009d00009800009300008800008800008800008d00008d00008d +00009800009d0000a30000a90001af0001af0001af0001af0001af0001af0001af0009b50009b50011ba0011ba0018c00020c60020c60020c60020c60018c000 +18c00018c00020c60020c60027cc002fd2002fd20036d70036d7002fd2002fd2002fd2002fd20036d70036d70044e20044e20053ed0069ff0078ff178fff369e +ff52abff71bbff71bbff81c2ff91caff81c2ff71bbff42a4ff0788ff0062f90062f9003edd0011ba00009800007c000059000049000049000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000000000000000000000000000000000000 +00003800003800003800004900005f00007c00007c0000930001af0020c6003edd004be70062f90071ff0071ff0080ff0788ff178fff178fff0788ff0080ff00 +78ff0078ff0071ff0071ff0071ff0078ff178fff369eff369eff42a4ff62b3ff62b3ff52abff2797ff0788ff0069ff0069ff0044e20027cc0009b500009d0000 +8800007c00007100007100006b00006500006b00007100007100007600007100007100007100006b00006b00006500006500006b00006b00007100007c000088 +00009d0001af0020c60036d70036d7004be70062f90069ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff0069ff0062f90053ed004be7004be70044e200 +36d70027cc0020c60018c00009b50001af0001af0001af0000a90000a30000a300009d00009800009300009300008d00008800008200008200007c0000820000 +8200008200008800008d00009300009800009800009d00009d00009d00009d00009d00009800009d00009d0000a30000a30000a30000a90001af0001af0009b5 +0011ba0018c00018c00020c6002fd20036d70044e20044e2004be7004be70044e20044e20044e20044e20044e2004be7005af3005af30069ff0080ff178fff42 +a4ff62b3ff81c2ffa0d1ffa0d1ffa0d1ffa0d1ff91caff71bbff369eff0080ff005af3005af3002fd20001af00008d0000710000540000440000440000380000 +38000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000000000000000000000 +0000000000003800003800003800004900005f00007600007600008d0000a30011ba002fd20044e20062f90071ff0071ff0080ff0788ff178fff178fff178fff +0788ff0080ff0080ff0078ff0078ff0078ff0080ff178fff369eff369eff42a4ff62b3ff52abff42a4ff178fff0078ff005af3005af3003edd0020c60000a900 +009800008800007c00007100007100007100006b00007100007600007600007600007600007600007100007100006b00006500006500006b00006b0000710000 +7c0000880000980000a90011ba0027cc0027cc003edd004be70053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0044e2003edd003edd +002fd20027cc0018c00011ba0001af0001af0000a90000a90000a300009d00009d00009800009800009300008d00008d00008800008200007c00007c00007c00 +008200008200008200008800008800008d00008d00009300009300009300009300009300009300009300009300009300009800009800009d00009d0000a30000 +a90001af0011ba0020c60020c6002fd2003edd004be7005af3005af3005af3005af3005af30053ed0053ed0053ed005af3005af30069ff0069ff0078ff178fff +369eff52abff81c2ff91caffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff178fff0071ff0044e20044e20020c60000a300008800007100005400004400004400 +00380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800000000000000 +000000000000000000003800003800003800004900005f00007600007600008d0000a30011ba002fd20044e20062f90071ff0071ff0080ff0788ff178fff178f +ff178fff0788ff0080ff0080ff0078ff0078ff0078ff0080ff178fff369eff369eff42a4ff62b3ff52abff42a4ff178fff0078ff005af3005af3003edd0020c6 +0000a900009800008800007c00007100007100007100006b00007100007600007600007600007600007600007100007100006b00006500006500006b00006b00 +007100007c0000880000980000a90011ba0027cc0027cc003edd004be70053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0044e2003e +dd003edd002fd20027cc0018c00011ba0001af0001af0000a90000a90000a300009d00009d00009800009800009300008d00008d00008800008200007c00007c +00007c00008200008200008200008800008800008d00008d00009300009300009300009300009300009300009300009300009300009800009800009d00009d00 +00a30000a90001af0011ba0020c60020c6002fd2003edd004be7005af3005af3005af3005af3005af30053ed0053ed0053ed005af3005af30069ff0069ff0078 +ff178fff369eff52abff81c2ff91caffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff178fff0071ff0044e20044e20020c60000a3000088000071000054000044 +00004400003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038 +00000000000000000000000000003800003800003800004400005900006b00006b00008800009d0009b50027cc003edd005af30069ff0069ff0080ff0788ff17 +8fff178fff178fff0788ff0080ff0080ff0080ff0078ff0080ff0788ff2797ff42a4ff42a4ff42a4ff52abff42a4ff369eff0080ff0069ff004be7004be7002f +d20011ba0000a300009300008800007c00007600007600007600007100007600007c00007c00007c00007600007600007600007100006500006500006500006b +00006b00007100007c0000880000980000a30009b50018c00018c00027cc0036d7003edd0044e20044e2004be7004be7004be7004be7004be7004be70044e200 +3edd002fd2002fd20020c60018c00009b50001af0000a30000a300009d00009d00009800009800009300009300008d0000880000880000880000820000820000 +7c00007c00007c00007c00008200008200008200008200008800008800008800008d00008d00008d00008d00008d00008d00008d00008d00008d00008d000093 +00009800009d0000a90001af0018c00027cc0027cc003edd0053ed0062f90071ff0071ff0071ff0071ff0069ff0069ff0062f90062f90069ff0071ff0080ff00 +80ff0788ff369eff52abff71bbffa0d1ffb0d9ffc0e0ffc0e0ffb0d9ffa0d1ff71bbff42a4ff0788ff0062f90036d70036d70011ba00009d00008200006b0000 +54000044000044000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000 +3800003800003800003800000000000000003800003800003800003e00004e00006500006500007c0000930000a90018c00036d70053ed0062f90062f90078ff +0788ff178fff178fff2797ff178fff0788ff0788ff0788ff0080ff0788ff178fff2797ff42a4ff42a4ff42a4ff42a4ff2797ff0788ff0071ff0053ed003edd00 +3edd0020c60001af00009d00009300008800007c00007600007600007c00007c00007c00008200008200008200007c00007c0000760000710000650000650000 +6500006b00006b00007100007c00008800009300009d0000a90009b50009b50011ba0018c00020c60027cc0027cc002fd2002fd2002fd20036d70036d70036d7 +002fd20027cc0018c00018c00011ba0001af0000a300009d00009800009300009300009300009300009300008d00008d00008800008800008200008200007c00 +007c00007c00007c00008200008200008200008200008200008200008200008200008800008800008800008800008800008800008800008800008d00008d0000 +8d00009300009800009d0000a90009b50020c6003edd003edd0053ed0069ff0078ff0788ff0080ff0080ff0080ff0078ff0071ff0071ff0071ff0071ff0078ff +0788ff0788ff2797ff42a4ff71bbff81c2ffa0d1ffb0d9ffc0e0ffc0e0ffb0d9ff91caff62b3ff2797ff0071ff004be70027cc0027cc0000a900009300007600 +006500005400004900004900003e0000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000490000590000590000710000880000a30011ba002fd2004be70062f90062 +f90078ff0080ff178fff178fff2797ff178fff178fff178fff178fff178fff178fff2797ff369eff42a4ff42a4ff42a4ff369eff178fff0078ff0062f90044e2 +0027cc0027cc0009b50000a900009800008d00008200008200007c00007c00007c00008200008200008800008800008800007c00007c00007600007100006500 +006500006500006b00006b00007100007c00008800008d00009800009d0000a30000a30000a90000a90001af0001af0009b50011ba0018c00018c00020c60020 +c60020c60020c60018c00009b50009b50000a900009d00009300008d00008800008800008800008800008800008800008800008800008200008200007c00007c +00007c00007c00007c00008200008200008200008200008200008200008200008200008200008200008200008200008200008800008800008800008800008800 +008d00008d00008d00009300009d0000a90011ba002fd2004be7004be70062f90080ff178fff2797ff2797ff2797ff2797ff0788ff0080ff0080ff0078ff0080 +ff0788ff2797ff2797ff42a4ff62b3ff81c2ffa0d1ffb0d9ffc0e0ffc0e0ffc0e0ffa0d1ff81c2ff42a4ff0788ff0062f9003edd0011ba0011ba00009d000088 +00007100005f00005400004900004900004400003e00003e00003800003800003800003800003800003800003800003800000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800004400005400005400006b0000820000980001af0020c6003edd00 +53ed0053ed0069ff0078ff0080ff0788ff178fff178fff178fff178fff178fff178fff2797ff2797ff369eff369eff369eff369eff2797ff0080ff0069ff0053 +ed0036d70020c60020c60009b50000a300009800009300008d00008800008800008800008800008800008800008d00008800008800007c00007c000076000071 +00006500006500006500006b00006b00007600007c00008800008d00009300009800009800009800009800009800009800009800009d00009d0000a90000a900 +01af0001af0009b50001af0001af0000a30000a300009800009300008800008200008200008200008200008200008200008800008200008200008200007c0000 +7c00007c00007c00007c00007c00008200008800008800008800008800008800008800008800008200008200008200008200008800008800008d00008d000093 +0000930000980000980000980000a30000a90011ba0027cc0044e20062f90062f90078ff2797ff369eff42a4ff369eff369eff369eff178fff0788ff0080ff00 +80ff0080ff0788ff2797ff2797ff369eff52abff71bbff81c2ff91caff91caff91caff91caff62b3ff42a4ff0788ff0069ff0044e20018c00000a90000a90000 +8d00007600006500005900004e00004900004900004400004400003e00003e000038000038000038000038000038000038000038000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00004e00005f00007600008d0000a30011ba +002fd20044e20044e2005af30069ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff2797ff2797ff369eff369eff369eff2797ff0788ff0071ff00 +5af30044e20027cc0011ba0011ba0001af0000a300009d00009800009300009300008d00008d00008d00008d00008d00008d00008d00008800007c00007c0000 +7600007100006500006500006500007100007100007600007c00008800008d00008d00008d00008d00008d00008800008200008200008200008200008800008d +00008d00009800009d00009d00009d00009d00009300009300008800008200007c00007600007600007600007c00007c00007c00008200008200007c00007c00 +007600007600007600007600007c00007c00008200008800008d00008d00008d00008d00008d00008800008800008800008800008800008800008d0000930000 +9300009800009d0000a30000a30000a30001af0011ba0027cc0044e2005af30078ff0078ff178fff42a4ff52abff62b3ff52abff42a4ff42a4ff2797ff0788ff +0788ff0080ff0788ff0788ff2797ff2797ff369eff42a4ff52abff62b3ff71bbff62b3ff52abff52abff369eff0788ff0069ff0044e20020c60000a900009300 +009300007c00006b00005900005400004900004900004900004400004400004400003e00003e0000380000380000380000380000380000380000380000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004900004900005900006b0000820000 +980001af0020c60036d70036d7004be7005af30069ff0071ff0080ff0080ff0788ff0788ff0788ff178fff178fff2797ff2797ff2797ff2797ff0788ff0080ff +0069ff0053ed003edd0027cc0018c00018c00001af0000a90000a30000a300009d00009d00009800009800009800009800009300009300008d00008800008200 +008200007600007100006b00006b00006b00007100007100007600008200008800008800008d00008800008200008200007c0000760000760000710000760000 +7600008200008200008800008d00009300008d00008d00008800008800007c00007600007100007100007100007600007600007600007c00008200007c00007c +00007600007100007100007100007100007600007c00008800008d00009300009800009800009800009800009300009300008d00008d00008d00009300009800 +009d00009d0000a30000a90001af0001af0009b50018c00027cc003edd0053ed0071ff178fff178fff42a4ff62b3ff71bbff71bbff62b3ff42a4ff42a4ff369e +ff178fff0788ff0788ff0788ff178fff2797ff2797ff369eff369eff42a4ff42a4ff42a4ff369eff2797ff2797ff0080ff0069ff0044e20027cc0001af000093 +00008200008200006b00005f00004e00004e00004900004400004400004400003e00003e00003e00003800003800003800003800003800003800003800003800 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004400004400005400006500 +007c0000930000a90011ba0027cc0027cc003edd004be7005af30069ff0071ff0078ff0080ff0080ff0788ff178fff178fff178fff178fff178fff178fff0080 +ff0071ff005af3004be70036d70020c60018c00018c00009b50001af0001af0001af0000a90000a90000a30000a300009d00009d00009800009300008d000088 +00008200008200007600007100006b00006b00006b00007100007100007600008200008800008800008800008200007c00007c00007100006b00006500006500 +006500006b00007100007100007600007c00008200008200007c00007600007600007100006b00006500006500006b00007100007600007600007600007c0000 +7c00007600007100007100007100007100007100007600007c00008800009300009800009d00009d00009d00009d00009d00009800009800009800009800009d +0000a30000a90001af0009b50011ba0018c00018c00020c6002fd2003edd0053ed0069ff0788ff369eff369eff62b3ff81c2ff81c2ff81c2ff71bbff52abff52 +abff369eff2797ff178fff0788ff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff0788ff0078ff0078ff0062f9004be70027cc0001af0000 +9800007c00006b00006b00005900004e00004900004400004400004400004400003e00003e00003e000038000038000038000038000038000038000038000038 +00003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e000044000044000054 +00006500007c0000930000a90011ba0027cc0027cc003edd004be7005af30069ff0071ff0078ff0080ff0080ff0788ff178fff178fff178fff178fff178fff17 +8fff0080ff0071ff005af3004be70036d70020c60018c00018c00009b50001af0001af0001af0000a90000a90000a30000a300009d00009d0000980000930000 +8d00008800008200008200007600007100006b00006b00006b00007100007100007600008200008800008800008800008200007c00007c00007100006b000065 +00006500006500006b00007100007100007600007c00008200008200007c00007600007600007100006b00006500006500006b00007100007600007600007600 +007c00007c00007600007100007100007100007100007100007600007c00008800009300009800009d00009d00009d00009d00009d0000980000980000980000 +9800009d0000a30000a90001af0009b50011ba0018c00018c00020c6002fd2003edd0053ed0069ff0788ff369eff369eff62b3ff81c2ff81c2ff81c2ff71bbff +52abff52abff369eff2797ff178fff0788ff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff0788ff0078ff0078ff0062f9004be70027cc00 +01af00009800007c00006b00006b00005900004e00004900004400004400004400004400003e00003e00003e0000380000380000380000380000380000380000 +38000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000003800003800003800003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003e0000440000 +4400005400006500007600008d00009d0009b50018c00018c0002fd2003edd004be7005af30062f90071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff +0080ff0080ff0071ff0069ff0053ed0044e20036d70027cc0020c60020c60018c00018c00018c00011ba0011ba0009b50001af0001af0000a90000a300009d00 +009800009300008d00008200008200007c00007600006b00006b00006b00007100007100007600007c00008800008800008800007c0000760000760000710000 +6500005f00005f00005f00006500006b00006b00007100007100007600007100007100006b00006b00006500005f00005f000065000065000071000076000076 +00007600007c00007600007600007100006b00006b00006b00006b00007600007c00008800009800009d0000a90000a90001af0001af0001af0001af0001af00 +00a90000a90001af0009b50011ba0018c00020c60027cc002fd2002fd20036d70044e20053ed0069ff0080ff2797ff52abff52abff71bbff91caff91caff91ca +ff71bbff62b3ff62b3ff42a4ff2797ff178fff178fff178fff178fff178fff178fff178fff178fff178fff0788ff0080ff0071ff005af3005af30044e20027cc +0001af00009800008200006b00005900005900004e00004900003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800003800 +00380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000003800003800003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003e00 +004400004400005400005f0000760000880000980000a90011ba0011ba0020c6002fd2003edd004be7005af30062f90069ff0069ff0071ff0078ff0080ff0080 +ff0078ff0071ff0071ff0069ff005af3004be7003edd0036d70027cc0027cc0027cc0027cc0027cc002fd20027cc0027cc0018c00011ba0011ba0001af0000a9 +0000a300009800009300008d00008800008800007c00007600007100007100007100007100007100007600007c00008200008200008200007c00007600007600 +006b00005f00005f00005900005900005f00005f00005f00006500006500006b00006500006500005f00005f00005900005900005900005f0000650000710000 +7600007600007600007c00007600007100006b00006500006500006500006500007100007c00008d00009d0000a90009b50009b50011ba0018c00018c00018c0 +0018c00018c00018c00018c00020c60027cc002fd20036d7003edd0044e20044e2004be7005af30069ff0080ff178fff42a4ff71bbff71bbff91caffb0d9ffa0 +d1ffa0d1ff81c2ff62b3ff62b3ff42a4ff369eff2797ff178fff178fff178fff178fff178fff178fff0788ff0080ff0078ff0069ff0053ed003edd003edd0020 +c60001af00009800008200006b00005400004900004900003e00003e000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000003800003800003800003800003800003e00004400004400004400003e00003e00003e000038000038000038 +00003e00004400004400004e00005f0000710000820000930000a30001af0001af0018c00027cc0036d70044e20053ed005af30069ff0069ff0071ff0078ff00 +78ff0078ff0071ff0069ff0069ff005af30053ed0044e2003edd0036d70036d70036d70036d70036d7003edd003edd003edd0036d70027cc0018c00018c00011 +ba0001af0000a900009d00009800009300008d00008d00008800008200007600007600007600007600007600007c00008200008800008800008800008200007c +00007c00007100006b00006b00006500006500006500006b00006b00006b00006b00006500006500005f00005900005900005900005900005f00006500006b00 +007600007c00007c00007c00008200007600007100006b00006500006500006500006500007100007c0000930000a30009b50020c60020c6002fd2003edd003e +dd003edd003edd0036d70036d7003edd003edd0044e20044e2004be70053ed005af3005af30062f90069ff0071ff0788ff2797ff52abff71bbff71bbff91caff +b0d9ffa0d1ffa0d1ff81c2ff71bbff71bbff52abff369eff369eff2797ff2797ff178fff178fff178fff0788ff0080ff0078ff0069ff005af30044e2002fd200 +2fd20011ba0000a300008d00007600005f00004e00004900004900003e00003e0000380000380000380000380000380000380000380000380000380000380000 +38000038000038000000000000000000000000000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000003800003800003800003800003800003e00004400004400004400004400004400003e00003e0000 +3800003800003e00004400004400004e00005900006b00007c00008d0000980000a90000a90009b50018c0002fd2003edd004be7005af30062f90062f90069ff +0071ff0071ff0069ff0062f9005af3005af30053ed0044e20044e2003edd003edd003edd0044e20044e2004be7004be70053ed004be70044e20036d70027cc00 +27cc0018c00009b50000a90000a30000a300009d00009800009800009300008800008200007c00007c00007c00007c00007c0000820000880000880000880000 +8200008200008200007c00007600007100007100007100007100007100007100006b00006b00006500005f00005900005900005900005400005900005f00006b +00007600007c00008200008200008200008200007c00007100006b0000650000650000650000650000760000820000980001af0018c00036d70036d70044e200 +5af3005af30062f9005af3005af3005af3005af3005af30062f90062f90069ff0069ff0071ff0071ff0078ff0078ff0080ff178fff369eff52abff81c2ff81c2 +ff91caffb0d9ffa0d1ffa0d1ff91caff71bbff71bbff62b3ff42a4ff369eff369eff2797ff2797ff178fff178fff0788ff0078ff0071ff005af3004be7002fd2 +0018c00018c00000a900009300007c00006b00005900004900004400004400003e00003e00003e00003e00003e00003800003800003800003800003800003800 +00380000380000000000000000000000000000000000000000380000380000380000380000380000380000380000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000003800003800003800003800003800004400004400004900004400004400004400004400 +003e00003e00003800003e00004400004400004e00005900006500007600008200009300009d00009d0001af0011ba0027cc0036d70044e20053ed0062f90062 +f90069ff0069ff0069ff0062f9005af30053ed0053ed004be70044e20044e2003edd0044e2004be70053ed0053ed0062f90062f90062f9005af30053ed003edd +002fd2002fd20020c60011ba0009b50001af0000a90000a90000a30000a300009d00009800008d00008800008800008800008800008800008800008d00008d00 +008d00008d00008800008800008800008200008200008200007c00007c00007600007600007600006b00006500005f0000590000590000590000590000650000 +6b00007600008200008800008d00008d00008d00008800008200007600007100006500006b00006b00006b00007600008800009d0009b50027cc004be7004be7 +005af30071ff0078ff0080ff0078ff0078ff0078ff0078ff0071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff0788ff178fff2797ff369eff52abff71 +bbff71bbff91caffa0d1ffa0d1ffa0d1ff91caff81c2ff81c2ff62b3ff52abff42a4ff369eff369eff2797ff178fff178fff0080ff0071ff0062f9004be7003e +dd0020c60009b50009b500009d00008800007600005f00005400004900004400004400004400004400004400004400004400003e00003e000038000038000038 +00003800003800000000000000000000000000000000000000003800003800003800003800003800003800003800003800000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000044000044000049000049000049000049 +00004400003e00003e00003800003e00003e00003e00004900005400005f00006b00007c0000880000980000980000a30009b50020c6002fd20044e20053ed00 +62f90062f90062f90069ff0062f9005af30053ed004be7004be70044e2003edd0044e20044e2004be7005af30062f90062f90071ff0071ff0071ff0069ff005a +f3004be70036d70036d70027cc0018c00011ba0009b50009b50001af0001af0001af0000a90000a300009d00009800009300008d00008d00008d000093000093 +00009300009300009300009300009300009300009300009300008d00008d00008800008200008200007c00007100006500005f00005900005900005900005f00 +006b00007600008200008d00009300009800009800009300008d00008200007c00007100006b00006b00006b00007100007c00008d0000a30018c00036d7005a +f3005af30071ff178fff2797ff369eff2797ff2797ff2797ff178fff178fff178fff178fff2797ff2797ff2797ff2797ff2797ff2797ff2797ff369eff369eff +52abff71bbff71bbff81c2ffa0d1ffa0d1ffa0d1ff91caff81c2ff81c2ff71bbff62b3ff52abff42a4ff369eff2797ff0788ff0788ff0080ff0069ff005af300 +44e20027cc0011ba0000a30000a300008d00007c00006b00005900004e00004900004400004400004400004400004400004400004400003e00003e00003e0000 +38000038000038000038000000000000000000000000000000000000000038000038000038000038000038000038000038000038000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000440000440000490000490000 +4900004900004400003e00003800003800003800003800003800004400004900005400005f00007100007c00008d00008d00009d0001af0018c0002fd20044e2 +0053ed0062f90062f90069ff0069ff0062f90062f90053ed004be7004be7004be70044e2004be70053ed005af30069ff0071ff0071ff0080ff0080ff0080ff00 +71ff0062f9004be7003edd003edd002fd20020c60018c00018c00018c00018c00018c00018c00011ba0009b50001af0000a90000a90000a30000a30000a30000 +a30000a30000a30000a30000a30000a30000a30000a30000a30000a30000a300009d00009800008d00008d00008800007c00006b00006500005f000065000065 +00006b00007c00008800009300009d00009d0000a30000a300009d00009800008d00008200007c0000760000760000760000760000880000930000a90018c000 +3edd005af3005af30078ff178fff369eff42a4ff42a4ff369eff369eff369eff2797ff2797ff2797ff369eff369eff369eff369eff369eff369eff369eff369e +ff369eff42a4ff62b3ff62b3ff71bbff91caffa0d1ffa0d1ffa0d1ff91caff91caff81c2ff62b3ff52abff42a4ff369eff178fff0080ff0080ff0071ff005af3 +004be7002fd20018c00000a900009800009800008200007100005f00005400004e00004900004900004900004900004900004900004900004900004400004400 +003e0000380000380000380000380000000000000000000000000000000000000000380000380000380000380000380000380000380000380000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800004400004900004900 +004900004900004900004400003e00003800003800003800003800003800003e00004400004e0000540000650000710000820000820000930000a90011ba0027 +cc003edd0053ed0062f90062f90069ff0069ff0069ff0062f9005af3004be7004be7004be7004be70053ed005af30069ff0078ff0788ff0788ff178fff178fff +0788ff0078ff0069ff0053ed0044e20044e20036d70027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd20027cc0020c60018c00011ba0011ba0011ba00 +09b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0000a900009d00009d00009300008200007600007100006b0000 +7600007600007c00008d00009d0000a30001af0001af0001af0001af0000a900009d00009300008800008200007c00008200008200008200008d00009d0001af +0020c60044e20062f90062f90080ff2797ff42a4ff52abff52abff52abff52abff42a4ff369eff42a4ff42a4ff42a4ff52abff52abff52abff52abff42a4ff36 +9eff369eff2797ff369eff42a4ff42a4ff62b3ff81c2ff91caffa0d1ffa0d1ff91caff91caff81c2ff71bbff52abff42a4ff2797ff178fff0078ff0078ff0069 +ff0053ed0036d70020c60001af00009800008800008800007600006500005900004e00004e00004900004900004900004e00004e00004e00004e000049000044 +00004400003e00003800003800003800003800000000000000000000000000000000003800003800003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000044000049 +00004900004900004900004900004400003e00003800003800003800003800003800003e00004400004e0000540000650000710000820000820000930000a900 +11ba0027cc003edd0053ed0062f90062f90069ff0069ff0069ff0062f9005af3004be7004be7004be7004be70053ed005af30069ff0078ff0788ff0788ff178f +ff178fff0788ff0078ff0069ff0053ed0044e20044e20036d70027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd20027cc0020c60018c00011ba0011ba +0011ba0009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0000a900009d00009d00009300008200007600007100 +006b00007600007600007c00008d00009d0000a30001af0001af0001af0001af0000a900009d00009300008800008200007c00008200008200008200008d0000 +9d0001af0020c60044e20062f90062f90080ff2797ff42a4ff52abff52abff52abff52abff42a4ff369eff42a4ff42a4ff42a4ff52abff52abff52abff52abff +42a4ff369eff369eff2797ff369eff42a4ff42a4ff62b3ff81c2ff91caffa0d1ffa0d1ff91caff91caff81c2ff71bbff52abff42a4ff2797ff178fff0078ff00 +78ff0069ff0053ed0036d70020c60001af00009800008800008800007600006500005900004e00004e00004900004900004900004e00004e00004e00004e0000 +4900004400004400003e000038000038000038000038000000000000000000000000000000000038000038000038000038000038000038000038000038000038 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000 +3e00004400004900004900004900004900004400003e00003800003800003800003800003800003800003e00004400004e00005900006b000076000076000088 +00009d0001af0020c60036d7004be7005af3005af30062f90069ff0069ff0062f90062f9005af3005af3005af3005af30062f90071ff0080ff178fff2797ff27 +97ff369eff2797ff178fff0080ff0071ff005af3004be7004be7003edd0036d70036d70036d70036d7003edd0044e20044e20044e20044e2003edd003edd0036 +d7002fd2002fd20027cc0027cc0020c60020c60020c60020c60020c60020c60020c60020c60020c60020c60018c00009b50000a90000a900009d00008d000082 +00007c00007c00008200008200008d00009d0001af0009b50018c00011ba0011ba0011ba0001af0000a300009d00009300008d00008d00008d00008d00009300 +009d0000a90011ba0027cc003edd005af3005af30071ff178fff2797ff42a4ff42a4ff42a4ff42a4ff369eff369eff369eff42a4ff42a4ff52abff52abff52ab +ff52abff42a4ff42a4ff369eff2797ff369eff42a4ff42a4ff52abff71bbff81c2ff91caff91caff91caff91caff81c2ff62b3ff52abff369eff178fff0080ff +0071ff0071ff005af3003edd0027cc0009b500009d00008800007600007600006b00005900005400004900004900004900004900004900004900004900004900 +004900004400003e00003e0000380000380000380000380000380000000000000000000000000000000000380000380000380000380000380000380000380000 +38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800 +003800003e00004400004900004900004900004900004400003e00003800003800003800003800003800003800003800003e00004400005400005f0000710000 +710000820000930000a90011ba002fd20044e2005af3005af30062f90069ff0069ff0069ff0069ff0062f90062f90069ff0069ff0078ff0080ff178fff369eff +42a4ff42a4ff42a4ff369eff2797ff0788ff0071ff0062f90053ed0053ed0044e2003edd003edd003edd0044e20053ed0053ed0053ed005af3005af3005af300 +5af30053ed004be7004be70044e2003edd003edd0036d70036d70036d70036d70036d70036d70036d70036d70036d70027cc0020c60009b50009b50000a90000 +9800008d0000880000880000930000930000a30009b50018c00027cc002fd20027cc0020c60020c60011ba0001af0000a300009d00009800009800009d00009d +00009d0000a90001af0018c00027cc003edd0053ed0053ed0069ff0080ff178fff369eff369eff369eff369eff369eff2797ff369eff42a4ff52abff62b3ff62 +b3ff62b3ff62b3ff52abff42a4ff369eff2797ff369eff369eff369eff52abff62b3ff81c2ff91caff91caff91caff91caff71bbff62b3ff42a4ff2797ff0788 +ff0078ff0062f90062f9004be7002fd20011ba0000a300008d00007c00006500006500005900004e000049000044000044000044000044000044000049000049 +00004900004400003e00003800003800003800003800003800003800003800000000000000000000000000000000003800003800003800003800003800003800 +00380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038 +00003800003800003e00004400004900004900004900004900004400003e00003800003800003800003800003800003800003800003800003e00004900005400 +006500006500007600008800009d0009b50020c6003edd0053ed0053ed005af30069ff0071ff0071ff0071ff0071ff0071ff0078ff0080ff0788ff2797ff42a4 +ff52abff62b3ff62b3ff62b3ff42a4ff369eff178fff0078ff0069ff005af3005af3004be70044e2004be7004be70053ed0062f90069ff0069ff0071ff0078ff +0078ff0078ff0071ff0069ff0069ff0062f9005af30053ed0053ed004be7004be7004be7004be7004be7004be7004be70044e2003edd002fd20020c60020c600 +09b50000a90000980000980000980000a90000a90009b50020c60036d70036d7003edd002fd20027cc0027cc0018c00009b50001af0000a90000a90000a90001 +af0001af0009b50011ba0018c00020c60027cc0036d70044e20044e2005af30069ff0078ff0788ff0788ff178fff178fff178fff178fff2797ff369eff42a4ff +52abff62b3ff62b3ff62b3ff52abff52abff42a4ff369eff369eff369eff369eff42a4ff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff62b3ff52abff369eff17 +8fff0078ff0069ff0053ed0053ed0036d70018c00000a900009300007c00006b00005900005900004e00004400003e00003e00003e00003e00003e00003e0000 +3e00003e00003e00003e000038000038000038000038000038000038000038000000000000000000000000000000000038000038000038000038000038000038 +00003800003800000000000000000000000000000000000000000000000000000000000000000000380000380000000000000000000000000000000000380000 +3800003800003800003800003800003e00004400004900004900004900004400004400003e000038000038000038000038000038000038000038000038000044 +00004900005900005900006b00007c0000930000a90018c0002fd2004be7004be7005af30069ff0071ff0078ff0078ff0080ff0080ff0788ff178fff369eff52 +abff62b3ff81c2ff81c2ff81c2ff71bbff52abff42a4ff178fff0080ff0071ff0062f90062f9005af30053ed0053ed005af30062f90071ff0080ff0080ff178f +ff178fff2797ff2797ff178fff0788ff0788ff0080ff0078ff0071ff0069ff0062f90062f90062f90062f90062f90062f9005af3005af3004be70044e2002fd2 +002fd20018c00009b50000a90000a90000a90011ba0011ba0027cc0036d7004be7004be7004be7003edd002fd2002fd20020c60011ba0009b50009b50009b500 +11ba0018c00018c00020c60020c60027cc0027cc0027cc002fd2003edd003edd004be7005af30062f90071ff0078ff0080ff0080ff0080ff0788ff178fff2797 +ff42a4ff52abff62b3ff62b3ff71bbff62b3ff52abff42a4ff369eff369eff369eff369eff42a4ff52abff62b3ff81c2ff71bbff71bbff71bbff52abff42a4ff +2797ff0080ff0069ff005af3003edd003edd0027cc0001af00009800008200006b00005900004900004900003e00003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000380000380000380000380000 +38000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000003800003800003800003800003800003800003e00004400004900004900004400004400003e00003e0000380000380000380000380000380000380000 +3800003e00004400005400005400005f0000710000820000980001af0018c00036d70036d7004be7005af30069ff0071ff0078ff0788ff0788ff178fff369eff +52abff71bbff81c2ff91caff91caff91caff81c2ff62b3ff42a4ff2797ff0080ff0071ff0062f90062f9005af30053ed005af30062f90069ff0078ff0080ff00 +80ff178fff2797ff369eff2797ff2797ff178fff178fff0788ff0080ff0078ff0071ff0071ff0071ff0069ff0069ff0069ff0069ff0069ff0062f9005af3004b +e7003edd003edd0027cc0018c00009b50011ba0011ba0020c60020c60036d70044e20053ed0053ed0053ed0044e20036d70036d70027cc0018c00018c00011ba +0018c00020c60027cc0027cc002fd20036d70036d70036d7002fd2002fd20036d70036d7003edd004be7005af30069ff0071ff0078ff0078ff0080ff0788ff17 +8fff369eff42a4ff62b3ff62b3ff62b3ff71bbff71bbff62b3ff52abff42a4ff42a4ff42a4ff42a4ff52abff62b3ff62b3ff71bbff62b3ff52abff52abff369e +ff178fff0078ff0069ff0053ed003edd0027cc0027cc0009b500009d00008800007100005900004e00003e00003e000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000003800003800003800 +00380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000003800003800003800003800003e00003e00004400004400004400004400004400003e00003e00003800003800003800003800 +003800003800003800003e00004900004900005400006500007600008800009d0009b50020c60020c60036d7004be70062f90071ff0080ff0788ff0788ff2797 +ff42a4ff71bbff91caffa0d1ffb0d9ffa0d1ffa0d1ff91caff71bbff52abff2797ff0788ff0078ff0069ff0069ff0062f9005af30062f90062f90071ff0080ff +0788ff0788ff2797ff2797ff369eff369eff2797ff178fff178fff178fff0788ff0080ff0080ff0078ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff00 +62f90053ed0044e20044e20036d70027cc0020c60020c60027cc0036d70036d7003edd004be7005af3005af30053ed0044e2003edd003edd002fd20020c60020 +c60020c60027cc0036d7003edd003edd0044e20044e20044e2003edd0036d70036d7002fd2002fd20036d7003edd004be7005af30069ff0071ff0071ff0080ff +0788ff2797ff369eff52abff62b3ff71bbff71bbff71bbff71bbff71bbff62b3ff62b3ff52abff52abff52abff62b3ff62b3ff62b3ff52abff42a4ff369eff36 +9eff0788ff0078ff0062f9004be70036d70020c60009b50009b50000a300008d00007600006500004e0000440000380000380000380000380000380000380000 +38000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038 +00003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000003800003800003800003800003e00004400004400004400004900004400004400003e00003e00003e000038 +00003800003800003800003800003800004400004400004900005400006500007600008d00009d0009b50009b50027cc003edd0053ed0062f90071ff0788ff07 +88ff2797ff42a4ff71bbff91caffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff369eff178fff0080ff0071ff0071ff0069ff0062f90069ff0071ff0078 +ff0788ff178fff178fff2797ff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0080ff0080ff0080ff0080ff0080ff0080ff0080ff0078ff +0071ff0069ff005af3004be7004be7003edd0036d7002fd2002fd20036d7003edd003edd004be70053ed005af3005af3005af3004be70044e20044e20036d700 +2fd2002fd2002fd20036d7003edd004be7004be70053ed0053ed0053ed004be7003edd0036d7002fd2002fd2002fd20036d70044e20053ed0062f90078ff0078 +ff0788ff178fff369eff52abff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff81c2ff71bbff71bbff62b3ff62b3ff62b3ff62b3ff52abff42a4ff42a4ff2797ff +0080ff0080ff0071ff005af30044e2002fd20018c00001af00009d00009d00008d00007c00006500005400004400003e00003800003800003800003800003800 +00380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400004400004900004400004400003e00003e0000 +3e00003800003800003800003800003800003800004400004400004900005400006500007600008d00009d0009b50009b50027cc003edd0053ed0062f90071ff +0788ff0788ff2797ff42a4ff71bbff91caffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff369eff178fff0080ff0071ff0071ff0069ff0062f90069ff00 +71ff0078ff0788ff178fff178fff2797ff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0080ff0080ff0080ff0080ff0080ff0080ff0080 +ff0078ff0071ff0069ff005af3004be7004be7003edd0036d7002fd2002fd20036d7003edd003edd004be70053ed005af3005af3005af3004be70044e20044e2 +0036d7002fd2002fd2002fd20036d7003edd004be7004be70053ed0053ed0053ed004be7003edd0036d7002fd2002fd2002fd20036d70044e20053ed0062f900 +78ff0078ff0788ff178fff369eff52abff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff81c2ff71bbff71bbff62b3ff62b3ff62b3ff62b3ff52abff42a4ff42a4 +ff2797ff0080ff0080ff0071ff005af30044e2002fd20018c00001af00009d00009d00008d00007c00006500005400004400003e000038000038000038000038 +00003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00003e00004400004900004900004900004400 +004400004400003e00003e00003800003800003800003800003800003800003e00004900005400006500007600008d0000a30000a30011ba002fd20044e2005a +f30069ff0080ff0080ff2797ff42a4ff71bbff91caffb0d9ffc0e0ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff42a4ff178fff0788ff0078ff0078ff0071ff0071ff +0071ff0078ff0080ff178fff2797ff2797ff369eff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0788ff0788ff0788ff0788ff0788ff07 +88ff0788ff0080ff0078ff0071ff0062f9005af3005af3004be70044e2003edd003edd0044e2004be7004be70053ed005af30062f90062f9005af30053ed004b +e7004be7003edd0036d70036d70036d70044e2004be7005af3005af30062f90062f90062f9005af3004be7003edd002fd2002fd2002fd2002fd2003edd004be7 +0062f90078ff0078ff0788ff2797ff42a4ff62b3ff71bbff81c2ff91caff91caff91caff91caff91caff81c2ff81c2ff71bbff71bbff71bbff62b3ff52abff36 +9eff2797ff0080ff0069ff0069ff0053ed003edd0027cc0011ba0000a90000980000880000880000760000650000540000490000380000380000380000380000 +38000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00003e000044000044000049000049 +00004900004400004400004400003e00003800003800003800003800003800003800003800003e00004400005400006500007c0000930000930000a30011ba00 +2fd20044e2005af30071ff0071ff0788ff369eff52abff81c2ffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff91caff71bbff52abff2797ff178fff0080ff0080ff0080 +ff0080ff0080ff0788ff178fff2797ff369eff369eff369eff369eff2797ff2797ff178fff0788ff0788ff0080ff0080ff0788ff0788ff0788ff0788ff178fff +178fff0788ff0788ff0080ff0080ff0071ff0069ff005af3005af30053ed004be7004be7004be7004be70053ed0053ed005af3005af30062f90062f90062f900 +5af30053ed0053ed004be70044e20044e2003edd004be70053ed0062f90062f90069ff0071ff0071ff0062f9005af30044e20036d70036d70036d70036d70044 +e20053ed0069ff0080ff0080ff2797ff52abff71bbff81c2ff91caffa0d1ffa0d1ffa0d1ffa0d1ffa0d1ffa0d1ff91caff91caff81c2ff71bbff71bbff52abff +42a4ff178fff0080ff0062f9004be7004be70036d70018c00001af00009d00009300008200007100007100006500005400004900003e00003800003800003800 +00380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e0000440000 +4900004900004900004900004900004400004400003e00003800003800003800003800003800003800003800003800004400004e00006500007c00007c000093 +0000a90018c0002fd20044e2005af3005af30078ff178fff42a4ff71bbff91caffa0d1ffa0d1ffa0d1ffa0d1ff91caff71bbff52abff369eff2797ff178fff17 +8fff178fff0788ff178fff2797ff2797ff369eff369eff369eff42a4ff369eff2797ff178fff0080ff0080ff0080ff0078ff0080ff0080ff0788ff0788ff178f +ff178fff178fff178fff178fff0788ff0080ff0078ff0069ff0062f90062f9005af3005af30053ed0053ed005af3005af3005af3005af30062f90062f90062f9 +0062f90062f9005af3005af30053ed004be7004be7004be70053ed005af30069ff0069ff0071ff0078ff0080ff0071ff0062f90053ed003edd003edd003edd00 +36d7004be7005af30071ff178fff178fff42a4ff71bbff91caffb0d9ffb0d9ffc0e0ffc0e0ffc0e0ffc0e0ffb0d9ffb0d9ffa0d1ff91caff81c2ff71bbff71bb +ff42a4ff2797ff0080ff0069ff004be7002fd2002fd20011ba0000a900009800008800007600006b00005900005900004e000044000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800 +003e00004400004900004900004900004900004900004400003e00003800003800003800003800003800003800003800003800003800004400005400006b0000 +6b0000820000980000a90018c0002fd20044e20044e2005af30071ff178fff42a4ff62b3ff91caff91caff91caffa0d1ff91caff81c2ff62b3ff52abff369eff +2797ff2797ff2797ff2797ff369eff369eff42a4ff52abff52abff52abff52abff369eff2797ff0788ff0080ff0078ff0078ff0078ff0078ff0078ff0080ff07 +88ff178fff178fff178fff178fff0788ff0080ff0078ff0071ff0069ff0062f90062f9005af3005af3005af30062f90062f90062f90062f90062f90062f90069 +ff0069ff0069ff0062f90062f90062f9005af3005af30053ed004be70053ed005af30069ff0069ff0078ff0080ff0788ff0080ff0071ff0062f90053ed0053ed +004be70044e20053ed0069ff0080ff369eff369eff62b3ff91caffb0d9ffcfe8ffcfe8ffcfe8ffcfe8ffcfe8ffc0e0ffb0d9ffb0d9ff91caff81c2ff62b3ff42 +a4ff42a4ff178fff0078ff0062f90044e20027cc0011ba0011ba0000a300009300008200007100006500005400004900004900003e0000380000380000380000 +3800003800003800003800003800003800003800003e000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038 +00003800003800004400004900004900004e00004e00004900004900003e00003800003800003800003800003800000000000000000000003800003800004400 +005900005900006b0000820000980000a90011ba0027cc0027cc003edd005af30078ff178fff42a4ff71bbff81c2ff81c2ffa0d1ff91caff81c2ff71bbff62b3 +ff52abff42a4ff42a4ff42a4ff42a4ff52abff52abff62b3ff71bbff62b3ff62b3ff62b3ff42a4ff2797ff0788ff0078ff0071ff0071ff0071ff0071ff0078ff +0080ff0788ff178fff178fff178fff178fff0788ff0080ff0078ff0069ff0062f90062f90062f90062f90062f90062f90069ff0069ff0069ff0069ff0069ff00 +69ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0062f9005af30053ed005af30062f90069ff0069ff0078ff0788ff178fff0788ff0080ff0071ff0062 +f90062f9005af3005af30062f90071ff178fff42a4ff42a4ff81c2ffb0d9ffcfe8ffdfefffdfefffeff7ffdfefffdfefffcfe8ffc0e0ffa0d1ff91caff71bbff +42a4ff2797ff2797ff0078ff0062f90044e20027cc0009b500009d00009d00008d00007c00006b00005900004e00004400003800003800003800003800003800 +003800003800003800003800003800003800003e00003e00003e00003e0000380000380000380000380000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000 +3800003800003800003800003e00004400004900004e00004e00004900004900004400003e000038000038000038000038000000000000000000000038000038 +00003800004900004900005f0000710000820000930000a30009b50009b50027cc003edd005af30078ff2797ff52abff71bbff71bbff91caff81c2ff81c2ff71 +bbff62b3ff52abff52abff52abff52abff52abff62b3ff62b3ff71bbff71bbff71bbff71bbff62b3ff42a4ff2797ff0788ff0071ff0069ff0069ff0062f90069 +ff0071ff0078ff0080ff0788ff0788ff0788ff0788ff0080ff0078ff0069ff0062f9005af30062f90062f90062f90062f90069ff0069ff0071ff0071ff0071ff +0071ff0069ff0069ff0071ff0071ff0071ff0071ff0071ff0069ff0069ff0062f9005af3005af30062f90071ff0071ff0078ff0788ff2797ff178fff178fff00 +80ff0071ff0071ff0069ff0069ff0071ff0080ff2797ff62b3ff62b3ff91caffc0e0ffcfe8ffeff7ffeff7ffeff7ffcfe8ffcfe8ffc0e0ffb0d9ff91caff71bb +ff42a4ff178fff0078ff0078ff005af30044e20020c60001af00009d000088000088000076000065000059000049000044000038000038000038000038000038 +00003800003800003800003800003800003800003e00004400004400004400003e00003800003800003800003800000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000003800003800003800004400004900004e00004e00004e00004e00004400003e0000380000380000380000380000000000000000000000 +0000003800003800003e00003e00004e00005f00007100008200009300009d00009d0009b50020c60044e20062f90080ff369eff52abff52abff81c2ff81c2ff +81c2ff71bbff62b3ff62b3ff52abff52abff62b3ff62b3ff71bbff71bbff81c2ff81c2ff71bbff71bbff62b3ff42a4ff178fff0080ff0069ff0062f90062f900 +5af30062f90069ff0071ff0080ff0080ff0788ff0788ff0080ff0078ff0069ff0062f9005af30053ed005af3005af3005af30069ff0071ff0071ff0078ff0071 +ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0071ff0069ff0062f9005af30062f90062f90071ff0071ff0080ff0788ff2797ff2797ff +2797ff0788ff0080ff0080ff0078ff0078ff0080ff178fff42a4ff71bbff71bbffa0d1ffc0e0ffdfefffeff7ffeff7ffeff7ffcfe8ffcfe8ffc0e0ffa0d1ff81 +c2ff52abff2797ff0080ff0062f90062f90044e20020c60001af00009800008200007100007100005f00004e00004900003e0000380000380000380000380000 +0000000000000000003800003800003800003800003800003e00004400004400004900003e000038000038000038000038000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000003800003800003800004400004900004e00004e00004e00004e00004400003e00003800003800003800003800000000000000 +000000000000003800003800003e00003e00004e00005f00007100008200009300009d00009d0009b50020c60044e20062f90080ff369eff52abff52abff81c2 +ff81c2ff81c2ff71bbff62b3ff62b3ff52abff52abff62b3ff62b3ff71bbff71bbff81c2ff81c2ff71bbff71bbff62b3ff42a4ff178fff0080ff0069ff0062f9 +0062f9005af30062f90069ff0071ff0080ff0080ff0788ff0788ff0080ff0078ff0069ff0062f9005af30053ed005af3005af3005af30069ff0071ff0071ff00 +78ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0071ff0069ff0062f9005af30062f90062f90071ff0071ff0080ff0788ff2797 +ff2797ff2797ff0788ff0080ff0080ff0078ff0078ff0080ff178fff42a4ff71bbff71bbffa0d1ffc0e0ffdfefffeff7ffeff7ffeff7ffcfe8ffcfe8ffc0e0ff +a0d1ff81c2ff52abff2797ff0080ff0062f90062f90044e20020c60001af00009800008200007100007100005f00004e00004900003e00003800003800003800 +003800000000000000000000003800003800003800003800003800003e00004400004400004900003e0000380000380000380000380000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000003800003800003800003e00004900004e00004e00004e00004e000049000044000038000038000038000038000000 +00000000000000000000003800003800003800003800004900005400005f00007100007c00008d00008d00009d0001af0027cc0044e20062f90080ff2797ff27 +97ff52abff52abff62b3ff52abff42a4ff42a4ff369eff369eff369eff369eff42a4ff52abff52abff52abff52abff52abff42a4ff178fff0080ff0069ff005a +f30053ed0053ed004be7004be70053ed0062f90069ff0069ff0071ff0071ff0069ff0062f90053ed004be70044e20044e2004be7004be70053ed005af30062f9 +0069ff0071ff0071ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0062f9005af3005af3005af3005af30069ff0069ff0078ff00 +80ff178fff178fff2797ff178fff0788ff0788ff0080ff0080ff0788ff2797ff42a4ff62b3ff62b3ff81c2ffa0d1ffb0d9ffc0e0ffb0d9ffa0d1ff91caff91ca +ff71bbff52abff369eff0788ff0078ff005af3003edd003edd0020c60001af00009800008200007100005f00005f00005400004400003e000038000038000038 +00003800003800000000000000003800003800003800003800003e00003e00004400004900004900004400003e00003800003800003800003800000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000003800003800003e00004400004e00004e00004e00005400004e00004900003e0000380000380000 +3800003800000000000000000000003800003800003800003800003e00004900005400005f00006b0000760000760000880000980009b50027cc004be70069ff +0080ff0080ff2797ff2797ff369eff2797ff2797ff178fff178fff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff178fff0080ff0069ff00 +5af30044e2003edd003edd0036d7003edd0044e2004be70053ed005af3005af3005af30053ed0044e2003edd002fd2002fd2002fd2003edd003edd0044e20053 +ed005af30062f90069ff0069ff0069ff0069ff0062f90062f90062f90062f90062f90062f90062f9005af3005af30053ed0053ed0053ed0053ed0062f90062f9 +0071ff0078ff0788ff178fff178fff178fff0788ff0788ff0788ff0788ff178fff2797ff42a4ff52abff52abff71bbff81c2ff81c2ff81c2ff71bbff62b3ff42 +a4ff42a4ff369eff178fff0080ff0069ff0053ed0036d70020c60020c60001af00009300008200006b00005900004e00004e0000440000380000380000380000 +3800003800000000000000000000000000003800003800003800003800004400004400004400004900004900004400003e000038000038000038000038000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000003800003800003e00004400004e00004e00004e00005400004e00004900004400003800 +003800003800003800003800003800003800003800003800003800003800003e00004900004e00005400005f00006500006500007600008800009d0009b50027 +cc004be7005af3005af30071ff0078ff0080ff0078ff0078ff0071ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0080ff0078ff0078ff0071ff0062f9 +0053ed003edd002fd20027cc0027cc0020c60027cc002fd20036d7003edd003edd003edd003edd0036d70027cc0020c60018c00018c00018c00027cc0027cc00 +2fd2003edd004be7004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70044e20044e20044e2003edd0044e20044e20053 +ed0053ed005af30069ff0078ff0078ff0080ff0080ff0080ff0080ff0080ff0788ff0788ff178fff2797ff369eff369eff369eff42a4ff369eff369eff2797ff +0788ff0080ff0080ff0071ff0062f90053ed0044e2002fd20018c00001af0001af00009800008200007100005900004e00004400004400003800003800003800 +003800003800003800003800003800000000003800003800003800003800003e00004400004400004400004900004400004400003e0000380000380000380000 +38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000 +0000000000000000000000000000000000000000000000000000000000000000003800003800003800004400004e00004e00004e00005400004e00004e000049 +00003e00003800003800003800003800003800003800003800003800003800003800003e00004400004900004900004e00005400005400006500007100008800 +009d0009b50027cc003edd003edd0053ed005af30062f9005af3005af30053ed0053ed0053ed0053ed0053ed0053ed005af3005af3005af3005af3005af30053 +ed0044e20036d70027cc0018c00011ba0011ba0009b50011ba0011ba0020c60027cc0027cc0020c60020c60018c00011ba0001af0000a90000a90001af0011ba +0011ba0018c00027cc0036d7003edd0044e20044e20044e20044e20044e2003edd003edd003edd0036d70036d70036d7002fd2002fd2002fd2002fd2002fd200 +36d70044e20044e2004be7005af30062f90069ff0071ff0071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff0788ff0788ff0788ff0788ff0080ff0071 +ff0069ff005af30053ed0053ed0044e20036d7002fd20020c60011ba0000a900009800009800008200007100005900004900003e000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003e00004400004400004900004900004400003e00003800003800003800 +00380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800 +003800003800003800000000000000000000000000000000000000000000000000000000003800003800003800004400004900004900004e00005400004e0000 +4e00004900004400003e00003e00003800003800003800003800003800003800003e00003e00003e00004400004400004400004400004900004900005400005f +0000710000820000980001af0018c00018c00027cc002fd20036d70036d70036d7002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d70036d70036d700 +36d7002fd20027cc0018c00009b50000a90000a30000a300009d0000a30000a90001af0009b50009b50001af0001af0000a900009d0000980000930000980000 +980000a30000a30001af0009b50018c00020c60027cc0027cc0027cc002fd20027cc0027cc0027cc0020c60020c60018c00018c00011ba0011ba0011ba0011ba +0018c00020c60027cc0027cc0036d7003edd004be70053ed005af30062f90069ff0069ff0069ff0071ff0078ff0078ff0071ff0071ff0071ff0069ff005af300 +53ed0044e20036d7002fd20020c60020c60011ba0009b50001af0000a300009d00008d00008200008200007100005f00004e00003e0000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003e00004400004900004900004900004400004400003e000038000038 +00003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038 +00003800003800003800003800003800000000000000000000000000000000000000000000000000003800003800003800003e00004900004900004e00005400 +005400004e00004e00004900004400004400003e00003800003800003800003e00003e00004400004400004400004400003e00003e00003e0000380000380000 +4400004900005900006b00007c00009300009d00009d0001af0009b50011ba0011ba0011ba0009b50009b50009b50009b50009b50009b50009b50011ba0011ba +0011ba0011ba0009b50001af0000a300009d00009300008d00008d00008d00009300009300009800009d00009800009800009800008d00008800008200007c00 +00820000880000930000930000980000a30000a90001af0009b50011ba0011ba0011ba0011ba0011ba0009b50009b50001af0000a90000a90000a30000a30000 +a30000a90001af0009b50011ba0011ba0020c60027cc002fd20036d70044e2004be70053ed0053ed005af30069ff0069ff0069ff0062f90053ed0053ed0044e2 +0036d70027cc0018c00009b50000a900009d00009d00009800009300008d00008800008200007600006b00006b00005f00004e00004400003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003e00004400004400004900004900004900004400003e0000380000 +38000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003e00004900005400005900005900005f0000650000650000650000650000650000650000650000650000650000650000650000 +6500006500006500006500006500005f00005900005900005400004e00004e00004e00005400005400005400005900005400005400005400004e00004e000049 +00004900004900004e00004e00004e00005400005900005f00005f00006500006500006500006500006500006500006500006500005f00005f00005f00005900 +005900005900005f00005f00006500006500006500006b00007100007100007600007c00007c0000820000820000820000880000880000880000880000820000 +8200007c00007600007100006b00006500005f00005900005900005400005400004e00004e00004900004400003e00003e000038000038000038000038000038 +00000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800 +00380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff00000000000030d20000430f2000cc000000a700 +d600000000004c004c007800160128000000d6000000a7000000010018000000000000000000eb0a0000eb0a0000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000003800003800003800003800003800003800003e0000440000440000440000440000440000440000 +4400004400004400004400004400004400004400004900004900004e00005400005400005400005900005900005400005400004e00004e00004e000049000044 +00003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000 +00000000000000000000380000380000380000380000380000380000380000380000380000000000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000 +00000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800 +003800003800003800003800003800003800000000000000000000003800003800003800003800003800003800003800003800003e00003e00003e00003e0000 +3e00004400003e00003e00003e000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038 +00003800003800003800000000000000000000000000003800003800003800003800003800004900005400005f00006b00007100007600007600007600007600 +007600007600007600007100007100007100007100007600007c00008200008800009300009300009800009d00009d00009800009800008d0000880000880000 +7c00007100006b00006500006500005f00005f00005f00005900005400004e00004400003e000038000038000038000038000000000000000000000000000000 +00000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400004e00005400005f00006500006500006b00 +006b00006b00007100006b00006b00006500005f00005400005400004e00004900003e0000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800004900005900006b00007c00008800008d000098000098000098 +00009800009800009800009800009300009300009300009300009800009d0000a90001af0011ba0011ba0018c00020c60027cc0020c60018c00009b50000a900 +00a900009d00009300008d00008800008200007c00007600007600007600006b00006500005900004e0000440000440000380000380000380000000000000000 +0000000000000000000000003800003800003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003e00003e000044 +00004400004400003e00003e00003e00003800003800003800003800003800003e00003e00004400004400004400004400003e00003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003e00003e00003e00003800003800003800003800003800003800003800003800003800004900004900005400005f00006b00007100007c000082 +00008200008200008800008800008200008200007c00007100006b00006b00005f00005400004e00004400003e00003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800004400004400005900006b0000820000930000a30001af0011ba0011 +ba0011ba0011ba0011ba0011ba0011ba0009b50009b50009b50009b50011ba0018c00027cc0036d70044e20044e20053ed0053ed005af30053ed004be7003edd +002fd2002fd20018c00009b50001af0000a300009d00009800009300009300008d00008200007c00006b00005f00004e00004e00004400003800003800003800 +000000000000000000000000000000003800003800003800003e00004400004400004400004400003e00003800003800003800003800003800003e0000440000 +4900004e00004e00004e00004900004900004400003e00003e00003800003e00004400004400004400004900004900004e00004900004400003e000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003e00003e00004400004400004400004400004400003e00003e00003800003800003800003800003800004400005400005400005f00007100007c0000880000 +9300009800009800009800009d00009d00009800009800008d00008800007c00007c00007100006500005900004e00004900004400004400003e000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800004900004900005f0000710000880000980000a90009b500 +18c00018c00018c00020c60018c00018c00018c00018c00018c00018c00018c00020c60027cc0036d7003edd004be7004be70053ed005af3005af30053ed004b +e70044e20036d70036d70027cc0018c00011ba0001af0000a90000a300009d00009d00009800008d00008800007600006b00005900005900004e00003e000038 +00003800003800000000000000000000000000003800003800003800003800003e00003e00003e00003e00003800003800003800003800003800003800003e00 +004400004900004900004900004900004400004400003e00003800003800003800003800003e00003e00003e00004400004400004400004400003e0000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003e00003e00003e00004400004400004400003e00003e00003e00003800003800003800003800003e00004400004e00004e00005f00006b00007c00 +008200008d00008d00009300009300009300009300008d00008800008200007c00007100007100006b00005f00005900004e00004900004400004400003e0000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00004e00006500007600008d00009d0001af +0011ba0020c60020c60020c60027cc0027cc0027cc0027cc0027cc0027cc0027cc0027cc002fd20036d7003edd0044e2004be7004be70053ed005af3005af300 +53ed0053ed0044e2003edd003edd0036d70027cc0020c60011ba0009b50001af0000a90000a90000a30000980000930000820000760000650000650000590000 +4900003e000038000038000038000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003e00004400004400004400004900004400003e00003e00003800003800003800003800003800003800003800003800003800003e00003e00003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003e00004400004e00004e00005900006b +00007600007c00008800008800008800008800008800008800008200007c00007600007100006b00006b00005f00005900005400004e00004900004400004400 +003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00004e00006500007600008d0000 +9d0001af0011ba0020c60020c60020c60027cc0027cc0027cc0027cc0027cc0027cc0027cc0027cc002fd20036d7003edd0044e2004be7004be70053ed005af3 +005af30053ed0053ed0044e2003edd003edd0036d70027cc0020c60011ba0009b50001af0000a90000a90000a300009800009300008200007600006500006500 +005900004900003e0000380000380000380000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003e00004400004400004400004900004400003e00003e00003800003800003800003800003800003800003800003800003800003e00003e000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003e00004400004e00004e0000 +5900006b00007600007c00008800008800008800008800008800008800008200007c00007600007100006b00006b00005f00005900005400004e000049000044 +00004400003e00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400005900005900006b00008200 +00930000a30009b50018c00027cc0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d70036d7003edd003edd0044e2004be7004be70053 +ed0053ed0053ed0053ed004be70044e20044e20044e20036d7002fd20027cc0020c60018c00011ba0001af0001af0000a900009d00009800008d00007c000071 +00007100005f00005400004900003800003800003800003800003800003800000000003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003e00004400004400004400004400003e00003e00003e00003800003800003800003e00003e00003e00003e0000440000440000 +4400004400003e00003e000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003e00003e00003e00004400004400003e00003e00003e00003800003800003800003e00004400004e00 +004e00005900006500007100007600007c00007c00007c00007c00007600007600007100006b00006500006500005f00005f00005900005400004e00004e0000 +4900004400004400003e000038000038000038000038000038000038000038000000000000000000000000000000000038000038000038000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004900005f00005f000071 +0000880000980000a90011ba0020c6002fd2002fd2002fd20036d70036d7003edd003edd003edd003edd003edd003edd003edd003edd0044e20044e20044e200 +44e2004be7004be7004be7004be7004be7004be70044e20044e2003edd0036d7002fd20027cc0020c60018c00011ba0011ba0001af0000a900009d0000930000 +8800007600007600006b00005f00004e000044000038000038000038000038000038000000000000000000000000000038000038000038000038000038000038 +00003800003800003800003800003800003800003e00003e00004400003e00003e00003e00003e00003e00003e00004400004400004900004900004900004900 +004900004900004900004900004400004400004400003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003e00003e00004400004400004400004400004400003e00003e00003e00003e000044000044 +00004e00004e00005900005f00006b00007100007100007100007100007100006b00006500005f00005900005900005400005400005400004e00004e00004e00 +004900004900004400004400003e00003e0000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400004e0000650000 +6500007600008d0000a30001af0018c00027cc0036d70036d70036d7003edd003edd0044e20044e20044e20044e20044e20044e20044e20044e2003edd003edd +003edd003edd003edd0044e20044e20044e20044e20044e20044e20044e20044e2003edd0036d7002fd20027cc0020c60011ba0011ba0009b50000a90000a300 +009800008d0000820000820000710000650000540000490000380000380000380000380000000000000000000000000000000000000000000000000000000000 +0000000000000000003800003800003800003800003800003e00003e00004400004400004400004400004400004900004900004e000054000054000059000059 +00005900005900005900005400005400005400004e00004e00004e00004900004400003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003e00003e00003e00004400004900004900004900004900004900004400004400004400003e0000 +4400004900004e00004e00005900005f00006500006500006b00006500005f00005f00005900005400004e00004e000049000049000049000049000049000049 +00004900004400004400004400004400003e00003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400005400 +006b00006b00007c0000930000a90009b50020c6002fd2003edd003edd003edd0044e2004be7004be7004be7004be7004be7004be7004be70044e20044e2003e +dd003edd0036d70036d70036d70036d70036d7003edd003edd0044e20044e20044e20044e20044e2003edd0036d7002fd20020c60018c00018c00011ba0001af +0000a300009d00009300008800008800007600006b00005900004e00003e00003800003800003800000000000000000000000000000000000000000000000000 +000000000000000000000000000000003800003800003800003800003800003e00004400004400004900004900004e00005400005900005f00005f0000650000 +6500006500006500006500006500006500006500005f00005f00005f00005900005400004e00004400003e000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003e00003e00004400004900004900004e00004e00004e00004e00004900004900004400 +004400004900004900004e00004e00005400005900005f00005f00005f00005900005400005400004e00004400004400003e00003e00003e00003e00003e0000 +3e00003e00004400004400004400003e00003e00003e000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000049 +0000590000710000710000820000980001af0011ba0027cc0036d7003edd003edd0044e2004be7004be70053ed004be7004be7004be7004be7004be70044e200 +3edd003edd0036d7002fd2002fd2002fd2002fd2002fd20036d70036d70036d7003edd003edd003edd003edd0036d7002fd20027cc0020c60011ba0011ba0009 +b50000a90000a300009800008d00008200008200007600006b00005900004e00003e000038000038000038000000000000000000000000000000000000000000 +00000000000000000000000000000000000000003800003800003800003800004400004900004e00005400005900005900005f00006500007100007600007c00 +008200008200008200008200008200008200007c00007c00007600007600007600007100006b00005f00005400004e00004400004400003e0000380000380000 +3800003800003800003800003800003800003800003800003800003800003e00004400004400004900004900004e00004e00004e00004e00004e000049000049 +00004900004400004900004900004e00004e00005400005400005900005900005400004e00004900004900004400003e00003800003800003800003800003800 +003800003800003800003e00003e00003e00003e00003e00003e0000380000380000380000380000380000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800004e00005f00007600007600008800009d0009b50018c0002fd20036d70044e20044e2004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be7 +0044e2003edd0036d7002fd20027cc0027cc0027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd20027cc0020c60018c00011ba00 +11ba0001af0000a900009d00009800008d00008200008200007600006b00005900004e00003e0000380000380000380000000000000000000000000000000000 +0000000000000000000000000000000000000000003800003800003800003800003e00004900005400005900005f00006b00006b00007600007c00008800008d +00009300009800009d00009d00009d00009800009800009800009300009300008d00008d00008800008200007600006b00005900004e00004e00004900003e00 +003e00003800003800003800003800003800003800003800003800003800003e00003e00004400004400004900004e00004e00005400005400004e00004e0000 +4e00004900004900004400004900004900004e00004e00004e00005400005400005400004e00004900004400004400003e000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003e00004e00005f00007600007600008d0000a30009b50020c60036d7003edd004be7004be7004be70053ed0053ed0053ed0053ed0053ed0053ed0053 +ed004be70044e2003edd0036d7002fd20027cc0027cc0020c60020c60020c60020c60027cc0027cc0027cc0027cc0027cc0027cc0027cc0020c60018c00011ba +0009b50009b50001af0000a300009d00009300008800007c00007c00007100006500005900004900003e00003800003800003800000000000000000000000000 +000000000000000000000000000000000000000000000000003800003800003800003e00004900005900005f00006b00007600007c00007c0000880000930000 +980000a30000a90001af0001af0001af0001af0001af0000a90000a90000a300009d00009d00009d00009800009300008800007c00007100005f00005f000059 +00004e00004900004400003e00003e00003800003800003800003800003800003e00003e00004400004900004900004e00004e00005400005400005400005400 +005400004e00004900004900004400004400004900004900004900004e00004e00005400004e00004900004400003e00003e0000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003e00004e00006500007c00007c0000930000a30011ba0027cc0036d70044e2004be7004be70053ed005af3005af3005af3005af30053ed00 +53ed0053ed004be70044e2003edd0036d7002fd20027cc0027cc0020c60020c60018c00018c00020c60020c60020c60020c60020c60020c60020c60018c00011 +ba0011ba0001af0001af0000a90000a300009800008d00008800007c00007c00007100006500005400004900003e000038000038000038000000000000000000 +00000000000000000000000000000000000000000000000000003800003800003e00003e00004900005900006500007100007c00008800009300009300009800 +00a30001af0011ba0018c00020c60020c60020c60020c60018c00011ba0011ba0009b50001af0001af0001af0000a90000a300009800008d0000820000760000 +7600006b00005f00005400004e00004900004400003e00003e00003e00003e00003e00003e00003e00004400004900004900004e000054000054000054000054 +00005400005400004e00004900004900004400004400004900004900004900004e00004e00004e00004900004900003e00003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003e00004e00006500007c00007c0000930000a30011ba0027cc0036d70044e2004be7004be70053ed005af3005af3005af3005af3 +0053ed0053ed0053ed004be70044e2003edd0036d7002fd20027cc0027cc0020c60020c60018c00018c00020c60020c60020c60020c60020c60020c60020c600 +18c00011ba0011ba0001af0001af0000a90000a300009800008d00008800007c00007c00007100006500005400004900003e0000380000380000380000000000 +0000000000000000000000000000000000000000000000000000000000003800003800003e00003e00004900005900006500007100007c000088000093000093 +0000980000a30001af0011ba0018c00020c60020c60020c60020c60018c00011ba0011ba0009b50001af0001af0001af0000a90000a300009800008d00008200 +007600007600006b00005f00005400004e00004900004400003e00003e00003e00003e00003e00003e00003e00004400004900004900004e0000540000540000 +5400005400005400005400004e00004900004900004400004400004900004900004900004e00004e00004e00004900004900003e000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003e00004e00006500007c00007c0000930000a90011ba0027cc003edd0044e20053ed0053ed0053ed005af3005af3005a +f3005af3005af3005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd20027cc0020c60018c00018c00018c00018c00018c00018c00018c00018c0 +0018c00011ba0011ba0009b50001af0001af0000a900009d00009300008d00008200007600007600006b00005f00005400004900003e00003800003800003800 +000000000000000000000000000000000000000000000000000000000000000000003800003800004900004900005900006b0000760000820000930000980000 +a30000a30001af0011ba0018c00027cc0027cc002fd2002fd2002fd2002fd20027cc0020c60020c60018c00011ba0011ba0011ba0009b50001af0000a900009d +00009300008800008800007c00007100006500005f00005400004e00004900004900004400004400003e00003e00004400004900004900004900004e00005400 +005400005400005400004e00004e00004e00004900004400004400004400004400004900004900004900004e00004e00004900004900003e0000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd004be70053ed0053ed005af3005af300 +5af3005af3005af3005af3005af3005af30053ed004be7004be7003edd0036d7002fd2002fd20027cc0020c60018c00018c00011ba0011ba0011ba0011ba0011 +ba0011ba0011ba0011ba0009b50001af0000a90000a90000a300009800009300008800007c00007100007100006500005900004e000044000038000038000038 +00003800000000000000000000000000000000000000000000000000000000000000003800003800004400005400005400006b00007c00008d0000980000a300 +01af0011ba0011ba0018c00027cc002fd2003edd003edd0044e20044e20044e2003edd0036d70036d7002fd20027cc0020c60020c60020c60020c60018c00011 +ba0009b50000a900009d00009d00009300008800007600006b00006500005900004e00004e00004900004400004400004400004400004900004e00004e00004e +00005400005400005400005400004e00004e00004900004400004400003e00004400004400004400004400004900004900004900004900004400003e00003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800000000000000000000003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd004be70053ed0053ed005af3 +005af3005af3005af3005af3005af3005af3005af30053ed0053ed004be70044e2003edd0036d70036d7002fd20027cc0020c60020c60018c00018c00018c000 +18c00018c00018c00018c00011ba0011ba0009b50000a90000a90000a300009800008d00008800007c00007100007100006500005900004e0000440000380000 +380000380000380000000000000000000000000000000000000000000000000000000000380000380000440000540000650000650000760000880000980000a3 +0009b50011ba0020c60020c60027cc0036d7003edd003edd0044e20044e2003edd003edd003edd0036d7002fd20027cc0020c60020c60020c60020c60020c600 +20c60018c00011ba0009b50001af0001af0000a300009800008800007c00007100006500005900005900005400004e00004900004900004900004e0000540000 +5400005400005900005900005900005900005400005400004e00004900004400003e00004400004400004400004400004900004900004900004900004400003e +00003800003800003800003800003800003800003800003800003800003800000000003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800000000000000000000000000003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd0044e20053ed0053 +ed005af3005af3005af3005af3005af3005af3005af3005af3005af30053ed0053ed004be70044e2003edd003edd0036d7002fd20027cc0027cc0020c60020c6 +0020c60020c60020c60020c60018c00018c00011ba0009b50001af0001af0000a300009800008d00008200007600006b00006b00005f00005400004900004400 +003800003800003800003800003800000000000000000000000000000000000000000000003800003800003e00004e00005f0000710000710000880000980000 +a90009b50018c00020c6002fd2002fd20036d7003edd0044e20044e20044e20044e2003edd003edd0036d7002fd20027cc0020c60018c00018c00018c00018c0 +0020c60020c60020c60020c60018c00011ba0011ba0009b50000a900009800008d00008200007100006500006500005f00005400004e00004e00004e00005400 +005400005400005900005f00005f00005f00005900005400005400004e0000490000440000440000440000440000440000440000490000490000490000490000 +4400003e000038000038000038000038000038000038000038000038000000000000000000000000000000000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800000000000000000000000000003800003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd0044e200 +53ed0053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af3005af30053ed004be7004be7004be70044e2003edd0036d7002fd20027 +cc0027cc0027cc0027cc0027cc0027cc0020c60020c60018c00011ba0001af0001af0000a300009800008d00008200007600006b00006b00005f00005400004e +00004400003e00003800003800003800003800003800000000000000000000003800003800003800003800003e00004900005900007100008200008200009300 +00a30001af0011ba0020c6002fd20036d70036d7003edd0044e20044e2004be70044e20044e20036d70036d7002fd20027cc0018c00018c00011ba0011ba0018 +c00018c00020c60027cc0027cc0027cc0027cc0020c60020c60018c00009b50000a900009800008d00007c00007100007100006500005f000059000054000054 +00005900005900005900005f00006500006500006500005f00005900005900005400004e00004900004400004400003e00004400004400004400004900004900 +004900004400004400003e00003e0000380000380000380000380000380000380000000000000000000000000000000000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800000000000000000000000000000000003800003800003800004400005400006b0000820000820000980000a90018c00027cc003edd +0044e20053ed0053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af3005af3005af30053ed0053ed0053ed004be70044e2003edd00 +36d70036d7002fd2002fd2002fd2002fd2002fd2002fd20027cc0020c60018c00009b50009b50000a900009d00009300008200007600006b00006b00005f0000 +5900004e00004400003e00003800003800003800003800003800003800003800003800003800003800003800003e00004e00005900006b00007c00008d00008d +00009d0001af0011ba0020c6002fd20036d7003edd003edd0044e2004be7004be7004be70044e2003edd0036d70036d70027cc0020c60011ba0009b50009b500 +09b50011ba0011ba0018c00027cc0027cc002fd2002fd2002fd2002fd20027cc0018c00009b50000a900009800008800007c00007c00007100006500005f0000 +5f00005900005f00005f00005f00006500006500006500006500006500005f00005f00005900004e00004900004400004400003e000044000044000044000049 +00004900004900004900004400003e00003e00003800003800003800003800003800000000000000000000000000000000000000003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000000000000000000000000000000000380000380000380000440000590000710000820000820000980001af0018c0002f +d2003edd004be70053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af30062f90062f90062f9005af3005af3005af30053ed004be7 +0044e20044e2003edd003edd003edd003edd0036d70036d70036d7002fd20027cc0018c00009b50009b50000a900009d00009300008800007c00007100007100 +006500005f00005400004e00004900004400003e00003e00003e00003800003800003800003e00003e00004900004900005400005f00006b00007c00008d0000 +980000980000a90009b50018c00020c6002fd20036d7003edd003edd0044e20044e20044e20044e2003edd0036d70027cc0027cc0018c00011ba0001af0001af +0000a90001af0009b50009b50011ba0020c60027cc002fd2002fd2002fd2002fd20027cc0020c60011ba0001af00009d00009300008200008200007600006b00 +006500005f00005f00005f00006500006500006500006b00006b00006b00006500006500006500005900005400004e00004400004400003e00003e00003e0000 +4400004400004900004900004400004400003e00003e000038000038000038000038000038000038000000000000000000000000000000000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800000000000000000000000000000000003800003800003e00004900005f00007600008800008800009d0001af00 +20c6002fd20044e2004be70053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af30062f90062f90062f90062f90062f90062f9005a +f30053ed0053ed004be7004be7004be70044e20044e20044e20044e2003edd0036d70027cc0020c60011ba0011ba0001af0000a300009800008d000082000076 +00007600006b00006500005900005400004e00004e00004900004900004900004900004900004900004e00005400005f00005f00006500007100008200008d00 +00980000a30000a30001af0011ba0018c00020c6002fd20036d70036d70036d7003edd0044e2003edd003edd0036d70027cc0018c00018c00009b50001af0000 +a30000a300009d0000a30000a90000a90009b50018c00020c6002fd2002fd2002fd2002fd20027cc0027cc0018c00009b50000a300009800008d00008d00007c +00007600006b00006500006500006500006500006500006b00006b00006b00007100006b00006500006500005f00005900004e00004900004400003e00003e00 +003e00003e00004400004400004400004400004400003e00003e0000380000380000380000380000380000380000380000380000000000380000380000380000 +3800003800003800003800003800003e00003e00003e000038000038000038000038000038000038000038000038000038000038000038000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800000000000000000000000000000000003800003800003e00004900005f00007600008800008800009d +0001af0020c6002fd20044e2004be70053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af3005af30062f90062f90062f90062f90062f900 +62f9005af30053ed0053ed004be7004be7004be70044e20044e20044e20044e2003edd0036d70027cc0020c60011ba0011ba0001af0000a300009800008d0000 +8200007600007600006b00006500005900005400004e00004e00004900004900004900004900004900004900004e00005400005f00005f000065000071000082 +00008d0000980000a30000a30001af0011ba0018c00020c6002fd20036d70036d70036d7003edd0044e2003edd003edd0036d70027cc0018c00018c00009b500 +01af0000a30000a300009d0000a30000a90000a90009b50018c00020c6002fd2002fd2002fd2002fd20027cc0027cc0018c00009b50000a300009800008d0000 +8d00007c00007600006b00006500006500006500006500006500006b00006b00006b00007100006b00006500006500005f00005900004e00004900004400003e +00003e00003e00003e00004400004400004400004400004400003e00003e00003800003800003800003800003800003800003800003800000000003800003800 +003800003800003800003800003800003800003e00003e00003e0000380000380000380000380000380000380000380000380000380000380000380000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800000000003800003800003800003800003800004400005400006500007c00008d0000 +8d0000a30009b50027cc0036d70044e20053ed005af3005af3005af3005af3005af3005af3005af30053ed0053ed005af3005af30062f90062f90062f90062f9 +0062f90062f9005af3005af30053ed0053ed004be7004be70044e20044e20044e2003edd003edd0036d7002fd20020c60018c00018c00009b50000a90000a300 +009800008d00008800008800007c00007600006b00006500005f00005f00005f00005f00005f00005f00005f00006500006500006b00007600007600007c0000 +8800009300009d0000a90001af0001af0011ba0018c00020c60020c60027cc002fd2002fd2002fd2002fd20036d7002fd2002fd20027cc0018c00009b50009b5 +0001af0000a300009d00009800009800009d0000a30000a30001af0011ba0018c00020c60027cc0027cc0027cc0027cc0020c60011ba0009b50000a300009800 +008d00008d00008200007600006b00006500006500006500006500006500006500006b00006b00006b00006b00006500006500005f0000590000540000490000 +4400003e00003e00003e00003e00004400004400004400004400004400003e00003e00003e000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003e00003e00003e00003e00003800003800003800003800003800003800003800003800003800003800 +00380000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004900005900007100008200 +00980000980000a90011ba0027cc003edd004be70053ed005af3005af30062f90062f9005af3005af30053ed0053ed0053ed0053ed005af3005af30062f90062 +f90062f90062f90062f90062f9005af3005af30053ed004be7004be70044e20044e20044e2003edd003edd0036d7002fd20027cc0018c00018c00011ba0001af +0000a90000a300009d00009300009300008d00008200007c00007600007600007600007100007100007600007600007600007c00008200008200008d00008d00 +00930000980000a30001af0009b50011ba0011ba0018c00020c60020c60020c60020c60020c60027cc0027cc0027cc0027cc0027cc0020c60018c00009b50001 +af0001af0000a30000980000930000930000930000980000a30000a30000a90009b50011ba0018c00020c60020c60020c60020c60018c00011ba0009b50000a3 +00009800008d00008d00008200007600006b00006b00006500006500006500006500006500006500006b00006b00006b00006b00006b00006500005f00005400 +004e00004900004400004400004400003e00004400004400004400004900004400004400004400003e0000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003e00003e00003e00003e00003e00003e00003e000038000038000038000038000038000038000038 +00003800003800003800003800000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000044000054000065000076 +00008800009d00009d0001af0018c0002fd2003edd0053ed005af30062f90062f90062f90062f9005af3005af30053ed0053ed0053ed0053ed0053ed005af300 +62f90062f90062f90062f90062f90062f9005af30053ed0053ed004be7004be70044e20044e2003edd003edd0036d70036d7002fd20027cc0020c60020c60018 +c00011ba0009b50001af0000a90000a30000a300009d00009800008d00008d00008800008800008d00008d00008d00009300009300009300009800009d0000a3 +0000a30000a90001af0009b50011ba0018c00020c60020c60027cc0020c60020c60020c60018c00018c00018c00018c00018c00018c00011ba0011ba0001af00 +00a900009d00009d00009800009300008d00008d00009300009800009d00009d0000a30001af0009b50011ba0011ba0018c00018c00018c00011ba0009b50001 +af0000a300009800008d00008d00008200007600006b00006500006500005f00005f00005f00005f00006500006500006b00006b00006b00006b000065000065 +00005900005400004e00004900004400004400004400004400004400004900004900004900004400004400004400003e00003e00003800003800003800003800 +003800003800003800003800003800003800003800003800003e00003e00003e00003e00003e00003e00003e00003e0000380000380000380000380000380000 +38000038000038000038000038000038000038000038000000000000000000000000000000000000003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400004e0000590000 +6b00007c0000930000a30000a30009b50020c60036d70044e20053ed005af30062f90062f90062f90062f90062f9005af30053ed0053ed0053ed0053ed0053ed +005af3005af30062f90062f90062f90062f9005af3005af30053ed0053ed004be70044e20044e20044e2003edd0036d70036d7002fd2002fd20027cc0027cc00 +27cc0020c60020c60018c00018c00011ba0009b50009b50001af0000a90000a30000a300009d00009d0000a30000a30000a30000a90000a90001af0001af0009 +b50011ba0011ba0011ba0018c00020c60027cc002fd2002fd2002fd2002fd20027cc0027cc0020c60018c00011ba0009b50009b50009b50001af0001af0000a9 +0000a300009d00009300009300008d00008d00008800008d00008d00009300009d00009d0000a30000a90001af0009b50009b50009b50009b50009b50009b500 +01af0000a900009d00009800008d00008d00008200007600006b00006500005f00005f00005f00005f00005f00005f00006500006500006b00006b00006b0000 +6b00006500005f00005900005400004e00004900004900004400004400004900004900004900004900004900004900004900004400004400003e00003e00003e +00003800003800003800003800003800003800003800003e00003e00003e00003e00004400003e00003e00003e00003e00003e00003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000000000000000000000000038000038000038000038000038000038000038 +00003800003800003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400004e00 +005f0000710000820000930000a30000a30009b50020c60036d70044e20053ed005af30062f90062f90062f90062f9005af30053ed0053ed004be7004be7004b +e70053ed0053ed0053ed005af3005af3005af3005af3005af30053ed0053ed004be70044e20044e2003edd003edd003edd0036d70036d70036d70036d7002fd2 +002fd2002fd2002fd2002fd2002fd20027cc0027cc0020c60020c60018c00011ba0009b50009b50001af0001af0009b50009b50009b50011ba0011ba0018c000 +18c00018c00020c60020c60020c60027cc002fd2002fd20036d70036d70036d70036d7002fd20027cc0020c60011ba0009b50000a90000a90000a90000a30000 +9d00009d00009800009300008d00008d00008800008800008800008d00009300009800009d00009d0000a30000a90001af0001af0001af0009b50009b50009b5 +0001af0001af0000a90000a300009800008d00008d00008800007c00007600007100006b00006500006500006500006500006b00006b00007100007600007600 +007600007600007600007100006b00006500005900005400005400004e00004e00004e00004e00004e00004e00004e00004e0000490000490000490000490000 +4900004400004400004400003e00003e00003800003800003800003800003800003800003800003e00003e00003e000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000380000380000380000380000380000 +3800003800003800003800003800003800003e00003e00004400004400003e00003e00003800003800003800003800003800003800003800003e00003e000049 +00005400005f0000710000820000930000a30000a30009b50020c60036d70044e20053ed005af3005af3005af3005af3005af3005af30053ed004be7004be700 +4be7004be7004be7004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be70044e20044e2003edd003edd003edd0036d70036d70036d70036d70036 +d70036d7003edd003edd003edd003edd003edd003edd0036d70036d70036d7002fd20027cc0020c60020c60018c00018c00018c00018c00020c60020c60027cc +0027cc0027cc0027cc002fd2002fd2002fd2002fd20036d7003edd003edd003edd003edd003edd0036d7002fd20018c00009b50000a900009d00009d00009d00 +009800009300008d00008d00008800008800008800008200008800008800009300009800009d0000a30000a30000a90000a90000a90001af0001af0001af0001 +af0001af0001af0000a90000a90000a300009800009300009300008800008200007c00007600007100007100006b00006b00007100007100007600007c000082 +00008200008200008800008800008200007c00007100006b00006500006500005900005900005400005400005400004e00004e00004e00004e00004e00004e00 +004e00004e00004e00004900004900004900004400003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000003800003800003800003800 +003800003800003800003800003800003e00003e00003e00004400004400004400004400003e0000380000380000380000380000380000380000380000380000 +3800004400004e00005f0000710000820000930000a30000a30009b50020c6002fd2003edd004be70053ed005af3005af3005af3005af30053ed0053ed004be7 +004be7004be7004be7004be7004be7004be7004be70053ed004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd003edd003edd003edd00 +3edd0044e20044e20044e20044e2004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd20027cc0027cc0027cc0027cc0027cc0027cc0027 +cc002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d7003edd003edd0044e20044e20044e20044e20036d7002fd20018c00001af0000a3000098000098 +00009300008d00008800008800008200008200008200008200008200008800008d00009800009d0000a30001af0001af0001af0001af0001af0001af0001af00 +01af0001af0001af0001af0001af0000a90000a90000a300009d00009d00009300008d00008800008800008200008200007c00007c0000820000820000880000 +8d00009300009800009800009d00009d00009800009300008800007c00007600007600006b00006500005f000059000059000059000059000059000059000059 +00005900005900005900005400005400005400004e00004900003e00003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003e00003e00003e00003e0000380000380000380000380000380000380000000000000000000000000038000038000038 +00003800003800003800003800003800003800003e00003e00004400004400004900004900004400004400003e00003e00003800003800003800003800003800 +003800003800004400004e00005900006b00007c0000930000a30000a30009b50018c0002fd2003edd0044e2004be70053ed0053ed0053ed0053ed0053ed004b +e7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e20044e2003edd003edd003edd003edd +0044e20044e2004be7004be70053ed0053ed0053ed0053ed005af30053ed0053ed004be7004be70044e2003edd0036d70036d7002fd2002fd2002fd2002fd200 +2fd20036d70036d70036d70036d70036d70036d70036d70036d7003edd003edd0044e20044e20044e20044e20044e20036d70027cc0011ba0001af00009d0000 +8d00008d00008800008200008200007c00007c00007c00007c00007c00008200008800009300009d0000a90001af0009b50009b50009b50009b50009b50001af +0001af0001af0001af0001af0001af0001af0001af0001af0000a90000a30000a30000a300009d00009800009300009300009300009300009300009300009800 +009d0000a30000a90001af0001af0009b50009b50001af0000a900009d00009300008800008800007c00007100006b00006500005f00005f00005f00005f0000 +5f00005f00005f00006500005f00005f000059000059000054000049000044000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003e00003e00003e00003e00003e00003800003800003800003800003800003800000000000000000000380000380000 +3800003800003800003800003800003800003800003800003e00003e00004400004900004900004900004400003e00003e00003e000038000038000038000038 +00003800003800003800003800004400005400006500007600008d00009d00009d0001af0018c00027cc0036d70044e20044e2004be7004be7004be70053ed00 +4be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e20044e2004b +e7004be7004be70053ed0053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd2002fd2 +002fd2002fd2002fd2002fd20036d7002fd2002fd2002fd2002fd2002fd20036d70036d7003edd0044e20044e20044e20044e20036d70027cc0011ba0000a300 +009800008800008800008200007c00007c00007c00007c00007c00008200008200008800008d0000980000a30001af0009b50011ba0011ba0011ba0011ba0011 +ba0009b50009b50001af0001af0009b50009b50009b50009b50011ba0011ba0009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0009b5 +0009b50018c00020c60027cc002fd2002fd20036d70036d7002fd20020c60011ba0000a900009d00009d00008d00008200007600007100006b00006b00006b00 +006b00006b00006b00006b00006b00006b00006b00005f00005f00005900004e0000440000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003e00003e00003e00003e00003e00003e000038000038000038000038000038000038000000000000000000003800 +003800003800003800003800003800003800003800003800003800003e00003e00004400004900004900004900004400003e00003e00003e0000380000380000 +3800003800003800003800003800003800004400005400006500007600008d00009d00009d0001af0018c00027cc0036d70044e20044e2004be7004be7004be7 +0053ed004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e200 +44e2004be7004be7004be70053ed0053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0053ed004be70044e2003edd0036d7002fd2002f +d2002fd2002fd2002fd2002fd2002fd20036d7002fd2002fd2002fd2002fd2002fd20036d70036d7003edd0044e20044e20044e20044e20036d70027cc0011ba +0000a300009800008800008800008200007c00007c00007c00007c00007c00008200008200008800008d0000980000a30001af0009b50011ba0011ba0011ba00 +11ba0011ba0009b50009b50001af0001af0009b50009b50009b50009b50011ba0011ba0009b50009b50009b50009b50001af0001af0001af0001af0001af0001 +af0009b50009b50018c00020c60027cc002fd2002fd20036d70036d7002fd20020c60011ba0000a900009d00009d00008d00008200007600007100006b00006b +00006b00006b00006b00006b00006b00006b00006b00006b00005f00005f00005900004e00004400003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003e00003e00003e00003e00003e00003e0000380000380000380000380000380000380000000000000000 +00003800003800003800003800003800003800003800003800003800003e00003e00003e00004400004900004900004900004400003e00003800003800003800 +003800003800003800003800003800003800003800003e00004e00005f0000710000880000980000980000a90011ba0027cc002fd2003edd003edd0044e20044 +e2004be7004be7004be7004be70053ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7 +004be7004be70053ed0053ed005af3005af30062f90069ff0069ff0069ff0071ff0069ff0069ff0062f9005af30053ed0053ed004be70044e2003edd0036d700 +2fd2002fd20027cc0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d7003edd003edd003edd003edd003edd002fd20020 +c60009b500009d00009300008200008200007c00007600007600007600007600007c00008200008200008800009300009d0001af0011ba0018c00020c60020c6 +0020c60020c60018c00011ba0011ba0009b50009b50009b50011ba0011ba0018c00020c60020c60020c60020c60020c60020c60020c60020c60020c60027cc00 +27cc0027cc002fd20036d7003edd004be70053ed005af3005af30062f90062f90053ed0044e20036d70020c60009b50009b50000a30000930000880000820000 +7600007600007600007600007600007600007600007600007600007100006b00006b00005f00004e000044000038000038000038000038000000000000000000 +00000000003800003800003800003800003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800000000 +0000000000003800003800003800003800003800003800003800003800003800003e00004400004400004400004900004900004400004400003e000038000038 +00003800003800003800000000003800003800003800003800003800004900005f0000710000880000980000980001af0011ba0027cc002fd2003edd003edd00 +44e20044e2004be7004be7004be70053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be7004be7004be7004be7004b +e7004be70053ed0053ed0053ed0053ed005af30062f90062f90069ff0069ff0069ff0071ff0069ff0069ff0062f9005af30053ed0053ed0044e2003edd0036d7 +002fd20027cc0027cc0020c60020c60020c60020c60027cc0027cc0027cc0027cc0020c60020c60020c60027cc0027cc002fd2002fd2002fd2002fd2002fd200 +20c60011ba0000a900009800008d00008200008200007c00007600007600007c00007c00008200008800008800009300009d0000a90009b50018c00020c60027 +cc0027cc0027cc0020c60020c60018c00018c00011ba0011ba0018c00018c00020c6002fd2002fd20036d7003edd003edd003edd0044e20044e20044e20044e2 +0044e20044e20044e2004be70053ed005af30069ff0071ff0080ff0080ff0080ff0788ff0078ff0071ff005af30044e2002fd2002fd20018c00001af0000a300 +009800009300008d00008d00008d00008d00008d00008d00008d00008800008200007600007600006b0000590000490000380000380000380000380000000000 +0000000000000000000000003800003800003800003800003800003800003800003800003e000038000038000038000038000038000038000038000038000038 +000000000000000000003800003800003800003800003800003800003800003800003800003e00004400004400004400004400004400004400003e0000380000 +380000380000380000380000000000000000000000000000000000380000380000490000590000710000880000980000980001af0011ba0027cc002fd2003edd +003edd0044e20044e2004be7004be70053ed0053ed0053ed005af3005af3005af3005af30053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed00 +53ed0053ed0053ed0053ed0053ed0053ed005af3005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0062f9005af30053ed004be7004be70044e20036 +d7002fd20027cc0020c60020c60018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00020c60020c60020c60020c60020c6 +0020c60011ba0001af0000a300009300008800007c00007c00007c00007600007c00007c00008200008800008d00008d0000980000a30001af0011ba0020c600 +20c60027cc0027cc0027cc0027cc0027cc0020c60020c60020c60020c60020c60027cc0036d7003edd0044e20053ed005af3005af3005af30062f90062f90062 +f90062f90062f90062f90062f90069ff0069ff0078ff0788ff2797ff369eff369eff42a4ff52abff369eff2797ff0080ff0069ff0053ed0053ed003edd0027cc +0011ba0009b50000a90000a30000a30000a30000a30000a300009d00009d00009800009300008800008800007600006500004e00003e00003800003800003800 +00000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000000000000000000000000003800003800003800003800003800003800003800003e00003e00004400004400004400004400004400003e00003800 +003800003800003800003800000000000000000000000000000000000000003800003800004900005f00007600008d00009d00009d0009b50018c0002fd20036 +d7003edd0044e20044e20044e2004be7004be70053ed0053ed005af3005af3005af3005af3005af30053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed +0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed005af3005af30062f90069ff0069ff0069ff0069ff0062f9005af30053ed004be70044e20044e200 +3edd0036d70027cc0020c60018c00018c00011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011 +ba0011ba0011ba0001af0000a900009800008d00008800007c00007c00007c00007c00008200008200008800008d00009800009800009d0000a90009b50011ba +0020c60027cc002fd2002fd20027cc0027cc0027cc0020c60020c60027cc0027cc002fd20036d70044e20053ed005af30069ff0071ff0071ff0078ff0078ff00 +78ff0078ff0078ff0078ff0071ff0071ff0078ff0080ff0788ff2797ff42a4ff62b3ff62b3ff71bbff81c2ff71bbff62b3ff369eff178fff0078ff0078ff005a +f3004be70036d70027cc0018c00018c00011ba0011ba0011ba0011ba0009b50009b50001af0000a3000093000093000088000071000059000044000038000038 +00003800000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800 +0000000000000000000000000000000000000000003800003800003800003800003800003800003e00003e00004400004400004400004400004400004400003e +00003800003800003800003800003800000000000000000000000000000000000000003800003800004e00006500007c0000930000a30000a30011ba0020c600 +2fd20036d7003edd0044e20044e20044e2004be7004be70053ed005af3005af3005af3005af3005af3005af30053ed0053ed0053ed004be70053ed0053ed0053 +ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed005af3005af3005af30062f90062f90062f90062f9005af30053ed004be70044e2003edd +003edd0036d7002fd20027cc0020c60018c00011ba0009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0001af0001af0001af00 +01af0001af0001af0000a90000a300009d00009300008d00008200007c00007c00008200008200008200008800008d00009300009d00009d0000a30001af0009 +b50018c00020c60027cc002fd2002fd2002fd20027cc0027cc0027cc0027cc002fd2002fd20036d70044e20053ed0062f90071ff0080ff0788ff0788ff178fff +2797ff2797ff178fff178fff0788ff0788ff0788ff0788ff178fff2797ff42a4ff62b3ff91caff91caffa0d1ffc0e0ffb0d9ffa0d1ff81c2ff52abff2797ff27 +97ff0080ff0069ff005af3004be7003edd0036d7002fd2002fd2002fd20027cc0027cc0027cc0018c00011ba0000a30000a300009300007c00005f0000490000 +38000038000038000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038 +000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e00003e00004400004400004400004400003e0000 +3e00003800003800003800003800003800003800000000000000000000003800003800003800003800004900005f00007600008d0000a30009b50009b50020c6 +002fd2003edd0044e20044e2004be7004be7004be7004be7004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be70044e20044e20044e2004be700 +4be7004be7004be70053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70053ed0053ed0053ed004be7004be7004be70044e20044e2003edd0036 +d7002fd2002fd20027cc0027cc0020c60018c00011ba0009b50001af0001af0001af0001af0001af0001af0001af0001af0001af0001af0000a90000a90000a3 +0000a30000a30000a30000a300009d00009800009800008d00008800008800008200008200008200008800008800008d00009300009800009d00009d0000a300 +01af0009b50011ba0020c60020c60027cc0027cc0027cc0020c60020c60020c60027cc002fd2002fd2003edd004be7005af30071ff0080ff178fff2797ff2797 +ff369eff369eff369eff2797ff178fff0788ff0080ff0080ff0080ff0080ff0788ff2797ff52abff71bbff71bbff91caffb0d9ffc0e0ffc0e0ffa0d1ff81c2ff +52abff52abff369eff0788ff0071ff0062f9005af30053ed004be7004be70044e20044e20044e2003edd002fd20027cc0009b50009b50000a300008800007100 +00540000380000380000380000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000 +38000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e00004400004400004400004400004400 +003e00003800003800003800003800003800003800003800000000003800003800003800003800003800004400005900007100008800009d0009b50020c60020 +c60036d7003edd004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd003edd +0044e20044e20044e2004be7004be7004be70053ed004be7004be7004be7004be70044e20044e20044e20044e2003edd003edd003edd0036d70036d7002fd200 +27cc0027cc0027cc0027cc0020c60020c60018c00011ba0011ba0009b50001af0001af0000a90000a90000a90000a90000a90000a90000a30000a30000a30000 +9d00009d00009800009800009800009800009300009300008d00008d00008800008800008800008800008800008d00008d00009300009800009d0000a30000a3 +0000a90001af0009b50011ba0018c00018c00020c60020c60018c00018c00018c00020c60027cc002fd2002fd20044e20053ed0069ff0080ff178fff369eff42 +a4ff42a4ff52abff52abff52abff369eff2797ff0788ff0078ff0078ff0078ff0071ff0078ff0788ff369eff62b3ff62b3ff81c2ffb0d9ffc0e0ffcfe8ffc0e0 +ffb0d9ff91caff91caff62b3ff42a4ff178fff0080ff0071ff0069ff0062f90062f90062f90062f9005af3005af3004be7003edd0027cc0027cc0009b5000098 +00007c00005f00003e00003800003800000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800 +0038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e000044000044000044000044000044 +00003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400004400005400006b0000820000980001af0018c000 +2fd2002fd20044e2004be70053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd2002fd2002f +d2002fd20036d70036d7003edd0044e2004be7004be70053ed004be7004be7004be7004be70044e20044e2003edd0036d70036d7002fd2002fd20027cc0020c6 +0020c60018c00018c00018c00018c00018c00018c00011ba0011ba0009b50001af0000a90000a90000a30000a30000a30000a30000a300009d00009d00009d00 +009d00009800009300009300009300009300009300009300008d00008d00008d00008d00008d00008d00008d00008d00009300009800009800009d0000a30000 +a90000a90000a90001af0009b50011ba0018c00018c00018c00018c00018c00018c00018c00018c00027cc002fd2002fd20044e2005af30071ff0788ff2797ff +42a4ff52abff52abff62b3ff62b3ff52abff42a4ff2797ff0788ff0078ff0078ff0071ff0069ff0069ff0071ff0788ff369eff369eff62b3ff91caffa0d1ffc0 +e0ffb0d9ffa0d1ff81c2ff81c2ff62b3ff369eff178fff0080ff0078ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff005af30053ed0036d70036d70020 +c60000a900008800006b000049000038000038000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038 +000038000038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e0000440000440000440000 +4400004400003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400004400005400006b0000820000980001af +0018c0002fd2002fd20044e2004be70053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd200 +2fd2002fd2002fd20036d70036d7003edd0044e2004be7004be70053ed004be7004be7004be7004be70044e20044e2003edd0036d70036d7002fd2002fd20027 +cc0020c60020c60018c00018c00018c00018c00018c00018c00011ba0011ba0009b50001af0000a90000a90000a30000a30000a30000a30000a300009d00009d +00009d00009d00009800009300009300009300009300009300009300008d00008d00008d00008d00008d00008d00008d00008d00009300009800009800009d00 +00a30000a90000a90000a90001af0009b50011ba0018c00018c00018c00018c00018c00018c00018c00018c00027cc002fd2002fd20044e2005af30071ff0788 +ff2797ff42a4ff52abff52abff62b3ff62b3ff52abff42a4ff2797ff0788ff0078ff0078ff0071ff0069ff0069ff0071ff0788ff369eff369eff62b3ff91caff +a0d1ffc0e0ffb0d9ffa0d1ff81c2ff81c2ff62b3ff369eff178fff0080ff0078ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff005af30053ed0036d700 +36d70020c60000a900008800006b0000490000380000380000000000000000000000000000000000000000000000000000000000380000380000380000380000 +38000038000038000038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400 +004400003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400005400005400006500007c0000930000 +a90018c0002fd2003edd003edd0053ed0053ed005af3005af30053ed0053ed004be7004be7004be70044e20044e2003edd003edd0036d70036d7002fd20027cc +0020c60020c60020c60027cc002fd2002fd20036d7003edd004be7004be70053ed004be7004be7004be7004be70044e2003edd0036d7002fd20027cc0020c600 +20c60018c00011ba0009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0000a90000a30000a300009d0000980000980000980000980000 +9800009300009300009300009300008d00008d00008d00008d00008d00008d00008d00008d00008d00008d00009300009300009300009800009800009d00009d +0000a30000a30000a90000a90001af0009b50011ba0011ba0018c00018c00011ba0011ba0011ba0011ba0011ba0018c00020c6002fd2002fd20044e2005af300 +78ff178fff369eff52abff62b3ff62b3ff71bbff71bbff62b3ff52abff369eff0788ff0078ff0078ff0069ff005af3005af30062f90071ff0788ff0788ff369e +ff62b3ff81c2ffa0d1ffa0d1ffa0d1ff81c2ff81c2ff62b3ff369eff178fff0788ff0078ff0078ff0078ff0078ff0078ff0078ff0078ff0078ff0071ff0069ff +004be7004be70036d70009b500009800007600005400003e00003e00003800000000000000000000000000000000000000000000000000003800003800003800 +0038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e000044 +00004400004400003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400005400006500006500007600008d00 +00a30011ba002fd20044e20053ed0053ed005af30062f90062f9005af3005af30053ed004be7004be70044e20044e2003edd0036d7002fd20027cc0027cc0020 +c60018c00011ba0011ba0011ba0018c00027cc0027cc002fd2003edd0044e2004be70053ed0053ed004be7004be7004be70044e20036d7002fd20027cc0018c0 +0011ba0011ba0009b50001af0000a90000a90000a90000a90000a90001af0001af0001af0001af0000a90000a300009d00009d00009800009300009300008d00 +008d00008d00008d00008d00008d00008800008800008800008800008800008800008d00008d00009300009300009800009800009d00009d00009d0000a30000 +a30000a30000a90000a90001af0001af0009b50009b50011ba0011ba0018c00018c00011ba0011ba0011ba0009b50011ba0011ba0020c6002fd2002fd20044e2 +0062f90078ff178fff369eff62b3ff71bbff71bbff81c2ff71bbff71bbff52abff42a4ff178fff0078ff0078ff0069ff0053ed004be7004be7005af30069ff00 +69ff0080ff2797ff52abff71bbff71bbff71bbff52abff52abff369eff178fff0080ff0078ff0071ff0071ff0071ff0071ff0078ff0080ff0080ff0788ff0080 +ff0078ff0062f90062f90044e20020c60000a900008800005f000044000044000038000000000000000000000000000000000000000000000000000038000038 +000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003e0000 +3e00004400004400004400003e00003e00003800003800003800003800003800003800003800003800003800003800004400004e00005f00007600007600008d +0000a30011ba0027cc003edd0053ed0062f90062f90069ff0069ff0069ff0062f9005af30053ed004be7004be70044e2003edd0036d7002fd20027cc0018c000 +18c00011ba0001af0001af0000a90001af0009b50018c00018c00027cc0036d70044e2004be70053ed0053ed0053ed0053ed004be70044e20036d70027cc0020 +c60011ba0001af0001af0000a90000a300009d00009d00009d0000a30000a30000a30000a90000a90000a90000a300009d000098000098000093000088000088 +00008800008200008200008200008200008200008200008200008200008200008800008800008d00009300009800009800009d0000a30000a30000a30000a900 +00a90000a90001af0001af0001af0009b50009b50009b50011ba0018c00018c00018c00018c00011ba0011ba0011ba0009b50009b50011ba0020c6002fd2002f +d2004be70062f90078ff178fff42a4ff62b3ff71bbff71bbff81c2ff81c2ff81c2ff62b3ff52abff178fff0078ff0078ff0062f9004be70044e20036d70044e2 +004be7004be70062f90080ff178fff42a4ff42a4ff42a4ff369eff369eff178fff0080ff0071ff0069ff0062f90069ff0071ff0071ff0078ff0080ff0788ff17 +8fff178fff0788ff0071ff0071ff005af30036d70011ba00009300007100004e00004e0000380000380000000000000000000000000000000000000000000000 +38000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000003800003800003800 +003800003e00004400004400003e00003800003800003800003800003800003800003800003800003800003800003800003e00004900005400006500007c0000 +7c0000930000a90018c0002fd20044e20053ed0062f90062f90069ff0062f90062f9005af30053ed004be70044e20044e20044e2003edd0036d70036d70027cc +0020c60020c60011ba0009b50001af0001af0001af0009b50018c00018c00027cc002fd2003edd0044e2004be70044e20044e20044e2003edd0036d7002fd200 +20c60011ba0009b50000a90000a90000a300009d00009800009800009800009800009800009d00009d0000a300009d00009d00009800009300009300008d0000 +8200008200007c00007c00007c00007c00007c00007c00008200008200008800008d00009300009300009800009d0000a30000a90001af0009b50009b50009b5 +0009b50011ba0011ba0011ba0011ba0018c00018c00018c00020c60027cc0027cc0027cc002fd20027cc0020c60020c60020c60018c00018c00020c60027cc00 +36d70036d7004be70062f90078ff178fff42a4ff62b3ff71bbff71bbff91caff91caffa0d1ff81c2ff71bbff42a4ff178fff178fff0071ff005af30044e20036 +d70036d7003edd003edd004be70062f90071ff0080ff0080ff0080ff0071ff0071ff0069ff005af30053ed004be7004be7005af30062f90062f90071ff0080ff +178fff2797ff2797ff2797ff0080ff0080ff0069ff0044e20020c600009d00007c00005900005900003800003800000000000000000000000000000000000000 +00000000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000038000038 +00003800003800003e00004400003e00003e00003800003800003800003800003800003800003800003800003800003800003800003e00004e00005900007100 +00820000820000980001af0020c60036d70044e2005af3005af3005af30062f90062f9005af30053ed004be70044e20044e20044e2003edd003edd003edd0036 +d7002fd20020c60020c60018c00009b50001af0001af0001af0009b50018c00018c00020c6002fd20036d7003edd003edd003edd003edd003edd0036d70027cc +0020c60018c00009b50001af0000a90000a900009d00009d00009800009300009300009300009300009800009800009800009800009800009300008d00008d00 +008800008200007c00007600007600007600007600007600007c00007c0000820000880000930000980000980000a30000a90009b50011ba0018c00018c00020 +c60020c60020c60020c60020c60020c60027cc0027cc002fd2002fd20036d70036d7003edd003edd003edd0036d70036d70036d7002fd20027cc0027cc0027cc +0036d70044e20044e20053ed0069ff0080ff178fff42a4ff62b3ff81c2ff81c2ffa0d1ffa0d1ffb0d9ffb0d9ffa0d1ff71bbff42a4ff42a4ff0788ff0062f900 +4be70036d7002fd20027cc0027cc0036d70044e2004be7005af3005af30053ed004be7004be70044e20036d7002fd20036d70036d70044e2005af3005af30071 +ff0080ff178fff42a4ff42a4ff42a4ff178fff178fff0078ff0053ed002fd20000a9000082000065000065000044000038000000000000000000000000000000 +00000000003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000 +3800003800003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800004400004e00005f +00007600008800008800009d0009b50020c60036d70044e20053ed005af3005af3005af3005af30053ed004be70044e20044e20044e20044e20044e20044e200 +3edd003edd0036d7002fd2002fd20020c60018c00009b50001af0009b50009b50011ba0011ba0018c00020c60027cc002fd2002fd2002fd20027cc0027cc0020 +c60018c00011ba0009b50000a90000a300009d00009d00009800009800009300009300008d00008d00008d00008d00009300009300009300008d00008d000088 +00008800008200007c00007600007600007600007600007600007600007c0000820000880000930000980000a30000a30001af0011ba0018c00027cc002fd200 +2fd20036d70036d70036d70036d70036d70036d7003edd003edd0044e20044e2004be7004be70053ed0053ed0053ed004be70044e20044e2003edd0036d70036 +d70036d70044e2004be7004be7005af30069ff0080ff178fff42a4ff62b3ff81c2ff81c2ffa0d1ffb0d9ffcfe8ffc0e0ffc0e0ff91caff62b3ff62b3ff178fff +0069ff004be7002fd20027cc0018c00018c00020c60027cc002fd2003edd0036d70036d7002fd2002fd20027cc0020c60018c00027cc002fd20044e2005af300 +5af30071ff0788ff369eff52abff52abff52abff2797ff2797ff0788ff005af30036d70001af00008800006b00006b0000490000380000380000000000000000 +00000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000 +000000003800003800003800003800003800003e00003800003800003800003800003800003800003800003800003800003800003800003800003e0000440000 +5400006500007c00008d00008d0000a30011ba0027cc003edd0044e20053ed0053ed0053ed0053ed0053ed004be70044e20044e20044e2003edd003edd0044e2 +0044e20044e20044e2003edd0036d70036d7002fd20020c60018c00009b50009b50009b50011ba0011ba0011ba0018c00020c60020c60020c60018c00018c000 +18c00011ba0009b50000a90000a30000a300009d00009800009800009300009300008d00008d0000880000880000880000880000880000880000880000880000 +8800008200008200007c00007600007600007100007100007100007600007600007c00008200008d0000980000a30001af0001af0011ba0020c6002fd20036d7 +003edd0044e20044e20044e20044e20044e20044e2004be7004be70053ed005af3005af30062f90062f90069ff0062f90062f9005af30053ed0053ed004be700 +44e20044e20044e2004be70053ed0053ed0062f90071ff0080ff178fff42a4ff62b3ff81c2ff81c2ffb0d9ffc0e0ffdfefffdfefffdfefffb0d9ff81c2ff81c2 +ff369eff0071ff0053ed002fd20018c00009b50009b50009b50011ba0018c00020c60018c00018c00011ba0011ba0009b50009b50009b50011ba0020c6003edd +0053ed0053ed0071ff178fff42a4ff62b3ff62b3ff71bbff42a4ff42a4ff178fff0062f9003edd0009b500009300007100007100004e00003800003800003800 +00000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000 +00000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +004900005900006b00007c0000930000930000a90011ba0027cc0036d70044e2004be7004be7004be7004be7004be70044e20044e2003edd003edd0044e20044 +e20044e2004be70053ed0053ed0053ed004be7004be7003edd0036d70027cc0018c00018c00011ba0011ba0011ba0009b50009b50009b50009b50001af0000a9 +0000a90000a90000a300009d00009800009300009300009300008d00008d00008d00008d00008800008800008200008200008200007c00008200008200008200 +008200008200007c00007c00007c00007600007600007600007600007600007c00007c00008200008d0000980000a30009b50018c00018c00027cc0036d70044 +e2004be70053ed0053ed005af3005af3005af3005af3005af3005af30062f90069ff0071ff0071ff0078ff0078ff0078ff0078ff0071ff0069ff0062f90062f9 +005af3005af30053ed0053ed005af30062f90062f90069ff0071ff0080ff178fff42a4ff62b3ff91caff91caffb0d9ffcfe8ffeff7ffeff7ffeff7ffc0e0ff81 +c2ff81c2ff369eff0071ff004be70027cc0011ba0001af0001af0000a90000a90001af0009b50009b50009b50001af0001af0001af0001af0001af0018c00027 +cc0044e20062f90062f90080ff369eff62b3ff81c2ff81c2ff71bbff42a4ff42a4ff178fff0062f9003edd0009b500009300007100007100004e00003e000038 +00003800003800003800003800003800003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003e00004900005900006b0000820000980000980000a90018c00027cc0036d7003edd0044e20044e20044e20044e2003edd003edd003edd003edd003edd00 +44e20044e2004be70053ed005af30062f90062f9005af3005af30053ed0044e20036d70027cc0020c60011ba0009b50009b50001af0000a90000a300009d0000 +9d00009800009300009300008d00008800008800008200008200008200008800008800008800008800008200008200007c000076000076000076000076000076 +00007c00007c00007c00007c00007c00007c00007600007600007600007600007c0000820000820000880000980000a30009b50018c0002fd2002fd2003edd00 +4be7005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0071ff0071ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff0788ff0080ff0078 +ff0078ff0071ff0069ff0069ff0062f90069ff0069ff0069ff0071ff0078ff0080ff178fff369eff62b3ff91caff91caffc0e0ffdfefffffffffffffffffffff +c0e0ff91caff91caff369eff0071ff004be70020c60009b50000a30000a300009d00009d00009d0000a30000a30000a30000a30000a30000a30000a90001af00 +18c0002fd2004be70071ff0071ff178fff52abff71bbffa0d1ff91caff81c2ff52abff52abff178fff0062f9003edd0009b50000930000710000710000540000 +4400003800003800003800003800003800003800003800003800003800003e00003e00003e00003e00003e000038000038000038000038000038000038000038 +00000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003e00004900005900006b0000820000980000980000a90018c00027cc0036d7003edd0044e20044e20044e20044e2003edd003edd003edd003edd +003edd0044e20044e2004be70053ed005af30062f90062f9005af3005af30053ed0044e20036d70027cc0020c60011ba0009b50009b50001af0000a90000a300 +009d00009d00009800009300009300008d00008800008800008200008200008200008800008800008800008800008200008200007c0000760000760000760000 +7600007600007c00007c00007c00007c00007c00007c00007600007600007600007600007c0000820000820000880000980000a30009b50018c0002fd2002fd2 +003edd004be7005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0071ff0071ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff0788ff00 +80ff0078ff0078ff0071ff0069ff0069ff0062f90069ff0069ff0069ff0071ff0078ff0080ff178fff369eff62b3ff91caff91caffc0e0ffdfefffffffffffff +ffffffffc0e0ff91caff91caff369eff0071ff004be70020c60009b50000a30000a300009d00009d00009d0000a30000a30000a30000a30000a30000a30000a9 +0001af0018c0002fd2004be70071ff0071ff178fff52abff71bbffa0d1ff91caff81c2ff52abff52abff178fff0062f9003edd0009b500009300007100007100 +005400004400003800003800003800003800003800003800003800003800003800003e00003e00003e00003e00003e0000380000380000380000380000380000 +38000038000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800004400004e00005f0000710000880000980000980001af0018c00027cc0036d70036d7003edd003edd003edd003edd003edd0036d7003e +dd003edd0044e2004be7004be70053ed0062f90062f90069ff0069ff0062f90062f9005af3004be7003edd002fd20020c60011ba0001af0001af0000a900009d +00009800009300008d00008800008200008200007c00007c00007600007600007600007c00007c00007c00007c00007c00007c00007600007100007100007100 +006b00007100007100007100007600007600007c00007c00007c00007600007c00007c00007c00008200008d00008d0000930000a30001af0018c0002fd2003e +dd003edd004be7005af30062f90062f90069ff0069ff0069ff0069ff0069ff0069ff0071ff0078ff0080ff0788ff178fff178fff2797ff2797ff2797ff178fff +0788ff0080ff0078ff0078ff0071ff0069ff0069ff0069ff0071ff0071ff0071ff0078ff0078ff0788ff178fff42a4ff62b3ff91caff91caffc0e0ffdfefffff +ffffffffffeff7ffb0d9ff71bbff71bbff178fff0062f9003edd0018c00001af00009d00009d00009d00009800009d0000a30000a90000a90000a90000a90001 +af0009b50011ba002fd20044e20062f90788ff0788ff369eff71bbff91caffb0d9ff91caff81c2ff42a4ff42a4ff0788ff005af3002fd20001af00008d000071 +00007100005400004400003800003800003800003800003800003800003800003800003e00003e00003e00003e00003800003800003800003800003800003800 +00380000380000380000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003e00003e00004900005400006500007600008d00009d00009d0001af0018c00027cc0036d70036d70036d70036d70036d70036d70036d700 +36d70036d7003edd0044e20053ed0053ed005af30069ff0071ff0078ff0071ff0069ff0069ff0062f90053ed0044e2002fd20020c60009b50000a90000a90000 +9d00009800008d00008800008200007c00007600007600007100006b00006b00006b00006b00007100007100007100007600007600007100007100006b000065 +00006500006500006500006b00006b00007100007600007600007600007c00007c00007c00007c00008200008800009300009300009d0001af0018c0002fd200 +44e2004be7004be7005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0069ff0071ff0078ff0078ff0788ff178fff2797ff2797ff2797ff2797ff2797 +ff178fff0788ff0080ff0078ff0078ff0071ff0071ff0071ff0071ff0078ff0078ff0078ff0078ff0080ff0788ff178fff42a4ff71bbffa0d1ffa0d1ffcfe8ff +eff7ffc4e2ffeff7ffdfefffa0d1ff52abff52abff0080ff0053ed002fd20009b50000a300009800009800009800009800009d0000a30000a90001af0009b500 +09b50011ba0018c00027cc003edd005af30078ff2797ff2797ff62b3ff91caffb0d9ffc0e0ffa0d1ff81c2ff42a4ff42a4ff0080ff0053ed0027cc0000a90000 +8800007100007100005400004400003800003800003800003800003800003800003800003e00003e00003e00003e00003e000038000038000038000038000038 +00003800003800003800003800000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003e00003e00004900005400006500007c00008d00009d00009d0001af0018c00027cc002fd20036d70036d70036d70036d7002fd2 +002fd2002fd20036d7003edd004be70053ed0053ed0062f90071ff0071ff0078ff0071ff0071ff0071ff0062f90053ed003edd002fd20018c00009b50000a300 +00a300009800008d00008200007c00007600007100006b00006b00006500006500005f00005f00006500006500006b00006b00007100006b00006b0000650000 +6500005f00005f00005f00005f00006500006b00007100007600007600007600007c00007c00008200008200008800008d00009d00009d0000a90011ba002fd2 +003edd0053ed005af3005af30069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0071ff0078ff0788ff178fff2797ff2797ff2797ff27 +97ff178fff0788ff0080ff0078ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0078ff0078ff0080ff0080ff0788ff2797ff52abff71bbffa0d1ffa0d1 +ffdfefffeff7ffffffffeff7ffcfe8ff81c2ff369eff369eff0071ff0044e20020c60000a900009d0000930000930000980000980000a30000a90001af0011ba +0018c00018c00020c6002fd2003edd0053ed0071ff178fff52abff52abff81c2ffb0d9ffc0e0ffc0e0ffa0d1ff81c2ff369eff369eff0078ff004be70020c600 +00a300008200006b00006b00005400004900003e00003800003800003800003800003800003800003e00003e00003e00003e0000380000380000380000380000 +38000038000038000038000038000038000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800004400004400004e00005900006b00007c00008d0000a30000a30009b50018c00027cc002fd2002fd2002fd2002fd2002f +d2002fd2002fd2002fd20036d70044e2004be7005af3005af30069ff0078ff0078ff0080ff0078ff0071ff0071ff0062f90053ed003edd002fd20018c00001af +00009d00009d00008d00008200007600007100006b00006500005f00005f00005f00005900005900005900005900005f00006500006500006500006500006500 +005f00005900005900005900005400005900005f00006500006b00007100007c00007c00007c00008200008200008800008d0000980000a90000a90009b50027 +cc003edd0053ed0062f90069ff0069ff0071ff0071ff0071ff0069ff0062f90062f90062f90062f90062f90069ff0071ff0078ff0788ff178fff2797ff2797ff +2797ff178fff178fff0080ff0078ff0071ff0069ff0069ff0071ff0071ff0078ff0078ff0080ff0080ff0080ff0080ff0788ff178fff2797ff52abff81c2ffb0 +d9ffb0d9ffdfefffeff7ffffffffdfefffb0d9ff62b3ff178fff178fff005af3002fd20011ba00009d00009800008d00008d0000930000980000a30001af0009 +b50018c00027cc0027cc002fd20044e20053ed0069ff0788ff42a4ff71bbff71bbffa0d1ffcfe8ffcfe8ffcfe8ffa0d1ff71bbff2797ff2797ff0071ff0044e2 +0018c000009d00007c00006b00006b00005400004900003e00003e00003800003e00003e00003e00003e00003e00003e00003e00003800003800003800003800 +00380000380000380000380000380000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003e00003e00004900005900006b00007c00008d00009d00009d0001af0018c00027cc002fd2002fd20036d700 +2fd2002fd2002fd2002fd20036d7003edd0044e20053ed0062f90062f90069ff0078ff0078ff0078ff0071ff0062f90062f90053ed0044e20036d70020c60009 +b50000a900009800009800008d00008200007600007100006b00006500006500006500005f00005900005900005900005f00006500006500006500006b000065 +00006500005f00005900005400005400005400005900005f00006500007100007600008200008200008800008800008d00009300009d0000a30009b50009b500 +18c00036d7004be7005af30069ff0071ff0071ff0071ff0069ff0069ff0062f9005af30053ed0053ed0053ed0053ed005af30062f90071ff0078ff0788ff0788 +ff0788ff178fff0788ff0080ff0078ff0071ff0069ff0062f90062f90069ff0071ff0078ff0080ff0080ff0788ff0788ff0788ff178fff2797ff42a4ff62b3ff +91caffc0e0ffc0e0ffeff7ffeff7ffffffffcfe8ffa0d1ff42a4ff0078ff0078ff004be70020c60001af00009800009300008d00008d00009300009d0000a300 +01af0011ba0020c6002fd2002fd2003edd004be7005af30071ff178fff42a4ff81c2ff81c2ffa0d1ffc0e0ffc0e0ffc0e0ffa0d1ff71bbff2797ff2797ff0071 +ff003edd0011ba00009d00007c00006b00006b00005400004900004400003e00003e00003e00003e00003e00003e00003e00003e00003e000038000038000038 +00003800003800003800003800003800000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003e00003e00004900005400006500007600008d00009d00009d0001af0018c00027cc002fd2002fd2 +0036d70036d70036d7002fd20036d70036d70044e2004be7005af30062f90062f90071ff0078ff0071ff0071ff0062f9005af3005af3004be70036d70027cc00 +18c00001af0000a300009300009300008800007c00007600007100006b00006b00006500006500005f00005f00005f00005f00006500006500006b00006b0000 +6b00006500006500005900005400005400005400005400005900005f00006b00007600007c00008800008800008d00009300009800009d0000a90001af0018c0 +0018c0002fd20044e2005af30069ff0078ff0071ff0071ff0071ff0069ff005af30053ed004be70044e20044e20044e20044e2004be7005af30062f90071ff00 +78ff0080ff0080ff0080ff0078ff0078ff0069ff0062f90062f9005af3005af30062f90069ff0071ff0080ff0788ff178fff178fff2797ff2797ff42a4ff52ab +ff81c2ffa0d1ffcfe8ffcfe8ffeff7ffffffffffffffc0e0ff91caff2797ff0069ff0069ff003edd0011ba0000a300009300008d00008d00008d00009300009d +0000a90009b50018c00027cc0036d70036d70044e20053ed0069ff0080ff2797ff52abff81c2ff81c2ffa0d1ffc0e0ffc0e0ffc0e0ff91caff62b3ff178fff17 +8fff0069ff003edd0011ba00009800007c00006500006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e0000380000380000 +38000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800004400004e00005f0000710000880000980000980000a90018c00027cc0036 +d70036d70036d70036d70036d70036d7003edd003edd004be70053ed005af30069ff0069ff0071ff0071ff0071ff0069ff0062f90053ed0053ed0044e20036d7 +0027cc0018c00009b50000a300009800009800008d00008200007c00007600007100006b00006500006500006500005f00005f00005f00006500006b00006b00 +006b00007100006b00006500005f00005900005400005400005400005900006500007100007c0000880000930000930000980000a30000a90001af0009b50018 +c00027cc0027cc003edd004be70062f90069ff0078ff0071ff0071ff0069ff0062f90053ed004be7003edd003edd0036d70036d7003edd0044e2004be7005af3 +0062f90071ff0071ff0071ff0071ff0069ff0069ff005af30053ed0053ed0053ed0053ed005af30062f90071ff0080ff0788ff178fff178fff2797ff369eff42 +a4ff52abff81c2ffa0d1ffc0e0ffc0e0ffeff7ffeff7ffdfefffb0d9ff71bbff178fff005af3005af30036d70009b50000a300009300008d00008d00008d0000 +9300009d0000a90009b50018c00027cc0036d70036d70044e20053ed0062f90078ff178fff42a4ff71bbff71bbff91caffb0d9ffb0d9ffb0d9ff91caff62b3ff +178fff178fff0069ff003edd0011ba00009800007c00006500006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e00003800 +00380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800004400004e00005900006b0000820000980000980000a90011ba00 +27cc0036d70036d7003edd003edd003edd003edd0044e20044e20053ed005af30062f90069ff0069ff0071ff0071ff0071ff0069ff005af30053ed0053ed0044 +e20036d70027cc0018c00009b50000a900009d00009d00009300008800007c00007600007100006b00006500006500006500005f00006500006500006b000071 +00007100007100007100006b00006500005f00005900005900005900005400005f00006500007600008200009300009d00009d0000a90001af0009b50018c000 +20c60027cc0036d70036d70044e2005af30069ff0071ff0078ff0071ff0071ff0069ff005af3004be7003edd0036d7002fd2002fd2002fd20036d7003edd0044 +e20053ed005af30062f90062f90062f90069ff0062f9005af30053ed004be7004be7004be7004be70053ed0062f90071ff0078ff0788ff178fff178fff2797ff +369eff42a4ff52abff81c2ffa0d1ffc0e0ffc0e0ffdfefffcfe8ffcfe8ff91caff52abff0080ff0053ed0053ed0027cc0001af00009d00008d00008d00008d00 +008d00009300009d0000a90009b50018c00020c6002fd2002fd2003edd0053ed0062f90078ff0788ff369eff62b3ff62b3ff81c2ffa0d1ffa0d1ffa0d1ff81c2 +ff62b3ff178fff178fff0069ff003edd0011ba00009800007c00006500006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e +00003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004400005400006500007c0000930000930000a9 +0011ba0027cc0036d7003edd0044e2004be7004be7004be7004be70053ed005af30062f90069ff0071ff0071ff0071ff0071ff0069ff0069ff005af30053ed00 +53ed004be7003edd0036d70027cc0018c00009b50000a90000a900009d00009300008800007c00007600007100006b00006b0000650000650000650000650000 +6b00007100007600007600007600007100006b00006500005f00005f00005f00005900006500007100007c00008d00009d0000a90000a90009b50018c00027cc +002fd20036d7003edd004be7004be70053ed0062f90069ff0069ff0071ff0069ff0069ff0062f90053ed0044e20036d7002fd2002fd20027cc0027cc002fd200 +36d7003edd004be70053ed005af3005af3005af30053ed004be70044e2003edd003edd003edd0044e20044e2004be7005af30069ff0078ff0080ff178fff178f +ff2797ff2797ff42a4ff52abff71bbff91caffa0d1ffa0d1ffc0e0ffb0d9ffb0d9ff71bbff369eff0071ff004be7004be70027cc0001af00009d00008d00008d +00008d00008d00009800009d0000a30001af0011ba0018c00027cc0027cc0036d70044e20053ed0069ff0080ff178fff42a4ff42a4ff62b3ff81c2ff91caff91 +caff71bbff52abff178fff178fff0069ff003edd0011ba00009d00007c00006500006500005400004900003e00003e00003e00003e00003e00003e00003e0000 +3e000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004400005400006500007c0000930000 +930000a90011ba0027cc0036d7003edd0044e2004be7004be7004be7004be70053ed005af30062f90069ff0071ff0071ff0071ff0071ff0069ff0069ff005af3 +0053ed0053ed004be7003edd0036d70027cc0018c00009b50000a90000a900009d00009300008800007c00007600007100006b00006b00006500006500006500 +006500006b00007100007600007600007600007100006b00006500005f00005f00005f00005900006500007100007c00008d00009d0000a90000a90009b50018 +c00027cc002fd20036d7003edd004be7004be70053ed0062f90069ff0069ff0071ff0069ff0069ff0062f90053ed0044e20036d7002fd2002fd20027cc0027cc +002fd20036d7003edd004be70053ed005af3005af3005af30053ed004be70044e2003edd003edd003edd0044e20044e2004be7005af30069ff0078ff0080ff17 +8fff178fff2797ff2797ff42a4ff52abff71bbff91caffa0d1ffa0d1ffc0e0ffb0d9ffb0d9ff71bbff369eff0071ff004be7004be70027cc0001af00009d0000 +8d00008d00008d00008d00009800009d0000a30001af0011ba0018c00027cc0027cc0036d70044e20053ed0069ff0080ff178fff42a4ff42a4ff62b3ff81c2ff +91caff91caff71bbff52abff178fff178fff0069ff003edd0011ba00009d00007c00006500006500005400004900003e00003e00003e00003e00003e00003e00 +003e00003e0000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000 +00000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00005f00007600 +008d00008d0000a30011ba0027cc003edd0044e2004be70053ed0053ed0053ed005af3005af30062f90069ff0069ff0071ff0071ff0071ff0071ff0069ff0062 +f9005af30053ed0053ed004be70044e2003edd0036d70027cc0018c00009b50009b50000a900009800008d00008200007c00007100006b00006b000065000065 +00006500006b00007100007600007c00007c00007c00007600007100006b00006500006500006500005f00006b0000760000880000980000a90011ba0011ba00 +20c60036d7003edd004be7004be70053ed005af3005af30062f90069ff0069ff0069ff0069ff0062f90062f90053ed004be7003edd002fd20027cc0027cc0027 +cc0027cc0027cc002fd20036d70044e20044e2004be7004be7004be70044e2003edd0036d7002fd2002fd20036d70036d70036d70044e20053ed0062f90071ff +0080ff0788ff0788ff178fff2797ff369eff42a4ff62b3ff71bbff91caff91caffa0d1ff91caff91caff52abff178fff0069ff003edd003edd0020c60000a900 +009d00009300009300009300009300009800009d0000a30000a90001af0011ba0020c60020c60027cc003edd004be7005af30071ff0788ff2797ff2797ff52ab +ff71bbff81c2ff81c2ff71bbff52abff178fff178fff0069ff003edd0018c000009d00007c00006500006500004e00004900003e00003e00003e00003e00003e +00003e00003e00003e00003800003800003800003800003800003800003800003800003800003800000000003800003800000000000000000000000000000000 +00000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000049000059 +00007100008d00008d0000a30011ba0027cc003edd004be70053ed005af3005af30062f90062f90069ff0069ff0071ff0071ff0071ff0071ff0071ff0069ff00 +69ff0069ff0069ff0062f90062f90062f90062f9005af30053ed0044e20036d70020c60020c60011ba0000a900009800008d00007c00007600006b00006b0000 +6500005f00006500006b00007100007600007600007600007c00007600007100006b00006500006500006500006500007100007c00008d00009d0009b50020c6 +0020c6002fd20044e20053ed005af30062f90069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff005af3005af30053ed0044e2003edd0036d70027cc00 +27cc0027cc0027cc0027cc0027cc002fd20036d70036d7003edd0036d70036d7002fd20027cc0020c60018c00018c00020c60027cc0027cc002fd2003edd004b +e7005af30062f90071ff0071ff0071ff0078ff0080ff0080ff178fff2797ff42a4ff42a4ff52abff52abff42a4ff178fff0078ff005af30036d70036d70020c6 +0001af0000a300009d00009d00009d00009d00009d0000a30000a90001af0009b50011ba0020c60020c6002fd2003edd004be70062f90071ff0788ff369eff36 +9eff52abff71bbff71bbff81c2ff62b3ff42a4ff0788ff0788ff0062f90036d70009b500009800007600005f00005f0000490000440000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000380000380000380000380000380000000000000000000000000000380000380000380000380000 +4400005900007100008800008800009d0011ba0027cc003edd004be7005af30062f90062f90069ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff +0069ff0069ff0069ff0071ff0071ff0071ff0078ff0078ff0078ff0071ff0062f90053ed003edd003edd0027cc0011ba0000a300009300008200007600006b00 +006b00006500005f00006500006500006b00007100007600007600007600007600007100006b00006500006b00006b00006b0000760000820000980000a90011 +ba002fd2002fd20044e2005af30062f90071ff0071ff0078ff0071ff0071ff0071ff0071ff0071ff0069ff0062f9005af3005af30053ed0044e2003edd0036d7 +0027cc0027cc0020c60020c60027cc0027cc0027cc002fd20027cc0027cc0020c60020c60018c00011ba0001af0001af0001af0009b50011ba0011ba0018c000 +27cc0036d70044e2004be70053ed0053ed005af3005af3005af30062f90069ff0071ff0078ff0078ff0788ff0788ff0080ff0071ff0062f90044e2002fd2002f +d20018c00009b50000a90000a30000a30000a90000a90000a90000a90001af0001af0009b50011ba0020c60020c6002fd2003edd004be70062f90078ff0788ff +369eff369eff52abff71bbff71bbff71bbff52abff369eff0080ff0080ff0062f90036d70001af00009300007100005900005900004400003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000003800003800003800000000000000000000000000000000000000000000003800 +003800004400005400006b00008800008800009d0009b50027cc003edd0053ed0062f90069ff0069ff0071ff0078ff0078ff0078ff0078ff0078ff0071ff0071 +ff0071ff0069ff0069ff0071ff0078ff0080ff0080ff0788ff178fff0788ff0788ff0078ff0069ff004be7004be70036d70018c00001af000098000088000076 +00006b00006b00006500005f00006500006500006b00007100007600007600007600007100007100006b00006b00006b00006b00007100007c00008800009800 +01af0018c00036d70036d7004be70062f90071ff0078ff0078ff0080ff0078ff0078ff0078ff0071ff0071ff0069ff0062f90053ed0053ed004be70044e20036 +d7002fd20027cc0020c60020c60020c60020c60020c60020c60020c60018c00018c00011ba0011ba0001af0000a90000a300009d00009d0000a30000a90000a9 +0009b50011ba0020c6002fd20036d7003edd003edd003edd003edd003edd0044e20044e2004be7005af3005af30062f90062f90062f90053ed004be70036d700 +27cc0027cc0018c00011ba0009b50009b50009b50009b50009b50009b50009b50011ba0011ba0018c00020c60027cc0027cc0036d70044e2005af30069ff0080 +ff178fff42a4ff42a4ff52abff71bbff71bbff71bbff52abff369eff0078ff0078ff0053ed0027cc0000a900008800006b00005400005400003e000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00003800003800003e00004e00006b00008200008200009d0009b50027cc003edd0053ed0062f90071ff0071ff0078ff0080ff0080ff0080ff0080ff0078ff00 +71ff0071ff0071ff0069ff0071ff0071ff0080ff178fff178fff2797ff42a4ff369eff369eff178fff0080ff0062f90062f90044e20027cc0009b500009d0000 +8800007c00006b00006b00006500005f00006500006500006b00007100007100007100007600007100007100006b00006b00006b00006b00007100007c00008d +00009d0009b50020c6003edd003edd0053ed0069ff0078ff0080ff0788ff0788ff0080ff0080ff0078ff0071ff0069ff0062f9005af30053ed0053ed004be700 +3edd0036d7002fd20027cc0020c60018c00018c00018c00011ba0011ba0011ba0009b50001af0000a90000a90000a30000980000930000930000930000930000 +980000980000a30000a90009b50011ba0018c00020c60020c60020c60020c60020c60020c60027cc002fd20036d70036d7003edd003edd003edd0036d70036d7 +0027cc0020c60020c60018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00018c00020c60027cc002fd2002fd2003edd0053ed0062f900 +78ff0788ff2797ff52abff52abff62b3ff81c2ff71bbff71bbff42a4ff2797ff0071ff0071ff004be70020c60000a300008200006500004e00004e0000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000 +0000000000003800003800003e00004e00006500007c00007c0000980001af0020c6003edd0053ed0062f90071ff0071ff0080ff0080ff0788ff0788ff0788ff +0080ff0078ff0078ff0071ff0069ff0071ff0078ff0788ff2797ff2797ff369eff52abff52abff42a4ff2797ff0080ff0062f90062f90044e20027cc0009b500 +009d00008800007c00006b00006b00006b00006500006500006b00007100007100007100007100007100007100006b00006b00006500006b00006b0000710000 +7c00008d00009d0001af0020c6003edd003edd0053ed0069ff0071ff0080ff0080ff0080ff0078ff0078ff0078ff0071ff0069ff0062f9005af3004be7004be7 +0044e2003edd002fd20027cc0020c60018c00011ba0011ba0009b50009b50001af0001af0000a90000a300009d00009d00009800009300008800008800008800 +008d00008d00008d00009800009d0000a30000a90001af0001af0001af0001af0001af0001af0001af0009b50009b50011ba0011ba0018c00020c60020c60020 +c60020c60018c00018c00018c00020c60020c60027cc002fd2002fd20036d70036d7002fd2002fd2002fd2002fd20036d70036d70044e20044e20053ed0069ff +0078ff178fff369eff52abff71bbff71bbff81c2ff91caff81c2ff71bbff42a4ff0788ff0062f90062f9003edd0011ba00009800007c00005900004900004900 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800000000000000000000 +000000000000000000003800003800003800004900005f00007c00007c0000930001af0020c6003edd004be70062f90071ff0071ff0080ff0788ff178fff178f +ff0788ff0080ff0078ff0078ff0071ff0071ff0071ff0078ff178fff369eff369eff42a4ff62b3ff62b3ff52abff2797ff0788ff0069ff0069ff0044e20027cc +0009b500009d00008800007c00007100007100006b00006500006b00007100007100007600007100007100007100006b00006b00006500006500006b00006b00 +007100007c00008800009d0001af0020c60036d70036d7004be70062f90069ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff0069ff0062f90053ed004b +e7004be70044e20036d70027cc0020c60018c00009b50001af0001af0001af0000a90000a30000a300009d00009800009300009300008d000088000082000082 +00007c00008200008200008200008800008d00009300009800009800009d00009d00009d00009d00009d00009800009d00009d0000a30000a30000a30000a900 +01af0001af0009b50011ba0018c00018c00020c6002fd20036d70044e20044e2004be7004be70044e20044e20044e20044e20044e2004be7005af3005af30069 +ff0080ff178fff42a4ff62b3ff81c2ffa0d1ffa0d1ffa0d1ffa0d1ff91caff71bbff369eff0080ff005af3005af3002fd20001af00008d000071000054000044 +00004400003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000000 +00000000000000000000000000003800003800003800004900005f00007600007600008d0000a30011ba002fd20044e20062f90071ff0071ff0080ff0788ff17 +8fff178fff178fff0788ff0080ff0080ff0078ff0078ff0078ff0080ff178fff369eff369eff42a4ff62b3ff52abff42a4ff178fff0078ff005af3005af3003e +dd0020c60000a900009800008800007c00007100007100007100006b00007100007600007600007600007600007600007100007100006b00006500006500006b +00006b00007100007c0000880000980000a90011ba0027cc0027cc003edd004be70053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed00 +44e2003edd003edd002fd20027cc0018c00011ba0001af0001af0000a90000a90000a300009d00009d00009800009800009300008d00008d0000880000820000 +7c00007c00007c00008200008200008200008800008800008d00008d00009300009300009300009300009300009300009300009300009300009800009800009d +00009d0000a30000a90001af0011ba0020c60020c6002fd2003edd004be7005af3005af3005af3005af3005af30053ed0053ed0053ed005af3005af30069ff00 +69ff0078ff178fff369eff52abff81c2ff91caffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff178fff0071ff0044e20044e20020c60000a30000880000710000 +54000044000044000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000 +3800000000000000000000000000000000003800003800003800004900005f00007600007600008d0000a30011ba002fd20044e20062f90071ff0071ff0080ff +0788ff178fff178fff178fff0788ff0080ff0080ff0078ff0078ff0078ff0080ff178fff369eff369eff42a4ff62b3ff52abff42a4ff178fff0078ff005af300 +5af3003edd0020c60000a900009800008800007c00007100007100007100006b00007100007600007600007600007600007600007100007100006b0000650000 +6500006b00006b00007100007c0000880000980000a90011ba0027cc0027cc003edd004be70053ed005af30062f90062f90062f90062f90062f9005af3005af3 +0053ed0044e2003edd003edd002fd20027cc0018c00011ba0001af0001af0000a90000a90000a300009d00009d00009800009800009300008d00008d00008800 +008200007c00007c00007c00008200008200008200008800008800008d00008d0000930000930000930000930000930000930000930000930000930000980000 +9800009d00009d0000a30000a90001af0011ba0020c60020c6002fd2003edd004be7005af3005af3005af3005af3005af30053ed0053ed0053ed005af3005af3 +0069ff0069ff0078ff178fff369eff52abff81c2ff91caffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff178fff0071ff0044e20044e20020c60000a300008800 +00710000540000440000440000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800 +003800003800003800000000000000000000000000003800003800003800004400005900006b00006b00008800009d0009b50027cc003edd005af30069ff0069 +ff0080ff0788ff178fff178fff178fff0788ff0080ff0080ff0080ff0078ff0080ff0788ff2797ff42a4ff42a4ff42a4ff52abff42a4ff369eff0080ff0069ff +004be7004be7002fd20011ba0000a300009300008800007c00007600007600007600007100007600007c00007c00007c00007600007600007600007100006500 +006500006500006b00006b00007100007c0000880000980000a30009b50018c00018c00027cc0036d7003edd0044e20044e2004be7004be7004be7004be7004b +e7004be70044e2003edd002fd2002fd20020c60018c00009b50001af0000a30000a300009d00009d00009800009800009300009300008d000088000088000088 +00008200008200007c00007c00007c00007c00008200008200008200008200008800008800008800008d00008d00008d00008d00008d00008d00008d00008d00 +008d00008d00009300009800009d0000a90001af0018c00027cc0027cc003edd0053ed0062f90071ff0071ff0071ff0071ff0069ff0069ff0062f90062f90069 +ff0071ff0080ff0080ff0788ff369eff52abff71bbffa0d1ffb0d9ffc0e0ffc0e0ffb0d9ffa0d1ff71bbff42a4ff0788ff0062f90036d70036d70011ba00009d +00008200006b00005400004400004400003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038 +00003800003800003800003800003800003800000000000000003800003800003800003e00004e00006500006500007c0000930000a90018c00036d70053ed00 +62f90062f90078ff0788ff178fff178fff2797ff178fff0788ff0788ff0788ff0080ff0788ff178fff2797ff42a4ff42a4ff42a4ff42a4ff2797ff0788ff0071 +ff0053ed003edd003edd0020c60001af00009d00009300008800007c00007600007600007c00007c00007c00008200008200008200007c00007c000076000071 +00006500006500006500006b00006b00007100007c00008800009300009d0000a90009b50009b50011ba0018c00020c60027cc0027cc002fd2002fd2002fd200 +36d70036d70036d7002fd20027cc0018c00018c00011ba0001af0000a300009d00009800009300009300009300009300009300008d00008d0000880000880000 +8200008200007c00007c00007c00007c000082000082000082000082000082000082000082000082000088000088000088000088000088000088000088000088 +00008d00008d00008d00009300009800009d0000a90009b50020c6003edd003edd0053ed0069ff0078ff0788ff0080ff0080ff0080ff0078ff0071ff0071ff00 +71ff0071ff0078ff0788ff0788ff2797ff42a4ff71bbff81c2ffa0d1ffb0d9ffc0e0ffc0e0ffb0d9ff91caff62b3ff2797ff0071ff004be70027cc0027cc0000 +a900009300007600006500005400004900004900003e000038000038000038000038000038000038000038000038000038000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000 +380000380000380000380000380000380000380000380000380000380000380000380000380000380000490000590000590000710000880000a30011ba002fd2 +004be70062f90062f90078ff0080ff178fff178fff2797ff178fff178fff178fff178fff178fff178fff2797ff369eff42a4ff42a4ff42a4ff369eff178fff00 +78ff0062f90044e20027cc0027cc0009b50000a900009800008d00008200008200007c00007c00007c00008200008200008800008800008800007c00007c0000 +7600007100006500006500006500006b00006b00007100007c00008800008d00009800009d0000a30000a30000a90000a90001af0001af0009b50011ba0018c0 +0018c00020c60020c60020c60020c60018c00009b50009b50000a900009d00009300008d00008800008800008800008800008800008800008800008800008200 +008200007c00007c00007c00007c00007c0000820000820000820000820000820000820000820000820000820000820000820000820000820000880000880000 +8800008800008800008d00008d00008d00009300009d0000a90011ba002fd2004be7004be70062f90080ff178fff2797ff2797ff2797ff2797ff0788ff0080ff +0080ff0078ff0080ff0788ff2797ff2797ff42a4ff62b3ff81c2ffa0d1ffb0d9ffc0e0ffc0e0ffc0e0ffa0d1ff81c2ff42a4ff0788ff0062f9003edd0011ba00 +11ba00009d00008800007100005f00005400004900004900004400003e00003e0000380000380000380000380000380000380000380000380000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400005400005400006b0000820000980001 +af0020c6003edd0053ed0053ed0069ff0078ff0080ff0788ff178fff178fff178fff178fff178fff178fff2797ff2797ff369eff369eff369eff369eff2797ff +0080ff0069ff0053ed0036d70020c60020c60009b50000a300009800009300008d00008800008800008800008800008800008800008d00008800008800007c00 +007c00007600007100006500006500006500006b00006b00007600007c00008800008d00009300009800009800009800009800009800009800009800009d0000 +9d0000a90000a90001af0001af0009b50001af0001af0000a30000a3000098000093000088000082000082000082000082000082000082000088000082000082 +00008200007c00007c00007c00007c00007c00007c00008200008800008800008800008800008800008800008800008200008200008200008200008800008800 +008d00008d0000930000930000980000980000980000a30000a90011ba0027cc0044e20062f90062f90078ff2797ff369eff42a4ff369eff369eff369eff178f +ff0788ff0080ff0080ff0080ff0788ff2797ff2797ff369eff52abff71bbff81c2ff91caff91caff91caff91caff62b3ff42a4ff0788ff0069ff0044e20018c0 +0000a90000a900008d00007600006500005900004e00004900004900004400004400003e00003e00003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00004e00005f00007600 +008d0000a30011ba002fd20044e20044e2005af30069ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff2797ff2797ff369eff369eff369eff2797 +ff0788ff0071ff005af30044e20027cc0011ba0011ba0001af0000a300009d00009800009300009300008d00008d00008d00008d00008d00008d00008d000088 +00007c00007c00007600007100006500006500006500007100007100007600007c00008800008d00008d00008d00008d00008d00008800008200008200008200 +008200008800008d00008d00009800009d00009d00009d00009d00009300009300008800008200007c00007600007600007600007c00007c00007c0000820000 +8200007c00007c00007600007600007600007600007c00007c00008200008800008d00008d00008d00008d00008d000088000088000088000088000088000088 +00008d00009300009300009800009d0000a30000a30000a30001af0011ba0027cc0044e2005af30078ff0078ff178fff42a4ff52abff62b3ff52abff42a4ff42 +a4ff2797ff0788ff0788ff0080ff0788ff0788ff2797ff2797ff369eff42a4ff52abff62b3ff71bbff62b3ff52abff52abff369eff0788ff0069ff0044e20020 +c60000a900009300009300007c00006b00005900005400004900004900004900004400004400004400003e00003e000038000038000038000038000038000038 +00003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e000049000049000059 +00006b0000820000980001af0020c60036d70036d7004be7005af30069ff0071ff0080ff0080ff0788ff0788ff0788ff178fff178fff2797ff2797ff2797ff27 +97ff0788ff0080ff0069ff0053ed003edd0027cc0018c00018c00001af0000a90000a30000a300009d00009d0000980000980000980000980000930000930000 +8d00008800008200008200007600007100006b00006b00006b00007100007100007600008200008800008800008d00008800008200008200007c000076000076 +00007100007600007600008200008200008800008d00009300008d00008d00008800008800007c00007600007100007100007100007600007600007600007c00 +008200007c00007c00007600007100007100007100007100007600007c00008800008d00009300009800009800009800009800009300009300008d00008d0000 +8d00009300009800009d00009d0000a30000a90001af0001af0009b50018c00027cc003edd0053ed0071ff178fff178fff42a4ff62b3ff71bbff71bbff62b3ff +42a4ff42a4ff369eff178fff0788ff0788ff0788ff178fff2797ff2797ff369eff369eff42a4ff42a4ff42a4ff369eff2797ff2797ff0080ff0069ff0044e200 +27cc0001af00009300008200008200006b00005f00004e00004e00004900004400004400004400003e00003e00003e0000380000380000380000380000380000 +38000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000440000 +4400005400006500007c0000930000a90011ba0027cc0027cc003edd004be7005af30069ff0071ff0078ff0080ff0080ff0788ff178fff178fff178fff178fff +178fff178fff0080ff0071ff005af3004be70036d70020c60018c00018c00009b50001af0001af0001af0000a90000a90000a30000a300009d00009d00009800 +009300008d00008800008200008200007600007100006b00006b00006b00007100007100007600008200008800008800008800008200007c00007c0000710000 +6b00006500006500006500006b00007100007100007600007c00008200008200007c00007600007600007100006b00006500006500006b000071000076000076 +00007600007c00007c00007600007100007100007100007100007100007600007c00008800009300009800009d00009d00009d00009d00009d00009800009800 +009800009800009d0000a30000a90001af0009b50011ba0018c00018c00020c6002fd2003edd0053ed0069ff0788ff369eff369eff62b3ff81c2ff81c2ff81c2 +ff71bbff52abff52abff369eff2797ff178fff0788ff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff0788ff0078ff0078ff0062f9004be7 +0027cc0001af00009800007c00006b00006b00005900004e00004900004400004400004400004400003e00003e00003e00003800003800003800003800003800 +00380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +004400004400005400006500007c0000930000a90011ba0027cc0027cc003edd004be7005af30069ff0071ff0078ff0080ff0080ff0788ff178fff178fff178f +ff178fff178fff178fff0080ff0071ff005af3004be70036d70020c60018c00018c00009b50001af0001af0001af0000a90000a90000a30000a300009d00009d +00009800009300008d00008800008200008200007600007100006b00006b00006b00007100007100007600008200008800008800008800008200007c00007c00 +007100006b00006500006500006500006b00007100007100007600007c00008200008200007c00007600007600007100006b00006500006500006b0000710000 +7600007600007600007c00007c00007600007100007100007100007100007100007600007c00008800009300009800009d00009d00009d00009d00009d000098 +00009800009800009800009d0000a30000a90001af0009b50011ba0018c00018c00020c6002fd2003edd0053ed0069ff0788ff369eff369eff62b3ff81c2ff81 +c2ff81c2ff71bbff52abff52abff369eff2797ff178fff0788ff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff0788ff0078ff0078ff0062 +f9004be70027cc0001af00009800007c00006b00006b00005900004e00004900004400004400004400004400003e00003e00003e000038000038000038000038 +00003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000003800003800003800003800003800003800003e00003e00003e000038000038000038000038000038000038000038 +00003e00004400004400005400006500007600008d00009d0009b50018c00018c0002fd2003edd004be7005af30062f90071ff0078ff0078ff0080ff0080ff07 +88ff0788ff0788ff0080ff0080ff0071ff0069ff0053ed0044e20036d70027cc0020c60020c60018c00018c00018c00011ba0011ba0009b50001af0001af0000 +a90000a300009d00009800009300008d00008200008200007c00007600006b00006b00006b00007100007100007600007c00008800008800008800007c000076 +00007600007100006500005f00005f00005f00006500006b00006b00007100007100007600007100007100006b00006b00006500005f00005f00006500006500 +007100007600007600007600007c00007600007600007100006b00006b00006b00006b00007600007c00008800009800009d0000a90000a90001af0001af0001 +af0001af0001af0000a90000a90001af0009b50011ba0018c00020c60027cc002fd2002fd20036d70044e20053ed0069ff0080ff2797ff52abff52abff71bbff +91caff91caff91caff71bbff62b3ff62b3ff42a4ff2797ff178fff178fff178fff178fff178fff178fff178fff178fff178fff0788ff0080ff0071ff005af300 +5af30044e20027cc0001af00009800008200006b00005900005900004e00004900003e00003e00003e00003e00003e00003e0000380000380000380000380000 +38000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000003800003800003800003800003800003e00003e00003e00003e00003e00003e0000380000380000 +3800003800003e00004400004400005400005f0000760000880000980000a90011ba0011ba0020c6002fd2003edd004be7005af30062f90069ff0069ff0071ff +0078ff0080ff0080ff0078ff0071ff0071ff0069ff005af3004be7003edd0036d70027cc0027cc0027cc0027cc0027cc002fd20027cc0027cc0018c00011ba00 +11ba0001af0000a90000a300009800009300008d00008800008800007c00007600007100007100007100007100007100007600007c0000820000820000820000 +7c00007600007600006b00005f00005f00005900005900005f00005f00005f00006500006500006b00006500006500005f00005f00005900005900005900005f +00006500007100007600007600007600007c00007600007100006b00006500006500006500006500007100007c00008d00009d0000a90009b50009b50011ba00 +18c00018c00018c00018c00018c00018c00018c00020c60027cc002fd20036d7003edd0044e20044e2004be7005af30069ff0080ff178fff42a4ff71bbff71bb +ff91caffb0d9ffa0d1ffa0d1ff81c2ff62b3ff62b3ff42a4ff369eff2797ff178fff178fff178fff178fff178fff178fff0788ff0080ff0078ff0069ff0053ed +003edd003edd0020c60001af00009800008200006b00005400004900004900003e00003e00003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e00004400004400004400003e00003e00003e00 +003800003800003800003e00004400004400004e00005f0000710000820000930000a30001af0001af0018c00027cc0036d70044e20053ed005af30069ff0069 +ff0071ff0078ff0078ff0078ff0071ff0069ff0069ff005af30053ed0044e2003edd0036d70036d70036d70036d70036d7003edd003edd003edd0036d70027cc +0018c00018c00011ba0001af0000a900009d00009800009300008d00008d00008800008200007600007600007600007600007600007c00008200008800008800 +008800008200007c00007c00007100006b00006b00006500006500006500006b00006b00006b00006b00006500006500005f0000590000590000590000590000 +5f00006500006b00007600007c00007c00007c00008200007600007100006b00006500006500006500006500007100007c0000930000a30009b50020c60020c6 +002fd2003edd003edd003edd003edd0036d70036d7003edd003edd0044e20044e2004be70053ed005af3005af30062f90069ff0071ff0788ff2797ff52abff71 +bbff71bbff91caffb0d9ffa0d1ffa0d1ff81c2ff71bbff71bbff52abff369eff369eff2797ff2797ff178fff178fff178fff0788ff0080ff0078ff0069ff005a +f30044e2002fd2002fd20011ba0000a300008d00007600005f00004e00004900004900003e00003e000038000038000038000038000038000038000038000038 +00003800003800003800003800003800000000000000000000000000003800003800003800003800003800003800000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e000044000044000044000044000044 +00003e00003e00003800003800003e00004400004400004e00005900006b00007c00008d0000980000a90000a90009b50018c0002fd2003edd004be7005af300 +62f90062f90069ff0071ff0071ff0069ff0062f9005af3005af30053ed0044e20044e2003edd003edd003edd0044e20044e2004be7004be70053ed004be70044 +e20036d70027cc0027cc0018c00009b50000a90000a30000a300009d00009800009800009300008800008200007c00007c00007c00007c00007c000082000088 +00008800008800008200008200008200007c00007600007100007100007100007100007100007100006b00006b00006500005f00005900005900005900005400 +005900005f00006b00007600007c00008200008200008200008200007c00007100006b0000650000650000650000650000760000820000980001af0018c00036 +d70036d70044e2005af3005af30062f9005af3005af3005af3005af3005af30062f90062f90069ff0069ff0071ff0071ff0078ff0078ff0080ff178fff369eff +52abff81c2ff81c2ff91caffb0d9ffa0d1ffa0d1ff91caff71bbff71bbff62b3ff42a4ff369eff369eff2797ff2797ff178fff178fff0788ff0078ff0071ff00 +5af3004be7002fd20018c00018c00000a900009300007c00006b00005900004900004400004400003e00003e00003e00003e00003e0000380000380000380000 +38000038000038000038000038000000000000000000000000000000000000000038000038000038000038000038000038000038000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000440000440000490000440000 +4400004400004400003e00003e00003800003e00004400004400004e00005900006500007600008200009300009d00009d0001af0011ba0027cc0036d70044e2 +0053ed0062f90062f90069ff0069ff0069ff0062f9005af30053ed0053ed004be70044e20044e2003edd0044e2004be70053ed0053ed0062f90062f90062f900 +5af30053ed003edd002fd2002fd20020c60011ba0009b50001af0000a90000a90000a30000a300009d00009800008d0000880000880000880000880000880000 +8800008d00008d00008d00008d00008800008800008800008200008200008200007c00007c00007600007600007600006b00006500005f000059000059000059 +00005900006500006b00007600008200008800008d00008d00008d00008800008200007600007100006500006b00006b00006b00007600008800009d0009b500 +27cc004be7004be7005af30071ff0078ff0080ff0078ff0078ff0078ff0078ff0071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff0788ff178fff2797 +ff369eff52abff71bbff71bbff91caffa0d1ffa0d1ffa0d1ff91caff81c2ff81c2ff62b3ff52abff42a4ff369eff369eff2797ff178fff178fff0080ff0071ff +0062f9004be7003edd0020c60009b50009b500009d00008800007600005f00005400004900004400004400004400004400004400004400004400003e00003e00 +00380000380000380000380000380000000000000000000000000000000000000000380000380000380000380000380000380000380000380000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800004400004400004900 +004900004900004900004400003e00003e00003800003e00003e00003e00004900005400005f00006b00007c0000880000980000980000a30009b50020c6002f +d20044e20053ed0062f90062f90062f90069ff0062f9005af30053ed004be7004be70044e2003edd0044e20044e2004be7005af30062f90062f90071ff0071ff +0071ff0069ff005af3004be70036d70036d70027cc0018c00011ba0009b50009b50001af0001af0001af0000a90000a300009d00009800009300008d00008d00 +008d00009300009300009300009300009300009300009300009300009300009300008d00008d00008800008200008200007c00007100006500005f0000590000 +5900005900005f00006b00007600008200008d00009300009800009800009300008d00008200007c00007100006b00006b00006b00007100007c00008d0000a3 +0018c00036d7005af3005af30071ff178fff2797ff369eff2797ff2797ff2797ff178fff178fff178fff178fff2797ff2797ff2797ff2797ff2797ff2797ff27 +97ff369eff369eff52abff71bbff71bbff81c2ffa0d1ffa0d1ffa0d1ff91caff81c2ff81c2ff71bbff62b3ff52abff42a4ff369eff2797ff0788ff0788ff0080 +ff0069ff005af30044e20027cc0011ba0000a30000a300008d00007c00006b00005900004e00004900004400004400004400004400004400004400004400003e +00003e00003e00003800003800003800003800000000000000000000000000000000000000003800003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000044000044 +00004900004900004900004900004400003e00003800003800003800003800003800004400004900005400005f00007100007c00008d00008d00009d0001af00 +18c0002fd20044e20053ed0062f90062f90069ff0069ff0062f90062f90053ed004be7004be7004be70044e2004be70053ed005af30069ff0071ff0071ff0080 +ff0080ff0080ff0071ff0062f9004be7003edd003edd002fd20020c60018c00018c00018c00018c00018c00018c00011ba0009b50001af0000a90000a90000a3 +0000a30000a30000a30000a30000a30000a30000a30000a30000a30000a30000a30000a30000a300009d00009800008d00008d00008800007c00006b00006500 +005f00006500006500006b00007c00008800009300009d00009d0000a30000a300009d00009800008d00008200007c0000760000760000760000760000880000 +930000a90018c0003edd005af3005af30078ff178fff369eff42a4ff42a4ff369eff369eff369eff2797ff2797ff2797ff369eff369eff369eff369eff369eff +369eff369eff369eff369eff42a4ff62b3ff62b3ff71bbff91caffa0d1ffa0d1ffa0d1ff91caff91caff81c2ff62b3ff52abff42a4ff369eff178fff0080ff00 +80ff0071ff005af3004be7002fd20018c00000a900009800009800008200007100005f00005400004e0000490000490000490000490000490000490000490000 +4900004400004400003e000038000038000038000038000000000000000000000000000000000000000038000038000038000038000038000038000038000038 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000 +4400004900004900004900004900004900004400003e00003800003800003800003800003800003e00004400004e000054000065000071000082000082000093 +0000a90011ba0027cc003edd0053ed0062f90062f90069ff0069ff0069ff0062f9005af3004be7004be7004be7004be70053ed005af30069ff0078ff0788ff07 +88ff178fff178fff0788ff0078ff0069ff0053ed0044e20044e20036d70027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd20027cc0020c60018c00011 +ba0011ba0011ba0009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0000a900009d00009d000093000082000076 +00007100006b00007600007600007c00008d00009d0000a30001af0001af0001af0001af0000a900009d00009300008800008200007c00008200008200008200 +008d00009d0001af0020c60044e20062f90062f90080ff2797ff42a4ff52abff52abff52abff52abff42a4ff369eff42a4ff42a4ff42a4ff52abff52abff52ab +ff52abff42a4ff369eff369eff2797ff369eff42a4ff42a4ff62b3ff81c2ff91caffa0d1ffa0d1ff91caff91caff81c2ff71bbff52abff42a4ff2797ff178fff +0078ff0078ff0069ff0053ed0036d70020c60001af00009800008800008800007600006500005900004e00004e00004900004900004900004e00004e00004e00 +004e00004900004400004400003e0000380000380000380000380000000000000000000000000000000000380000380000380000380000380000380000380000 +38000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800 +003800004400004900004900004900004900004900004400003e00003800003800003800003800003800003e00004400004e0000540000650000710000820000 +820000930000a90011ba0027cc003edd0053ed0062f90062f90069ff0069ff0069ff0062f9005af3004be7004be7004be7004be70053ed005af30069ff0078ff +0788ff0788ff178fff178fff0788ff0078ff0069ff0053ed0044e20044e20036d70027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd20027cc0020c600 +18c00011ba0011ba0011ba0009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0000a900009d00009d0000930000 +8200007600007100006b00007600007600007c00008d00009d0000a30001af0001af0001af0001af0000a900009d00009300008800008200007c000082000082 +00008200008d00009d0001af0020c60044e20062f90062f90080ff2797ff42a4ff52abff52abff52abff52abff42a4ff369eff42a4ff42a4ff42a4ff52abff52 +abff52abff52abff42a4ff369eff369eff2797ff369eff42a4ff42a4ff62b3ff81c2ff91caffa0d1ffa0d1ff91caff91caff81c2ff71bbff52abff42a4ff2797 +ff178fff0078ff0078ff0069ff0053ed0036d70020c60001af00009800008800008800007600006500005900004e00004e00004900004900004900004e00004e +00004e00004e00004900004400004400003e00003800003800003800003800000000000000000000000000000000003800003800003800003800003800003800 +00380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038 +00003800003800003e00004400004900004900004900004900004400003e00003800003800003800003800003800003800003e00004400004e00005900006b00 +007600007600008800009d0001af0020c60036d7004be7005af3005af30062f90069ff0069ff0062f90062f9005af3005af3005af3005af30062f90071ff0080 +ff178fff2797ff2797ff369eff2797ff178fff0080ff0071ff005af3004be7004be7003edd0036d70036d70036d70036d7003edd0044e20044e20044e20044e2 +003edd003edd0036d7002fd2002fd20027cc0027cc0020c60020c60020c60020c60020c60020c60020c60020c60020c60020c60018c00009b50000a90000a900 +009d00008d00008200007c00007c00008200008200008d00009d0001af0009b50018c00011ba0011ba0011ba0001af0000a300009d00009300008d00008d0000 +8d00008d00009300009d0000a90011ba0027cc003edd005af3005af30071ff178fff2797ff42a4ff42a4ff42a4ff42a4ff369eff369eff369eff42a4ff42a4ff +52abff52abff52abff52abff42a4ff42a4ff369eff2797ff369eff42a4ff42a4ff52abff71bbff81c2ff91caff91caff91caff91caff81c2ff62b3ff52abff36 +9eff178fff0080ff0071ff0071ff005af3003edd0027cc0009b500009d00008800007600007600006b0000590000540000490000490000490000490000490000 +4900004900004900004900004400003e00003e000038000038000038000038000038000000000000000000000000000000000038000038000038000038000038 +00003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000 +3800003800003800003800003e00004400004900004900004900004900004400003e00003800003800003800003800003800003800003800003e000044000054 +00005f0000710000710000820000930000a90011ba002fd20044e2005af3005af30062f90069ff0069ff0069ff0069ff0062f90062f90069ff0069ff0078ff00 +80ff178fff369eff42a4ff42a4ff42a4ff369eff2797ff0788ff0071ff0062f90053ed0053ed0044e2003edd003edd003edd0044e20053ed0053ed0053ed005a +f3005af3005af3005af30053ed004be7004be70044e2003edd003edd0036d70036d70036d70036d70036d70036d70036d70036d70036d70027cc0020c60009b5 +0009b50000a900009800008d0000880000880000930000930000a30009b50018c00027cc002fd20027cc0020c60020c60011ba0001af0000a300009d00009800 +009800009d00009d00009d0000a90001af0018c00027cc003edd0053ed0053ed0069ff0080ff178fff369eff369eff369eff369eff369eff2797ff369eff42a4 +ff52abff62b3ff62b3ff62b3ff62b3ff52abff42a4ff369eff2797ff369eff369eff369eff52abff62b3ff81c2ff91caff91caff91caff91caff71bbff62b3ff +42a4ff2797ff0788ff0078ff0062f90062f9004be7002fd20011ba0000a300008d00007c00006500006500005900004e00004900004400004400004400004400 +004400004900004900004900004400003e0000380000380000380000380000380000380000380000000000000000000000000000000000380000380000380000 +38000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800003e00004400004900004900004900004900004400003e0000380000380000380000380000380000380000380000380000 +3e00004900005400006500006500007600008800009d0009b50020c6003edd0053ed0053ed005af30069ff0071ff0071ff0071ff0071ff0071ff0078ff0080ff +0788ff2797ff42a4ff52abff62b3ff62b3ff62b3ff42a4ff369eff178fff0078ff0069ff005af3005af3004be70044e2004be7004be70053ed0062f90069ff00 +69ff0071ff0078ff0078ff0078ff0071ff0069ff0069ff0062f9005af30053ed0053ed004be7004be7004be7004be7004be7004be7004be70044e2003edd002f +d20020c60020c60009b50000a90000980000980000980000a90000a90009b50020c60036d70036d7003edd002fd20027cc0027cc0018c00009b50001af0000a9 +0000a90000a90001af0001af0009b50011ba0018c00020c60027cc0036d70044e20044e2005af30069ff0078ff0788ff0788ff178fff178fff178fff178fff27 +97ff369eff42a4ff52abff62b3ff62b3ff62b3ff52abff52abff42a4ff369eff369eff369eff369eff42a4ff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff62b3 +ff52abff369eff178fff0078ff0069ff0053ed0053ed0036d70018c00000a900009300007c00006b00005900005900004e00004400003e00003e00003e00003e +00003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800003800000000000000000000000000000000003800003800003800 +00380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000038000038000000000000000000000000 +00000000003800003800003800003800003800003800003e00004400004900004900004900004400004400003e00003800003800003800003800003800003800 +003800003800004400004900005900005900006b00007c0000930000a90018c0002fd2004be7004be7005af30069ff0071ff0078ff0078ff0080ff0080ff0788 +ff178fff369eff52abff62b3ff81c2ff81c2ff81c2ff71bbff52abff42a4ff178fff0080ff0071ff0062f90062f9005af30053ed0053ed005af30062f90071ff +0080ff0080ff178fff178fff2797ff2797ff178fff0788ff0788ff0080ff0078ff0071ff0069ff0062f90062f90062f90062f90062f90062f9005af3005af300 +4be70044e2002fd2002fd20018c00009b50000a90000a90000a90011ba0011ba0027cc0036d7004be7004be7004be7003edd002fd2002fd20020c60011ba0009 +b50009b50009b50011ba0018c00018c00020c60020c60027cc0027cc0027cc002fd2003edd003edd004be7005af30062f90071ff0078ff0080ff0080ff0080ff +0788ff178fff2797ff42a4ff52abff62b3ff62b3ff71bbff62b3ff52abff42a4ff369eff369eff369eff369eff42a4ff52abff62b3ff81c2ff71bbff71bbff71 +bbff52abff42a4ff2797ff0080ff0069ff005af3003edd003edd0027cc0001af00009800008200006b00005900004900004900003e0000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000038000038 +00003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000003800003800003800003800003800003800003e00004400004900004900004400004400003e00003e000038000038000038000038 +00003800003800003800003e00004400005400005400005f0000710000820000980001af0018c00036d70036d7004be7005af30069ff0071ff0078ff0788ff07 +88ff178fff369eff52abff71bbff81c2ff91caff91caff91caff81c2ff62b3ff42a4ff2797ff0080ff0071ff0062f90062f9005af30053ed005af30062f90069 +ff0078ff0080ff0080ff178fff2797ff369eff2797ff2797ff178fff178fff0788ff0080ff0078ff0071ff0071ff0071ff0069ff0069ff0069ff0069ff0069ff +0062f9005af3004be7003edd003edd0027cc0018c00009b50011ba0011ba0020c60020c60036d70044e20053ed0053ed0053ed0044e20036d70036d70027cc00 +18c00018c00011ba0018c00020c60027cc0027cc002fd20036d70036d70036d7002fd2002fd20036d70036d7003edd004be7005af30069ff0071ff0078ff0078 +ff0080ff0788ff178fff369eff42a4ff62b3ff62b3ff62b3ff71bbff71bbff62b3ff52abff42a4ff42a4ff42a4ff42a4ff52abff62b3ff62b3ff71bbff62b3ff +52abff52abff369eff178fff0078ff0069ff0053ed003edd0027cc0027cc0009b500009d00008800007100005900004e00003e00003e00003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000 +38000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000003800003800003800003800003e00003e00004400004400004400004400004400003e00003e0000380000 +3800003800003800003800003800003800003e00004900004900005400006500007600008800009d0009b50020c60020c60036d7004be70062f90071ff0080ff +0788ff0788ff2797ff42a4ff71bbff91caffa0d1ffb0d9ffa0d1ffa0d1ff91caff71bbff52abff2797ff0788ff0078ff0069ff0069ff0062f9005af30062f900 +62f90071ff0080ff0788ff0788ff2797ff2797ff369eff369eff2797ff178fff178fff178fff0788ff0080ff0080ff0078ff0078ff0078ff0078ff0078ff0078 +ff0071ff0071ff0062f90053ed0044e20044e20036d70027cc0020c60020c60027cc0036d70036d7003edd004be7005af3005af30053ed0044e2003edd003edd +002fd20020c60020c60020c60027cc0036d7003edd003edd0044e20044e20044e2003edd0036d70036d7002fd2002fd20036d7003edd004be7005af30069ff00 +71ff0071ff0080ff0788ff2797ff369eff52abff62b3ff71bbff71bbff71bbff71bbff71bbff62b3ff62b3ff52abff52abff52abff62b3ff62b3ff62b3ff52ab +ff42a4ff369eff369eff0788ff0078ff0062f9004be70036d70020c60009b50009b50000a300008d00007600006500004e000044000038000038000038000038 +00003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400004400004900004400004400003e00 +003e00003e00003800003800003800003800003800003800004400004400004900005400006500007600008d00009d0009b50009b50027cc003edd0053ed0062 +f90071ff0788ff0788ff2797ff42a4ff71bbff91caffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff369eff178fff0080ff0071ff0071ff0069ff0062f9 +0069ff0071ff0078ff0788ff178fff178fff2797ff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0080ff0080ff0080ff0080ff0080ff00 +80ff0080ff0078ff0071ff0069ff005af3004be7004be7003edd0036d7002fd2002fd20036d7003edd003edd004be70053ed005af3005af3005af3004be70044 +e20044e20036d7002fd2002fd2002fd20036d7003edd004be7004be70053ed0053ed0053ed004be7003edd0036d7002fd2002fd2002fd20036d70044e20053ed +0062f90078ff0078ff0788ff178fff369eff52abff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff81c2ff71bbff71bbff62b3ff62b3ff62b3ff62b3ff52abff42 +a4ff42a4ff2797ff0080ff0080ff0071ff005af30044e2002fd20018c00001af00009d00009d00008d00007c00006500005400004400003e0000380000380000 +38000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e000044000044000044000049000044000044 +00003e00003e00003e00003800003800003800003800003800003800004400004400004900005400006500007600008d00009d0009b50009b50027cc003edd00 +53ed0062f90071ff0788ff0788ff2797ff42a4ff71bbff91caffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff369eff178fff0080ff0071ff0071ff0069 +ff0062f90069ff0071ff0078ff0788ff178fff178fff2797ff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0080ff0080ff0080ff0080ff +0080ff0080ff0080ff0078ff0071ff0069ff005af3004be7004be7003edd0036d7002fd2002fd20036d7003edd003edd004be70053ed005af3005af3005af300 +4be70044e20044e20036d7002fd2002fd2002fd20036d7003edd004be7004be70053ed0053ed0053ed004be7003edd0036d7002fd2002fd2002fd20036d70044 +e20053ed0062f90078ff0078ff0788ff178fff369eff52abff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff81c2ff71bbff71bbff62b3ff62b3ff62b3ff62b3ff +52abff42a4ff42a4ff2797ff0080ff0080ff0071ff005af30044e2002fd20018c00001af00009d00009d00008d00007c00006500005400004400003e00003800 +00380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00003e0000440000490000 +4900004900004400004400004400003e00003e00003800003800003800003800003800003800003e00004900005400006500007600008d0000a30000a30011ba +002fd20044e2005af30069ff0080ff0080ff2797ff42a4ff71bbff91caffb0d9ffc0e0ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff42a4ff178fff0788ff0078ff00 +78ff0071ff0071ff0071ff0078ff0080ff178fff2797ff2797ff369eff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0788ff0788ff0788 +ff0788ff0788ff0788ff0788ff0080ff0078ff0071ff0062f9005af3005af3004be70044e2003edd003edd0044e2004be7004be70053ed005af30062f90062f9 +005af30053ed004be7004be7003edd0036d70036d70036d70044e2004be7005af3005af30062f90062f90062f9005af3004be7003edd002fd2002fd2002fd200 +2fd2003edd004be70062f90078ff0078ff0788ff2797ff42a4ff62b3ff71bbff81c2ff91caff91caff91caff91caff91caff81c2ff81c2ff71bbff71bbff71bb +ff62b3ff52abff369eff2797ff0080ff0069ff0069ff0053ed003edd0027cc0011ba0000a9000098000088000088000076000065000054000049000038000038 +00003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00003e00004400 +004400004900004900004900004400004400004400003e00003800003800003800003800003800003800003800003e00004400005400006500007c0000930000 +930000a30011ba002fd20044e2005af30071ff0071ff0788ff369eff52abff81c2ffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff91caff71bbff52abff2797ff178fff +0080ff0080ff0080ff0080ff0080ff0788ff178fff2797ff369eff369eff369eff369eff2797ff2797ff178fff0788ff0788ff0080ff0080ff0788ff0788ff07 +88ff0788ff178fff178fff0788ff0788ff0080ff0080ff0071ff0069ff005af3005af30053ed004be7004be7004be7004be70053ed0053ed005af3005af30062 +f90062f90062f9005af30053ed0053ed004be70044e20044e2003edd004be70053ed0062f90062f90069ff0071ff0071ff0062f9005af30044e20036d70036d7 +0036d70036d70044e20053ed0069ff0080ff0080ff2797ff52abff71bbff81c2ff91caffa0d1ffa0d1ffa0d1ffa0d1ffa0d1ffa0d1ff91caff91caff81c2ff71 +bbff71bbff52abff42a4ff178fff0080ff0062f9004be7004be70036d70018c00001af00009d00009300008200007100007100006500005400004900003e0000 +38000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038 +00003e00004400004900004900004900004900004900004400004400003e00003800003800003800003800003800003800003800003800004400004e00006500 +007c00007c0000930000a90018c0002fd20044e2005af3005af30078ff178fff42a4ff71bbff91caffa0d1ffa0d1ffa0d1ffa0d1ff91caff71bbff52abff369e +ff2797ff178fff178fff178fff0788ff178fff2797ff2797ff369eff369eff369eff42a4ff369eff2797ff178fff0080ff0080ff0080ff0078ff0080ff0080ff +0788ff0788ff178fff178fff178fff178fff178fff0788ff0080ff0078ff0069ff0062f90062f9005af3005af30053ed0053ed005af3005af3005af3005af300 +62f90062f90062f90062f90062f9005af3005af30053ed004be7004be7004be70053ed005af30069ff0069ff0071ff0078ff0080ff0071ff0062f90053ed003e +dd003edd003edd0036d7004be7005af30071ff178fff178fff42a4ff71bbff91caffb0d9ffb0d9ffc0e0ffc0e0ffc0e0ffc0e0ffb0d9ffb0d9ffa0d1ff91caff +81c2ff71bbff71bbff42a4ff2797ff0080ff0069ff004be7002fd2002fd20011ba0000a900009800008800007600006b00005900005900004e00004400003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000 +3800003800003800003e00004400004900004900004900004900004900004400003e000038000038000038000038000038000038000038000038000038000044 +00005400006b00006b0000820000980000a90018c0002fd20044e20044e2005af30071ff178fff42a4ff62b3ff91caff91caff91caffa0d1ff91caff81c2ff62 +b3ff52abff369eff2797ff2797ff2797ff2797ff369eff369eff42a4ff52abff52abff52abff52abff369eff2797ff0788ff0080ff0078ff0078ff0078ff0078 +ff0078ff0080ff0788ff178fff178fff178fff178fff0788ff0080ff0078ff0071ff0069ff0062f90062f9005af3005af3005af30062f90062f90062f90062f9 +0062f90062f90069ff0069ff0069ff0062f90062f90062f9005af3005af30053ed004be70053ed005af30069ff0069ff0078ff0080ff0788ff0080ff0071ff00 +62f90053ed0053ed004be70044e20053ed0069ff0080ff369eff369eff62b3ff91caffb0d9ffcfe8ffcfe8ffcfe8ffcfe8ffcfe8ffc0e0ffb0d9ffb0d9ff91ca +ff81c2ff62b3ff42a4ff42a4ff178fff0078ff0062f90044e20027cc0011ba0011ba0000a300009300008200007100006500005400004900004900003e000038 +00003800003800003800003800003800003800003800003800003800003e00003800003800003800003800003800000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800004400004900004900004e00004e00004900004900003e0000380000380000380000380000380000000000000000000000 +3800003800004400005900005900006b0000820000980000a90011ba0027cc0027cc003edd005af30078ff178fff42a4ff71bbff81c2ff81c2ffa0d1ff91caff +81c2ff71bbff62b3ff52abff42a4ff42a4ff42a4ff42a4ff52abff52abff62b3ff71bbff62b3ff62b3ff62b3ff42a4ff2797ff0788ff0078ff0071ff0071ff00 +71ff0071ff0078ff0080ff0788ff178fff178fff178fff178fff0788ff0080ff0078ff0069ff0062f90062f90062f90062f90062f90062f90069ff0069ff0069 +ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0062f9005af30053ed005af30062f90069ff0069ff0078ff0788ff178fff0788ff +0080ff0071ff0062f90062f9005af3005af30062f90071ff178fff42a4ff42a4ff81c2ffb0d9ffcfe8ffdfefffdfefffeff7ffdfefffdfefffcfe8ffc0e0ffa0 +d1ff91caff71bbff42a4ff2797ff2797ff0078ff0062f90044e20027cc0009b500009d00009d00008d00007c00006b00005900004e0000440000380000380000 +3800003800003800003800003800003800003800003800003800003e00003e00003e00003e000038000038000038000038000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000003800003800003800003800003800003e00004400004900004e00004e00004900004900004400003e00003800003800003800003800000000000000 +000000003800003800003800004900004900005f0000710000820000930000a30009b50009b50027cc003edd005af30078ff2797ff52abff71bbff71bbff91ca +ff81c2ff81c2ff71bbff62b3ff52abff52abff52abff52abff52abff62b3ff62b3ff71bbff71bbff71bbff71bbff62b3ff42a4ff2797ff0788ff0071ff0069ff +0069ff0062f90069ff0071ff0078ff0080ff0788ff0788ff0788ff0788ff0080ff0078ff0069ff0062f9005af30062f90062f90062f90062f90069ff0069ff00 +71ff0071ff0071ff0071ff0069ff0069ff0071ff0071ff0071ff0071ff0071ff0069ff0069ff0062f9005af3005af30062f90071ff0071ff0078ff0788ff2797 +ff178fff178fff0080ff0071ff0071ff0069ff0069ff0071ff0080ff2797ff62b3ff62b3ff91caffc0e0ffcfe8ffeff7ffeff7ffeff7ffcfe8ffcfe8ffc0e0ff +b0d9ff91caff71bbff42a4ff178fff0078ff0078ff005af30044e20020c60001af00009d00008800008800007600006500005900004900004400003800003800 +003800003800003800003800003800003800003800003800003800003e00004400004400004400003e0000380000380000380000380000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000003800003800003800004400004900004e00004e00004e00004e00004400003e000038000038000038000038000000 +00000000000000000000003800003800003e00003e00004e00005f00007100008200009300009d00009d0009b50020c60044e20062f90080ff369eff52abff52 +abff81c2ff81c2ff81c2ff71bbff62b3ff62b3ff52abff52abff62b3ff62b3ff71bbff71bbff81c2ff81c2ff71bbff71bbff62b3ff42a4ff178fff0080ff0069 +ff0062f90062f9005af30062f90069ff0071ff0080ff0080ff0788ff0788ff0080ff0078ff0069ff0062f9005af30053ed005af3005af3005af30069ff0071ff +0071ff0078ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0071ff0069ff0062f9005af30062f90062f90071ff0071ff0080ff07 +88ff2797ff2797ff2797ff0788ff0080ff0080ff0078ff0078ff0080ff178fff42a4ff71bbff71bbffa0d1ffc0e0ffdfefffeff7ffeff7ffeff7ffcfe8ffcfe8 +ffc0e0ffa0d1ff81c2ff52abff2797ff0080ff0062f90062f90044e20020c60001af00009800008200007100007100005f00004e00004900003e000038000038 +00003800003800000000000000000000003800003800003800003800003800003e00004400004400004900003e00003800003800003800003800000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000003800003800003800004400004900004e00004e00004e00004e00004400003e0000380000380000380000 +3800000000000000000000000000003800003800003e00003e00004e00005f00007100008200009300009d00009d0009b50020c60044e20062f90080ff369eff +52abff52abff81c2ff81c2ff81c2ff71bbff62b3ff62b3ff52abff52abff62b3ff62b3ff71bbff71bbff81c2ff81c2ff71bbff71bbff62b3ff42a4ff178fff00 +80ff0069ff0062f90062f9005af30062f90069ff0071ff0080ff0080ff0788ff0788ff0080ff0078ff0069ff0062f9005af30053ed005af3005af3005af30069 +ff0071ff0071ff0078ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0071ff0069ff0062f9005af30062f90062f90071ff0071ff +0080ff0788ff2797ff2797ff2797ff0788ff0080ff0080ff0078ff0078ff0080ff178fff42a4ff71bbff71bbffa0d1ffc0e0ffdfefffeff7ffeff7ffeff7ffcf +e8ffcfe8ffc0e0ffa0d1ff81c2ff52abff2797ff0080ff0062f90062f90044e20020c60001af00009800008200007100007100005f00004e00004900003e0000 +3800003800003800003800000000000000000000003800003800003800003800003800003e00004400004400004900003e000038000038000038000038000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000003800003800003800003e00004900004e00004e00004e00004e00004900004400003800003800 +003800003800000000000000000000000000003800003800003800003800004900005400005f00007100007c00008d00008d00009d0001af0027cc0044e20062 +f90080ff2797ff2797ff52abff52abff62b3ff52abff42a4ff42a4ff369eff369eff369eff369eff42a4ff52abff52abff52abff52abff52abff42a4ff178fff +0080ff0069ff005af30053ed0053ed004be7004be70053ed0062f90069ff0069ff0071ff0071ff0069ff0062f90053ed004be70044e20044e2004be7004be700 +53ed005af30062f90069ff0071ff0071ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0062f9005af3005af3005af3005af30069 +ff0069ff0078ff0080ff178fff178fff2797ff178fff0788ff0788ff0080ff0080ff0788ff2797ff42a4ff62b3ff62b3ff81c2ffa0d1ffb0d9ffc0e0ffb0d9ff +a0d1ff91caff91caff71bbff52abff369eff0788ff0078ff005af3003edd003edd0020c60001af00009800008200007100005f00005f00005400004400003e00 +003800003800003800003800003800000000000000003800003800003800003800003e00003e00004400004900004900004400003e0000380000380000380000 +38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000003800003800003e00004400004e00004e00004e00005400004e00004900003e +00003800003800003800003800000000000000000000003800003800003800003800003e00004900005400005f00006b0000760000760000880000980009b500 +27cc004be70069ff0080ff0080ff2797ff2797ff369eff2797ff2797ff178fff178fff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff178f +ff0080ff0069ff005af30044e2003edd003edd0036d7003edd0044e2004be70053ed005af3005af3005af30053ed0044e2003edd002fd2002fd2002fd2003edd +003edd0044e20053ed005af30062f90069ff0069ff0069ff0069ff0062f90062f90062f90062f90062f90062f90062f9005af3005af30053ed0053ed0053ed00 +53ed0062f90062f90071ff0078ff0788ff178fff178fff178fff0788ff0788ff0788ff0788ff178fff2797ff42a4ff52abff52abff71bbff81c2ff81c2ff81c2 +ff71bbff62b3ff42a4ff42a4ff369eff178fff0080ff0069ff0053ed0036d70020c60020c60001af00009300008200006b00005900004e00004e000044000038 +00003800003800003800003800000000000000000000000000003800003800003800003800004400004400004400004900004900004400003e00003800003800 +00380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000003800003800003e00004400004e00004e00004e00005400004e0000 +4900004400003800003800003800003800003800003800003800003800003800003800003800003e00004900004e00005400005f000065000065000076000088 +00009d0009b50027cc004be7005af3005af30071ff0078ff0080ff0078ff0078ff0071ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0080ff0078ff00 +78ff0071ff0062f90053ed003edd002fd20027cc0027cc0020c60027cc002fd20036d7003edd003edd003edd003edd0036d70027cc0020c60018c00018c00018 +c00027cc0027cc002fd2003edd004be7004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70044e20044e20044e2003edd +0044e20044e20053ed0053ed005af30069ff0078ff0078ff0080ff0080ff0080ff0080ff0080ff0788ff0788ff178fff2797ff369eff369eff369eff42a4ff36 +9eff369eff2797ff0788ff0080ff0080ff0071ff0062f90053ed0044e2002fd20018c00001af0001af00009800008200007100005900004e0000440000440000 +3800003800003800003800003800003800003800003800000000003800003800003800003800003e00004400004400004400004900004400004400003e000038 +00003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038 +00003800003800000000000000000000000000000000000000000000000000000000000000000000003800003800003800004400004e00004e00004e00005400 +004e00004e00004900003e00003800003800003800003800003800003800003800003800003800003800003e00004400004900004900004e0000540000540000 +6500007100008800009d0009b50027cc003edd003edd0053ed005af30062f9005af3005af30053ed0053ed0053ed0053ed0053ed0053ed005af3005af3005af3 +005af3005af30053ed0044e20036d70027cc0018c00011ba0011ba0009b50011ba0011ba0020c60027cc0027cc0020c60020c60018c00011ba0001af0000a900 +00a90001af0011ba0011ba0018c00027cc0036d7003edd0044e20044e20044e20044e20044e2003edd003edd003edd0036d70036d70036d7002fd2002fd2002f +d2002fd2002fd20036d70044e20044e2004be7005af30062f90069ff0071ff0071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff0788ff0788ff0788ff +0788ff0080ff0071ff0069ff005af30053ed0053ed0044e20036d7002fd20020c60011ba0000a900009800009800008200007100005900004900003e00003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004400004400004900004900004400003e0000 +38000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +3800003800003800003800003800003800000000000000000000000000000000000000000000000000000000003800003800003800004400004900004900004e +00005400004e00004e00004900004400003e00003e00003800003800003800003800003800003800003e00003e00003e00004400004400004400004400004900 +004900005400005f0000710000820000980001af0018c00018c00027cc002fd20036d70036d70036d7002fd2002fd2002fd2002fd2002fd2002fd2002fd20036 +d70036d70036d70036d7002fd20027cc0018c00009b50000a90000a30000a300009d0000a30000a90001af0009b50009b50001af0001af0000a900009d000098 +0000930000980000980000a30000a30001af0009b50018c00020c60027cc0027cc0027cc002fd20027cc0027cc0027cc0020c60020c60018c00018c00011ba00 +11ba0011ba0011ba0018c00020c60027cc0027cc0036d7003edd004be70053ed005af30062f90069ff0069ff0069ff0071ff0078ff0078ff0071ff0071ff0071 +ff0069ff005af30053ed0044e20036d7002fd20020c60020c60011ba0009b50001af0000a300009d00008d00008200008200007100005f00004e00003e000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004400004900004900004900004400004400 +003e0000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000003800003800003800003e0000490000 +4900004e00005400005400004e00004e00004900004400004400003e00003800003800003800003e00003e00004400004400004400004400003e00003e00003e +00003800003800004400004900005900006b00007c00009300009d00009d0001af0009b50011ba0011ba0011ba0009b50009b50009b50009b50009b50009b500 +09b50011ba0011ba0011ba0011ba0009b50001af0000a300009d00009300008d00008d00008d00009300009300009800009d00009800009800009800008d0000 +8800008200007c0000820000880000930000930000980000a30000a90001af0009b50011ba0011ba0011ba0011ba0011ba0009b50009b50001af0000a90000a9 +0000a30000a30000a30000a90001af0009b50011ba0011ba0020c60027cc002fd20036d70044e2004be70053ed0053ed005af30069ff0069ff0069ff0062f900 +53ed0053ed0044e20036d70027cc0018c00009b50000a900009d00009d00009800009300008d00008800008200007600006b00006b00005f00004e0000440000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e000044000044000049000049000049000044 +00003e00003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003e00004900005400005900005900005f000065000065000065000065000065000065000065000065000065 +00006500006500006500006500006500006500006500005f00005900005900005400004e00004e00004e00005400005400005400005900005400005400005400 +004e00004e00004900004900004900004e00004e00004e00005400005900005f00005f00006500006500006500006500006500006500006500006500005f0000 +5f00005f00005900005900005900005f00005f00006500006500006500006b00007100007100007600007c00007c000082000082000082000088000088000088 +00008800008200008200007c00007600007100006b00006500005f00005900005900005400005400004e00004e00004900004400003e00003e00003800003800 +00380000380000380000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000 +38000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04 +c8006101b20015010a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b048d006101770015010a00 +000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000a0000002606 +0f000a00ffffffff00000000000007000000fc020000000000000000040000002d010000070000001b043c016101ed0015010a00000026060f000a00ffffffff +0100000000000a00000026060f000a00ffffffff00000000000030d20000430f2000cc000000a700d600000000004f004c00ef00170128000000d6000000a700 +0000010018000000000000000000eb0a0000eb0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800003800003e0000440000440000440000440000440000440000440000440000440000440000440000440000440000490000 +4900004e00005400005400005400005900005900005400005400004e00004e00004e00004900004400003e00003e00003e000038000038000038000038000038 +00003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800 +00380000380000380000380000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000038000000000000000000 +00000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800000000000000 +000000003800003800003800003800003800003800003800003800003e00003e00003e00003e00003e00004400003e00003e00003e0000380000380000380000 +38000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000038 +00003800003800003800003800004900005400005f00006b00007100007600007600007600007600007600007600007600007100007100007100007100007600 +007c00008200008800009300009300009800009d00009d00009800009800008d00008800008800007c00007100006b00006500006500005f00005f00005f0000 +5900005400004e00004400003e000038000038000038000038000000000000000000000000000000000000000000000000000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003e00003800003800003800003800003800003800003800003800 +003800003800003800003800003800003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800004400004e00005400005f00006500006500006b00006b00006b00007100006b00006b00006500005f00005400 +005400004e00004900003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800004900005900006b00007c00008800008d000098000098000098000098000098000098000098000093000093000093000093 +00009800009d0000a90001af0011ba0011ba0018c00020c60027cc0020c60018c00009b50000a90000a900009d00009300008d00008800008200007c00007600 +007600007600006b00006500005900004e0000440000440000380000380000380000000000000000000000000000000000000000380000380000380000380000 +3800003e00003e00003e00003800003800003800003800003800003800003800003e00003e00004400004400004400003e00003e00003e000038000038000038 +00003800003800003e00003e00004400004400004400004400003e00003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e00003e0000380000380000380000 +3800003800003800003800003800003800004900004900005400005f00006b00007100007c00008200008200008200008800008800008200008200007c000071 +00006b00006b00005f00005400004e00004400003e00003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800004400004400005900006b0000820000930000a30001af0011ba0011ba0011ba0011ba0011ba0011ba0011ba0009b50009b50009 +b50009b50011ba0018c00027cc0036d70044e20044e20053ed0053ed005af30053ed004be7003edd002fd2002fd20018c00009b50001af0000a300009d000098 +00009300009300008d00008200007c00006b00005f00004e00004e00004400003800003800003800000000000000000000000000000000003800003800003800 +003e00004400004400004400004400003e00003800003800003800003800003800003e00004400004900004e00004e00004e00004900004900004400003e0000 +3e00003800003e00004400004400004400004900004900004e00004900004400003e000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e00004400004400004400004400004400003e00 +003e00003800003800003800003800003800004400005400005400005f00007100007c00008800009300009800009800009800009d00009d0000980000980000 +8d00008800007c00007c00007100006500005900004e00004900004400004400003e000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800004900004900005f0000710000880000980000a90009b50018c00018c00018c00020c60018c00018c00018c00018c000 +18c00018c00018c00020c60027cc0036d7003edd004be7004be70053ed005af3005af30053ed004be70044e20036d70036d70027cc0018c00011ba0001af0000 +a90000a300009d00009d00009800008d00008800007600006b00005900005900004e00003e000038000038000038000000000000000000000000000038000038 +00003800003800003e00003e00003e00003e00003800003800003800003800003800003800003e00004400004900004900004900004900004400004400003e00 +003800003800003800003800003e00003e00003e00004400004400004400004400003e0000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e00003e00004400004400004400003e +00003e00003e00003800003800003800003800003e00004400004e00004e00005f00006b00007c00008200008d00008d00009300009300009300009300008d00 +008800008200007c00007100007100006b00005f00005900004e00004900004400004400003e0000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003e00004e00004e00006500007600008d00009d0001af0011ba0020c60020c60020c60027cc0027cc0027cc0027cc +0027cc0027cc0027cc0027cc002fd20036d7003edd0044e2004be7004be70053ed005af3005af30053ed0053ed0044e2003edd003edd0036d70027cc0020c600 +11ba0009b50001af0000a90000a90000a300009800009300008200007600006500006500005900004900003e0000380000380000380000000000000000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004400004400004400004900004400003e00003e +00003800003800003800003800003800003800003800003800003800003e00003e00003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e0000 +3e00003e00003e00003e00003800003800003800003800003e00004400004e00004e00005900006b00007600007c000088000088000088000088000088000088 +00008200007c00007600007100006b00006b00005f00005900005400004e00004900004400004400003e00003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003e00004e00004e00006500007600008d00009d0001af0011ba0020c60020c60020c60027cc0027cc0027 +cc0027cc0027cc0027cc0027cc0027cc002fd20036d7003edd0044e2004be7004be70053ed005af3005af30053ed0053ed0044e2003edd003edd0036d70027cc +0020c60011ba0009b50001af0000a90000a90000a300009800009300008200007600006500006500005900004900003e00003800003800003800000000000000 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000440000440000440000490000440000 +3e00003e00003800003800003800003800003800003800003800003800003800003e00003e000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +003e00003e00003e00003e00003e00003800003800003800003800003e00004400004e00004e00005900006b00007600007c0000880000880000880000880000 +8800008800008200007c00007600007100006b00006b00005f00005900005400004e00004900004400004400003e000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800004400005900005900006b0000820000930000a30009b50018c00027cc0027cc0027cc002fd200 +2fd2002fd2002fd2002fd2002fd2002fd20036d70036d7003edd003edd0044e2004be7004be70053ed0053ed0053ed0053ed004be70044e20044e20044e20036 +d7002fd20027cc0020c60018c00011ba0001af0001af0000a900009d00009800008d00007c00007100007100005f000054000049000038000038000038000038 +00003800003800000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004400004400004400 +004400003e00003e00003e00003800003800003800003e00003e00003e00003e00004400004400004400004400003e00003e0000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e +00003e00003e00004400004400003e00003e00003e00003800003800003800003e00004400004e00004e00005900006500007100007600007c00007c00007c00 +007c00007600007600007100006b00006500006500005f00005f00005900005400004e00004e00004900004400004400003e0000380000380000380000380000 +38000038000038000000000000000000000000000000000038000038000038000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003e00004900005f00005f0000710000880000980000a90011ba0020c6002fd2002fd2002fd2 +0036d70036d7003edd003edd003edd003edd003edd003edd003edd003edd0044e20044e20044e20044e2004be7004be7004be7004be7004be7004be70044e200 +44e2003edd0036d7002fd20027cc0020c60018c00011ba0011ba0001af0000a900009d00009300008800007600007600006b00005f00004e0000440000380000 +3800003800003800003800000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003e00003e +00004400003e00003e00003e00003e00003e00003e00004400004400004900004900004900004900004900004900004900004900004400004400004400003e00 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003e00003e00004400004400004400004400004400003e00003e00003e00003e00004400004400004e00004e00005900005f00006b000071000071000071 +00007100007100006b00006500005f00005900005900005400005400005400004e00004e00004e00004900004900004400004400003e00003e00003800003800 +00380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800004400004e00006500006500007600008d0000a30001af0018c00027cc0036d70036 +d70036d7003edd003edd0044e20044e20044e20044e20044e20044e20044e20044e2003edd003edd003edd003edd003edd0044e20044e20044e20044e20044e2 +0044e20044e20044e2003edd0036d7002fd20027cc0020c60011ba0011ba0009b50000a90000a300009800008d00008200008200007100006500005400004900 +00380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000 +3e00003e00004400004400004400004400004400004900004900004e00005400005400005900005900005900005900005900005400005400005400004e00004e +00004e00004900004400003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003e00003e00003e00004400004900004900004900004900004900004400004400004400003e00004400004900004e00004e00005900005f0000650000650000 +6b00006500005f00005f00005900005400004e00004e00004900004900004900004900004900004900004900004400004400004400004400003e000038000038 +00003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800004400005400006b00006b00007c0000930000a90009b50020c6002fd200 +3edd003edd003edd0044e2004be7004be7004be7004be7004be7004be7004be70044e20044e2003edd003edd0036d70036d70036d70036d70036d7003edd003e +dd0044e20044e20044e20044e20044e2003edd0036d7002fd20020c60018c00018c00011ba0001af0000a300009d00009300008800008800007600006b000059 +00004e00003e00003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800 +003800003800003e00004400004400004900004900004e00005400005900005f00005f00006500006500006500006500006500006500006500006500005f0000 +5f00005f00005900005400004e00004400003e000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003e00003e00004400004900004900004e00004e00004e00004e00004900004900004400004400004900004900004e00004e00005400005900005f00 +005f00005f00005900005400005400004e00004400004400003e00003e00003e00003e00003e00003e00003e00004400004400004400003e00003e00003e0000 +38000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000 +380000380000380000380000380000380000380000380000380000380000380000380000380000490000590000710000710000820000980001af0011ba0027cc +0036d7003edd003edd0044e2004be7004be70053ed004be7004be7004be7004be7004be70044e2003edd003edd0036d7002fd2002fd2002fd2002fd2002fd200 +36d70036d70036d7003edd003edd003edd003edd0036d7002fd20027cc0020c60011ba0011ba0009b50000a90000a300009800008d0000820000820000760000 +6b00005900004e00003e000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038 +00003800003800004400004900004e00005400005900005900005f00006500007100007600007c00008200008200008200008200008200008200007c00007c00 +007600007600007600007100006b00005f00005400004e00004400004400003e0000380000380000380000380000380000380000380000380000380000380000 +3800003800003e00004400004400004900004900004e00004e00004e00004e00004e00004900004900004900004400004900004900004e00004e000054000054 +00005900005900005400004e00004900004900004400003e00003800003800003800003800003800003800003800003800003e00003e00003e00003e00003e00 +003e0000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800004e00005f00007600007600008800009d0009b50018 +c0002fd20036d70044e20044e2004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be70044e2003edd0036d7002fd20027cc0027cc0027cc0027cc +0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd20027cc0020c60018c00011ba0011ba0001af0000a900009d00009800008d00008200008200 +007600006b00005900004e00003e0000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000380000 +3800003800003800003e00004900005400005900005f00006b00006b00007600007c00008800008d00009300009800009d00009d00009d000098000098000098 +00009300009300008d00008d00008800008200007600006b00005900004e00004e00004900003e00003e00003800003800003800003800003800003800003800 +003800003800003e00003e00004400004400004900004e00004e00005400005400004e00004e00004e00004900004900004400004900004900004e00004e0000 +4e00005400005400005400004e00004900004400004400003e000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00005f00007600007600008d0000a300 +09b50020c60036d7003edd004be7004be7004be70053ed0053ed0053ed0053ed0053ed0053ed0053ed004be70044e2003edd0036d7002fd20027cc0027cc0020 +c60020c60020c60020c60027cc0027cc0027cc0027cc0027cc0027cc0027cc0020c60018c00011ba0009b50009b50001af0000a300009d00009300008800007c +00007c00007100006500005900004900003e00003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003e00004900005900005f00006b00007600007c00007c0000880000930000980000a30000a90001af0001af0001af0001af0001af0000 +a90000a90000a300009d00009d00009d00009800009300008800007c00007100005f00005f00005900004e00004900004400003e00003e000038000038000038 +00003800003800003e00003e00004400004900004900004e00004e00005400005400005400005400005400004e00004900004900004400004400004900004900 +004900004e00004e00005400004e00004900004400003e00003e0000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00006500007c00007c000093 +0000a30011ba0027cc0036d70044e2004be7004be70053ed005af3005af3005af3005af30053ed0053ed0053ed004be70044e2003edd0036d7002fd20027cc00 +27cc0020c60020c60018c00018c00020c60020c60020c60020c60020c60020c60020c60018c00011ba0011ba0001af0001af0000a90000a300009800008d0000 +8800007c00007c00007100006500005400004900003e000038000038000038000000000000000000000000000000000000000000000000000000000000000000 +00003800003800003e00003e00004900005900006500007100007c0000880000930000930000980000a30001af0011ba0018c00020c60020c60020c60020c600 +18c00011ba0011ba0009b50001af0001af0001af0000a90000a300009800008d00008200007600007600006b00005f00005400004e00004900004400003e0000 +3e00003e00003e00003e00003e00003e00004400004900004900004e00005400005400005400005400005400005400004e000049000049000044000044000049 +00004900004900004e00004e00004e00004900004900003e00003800003800003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00006500007c0000 +7c0000930000a30011ba0027cc0036d70044e2004be7004be70053ed005af3005af3005af3005af30053ed0053ed0053ed004be70044e2003edd0036d7002fd2 +0027cc0027cc0020c60020c60018c00018c00020c60020c60020c60020c60020c60020c60020c60018c00011ba0011ba0001af0001af0000a90000a300009800 +008d00008800007c00007c00007100006500005400004900003e0000380000380000380000000000000000000000000000000000000000000000000000000000 +0000000000003800003800003e00003e00004900005900006500007100007c0000880000930000930000980000a30001af0011ba0018c00020c60020c60020c6 +0020c60018c00011ba0011ba0009b50001af0001af0001af0000a90000a300009800008d00008200007600007600006b00005f00005400004e00004900004400 +003e00003e00003e00003e00003e00003e00003e00004400004900004900004e00005400005400005400005400005400005400004e0000490000490000440000 +4400004900004900004900004e00004e00004e00004900004900003e000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004e00006500 +007c00007c0000930000a90011ba0027cc003edd0044e20053ed0053ed0053ed005af3005af3005af3005af3005af3005af30053ed0053ed004be70044e2003e +dd0036d7002fd2002fd20027cc0020c60018c00018c00018c00018c00018c00018c00018c00018c00018c00011ba0011ba0009b50001af0001af0000a900009d +00009300008d00008200007600007600006b00005f00005400004900003e00003800003800003800000000000000000000000000000000000000000000000000 +000000000000000000003800003800004900004900005900006b0000760000820000930000980000a30000a30001af0011ba0018c00027cc0027cc002fd2002f +d2002fd2002fd20027cc0020c60020c60018c00011ba0011ba0011ba0009b50001af0000a900009d00009300008800008800007c00007100006500005f000054 +00004e00004900004900004400004400003e00003e00004400004900004900004900004e00005400005400005400005400004e00004e00004e00004900004400 +004400004400004400004900004900004900004e00004e00004900004900003e0000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e000054 +00006500007c00007c0000930000a90018c00027cc003edd004be70053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af30053ed004be700 +4be7003edd0036d7002fd2002fd20027cc0020c60018c00018c00011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0009b50001af0000a90000a90000 +a300009800009300008800007c00007100007100006500005900004e000044000038000038000038000038000000000000000000000000000000000000000000 +00000000000000000000003800003800004400005400005400006b00007c00008d0000980000a30001af0011ba0011ba0018c00027cc002fd2003edd003edd00 +44e20044e20044e2003edd0036d70036d7002fd20027cc0020c60020c60020c60020c60018c00011ba0009b50000a900009d00009d0000930000880000760000 +6b00006500005900004e00004e00004900004400004400004400004400004900004e00004e00004e00005400005400005400005400004e00004e000049000044 +00004400003e00004400004400004400004400004900004900004900004900004400003e00003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000380000380000380000 +3e00005400006500007c00007c0000930000a90018c00027cc003edd004be70053ed0053ed005af3005af3005af3005af3005af3005af3005af3005af30053ed +0053ed004be70044e2003edd0036d70036d7002fd20027cc0020c60020c60018c00018c00018c00018c00018c00018c00018c00011ba0011ba0009b50000a900 +00a90000a300009800008d00008800007c00007100007100006500005900004e0000440000380000380000380000380000000000000000000000000000000000 +000000000000000000000000380000380000440000540000650000650000760000880000980000a30009b50011ba0020c60020c60027cc0036d7003edd003edd +0044e20044e2003edd003edd003edd0036d7002fd20027cc0020c60020c60020c60020c60020c60020c60018c00011ba0009b50001af0001af0000a300009800 +008800007c00007100006500005900005900005400004e00004900004900004900004e0000540000540000540000590000590000590000590000540000540000 +4e00004900004400003e00004400004400004400004400004900004900004900004900004400003e000038000038000038000038000038000038000038000038 +00003800003800000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000003800003800 +003800003e00005400006500007c00007c0000930000a90018c00027cc003edd0044e20053ed0053ed005af3005af3005af3005af3005af3005af3005af3005a +f3005af30053ed0053ed004be70044e2003edd003edd0036d7002fd20027cc0027cc0020c60020c60020c60020c60020c60020c60018c00018c00011ba0009b5 +0001af0001af0000a300009800008d00008200007600006b00006b00005f00005400004900004400003800003800003800003800003800000000000000000000 +000000000000000000000000003800003800003e00004e00005f0000710000710000880000980000a90009b50018c00020c6002fd2002fd20036d7003edd0044 +e20044e20044e20044e2003edd003edd0036d7002fd20027cc0020c60018c00018c00018c00018c00020c60020c60020c60020c60018c00011ba0011ba0009b5 +0000a900009800008d00008200007100006500006500005f00005400004e00004e00004e00005400005400005400005900005f00005f00005f00005900005400 +005400004e00004900004400004400004400004400004400004400004900004900004900004900004400003e0000380000380000380000380000380000380000 +38000038000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +38000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000038 +00003800003800003e00005400006500007c00007c0000930000a90018c00027cc003edd0044e20053ed0053ed0053ed005af3005af3005af3005af3005af300 +5af3005af3005af3005af3005af30053ed004be7004be7004be70044e2003edd0036d7002fd20027cc0027cc0027cc0027cc0027cc0027cc0020c60020c60018 +c00011ba0001af0001af0000a300009800008d00008200007600006b00006b00005f00005400004e00004400003e000038000038000038000038000038000000 +00000000000000003800003800003800003800003e0000490000590000710000820000820000930000a30001af0011ba0020c6002fd20036d70036d7003edd00 +44e20044e2004be70044e20044e20036d70036d7002fd20027cc0018c00018c00011ba0011ba0018c00018c00020c60027cc0027cc0027cc0027cc0020c60020 +c60018c00009b50000a900009800008d00007c00007100007100006500005f00005900005400005400005900005900005900005f00006500006500006500005f +00005900005900005400004e00004900004400004400003e00004400004400004400004900004900004900004400004400003e00003e00003800003800003800 +00380000380000380000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000 +0000003800003800003800004400005400006b0000820000820000980000a90018c00027cc003edd0044e20053ed0053ed0053ed005af3005af3005af3005af3 +005af3005af3005af3005af3005af3005af3005af30053ed0053ed0053ed004be70044e2003edd0036d70036d7002fd2002fd2002fd2002fd2002fd2002fd200 +27cc0020c60018c00009b50009b50000a900009d00009300008200007600006b00006b00005f00005900004e00004400003e0000380000380000380000380000 +3800003800003800003800003800003800003800003e00004e00005900006b00007c00008d00008d00009d0001af0011ba0020c6002fd20036d7003edd003edd +0044e2004be7004be7004be70044e2003edd0036d70036d70027cc0020c60011ba0009b50009b50009b50011ba0011ba0018c00027cc0027cc002fd2002fd200 +2fd2002fd20027cc0018c00009b50000a900009800008800007c00007c00007100006500005f00005f00005900005f00005f00005f0000650000650000650000 +6500006500005f00005f00005900004e00004900004400004400003e00004400004400004400004900004900004900004900004400003e00003e000038000038 +00003800003800003800000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000 +00000000000000380000380000380000440000590000710000820000820000980001af0018c0002fd2003edd004be70053ed0053ed005af3005af3005af3005a +f3005af3005af3005af3005af3005af30062f90062f90062f9005af3005af3005af30053ed004be70044e20044e2003edd003edd003edd003edd0036d70036d7 +0036d7002fd20027cc0018c00009b50009b50000a900009d00009300008800007c00007100007100006500005f00005400004e00004900004400003e00003e00 +003e00003800003800003800003e00003e00004900004900005400005f00006b00007c00008d0000980000980000a90009b50018c00020c6002fd20036d7003e +dd003edd0044e20044e20044e20044e2003edd0036d70027cc0027cc0018c00011ba0001af0001af0000a90001af0009b50009b50011ba0020c60027cc002fd2 +002fd2002fd2002fd20027cc0020c60011ba0001af00009d00009300008200008200007600006b00006500005f00005f00005f00006500006500006500006b00 +006b00006b00006500006500006500005900005400004e00004400004400003e00003e00003e00004400004400004900004900004400004400003e00003e0000 +38000038000038000038000038000038000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000 +00000000000000000000003800003800003e00004900005f00007600008800008800009d0001af0020c6002fd20044e2004be70053ed0053ed005af3005af300 +5af3005af3005af3005af3005af3005af3005af30062f90062f90062f90062f90062f90062f9005af30053ed0053ed004be7004be7004be70044e20044e20044 +e20044e2003edd0036d70027cc0020c60011ba0011ba0001af0000a300009800008d00008200007600007600006b00006500005900005400004e00004e000049 +00004900004900004900004900004900004e00005400005f00005f00006500007100008200008d0000980000a30000a30001af0011ba0018c00020c6002fd200 +36d70036d70036d7003edd0044e2003edd003edd0036d70027cc0018c00018c00009b50001af0000a30000a300009d0000a30000a90000a90009b50018c00020 +c6002fd2002fd2002fd2002fd20027cc0027cc0018c00009b50000a300009800008d00008d00007c00007600006b00006500006500006500006500006500006b +00006b00006b00007100006b00006500006500005f00005900004e00004900004400003e00003e00003e00003e00004400004400004400004400004400003e00 +003e00003800003800003800003800003800003800003800003800000000003800003800003800003800003800003800003800003800003e00003e00003e0000 +38000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +0000000000000000000000000000003800003800003e00004900005f00007600008800008800009d0001af0020c6002fd20044e2004be70053ed0053ed005af3 +005af3005af3005af3005af3005af3005af3005af3005af30062f90062f90062f90062f90062f90062f9005af30053ed0053ed004be7004be7004be70044e200 +44e20044e20044e2003edd0036d70027cc0020c60011ba0011ba0001af0000a300009800008d00008200007600007600006b00006500005900005400004e0000 +4e00004900004900004900004900004900004900004e00005400005f00005f00006500007100008200008d0000980000a30000a30001af0011ba0018c00020c6 +002fd20036d70036d70036d7003edd0044e2003edd003edd0036d70027cc0018c00018c00009b50001af0000a30000a300009d0000a30000a90000a90009b500 +18c00020c6002fd2002fd2002fd2002fd20027cc0027cc0018c00009b50000a300009800008d00008d00007c00007600006b0000650000650000650000650000 +6500006b00006b00006b00007100006b00006500006500005f00005900004e00004900004400003e00003e00003e00003e000044000044000044000044000044 +00003e00003e00003800003800003800003800003800003800003800003800000000003800003800003800003800003800003800003800003800003e00003e00 +003e0000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800000000003800003800003800003800003800004400005400006500007c00008d00008d0000a30009b50027cc0036d70044e20053ed005af3005a +f3005af3005af3005af3005af3005af30053ed0053ed005af3005af30062f90062f90062f90062f90062f90062f9005af3005af30053ed0053ed004be7004be7 +0044e20044e20044e2003edd003edd0036d7002fd20020c60018c00018c00009b50000a90000a300009800008d00008800008800007c00007600006b00006500 +005f00005f00005f00005f00005f00005f00005f00006500006500006b00007600007600007c00008800009300009d0000a90001af0001af0011ba0018c00020 +c60020c60027cc002fd2002fd2002fd2002fd20036d7002fd2002fd20027cc0018c00009b50009b50001af0000a300009d00009800009800009d0000a30000a3 +0001af0011ba0018c00020c60027cc0027cc0027cc0027cc0020c60011ba0009b50000a300009800008d00008d00008200007600006b00006500006500006500 +006500006500006500006b00006b00006b00006b00006500006500005f00005900005400004900004400003e00003e00003e00003e0000440000440000440000 +4400004400003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e +00003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000 +00000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003e0000490000590000710000820000980000980000a90011ba0027cc003edd004be70053ed00 +5af3005af30062f90062f9005af3005af30053ed0053ed0053ed0053ed005af3005af30062f90062f90062f90062f90062f90062f9005af3005af30053ed004b +e7004be70044e20044e20044e2003edd003edd0036d7002fd20027cc0018c00018c00011ba0001af0000a90000a300009d00009300009300008d00008200007c +00007600007600007600007100007100007600007600007600007c00008200008200008d00008d0000930000980000a30001af0009b50011ba0011ba0018c000 +20c60020c60020c60020c60020c60027cc0027cc0027cc0027cc0027cc0020c60018c00009b50001af0001af0000a30000980000930000930000930000980000 +a30000a30000a90009b50011ba0018c00020c60020c60020c60020c60018c00011ba0009b50000a300009800008d00008d00008200007600006b00006b000065 +00006500006500006500006500006500006b00006b00006b00006b00006b00006500005f00005400004e00004900004400004400004400003e00004400004400 +004400004900004400004400004400003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3e00003e00003e00003e00003e00003e00003e000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000 +00000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800004400005400006500007600008800009d00009d0001af0018c0002fd2003edd0053ed +005af30062f90062f90062f90062f9005af3005af30053ed0053ed0053ed0053ed0053ed005af30062f90062f90062f90062f90062f90062f9005af30053ed00 +53ed004be7004be70044e20044e2003edd003edd0036d70036d7002fd20027cc0020c60020c60018c00011ba0009b50001af0000a90000a30000a300009d0000 +9800008d00008d00008800008800008d00008d00008d00009300009300009300009800009d0000a30000a30000a90001af0009b50011ba0018c00020c60020c6 +0027cc0020c60020c60020c60018c00018c00018c00018c00018c00018c00011ba0011ba0001af0000a900009d00009d00009800009300008d00008d00009300 +009800009d00009d0000a30001af0009b50011ba0011ba0018c00018c00018c00011ba0009b50001af0000a300009800008d00008d00008200007600006b0000 +6500006500005f00005f00005f00005f00006500006500006b00006b00006b00006b00006500006500005900005400004e000049000044000044000044000044 +00004400004900004900004900004400004400004400003e00003e00003800003800003800003800003800003800003800003800003800003800003800003800 +003e00003e00003e00003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000380000380000380000380000380000380000 +00000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800004400004e00005900006b00007c0000930000a30000a30009b50020c60036d70044 +e20053ed005af30062f90062f90062f90062f90062f9005af30053ed0053ed0053ed0053ed0053ed005af3005af30062f90062f90062f90062f9005af3005af3 +0053ed0053ed004be70044e20044e20044e2003edd0036d70036d7002fd2002fd20027cc0027cc0027cc0020c60020c60018c00018c00011ba0009b50009b500 +01af0000a90000a30000a300009d00009d0000a30000a30000a30000a90000a90001af0001af0009b50011ba0011ba0011ba0018c00020c60027cc002fd2002f +d2002fd2002fd20027cc0027cc0020c60018c00011ba0009b50009b50009b50001af0001af0000a90000a300009d00009300009300008d00008d00008800008d +00008d00009300009d00009d0000a30000a90001af0009b50009b50009b50009b50009b50009b50001af0000a900009d00009800008d00008d00008200007600 +006b00006500005f00005f00005f00005f00005f00005f00006500006500006b00006b00006b00006b00006500005f00005900005400004e0000490000490000 +4400004400004900004900004900004900004900004900004900004400004400003e00003e00003e00003800003800003800003800003800003800003800003e +00003e00003e00003e00004400003e00003e00003e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800003800 +0038000038000038000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003e00003e00003e +00003800003800003800003800003800003800003800003800003800003800003800004400004e00005f0000710000820000930000a30000a30009b50020c600 +36d70044e20053ed005af30062f90062f90062f90062f9005af30053ed0053ed004be7004be7004be70053ed0053ed0053ed005af3005af3005af3005af3005a +f30053ed0053ed004be70044e20044e2003edd003edd003edd0036d70036d70036d70036d7002fd2002fd2002fd2002fd2002fd2002fd20027cc0027cc0020c6 +0020c60018c00011ba0009b50009b50001af0001af0009b50009b50009b50011ba0011ba0018c00018c00018c00020c60020c60020c60027cc002fd2002fd200 +36d70036d70036d70036d7002fd20027cc0020c60011ba0009b50000a90000a90000a90000a300009d00009d00009800009300008d00008d0000880000880000 +8800008d00009300009800009d00009d0000a30000a90001af0001af0001af0009b50009b50009b50001af0001af0000a90000a300009800008d00008d000088 +00007c00007600007100006b00006500006500006500006500006b00006b00007100007600007600007600007600007600007100006b00006500005900005400 +005400004e00004e00004e00004e00004e00004e00004e00004e00004900004900004900004900004900004400004400004400003e00003e0000380000380000 +3800003800003800003800003800003e00003e00003e000038000038000038000038000038000038000038000038000038000038000038000038000038000038 +000038000038000038000038000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003e00003e0000 +4400004400003e00003e00003800003800003800003800003800003800003800003e00003e00004900005400005f0000710000820000930000a30000a30009b5 +0020c60036d70044e20053ed005af3005af3005af3005af3005af3005af30053ed004be7004be7004be7004be7004be7004be70053ed0053ed0053ed0053ed00 +53ed0053ed004be7004be70044e20044e2003edd003edd003edd0036d70036d70036d70036d70036d70036d7003edd003edd003edd003edd003edd003edd0036 +d70036d70036d7002fd20027cc0020c60020c60018c00018c00018c00018c00020c60020c60027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd20036d7 +003edd003edd003edd003edd003edd0036d7002fd20018c00009b50000a900009d00009d00009d00009800009300008d00008d00008800008800008800008200 +008800008800009300009800009d0000a30000a30000a90000a90000a90001af0001af0001af0001af0001af0001af0000a90000a90000a30000980000930000 +9300008800008200007c00007600007100007100006b00006b00007100007100007600007c00008200008200008200008800008800008200007c00007100006b +00006500006500005900005900005400005400005400004e00004e00004e00004e00004e00004e00004e00004e00004e00004900004900004900004400003e00 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000000000000000000000000003800003800003800003800003800003800003800003800003800003e00003e00003e00 +004400004400004400004400003e00003800003800003800003800003800003800003800003800003800004400004e00005f0000710000820000930000a30000 +a30009b50020c6002fd2003edd004be70053ed005af3005af3005af3005af30053ed0053ed004be7004be7004be7004be7004be7004be7004be7004be70053ed +004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd003edd003edd003edd003edd0044e20044e20044e20044e2004be7004be7004be700 +44e20044e2003edd003edd003edd0036d7002fd20027cc0027cc0027cc0027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd20036 +d7003edd003edd0044e20044e20044e20044e20036d7002fd20018c00001af0000a300009800009800009300008d000088000088000082000082000082000082 +00008200008800008d00009800009d0000a30001af0001af0001af0001af0001af0001af0001af0001af0001af0001af0001af0001af0000a90000a90000a300 +009d00009d00009300008d00008800008800008200008200007c00007c00008200008200008800008d00009300009800009800009d00009d0000980000930000 +8800007c00007600007600006b00006500005f00005900005900005900005900005900005900005900005900005900005900005400005400005400004e000049 +00003e00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e00003e00 +003e000038000038000038000038000038000038000000000000000000000000003800003800003800003800003800003800003800003800003800003e00003e +00004400004400004900004900004400004400003e00003e00003800003800003800003800003800003800003800004400004e00005900006b00007c00009300 +00a30000a30009b50018c0002fd2003edd0044e2004be70053ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be7004be7004be7004be7004b +e7004be7004be7004be7004be7004be70044e20044e20044e20044e2003edd003edd003edd003edd0044e20044e2004be7004be70053ed0053ed0053ed0053ed +005af30053ed0053ed004be7004be70044e2003edd0036d70036d7002fd2002fd2002fd2002fd2002fd20036d70036d70036d70036d70036d70036d70036d700 +36d7003edd003edd0044e20044e20044e20044e20044e20036d70027cc0011ba0001af00009d00008d00008d00008800008200008200007c00007c00007c0000 +7c00007c00008200008800009300009d0000a90001af0009b50009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0001af0001af0001af +0000a90000a30000a30000a300009d00009800009300009300009300009300009300009300009800009d0000a30000a90001af0001af0009b50009b50001af00 +00a900009d00009300008800008800007c00007100006b00006500005f00005f00005f00005f00005f00005f00005f00006500005f00005f0000590000590000 +5400004900004400003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e00003e +00003e00003e00003800003800003800003800003800003800000000000000000000380000380000380000380000380000380000380000380000380000380000 +3e00003e00004400004900004900004900004400003e00003e00003e000038000038000038000038000038000038000038000038000044000054000065000076 +00008d00009d00009d0001af0018c00027cc0036d70044e20044e2004be7004be7004be70053ed004be7004be7004be7004be7004be7004be7004be7004be700 +4be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e20044e2004be7004be7004be70053ed0053ed005af30062f90062f90062 +f90062f90062f9005af3005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d7002fd2002fd2002fd2 +002fd2002fd20036d70036d7003edd0044e20044e20044e20044e20036d70027cc0011ba0000a300009800008800008800008200007c00007c00007c00007c00 +007c00008200008200008800008d0000980000a30001af0009b50011ba0011ba0011ba0011ba0011ba0009b50009b50001af0001af0009b50009b50009b50009 +b50011ba0011ba0009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0009b50009b50018c00020c60027cc002fd2002fd20036d70036d7 +002fd20020c60011ba0000a900009d00009d00008d00008200007600007100006b00006b00006b00006b00006b00006b00006b00006b00006b00006b00005f00 +005f00005900004e00004400003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e0000 +3e00003e00003e00003e000038000038000038000038000038000038000000000000000000003800003800003800003800003800003800003800003800003800 +003800003e00003e00004400004900004900004900004400003e00003e00003e0000380000380000380000380000380000380000380000380000440000540000 +6500007600008d00009d00009d0001af0018c00027cc0036d70044e20044e2004be7004be7004be70053ed004be7004be7004be7004be7004be7004be7004be7 +004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70044e20044e20044e20044e2004be7004be7004be70053ed0053ed005af30062f900 +62f90062f90062f90062f9005af3005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d7002fd2002f +d2002fd2002fd2002fd20036d70036d7003edd0044e20044e20044e20044e20036d70027cc0011ba0000a300009800008800008800008200007c00007c00007c +00007c00007c00008200008200008800008d0000980000a30001af0009b50011ba0011ba0011ba0011ba0011ba0009b50009b50001af0001af0009b50009b500 +09b50009b50011ba0011ba0009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0009b50009b50018c00020c60027cc002fd2002fd20036 +d70036d7002fd20020c60011ba0000a900009d00009d00008d00008200007600007100006b00006b00006b00006b00006b00006b00006b00006b00006b00006b +00005f00005f00005900004e00004400003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00 +003e00003e00003e00003e00003e0000380000380000380000380000380000380000000000000000000038000038000038000038000038000038000038000038 +00003800003e00003e00003e00004400004900004900004900004400003e00003800003800003800003800003800003800003800003800003800003800003e00 +004e00005f0000710000880000980000980000a90011ba0027cc002fd2003edd003edd0044e20044e2004be7004be7004be7004be70053ed0053ed0053ed0053 +ed0053ed004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70053ed0053ed005af3005af30062f90069ff +0069ff0069ff0071ff0069ff0069ff0062f9005af30053ed0053ed004be70044e2003edd0036d7002fd2002fd20027cc0027cc0027cc002fd2002fd2002fd200 +2fd2002fd2002fd2002fd2002fd2002fd20036d7003edd003edd003edd003edd003edd002fd20020c60009b500009d00009300008200008200007c0000760000 +7600007600007600007c00008200008200008800009300009d0001af0011ba0018c00020c60020c60020c60020c60018c00011ba0011ba0009b50009b50009b5 +0011ba0011ba0018c00020c60020c60020c60020c60020c60020c60020c60020c60020c60027cc0027cc0027cc002fd20036d7003edd004be70053ed005af300 +5af30062f90062f90053ed0044e20036d70020c60009b50009b50000a30000930000880000820000760000760000760000760000760000760000760000760000 +7600007100006b00006b00005f00004e000044000038000038000038000038000000000000000000000000000038000038000038000038000038000038000038 +00003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800000000000000000000380000380000380000380000380000380000 +3800003800003800003e00004400004400004400004900004900004400004400003e000038000038000038000038000038000000000038000038000038000038 +00003800004900005f0000710000880000980000980001af0011ba0027cc002fd2003edd003edd0044e20044e2004be7004be7004be70053ed0053ed0053ed00 +53ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be7004be7004be7004be7004be7004be70053ed0053ed0053ed0053ed005af30062f90062 +f90069ff0069ff0069ff0071ff0069ff0069ff0062f9005af30053ed0053ed0044e2003edd0036d7002fd20027cc0027cc0020c60020c60020c60020c60027cc +0027cc0027cc0027cc0020c60020c60020c60027cc0027cc002fd2002fd2002fd2002fd2002fd20020c60011ba0000a900009800008d00008200008200007c00 +007600007600007c00007c00008200008800008800009300009d0000a90009b50018c00020c60027cc0027cc0027cc0020c60020c60018c00018c00011ba0011 +ba0018c00018c00020c6002fd2002fd20036d7003edd003edd003edd0044e20044e20044e20044e20044e20044e20044e2004be70053ed005af30069ff0071ff +0080ff0080ff0080ff0788ff0078ff0071ff005af30044e2002fd2002fd20018c00001af0000a300009800009300008d00008d00008d00008d00008d00008d00 +008d00008800008200007600007600006b0000590000490000380000380000380000380000000000000000000000000000000000380000380000380000380000 +3800003800003800003800003e000038000038000038000038000038000038000038000038000038000000000000000000003800003800003800003800003800 +003800003800003800003800003e00004400004400004400004400004400004400003e0000380000380000380000380000380000000000000000000000000000 +000000380000380000490000590000710000880000980000980001af0011ba0027cc002fd2003edd003edd0044e20044e2004be7004be70053ed0053ed0053ed +005af3005af3005af3005af30053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed005af3005af300 +62f90069ff0069ff0069ff0069ff0069ff0069ff0062f9005af30053ed004be7004be70044e20036d7002fd20027cc0020c60020c60018c00018c00018c00018 +c00018c00018c00018c00018c00018c00018c00018c00018c00020c60020c60020c60020c60020c60020c60011ba0001af0000a300009300008800007c00007c +00007c00007600007c00007c00008200008800008d00008d0000980000a30001af0011ba0020c60020c60027cc0027cc0027cc0027cc0027cc0020c60020c600 +20c60020c60020c60027cc0036d7003edd0044e20053ed005af3005af3005af30062f90062f90062f90062f90062f90062f90062f90069ff0069ff0078ff0788 +ff2797ff369eff369eff42a4ff52abff369eff2797ff0080ff0069ff0053ed0053ed003edd0027cc0011ba0009b50000a90000a30000a30000a30000a30000a3 +00009d00009d00009800009300008800008800007600006500004e00003e00003800003800003800000000000000000000000000000000000000003800003800 +00380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000000038000038000038 +00003800003800003800003800003e00003e00004400004400004400004400004400003e00003800003800003800003800003800000000000000000000000000 +000000000000003800003800004900005f00007600008d00009d00009d0009b50018c0002fd20036d7003edd0044e20044e20044e2004be7004be70053ed0053 +ed005af3005af3005af3005af3005af30053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed +005af3005af30062f90069ff0069ff0069ff0069ff0062f9005af30053ed004be70044e20044e2003edd0036d70027cc0020c60018c00018c00011ba0011ba00 +11ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0011ba0001af0000a900009800008d0000880000 +7c00007c00007c00007c00008200008200008800008d00009800009800009d0000a90009b50011ba0020c60027cc002fd2002fd20027cc0027cc0027cc0020c6 +0020c60027cc0027cc002fd20036d70044e20053ed005af30069ff0071ff0071ff0078ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff0078ff0080ff07 +88ff2797ff42a4ff62b3ff62b3ff71bbff81c2ff71bbff62b3ff369eff178fff0078ff0078ff005af3004be70036d70027cc0018c00018c00011ba0011ba0011 +ba0011ba0009b50009b50001af0000a3000093000093000088000071000059000044000038000038000038000000000000000000000000000000000000000000 +00000000003800003800003800003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000380000 +3800003800003800003800003800003e00003e00004400004400004400004400004400004400003e000038000038000038000038000038000000000000000000 +00000000000000000000003800003800004e00006500007c0000930000a30000a30011ba0020c6002fd20036d7003edd0044e20044e20044e2004be7004be700 +53ed005af3005af3005af3005af3005af3005af30053ed0053ed0053ed004be70053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053ed0053 +ed0053ed005af3005af3005af30062f90062f90062f90062f9005af30053ed004be70044e2003edd003edd0036d7002fd20027cc0020c60018c00011ba0009b5 +0009b50009b50009b50009b50009b50009b50009b50009b50009b50001af0001af0001af0001af0001af0001af0001af0000a90000a300009d00009300008d00 +008200007c00007c00008200008200008200008800008d00009300009d00009d0000a30001af0009b50018c00020c60027cc002fd2002fd2002fd20027cc0027 +cc0027cc0027cc002fd2002fd20036d70044e20053ed0062f90071ff0080ff0788ff0788ff178fff2797ff2797ff178fff178fff0788ff0788ff0788ff0788ff +178fff2797ff42a4ff62b3ff91caff91caffa0d1ffc0e0ffb0d9ffa0d1ff81c2ff52abff2797ff2797ff0080ff0069ff005af3004be7003edd0036d7002fd200 +2fd2002fd20027cc0027cc0027cc0018c00011ba0000a30000a300009300007c00005f0000490000380000380000380000000000000000000000000000000000 +00000000000000000038000038000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000 +000000003800003800003800003800003800003e00003e00004400004400004400004400003e00003e0000380000380000380000380000380000380000000000 +0000000000003800003800003800003800004900005f00007600008d0000a30009b50009b50020c6002fd2003edd0044e20044e2004be7004be7004be7004be7 +004be70053ed0053ed0053ed0053ed0053ed0053ed004be7004be70044e20044e20044e2004be7004be7004be7004be70053ed0053ed0053ed0053ed004be700 +4be7004be7004be7004be70053ed0053ed0053ed004be7004be7004be70044e20044e2003edd0036d7002fd2002fd20027cc0027cc0020c60018c00011ba0009 +b50001af0001af0001af0001af0001af0001af0001af0001af0001af0001af0000a90000a90000a30000a30000a30000a30000a300009d00009800009800008d +00008800008800008200008200008200008800008800008d00009300009800009d00009d0000a30001af0009b50011ba0020c60020c60027cc0027cc0027cc00 +20c60020c60020c60027cc002fd2002fd2003edd004be7005af30071ff0080ff178fff2797ff2797ff369eff369eff369eff2797ff178fff0788ff0080ff0080 +ff0080ff0080ff0788ff2797ff52abff71bbff71bbff91caffb0d9ffc0e0ffc0e0ffa0d1ff81c2ff52abff52abff369eff0788ff0071ff0062f9005af30053ed +004be7004be70044e20044e20044e2003edd002fd20027cc0009b50009b50000a300008800007100005400003800003800003800000000000000000000000000 +00000000000000000000000000000000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000 +00000000000000003800003800003800003800003800003e00004400004400004400004400004400003e00003800003800003800003800003800003800003800 +000000003800003800003800003800003800004400005900007100008800009d0009b50020c60020c60036d7003edd004be7004be7004be7004be7004be7004b +e7004be7004be7004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd003edd0044e20044e20044e2004be7004be7004be70053ed004be7 +004be7004be7004be70044e20044e20044e20044e2003edd003edd003edd0036d70036d7002fd20027cc0027cc0027cc0027cc0020c60020c60018c00011ba00 +11ba0009b50001af0001af0000a90000a90000a90000a90000a90000a90000a30000a30000a300009d00009d0000980000980000980000980000930000930000 +8d00008d00008800008800008800008800008800008d00008d00009300009800009d0000a30000a30000a90001af0009b50011ba0018c00018c00020c60020c6 +0018c00018c00018c00020c60027cc002fd2002fd20044e20053ed0069ff0080ff178fff369eff42a4ff42a4ff52abff52abff52abff369eff2797ff0788ff00 +78ff0078ff0078ff0071ff0078ff0788ff369eff62b3ff62b3ff81c2ffb0d9ffc0e0ffcfe8ffc0e0ffb0d9ff91caff91caff62b3ff42a4ff178fff0080ff0071 +ff0069ff0062f90062f90062f90062f9005af3005af3004be7003edd0027cc0027cc0009b500009800007c00005f00003e000038000038000000000000000000 +00000000000000000000000000000000000000003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000 +0000000000000000000000003800003800003800003800003e00004400004400004400004400004400003e00003e000038000038000038000038000038000038 +00003800003800003800003800003800004400004400005400006b0000820000980001af0018c0002fd2002fd20044e2004be70053ed0053ed0053ed0053ed00 +4be7004be7004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd2002fd2002fd2002fd20036d70036d7003edd0044e2004be7004be70053 +ed004be7004be7004be7004be70044e20044e2003edd0036d70036d7002fd2002fd20027cc0020c60020c60018c00018c00018c00018c00018c00018c00011ba +0011ba0009b50001af0000a90000a90000a30000a30000a30000a30000a300009d00009d00009d00009d00009800009300009300009300009300009300009300 +008d00008d00008d00008d00008d00008d00008d00008d00009300009800009800009d0000a30000a90000a90000a90001af0009b50011ba0018c00018c00018 +c00018c00018c00018c00018c00018c00027cc002fd2002fd20044e2005af30071ff0788ff2797ff42a4ff52abff52abff62b3ff62b3ff52abff42a4ff2797ff +0788ff0078ff0078ff0071ff0069ff0069ff0071ff0788ff369eff369eff62b3ff91caffa0d1ffc0e0ffb0d9ffa0d1ff81c2ff81c2ff62b3ff369eff178fff00 +80ff0078ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff005af30053ed0036d70036d70020c60000a900008800006b0000490000380000380000000000 +00000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000000000000000000000000000000000000 +000000000000000000000000000000003800003800003800003800003e00004400004400004400004400004400003e00003e0000380000380000380000380000 +3800003800003800003800003800003800003800004400004400005400006b0000820000980001af0018c0002fd2002fd20044e2004be70053ed0053ed0053ed +0053ed004be7004be7004be7004be7004be70044e20044e2003edd003edd003edd0036d7002fd2002fd2002fd2002fd20036d70036d7003edd0044e2004be700 +4be70053ed004be7004be7004be7004be70044e20044e2003edd0036d70036d7002fd2002fd20027cc0020c60020c60018c00018c00018c00018c00018c00018 +c00011ba0011ba0009b50001af0000a90000a90000a30000a30000a30000a30000a300009d00009d00009d00009d000098000093000093000093000093000093 +00009300008d00008d00008d00008d00008d00008d00008d00008d00009300009800009800009d0000a30000a90000a90000a90001af0009b50011ba0018c000 +18c00018c00018c00018c00018c00018c00018c00027cc002fd2002fd20044e2005af30071ff0788ff2797ff42a4ff52abff52abff62b3ff62b3ff52abff42a4 +ff2797ff0788ff0078ff0078ff0071ff0069ff0069ff0071ff0788ff369eff369eff62b3ff91caffa0d1ffc0e0ffb0d9ffa0d1ff81c2ff81c2ff62b3ff369eff +178fff0080ff0078ff0071ff0069ff0069ff0069ff0069ff0069ff0069ff005af30053ed0036d70036d70020c60000a900008800006b00004900003800003800 +00000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000000000000000000000000000 +00000000000000000000000000000000000000003800003800003800003800003e00004400004400004400003e00003e00003e00003800003800003800003800 +003800003800003800003800003800003800003800004400005400005400006500007c0000930000a90018c0002fd2003edd003edd0053ed0053ed005af3005a +f30053ed0053ed004be7004be7004be70044e20044e2003edd003edd0036d70036d7002fd20027cc0020c60020c60020c60027cc002fd2002fd20036d7003edd +004be7004be70053ed004be7004be7004be7004be70044e2003edd0036d7002fd20027cc0020c60020c60018c00011ba0009b50009b50009b50009b50009b500 +09b50009b50009b50009b50001af0000a90000a30000a300009d00009800009800009800009800009800009300009300009300009300008d00008d00008d0000 +8d00008d00008d00008d00008d00008d00008d00009300009300009300009800009800009d00009d0000a30000a30000a90000a90001af0009b50011ba0011ba +0018c00018c00011ba0011ba0011ba0011ba0011ba0018c00020c6002fd2002fd20044e2005af30078ff178fff369eff52abff62b3ff62b3ff71bbff71bbff62 +b3ff52abff369eff0788ff0078ff0078ff0069ff005af3005af30062f90071ff0788ff0788ff369eff62b3ff81c2ffa0d1ffa0d1ffa0d1ff81c2ff81c2ff62b3 +ff369eff178fff0788ff0078ff0078ff0078ff0078ff0078ff0078ff0078ff0078ff0071ff0069ff004be7004be70036d70009b500009800007600005400003e +00003e00003800000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800000000000000000000 +0000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400004400003e00003e000038000038000038000038 +00003800003800003800003800003800003800003800004400005400006500006500007600008d0000a30011ba002fd20044e20053ed0053ed005af30062f900 +62f9005af3005af30053ed004be7004be70044e20044e2003edd0036d7002fd20027cc0027cc0020c60018c00011ba0011ba0011ba0018c00027cc0027cc002f +d2003edd0044e2004be70053ed0053ed004be7004be7004be70044e20036d7002fd20027cc0018c00011ba0011ba0009b50001af0000a90000a90000a90000a9 +0000a90001af0001af0001af0001af0000a90000a300009d00009d00009800009300009300008d00008d00008d00008d00008d00008d00008800008800008800 +008800008800008800008d00008d00009300009300009800009800009d00009d00009d0000a30000a30000a30000a90000a90001af0001af0009b50009b50011 +ba0011ba0018c00018c00011ba0011ba0011ba0009b50011ba0011ba0020c6002fd2002fd20044e20062f90078ff178fff369eff62b3ff71bbff71bbff81c2ff +71bbff71bbff52abff42a4ff178fff0078ff0078ff0069ff0053ed004be7004be7005af30069ff0069ff0080ff2797ff52abff71bbff71bbff71bbff52abff52 +abff369eff178fff0080ff0078ff0071ff0071ff0071ff0071ff0078ff0080ff0080ff0788ff0080ff0078ff0062f90062f90044e20020c60000a90000880000 +5f000044000044000038000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000000000000 +000000000000000000000000000000000000000000000000000000003800003800003800003e00003e00004400004400004400003e00003e0000380000380000 +3800003800003800003800003800003800003800003800004400004e00005f00007600007600008d0000a30011ba0027cc003edd0053ed0062f90062f90069ff +0069ff0069ff0062f9005af30053ed004be7004be70044e2003edd0036d7002fd20027cc0018c00018c00011ba0001af0001af0000a90001af0009b50018c000 +18c00027cc0036d70044e2004be70053ed0053ed0053ed0053ed004be70044e20036d70027cc0020c60011ba0001af0001af0000a90000a300009d00009d0000 +9d0000a30000a30000a30000a90000a90000a90000a300009d000098000098000093000088000088000088000082000082000082000082000082000082000082 +00008200008200008800008800008d00009300009800009800009d0000a30000a30000a30000a90000a90000a90001af0001af0001af0009b50009b50009b500 +11ba0018c00018c00018c00018c00011ba0011ba0011ba0009b50009b50011ba0020c6002fd2002fd2004be70062f90078ff178fff42a4ff62b3ff71bbff71bb +ff81c2ff81c2ff81c2ff62b3ff52abff178fff0078ff0078ff0062f9004be70044e20036d70044e2004be7004be70062f90080ff178fff42a4ff42a4ff42a4ff +369eff369eff178fff0080ff0071ff0069ff0062f90069ff0071ff0071ff0078ff0080ff0788ff178fff178fff0788ff0071ff0071ff005af30036d70011ba00 +009300007100004e00004e0000380000380000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000 +38000000000000000000000000000000000000000000000000000000000000003800003800003800003800003e00004400004400003e00003800003800003800 +003800003800003800003800003800003800003800003800003e00004900005400006500007c00007c0000930000a90018c0002fd20044e20053ed0062f90062 +f90069ff0062f90062f9005af30053ed004be70044e20044e20044e2003edd0036d70036d70027cc0020c60020c60011ba0009b50001af0001af0001af0009b5 +0018c00018c00027cc002fd2003edd0044e2004be70044e20044e20044e2003edd0036d7002fd20020c60011ba0009b50000a90000a90000a300009d00009800 +009800009800009800009800009d00009d0000a300009d00009d00009800009300009300008d00008200008200007c00007c00007c00007c00007c00007c0000 +8200008200008800008d00009300009300009800009d0000a30000a90001af0009b50009b50009b50009b50011ba0011ba0011ba0011ba0018c00018c00018c0 +0020c60027cc0027cc0027cc002fd20027cc0020c60020c60020c60018c00018c00020c60027cc0036d70036d7004be70062f90078ff178fff42a4ff62b3ff71 +bbff71bbff91caff91caffa0d1ff81c2ff71bbff42a4ff178fff178fff0071ff005af30044e20036d70036d7003edd003edd004be70062f90071ff0080ff0080 +ff0080ff0071ff0071ff0069ff005af30053ed004be7004be7005af30062f90062f90071ff0080ff178fff2797ff2797ff2797ff0080ff0080ff0069ff0044e2 +0020c600009d00007c00005900005900003800003800000000000000000000000000000000000000000000003800003800003800003800003800003800003800 +0038000038000038000000000000000000000000000000000000000000000000000000003800003800003800003800003e00004400003e00003e000038000038 +00003800003800003800003800003800003800003800003800003800003e00004e0000590000710000820000820000980001af0020c60036d70044e2005af300 +5af3005af30062f90062f9005af30053ed004be70044e20044e20044e2003edd003edd003edd0036d7002fd20020c60020c60018c00009b50001af0001af0001 +af0009b50018c00018c00020c6002fd20036d7003edd003edd003edd003edd003edd0036d70027cc0020c60018c00009b50001af0000a90000a900009d00009d +00009800009300009300009300009300009800009800009800009800009800009300008d00008d00008800008200007c00007600007600007600007600007600 +007c00007c0000820000880000930000980000980000a30000a90009b50011ba0018c00018c00020c60020c60020c60020c60020c60020c60027cc0027cc002f +d2002fd20036d70036d7003edd003edd003edd0036d70036d70036d7002fd20027cc0027cc0027cc0036d70044e20044e20053ed0069ff0080ff178fff42a4ff +62b3ff81c2ff81c2ffa0d1ffa0d1ffb0d9ffb0d9ffa0d1ff71bbff42a4ff42a4ff0788ff0062f9004be70036d7002fd20027cc0027cc0036d70044e2004be700 +5af3005af30053ed004be7004be70044e20036d7002fd20036d70036d70044e2005af3005af30071ff0080ff178fff42a4ff42a4ff42a4ff178fff178fff0078 +ff0053ed002fd20000a9000082000065000065000044000038000000000000000000000000000000000000000038000038000038000038000038000038000038 +000038000038000038000038000038000000000000000000000000000000000000000000000000003800003800003800003800003800003e00003e00003e0000 +3800003800003800003800003800003800003800003800003800003800003800004400004e00005f00007600008800008800009d0009b50020c60036d70044e2 +0053ed005af3005af3005af3005af30053ed004be70044e20044e20044e20044e20044e20044e2003edd003edd0036d7002fd2002fd20020c60018c00009b500 +01af0009b50009b50011ba0011ba0018c00020c60027cc002fd2002fd2002fd20027cc0027cc0020c60018c00011ba0009b50000a90000a300009d00009d0000 +9800009800009300009300008d00008d00008d00008d00009300009300009300008d00008d00008800008800008200007c000076000076000076000076000076 +00007600007c0000820000880000930000980000a30000a30001af0011ba0018c00027cc002fd2002fd20036d70036d70036d70036d70036d70036d7003edd00 +3edd0044e20044e2004be7004be70053ed0053ed0053ed004be70044e20044e2003edd0036d70036d70036d70044e2004be7004be7005af30069ff0080ff178f +ff42a4ff62b3ff81c2ff81c2ffa0d1ffb0d9ffcfe8ffc0e0ffc0e0ff91caff62b3ff62b3ff178fff0069ff004be7002fd20027cc0018c00018c00020c60027cc +002fd2003edd0036d70036d7002fd2002fd20027cc0020c60018c00027cc002fd20044e2005af3005af30071ff0788ff369eff52abff52abff52abff2797ff27 +97ff0788ff005af30036d70001af00008800006b00006b0000490000380000380000000000000000000000000000000000380000380000380000380000380000 +38000038000038000038000038000038000038000038000000000000000000000000000000000000000000003800003800003800003800003800003e00003800 +003800003800003800003800003800003800003800003800003800003800003800003e00004400005400006500007c00008d00008d0000a30011ba0027cc003e +dd0044e20053ed0053ed0053ed0053ed0053ed004be70044e20044e20044e2003edd003edd0044e20044e20044e20044e2003edd0036d70036d7002fd20020c6 +0018c00009b50009b50009b50011ba0011ba0011ba0018c00020c60020c60020c60018c00018c00018c00011ba0009b50000a90000a30000a300009d00009800 +009800009300009300008d00008d00008800008800008800008800008800008800008800008800008800008200008200007c0000760000760000710000710000 +7100007600007600007c00008200008d0000980000a30001af0001af0011ba0020c6002fd20036d7003edd0044e20044e20044e20044e20044e20044e2004be7 +004be70053ed005af3005af30062f90062f90069ff0062f90062f9005af30053ed0053ed004be70044e20044e20044e2004be70053ed0053ed0062f90071ff00 +80ff178fff42a4ff62b3ff81c2ff81c2ffb0d9ffc0e0ffdfefffdfefffdfefffb0d9ff81c2ff81c2ff369eff0071ff0053ed002fd20018c00009b50009b50009 +b50011ba0018c00020c60018c00018c00011ba0011ba0009b50009b50009b50011ba0020c6003edd0053ed0053ed0071ff178fff42a4ff62b3ff62b3ff71bbff +42a4ff42a4ff178fff0062f9003edd0009b500009300007100007100004e00003800003800003800000000000000003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000380000380000000000000000000000000000000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003e00004900005900006b00007c0000930000930000a90011ba00 +27cc0036d70044e2004be7004be7004be7004be7004be70044e20044e2003edd003edd0044e20044e20044e2004be70053ed0053ed0053ed004be7004be7003e +dd0036d70027cc0018c00018c00011ba0011ba0011ba0009b50009b50009b50009b50001af0000a90000a90000a90000a300009d000098000093000093000093 +00008d00008d00008d00008d00008800008800008200008200008200007c00008200008200008200008200008200007c00007c00007c00007600007600007600 +007600007600007c00007c00008200008d0000980000a30009b50018c00018c00027cc0036d70044e2004be70053ed0053ed005af3005af3005af3005af3005a +f3005af30062f90069ff0071ff0071ff0078ff0078ff0078ff0078ff0071ff0069ff0062f90062f9005af3005af30053ed0053ed005af30062f90062f90069ff +0071ff0080ff178fff42a4ff62b3ff91caff91caffb0d9ffcfe8ffeff7ffeff7ffeff7ffc0e0ff81c2ff81c2ff369eff0071ff004be70027cc0011ba0001af00 +01af0000a90000a90001af0009b50009b50009b50001af0001af0001af0001af0001af0018c00027cc0044e20062f90062f90080ff369eff62b3ff81c2ff81c2 +ff71bbff42a4ff42a4ff178fff0062f9003edd0009b500009300007100007100004e00003e000038000038000038000038000038000038000038000038000038 +00003e00003e00003e00003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004900005900006b0000820000980000980000a9 +0018c00027cc0036d7003edd0044e20044e20044e20044e2003edd003edd003edd003edd003edd0044e20044e2004be70053ed005af30062f90062f9005af300 +5af30053ed0044e20036d70027cc0020c60011ba0009b50009b50001af0000a90000a300009d00009d00009800009300009300008d0000880000880000820000 +8200008200008800008800008800008800008200008200007c00007600007600007600007600007600007c00007c00007c00007c00007c00007c000076000076 +00007600007600007c0000820000820000880000980000a30009b50018c0002fd2002fd2003edd004be7005af30062f90069ff0069ff0069ff0069ff0069ff00 +69ff0071ff0071ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff0788ff0080ff0078ff0078ff0071ff0069ff0069ff0062f90069ff0069ff0069 +ff0071ff0078ff0080ff178fff369eff62b3ff91caff91caffc0e0ffdfefffffffffffffffffffffc0e0ff91caff91caff369eff0071ff004be70020c60009b5 +0000a30000a300009d00009d00009d0000a30000a30000a30000a30000a30000a30000a90001af0018c0002fd2004be70071ff0071ff178fff52abff71bbffa0 +d1ff91caff81c2ff52abff52abff178fff0062f9003edd0009b50000930000710000710000540000440000380000380000380000380000380000380000380000 +3800003800003e00003e00003e00003e00003e000038000038000038000038000038000038000038000000000000000000000000000000000000000000003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00004900005900006b0000820000980000 +980000a90018c00027cc0036d7003edd0044e20044e20044e20044e2003edd003edd003edd003edd003edd0044e20044e2004be70053ed005af30062f90062f9 +005af3005af30053ed0044e20036d70027cc0020c60011ba0009b50009b50001af0000a90000a300009d00009d00009800009300009300008d00008800008800 +008200008200008200008800008800008800008800008200008200007c00007600007600007600007600007600007c00007c00007c00007c00007c00007c0000 +7600007600007600007600007c0000820000820000880000980000a30009b50018c0002fd2002fd2003edd004be7005af30062f90069ff0069ff0069ff0069ff +0069ff0069ff0071ff0071ff0078ff0080ff0788ff0788ff178fff178fff178fff178fff0788ff0080ff0078ff0078ff0071ff0069ff0069ff0062f90069ff00 +69ff0069ff0071ff0078ff0080ff178fff369eff62b3ff91caff91caffc0e0ffdfefffffffffffffffffffffc0e0ff91caff91caff369eff0071ff004be70020 +c60009b50000a30000a300009d00009d00009d0000a30000a30000a30000a30000a30000a30000a90001af0018c0002fd2004be70071ff0071ff178fff52abff +71bbffa0d1ff91caff81c2ff52abff52abff178fff0062f9003edd0009b500009300007100007100005400004400003800003800003800003800003800003800 +003800003800003800003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000000000000000000000000000000000000000 +00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400004e00005f00007100008800 +00980000980001af0018c00027cc0036d70036d7003edd003edd003edd003edd003edd0036d7003edd003edd0044e2004be7004be70053ed0062f90062f90069 +ff0069ff0062f90062f9005af3004be7003edd002fd20020c60011ba0001af0001af0000a900009d00009800009300008d00008800008200008200007c00007c +00007600007600007600007c00007c00007c00007c00007c00007c00007600007100007100007100006b00007100007100007100007600007600007c00007c00 +007c00007600007c00007c00007c00008200008d00008d0000930000a30001af0018c0002fd2003edd003edd004be7005af30062f90062f90069ff0069ff0069 +ff0069ff0069ff0069ff0071ff0078ff0080ff0788ff178fff178fff2797ff2797ff2797ff178fff0788ff0080ff0078ff0078ff0071ff0069ff0069ff0069ff +0071ff0071ff0071ff0078ff0078ff0788ff178fff42a4ff62b3ff91caff91caffc0e0ffdfefffffffffffffffeff7ffb0d9ff71bbff71bbff178fff0062f900 +3edd0018c00001af00009d00009d00009d00009800009d0000a30000a90000a90000a90000a90001af0009b50011ba002fd20044e20062f90788ff0788ff369e +ff71bbff91caffb0d9ff91caff81c2ff42a4ff42a4ff0788ff005af3002fd20001af00008d000071000071000054000044000038000038000038000038000038 +00003800003800003800003e00003e00003e00003e00003800003800003800003800003800003800003800003800003800000000000000000000000000000000 +0000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e000049000054000065000076 +00008d00009d00009d0001af0018c00027cc0036d70036d70036d70036d70036d70036d70036d70036d70036d7003edd0044e20053ed0053ed005af30069ff00 +71ff0078ff0071ff0069ff0069ff0062f90053ed0044e2002fd20020c60009b50000a90000a900009d00009800008d00008800008200007c0000760000760000 +7100006b00006b00006b00006b00007100007100007100007600007600007100007100006b00006500006500006500006500006b00006b000071000076000076 +00007600007c00007c00007c00007c00008200008800009300009300009d0001af0018c0002fd20044e2004be7004be7005af30062f90069ff0069ff0069ff00 +69ff0069ff0069ff0069ff0071ff0078ff0078ff0788ff178fff2797ff2797ff2797ff2797ff2797ff178fff0788ff0080ff0078ff0078ff0071ff0071ff0071 +ff0071ff0078ff0078ff0078ff0078ff0080ff0788ff178fff42a4ff71bbffa0d1ffa0d1ffcfe8ffeff7ffc4e2ffeff7ffdfefffa0d1ff52abff52abff0080ff +0053ed002fd20009b50000a300009800009800009800009800009d0000a30000a90001af0009b50009b50011ba0018c00027cc003edd005af30078ff2797ff27 +97ff62b3ff91caffb0d9ffc0e0ffa0d1ff81c2ff42a4ff42a4ff0080ff0053ed0027cc0000a90000880000710000710000540000440000380000380000380000 +3800003800003800003800003e00003e00003e00003e00003e000038000038000038000038000038000038000038000038000038000000000000000000000000 +000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e0000490000540000 +6500007c00008d00009d00009d0001af0018c00027cc002fd20036d70036d70036d70036d7002fd2002fd2002fd20036d7003edd004be70053ed0053ed0062f9 +0071ff0071ff0078ff0071ff0071ff0071ff0062f90053ed003edd002fd20018c00009b50000a30000a300009800008d00008200007c00007600007100006b00 +006b00006500006500005f00005f00006500006500006b00006b00007100006b00006b00006500006500005f00005f00005f00005f00006500006b0000710000 +7600007600007600007c00007c00008200008200008800008d00009d00009d0000a90011ba002fd2003edd0053ed005af3005af30069ff0069ff0069ff0069ff +0069ff0069ff0069ff0069ff0069ff0069ff0071ff0078ff0788ff178fff2797ff2797ff2797ff2797ff178fff0788ff0080ff0078ff0071ff0071ff0071ff00 +71ff0071ff0078ff0078ff0078ff0078ff0080ff0080ff0788ff2797ff52abff71bbffa0d1ffa0d1ffdfefffeff7ffffffffeff7ffcfe8ff81c2ff369eff369e +ff0071ff0044e20020c60000a900009d0000930000930000980000980000a30000a90001af0011ba0018c00018c00020c6002fd2003edd0053ed0071ff178fff +52abff52abff81c2ffb0d9ffc0e0ffc0e0ffa0d1ff81c2ff369eff369eff0078ff004be70020c60000a300008200006b00006b00005400004900003e00003800 +003800003800003800003800003800003e00003e00003e00003e0000380000380000380000380000380000380000380000380000380000380000000000000000 +00000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800004400004400004e00 +005900006b00007c00008d0000a30000a30009b50018c00027cc002fd2002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d70044e2004be7005af3005a +f30069ff0078ff0078ff0080ff0078ff0071ff0071ff0062f90053ed003edd002fd20018c00001af00009d00009d00008d00008200007600007100006b000065 +00005f00005f00005f00005900005900005900005900005f00006500006500006500006500006500005f00005900005900005900005400005900005f00006500 +006b00007100007c00007c00007c00008200008200008800008d0000980000a90000a90009b50027cc003edd0053ed0062f90069ff0069ff0071ff0071ff0071 +ff0069ff0062f90062f90062f90062f90062f90069ff0071ff0078ff0788ff178fff2797ff2797ff2797ff178fff178fff0080ff0078ff0071ff0069ff0069ff +0071ff0071ff0078ff0078ff0080ff0080ff0080ff0080ff0788ff178fff2797ff52abff81c2ffb0d9ffb0d9ffdfefffeff7ffffffffdfefffb0d9ff62b3ff17 +8fff178fff005af3002fd20011ba00009d00009800008d00008d0000930000980000a30001af0009b50018c00027cc0027cc002fd20044e20053ed0069ff0788 +ff42a4ff71bbff71bbffa0d1ffcfe8ffcfe8ffcfe8ffa0d1ff71bbff2797ff2797ff0071ff0044e20018c000009d00007c00006b00006b00005400004900003e +00003e00003800003e00003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800003800003800003800000000000000000000 +0000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e00003e +00004900005900006b00007c00008d00009d00009d0001af0018c00027cc002fd2002fd20036d7002fd2002fd2002fd2002fd20036d7003edd0044e20053ed00 +62f90062f90069ff0078ff0078ff0078ff0071ff0062f90062f90053ed0044e20036d70020c60009b50000a900009800009800008d0000820000760000710000 +6b00006500006500006500005f00005900005900005900005f00006500006500006500006b00006500006500005f00005900005400005400005400005900005f +00006500007100007600008200008200008800008800008d00009300009d0000a30009b50009b50018c00036d7004be7005af30069ff0071ff0071ff0071ff00 +69ff0069ff0062f9005af30053ed0053ed0053ed0053ed005af30062f90071ff0078ff0788ff0788ff0788ff178fff0788ff0080ff0078ff0071ff0069ff0062 +f90062f90069ff0071ff0078ff0080ff0080ff0788ff0788ff0788ff178fff2797ff42a4ff62b3ff91caffc0e0ffc0e0ffeff7ffeff7ffffffffcfe8ffa0d1ff +42a4ff0078ff0078ff004be70020c60001af00009800009300008d00008d00009300009d0000a30001af0011ba0020c6002fd2002fd2003edd004be7005af300 +71ff178fff42a4ff81c2ff81c2ffa0d1ffc0e0ffc0e0ffc0e0ffa0d1ff71bbff2797ff2797ff0071ff003edd0011ba00009d00007c00006b00006b0000540000 +4900004400003e00003e00003e00003e00003e00003e00003e00003e00003e000038000038000038000038000038000038000038000038000000000000000000 +00000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000380000 +3e00003e00004900005400006500007600008d00009d00009d0001af0018c00027cc002fd2002fd20036d70036d70036d7002fd20036d70036d70044e2004be7 +005af30062f90062f90071ff0078ff0071ff0071ff0062f9005af3005af3004be70036d70027cc0018c00001af0000a300009300009300008800007c00007600 +007100006b00006b00006500006500005f00005f00005f00005f00006500006500006b00006b00006b0000650000650000590000540000540000540000540000 +5900005f00006b00007600007c00008800008800008d00009300009800009d0000a90001af0018c00018c0002fd20044e2005af30069ff0078ff0071ff0071ff +0071ff0069ff005af30053ed004be70044e20044e20044e20044e2004be7005af30062f90071ff0078ff0080ff0080ff0080ff0078ff0078ff0069ff0062f900 +62f9005af3005af30062f90069ff0071ff0080ff0788ff178fff178fff2797ff2797ff42a4ff52abff81c2ffa0d1ffcfe8ffcfe8ffeff7ffffffffffffffc0e0 +ff91caff2797ff0069ff0069ff003edd0011ba0000a300009300008d00008d00008d00009300009d0000a90009b50018c00027cc0036d70036d70044e20053ed +0069ff0080ff2797ff52abff81c2ff81c2ffa0d1ffc0e0ffc0e0ffc0e0ff91caff62b3ff178fff178fff0069ff003edd0011ba00009800007c00006500006500 +005400004900004400003e00003e00003e00003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000380000000000000000 +00000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800004400004e00005f0000710000880000980000980000a90018c00027cc0036d70036d70036d70036d70036d70036d7003edd003edd004b +e70053ed005af30069ff0069ff0071ff0071ff0071ff0069ff0062f90053ed0053ed0044e20036d70027cc0018c00009b50000a300009800009800008d000082 +00007c00007600007100006b00006500006500006500005f00005f00005f00006500006b00006b00006b00007100006b00006500005f00005900005400005400 +005400005900006500007100007c0000880000930000930000980000a30000a90001af0009b50018c00027cc0027cc003edd004be70062f90069ff0078ff0071 +ff0071ff0069ff0062f90053ed004be7003edd003edd0036d70036d7003edd0044e2004be7005af30062f90071ff0071ff0071ff0071ff0069ff0069ff005af3 +0053ed0053ed0053ed0053ed005af30062f90071ff0080ff0788ff178fff178fff2797ff369eff42a4ff52abff81c2ffa0d1ffc0e0ffc0e0ffeff7ffeff7ffdf +efffb0d9ff71bbff178fff005af3005af30036d70009b50000a300009300008d00008d00008d00009300009d0000a90009b50018c00027cc0036d70036d70044 +e20053ed0062f90078ff178fff42a4ff71bbff71bbff91caffb0d9ffb0d9ffb0d9ff91caff62b3ff178fff178fff0069ff003edd0011ba00009800007c000065 +00006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800004400004e00005900006b0000820000980000980000a90011ba0027cc0036d70036d7003edd003edd003edd003edd0044e200 +44e20053ed005af30062f90069ff0069ff0071ff0071ff0071ff0069ff005af30053ed0053ed0044e20036d70027cc0018c00009b50000a900009d00009d0000 +9300008800007c00007600007100006b00006500006500006500005f00006500006500006b00007100007100007100007100006b00006500005f000059000059 +00005900005400005f00006500007600008200009300009d00009d0000a90001af0009b50018c00020c60027cc0036d70036d70044e2005af30069ff0071ff00 +78ff0071ff0071ff0069ff005af3004be7003edd0036d7002fd2002fd2002fd20036d7003edd0044e20053ed005af30062f90062f90062f90069ff0062f9005a +f30053ed004be7004be7004be7004be70053ed0062f90071ff0078ff0788ff178fff178fff2797ff369eff42a4ff52abff81c2ffa0d1ffc0e0ffc0e0ffdfefff +cfe8ffcfe8ff91caff52abff0080ff0053ed0053ed0027cc0001af00009d00008d00008d00008d00008d00009300009d0000a90009b50018c00020c6002fd200 +2fd2003edd0053ed0062f90078ff0788ff369eff62b3ff62b3ff81c2ffa0d1ffa0d1ffa0d1ff81c2ff62b3ff178fff178fff0069ff003edd0011ba0000980000 +7c00006500006500005400004900004400003e00003e00003e00003e00003e00003e00003e00003e000038000038000038000038000038000038000038000000 +00000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003e00004400005400006500007c0000930000930000a90011ba0027cc0036d7003edd0044e2004be7004be7004be7 +004be70053ed005af30062f90069ff0071ff0071ff0071ff0071ff0069ff0069ff005af30053ed0053ed004be7003edd0036d70027cc0018c00009b50000a900 +00a900009d00009300008800007c00007600007100006b00006b00006500006500006500006500006b00007100007600007600007600007100006b0000650000 +5f00005f00005f00005900006500007100007c00008d00009d0000a90000a90009b50018c00027cc002fd20036d7003edd004be7004be70053ed0062f90069ff +0069ff0071ff0069ff0069ff0062f90053ed0044e20036d7002fd2002fd20027cc0027cc002fd20036d7003edd004be70053ed005af3005af3005af30053ed00 +4be70044e2003edd003edd003edd0044e20044e2004be7005af30069ff0078ff0080ff178fff178fff2797ff2797ff42a4ff52abff71bbff91caffa0d1ffa0d1 +ffc0e0ffb0d9ffb0d9ff71bbff369eff0071ff004be7004be70027cc0001af00009d00008d00008d00008d00008d00009800009d0000a30001af0011ba0018c0 +0027cc0027cc0036d70044e20053ed0069ff0080ff178fff42a4ff42a4ff62b3ff81c2ff91caff91caff71bbff52abff178fff178fff0069ff003edd0011ba00 +009d00007c00006500006500005400004900003e00003e00003e00003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000 +38000038000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003e00004400005400006500007c0000930000930000a90011ba0027cc0036d7003edd0044e2004be7004b +e7004be7004be70053ed005af30062f90069ff0071ff0071ff0071ff0071ff0069ff0069ff005af30053ed0053ed004be7003edd0036d70027cc0018c00009b5 +0000a90000a900009d00009300008800007c00007600007100006b00006b00006500006500006500006500006b00007100007600007600007600007100006b00 +006500005f00005f00005f00005900006500007100007c00008d00009d0000a90000a90009b50018c00027cc002fd20036d7003edd004be7004be70053ed0062 +f90069ff0069ff0071ff0069ff0069ff0062f90053ed0044e20036d7002fd2002fd20027cc0027cc002fd20036d7003edd004be70053ed005af3005af3005af3 +0053ed004be70044e2003edd003edd003edd0044e20044e2004be7005af30069ff0078ff0080ff178fff178fff2797ff2797ff42a4ff52abff71bbff91caffa0 +d1ffa0d1ffc0e0ffb0d9ffb0d9ff71bbff369eff0071ff004be7004be70027cc0001af00009d00008d00008d00008d00008d00009800009d0000a30001af0011 +ba0018c00027cc0027cc0036d70044e20053ed0069ff0080ff178fff42a4ff42a4ff62b3ff81c2ff91caff91caff71bbff52abff178fff178fff0069ff003edd +0011ba00009d00007c00006500006500005400004900003e00003e00003e00003e00003e00003e00003e00003e00003800003800003800003800003800003800 +00380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003e00004e00005f00007600008d00008d0000a30011ba0027cc003edd0044e2004be700 +53ed0053ed0053ed005af3005af30062f90069ff0069ff0071ff0071ff0071ff0071ff0069ff0062f9005af30053ed0053ed004be70044e2003edd0036d70027 +cc0018c00009b50009b50000a900009800008d00008200007c00007100006b00006b00006500006500006500006b00007100007600007c00007c00007c000076 +00007100006b00006500006500006500005f00006b0000760000880000980000a90011ba0011ba0020c60036d7003edd004be7004be70053ed005af3005af300 +62f90069ff0069ff0069ff0069ff0062f90062f90053ed004be7003edd002fd20027cc0027cc0027cc0027cc0027cc002fd20036d70044e20044e2004be7004b +e7004be70044e2003edd0036d7002fd2002fd20036d70036d70036d70044e20053ed0062f90071ff0080ff0788ff0788ff178fff2797ff369eff42a4ff62b3ff +71bbff91caff91caffa0d1ff91caff91caff52abff178fff0069ff003edd003edd0020c60000a900009d00009300009300009300009300009800009d0000a300 +00a90001af0011ba0020c60020c60027cc003edd004be7005af30071ff0788ff2797ff2797ff52abff71bbff81c2ff81c2ff71bbff52abff178fff178fff0069 +ff003edd0018c000009d00007c00006500006500004e00004900003e00003e00003e00003e00003e00003e00003e00003e000038000038000038000038000038 +00003800003800003800003800003800000000003800003800000000000000000000000000000000000000000000000000000000000000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003800003800004900005900007100008d00008d0000a30011ba0027cc003edd004be7 +0053ed005af3005af30062f90062f90069ff0069ff0071ff0071ff0071ff0071ff0071ff0069ff0069ff0069ff0069ff0062f90062f90062f90062f9005af300 +53ed0044e20036d70020c60020c60011ba0000a900009800008d00007c00007600006b00006b00006500005f00006500006b0000710000760000760000760000 +7c00007600007100006b00006500006500006500006500007100007c00008d00009d0009b50020c60020c6002fd20044e20053ed005af30062f90069ff0069ff +0069ff0069ff0069ff0069ff0069ff0069ff005af3005af30053ed0044e2003edd0036d70027cc0027cc0027cc0027cc0027cc0027cc002fd20036d70036d700 +3edd0036d70036d7002fd20027cc0020c60018c00018c00020c60027cc0027cc002fd2003edd004be7005af30062f90071ff0071ff0071ff0078ff0080ff0080 +ff178fff2797ff42a4ff42a4ff52abff52abff42a4ff178fff0078ff005af30036d70036d70020c60001af0000a300009d00009d00009d00009d00009d0000a3 +0000a90001af0009b50011ba0020c60020c6002fd2003edd004be70062f90071ff0788ff369eff369eff52abff71bbff71bbff81c2ff62b3ff42a4ff0788ff07 +88ff0062f90036d70009b500009800007600005f00005f0000490000440000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800000000000000000000000000003800003800003800003800004400005900007100008800008800009d0011ba0027cc003e +dd004be7005af30062f90062f90069ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0071ff0069ff0069ff0069ff0071ff0071ff0071ff0078ff0078ff +0078ff0071ff0062f90053ed003edd003edd0027cc0011ba0000a300009300008200007600006b00006b00006500005f00006500006500006b00007100007600 +007600007600007600007100006b00006500006b00006b00006b0000760000820000980000a90011ba002fd2002fd20044e2005af30062f90071ff0071ff0078 +ff0071ff0071ff0071ff0071ff0071ff0069ff0062f9005af3005af30053ed0044e2003edd0036d70027cc0027cc0020c60020c60027cc0027cc0027cc002fd2 +0027cc0027cc0020c60020c60018c00011ba0001af0001af0001af0009b50011ba0011ba0018c00027cc0036d70044e2004be70053ed0053ed005af3005af300 +5af30062f90069ff0071ff0078ff0078ff0788ff0788ff0080ff0071ff0062f90044e2002fd2002fd20018c00009b50000a90000a30000a30000a90000a90000 +a90000a90001af0001af0009b50011ba0020c60020c6002fd2003edd004be70062f90078ff0788ff369eff369eff52abff71bbff71bbff71bbff52abff369eff +0080ff0080ff0062f90036d70001af00009300007100005900005900004400003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000003800003800003800000000000000000000000000000000000000000000003800003800004400005400006b00008800008800009d0009b500 +27cc003edd0053ed0062f90069ff0069ff0071ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff0071ff0069ff0069ff0071ff0078ff0080ff0080ff0788 +ff178fff0788ff0788ff0078ff0069ff004be7004be70036d70018c00001af00009800008800007600006b00006b00006500005f00006500006500006b000071 +00007600007600007600007100007100006b00006b00006b00006b00007100007c0000880000980001af0018c00036d70036d7004be70062f90071ff0078ff00 +78ff0080ff0078ff0078ff0078ff0071ff0071ff0069ff0062f90053ed0053ed004be70044e20036d7002fd20027cc0020c60020c60020c60020c60020c60020 +c60020c60018c00018c00011ba0011ba0001af0000a90000a300009d00009d0000a30000a90000a90009b50011ba0020c6002fd20036d7003edd003edd003edd +003edd003edd0044e20044e2004be7005af3005af30062f90062f90062f90053ed004be70036d70027cc0027cc0018c00011ba0009b50009b50009b50009b500 +09b50009b50009b50011ba0011ba0018c00020c60027cc0027cc0036d70044e2005af30069ff0080ff178fff42a4ff42a4ff52abff71bbff71bbff71bbff52ab +ff369eff0078ff0078ff0053ed0027cc0000a900008800006b00005400005400003e000038000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003e00004e00006b00008200008200009d +0009b50027cc003edd0053ed0062f90071ff0071ff0078ff0080ff0080ff0080ff0080ff0078ff0071ff0071ff0071ff0069ff0071ff0071ff0080ff178fff17 +8fff2797ff42a4ff369eff369eff178fff0080ff0062f90062f90044e20027cc0009b500009d00008800007c00006b00006b00006500005f0000650000650000 +6b00007100007100007100007600007100007100006b00006b00006b00006b00007100007c00008d00009d0009b50020c6003edd003edd0053ed0069ff0078ff +0080ff0788ff0788ff0080ff0080ff0078ff0071ff0069ff0062f9005af30053ed0053ed004be7003edd0036d7002fd20027cc0020c60018c00018c00018c000 +11ba0011ba0011ba0009b50001af0000a90000a90000a30000980000930000930000930000930000980000980000a30000a90009b50011ba0018c00020c60020 +c60020c60020c60020c60020c60027cc002fd20036d70036d7003edd003edd003edd0036d70036d70027cc0020c60020c60018c00018c00018c00018c00018c0 +0018c00018c00018c00018c00018c00018c00020c60027cc002fd2002fd2003edd0053ed0062f90078ff0788ff2797ff52abff52abff62b3ff81c2ff71bbff71 +bbff42a4ff2797ff0071ff0071ff004be70020c60000a300008200006500004e00004e0000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000003800003800003e00004e00006500007c0000 +7c0000980001af0020c6003edd0053ed0062f90071ff0071ff0080ff0080ff0788ff0788ff0788ff0080ff0078ff0078ff0071ff0069ff0071ff0078ff0788ff +2797ff2797ff369eff52abff52abff42a4ff2797ff0080ff0062f90062f90044e20027cc0009b500009d00008800007c00006b00006b00006b00006500006500 +006b00007100007100007100007100007100007100006b00006b00006500006b00006b00007100007c00008d00009d0001af0020c6003edd003edd0053ed0069 +ff0071ff0080ff0080ff0080ff0078ff0078ff0078ff0071ff0069ff0062f9005af3004be7004be70044e2003edd002fd20027cc0020c60018c00011ba0011ba +0009b50009b50001af0001af0000a90000a300009d00009d00009800009300008800008800008800008d00008d00008d00009800009d0000a30000a90001af00 +01af0001af0001af0001af0001af0001af0009b50009b50011ba0011ba0018c00020c60020c60020c60020c60018c00018c00018c00020c60020c60027cc002f +d2002fd20036d70036d7002fd2002fd2002fd2002fd20036d70036d70044e20044e20053ed0069ff0078ff178fff369eff52abff71bbff71bbff81c2ff91caff +81c2ff71bbff42a4ff0788ff0062f90062f9003edd0011ba00009800007c00005900004900004900003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000003800003800003800003800000000000000000000000000000000000000003800003800003800004900005f00 +007c00007c0000930001af0020c6003edd004be70062f90071ff0071ff0080ff0788ff178fff178fff0788ff0080ff0078ff0078ff0071ff0071ff0071ff0078 +ff178fff369eff369eff42a4ff62b3ff62b3ff52abff2797ff0788ff0069ff0069ff0044e20027cc0009b500009d00008800007c00007100007100006b000065 +00006b00007100007100007600007100007100007100006b00006b00006500006500006b00006b00007100007c00008800009d0001af0020c60036d70036d700 +4be70062f90069ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff0069ff0062f90053ed004be7004be70044e20036d70027cc0020c60018c00009b50001 +af0001af0001af0000a90000a30000a300009d00009800009300009300008d00008800008200008200007c00008200008200008200008800008d000093000098 +00009800009d00009d00009d00009d00009d00009800009d00009d0000a30000a30000a30000a90001af0001af0009b50011ba0018c00018c00020c6002fd200 +36d70044e20044e2004be7004be70044e20044e20044e20044e20044e2004be7005af3005af30069ff0080ff178fff42a4ff62b3ff81c2ffa0d1ffa0d1ffa0d1 +ffa0d1ff91caff71bbff369eff0080ff005af3005af3002fd20001af00008d000071000054000044000044000038000038000038000038000038000038000038 +00003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000038000038000038000038000038000038000000000000000000000000000000000038000038000038000049 +00005f00007600007600008d0000a30011ba002fd20044e20062f90071ff0071ff0080ff0788ff178fff178fff178fff0788ff0080ff0080ff0078ff0078ff00 +78ff0080ff178fff369eff369eff42a4ff62b3ff52abff42a4ff178fff0078ff005af3005af3003edd0020c60000a900009800008800007c0000710000710000 +7100006b00007100007600007600007600007600007600007100007100006b00006500006500006b00006b00007100007c0000880000980000a90011ba0027cc +0027cc003edd004be70053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0044e2003edd003edd002fd20027cc0018c00011ba0001af00 +01af0000a90000a90000a300009d00009d00009800009800009300008d00008d00008800008200007c00007c00007c0000820000820000820000880000880000 +8d00008d00009300009300009300009300009300009300009300009300009300009800009800009d00009d0000a30000a90001af0011ba0020c60020c6002fd2 +003edd004be7005af3005af3005af3005af3005af30053ed0053ed0053ed005af3005af30069ff0069ff0078ff178fff369eff52abff81c2ff91caffb0d9ffb0 +d9ffb0d9ffa0d1ff81c2ff62b3ff178fff0071ff0044e20044e20020c60000a30000880000710000540000440000440000380000380000380000380000380000 +38000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000380000380000380000380000380000380000000000000000000000000000000000380000380000 +3800004900005f00007600007600008d0000a30011ba002fd20044e20062f90071ff0071ff0080ff0788ff178fff178fff178fff0788ff0080ff0080ff0078ff +0078ff0078ff0080ff178fff369eff369eff42a4ff62b3ff52abff42a4ff178fff0078ff005af3005af3003edd0020c60000a900009800008800007c00007100 +007100007100006b00007100007600007600007600007600007600007100007100006b00006500006500006b00006b00007100007c0000880000980000a90011 +ba0027cc0027cc003edd004be70053ed005af30062f90062f90062f90062f90062f9005af3005af30053ed0044e2003edd003edd002fd20027cc0018c00011ba +0001af0001af0000a90000a90000a300009d00009d00009800009800009300008d00008d00008800008200007c00007c00007c00008200008200008200008800 +008800008d00008d00009300009300009300009300009300009300009300009300009300009800009800009d00009d0000a30000a90001af0011ba0020c60020 +c6002fd2003edd004be7005af3005af3005af3005af3005af30053ed0053ed0053ed005af3005af30069ff0069ff0078ff178fff369eff52abff81c2ff91caff +b0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff178fff0071ff0044e20044e20020c60000a300008800007100005400004400004400003800003800003800003800 +00380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800000000000000000000000000003800 +003800003800004400005900006b00006b00008800009d0009b50027cc003edd005af30069ff0069ff0080ff0788ff178fff178fff178fff0788ff0080ff0080 +ff0080ff0078ff0080ff0788ff2797ff42a4ff42a4ff42a4ff52abff42a4ff369eff0080ff0069ff004be7004be7002fd20011ba0000a300009300008800007c +00007600007600007600007100007600007c00007c00007c00007600007600007600007100006500006500006500006b00006b00007100007c00008800009800 +00a30009b50018c00018c00027cc0036d7003edd0044e20044e2004be7004be7004be7004be7004be7004be70044e2003edd002fd2002fd20020c60018c00009 +b50001af0000a30000a300009d00009d00009800009800009300009300008d00008800008800008800008200008200007c00007c00007c00007c000082000082 +00008200008200008800008800008800008d00008d00008d00008d00008d00008d00008d00008d00008d00008d00009300009800009d0000a90001af0018c000 +27cc0027cc003edd0053ed0062f90071ff0071ff0071ff0071ff0069ff0069ff0062f90062f90069ff0071ff0080ff0080ff0788ff369eff52abff71bbffa0d1 +ffb0d9ffc0e0ffc0e0ffb0d9ffa0d1ff71bbff42a4ff0788ff0062f90036d70036d70011ba00009d00008200006b000054000044000044000038000038000038 +00003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038000038000000000000 +00003800003800003800003e00004e00006500006500007c0000930000a90018c00036d70053ed0062f90062f90078ff0788ff178fff178fff2797ff178fff07 +88ff0788ff0788ff0080ff0788ff178fff2797ff42a4ff42a4ff42a4ff42a4ff2797ff0788ff0071ff0053ed003edd003edd0020c60001af00009d0000930000 +8800007c00007600007600007c00007c00007c00008200008200008200007c00007c00007600007100006500006500006500006b00006b00007100007c000088 +00009300009d0000a90009b50009b50011ba0018c00020c60027cc0027cc002fd2002fd2002fd20036d70036d70036d7002fd20027cc0018c00018c00011ba00 +01af0000a300009d00009800009300009300009300009300009300008d00008d00008800008800008200008200007c00007c00007c00007c0000820000820000 +8200008200008200008200008200008200008800008800008800008800008800008800008800008800008d00008d00008d00009300009800009d0000a90009b5 +0020c6003edd003edd0053ed0069ff0078ff0788ff0080ff0080ff0080ff0078ff0071ff0071ff0071ff0071ff0078ff0788ff0788ff2797ff42a4ff71bbff81 +c2ffa0d1ffb0d9ffc0e0ffc0e0ffb0d9ff91caff62b3ff2797ff0071ff004be70027cc0027cc0000a900009300007600006500005400004900004900003e0000 +38000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000 +380000380000380000380000380000380000490000590000590000710000880000a30011ba002fd2004be70062f90062f90078ff0080ff178fff178fff2797ff +178fff178fff178fff178fff178fff178fff2797ff369eff42a4ff42a4ff42a4ff369eff178fff0078ff0062f90044e20027cc0027cc0009b50000a900009800 +008d00008200008200007c00007c00007c00008200008200008800008800008800007c00007c00007600007100006500006500006500006b00006b0000710000 +7c00008800008d00009800009d0000a30000a30000a90000a90001af0001af0009b50011ba0018c00018c00020c60020c60020c60020c60018c00009b50009b5 +0000a900009d00009300008d00008800008800008800008800008800008800008800008800008200008200007c00007c00007c00007c00007c00008200008200 +008200008200008200008200008200008200008200008200008200008200008200008800008800008800008800008800008d00008d00008d00009300009d0000 +a90011ba002fd2004be7004be70062f90080ff178fff2797ff2797ff2797ff2797ff0788ff0080ff0080ff0078ff0080ff0788ff2797ff2797ff42a4ff62b3ff +81c2ffa0d1ffb0d9ffc0e0ffc0e0ffc0e0ffa0d1ff81c2ff42a4ff0788ff0062f9003edd0011ba0011ba00009d00008800007100005f00005400004900004900 +004400003e00003e0000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800004400005400005400006b0000820000980001af0020c6003edd0053ed0053ed0069ff0078ff0080ff0788 +ff178fff178fff178fff178fff178fff178fff2797ff2797ff369eff369eff369eff369eff2797ff0080ff0069ff0053ed0036d70020c60020c60009b50000a3 +00009800009300008d00008800008800008800008800008800008800008d00008800008800007c00007c00007600007100006500006500006500006b00006b00 +007600007c00008800008d00009300009800009800009800009800009800009800009800009d00009d0000a90000a90001af0001af0009b50001af0001af0000 +a30000a300009800009300008800008200008200008200008200008200008200008800008200008200008200007c00007c00007c00007c00007c00007c000082 +00008800008800008800008800008800008800008800008200008200008200008200008800008800008d00008d0000930000930000980000980000980000a300 +00a90011ba0027cc0044e20062f90062f90078ff2797ff369eff42a4ff369eff369eff369eff178fff0788ff0080ff0080ff0080ff0788ff2797ff2797ff369e +ff52abff71bbff81c2ff91caff91caff91caff91caff62b3ff42a4ff0788ff0069ff0044e20018c00000a90000a900008d00007600006500005900004e000049 +00004900004400004400003e00003e00003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003800003800003e00004e00004e00005f00007600008d0000a30011ba002fd20044e20044e2005af30069ff00 +78ff0080ff0788ff0788ff178fff178fff178fff178fff2797ff2797ff369eff369eff369eff2797ff0788ff0071ff005af30044e20027cc0011ba0011ba0001 +af0000a300009d00009800009300009300008d00008d00008d00008d00008d00008d00008d00008800007c00007c000076000071000065000065000065000071 +00007100007600007c00008800008d00008d00008d00008d00008d00008800008200008200008200008200008800008d00008d00009800009d00009d00009d00 +009d00009300009300008800008200007c00007600007600007600007c00007c00007c00008200008200007c00007c00007600007600007600007600007c0000 +7c00008200008800008d00008d00008d00008d00008d00008800008800008800008800008800008800008d00009300009300009800009d0000a30000a30000a3 +0001af0011ba0027cc0044e2005af30078ff0078ff178fff42a4ff52abff62b3ff52abff42a4ff42a4ff2797ff0788ff0788ff0080ff0788ff0788ff2797ff27 +97ff369eff42a4ff52abff62b3ff71bbff62b3ff52abff52abff369eff0788ff0069ff0044e20020c60000a900009300009300007c00006b0000590000540000 +4900004900004900004400004400004400003e00003e000038000038000038000038000038000038000038000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003800003800003800003e00004900004900005900006b0000820000980001af0020c60036d70036d7004be7 +005af30069ff0071ff0080ff0080ff0788ff0788ff0788ff178fff178fff2797ff2797ff2797ff2797ff0788ff0080ff0069ff0053ed003edd0027cc0018c000 +18c00001af0000a90000a30000a300009d00009d00009800009800009800009800009300009300008d00008800008200008200007600007100006b00006b0000 +6b00007100007100007600008200008800008800008d00008800008200008200007c00007600007600007100007600007600008200008200008800008d000093 +00008d00008d00008800008800007c00007600007100007100007100007600007600007600007c00008200007c00007c00007600007100007100007100007100 +007600007c00008800008d00009300009800009800009800009800009300009300008d00008d00008d00009300009800009d00009d0000a30000a90001af0001 +af0009b50018c00027cc003edd0053ed0071ff178fff178fff42a4ff62b3ff71bbff71bbff62b3ff42a4ff42a4ff369eff178fff0788ff0788ff0788ff178fff +2797ff2797ff369eff369eff42a4ff42a4ff42a4ff369eff2797ff2797ff0080ff0069ff0044e20027cc0001af00009300008200008200006b00005f00004e00 +004e00004900004400004400004400003e00003e00003e0000380000380000380000380000380000380000380000380000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003e00004400004400005400006500007c0000930000a90011ba0027cc0027 +cc003edd004be7005af30069ff0071ff0078ff0080ff0080ff0788ff178fff178fff178fff178fff178fff178fff0080ff0071ff005af3004be70036d70020c6 +0018c00018c00009b50001af0001af0001af0000a90000a90000a30000a300009d00009d00009800009300008d00008800008200008200007600007100006b00 +006b00006b00007100007100007600008200008800008800008800008200007c00007c00007100006b00006500006500006500006b0000710000710000760000 +7c00008200008200007c00007600007600007100006b00006500006500006b00007100007600007600007600007c00007c000076000071000071000071000071 +00007100007600007c00008800009300009800009d00009d00009d00009d00009d00009800009800009800009800009d0000a30000a90001af0009b50011ba00 +18c00018c00020c6002fd2003edd0053ed0069ff0788ff369eff369eff62b3ff81c2ff81c2ff81c2ff71bbff52abff52abff369eff2797ff178fff0788ff178f +ff178fff178fff178fff2797ff2797ff369eff2797ff2797ff0788ff0078ff0078ff0062f9004be70027cc0001af00009800007c00006b00006b00005900004e +00004900004400004400004400004400003e00003e00003e00003800003800003800003800003800003800003800003800003800000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000038 +00003800003800003800003800003800003800003800003800003800003800003800003800003e00004400004400005400006500007c0000930000a90011ba00 +27cc0027cc003edd004be7005af30069ff0071ff0078ff0080ff0080ff0788ff178fff178fff178fff178fff178fff178fff0080ff0071ff005af3004be70036 +d70020c60018c00018c00009b50001af0001af0001af0000a90000a90000a30000a300009d00009d00009800009300008d000088000082000082000076000071 +00006b00006b00006b00007100007100007600008200008800008800008800008200007c00007c00007100006b00006500006500006500006b00007100007100 +007600007c00008200008200007c00007600007600007100006b00006500006500006b00007100007600007600007600007c00007c0000760000710000710000 +7100007100007100007600007c00008800009300009800009d00009d00009d00009d00009d00009800009800009800009800009d0000a30000a90001af0009b5 +0011ba0018c00018c00020c6002fd2003edd0053ed0069ff0788ff369eff369eff62b3ff81c2ff81c2ff81c2ff71bbff52abff52abff369eff2797ff178fff07 +88ff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff0788ff0078ff0078ff0062f9004be70027cc0001af00009800007c00006b00006b0000 +5900004e00004900004400004400004400004400003e00003e00003e000038000038000038000038000038000038000038000038000038000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000 +3800003800003800003800003e00003e00003e00003800003800003800003800003800003800003800003e00004400004400005400006500007600008d00009d +0009b50018c00018c0002fd2003edd004be7005af30062f90071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff0080ff0080ff0071ff0069ff0053ed00 +44e20036d70027cc0020c60020c60018c00018c00018c00011ba0011ba0009b50001af0001af0000a90000a300009d00009800009300008d0000820000820000 +7c00007600006b00006b00006b00007100007100007600007c00008800008800008800007c00007600007600007100006500005f00005f00005f00006500006b +00006b00007100007100007600007100007100006b00006b00006500005f00005f00006500006500007100007600007600007600007c00007600007600007100 +006b00006b00006b00006b00007600007c00008800009800009d0000a90000a90001af0001af0001af0001af0001af0000a90000a90001af0009b50011ba0018 +c00020c60027cc002fd2002fd20036d70044e20053ed0069ff0080ff2797ff52abff52abff71bbff91caff91caff91caff71bbff62b3ff62b3ff42a4ff2797ff +178fff178fff178fff178fff178fff178fff178fff178fff178fff0788ff0080ff0071ff005af3005af30044e20027cc0001af00009800008200006b00005900 +005900004e00004900003e00003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000380000380000380000380000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +003800003800003800003800003800003e00003e00003e00003e00003e00003e00003800003800003800003800003e00004400004400005400005f0000760000 +880000980000a90011ba0011ba0020c6002fd2003edd004be7005af30062f90069ff0069ff0071ff0078ff0080ff0080ff0078ff0071ff0071ff0069ff005af3 +004be7003edd0036d70027cc0027cc0027cc0027cc0027cc002fd20027cc0027cc0018c00011ba0011ba0001af0000a90000a300009800009300008d00008800 +008800007c00007600007100007100007100007100007100007600007c00008200008200008200007c00007600007600006b00005f00005f0000590000590000 +5f00005f00005f00006500006500006b00006500006500005f00005f00005900005900005900005f00006500007100007600007600007600007c000076000071 +00006b00006500006500006500006500007100007c00008d00009d0000a90009b50009b50011ba0018c00018c00018c00018c00018c00018c00018c00020c600 +27cc002fd20036d7003edd0044e20044e2004be7005af30069ff0080ff178fff42a4ff71bbff71bbff91caffb0d9ffa0d1ffa0d1ff81c2ff62b3ff62b3ff42a4 +ff369eff2797ff178fff178fff178fff178fff178fff178fff0788ff0080ff0078ff0069ff0053ed003edd003edd0020c60001af00009800008200006b000054 +00004900004900003e00003e00003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000003800003800003800003800003800003e00004400004400004400003e00003e00003e00003800003800003800003e00004400004400004e00005f00 +00710000820000930000a30001af0001af0018c00027cc0036d70044e20053ed005af30069ff0069ff0071ff0078ff0078ff0078ff0071ff0069ff0069ff005a +f30053ed0044e2003edd0036d70036d70036d70036d70036d7003edd003edd003edd0036d70027cc0018c00018c00011ba0001af0000a900009d000098000093 +00008d00008d00008800008200007600007600007600007600007600007c00008200008800008800008800008200007c00007c00007100006b00006b00006500 +006500006500006b00006b00006b00006b00006500006500005f00005900005900005900005900005f00006500006b00007600007c00007c00007c0000820000 +7600007100006b00006500006500006500006500007100007c0000930000a30009b50020c60020c6002fd2003edd003edd003edd003edd0036d70036d7003edd +003edd0044e20044e2004be70053ed005af3005af30062f90069ff0071ff0788ff2797ff52abff71bbff71bbff91caffb0d9ffa0d1ffa0d1ff81c2ff71bbff71 +bbff52abff369eff369eff2797ff2797ff178fff178fff178fff0788ff0080ff0078ff0069ff005af30044e2002fd2002fd20011ba0000a300008d0000760000 +5f00004e00004900004900003e00003e000038000038000038000038000038000038000038000038000038000038000038000038000038000000000000000000 +00000000003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000003800003800003800003800003800003e00004400004400004400004400004400003e00003e00003800003800003e00004400004400004e +00005900006b00007c00008d0000980000a90000a90009b50018c0002fd2003edd004be7005af30062f90062f90069ff0071ff0071ff0069ff0062f9005af300 +5af30053ed0044e20044e2003edd003edd003edd0044e20044e2004be7004be70053ed004be70044e20036d70027cc0027cc0018c00009b50000a90000a30000 +a300009d00009800009800009300008800008200007c00007c00007c00007c00007c00008200008800008800008800008200008200008200007c000076000071 +00007100007100007100007100007100006b00006b00006500005f00005900005900005900005400005900005f00006b00007600007c00008200008200008200 +008200007c00007100006b0000650000650000650000650000760000820000980001af0018c00036d70036d70044e2005af3005af30062f9005af3005af3005a +f3005af3005af30062f90062f90069ff0069ff0071ff0071ff0078ff0078ff0080ff178fff369eff52abff81c2ff81c2ff91caffb0d9ffa0d1ffa0d1ff91caff +71bbff71bbff62b3ff42a4ff369eff369eff2797ff2797ff178fff178fff0788ff0078ff0071ff005af3004be7002fd20018c00018c00000a900009300007c00 +006b00005900004900004400004400003e00003e00003e00003e00003e0000380000380000380000380000380000380000380000380000000000000000000000 +00000000000000000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003800003800003800003800003800004400004400004900004400004400004400004400003e00003e00003800003e0000440000 +4400004e00005900006500007600008200009300009d00009d0001af0011ba0027cc0036d70044e20053ed0062f90062f90069ff0069ff0069ff0062f9005af3 +0053ed0053ed004be70044e20044e2003edd0044e2004be70053ed0053ed0062f90062f90062f9005af30053ed003edd002fd2002fd20020c60011ba0009b500 +01af0000a90000a90000a30000a300009d00009800008d00008800008800008800008800008800008800008d00008d00008d00008d0000880000880000880000 +8200008200008200007c00007c00007600007600007600006b00006500005f00005900005900005900005900006500006b00007600008200008800008d00008d +00008d00008800008200007600007100006500006b00006b00006b00007600008800009d0009b50027cc004be7004be7005af30071ff0078ff0080ff0078ff00 +78ff0078ff0078ff0071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff0788ff178fff2797ff369eff52abff71bbff71bbff91caffa0d1ffa0d1ffa0d1 +ff91caff81c2ff81c2ff62b3ff52abff42a4ff369eff369eff2797ff178fff178fff0080ff0071ff0062f9004be7003edd0020c60009b50009b500009d000088 +00007600005f00005400004900004400004400004400004400004400004400004400003e00003e00003800003800003800003800003800000000000000000000 +00000000000000000000380000380000380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000003800003800003800003800003800004400004400004900004900004900004900004400003e00003e00003800003e00 +003e00003e00004900005400005f00006b00007c0000880000980000980000a30009b50020c6002fd20044e20053ed0062f90062f90062f90069ff0062f9005a +f30053ed004be7004be70044e2003edd0044e20044e2004be7005af30062f90062f90071ff0071ff0071ff0069ff005af3004be70036d70036d70027cc0018c0 +0011ba0009b50009b50001af0001af0001af0000a90000a300009d00009800009300008d00008d00008d00009300009300009300009300009300009300009300 +009300009300009300008d00008d00008800008200008200007c00007100006500005f00005900005900005900005f00006b00007600008200008d0000930000 +9800009800009300008d00008200007c00007100006b00006b00006b00007100007c00008d0000a30018c00036d7005af3005af30071ff178fff2797ff369eff +2797ff2797ff2797ff178fff178fff178fff178fff2797ff2797ff2797ff2797ff2797ff2797ff2797ff369eff369eff52abff71bbff71bbff81c2ffa0d1ffa0 +d1ffa0d1ff91caff81c2ff81c2ff71bbff62b3ff52abff42a4ff369eff2797ff0788ff0788ff0080ff0069ff005af30044e20027cc0011ba0000a30000a30000 +8d00007c00006b00005900004e00004900004400004400004400004400004400004400004400003e00003e00003e000038000038000038000038000000000000 +00000000000000000000000000003800003800003800003800003800003800003800003800000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000003800003800003800003800003800004400004400004900004900004900004900004400003e000038000038 +00003800003800003800004400004900005400005f00007100007c00008d00008d00009d0001af0018c0002fd20044e20053ed0062f90062f90069ff0069ff00 +62f90062f90053ed004be7004be7004be70044e2004be70053ed005af30069ff0071ff0071ff0080ff0080ff0080ff0071ff0062f9004be7003edd003edd002f +d20020c60018c00018c00018c00018c00018c00018c00011ba0009b50001af0000a90000a90000a30000a30000a30000a30000a30000a30000a30000a30000a3 +0000a30000a30000a30000a30000a300009d00009800008d00008d00008800007c00006b00006500005f00006500006500006b00007c00008800009300009d00 +009d0000a30000a300009d00009800008d00008200007c0000760000760000760000760000880000930000a90018c0003edd005af3005af30078ff178fff369e +ff42a4ff42a4ff369eff369eff369eff2797ff2797ff2797ff369eff369eff369eff369eff369eff369eff369eff369eff369eff42a4ff62b3ff62b3ff71bbff +91caffa0d1ffa0d1ffa0d1ff91caff91caff81c2ff62b3ff52abff42a4ff369eff178fff0080ff0080ff0071ff005af3004be7002fd20018c00000a900009800 +009800008200007100005f00005400004e00004900004900004900004900004900004900004900004900004400004400003e0000380000380000380000380000 +00000000000000000000000000000000000038000038000038000038000038000038000038000038000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000003800003800003800003800003800004400004900004900004900004900004900004400003e0000 +3800003800003800003800003800003e00004400004e0000540000650000710000820000820000930000a90011ba0027cc003edd0053ed0062f90062f90069ff +0069ff0069ff0062f9005af3004be7004be7004be7004be70053ed005af30069ff0078ff0788ff0788ff178fff178fff0788ff0078ff0069ff0053ed0044e200 +44e20036d70027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd20027cc0020c60018c00011ba0011ba0011ba0009b50009b50009b50009b50009b50009 +b50009b50009b50009b50009b50009b50009b50001af0000a900009d00009d00009300008200007600007100006b00007600007600007c00008d00009d0000a3 +0001af0001af0001af0001af0000a900009d00009300008800008200007c00008200008200008200008d00009d0001af0020c60044e20062f90062f90080ff27 +97ff42a4ff52abff52abff52abff52abff42a4ff369eff42a4ff42a4ff42a4ff52abff52abff52abff52abff42a4ff369eff369eff2797ff369eff42a4ff42a4 +ff62b3ff81c2ff91caffa0d1ffa0d1ff91caff91caff81c2ff71bbff52abff42a4ff2797ff178fff0078ff0078ff0069ff0053ed0036d70020c60001af000098 +00008800008800007600006500005900004e00004e00004900004900004900004e00004e00004e00004e00004900004400004400003e00003800003800003800 +00380000000000000000000000000000000000380000380000380000380000380000380000380000380000380000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000003800003800003800003800003800004400004900004900004900004900004900004400 +003e00003800003800003800003800003800003e00004400004e0000540000650000710000820000820000930000a90011ba0027cc003edd0053ed0062f90062 +f90069ff0069ff0069ff0062f9005af3004be7004be7004be7004be70053ed005af30069ff0078ff0788ff0788ff178fff178fff0788ff0078ff0069ff0053ed +0044e20044e20036d70027cc0027cc0027cc0027cc002fd2002fd2002fd2002fd20027cc0020c60018c00011ba0011ba0011ba0009b50009b50009b50009b500 +09b50009b50009b50009b50009b50009b50009b50009b50001af0000a900009d00009d00009300008200007600007100006b00007600007600007c00008d0000 +9d0000a30001af0001af0001af0001af0000a900009d00009300008800008200007c00008200008200008200008d00009d0001af0020c60044e20062f90062f9 +0080ff2797ff42a4ff52abff52abff52abff52abff42a4ff369eff42a4ff42a4ff42a4ff52abff52abff52abff52abff42a4ff369eff369eff2797ff369eff42 +a4ff42a4ff62b3ff81c2ff91caffa0d1ffa0d1ff91caff91caff81c2ff71bbff52abff42a4ff2797ff178fff0078ff0078ff0069ff0053ed0036d70020c60001 +af00009800008800008800007600006500005900004e00004e00004900004900004900004e00004e00004e00004e00004900004400004400003e000038000038 +00003800003800000000000000000000000000000000003800003800003800003800003800003800003800003800003800000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e000044000049000049000049000049 +00004400003e00003800003800003800003800003800003800003e00004400004e00005900006b00007600007600008800009d0001af0020c60036d7004be700 +5af3005af30062f90069ff0069ff0062f90062f9005af3005af3005af3005af30062f90071ff0080ff178fff2797ff2797ff369eff2797ff178fff0080ff0071 +ff005af3004be7004be7003edd0036d70036d70036d70036d7003edd0044e20044e20044e20044e2003edd003edd0036d7002fd2002fd20027cc0027cc0020c6 +0020c60020c60020c60020c60020c60020c60020c60020c60020c60018c00009b50000a90000a900009d00008d00008200007c00007c00008200008200008d00 +009d0001af0009b50018c00011ba0011ba0011ba0001af0000a300009d00009300008d00008d00008d00008d00009300009d0000a90011ba0027cc003edd005a +f3005af30071ff178fff2797ff42a4ff42a4ff42a4ff42a4ff369eff369eff369eff42a4ff42a4ff52abff52abff52abff52abff42a4ff42a4ff369eff2797ff +369eff42a4ff42a4ff52abff71bbff81c2ff91caff91caff91caff91caff81c2ff62b3ff52abff369eff178fff0080ff0071ff0071ff005af3003edd0027cc00 +09b500009d00008800007600007600006b00005900005400004900004900004900004900004900004900004900004900004900004400003e00003e0000380000 +38000038000038000038000000000000000000000000000000000038000038000038000038000038000038000038000038000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e0000440000490000490000 +4900004900004400003e00003800003800003800003800003800003800003800003e00004400005400005f0000710000710000820000930000a90011ba002fd2 +0044e2005af3005af30062f90069ff0069ff0069ff0069ff0062f90062f90069ff0069ff0078ff0080ff178fff369eff42a4ff42a4ff42a4ff369eff2797ff07 +88ff0071ff0062f90053ed0053ed0044e2003edd003edd003edd0044e20053ed0053ed0053ed005af3005af3005af3005af30053ed004be7004be70044e2003e +dd003edd0036d70036d70036d70036d70036d70036d70036d70036d70036d70027cc0020c60009b50009b50000a900009800008d000088000088000093000093 +0000a30009b50018c00027cc002fd20027cc0020c60020c60011ba0001af0000a300009d00009800009800009d00009d00009d0000a90001af0018c00027cc00 +3edd0053ed0053ed0069ff0080ff178fff369eff369eff369eff369eff369eff2797ff369eff42a4ff52abff62b3ff62b3ff62b3ff62b3ff52abff42a4ff369e +ff2797ff369eff369eff369eff52abff62b3ff81c2ff91caff91caff91caff91caff71bbff62b3ff42a4ff2797ff0788ff0078ff0062f90062f9004be7002fd2 +0011ba0000a300008d00007c00006500006500005900004e00004900004400004400004400004400004400004900004900004900004400003e00003800003800 +00380000380000380000380000380000000000000000000000000000000000380000380000380000380000380000380000380000380000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e00004400004900 +004900004900004900004400003e00003800003800003800003800003800003800003800003800003e00004900005400006500006500007600008800009d0009 +b50020c6003edd0053ed0053ed005af30069ff0071ff0071ff0071ff0071ff0071ff0078ff0080ff0788ff2797ff42a4ff52abff62b3ff62b3ff62b3ff42a4ff +369eff178fff0078ff0069ff005af3005af3004be70044e2004be7004be70053ed0062f90069ff0069ff0071ff0078ff0078ff0078ff0071ff0069ff0069ff00 +62f9005af30053ed0053ed004be7004be7004be7004be7004be7004be7004be70044e2003edd002fd20020c60020c60009b50000a90000980000980000980000 +a90000a90009b50020c60036d70036d7003edd002fd20027cc0027cc0018c00009b50001af0000a90000a90000a90001af0001af0009b50011ba0018c00020c6 +0027cc0036d70044e20044e2005af30069ff0078ff0788ff0788ff178fff178fff178fff178fff2797ff369eff42a4ff52abff62b3ff62b3ff62b3ff52abff52 +abff42a4ff369eff369eff369eff369eff42a4ff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff62b3ff52abff369eff178fff0078ff0069ff0053ed0053ed0036 +d70018c00000a900009300007c00006b00005900005900004e00004400003e00003e00003e00003e00003e00003e00003e00003e00003e00003e000038000038 +00003800003800003800003800003800000000000000000000000000000000003800003800003800003800003800003800003800003800000000000000000000 +0000000000000000000000000000000000000000000000003800003800000000000000000000000000000000003800003800003800003800003800003800003e +00004400004900004900004900004400004400003e00003800003800003800003800003800003800003800003800004400004900005900005900006b00007c00 +00930000a90018c0002fd2004be7004be7005af30069ff0071ff0078ff0078ff0080ff0080ff0788ff178fff369eff52abff62b3ff81c2ff81c2ff81c2ff71bb +ff52abff42a4ff178fff0080ff0071ff0062f90062f9005af30053ed0053ed005af30062f90071ff0080ff0080ff178fff178fff2797ff2797ff178fff0788ff +0788ff0080ff0078ff0071ff0069ff0062f90062f90062f90062f90062f90062f9005af3005af3004be70044e2002fd2002fd20018c00009b50000a90000a900 +00a90011ba0011ba0027cc0036d7004be7004be7004be7003edd002fd2002fd20020c60011ba0009b50009b50009b50011ba0018c00018c00020c60020c60027 +cc0027cc0027cc002fd2003edd003edd004be7005af30062f90071ff0078ff0080ff0080ff0080ff0788ff178fff2797ff42a4ff52abff62b3ff62b3ff71bbff +62b3ff52abff42a4ff369eff369eff369eff369eff42a4ff52abff62b3ff81c2ff71bbff71bbff71bbff52abff42a4ff2797ff0080ff0069ff005af3003edd00 +3edd0027cc0001af00009800008200006b00005900004900004900003e0000380000380000380000380000380000380000380000380000380000380000380000 +38000038000038000038000038000038000000000000000000000000000000000000000038000038000038000038000038000038000038000038000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000 +3800003800003e00004400004900004900004400004400003e00003e00003800003800003800003800003800003800003800003e00004400005400005400005f +0000710000820000980001af0018c00036d70036d7004be7005af30069ff0071ff0078ff0788ff0788ff178fff369eff52abff71bbff81c2ff91caff91caff91 +caff81c2ff62b3ff42a4ff2797ff0080ff0071ff0062f90062f9005af30053ed005af30062f90069ff0078ff0080ff0080ff178fff2797ff369eff2797ff2797 +ff178fff178fff0788ff0080ff0078ff0071ff0071ff0071ff0069ff0069ff0069ff0069ff0069ff0062f9005af3004be7003edd003edd0027cc0018c00009b5 +0011ba0011ba0020c60020c60036d70044e20053ed0053ed0053ed0044e20036d70036d70027cc0018c00018c00011ba0018c00020c60027cc0027cc002fd200 +36d70036d70036d7002fd2002fd20036d70036d7003edd004be7005af30069ff0071ff0078ff0078ff0080ff0788ff178fff369eff42a4ff62b3ff62b3ff62b3 +ff71bbff71bbff62b3ff52abff42a4ff42a4ff42a4ff42a4ff52abff62b3ff62b3ff71bbff62b3ff52abff52abff369eff178fff0078ff0069ff0053ed003edd +0027cc0027cc0009b500009d00008800007100005900004e00003e00003e00003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000000000000000000000000000000000000000000000000000000000380000380000380000380000380000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800 +003800003800003800003e00003e00004400004400004400004400004400003e00003e00003800003800003800003800003800003800003800003e0000490000 +4900005400006500007600008800009d0009b50020c60020c60036d7004be70062f90071ff0080ff0788ff0788ff2797ff42a4ff71bbff91caffa0d1ffb0d9ff +a0d1ffa0d1ff91caff71bbff52abff2797ff0788ff0078ff0069ff0069ff0062f9005af30062f90062f90071ff0080ff0788ff0788ff2797ff2797ff369eff36 +9eff2797ff178fff178fff178fff0788ff0080ff0080ff0078ff0078ff0078ff0078ff0078ff0078ff0071ff0071ff0062f90053ed0044e20044e20036d70027 +cc0020c60020c60027cc0036d70036d7003edd004be7005af3005af30053ed0044e2003edd003edd002fd20020c60020c60020c60027cc0036d7003edd003edd +0044e20044e20044e2003edd0036d70036d7002fd2002fd20036d7003edd004be7005af30069ff0071ff0071ff0080ff0788ff2797ff369eff52abff62b3ff71 +bbff71bbff71bbff71bbff71bbff62b3ff62b3ff52abff52abff52abff62b3ff62b3ff62b3ff52abff42a4ff369eff369eff0788ff0078ff0062f9004be70036 +d70020c60009b50009b50000a300008d00007600006500004e000044000038000038000038000038000038000038000038000038000038000038000038000038 +00003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000003800003800003800003800003e00004400004400004400004900004400004400003e00003e00003e00003800003800003800003800003800003800 +004400004400004900005400006500007600008d00009d0009b50009b50027cc003edd0053ed0062f90071ff0788ff0788ff2797ff42a4ff71bbff91caffa0d1 +ffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff369eff178fff0080ff0071ff0071ff0069ff0062f90069ff0071ff0078ff0788ff178fff178fff2797ff369eff +369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0080ff0080ff0080ff0080ff0080ff0080ff0080ff0078ff0071ff0069ff005af3004be7004be700 +3edd0036d7002fd2002fd20036d7003edd003edd004be70053ed005af3005af3005af3004be70044e20044e20036d7002fd2002fd2002fd20036d7003edd004b +e7004be70053ed0053ed0053ed004be7003edd0036d7002fd2002fd2002fd20036d70044e20053ed0062f90078ff0078ff0788ff178fff369eff52abff62b3ff +71bbff81c2ff81c2ff81c2ff81c2ff81c2ff71bbff71bbff62b3ff62b3ff62b3ff62b3ff52abff42a4ff42a4ff2797ff0080ff0080ff0071ff005af30044e200 +2fd20018c00001af00009d00009d00008d00007c00006500005400004400003e0000380000380000380000380000380000380000380000380000380000380000 +38000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000003800003800003800003800003e00004400004400004400004900004400004400003e00003e00003e000038000038000038000038000038 +00003800004400004400004900005400006500007600008d00009d0009b50009b50027cc003edd0053ed0062f90071ff0788ff0788ff2797ff42a4ff71bbff91 +caffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff369eff178fff0080ff0071ff0071ff0069ff0062f90069ff0071ff0078ff0788ff178fff178fff2797 +ff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0080ff0080ff0080ff0080ff0080ff0080ff0080ff0078ff0071ff0069ff005af3004be7 +004be7003edd0036d7002fd2002fd20036d7003edd003edd004be70053ed005af3005af3005af3004be70044e20044e20036d7002fd2002fd2002fd20036d700 +3edd004be7004be70053ed0053ed0053ed004be7003edd0036d7002fd2002fd2002fd20036d70044e20053ed0062f90078ff0078ff0788ff178fff369eff52ab +ff62b3ff71bbff81c2ff81c2ff81c2ff81c2ff81c2ff71bbff71bbff62b3ff62b3ff62b3ff62b3ff52abff42a4ff42a4ff2797ff0080ff0080ff0071ff005af3 +0044e2002fd20018c00001af00009d00009d00008d00007c00006500005400004400003e00003800003800003800003800003800003800003800003800003800 +00380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000003800003800003800003800003e00003e00004400004900004900004900004400004400004400003e00003e0000380000 +3800003800003800003800003800003e00004900005400006500007600008d0000a30000a30011ba002fd20044e2005af30069ff0080ff0080ff2797ff42a4ff +71bbff91caffb0d9ffc0e0ffb0d9ffb0d9ffa0d1ff81c2ff62b3ff42a4ff178fff0788ff0078ff0078ff0071ff0071ff0071ff0078ff0080ff178fff2797ff27 +97ff369eff369eff369eff2797ff2797ff178fff178fff0788ff0788ff0788ff0788ff0788ff0788ff0788ff0788ff0788ff0788ff0080ff0078ff0071ff0062 +f9005af3005af3004be70044e2003edd003edd0044e2004be7004be70053ed005af30062f90062f9005af30053ed004be7004be7003edd0036d70036d70036d7 +0044e2004be7005af3005af30062f90062f90062f9005af3004be7003edd002fd2002fd2002fd2002fd2003edd004be70062f90078ff0078ff0788ff2797ff42 +a4ff62b3ff71bbff81c2ff91caff91caff91caff91caff91caff81c2ff81c2ff71bbff71bbff71bbff62b3ff52abff369eff2797ff0080ff0069ff0069ff0053 +ed003edd0027cc0011ba0000a9000098000088000088000076000065000054000049000038000038000038000038000038000038000038000038000038000038 +00003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000003800003800003800003800003e00003e00004400004400004900004900004900004400004400004400003e00 +003800003800003800003800003800003800003800003e00004400005400006500007c0000930000930000a30011ba002fd20044e2005af30071ff0071ff0788 +ff369eff52abff81c2ffa0d1ffb0d9ffb0d9ffb0d9ffa0d1ff91caff71bbff52abff2797ff178fff0080ff0080ff0080ff0080ff0080ff0788ff178fff2797ff +369eff369eff369eff369eff2797ff2797ff178fff0788ff0788ff0080ff0080ff0788ff0788ff0788ff0788ff178fff178fff0788ff0788ff0080ff0080ff00 +71ff0069ff005af3005af30053ed004be7004be7004be7004be70053ed0053ed005af3005af30062f90062f90062f9005af30053ed0053ed004be70044e20044 +e2003edd004be70053ed0062f90062f90069ff0071ff0071ff0062f9005af30044e20036d70036d70036d70036d70044e20053ed0069ff0080ff0080ff2797ff +52abff71bbff81c2ff91caffa0d1ffa0d1ffa0d1ffa0d1ffa0d1ffa0d1ff91caff91caff81c2ff71bbff71bbff52abff42a4ff178fff0080ff0062f9004be700 +4be70036d70018c00001af00009d00009300008200007100007100006500005400004900003e0000380000380000380000380000380000380000380000380000 +38000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000003800003800003800003800003800003e000044000049000049000049000049000049000044 +00004400003e00003800003800003800003800003800003800003800003800004400004e00006500007c00007c0000930000a90018c0002fd20044e2005af300 +5af30078ff178fff42a4ff71bbff91caffa0d1ffa0d1ffa0d1ffa0d1ff91caff71bbff52abff369eff2797ff178fff178fff178fff0788ff178fff2797ff2797 +ff369eff369eff369eff42a4ff369eff2797ff178fff0080ff0080ff0080ff0078ff0080ff0080ff0788ff0788ff178fff178fff178fff178fff178fff0788ff +0080ff0078ff0069ff0062f90062f9005af3005af30053ed0053ed005af3005af3005af3005af30062f90062f90062f90062f90062f9005af3005af30053ed00 +4be7004be7004be70053ed005af30069ff0069ff0071ff0078ff0080ff0071ff0062f90053ed003edd003edd003edd0036d7004be7005af30071ff178fff178f +ff42a4ff71bbff91caffb0d9ffb0d9ffc0e0ffc0e0ffc0e0ffc0e0ffb0d9ffb0d9ffa0d1ff91caff81c2ff71bbff71bbff42a4ff2797ff0080ff0069ff004be7 +002fd2002fd20011ba0000a900009800008800007600006b00005900005900004e00004400003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e0000440000490000490000490000 +4900004900004400003e00003800003800003800003800003800003800003800003800003800004400005400006b00006b0000820000980000a90018c0002fd2 +0044e20044e2005af30071ff178fff42a4ff62b3ff91caff91caff91caffa0d1ff91caff81c2ff62b3ff52abff369eff2797ff2797ff2797ff2797ff369eff36 +9eff42a4ff52abff52abff52abff52abff369eff2797ff0788ff0080ff0078ff0078ff0078ff0078ff0078ff0080ff0788ff178fff178fff178fff178fff0788 +ff0080ff0078ff0071ff0069ff0062f90062f9005af3005af3005af30062f90062f90062f90062f90062f90062f90069ff0069ff0069ff0062f90062f90062f9 +005af3005af30053ed004be70053ed005af30069ff0069ff0078ff0080ff0788ff0080ff0071ff0062f90053ed0053ed004be70044e20053ed0069ff0080ff36 +9eff369eff62b3ff91caffb0d9ffcfe8ffcfe8ffcfe8ffcfe8ffcfe8ffc0e0ffb0d9ffb0d9ff91caff81c2ff62b3ff42a4ff42a4ff178fff0078ff0062f90044 +e20027cc0011ba0011ba0000a300009300008200007100006500005400004900004900003e000038000038000038000038000038000038000038000038000038 +00003800003e00003800003800003800003800003800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800004400004900004900 +004e00004e00004900004900003e00003800003800003800003800003800000000000000000000003800003800004400005900005900006b0000820000980000 +a90011ba0027cc0027cc003edd005af30078ff178fff42a4ff71bbff81c2ff81c2ffa0d1ff91caff81c2ff71bbff62b3ff52abff42a4ff42a4ff42a4ff42a4ff +52abff52abff62b3ff71bbff62b3ff62b3ff62b3ff42a4ff2797ff0788ff0078ff0071ff0071ff0071ff0071ff0078ff0080ff0788ff178fff178fff178fff17 +8fff0788ff0080ff0078ff0069ff0062f90062f90062f90062f90062f90062f90069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0069 +ff0069ff0069ff0062f9005af30053ed005af30062f90069ff0069ff0078ff0788ff178fff0788ff0080ff0071ff0062f90062f9005af3005af30062f90071ff +178fff42a4ff42a4ff81c2ffb0d9ffcfe8ffdfefffdfefffeff7ffdfefffdfefffcfe8ffc0e0ffa0d1ff91caff71bbff42a4ff2797ff2797ff0078ff0062f900 +44e20027cc0009b500009d00009d00008d00007c00006b00005900004e0000440000380000380000380000380000380000380000380000380000380000380000 +3800003e00003e00003e00003e000038000038000038000038000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003e000044 +00004900004e00004e00004900004900004400003e00003800003800003800003800000000000000000000003800003800003800004900004900005f00007100 +00820000930000a30009b50009b50027cc003edd005af30078ff2797ff52abff71bbff71bbff91caff81c2ff81c2ff71bbff62b3ff52abff52abff52abff52ab +ff52abff62b3ff62b3ff71bbff71bbff71bbff71bbff62b3ff42a4ff2797ff0788ff0071ff0069ff0069ff0062f90069ff0071ff0078ff0080ff0788ff0788ff +0788ff0788ff0080ff0078ff0069ff0062f9005af30062f90062f90062f90062f90069ff0069ff0071ff0071ff0071ff0071ff0069ff0069ff0071ff0071ff00 +71ff0071ff0071ff0069ff0069ff0062f9005af3005af30062f90071ff0071ff0078ff0788ff2797ff178fff178fff0080ff0071ff0071ff0069ff0069ff0071 +ff0080ff2797ff62b3ff62b3ff91caffc0e0ffcfe8ffeff7ffeff7ffeff7ffcfe8ffcfe8ffc0e0ffb0d9ff91caff71bbff42a4ff178fff0078ff0078ff005af3 +0044e20020c60001af00009d00008800008800007600006500005900004900004400003800003800003800003800003800003800003800003800003800003800 +003800003e00004400004400004400003e0000380000380000380000380000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000 +3800004400004900004e00004e00004e00004e00004400003e00003800003800003800003800000000000000000000000000003800003800003e00003e00004e +00005f00007100008200009300009d00009d0009b50020c60044e20062f90080ff369eff52abff52abff81c2ff81c2ff81c2ff71bbff62b3ff62b3ff52abff52 +abff62b3ff62b3ff71bbff71bbff81c2ff81c2ff71bbff71bbff62b3ff42a4ff178fff0080ff0069ff0062f90062f9005af30062f90069ff0071ff0080ff0080 +ff0788ff0788ff0080ff0078ff0069ff0062f9005af30053ed005af3005af3005af30069ff0071ff0071ff0078ff0071ff0071ff0071ff0071ff0071ff0071ff +0071ff0071ff0078ff0078ff0071ff0069ff0062f9005af30062f90062f90071ff0071ff0080ff0788ff2797ff2797ff2797ff0788ff0080ff0080ff0078ff00 +78ff0080ff178fff42a4ff71bbff71bbffa0d1ffc0e0ffdfefffeff7ffeff7ffeff7ffcfe8ffcfe8ffc0e0ffa0d1ff81c2ff52abff2797ff0080ff0062f90062 +f90044e20020c60001af00009800008200007100007100005f00004e00004900003e000038000038000038000038000000000000000000000038000038000038 +00003800003800003e00004400004400004900003e00003800003800003800003800000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800 +003800003800004400004900004e00004e00004e00004e00004400003e00003800003800003800003800000000000000000000000000003800003800003e0000 +3e00004e00005f00007100008200009300009d00009d0009b50020c60044e20062f90080ff369eff52abff52abff81c2ff81c2ff81c2ff71bbff62b3ff62b3ff +52abff52abff62b3ff62b3ff71bbff71bbff81c2ff81c2ff71bbff71bbff62b3ff42a4ff178fff0080ff0069ff0062f90062f9005af30062f90069ff0071ff00 +80ff0080ff0788ff0788ff0080ff0078ff0069ff0062f9005af30053ed005af3005af3005af30069ff0071ff0071ff0078ff0071ff0071ff0071ff0071ff0071 +ff0071ff0071ff0071ff0078ff0078ff0071ff0069ff0062f9005af30062f90062f90071ff0071ff0080ff0788ff2797ff2797ff2797ff0788ff0080ff0080ff +0078ff0078ff0080ff178fff42a4ff71bbff71bbffa0d1ffc0e0ffdfefffeff7ffeff7ffeff7ffcfe8ffcfe8ffc0e0ffa0d1ff81c2ff52abff2797ff0080ff00 +62f90062f90044e20020c60001af00009800008200007100007100005f00004e00004900003e0000380000380000380000380000000000000000000000380000 +3800003800003800003800003e00004400004400004900003e000038000038000038000038000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00003800003800003800003e00004900004e00004e00004e00004e00004900004400003800003800003800003800000000000000000000000000003800003800 +003800003800004900005400005f00007100007c00008d00008d00009d0001af0027cc0044e20062f90080ff2797ff2797ff52abff52abff62b3ff52abff42a4 +ff42a4ff369eff369eff369eff369eff42a4ff52abff52abff52abff52abff52abff42a4ff178fff0080ff0069ff005af30053ed0053ed004be7004be70053ed +0062f90069ff0069ff0071ff0071ff0069ff0062f90053ed004be70044e20044e2004be7004be70053ed005af30062f90069ff0071ff0071ff0071ff0069ff00 +69ff0069ff0069ff0069ff0069ff0069ff0069ff0069ff0062f9005af3005af3005af3005af30069ff0069ff0078ff0080ff178fff178fff2797ff178fff0788 +ff0788ff0080ff0080ff0788ff2797ff42a4ff62b3ff62b3ff81c2ffa0d1ffb0d9ffc0e0ffb0d9ffa0d1ff91caff91caff71bbff52abff369eff0788ff0078ff +005af3003edd003edd0020c60001af00009800008200007100005f00005f00005400004400003e00003800003800003800003800003800000000000000003800 +003800003800003800003e00003e00004400004900004900004400003e0000380000380000380000380000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000003800003800003e00004400004e00004e00004e00005400004e00004900003e000038000038000038000038000000000000000000000038 +00003800003800003800003e00004900005400005f00006b0000760000760000880000980009b50027cc004be70069ff0080ff0080ff2797ff2797ff369eff27 +97ff2797ff178fff178fff178fff178fff178fff178fff2797ff2797ff369eff2797ff2797ff178fff0080ff0069ff005af30044e2003edd003edd0036d7003e +dd0044e2004be70053ed005af3005af3005af30053ed0044e2003edd002fd2002fd2002fd2003edd003edd0044e20053ed005af30062f90069ff0069ff0069ff +0069ff0062f90062f90062f90062f90062f90062f90062f9005af3005af30053ed0053ed0053ed0053ed0062f90062f90071ff0078ff0788ff178fff178fff17 +8fff0788ff0788ff0788ff0788ff178fff2797ff42a4ff52abff52abff71bbff81c2ff81c2ff81c2ff71bbff62b3ff42a4ff42a4ff369eff178fff0080ff0069 +ff0053ed0036d70020c60020c60001af00009300008200006b00005900004e00004e000044000038000038000038000038000038000000000000000000000000 +00003800003800003800003800004400004400004400004900004900004400003e00003800003800003800003800000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003800003800003e00004400004e00004e00004e00005400004e0000490000440000380000380000380000380000380000380000 +3800003800003800003800003800003e00004900004e00005400005f00006500006500007600008800009d0009b50027cc004be7005af3005af30071ff0078ff +0080ff0078ff0078ff0071ff0071ff0071ff0071ff0071ff0071ff0078ff0078ff0080ff0078ff0078ff0071ff0062f90053ed003edd002fd20027cc0027cc00 +20c60027cc002fd20036d7003edd003edd003edd003edd0036d70027cc0020c60018c00018c00018c00027cc0027cc002fd2003edd004be7004be70053ed0053 +ed0053ed0053ed0053ed0053ed004be7004be7004be7004be7004be70044e20044e20044e2003edd0044e20044e20053ed0053ed005af30069ff0078ff0078ff +0080ff0080ff0080ff0080ff0080ff0788ff0788ff178fff2797ff369eff369eff369eff42a4ff369eff369eff2797ff0788ff0080ff0080ff0071ff0062f900 +53ed0044e2002fd20018c00001af0001af00009800008200007100005900004e0000440000440000380000380000380000380000380000380000380000380000 +0000003800003800003800003800003e00004400004400004400004900004400004400003e000038000038000038000038000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000038000038000038000000000000000000000000000000000000 +00000000000000000000000000000000003800003800003800004400004e00004e00004e00005400004e00004e00004900003e00003800003800003800003800 +003800003800003800003800003800003800003e00004400004900004900004e00005400005400006500007100008800009d0009b50027cc003edd003edd0053 +ed005af30062f9005af3005af30053ed0053ed0053ed0053ed0053ed0053ed005af3005af3005af3005af3005af30053ed0044e20036d70027cc0018c00011ba +0011ba0009b50011ba0011ba0020c60027cc0027cc0020c60020c60018c00011ba0001af0000a90000a90001af0011ba0011ba0018c00027cc0036d7003edd00 +44e20044e20044e20044e20044e2003edd003edd003edd0036d70036d70036d7002fd2002fd2002fd2002fd2002fd20036d70044e20044e2004be7005af30062 +f90069ff0071ff0071ff0078ff0078ff0080ff0080ff0788ff0788ff0788ff0788ff0788ff0788ff0788ff0080ff0071ff0069ff005af30053ed0053ed0044e2 +0036d7002fd20020c60011ba0000a900009800009800008200007100005900004900003e00003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003e00004400004400004900004900004400003e0000380000380000380000380000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000380000380000380000380000380000380000000000000000 +0000000000000000000000000000000000000000003800003800003800004400004900004900004e00005400004e00004e00004900004400003e00003e000038 +00003800003800003800003800003800003e00003e00003e00004400004400004400004400004900004900005400005f0000710000820000980001af0018c000 +18c00027cc002fd20036d70036d70036d7002fd2002fd2002fd2002fd2002fd2002fd2002fd20036d70036d70036d70036d7002fd20027cc0018c00009b50000 +a90000a30000a300009d0000a30000a90001af0009b50009b50001af0001af0000a900009d0000980000930000980000980000a30000a30001af0009b50018c0 +0020c60027cc0027cc0027cc002fd20027cc0027cc0027cc0020c60020c60018c00018c00011ba0011ba0011ba0011ba0018c00020c60027cc0027cc0036d700 +3edd004be70053ed005af30062f90069ff0069ff0069ff0071ff0078ff0078ff0071ff0071ff0071ff0069ff005af30053ed0044e20036d7002fd20020c60020 +c60011ba0009b50001af0000a300009d00008d00008200008200007100005f00004e00003e000038000038000038000038000038000038000038000038000038 +00003800003800003800003800003800003800003e00004400004900004900004900004400004400003e00003800003800003800003800000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800 +000000000000000000000000000000000000000000000000003800003800003800003e00004900004900004e00005400005400004e00004e0000490000440000 +4400003e00003800003800003800003e00003e00004400004400004400004400003e00003e00003e00003800003800004400004900005900006b00007c000093 +00009d00009d0001af0009b50011ba0011ba0011ba0009b50009b50009b50009b50009b50009b50009b50011ba0011ba0011ba0011ba0009b50001af0000a300 +009d00009300008d00008d00008d00009300009300009800009d00009800009800009800008d00008800008200007c0000820000880000930000930000980000 +a30000a90001af0009b50011ba0011ba0011ba0011ba0011ba0009b50009b50001af0000a90000a90000a30000a30000a30000a90001af0009b50011ba0011ba +0020c60027cc002fd20036d70044e2004be70053ed0053ed005af30069ff0069ff0069ff0062f90053ed0053ed0044e20036d70027cc0018c00009b50000a900 +009d00009d00009800009300008d00008800008200007600006b00006b00005f00004e0000440000380000380000380000380000380000380000380000380000 +3800003800003800003800003800003800003800003e00004400004400004900004900004900004400003e000038000038000038000038000038000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000003800003800003800003800003800003800003800003800003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003800003e0000 +4900005400005900005900005f00006500006500006500006500006500006500006500006500006500006500006500006500006500006500006500006500005f +00005900005900005400004e00004e00004e00005400005400005400005900005400005400005400004e00004e00004900004900004900004e00004e00004e00 +005400005900005f00005f00006500006500006500006500006500006500006500006500005f00005f00005f00005900005900005900005f00005f0000650000 +6500006500006b00007100007100007600007c00007c00008200008200008200008800008800008800008800008200008200007c00007600007100006b000065 +00005f00005900005900005400005400004e00004e00004900004400003e00003e00003800003800003800003800003800000000000000000000000000000000 +00000000000000000000000000000000000000380000380000380000380000380000380000380000380000380000380000380000380000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000002606 +0f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000040000002d010100070000001b043e0161011e0115010a00000026060f00 +0a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b040d016101ed0015010a00000026060f000a00ffffffff01000000 +00000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff0000000000000700 +0000fc020000e6e6e6000000040000002d010300070000001b0450008100000036000a00000026060f000a00ffffffff0100000000000a00000026060f000a00 +ffffffff0000000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff +00000000000007000000fc020000949494000000040000002d01040004000000f0010300070000001b040b001500000000000a00000026060f000a00ffffffff +0100000000000a00000026060f000a00ffffffff000000000000070000001b04150015000a0000000a00000026060f000a00ffffffff0100000000000a000000 +26060f000a00ffffffff000000000000070000001b041f001500140000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff +000000000000070000001b04290015001e0000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff00000000000007000000 +1b0432001500280000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b043c00150031000000 +0a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04460015003b0000000a00000026060f000a00 +ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b0450001500450000000a00000026060f000a00ffffffff010000000000 +0a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff00000000000007000000 +1b040b00b8000000a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b041500b8000a00a300 +0a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b041f00b8001400a3000a00000026060f000a00 +ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b042900b8001e00a3000a00000026060f000a00ffffffff010000000000 +0a00000026060f000a00ffffffff000000000000070000001b043200b8002800a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00 +ffffffff000000000000070000001b043c00b8003100a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000 +070000001b044600b8003b00a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b045000b800 +4500a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff010000000000 +0a00000026060f000a00ffffffff000000000000050000001402050014000500000013020500a3000a00000026060f000a00ffffffff0100000000000a000000 +26060f000a00ffffffff0000000000000500000014020f0014000500000013020f00a3000a00000026060f000a00ffffffff0100000000000a00000026060f00 +0a00ffffffff000000000000050000001402190014000500000013021900a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffff +ffff000000000000050000001402230014000500000013022300a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000 +000000000500000014022c0014000500000013022c00a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000 +050000001402360014000500000013023600a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff00000000000005000000 +1402400014000500000013024000a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000500000014024a00 +14000500000013024a00a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffff +ffff0100000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff00000000000007000000fc020000e6e6e60000000400 +00002d01030004000000f0010400070000001b04c4008300740038000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000 +000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff00000000000007000000fc020000949494000000040000002d01 +040004000000f0010300070000001b047f001600740001000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000 +070000001b04890016007e0001000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b0493001600 +880001000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b049d001600920001000a0000002606 +0f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04a60016009c0001000a00000026060f000a00ffffffff0100 +000000000a00000026060f000a00ffffffff000000000000070000001b04b0001600a50001000a00000026060f000a00ffffffff0100000000000a0000002606 +0f000a00ffffffff000000000000070000001b04ba001600af0001000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000 +00000000070000001b04c4001600b90001000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0100000000000a0000002606 +0f000a00ffffffff0000000000000a00000026060f000a00ffffffff000000000000070000001b047f00b9007400a4000a00000026060f000a00ffffffff0100 +000000000a00000026060f000a00ffffffff000000000000070000001b048900b9007e00a4000a00000026060f000a00ffffffff0100000000000a0000002606 +0f000a00ffffffff000000000000070000001b049300b9008800a4000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000 +00000000070000001b049d00b9009200a4000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04 +a600b9009c00a4000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04b000b900a500a4000a00 +000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04ba00b900af00a4000a00000026060f000a00ffff +ffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04c400b900b900a4000a00000026060f000a00ffffffff0100000000000a00 +000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000050000001402 +aa0015000500000013028c00a4000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000050000001402a1001500 +0500000013028300a4000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000050000001402bd00150005000000 +1302a000a4000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000050000001402b30015000500000013029600 +a4000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000a00 +000026060f000a00ffffffff00000000000007000000fc020000e6e6e6000000040000002d01030004000000f0010400070000001b043d018100ed0036000a00 +000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff0000000000000a0000002606 +0f000a00ffffffff00000000000007000000fc020000949494000000040000002d01040004000000f0010300070000001b04f8001500ed0000000a0000002606 +0f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b0402011500f70000000a00000026060f000a00ffffffff0100 +000000000a00000026060f000a00ffffffff000000000000070000001b040c011500010100000a00000026060f000a00ffffffff0100000000000a0000002606 +0f000a00ffffffff000000000000070000001b04160115000b0100000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000 +00000000070000001b0420011500150100000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04 +290115001f0100000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b0433011500280100000a00 +000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b043d011500320100000a00000026060f000a00ffff +ffff0100000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff0000 +00000000070000001b04f800b800ed00a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b04 +0201b800f700a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b040c01b8000101a3000a00 +000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff000000000000070000001b041601b8000b01a3000a00000026060f000a00ffff +ffff0100000000000a00000026060f000a00ffffffff000000000000070000001b042001b8001501a3000a00000026060f000a00ffffffff0100000000000a00 +000026060f000a00ffffffff000000000000070000001b042901b8001f01a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffff +ffff000000000000070000001b043301b8002801a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000000700 +00001b043d01b8003201a3000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffff +ffff0100000000000a00000026060f000a00ffffffff0000000000000500000014022d011400050000001302f200a3000a00000026060f000a00ffffffff0100 +000000000a00000026060f000a00ffffffff00000000000005000000140237011500050000001302fc00a4000a00000026060f000a00ffffffff010000000000 +0a00000026060f000a00ffffffff0100000000001c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000150c0a0d5695ed775f95ed77 +d067ef77150c0a0d00000a00040000002d01030007000000210501006400600035001c000000fb02f6ff0000000000009001000000000000001054696d657300 +0000840e0aee5695ed775f95ed77d067ef77840e0aee00000a00040000002d01050004000000f00103001200000021051700203d20302c204469726563742070 +726f6a656374696f6e00600039001c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000150c0a0e5695ed775f95ed77d067ef77150c +0a0e00000a00040000002d01030004000000f001050007000000210501006400d7001c001c000000fb02f6ff0000000000009001000000000000001054696d65 +73000000840e0aef5695ed775f95ed77d067ef77840e0aef00000a00040000002d01050004000000f00103001800000021052400203d20332c204f626c697175 +6520287472756e6361746564292070726f6a656374696f6ed70020001c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000150c0a0f +5695ed775f95ed77d067ef77150c0a0f00000a00040000002d01030004000000f0010500070000002105010064004e011c001c000000fb02f6ff000000000000 +9001000000000000001054696d6573000000840e0af05695ed775f95ed77d067ef77840e0af000000a00040000002d01050004000000f0010300180000002105 +2400203d20362c204f626c6971756520287472756e6361746564292070726f6a656374696f6e4e0120001c000000fb02f4ff000000000000bc02000000000000 +001054696d6573000000150c0a105695ed775f95ed77d067ef77150c0a1000000a00040000002d01030004000000f00105000b00000021050a00756e6d656173 +75726564dc005d0108000000fa0206000200000000000000040000002d010500050000001402e3007601050000001302fd007601050000001402e30090010500 +00001302310190010a00000026060f000a00ffffffff00000000000007000000fc0200007f7f7f000000040000002d01060004000000f0010400040000002d01 +020004000000f00105001400000024030800eb001c00eb002100d5002100d5002f00eb002f00eb00340001012800eb001c000a00000026060f000a00ffffffff +0100000000000a00000026060f000a00ffffffff0000000000001400000024030800e8009100e8009600d1009600d100a400e800a400e800a900fe009d00e800 +91000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff0000000000001400000024030800e8000301e8000901d1000901d100 +1601e8001601e8001c01fe001001e80003010a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\b\i0\insrsid6909422 +\par }\pard \s62\qj \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\b\i0\insrsid6909422 Figure II.1}{\pard\plain \s62\qj \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\i\v\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\xe {\insrsid6909422 }{\b\i0\insrsid6909422 II.1\ixe }}}{\b\i0\insrsid6909422 : }{\insrsid6909422 Projection truncation problem. Three different cases are }{\insrsid15669153 illu}{ +\insrsid6909422 strated here during the acquisition for oblique projections with a given ring difference }{\f3\insrsid6909422 \'64}{\insrsid6909422 . +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par \tab Kinahan and Rogers [Kinahan et al., 1989] prop +osed their reprojection method to work around the problem of axial shift variance or truncation of the projection data: a first estimate of the image is reconstructed using a sufficient data set satisfying Orlov's condition with all projections fully meas +u +red; this is usually the set of transaxial, or direct, projections. By calculating line integrals through this first image along the missing detection channels, the truncated parts of the projections (Figure II.2) can be recovered at all remaining angles. + +This is obtained by forward-projecting from a first image estimate what would have been detected by an axially longer scanner. Having artificially restored the axial shift invariance of the data, the image can be reconstructed by filtered backprojection ( +FBP) of the 2D projections using }{\insrsid15669153 the Colsher }{\insrsid6909422 filter. +\par \tab Due to the hybrid nature of the data \endash oblique sinograms consist of data both measured and calculated by forward projection of a first image estimate \endash noise propagation properties and smoothing charac +teristics of this method become involved. The validity of this approach is however confirmed daily in practical use since the reprojection method is the most widely used 3D reconstruction algorithm and is implemented in most commercial 3D PET scanners. + +\par The Colsher filtering and forward projecting algorithms are described later in this document. For general convention naming, please refer to the glossary of buildblocks in D4.1a. +\par +\par {\*\bkmkstart _Toc89164563}{\listtext\pard\plain\s2 \b\f4\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af4\dbch\af0\loch\f4 2.2\tab}}\pard\plain \s2\qj \fi-576\li576\ri12\sa80\sl360\slmult0\widctlpar +\jclisttab\tx576\tx680\aspalpha\aspnum\faauto\ls2\ilvl1\outlinelevel1\adjustright\rin12\lin576\itap0 \shading1000 \b\f4\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 More details on 3DRP{\*\bkmkend _Toc89164563} +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab The main steps for 3DRP algor +ithm are as follows (Figure II.2): +\par \bullet Reconstruction of an initial estimate of the image from direct and cross planes (}{\i\insrsid6909422 delta}{\insrsid6909422 or }{\i\f3\insrsid6909422 \'71}{\insrsid6909422 = 0 and \'b1 +1) only using a 2D reconstruction technique (in this case, we use 2D FBP). +\par \bullet Forward projection of this image estimate to complete the partially measured transaxial projections in oblique sinograms (}{\i\f3\insrsid6909422 \'71\'20}{\insrsid6909422 \u8800\'3f 0 and \'b11). If desired, |}{\f3\insrsid6909422 \'71}{ +\insrsid6909422 | can extend out to }{\i\f3\insrsid6909422 \'71}{\i\dn4\insrsid6909422 max}{\i\insrsid6909422 ,}{\i\f3\insrsid6909422 \'20}{\insrsid6909422 +the maximum acceptance angle of the tomograph (Fig. II.3). However, at these angles, the number of measured LORs may be small compared with the number that has been obtained by reprojection (Fig. II.2). +\par \bullet With a set of complete projections for all |}{\i\f3\insrsid6909422 \'71}{\insrsid6909422 | \u8804\'3d }{\i\f3\insrsid6909422 \'71}{\i\dn4\insrsid6909422 max}{\i\insrsid6909422 ,}{\insrsid6909422 +, reconstruct a final image incorporating all sinograms by FBP using }{\insrsid15669153 the Colsher }{\insrsid6909422 filter. In an ideal situation of + continuously sampled and noise-free data, the final image obtained from the third step would be identical to the initial estimate from the first step. Actually, due to the statistical nature of the data which results from a counting experiment, the incor +poration of the additionnal oblique LORs improves significantly the signal to noise of the final 3D reconstruction by a factor of about 6. +\par \tab In the 3DRP reconstruction algorithm, according to the above section, there are three specific building blocks: +\par }\pard \s53\ql \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\insrsid6909422 \tab - Colsher\rquote s filtering,\line \tab - Forward projection,\line \tab - Reconstruction kernel. +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab +In summary, the 3DRP algorithm executes the following steps as shown in Figure II.2: +\par }\pard\plain \s53\ql \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \bullet + 2D FBP (reconstruct the direct projections (2D FBP) in order to have an first 2D estimate of the image)\line \tab - Extract 1D transaxial projections,\line \tab - Filter 1D transaxial projections (using a Ramp filter, apodized or not),\line \tab +- 2D backproject the filtered projections. +\par \bullet 3D FBP\line \tab - Extract 2D projections,\line \tab - Filter 2D using Colsher\rquote s filter + 2D backproject, +\par \tab - Forward project missing data calculated from the 2D estimate of the image, +\par \tab - Filter 2D using Colsher\rquote s filter,\line \tab - 3D backproject completed projections. +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par }\pard\plain \qc \li0\ri0\sl280\slmult0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 }{\insrsid3752688 +{\pict{\*\picprop\shplid1027{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw14182\pich17992\picwgoal8040\pichgoal10200\wmetafile8\bliptag1954162773\blipupi120{\*\blipuid 747a2855fcea1f39921b4e1364eee7fe} +010009000003b43000000600420000000000050000000b0262007000050000000c02fe0192010500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000000000001054696d6573000000680f0a585695ed775f95ed77d067ef77680f0a5800000a00040000002d0100001200000021051700537465702031 +3a205265636f6e737472756374696f6e200974000e0111000000210516006f66207468652064697265637420636f6d706c65746580000f010c00000021050b00 +70726f6a656374696f6e73008b000f010e000000210510005374657020323a20466f727761726420e7000f010d00000021050d0070726f6a6563742066726f6d +2072f3000f010f00000021051200696d61676520657374696d61746520746f20fe000f011100000021051600636f6e73747275637420746865206d697373696e +67200a010f010d00000021050e006c696e6520696e74656772616c7315010f0110000000210513005374657020333a204d657267652077697468206e97010f01 +0f00000021051100746865206d65617375726564206461746101a2010f0111000000210516005374657020343a20334420464250206f66207468652007020f01 +1200000021051800636f6d706c657465642032442070726f6a656374696f6e7313020f011400000021051c00776974682074686520324420436f6c7368657227 +732066696c7465721e020f010a00000026060f000a00ffffffff0100000000001000000021051400466972737420696d61676520657374696d617465c4008801 +1200000021051700436f6d706c6574652032442070726f6a656374696f6e7301ed0174010c00000021050b0046696e616c20696d616765645402a9002d000000 +4201050000002800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0088000000440000002200 +00001100000088000000440000002200000011000000040000002d01010008000000fa0206000100000000000000040000002d010200070000001b04ff00e601 +e7007d012d0000004201050000002800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff008800 +000044000000220000001100000088000000440000002200000011000000040000002d01030004000000f0010100070000001b045301e5013b017d0105000000 +14021c01b3010500000013021c01e50107000000fc020000000000000000040000002d01010004000000f00103000e00000024030500e9011c01e3011f01e501 +1c01e3011901e9011c010500000014021c01b201050000001302e000b1010e00000024030500b101dd00b401e300b101e100ae01e300b101dd0007000000fc02 +0100000000000000040000002d010300070000001b04b200c80171009901070000001b04b200d7007200a7000a00000026060f000a00ffffffff000000000000 +050000001402750079000500000013027500fd00050000001402790079000500000013027900fd000500000014027e0079000500000013027e00fd0005000000 +1402810079000500000013028100fd00050000001402850079000500000013028500fd00050000001402890079000500000013028900fd000500000014028d00 +79000500000013028d00fd00050000001402920079000500000013029200fd00050000001402950079000500000013029500fd000500000014029a0079000500 +000013029a00fd000500000014029d0079000500000013029d00fd00050000001402a2007900050000001302a200fd00050000001402a5007900050000001302 +a500fd00050000001402a9007900050000001302a900fd00050000001402ad007900050000001302ad00fd000a00000026060f000a00ffffffff010000000000 +040000002d010100070000001b04b20003017100fd000500000014029200120105000000130292003f010e00000024030500480192003f0195003f0192003f01 +8f00480192000500000014021d0112010500000013021d0140010e0000002403050049011d014001200140011d0140011a0149011d012d000000420105000000 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000 +ff000000f7000000ff0000007f000000040000002d010400070000001b044502da000502ab00050000001402ad011301050000001302ad014101040000002d01 +010004000000f00104000e000000240305004a01ad014101b0014101ad014101aa014a01ad01050000001402fb01b2010500000013022802b201050000001402 +2902b201050000001302290228010e000000240305001f012902280126022801290228012c021f012902070000002105010078002a01f1012d00000042010500 +00002800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff008800000044000000220000001100 +000088000000440000002200000011000000040000002d010400070000001b049c01e30184017b012d0000004201050000002800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00880000004400000022000000110000008800000044000000220000001100 +0000040000002d01050004000000f0010400070000001b04df01e301c7017b01040000002d01010004000000f00105001000000024030600ce01b301c201b601 +c201b301c201b001c201b001ce01b301050000001402b3018f01050000001302b301c2012d000000420105000000280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f0000000400 +00002d010400070000001b04c901e3019a017b01050000001402b301b0010500000013028301b001040000002d01010004000000f00104000e00000024030500 +b0017f01b3018501b0018301ad018501b0017f01050000001402b401b001050000001302b601e9010e00000024030500ed01b601e701b901e901b601e701b301 +ed01b60107000000210501007800c101f101070000002105010079008001b90107000000210501007900e300b8010a00000026060f000a00ffffffff00000000 +000007000000fc020000ffffff000000040000002d010400070000001b043c01d800fd00a8000a00000026060f000a00ffffffff0100000000000a0000002606 +0f000a00ffffffff000000000000040000002d010100070000001b043c010301fc00fd000a00000026060f000a00ffffffff0100000000000a00000026060f00 +0a00ffffffff000000000000040000002d010400070000001b04d101da009101ab000a00000026060f000a00ffffffff0100000000000a00000026060f000a00 +ffffffff000000000000040000002d010100070000001b04d10104019001fe000a00000026060f000a00ffffffff010000000000050000000701010000004200 +0000430fc600880000000e002000000000000e002000f700e30028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffff +ffff42000000430fc600880000000e002000000000000e002000fa00ce0028000000200000000e000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffec3fffffffcc3fffffffcdfffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e002000fd00b90028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffffffffffe07fffffffe0ffffffff61fffffffffffffffffffff +ffffffffffffffffffff40000000430fc600880000000d002000000000000d0020000001a40028000000200000000d000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff03fffffffffffffffffffff +ffffffffffffffffffff42000000430fc600880000000e002000000000000e00200002018f0028000000200000000e000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff99fffffffe1bfffffffc1bfffffffdfffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00200005017a0028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc3fffffffcc7fffffff8cffffffff1fffff +ffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001200000006000c0012000801730028000000180000000c000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffe1fffffffe7fffffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f300e60028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f600d10028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7ffffff +f8dfffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d002000f900bc0028000000200000000d0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffff +e61fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000fb00a70028000000200000000e0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03fffffff +f07fffffffbfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000fe00920028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81 +ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00200001017d00280000002000 +00000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdff +fffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c001500040173002800 +0000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +ffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f000e500280000002000 +00000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ff +ffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f300d0002800 +0000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffbfffffffcc3fffffffcc7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d002000f600 +bb0028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffffe0ffffffff60ffffffff61fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f800 +a60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff83ffffffff03ffffffff03fffffffffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00 +2000fb00910028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e0020000000 +00000e002000fe007c0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffffcffffffff0dfffffffe0dfffffffe1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c00 +1400000004000c0014000101730028000000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +ffffffffffffffffffffffffffffffffffffffe7fffffff87fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e0020000000 +00000e002000ed00e60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e00 +2000000000000e002000f000d10028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc6008800 +00000d002000000000000d002000f300bc0028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffffffffffffffff42000000430fc6008800 +00000e002000000000000e002000f500a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffffffffffffffffffffffff42000000430f +c600880000000e002000000000000e002000f800920028000000200000000e000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff4200 +0000430fc600880000000e002000000000000e002000fb007d0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffff +ffff3e000000430fc600880000000c001500000003000c001500fe00730028000000180000000c000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff4200 +0000430fc600880000000e002000000000000e002000e900e50028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffff +ffff42000000430fc600880000000e002000000000000e002000ec00d00028000000200000000e000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffff +ffffffffffff40000000430fc600880000000d002000000000000d002000ef00bb0028000000200000000d000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e002000f100a60028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffff +ffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f400910028000000200000000e000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f7007c0028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffff +ffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c001500fa00720028000000180000000c000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000e500e50028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffe19fffffffe19fffffffe1fffff +ffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d002000e800d00028000000200000000d000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8cffffffff0cffffffff0dfffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000ea00bb0028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe7fffffff867fffffff867fffff +ff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000ed00a60028000000200000000e0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffc33fffffffc +33fffffffc3fffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d002000f000910028000000200000000d00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff99fffffffe1 +9fffffffe19fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000f2007c0028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffcffffffff0c +ffffffff0cffffffff1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001400000004000c001400f5007300280000001800 +00000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffe7 +fffffff87fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003501e60028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff87fffffff98 +ffffffff19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003801d100280000002000 +00000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ff +ffffffc1fffffffec3fffffffcdfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003b01bc002800 +0000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffeffffffff07fffffffe07fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003e01 +a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff9fffffffe33fffffffc37fffffff83fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00 +20004101920028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffff9ffffffff83fffffffd87fffffff99fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e0020000000 +00000e00200044017d0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffffffffffffc0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c00 +1500000003000c0015004701730028000000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +ffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e0020000000 +00000e0020003201e60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e00 +2000000000000e0020003501d10028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc6008800 +00000d002000000000000d0020003801bc0028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffffffffffffffff42000000430fc6008800 +00000e002000000000000e0020003a01a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffffffffffffffffffffffff42000000430f +c600880000000e002000000000000e0020003d01920028000000200000000e000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff4200 +0000430fc600880000000e002000000000000e00200040017d0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffff +ffff3e000000430fc600880000000c001500000003000c0015004301730028000000180000000c000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff4200 +0000430fc600880000000e002000000000000e0020002e01e50028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffff +ffff42000000430fc600880000000e002000000000000e0020003101d00028000000200000000e000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc3fffffffcc7fffffff8dfffffffffffffffffffffffffffff +ffffffffffff40000000430fc600880000000d002000000000000d0020003401bb0028000000200000000d000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff60ffffffff61fffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e0020003601a60028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff03fffffffffffffffffffffffffffff +ffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003901910028000000200000000e000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003c017c0028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffcffffffff0dfffffffe0dfffffffe1fffff +ffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001400000004000c0014003f01730028000000180000000c000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffe7fffffff87fffffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020002b01e60028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffe19fffffffe19fffffffe1fffff +ffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d0020002e01d10028000000200000000d000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8cffffffff0cffffffff0dfffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003001bc0028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe7fffffff867fffffff867fffff +ff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003301a70028000000200000000e0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffc33fffffffc +33fffffffc3fffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d0020003601920028000000200000000d00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff99fffffffe1 +9fffffffe19fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00200038017d0028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffcffffffff0c +ffffffff0cffffffff1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c0015003b017300280000001800 +00000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff67 +fffffff87fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020002701e50028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19 +fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020002a01d000280000002000 +00000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbff +fffffcc3fffffffcc7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d0020002d01bb002800 +0000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffe0ffffffff60ffffffff61fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020002f01a6002800 +0000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffff83ffffffff03ffffffff03fffffffffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020003201 +910028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00 +200035017c0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffffcffffffff0dfffffffe0dfffffffe1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c0014000000 +04000c0014003801730028000000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +ffffffffffffffffffffffffffffffe7fffffff87fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00 +20002401e60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffff9fffffffe19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d0020000000 +00000d0020002701d10028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff8cffffffff0cffffffff0dfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e0020000000 +00000e0020002901bc0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffffe7fffffff867fffffff867fffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e00 +2000000000000e0020002c01a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffffbfffffffc33fffffffc33fffffffc3fffffffffffffffffffffffffffffffffffffffff40000000430fc6008800 +00000d002000000000000d0020002f01920028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffff99fffffffe19fffffffe19fffffffffffffffffffffffffffffffffffffffff42000000430fc6008800 +00000e002000000000000e00200031017d0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffcffffffff0cffffffff0cffffffff1fffffffffffffffffffffffffffffffffffffffff3e000000430f +c600880000000c001500000003000c0015003401730028000000180000000c000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00ffffffffffffffffffffffffffffffffffffffffff67fffffff87fffffffffffffffffffffffffffffffffffffffffff42000000430fc6008800 +00000e002000000000000e0020008801e60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430f +c600880000000e002000000000000e0020008b01d10028000000200000000e000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffffffffffffffff4000 +0000430fc600880000000d002000000000000d0020008e01bc0028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffffffffffffffff4200 +0000430fc600880000000e002000000000000e0020009001a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffffffffffffffffffff +ffff42000000430fc600880000000e002000000000000e0020009301920028000000200000000e000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e00200096017d0028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffff +ffffffffffffffffffff3e000000430fc600880000000c001500000003000c0015009901730028000000180000000c000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e0020008401e60028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff87fffffff98ffffffff19fffffffe1fffffffffffffffffffff +ffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008701d10028000000200000000e000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffffc1fffffffec3fffffffcdfffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008a01bc0028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffeffffffff07fffffffe07fffffffe1fffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008d01a70028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffe33fffffffc37ffffff +f83fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020009001920028000000200000000e0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff83fffffffd +87fffffff99fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00200093017d0028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffffffffffc0f +fffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c00150096017300280000001800 +00000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6f +fffffff07fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008101e60028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffe19 +fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d0020008401d100280000002000 +00000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8cf +fffffff0cffffffff0dfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008601bc00280000002000 +00000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe7f +ffffff867fffffff867fffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008901a7002800 +0000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffbfffffffc33fffffffc33fffffffc3fffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d0020008c01 +920028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff99fffffffe19fffffffe19fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008e01 +7d0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffffcffffffff0cffffffff0cffffffff1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c00 +15009101730028000000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +ffffffffffffffffffffff67fffffff87fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020007d01 +e60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00 +20008001d10028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d0020000000 +00000d0020008301bc0028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e0020000000 +00000e0020008501a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e00 +2000000000000e0020008801920028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc6008800 +00000e002000000000000e0020008b017d0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430f +c600880000000c001500000003000c0015008e01730028000000180000000c000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff42000000430fc6008800 +00000e002000000000000e0020007901e60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430f +c600880000000e002000000000000e0020007c01d10028000000200000000e000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffffffffffffffff4000 +0000430fc600880000000d002000000000000d0020007f01bc0028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffffffffffffffff4200 +0000430fc600880000000e002000000000000e0020008101a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffffffffffffffffffff +ffff42000000430fc600880000000e002000000000000e0020008401920028000000200000000e000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e00200087017d0028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffff +ffffffffffffffffffff3e000000430fc600880000000c001500000003000c0015008a01730028000000180000000c000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e0020007601e60028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffff +ffffffffffffffffffff42000000430fc600880000000e002000000000000e0020007901d10028000000200000000e000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffff +ffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d0020007c01bc0028000000200000000d00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020007e01a70028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e0020008101920028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffff +ff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00200084017d0028000000200000000e0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc +0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c0015008701730028000000180000000c00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff0 +7fffffffffffffffffffffffffffffffffffffffffff050000001402a301ff00050000001302b40178000500000014029f01ff00050000001302b10178000500 +000014029c01fe00050000001302ad01780005000000140297010001050000001302aa01780005000000140294010001050000001302a6017800050000001402 +90010001050000001302a3017800050000001402b8010301050000001302cb017800050000001402b5010301050000001302c7017800050000001402b1010201 +050000001302c3017800050000001402ae010001050000001302c0017800050000001402aa010001050000001302bc017800050000001402a701ff0005000000 +1302b801780042000000430fc600880000000e002000000000000e002000df01e60028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffe19fffffffe19fffffffe1fffffffffffffffffffff +ffffffffffffffffffff40000000430fc600880000000d002000000000000d002000e201d10028000000200000000d000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8cffffffff0cffffffff0dfffffffffffffffffffff +ffffffffffffffffffff42000000430fc600880000000e002000000000000e002000e401bc0028000000200000000e000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe7fffffff867fffffff867fffffff9fffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000e701a70028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffc33fffffffc33fffffffc3fffff +ffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d002000ea01920028000000200000000d000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff99fffffffe19fffffffe19fffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000ec017d0028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffcffffffff0cffffffff0cffffff +ff1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c001500ef01730028000000180000000c0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff67fffffff87fffffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000db01e60028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19ffffff +fe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000de01d10028000000200000000e0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8 +c7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d002000e101bc0028000000200000000d00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff6 +1fffffffe61fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000e301a70028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff0 +3ffffffff07fffffffbfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000e6019200280000002000 +00000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ff +ffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000e9017d002800 +0000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c001500ec01 +730028000000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +ffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000d701e6002800 +0000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000da01 +d10028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d00 +2000dd01bc0028000000200000000d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e00 +2000df01a70028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e0020000000 +00000e002000e201920028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e00 +2000000000000e002000e5017d0028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc6008800 +00000c001500000003000c001500e801730028000000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e00 +2000000000000e002000d401e60028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffffffffffffffff42000000430fc6008800 +00000e002000000000000e002000d701d10028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430f +c600880000000d002000000000000d002000da01bc0028000000200000000d000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffffffffffffffffffffffff42000000430f +c600880000000e002000000000000e002000dc01a70028000000200000000e000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffffffffffffffffffffffffffffffff4200 +0000430fc600880000000e002000000000000e002000df01920028000000200000000e000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffff +ffff42000000430fc600880000000e002000000000000e002000e2017d0028000000200000000e000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffff +ffffffffffff3e000000430fc600880000000c001500000003000c001500e501730028000000180000000c000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffff +ffff42000000430fc600880000000e002000000000000e002000d001e60028000000200000000e000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19fffffffe1fffffffffffffffffffffffffffff +ffffffffffff42000000430fc600880000000e002000000000000e002000d301d10028000000200000000e000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8c7fffffff8dfffffffffffffffffffff +ffffffffffffffffffff40000000430fc600880000000d002000000000000d002000d601bc0028000000200000000d000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff61fffffffe61fffffffffffffffffffff +ffffffffffffffffffff42000000430fc600880000000e002000000000000e002000d801a70028000000200000000e000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff03ffffffff07fffffffbfffffffffffff +ffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000db01920028000000200000000e00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ffffffff81ffffffff81ffffffff9fffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000de017d0028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdfffffffe0ffffffffc0fffffff +fc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c001500e101730028000000180000000c0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffff6ffffffff07fffffff +ffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000cd01e60028000000200000000e000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff19fffffffe19ffffff +fe1fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000d001d10028000000200000000e0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcc7fffffff8 +c7fffffff8dfffffffffffffffffffffffffffffffffffffffff40000000430fc600880000000d002000000000000d002000d301bc0028000000200000000d00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe0ffffffff6 +1fffffffe61fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000d501a70028000000200000000e00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83ffffffff0 +3ffffffff07fffffffbfffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000d8019200280000002000 +00000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9ff +ffffff81ffffffff81ffffffff9fffffffffffffffffffffffffffffffffffffffff42000000430fc600880000000e002000000000000e002000db017d002800 +0000200000000e000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffdfffffffe0ffffffffc0ffffffffc1fffffffffffffffffffffffffffffffffffffffff3e000000430fc600880000000c001500000003000c001500de01 +730028000000180000000c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +ffffffffffffff6ffffffff07fffffffffffffffffffffffffffffffffffffffffff050000001402ce010101050000001302e0017800050000001402cb010101 +050000001302dd017800050000001402c7010101050000001302d9017800050000001402c4010001050000001302d6017800050000001402bf010201050000001302d2017800050000001402bc010001050000001302cf017800040000002701ffff030000000000}}{\insrsid6909422 +\par }\pard \qc \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\insrsid6909422 +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\insrsid6909422 Figure II.2}{\pard\plain +\s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \v\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\xe {\insrsid6909422 }{\b\insrsid6909422 II.2}{\insrsid6909422 }}}{\b\insrsid6909422 +: }{\insrsid6909422 Reprojection algorithm sometimes dubbed the \'933DRP\'94 algorithm. +\par +\par +\par }\pard\plain \s64\qj \fi-4220\li4520\ri12\sa80\sl-240\slmult0\widctlpar\tx560\tx4520\aspalpha\aspnum\faauto\adjustright\rin12\lin4520\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\i\insrsid6909422 +\par {\*\bkmkstart _Toc89164564}{\listtext\pard\plain\s2 \b\f4\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af4\dbch\af0\loch\f4 2.3\tab}}\pard\plain \s2\qj \fi-576\li576\ri12\sa80\sl360\slmult0\widctlpar +\jclisttab\tx576\tx680\aspalpha\aspnum\faauto\ls2\ilvl1\outlinelevel1\adjustright\rin12\lin576\itap0 \shading1000 \b\f4\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Colsher Filter{\*\bkmkend _Toc89164564} +\par }\pard\plain \s74\ql \li300\ri0\sb40\sa40\sl220\slmult0\widctlpar\tx1120\tx2120\tx3420\aspalpha\aspnum\faauto\adjustright\rin0\lin300\itap0 \f5\fs16\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par {\*\bkmkstart _Toc89164565}{\listtext\pard\plain\s3 \b\f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af36\dbch\af0\loch\f36 2.3.1\tab}}\pard\plain \s3\qj \fi-720\li720\ri12\sb320\widctlpar\brdrt\brdrdot\brdrw15 +\jclisttab\tx720\tx860\aspalpha\aspnum\faauto\ls2\ilvl2\outlinelevel2\adjustright\rin12\lin720\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Algorithm{\*\bkmkend _Toc89164565} +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab +This filter was originally derived by Colsher (1980) for the case of a shift-invariant scanner with limited acceptance }{\i\f3\insrsid6909422 \'71}{\i\dn8\insrsid6909422 min}{\insrsid6909422 (Fig. II.3). His initial derivation was based o +n a relation between the activity distribution }{\insrsid3752688 {\pict{\*\picprop\shplid1028{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}} +\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw706\pich459\picwgoal400\pichgoal260\wmetafile8\bliptag495226322\blipupi120{\*\blipuid 1d848dd26e64cb17472aca7107d1de46} +0100090000037a01000002001c0000000000050000000b0200000000050000000c020d0014000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d5420457874726100100a2a5695ed775f95ed77d067ef7742100a2a00000a00040000002d010000070000002105020020200d000000 +1c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f000f0a735695ed775f95ed77d067ef770e0f0a7300000a00040000002d010100 +04000000f0010000070000002105020020200d0000001c000000fb02f6ff0000000000009001020000000000001050616c6174696e6f00100a2b5695ed775f95 +ed77d067ef7742100a2b00000a00040000002d01000004000000f0010100070000002105020020200d00000007000000210501006600090002001c000000fb02 +f6ff0000000000009001000000000000001050616c6174696e6f000f0a745695ed775f95ed77d067ef770e0f0a7400000a00040000002d01010004000000f001 +000007000000210501002800090006001c000000fb02f6ff0000000000009001000000a0000000504d5420457874726100100a2c5695ed775f95ed77d067ef77 +42100a2c00000a00040000002d01000004000000f00101000700000021050200722002000b001c000000fb02f6ff000000000000900102000000000000105061 +6c6174696e6f000f0a755695ed775f95ed77d067ef770e0f0a7500000a00040000002d01010004000000f00100000700000021050200782009000a001c000000 +fb02f6ff0000000000009001000000000000001050616c6174696e6f00100a2d5695ed775f95ed77d067ef7742100a2d00000a00040000002d01000004000000f001010007000000210501002900090010000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 + and the backprojected image of the unfiltered projections, in a backproject-then-filter framework. +\par \tab In a scanner with a spatially invariant point spread function }{\i\insrsid6909422 h}{\insrsid6909422 resulting from the backprojected projections of a single object point, these quantities are linked by the relation +\par }\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar +\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\dn10\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\object\objemb\rsltmerge\objw2320\objh340{\*\objclass Equation.3}{\*\objdata 01050000020000000b0000004571756174696f6e2e3300 +00000000000000006f00000002000101000a01128367028228328378060b0002822902863d0315000001128366028228328378060b000282a9028229128368028228328378060b0002862d328378060b000282a9028229128364030f00000b110102883300000a328378060b000282a9000b11110d0286f200000001050000 +050000000d0000004d45544146494c455049435400ec0f0000a8fdffffe00b00000800ec0f58020000 +010009000003ec05000007001c00000000000400000003010800050000000b0200000000050000000c028f00c303040000002e0118001c000000fb021000070000000000bc02000000000102022253797374656d0000c303000004b81100e172c730181022000c020000c3030000040000002d0100001c000000fb029cff +0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d010100040000000201010005000000090200000002030000001e000700000016048e00c30300000000030000001e00040000002c010000030000001e00030000001e0008000000fa02 +00000000000000000000040000002d01020007000000fc020000ffffff000000040000002d010300040000002e01000005000000090200000000050000000102ffffff000400000004010d001c000000fb02bdfc0000000000009001000000000740001254696d6573204e657720526f6d616e0000000000000000000000 +000000000000040000002d0104000400000004010d00040000002e011800040000000201010005000000090200000000050000000102ffffff00030000001e001c000000fb02acff0000000000009001000000a0070000504d54204578747261000000000000000000000000000000000000000000000000040000002d01 +05000a000000320a8e000000020000002020190019001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a6400080001000000672b2a001c000000fb02acff000000000000 +9001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a64003a0001000000282b19001c000000fb02acff0000000000009001000000a0070000504d54204578747261000000000000000000000000000000000000 +000000000000040000002d01060004000000f00105000a000000320a2a006400020000007220210019001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f00106000a000000320a64005c000200 +00007820210019001c000000fb02acff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a6400850001000000292b19001c000000fb02acff0000000000009001000000020700005053796d62 +6f6c0000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a6400b700010000003d2b32001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d010600 +04000000f001050009000000320a6400340101000000662b19001c000000fb02acff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a64005e0101000000282b19001c000000fb02acff0000 +000000009001000000a0070000504d54204578747261000000000000000000000000000000000000000000000000040000002d01060004000000f00105000a000000320a2a008801020000007220210019001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000 +000000000000000000000000040000002d01050004000000f00106000a000000320a64007f01020000007820220019001c000000fb02acff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a +6400a90101000000272b110009000000320a6400ca0101000000292b19001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a6400ec0101000000682b2a001c000000fb02 +acff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a6400160201000000282b19001c000000fb02acff0000000000009001000000a0070000504d5420457874726100000000000000000000 +0000000000000000000000000000040000002d01050004000000f00106000a000000320a2a003f02020000007220220019001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00105000a000000 +320a64003702020000007820210019001c000000fb02acff0000000000009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a64007102010000002d2b32001c000000fb02acff0000000000009001000000a0 +070000504d54204578747261000000000000000000000000000000000000000000000000040000002d01060004000000f00105000a000000320a2a00bc02020000007220220019001c000000fb02acff0000000000009001020000000700001054696d657300000000000000000000000000000000000000000000000000 +0000040000002d01050004000000f00106000a000000320a6400bc02020000007820220019001c000000fb02acff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a6400de0201000000272b +100009000000320a6400ff0201000000292b19001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a6400200301000000642b2a001c000000fb02b5ff0000000000009001 +000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a3a00520301000000332b2a001c000000fb02acff0000000000009001000000a0070000504d542045787472610000000000000000000000000000000000000000 +00000000040000002d01050004000000f00106000a000000320a2a008403020000007220220019001c000000fb02acff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00105000a000000320a64007c0302000000 +7820210019001c000000fb02acff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a6400a60301000000272b10001c000000fb029cff0000000000009001000000020700005053796d626f6c +0000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a7500fa0001000000f22b1900040000002701ffff040000002d010200040000002d010300040000002d01010004000000f0010600040000002d010300040000002d010200040000002701ffff1c00 +0000fb0286003a0000000000bc02000000000102022253797374656d00009b99807cfc112200fc112200f4eb160018102200685ec730040000002d01050004000000f0010400040000002701ffff040000002701ffff040000002701ffff0d000000320a6400c7030100040000000000c3038e00202b2d00040000002d01 +0000030000000000}{\result {\dn10\insrsid3752688 {\pict{\*\picprop\shplid1029{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}} +\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw4092\pich600\picwgoal2320\pichgoal340\wmetafile8\bliptag-35008650\blipupi120{\*\blipuid fde9cf76c774e25ace2622241a29d27a} +010009000003b204000002001c0000000000050000000b0200000000050000000c02110074000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d5420457874726100080aa45695ed775f95ed77d067ef7740080aa400000a00040000002d0100000700000021050200202011000000 +1c000000fb02f6ff0000000000009001020000000000001054696d6573000000f30e0ab55695ed775f95ed77d067ef77f30e0ab500000a00040000002d010100 +04000000f0010000070000002105010067000c0001001c000000fb02f6ff0000000000009001000000000000001054696d657300000040080aa55695ed775f95 +ed77d067ef7740080aa500000a00040000002d01000004000000f0010100070000002105010028000c0007001c000000fb02f6ff0000000000009001000000a0 +000000504d54204578747261000e0ab65695ed775f95ed77d067ef77f30e0ab600000a00040000002d01010004000000f0010000070000002105020072200500 +0c001c000000fb02f6ff0000000000009001020000000000001054696d657300000040080aa65695ed775f95ed77d067ef7740080aa600000a00040000002d01 +000004000000f0010100070000002105020078200c000b001c000000fb02f6ff0000000000009001000000000000001054696d6573000000f30e0ab75695ed77 +5f95ed77d067ef77f30e0ab700000a00040000002d01010004000000f0010000070000002105010029000c0010001c000000fb02f6ff00000000000090010000 +00020000005053796d626f6c000040080aa75695ed775f95ed77d067ef7740080aa700000a00040000002d01000004000000f001010007000000210501003d00 +0c0016001c000000fb02f6ff0000000000009001020000000000001054696d6573000000f30e0ab85695ed775f95ed77d067ef77f30e0ab800000a0004000000 +2d01010004000000f0010000070000002105010066000c0025001c000000fb02f6ff0000000000009001000000000000001054696d657300000040080aa85695 +ed775f95ed77d067ef7740080aa800000a00040000002d01000004000000f0010100070000002105010028000c002a001c000000fb02f6ff0000000000009001 +000000a0000000504d54204578747261000e0ab95695ed775f95ed77d067ef77f30e0ab900000a00040000002d01010004000000f00100000700000021050200 +722005002f001c000000fb02f6ff0000000000009001020000000000001054696d657300000040080aa95695ed775f95ed77d067ef7740080aa900000a000400 +00002d01000004000000f0010100070000002105020078200c002e001c000000fb02f6ff0000000000009001000000000000001054696d6573000000f30e0aba +5695ed775f95ed77d067ef77f30e0aba00000a00040000002d01010004000000f0010000070000002105010027000c003300070000002105010029000c003700 +1c000000fb02f6ff0000000000009001020000000000001054696d657300000040080aaa5695ed775f95ed77d067ef7740080aaa00000a00040000002d010000 +04000000f0010100070000002105010068000c003b001c000000fb02f6ff0000000000009001000000000000001054696d6573000000f30e0abb5695ed775f95 +ed77d067ef77f30e0abb00000a00040000002d01010004000000f0010000070000002105010028000c0040001c000000fb02f6ff0000000000009001000000a0 +000000504d5420457874726100080aab5695ed775f95ed77d067ef7740080aab00000a00040000002d01000004000000f0010100070000002105020072200500 +45001c000000fb02f6ff0000000000009001020000000000001054696d6573000000f30e0abc5695ed775f95ed77d067ef77f30e0abc00000a00040000002d01 +010004000000f0010000070000002105020078200c0044001c000000fb02f6ff0000000000009001000000020000005053796d626f6c000040080aac5695ed77 +5f95ed77d067ef7740080aac00000a00040000002d01000004000000f001010007000000210501002d000c004b001c000000fb02f6ff00000000000090010000 +00a0000000504d54204578747261000e0abd5695ed775f95ed77d067ef77f30e0abd00000a00040000002d01010004000000f001000007000000210502007220 +050054001c000000fb02f6ff0000000000009001020000000000001054696d657300000040080aad5695ed775f95ed77d067ef7740080aad00000a0004000000 +2d01000004000000f0010100070000002105020078200c0054001c000000fb02f6ff0000000000009001000000000000001054696d6573000000f30e0abe5695 +ed775f95ed77d067ef77f30e0abe00000a00040000002d01010004000000f0010000070000002105010027000c005800070000002105010029000c005c001c00 +0000fb02f6ff0000000000009001020000000000001054696d657300000040080aae5695ed775f95ed77d067ef7740080aae00000a00040000002d0100000400 +0000f0010100070000002105010064000c0060001c000000fb02f7ff0000000000009001000000000000001054696d6573000000f30e0abf5695ed775f95ed77 +d067ef77f30e0abf00000a00040000002d01010004000000f001000007000000210501003300070066001c000000fb02f6ff0000000000009001000000a00000 +00504d5420457874726100080aaf5695ed775f95ed77d067ef7740080aaf00000a00040000002d01000004000000f00101000700000021050200722005006c00 +1c000000fb02f6ff0000000000009001020000000000001054696d6573000000f30e0ac05695ed775f95ed77d067ef77f30e0ac000000a00040000002d010100 +04000000f0010000070000002105020078200c006b001c000000fb02f6ff0000000000009001000000000000001054696d657300000040080ab05695ed775f95 +ed77d067ef7740080ab000000a00040000002d01000004000000f0010100070000002105010027000c0070001c000000fb02f4ff000000000000900100000002 +0000005053796d626f6c0000f30e0ac15695ed775f95ed77d067ef77f30e0ac100000a00040000002d01010004000000f00100000700000021050100f2000e001e000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}}}}{\insrsid6909422 .\tab (Eq. 1) +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab Recovery of the activity distribution }{ +\insrsid3752688 {\pict{\*\picprop\shplid1030{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw706\pich459\picwgoal400\pichgoal260\wmetafile8\bliptag114381535\blipupi120{\*\blipuid 06d152df9b4aa4f2efbb03542f5f17c6}0100090000037a01000002001c0000000000050000000b0200000000050000000c020d0014000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d5420457874726100100ad85695ed775f95ed77d067ef772f100ad800000a00040000002d010000070000002105020020200d000000 +1c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f000d0a8c5695ed775f95ed77d067ef77c00d0a8c00000a00040000002d010100 +04000000f0010000070000002105020020200d0000001c000000fb02f6ff0000000000009001020000000000001050616c6174696e6f00100ad95695ed775f95 +ed77d067ef772f100ad900000a00040000002d01000004000000f0010100070000002105020020200d00000007000000210501006600090002001c000000fb02 +f6ff0000000000009001000000000000001050616c6174696e6f000d0a8d5695ed775f95ed77d067ef77c00d0a8d00000a00040000002d01010004000000f001 +000007000000210501002800090006001c000000fb02f6ff0000000000009001000000a0000000504d5420457874726100100ada5695ed775f95ed77d067ef77 +2f100ada00000a00040000002d01000004000000f00101000700000021050200722002000b001c000000fb02f6ff000000000000900102000000000000105061 +6c6174696e6f000d0a8e5695ed775f95ed77d067ef77c00d0a8e00000a00040000002d01010004000000f00100000700000021050200782009000a001c000000 +fb02f6ff0000000000009001000000000000001050616c6174696e6f00100adb5695ed775f95ed77d067ef772f100adb00000a00040000002d01000004000000f001010007000000210501002900090010000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 + then requires the inversion of Equation 1, which may be written in Fourier space as the deconvolution process +\par }\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\dn8\insrsid3752688 +{\pict{\*\picprop\shplid1031{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw5750\pich706\picwgoal3260\pichgoal400\wmetafile8\bliptag1591339789\blipupi120{\*\blipuid 5ed9eb0d6a2d03501f75d153eb6f65df}010009000003d205000002001c0000000000050000000b0200000000050000000c021400a3000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff +0000000000000700000016040f00a200000000001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261000e0ac95695ed775f95ed77 +d067ef77f30e0ac900000a00040000002d010000070000002105020020200f0000001c000000fb02f6ff0000000000009001000000000000001050616c617469 +6e6f000f0a705695ed775f95ed77d067ef778b0f0a7000000a00040000002d01010004000000f0010000070000002105020020200f0000001c000000fb02f6ff +0000000000009001020000000000001050616c6174696e6f000e0aca5695ed775f95ed77d067ef77f30e0aca00000a00040000002d01000004000000f0010100 +070000002105020020200f000000070000002105010046000b0002001c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f000f0a71 +5695ed775f95ed77d067ef778b0f0a7100000a00040000002d01010004000000f0010000070000002105010028000b0008001c000000fb02f6ff000000000000 +9001000000a0000000504d54204578747261000e0acb5695ed775f95ed77d067ef77f30e0acb00000a00040000002d01000004000000f0010100070000002105 +0200722003000d001c000000fb02f6ff0000000000009001020000020000005053796d626f6c00008b0f0a725695ed775f95ed77d067ef778b0f0a7200000a00 +040000002d01010004000000f001000007000000210502006e200b000c001c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f000e +0acc5695ed775f95ed77d067ef77f30e0acc00000a00040000002d01000004000000f0010100070000002105010029000b0012001c000000fb02f6ff00000000 +00009001000000020000005053796d626f6c00008b0f0a735695ed775f95ed77d067ef778b0f0a7300000a00040000002d01010004000000f001000007000000 +210501003d000b0017001c000000fb02f6ff0000000000009001020000000000001050616c6174696e6f000e0acd5695ed775f95ed77d067ef77f30e0acd0000 +0a00040000002d01000004000000f0010100070000002105010047000b001f001c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f +000f0a745695ed775f95ed77d067ef778b0f0a7400000a00040000002d01010004000000f0010000070000002105010028000b0026001c000000fb02f6ff0000 +000000009001000000a0000000504d54204578747261000e0ace5695ed775f95ed77d067ef77f30e0ace00000a00040000002d01000004000000f00101000700 +000021050200722003002c001c000000fb02f6ff0000000000009001020000020000005053796d626f6c00008b0f0a755695ed775f95ed77d067ef778b0f0a75 +00000a00040000002d01010004000000f001000007000000210502006e200b002b001c000000fb02f6ff0000000000009001000000000000001050616c617469 +6e6f000e0acf5695ed775f95ed77d067ef77f30e0acf00000a00040000002d01000004000000f0010100070000002105010029000b0031001c000000fb02f6ff +0000000000009001020000000000001050616c6174696e6f000f0a765695ed775f95ed77d067ef778b0f0a7600000a00040000002d01010004000000f0010000 +070000002105010051000b0034001c000000fb02f9ff0000000000009001000000020000005053796d626f6c0000f30e0ad05695ed775f95ed77d067ef77f30e +0ad000000a00040000002d01000004000000f001010007000000210501002d0006003c001c000000fb02f9ff0000000000009001000000000000001050616c61 +74696e6f000f0a775695ed775f95ed77d067ef778b0f0a7700000a00040000002d01010004000000f001000007000000210501003100060040001c000000fb02 +f6ff0000000000009001000000000000001050616c6174696e6f000e0ad15695ed775f95ed77d067ef77f30e0ad100000a00040000002d01000004000000f001 +0100070000002105010028000b0044001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261000f0a785695ed775f95ed77d067ef77 +8b0f0a7800000a00040000002d01010004000000f001000007000000210502007220030049001c000000fb02f6ff000000000000900102000002000000505379 +6d626f6c0000f30e0ad25695ed775f95ed77d067ef77f30e0ad200000a00040000002d01000004000000f001010007000000210502006e200b0048001c000000 +fb02f6ff0000000000009001000000000000001050616c6174696e6f000f0a795695ed775f95ed77d067ef778b0f0a7900000a00040000002d01010004000000 +f0010000070000002105010029000b004e001c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000f30e0ad35695ed775f95ed77d067 +ef77f30e0ad300000a00040000002d01000004000000f001010007000000210501003d000b0054001c000000fb02f6ff00000000000090010200000000000010 +50616c6174696e6f000f0a7a5695ed775f95ed77d067ef778b0f0a7a00000a00040000002d01010004000000f0010000070000002105010047000b005c001c00 +0000fb02f6ff0000000000009001000000000000001050616c6174696e6f000e0ad45695ed775f95ed77d067ef77f30e0ad400000a00040000002d0100000400 +0000f0010100070000002105010028000b0063001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261000f0a7b5695ed775f95ed77 +d067ef778b0f0a7b00000a00040000002d01010004000000f001000007000000210502007220030068001c000000fb02f6ff0000000000009001020000020000 +005053796d626f6c0000f30e0ad55695ed775f95ed77d067ef77f30e0ad500000a00040000002d01000004000000f001010007000000210502006e200b006700 +1c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f000f0a7c5695ed775f95ed77d067ef778b0f0a7c00000a00040000002d010100 +04000000f0010000070000002105010029000b006d001c000000fb02f6ff0000000000009001020000000000001050616c6174696e6f000e0ad65695ed775f95 +ed77d067ef77f30e0ad600000a00040000002d01000004000000f0010100070000002105010048000b0071001c000000fb02f9ff000000000000900102000000 +0000001050616c6174696e6f000f0a7d5695ed775f95ed77d067ef778b0f0a7d00000a00040000002d01010004000000f00100000a00000021050700436f6c73 +686572000d0079001c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f000e0ad75695ed775f95ed77d067ef77f30e0ad700000a00 +040000002d01000004000000f0010100070000002105010028000b0090001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261000f +0a7e5695ed775f95ed77d067ef778b0f0a7e00000a00040000002d01010004000000f001000007000000210502007220030095001c000000fb02f6ff00000000 +00009001020000020000005053796d626f6c0000f30e0ad85695ed775f95ed77d067ef77f30e0ad800000a00040000002d01000004000000f001010007000000 +210502006e200b0094001c000000fb02f6ff0000000000009001000000000000001050616c6174696e6f000f0a7f5695ed775f95ed77d067ef778b0f0a7f0000 +0a00040000002d01010004000000f0010000070000002105010029000b009a0007000000210501002c000b009e000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 \tab (Eq. 2) +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 with }{\insrsid3752688 +{\pict{\*\picprop\shplid1032{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw3104\pich706\picwgoal1760\pichgoal400\wmetafile8\bliptag-587556892\blipupi120{\*\blipuid dcfa97e4085fae9381dc32e7c8afcbf6}0100090000031b03000002001c0000000000050000000b0200000000050000000c02140058000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff +0000000000000700000016040f005700000000001c000000fb02f6ff0000000000009001000000a0000000504d5420457874726100100a495695ed775f95ed77 +d067ef7742100a4900000a00040000002d010000070000002105020020200f0000001c000000fb02f6ff0000000000009001000000000000001050616c617469 +6e6f000c0a165695ed775f95ed77d067ef77920c0a1600000a00040000002d01010004000000f0010000070000002105020020200f0000001c000000fb02f6ff +0000000000009001020000000000001050616c6174696e6f00100a4a5695ed775f95ed77d067ef7742100a4a00000a00040000002d01000004000000f0010100 +070000002105020020200f000000070000002105010048000b0002001c000000fb02f9ff0000000000009001020000000000001050616c6174696e6f000c0a17 +5695ed775f95ed77d067ef77920c0a1700000a00040000002d01010004000000f00100000a00000021050700436f6c73686572000d000a001c000000fb02f6ff +0000000000009001000000000000001050616c6174696e6f00100a4b5695ed775f95ed77d067ef7742100a4b00000a00040000002d01000004000000f0010100 +070000002105010028000b0021001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261000c0a185695ed775f95ed77d067ef77920c +0a1800000a00040000002d01010004000000f001000007000000210502007220030026001c000000fb02f6ff0000000000009001020000020000005053796d62 +6f6c000042100a4c5695ed775f95ed77d067ef7742100a4c00000a00040000002d01000004000000f001010007000000210502006e200b0025001c000000fb02 +f6ff0000000000009001000000000000001050616c6174696e6f000c0a195695ed775f95ed77d067ef77920c0a1900000a00040000002d01010004000000f001 +0000070000002105010029000b002b001c000000fb02f6ff0000000000009001000000020000005053796d626f6c000042100a4d5695ed775f95ed77d067ef77 +42100a4d00000a00040000002d01000004000000f001010007000000210501003d000b0030001c000000fb02f6ff000000000000900102000000000000105061 +6c6174696e6f000c0a1a5695ed775f95ed77d067ef77920c0a1a00000a00040000002d01010004000000f0010000070000002105010051000b0038001c000000 +fb02f9ff0000000000009001000000020000005053796d626f6c000042100a4e5695ed775f95ed77d067ef7742100a4e00000a00040000002d01000004000000 +f001010007000000210501002d00060041001c000000fb02f9ff0000000000009001000000000000001050616c6174696e6f000c0a1b5695ed775f95ed77d067 +ef77920c0a1b00000a00040000002d01010004000000f001000007000000210501003100060044001c000000fb02f6ff00000000000090010000000000000010 +50616c6174696e6f00100a4f5695ed775f95ed77d067ef7742100a4f00000a00040000002d01000004000000f0010100070000002105010028000b0049001c00 +0000fb02f6ff0000000000009001000000a0000000504d54204578747261000c0a1c5695ed775f95ed77d067ef77920c0a1c00000a00040000002d0101000400 +0000f00100000700000021050200722003004e001c000000fb02f6ff0000000000009001020000020000005053796d626f6c000042100a505695ed775f95ed77 +d067ef7742100a5000000a00040000002d01000004000000f001010007000000210502006e200b004d001c000000fb02f6ff0000000000009001000000000000 +001050616c6174696e6f000c0a1d5695ed775f95ed77d067ef77920c0a1d00000a00040000002d01010004000000f0010000070000002105010029000b0053000a00000026060f000a00ffffffff0100000000000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{ +\dn16\insrsid6909422 }{\insrsid6909422 is the Colsher filter. More detailed developments may be found in [Colsher, 1980]. The Colsher filter can be expressed by the following transfer function: +\par }\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar +\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\dn56\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\object\objemb\rsltmerge\objw6741\objh1240{\*\objclass Equation.3}{\*\objdata 01050000020000000b0000004571756174696f6e2e3300 +00000000000000001b020000 +02000101000a01128348030f01000b0112834312836f12836c1283731283681283651283720011000a02822822846e060b0002822902980202863d0298020298020298020298020298020302010004010101030e000001030400000122846e060b000002966102966200000102883202847000000001030e000001030400 +000122846e060b00000296610296620000010288320284700000030e000001028831000112826112827212826312827312826912826e02822812827312826912826e028228028471030f01000b0112826d1282611282780011000a02822f12827312826912826e0284790282290000000002967b00029802050101010201 +00000401010102980202980202980202980202980202980202980212836912836602980212826312826f1282730284790298020286b302980212826312826f128273028471030f01000b0112826d1282611282780011000a0298020298020282281283461283691283671283751283721283650298020298021283491283 +4902822e02883402822e128341028229000100000102980202980202980202980202980202980202980212836912836602980212826312826f12827302847902980202863c02980212826312826f128273028471030f01000b0112826d1282611282780011000a0298020298020282281283461283691283671283751283 +7212836502980202980212834912834902862d02883402822e1283420282290000000001050000050000000d0000004d45544146494c4550494354004f2e000075f7ffffc415000008004f2e8b080000 +010009000003de0a000008001c00000000000400000003010800050000000b0200000000050000000c020502f00a040000002e0118001c000000fb021000070000000000bc02000000000102022253797374656d0002f00a000004b81100e172c730181022000c020000f00a0000040000002d0100000400000002010100 +050000000902000000021c000000fb029cff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d010100030000001e000700000016040502f00a00000000030000001e00040000002c010000030000001e00030000001e0008000000fa02 +00000000000000000000040000002d01020007000000fc020000ffffff000000040000002d010300040000002e01000005000000090200000000050000000102ffffff000400000004010d001c000000fb02befc0000000000009001000000000740001254696d6573204e657720526f6d616e0000000000000000000000 +000000000000040000002d0104000400000004010d00040000002e011800040000000201010005000000090200000000050000000102ffffff00030000001e001c000000fb02adff0000000000009001000000a0070000504d54204578747261000000000000000000000000000000000000000000000000040000002d01 +05000a000000320a05020000020000002020190019001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a1c01110001000000482b3a001c000000fb02c6ff000000000000 +9001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060012000000320a2c014b0007000000436f6c73686572002a001900100019001900190019001c000000fb02adff0000000000009001000000000700001054696d6573000000 +000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a1c01130101000000282b19001c000000fb02adff0000000000009001000000a0070000504d54204578747261000000000000000000000000000000000000000000000000040000002d01050004000000 +f00106000a000000320ad9003d01020000007220210019001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f00105000a000000320a1c013401020000006e202a0019001c000000fb02adff0000 +000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a1c01660101000000292b19001c000000fb02adff0000000000009001000000020700005053796d626f6c00000000000000000000000000000000 +00000000000000000000040000002d01060004000000f001050009000000320a1c018801010000003d2b32001c000000fb02adff0000000000009001000000a0070000504d54204578747261000000000000000000000000000000000000000000000000040000002d01050004000000f00106000a000000320a21005802 +020000007220210019001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f00105000a000000320a5c005002020000006e202900190008000000fa0206000800000000000000040000002d010500 +05000000140211003f0205000000130275003f0205000000140211008202050000001302750082021c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320ae1002e0201000000 +322b2a001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320ae100600201000000702b2a0005000000140285002e02050000001302850092021c000000fb02adff00000000 +00009001000000a0070000504d54204578747261000000000000000000000000000000000000000000000000040000002d01070004000000f00106000a000000320a1c015802020000007220210019001c000000fb02adff0000000000009001020000020700005053796d626f6c00000000000000000000000000000000 +00000000000000000000040000002d01060004000000f00107000a000000320a5e015002020000006e202900190005000000140213013f020500000013026f013f02050000001402130182020500000013026f0182021c000000fb02adff0000000000009001000000000700001054696d65730000000000000000000000 +00000000000000000000000000000000040000002d01070004000000f001060009000000320adb012e0201000000322b2a001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000 +320adb01600201000000702b2a0005000000140280012e02050000001302800192021c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320a6701220401000000312b2a001000 +0000320adb01ab020600000061726373696e22002100210022001900290009000000320adb017c0301000000282b19000c000000320adb0195030300000073696e00210019002a0009000000320adb01f90301000000282b19001c000000fb02adff0000000000009001020000020700005053796d626f6c000000000000 +0000000000000000000000000000000000000000040000002d01060004000000f001070009000000320adb011a0401000000712b2a001c000000fb02c6ff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f0010600 +0c000000320aec014c04030000006d6178002a00190021001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320adb01c904010000002f2b19000c000000320adb01f3040300 +000073696e00210019002a001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320adb015f0501000000792b3a001c000000fb02adff00000000000090010000000007000010 +54696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320adb01a10501000000292b19000500000014028001ab020500000013028001ba051c000000fb02adff0000000000009001000000020700005053796d626f6c00000000000000000000 +00000000000000000000000000000000040000002d01070004000000f00106000a000000320a5300fc0102000000ec202a0011000a000000320a1c01fc0102000000ed202a0011000a000000320aa700fc0102000000ef202a0011000a000000320ad900fc0102000000ef202a0011000a000000320aec01fc0102000000 +ee202a0011000a000000320a6f01fc0102000000ef202a0011000a000000320ac201fc0102000000ef202a0011001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00107000a000000320aa700 +4806020000006966190019001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f00106000c000000320aa700930603000000636f730021002a0021001c000000fb02adff00000000000090010200 +00020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320aa700080701000000792b3a001c000000fb02adff0000000000009001000000020700005053796d626f6c000000000000000000000000000000000000000000000000 +0000040000002d01070004000000f001060009000000320aa7005b0701000000b32b32001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00107000c000000320aa7008d0703000000636f7300 +21002a0021001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320aa7000a0801000000712b2a001c000000fb02c6ff0000000000009001000000000700001054696d657300 +0000000000000000000000000000000000000000000000000000040000002d01060004000000f00107000c000000320ac0003408030000006d6178002900190022001c000000fb02adff0000000000009001000000000700001054696d657300000000000000000000000000000000000000000000000000000004000000 +2d01070004000000f001060009000000320aa700b90801000000282b19001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001070010000000320aa700e3080600000046696775726532001900 +29002a00210022000a000000320aa700dd09020000004949190021001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320aa700170a010000002e2b190009000000320aa700 +380a01000000342b2a0009000000320aa700620a010000002e2b19001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320aa700830a01000000412b32001c000000fb02adff +0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320aa700b50a01000000292b19001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000 +000000000000000000000000040000002d01060004000000f00107000a000000320a80013706020000006966190019001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f00106000c000000320a +80017a0603000000636f730021002a0021001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320a8001f70601000000792b3a001c000000fb02adff00000000000090010000 +00020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320a80014207010000003c2b32001c000000fb02adff0000000000009001000000000700001054696d657300000000000000000000000000000000000000000000000000 +0000040000002d01060004000000f00107000c000000320a8001740703000000636f730021002a0021001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320a8001f1070100 +0000712b2a001c000000fb02c6ff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00107000c000000320a99012308030000006d6178002a00190021001c000000fb02adff00000000000090010000000007000010 +54696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320a8001a80801000000282b19001c000000fb02adff0000000000009001020000000700001054696d657300000000000000000000000000000000000000000000000000000004000000 +2d01060004000000f001070010000000320a8001ca08060000004669677572653200190029002a00210022000a000000320a8001c409020000004949190021001c000000fb02adff0000000000009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01 +070004000000f001060009000000320a80010f0a010000002d2b32001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320a8001510a01000000342b2a0009000000320a8001 +7b0a010000002e2b19001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001060009000000320a80019c0a01000000422b32001c000000fb02adff000000000000900100000000070000105469 +6d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001070009000000320a8001ce0a01000000292b1900040000002701ffff040000002d010200040000002d010300040000002d01010004000000f001050004000000f0010600040000002d010300040000002d01 +0200040000002701ffff1c000000fb0285003a0000000000bc02000000000102022253797374656d00009b99807cfc112200fc112200f4eb160018102200685ec730040000002d01050004000000f0010400040000002701ffff040000002701ffff040000002701ffff0d000000320a1c01f80a0100040000000000f00a +0502202b2d00040000002d010000030000000000}{\result {\dn56\insrsid3752688 {\pict{\*\picprop\shplid1033{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}} +\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw11889\pich2187\picwgoal6740\pichgoal1240\wmetafile8\bliptag1669393357\blipupi120{\*\blipuid 6380ebcd9419802922767fd6190b49ed} +0100090000032a09000003001c0000000000050000000b0200000000050000000c023e0051010500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d54204578747261000c0aca5695ed775f95ed77d067ef777f0c0aca00000a00040000002d010000070000002105020020203e000000 +1c000000fb02f6ff0000000000009001020000000000001054696d65730000004d100a625695ed775f95ed77d067ef774d100a6200000a00040000002d010100 +04000000f001000007000000210501004800220002001c000000fb02f9ff0000000000009001020000000000001054696d65730000007f0c0acb5695ed775f95 +ed77d067ef777f0c0acb00000a00040000002d01000004000000f00101000a00000021050700436f6c7368657200240009001c000000fb02f6ff000000000000 +9001000000000000001054696d65730000004d100a635695ed775f95ed77d067ef774d100a6300000a00040000002d01010004000000f0010000070000002105 +01002800220021001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261000c0acc5695ed775f95ed77d067ef777f0c0acc00000a00 +040000002d01000004000000f0010100070000002105020072201a0026001c000000fb02f6ff0000000000009001020000020000005053796d626f6c00004d10 +0a645695ed775f95ed77d067ef774d100a6400000a00040000002d01010004000000f001000007000000210502006e20220025001c000000fb02f6ff00000000 +00009001000000000000001054696d65730000007f0c0acd5695ed775f95ed77d067ef777f0c0acd00000a00040000002d01000004000000f001010007000000 +21050100290022002b001c000000fb02f6ff0000000000009001000000020000005053796d626f6c00004d100a655695ed775f95ed77d067ef774d100a650000 +0a00040000002d01010004000000f001000007000000210501003d0022002f001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261 +000c0ace5695ed775f95ed77d067ef777f0c0ace00000a00040000002d01000004000000f001010007000000210502007220040048001c000000fb02f6ff0000 +000000009001020000020000005053796d626f6c00004d100a665695ed775f95ed77d067ef774d100a6600000a00040000002d01010004000000f00100000700 +0000210502006e200b00470008000000fa0206000100000000000000040000002d010000050000001402020045000500000013020e0045000500000014020200 +4d000500000013020e004d001c000000fb02f6ff0000000000009001000000000000001054696d65730000007f0c0acf5695ed775f95ed77d067ef777f0c0acf +00000a00040000002d01020004000000f0010100070000002105010032001b0043001c000000fb02f6ff0000000000009001020000020000005053796d626f6c +00004d100a675695ed775f95ed77d067ef774d100a6700000a00040000002d01010004000000f0010200070000002105010070001b0049000500000014021000 +430005000000130210004f001c000000fb02f6ff0000000000009001000000a0000000504d54204578747261000c0ad05695ed775f95ed77d067ef777f0c0ad0 +00000a00040000002d01020004000000f001010007000000210502007220220048001c000000fb02f6ff0000000000009001020000020000005053796d626f6c +00004d100a685695ed775f95ed77d067ef774d100a6800000a00040000002d01010004000000f001020007000000210502006e202a0047000500000014022100 +45000500000013022c00450005000000140221004d000500000013022c004d001c000000fb02f6ff0000000000009001000000000000001054696d6573000000 +7f0c0ad15695ed775f95ed77d067ef777f0c0ad100000a00040000002d01020004000000f001010007000000210501003200390043001c000000fb02f6ff0000 +000000009001020000020000005053796d626f6c00004d100a695695ed775f95ed77d067ef774d100a6900000a00040000002d01010004000000f00102000700 +0000210501007000390049000500000014022e0043000500000013022e004f001c000000fb02f6ff0000000000009001000000000000001054696d6573000000 +7f0c0ad25695ed775f95ed77d067ef777f0c0ad200000a00040000002d01020004000000f0010100070000002105010031002b007f0009000000210506006172 +6373696e390052000700000021050100280039006b00080000002105030073696e7339006e000700000021050100280039007a001c000000fb02f6ff00000000 +00009001020000020000005053796d626f6c00004d100a6a5695ed775f95ed77d067ef774d100a6a00000a00040000002d01010004000000f001020007000000 +21050100710039007e001c000000fb02f9ff0000000000009001000000000000001054696d65730000007f0c0ad35695ed775f95ed77d067ef777f0c0ad30000 +0a00040000002d01020004000000f001010008000000210503006d6178733b0084001c000000fb02f6ff0000000000009001000000000000001054696d657300 +00004d100a6b5695ed775f95ed77d067ef774d100a6b00000a00040000002d01010004000000f001020007000000210501002f00390093000800000021050300 +73696e73390098001c000000fb02f6ff0000000000009001020000020000005053796d626f6c00007f0c0ad45695ed775f95ed77d067ef777f0c0ad400000a00 +040000002d01020004000000f0010100070000002105010079003900a5001c000000fb02f6ff0000000000009001000000000000001054696d65730000004d10 +0a6c5695ed775f95ed77d067ef774d100a6c00000a00040000002d01010004000000f0010200070000002105010029003900ad000500000014022e0052000500 +000013022e00b0001c000000fb02f6ff0000000000009001000000020000005053796d626f6c00007f0c0ad55695ed775f95ed77d067ef777f0c0ad500000a00 +040000002d01020004000000f00101000700000021050200ec200a003d000700000021050200ed2022003d000700000021050200ef2014003d00070000002105 +0200ef201a003d000700000021050200ee203b003d000700000021050200ef202c003d000700000021050200ef2036003d001c000000fb02f6ff000000000000 +9001020000000000001054696d65730000004d100a6d5695ed775f95ed77d067ef774d100a6d00000a00040000002d01010004000000f0010200070000002105 +020069661400c1001c000000fb02f6ff0000000000009001000000000000001054696d65730000007f0c0ad65695ed775f95ed77d067ef777f0c0ad600000a00 +040000002d01020004000000f00101000800000021050300636f73731400ca001c000000fb02f6ff0000000000009001020000020000005053796d626f6c0000 +4d100a6e5695ed775f95ed77d067ef774d100a6e00000a00040000002d01010004000000f0010200070000002105010079001400d8001c000000fb02f6ff0000 +000000009001000000020000005053796d626f6c00007f0c0ad75695ed775f95ed77d067ef777f0c0ad700000a00040000002d01020004000000f00101000700 +000021050100b3001400e2001c000000fb02f6ff0000000000009001000000000000001054696d65730000004d100a6f5695ed775f95ed77d067ef774d100a6f +00000a00040000002d01010004000000f00102000800000021050300636f73731400e8001c000000fb02f6ff0000000000009001020000020000005053796d62 +6f6c00007f0c0ad85695ed775f95ed77d067ef777f0c0ad800000a00040000002d01020004000000f0010100070000002105010071001400f7001c000000fb02 +f9ff0000000000009001000000000000001054696d65730000004d100a705695ed775f95ed77d067ef774d100a7000000a00040000002d01010004000000f001 +020008000000210503006d6178731700fc001c000000fb02f6ff0000000000009001000000000000001054696d65730000007f0c0ad95695ed775f95ed77d067 +ef777f0c0ad900000a00040000002d01020004000000f00101000700000021050100280014000c011c000000fb02f6ff00000000000090010200000000000010 +54696d65730000004d100a715695ed775f95ed77d067ef774d100a7100000a00040000002d01010004000000f001020009000000210506004669677572651400 +11010700000021050200494914002f011c000000fb02f6ff0000000000009001000000000000001054696d65730000007f0c0ada5695ed775f95ed77d067ef77 +7f0c0ada00000a00040000002d01020004000000f001010007000000210501002e00140036010700000021050100340014003a0107000000210501002e001400 +3f011c000000fb02f6ff0000000000009001020000000000001054696d65730000004d100a725695ed775f95ed77d067ef774d100a7200000a00040000002d01 +010004000000f001020007000000210501004100140043011c000000fb02f6ff0000000000009001000000000000001054696d65730000007f0c0adb5695ed77 +5f95ed77d067ef777f0c0adb00000a00040000002d01020004000000f001010007000000210501002900140049011c000000fb02f6ff00000000000090010200 +00000000001054696d65730000004d100a735695ed775f95ed77d067ef774d100a7300000a00040000002d01010004000000f001020007000000210502006966 +2e00bf001c000000fb02f6ff0000000000009001000000000000001054696d65730000007f0c0adc5695ed775f95ed77d067ef777f0c0adc00000a0004000000 +2d01020004000000f00101000800000021050300636f73752e00c7001c000000fb02f6ff0000000000009001020000020000005053796d626f6c00004d100a74 +5695ed775f95ed77d067ef774d100a7400000a00040000002d01010004000000f0010200070000002105010079002e00d6001c000000fb02f6ff000000000000 +9001000000020000005053796d626f6c00007f0c0add5695ed775f95ed77d067ef777f0c0add00000a00040000002d01020004000000f0010100070000002105 +01003c002e00df001c000000fb02f6ff0000000000009001000000000000001054696d65730000004d100a755695ed775f95ed77d067ef774d100a7500000a00 +040000002d01010004000000f00102000800000021050300636f73752e00e5001c000000fb02f6ff0000000000009001020000020000005053796d626f6c0000 +7f0c0ade5695ed775f95ed77d067ef777f0c0ade00000a00040000002d01020004000000f0010100070000002105010071002e00f4001c000000fb02f9ff0000 +000000009001000000000000001054696d65730000004d100a765695ed775f95ed77d067ef774d100a7600000a00040000002d01010004000000f00102000800 +0000210503006d6178753100fa001c000000fb02f6ff0000000000009001000000000000001054696d65730000007f0c0adf5695ed775f95ed77d067ef777f0c +0adf00000a00040000002d01020004000000f0010100070000002105010028002e000a011c000000fb02f6ff0000000000009001020000000000001054696d65 +730000004d100a775695ed775f95ed77d067ef774d100a7700000a00040000002d01010004000000f001020009000000210506004669677572652e000e010700 +00002105020049492e002c011c000000fb02f6ff0000000000009001000000020000005053796d626f6c00007f0c0ae05695ed775f95ed77d067ef777f0c0ae0 +00000a00040000002d01020004000000f001010007000000210501002d002e0035011c000000fb02f6ff0000000000009001000000000000001054696d657300 +00004d100a785695ed775f95ed77d067ef774d100a7800000a00040000002d01010004000000f0010200070000002105010034002e003d010700000021050100 +2e002e0042011c000000fb02f6ff0000000000009001020000000000001054696d65730000007f0c0ae15695ed775f95ed77d067ef777f0c0ae100000a000400 +00002d01020004000000f0010100070000002105010042002e0046011c000000fb02f6ff0000000000009001000000000000001054696d65730000004d100a79 +5695ed775f95ed77d067ef774d100a7900000a00040000002d01010004000000f0010200070000002105010029002e004c010a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}}}}{\insrsid6909422 \tab (Eq. 3) +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 where }{\i\f3\insrsid6909422 \'79}{\insrsid6909422 +is the polar angle of the frequency vector( i.e }{\i\f3\insrsid6909422 \'6e}{\i\dn4\insrsid6909422 z}{\insrsid6909422 /|}{\insrsid3752688 {\pict{\*\picprop\shplid1034{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley101\piccropl0\piccropr0\piccropt-9\piccropb-9 +\picw318\pich388\picwgoal180\pichgoal220\wmetafile8\bliptag-574307742\blipupi119{\*\blipuid ddc4c2623af1703dfe9bbcf54df78deb}010009000003a300000002001c0000000000050000000b0200000000050000000c020b0009000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d54204578747261000f0a775695ed775f95ed77d067ef777f0f0a7700000a00040000002d010000070000002105020020200b000000 +07000000210502007220010003001c000000fb02f6ff0000000000009001020000020000005053796d626f6c00008f0d0a455695ed775f95ed77d067ef778f0d +0a4500000a00040000002d01010004000000f001000007000000210502006e20090002000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 |= cos}{\i\f3\insrsid6909422 \'79}{\insrsid6909422 ), }{\i\f3\insrsid6909422 \'71}{ +\dn4\insrsid6909422 max}{\insrsid6909422 the maximum aperture angle included in the reconstruction theta_max = }{\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 +\f36\fs20\dn8\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\object\objemb\rsltmerge\objw420\objh240{\*\objclass Equation.3}{\*\objdata 01050000020000000b0000004571756174696f6e2e330000000000000000001e000000 +02000101000a01028471030f01000b0112826d128261128278001100000001050000050000000d0000004d45544146494c455049435400cc02000019feffff3c0300000800cc02e7010000 +0100090000039a01000007001c00000000000400000003010800050000000b0200000000050000000c027400aa00040000002e0118001c000000fb021000070000000000bc02000000000102022253797374656d0000aa00000004b81100e172c730181022000c020000aa000000040000002d0100000400000002010100 +050000000902000000021c000000fb029cff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d010100030000001e000700000016047300a90000000000030000001e00040000002c010000030000001e00030000001e0008000000fa02 +00000000000000000000040000002d01020007000000fc020000ffffff000000040000002d010300040000002e01000005000000090200000000050000000102ffffff000400000004010d001c000000fb02bffc0000000000009001000000000740001254696d6573204e657720526f6d616e0000000000000000000000 +000000000000040000002d0104000400000004010d00040000002e011800040000000201010005000000090200000000050000000102ffffff00030000001e001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01 +050009000000320a5100080001000000712b2a001c000000fb02c6ff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00105000c000000320a61003a00030000006d6178002a0019002100040000002701ffff0400 +00002d010200040000002d010300040000002d01010004000000f0010600040000002d010300040000002d010200040000002701ffff1c000000fb0285003a0000000000bc02000000000102022253797374656d00009b99807cfc112200fc112200f4eb160018102200685ec730040000002d01050004000000f0010400 +040000002701ffff040000002701ffff040000002701ffff0d000000320a5100af000100040000000000a9007300202b2d00040000002d010000030000000000}{\result {\dn8\insrsid3752688 {\pict{\*\picprop\shplid1035{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw741\pich423\picwgoal420\pichgoal240\wmetafile8\bliptag365665531\blipupi119{\*\blipuid 15cb9cfb9429861a079744b348c128ce}0100090000039d00000002001c0000000000050000000b0200000000050000000c020c0015000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001020000020000005053796d626f6c00008b0f0a975695ed775f95ed77d067ef778b0f0a9700000a00040000002d0100000700000021050100710008000100 +1c000000fb02f9ff0000000000009001000000000000001054696d65730000002f100a295695ed775f95ed77d067ef772f100a2900000a00040000002d01010004000000f001000008000000210503006d6178ff0a0007000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}}}}{ +\insrsid6909422 = atan(r}{\dn4\insrsid6909422 s}{\insrsid6909422 *(maxdelta)/(2*R). The maximum ring difference }{\i\insrsid15669153 maxdelta}{\insrsid15669153 cannot}{\insrsid6909422 exceed the number of detectors rings minus two. }{\i\insrsid6909422 r +}{\i\dn4\insrsid6909422 s}{\insrsid6909422 , is the ring spacing and }{\i\insrsid6909422 R}{\insrsid6909422 the ring radius. +\par \tab Note thate there is no azimuthal angular dependence for the filter , which is a consequence of the rotational symmetry of the PET scanner around the }{\i\insrsid6909422 z}{\insrsid6909422 -axis. So }{\insrsid15669153 the Colsher }{\insrsid6909422 +filter depends only on }{\insrsid3752688 {\pict{\*\picprop\shplid1036{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}} +\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw318\pich388\picwgoal180\pichgoal220\wmetafile8\bliptag1095073183\blipupi119{\*\blipuid 41457d9ff1c65f42543d2ac84bc923e7} +010009000003a300000002001c0000000000050000000b0200000000050000000c020b0009000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d5420457874726100100a885695ed775f95ed77d067ef774d100a8800000a00040000002d010000070000002105020020200b000000 +07000000210502007220010003001c000000fb02f6ff0000000000009001020000020000005053796d626f6c000063050a1d5695ed775f95ed77d067ef776305 +0a1d00000a00040000002d01010004000000f001000007000000210502006e20090002000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 , and not on (}{\i\f3\insrsid6909422 \'66}{\f3\insrsid6909422 \'20\'2c}{\i\f3\insrsid6909422 +\'71}{\f3\insrsid6909422 \'20\'29\'2e +\par }\pard\plain \qc \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\pard\plain \qc \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\f8\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\object\objemb\objw9506\objh7454{\*\objclass Word.Picture.8}{\*\objdata 01050000020000000f000000576f72642e506963747572652e3800000000000000000000080400 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000050000000100000000000000001000000200000001000000feffffff00000000000000002e0000002f00000030000000fa010000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff2d000000fefffffffeffffff05000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e00 +00001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c000000fefffffff1010000fdfffffffdfffffffdffffff32000000330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d000000 +3e0000003f000000400000004100000042000000430000004400000045000000460000004700000048000000490000004a0000004b0000004c0000004d0000004e0000004f000000500000005100000052000000530000005400000055000000560000005700000058000000590000005a0000005b0000005c0000005d00 +00005e0000005f000000600000006100000062000000630000006400000065000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e0000006f000000700000007100000072000000730000007400000075000000760000007700000078000000790000007a0000007b0000007c000000 +7d0000007e0000007f0000008000000052006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff040000000709020000000000c000000000000046000000000000000000000000604f +e64611d3c40103000000000100000000000001004f006c00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +000000000000000000000000140000000000000031005400610062006c006500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0002010100000003000000ffffffff0000000000000000000000000000000000000000000000000000 +00000000000000000000040000003e51000000000000010043006f006d0070004f0062006a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000201ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000010000006800000000000000feffffff02000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100feff030a0000ffffffff0709020000000000c0000000000000461700 +00004d6963726f736f667420576f72642050696374757265000a0000004d53576f7264446f63000f000000576f72642e506963747572652e3800f439b2710000000000000000000000009a2f0d42251b0d42070000000a000000030000004c000000000003000400000000000000ffffffffffffffff540000006d006100 +78000000050000000300000004000000220000000c000000ffffffff250000000c00000007000080250000000c00000000000080300000000c0000000f000080250000000c000000010000004b000000100000000000000005000000280000000c00000004000000250000000c00000000000080250000000c0000000700 +0080220000000c000000ffffffff250000000c0000000d000080280000000c00000002000000220000000c000000ffffffff220000000c000000ffffffff4600000014000000080000004744494303000000220000000c000000ffffffff54000000540000000000000000000000ffffffffffffffff01000000dd898740 +39768740af00000051000000010000004c000000040000000000000000000000a90000007300000014000f000a00010069000f000300000000000000000030000040f1ff020030000c0006004e006f0072006d0061006c0000000200000010005f4801046d48090873480908744809040000000000000000000000000000 +000000003c004140f2ffa1003c000c001600440065006600610075006c0074002000500061007200610067007200610070006800200046006f006e007400000000000000000000000000000000000300000006000000090000000c000000110000003e0000004100000044000000490000004c0000004f00000054000000 +810000009b000000b0000000be000000c1000000c40000004601000001000000000000000000ffffffff030400000000000001000000000000000000ffffffff040400000000000001000000000000000000ffffffff060400000000000001000000000000000000ffffffff070400000000000001000000000000000000 +ffffffff080400000000000001000000000000000000ffffffff310400000000000001000000000000000000ffffffff340400000000000001000000000000000000ffffffff350400000000000001000000000000000000ffffffff360400000000000001000000000000000000ffffffff3a0400000000000001000000 +000000000000ffffffff3b0400000000000001000000000000000000ffffffff3c0400000000000001000000000000000000ffffffff3f0400000000000001000000000000000000ffffffff420400000000000001000000000000000000ffffffff430400000000000001000000000000000000ffffffff460400000000 +000001000000000000000000ffffffff4b0400000000000001000000000000000000ffffffff8c04000000000000ffffffff000000000000000000000000000000000000000000000300000006000000090000000c000000110000003e0000004100000044000000490000004c0000004f00000054000000810000009b00 +0000b0000000be000000c1000000c4000000c70000000000000000000100000000000200000000000300000000000400000000000500000000000600000000000700000000000800000000000900000000000a00000000000b00000000000c00000000000d00000000000e00000000000f00000000001000000000001100 +00000000ffff0000000000000000460100000a00001000000600ffffffff010000000420ffff01004056c300000000000000000046010000000000000000000400004606000004000000000400001b0600004606000005000000070000000004000045060000060000000f0000f0dc030000000006f01800000095040000 +02000000940000000100000001000000950000005f0101f09c030000320007f02400000003045bc41365b9ac9e2f89b0939272305757ff000f08000000000000ffffffff00009907720007f0240000000707f7355eddcba9ce050131cffe15e004aeff0069000000090000002a10000000009907720007f0240000000707 +882d3856588dba2a3098eae5741d25e9ff00690000000f0000009310000000009907720007f0240000000707c2064c9313ea80c3f925f36d11274317ff006900000004000000fc10000000009907720007f0240000000707e15f66e670d1103cac18f143b750ddd1ff0069000000020000006511000000009907220007f0 +2400000002049e2c64036a925739ffb631965211997dff00be00000002000000ce11000000009907220007f0240000000204af72de99f7573f1b7a231af24b840fa0ff00be000000020000008c12000000009907220007f0240000000204defb7bc273b37f6d22b67a6fd2148d1aff00be000000020000004a1300000000 +9907220007f024000000020479b1d31c6c78051d55f0198933edb07aff00be000000010000000814000000009907220007f0240000000204f2bcd1396c7e72625fae8dc2b376026dff00be00000001000000c614000000009907220007f0240000000204e42b72c2dd104a9ea6784cdcc47b69ccff00be00000001000000 +8415000000009907220007f02400000002048351c1ede677c2a1a35858a8f7782452ff00be000000010000004216000000009907220007f0240000000204ba81d8470ded384707175331f4f713e1ff00be000000010000000017000000009907220007f02400000002041406be0e4330f028b4842cf031c90c72ff00be00 +000001000000be17000000009907220007f0240000000204d33427b288d1852f38f2a21f3cca13d5ff00be000000010000007c18000000009907220007f02400000002040fe9d1efc9df8dfaa9004f9f15249840ff00be000000010000003a19000000009907220007f02400000002042fcf9fd73d7b01d5aacd533e8cc7 +3a76ff00c000000001000000f819000000009907720007f024000000070787e1c598c8582827d388303de4319d40ff006900000001000000b81a000000009907720007f02400000007071e2e7007831c9a15b9dddcb961954d4fff006900000002000000211b000000009907220007f0240000000204bfdd6c7b65df8258 +8437082b732e12f6ff00be000000010000008a1b000000009907220007f024000000020426c9a2885e03461c5dbfbca586f47ba5ff00c000000001000000481c00000000990740001ef110000000ffff00000000ff0080808000f7000010000f0002f034360000100008f00800000080000000940400000f0003f0aa3500 +000f0004f028000000010009f0100000000000000000000000000000000000000002000af00800000000040000050000000f0004f07200000012000af00800000003040000000a000093000bf036000000800000000100810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100 +001000ff0100000800000010f0040000007e000000000011f0040000000100000000000df004000000000001000f0004f07200000012000af00800000004040000000a000093000bf036000000800000000200810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff +0100000800000010f0040000007d000000000011f0040000000100000000000df004000000000002000f0004f07200000012000af00800000006040000000a000093000bf036000000800000000300810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff01000008 +00000010f0040000007c000000000011f0040000000100000000000df004000000000003000f0004f07200000012000af00800000007040000000a000093000bf036000000800000000400810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff0100000800000010 +f0040000007b000000000011f0040000000100000000000df004000000000004000f0004f07200000012000af00800000008040000000a000093000bf036000000800000000500810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff0100000800000010f0040000 +007a000000000011f0040000000100000000000df004000000000005000f0004f03c00000042010af0080000000a040000c00a000023000bf00c000000cb019c310000ff0108000800000010f00400000079000000000011f004000000010000000f0004f03c00000042010af0080000000b040000800a000023000bf00c +000000cb019c310000ff0108000800000010f00400000078000000000011f004000000010000000f0004f03c00000042010af0080000000c040000c00a000023000bf00c000000cb019c310000ff0108000800000010f00400000077000000000011f004000000010000000f0004f03c00000042010af0080000000d0400 +00800a000023000bf00c000000cb019c310000ff0108000800000010f00400000076000000000011f004000000010000000f0004f0d200000032010af0080000000e040000000a000093000bf0a20000004201a90f000045c14e0000004701910a0a01480198b114014901d305000051c11e000000bf0100001000cb019c +310000ff010800080009000c00080073b1ffff00000000335a0000c0a800000000000034000000a90f00009300000073b1ffff00000000335a0000c0a800000000000034000000a90f000093000000d3050000605400000300040008000000000034000000a90f000093000000d305000060540000000010f00400000075 +000000000011f004000000010000000f0004f04200000012000af0080000000f040000000a000033000bf012000000bf0110001000cb019c310000ff0108000800000010f00400000074000000000011f004000000010000000f0004f05400000012000af00800000010040000000a000063000bf0240000008001020000 +00810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000073000000000011f004000000010000000f0004f04200000012000af00800000011040000000a000033000bf012000000bf0110001000cb019c310000ff0108000800000010f00400000072000000000011f00400000001 +0000000f0004f05400000012000af00800000012040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000071000000000011f004000000010000000f0004f05400000012000af00800000013040000000a000063000bf0240000 +00800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000070000000000011f004000000010000000f0004f04200000012000af00800000014040000000a000033000bf012000000bf0110001000cb019c310000ff0108000800000010f0040000006f000000000011 +f004000000010000000f0004f05400000012000af00800000015040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f0040000006e000000000011f004000000010000000f0004f05400000012000af00800000016040000000a000063 +000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f0040000006d000000000011f004000000010000000f0004f04200000012000af00800000017040000000a000033000bf012000000bf0110001000cb019c310000ff0108000800000010f0040000006c +000000000011f004000000010000000f0004f05400000012000af00800000018040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f0040000006b000000000011f004000000010000000f0004f05400000012000af008000000190400 +00000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f0040000006a000000000011f004000000010000000f0004f04200000012000af0080000001a040000000a000033000bf012000000bf0110001000cb019c310000ff0108000800000010 +f00400000069000000000011f004000000010000000f0004f05400000012000af0080000001b040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000068000000000011f004000000010000000f0004f05400000012000af008 +0000001c040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000067000000000011f004000000010000000f0004f04200000012000af0080000001d040000000a000033000bf012000000bf0110001000cb019c310000ff0108 +000800000010f00400000066000000000011f004000000010000000f0004f05400000012000af0080000001e040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000065000000000011f004000000010000000f0004f0540000 +0012000af0080000001f040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000064000000000011f004000000010000000f0004f04200000012000af00800000020040000000a000033000bf012000000bf0110001000cb019c +310000ff0108000800000010f00400000063000000000011f004000000010000000f0004f05400000012000af00800000021040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000062000000000011f004000000010000000f +0004f05400000012000af00800000022040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f00400000061000000000011f004000000010000000f0004f04200000012000af00800000023040000000a000033000bf012000000bf0110 +001000cb019c310000ff0108000800000010f00400000060000000000011f004000000010000000f0004f05400000012000af00800000024040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f0040000005f000000000011f0040000 +00010000000f0004f05400000012000af00800000025040000000a000063000bf024000000800102000000810100000000864103000000bf0110001000cb019c310000ff0108000800000010f0040000005e000000000011f004000000010000000f0004f04200000012000af00800000026040000000a000033000bf012 +000000bf0110001000cb019c310000ff0108000800000010f0040000005d000000000011f004000000010000000f0004f0c200000002000af00800000027040000000a0000f3000bf0920000004201180100004301ef05000044010400000045c11400000046c11e0000007f010100010080010200000081010000000086 +4104000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff000000007800ef051801000018010000000000000c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f0040000005c000000000011f004000000010000000f0004f0c2 +00000002000af00800000028040000000a0000f3000bf09200000042012d01000043010206000044010400000045c11400000046c11e0000007f0101000100800102000000810100000000864104000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff000002 +068d0000002d0102062d010206000002060c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f0040000005b000000000011f004000000010000000f0004f0c200000002000af00800000029040000000a0000f3000bf09200000042012d01000043010206000044010400000045c1140000 +0046c11e0000007f0101000100800102000000810100000000864104000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff00000206a00000002d0102062d010206000002060c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010 +f0040000005a000000000011f004000000010000000f0004f0c200000002000af0080000002a040000000a0000f3000bf09200000042012d0100004301ef05000044010400000045c11400000046c11e0000007f0101000100800102000000810100000000864104000000bf0110001000c00100000000c40100000000cb +019c310000ce0100000000ff011800180005000500f0ff00000000a000ef052d0100002d010000000000000c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f00400000059000000000011f004000000010000000f0004f0c200000002000af0080000002b040000000a0000f3000bf092 +0000004201111300004301ef05000044010400000045c11400000046c11e0000007f0101000100800102000000810100000000864105000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff00000000111300007409ef057409ef05000000000c001000020000 +4000ac010000ac010000ac010000ac010000ac01600080000010f00400000058000000000011f004000000010000000f0004f0e200000002000af0080000002c040000000a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a0000007f01010001008001020000008101000000 +00864102000000bf0110001000ff011000180008000c000800045d060094560200045d060000000000785c06008056020000000000b06909005d680d005f040000c10d0000b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000 +ac01600080000010f00400000057000000000011f004000000010000000f0004f0e200000002000af0080000002d040000000a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a0000007f0101000100800102000000810100000000864102000000bf0110001000ff01100018 +0008000c000800045d060094560200045d060000000000785c06008056020000000000b06909005d680d005f040000c10d0000b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01600080000010f0040000005600000000 +0011f004000000010000000f0004f0c200000002000af0080000002e040000000a0000f3000bf0920000004201fd12000043010206000044010400000045c11400000046c11e0000007f0101000100800102000000810100000000864105000000bf0110001000c00100000000c40100000000cb019c310000ce01000000 +00ff011800180005000500f0ff00000206fd1202066009000060090000000002060c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f00400000055000000000011f004000000010000000f0004f0e200000002000af00800000030040000000a0000b3000bf0b200000042019c5a0d0043 +01b069090044010400000045c14600000046c12a0000007f0101000100800102000000810100000000864102000000bf0110001000ff011000180008000c000800434f060094560200434f060000000000b74e060080560200cb4e0600d6ec03009c5a0d005f04000000000000b0690900e7fb030027590200434f060094 +560200120014000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01600080000010f00400000054000000000011f004000000010000000f0004f07200000012000af00800000031040000000a000093000bf03600000080000000060081000000000082000000000083000000000084 +0000000000850002000000bf0012001b00bf0100001000ff0100000800000010f00400000053000000000011f0040000000100000000000df004000000000006000f0004f07200000012000af00800000034040000000a000093000bf0360000008000000007008100000000008200000000008300000000008400000000 +00850002000000bf0012001b00bf0100001000ff0100000800000010f00400000052000000000011f0040000000100000000000df004000000000007000f0004f07200000012000af00800000035040000000a000093000bf036000000800000000800810000000000820000000000830000000000840000000000850002 +000000bf0012001b00bf0100001000ff0100000800000010f00400000051000000000011f0040000000100000000000df004000000000008000f0004f07200000012000af00800000036040000000a000093000bf036000000800000000900810000000000820000000000830000000000840000000000850002000000bf +0012001b00bf0100001000ff0100000800000010f00400000050000000000011f0040000000100000000000df004000000000009000f0004f07200000012000af0080000003a040000000a000093000bf036000000800000000a00810000000000820000000000830000000000840000000000850002000000bf0012001b +00bf0100001000ff0100000800000010f0040000004f000000000011f0040000000100000000000df00400000000000a000f0004f07200000012000af0080000003b040000000a000093000bf036000000800000000b00810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100 +001000ff0100000800000010f0040000004e000000000011f0040000000100000000000df00400000000000b000f0004f07200000012000af0080000003c040000000a000093000bf036000000800000000c00810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff +0100000800000010f0040000004d000000000011f0040000000100000000000df00400000000000c000f0004f07200000012000af0080000003f040000000a000093000bf036000000800000000d00810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff01000008 +00000010f0040000004c000000000011f0040000000100000000000df00400000000000d000f0004f07200000012000af00800000042040000000a000093000bf036000000800000000e00810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff0100000800000010 +f0040000004b000000000011f0040000000100000000000df00400000000000e000f0004f07200000012000af00800000043040000000a000093000bf036000000800000000f00810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff0100000800000010f0040000 +004a000000000011f0040000000100000000000df00400000000000f000f0004f07200000012000af00800000046040000000a000093000bf036000000800000001000810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff0100000800000010f004000000490000 +00000011f0040000000100000000000df004000000000010000f0004f0d200000032010af00800000049040000000a000093000bf0a20000004201ac10000045c14e0000004701206107014801f8b812014901ba09000051c11e000000bf0100001000cb019c310000ff010800080009000c0008005ab5ffff000000001a +5e0000c0a800000000000090000000ac100000490000005ab5ffff000000001a5e0000c0a800000000000090000000ac10000049000000ba090000605400000300040008000000000090000000ac10000049000000ba09000060540000000010f00400000048000000000011f004000000010000000f0004f03c00000012 +000af0080000004a040000000a000023000bf00c000000bf0110001000ff0100000800000010f00400000047000000000011f004000000010000000f0004f07200000012000af0080000004b040000000a000093000bf0360000008000000011008100000000008200000000008300000000008400000000008500020000 +00bf0012001b00bf0100001000ff0100000800000010f00400000046000000000011f0040000000100000000000df004000000000011000f0004f042000000b2040af0080000004e040000000a000033000bf012000000044106000000bf0100001000ff0100000800000010f00400000045000000000011f00400000001 +0000000f0004f042000000b2040af0080000004f040000000a000033000bf012000000044107000000bf0100001000ff0100000800000010f00400000044000000000011f004000000010000000f0004f042000000b2040af00800000050040000000a000033000bf012000000044108000000bf0100001000ff01000008 +00000010f00400000043000000000011f004000000010000000f0004f042000000b2040af00800000051040000000a000033000bf012000000044109000000bf0100001000ff0100000800000010f00400000042000000000011f004000000010000000f0004f042000000b2040af00800000052040000000a000033000b +f01200000004410a000000bf0100001000ff0100000800000010f00400000041000000000011f004000000010000000f0004f042000000b2040af00800000053040000000a000033000bf01200000004410b000000bf0100001000ff0100000800000010f00400000040000000000011f004000000010000000f0004f042 +000000b2040af00800000054040000000a000033000bf01200000004410c000000bf0100001000ff0100000800000010f0040000003f000000000011f004000000010000000f0004f042000000b2040af00800000055040000000a000033000bf01200000004410d000000bf0100001000ff0100000800000010f0040000 +003e000000000011f004000000010000000f0004f042000000b2040af00800000056040000000a000033000bf01200000004410e000000bf0100001000ff0100000800000010f0040000003d000000000011f004000000010000000f0004f042000000b2040af00800000057040000000a000033000bf01200000004410f +000000bf0100001000ff0100000800000010f0040000003c000000000011f004000000010000000f0004f042000000b2040af00800000058040000000a000033000bf012000000044110000000bf0100001000ff0100000800000010f0040000003b000000000011f004000000010000000f0004f042000000b2040af008 +00000059040000000a000033000bf012000000044106000000bf0100001000ff0100000800000010f0040000003a000000000011f004000000010000000f0004f042000000b2040af0080000005a040000000a000033000bf012000000044107000000bf0100001000ff0100000800000010f00400000039000000000011 +f004000000010000000f0004f042000000b2040af0080000005b040000000a000033000bf012000000044108000000bf0100001000ff0100000800000010f00400000038000000000011f004000000010000000f0004f042000000b2040af0080000005c040000000a000033000bf012000000044111000000bf01000010 +00ff0100000800000010f00400000037000000000011f004000000010000000f0004f0bc00000002000af0080000005d040000000a0000e3000bf08c0000004201b400000043017700000044010400000045c11400000046c11e0000007f0101000100800100000000810100000000bf0110001000c00100000000c40100 +000000cb019c310000ce0100000000ff011800180005000500f0ffb4003c000000770000003c0000000000b4003c000c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f00400000036000000000011f004000000010000000f0004f05400000012000af0080000005e040000000a000063 +000bf024000000800102000000810100000000864112000000bf0110001000cb019c310000ff0108000800000010f00400000035000000000011f004000000010000000f0004f0e200000002000af0080000005f040000000a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a +0000007f0101000100800102000000810100000000864102000000bf0110001000ff011000180008000c000800045d060094560200045d060000000000785c06008056020000000000b06909005d680d005f040000c10d0000b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000 +ac010000ac010000ac010000ac010000ac010000ac01600080000010f00400000034000000000011f004000000010000000f0004f0e200000002000af00800000060040000000a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a0000007f0101000100800102000000810100 +000000864102000000bf0110001000ff011000180008000c000800045d060094560200045d060000000000785c06008056020000000000b06909005d680d005f040000c10d0000b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac01 +0000ac01600080000010f00400000033000000000011f004000000010000000f0004f05400000012000af00800000061040000000a000063000bf024000000800102000000810100000000864113000000bf0110001000cb019c310000ff0108000800000010f00400000032000000000011f004000000010000000f0004 +f0e200000002000af00800000062040000000a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a0000007f0101000100800102000000810100000000864102000000bf0110001000ff011000180008000c000800045d060094560200045d060000000000785c06008056020000 +000000b06909005d680d005f040000c10d0000b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01600080000010f00400000031000000000011f004000000010000000f0004f0e200000002000af0080000006304000000 +0a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a0000007f0101000100800102000000810100000000864102000000bf0110001000ff011000180008000c000800045d060094560200045d060000000000785c06008056020000000000b06909005d680d005f040000c10d00 +00b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000ac01600080000010f00400000030000000000011f004000000010000000f0004f03c00000042010af00800000064040000000a000023000bf00c000000cb019c310000ff +0108000800000010f0040000002f000000000011f004000000010000000f0004f03c00000042010af00800000065040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000002e000000000011f004000000010000000f0004f03c00000042010af00800000066040000000a000023000bf00c +000000cb019c310000ff0108000800000010f0040000002d000000000011f004000000010000000f0004f03c00000042010af00800000067040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000002c000000000011f004000000010000000f0004f03c00000042010af008000000680400 +00000a000023000bf00c000000cb019c310000ff0108000800000010f0040000002b000000000011f004000000010000000f0004f03c00000042010af00800000069040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000002a000000000011f004000000010000000f0004f03c00000042 +010af0080000006a040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000029000000000011f004000000010000000f0004f03c00000042010af0080000006b040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000028000000000011f004000000010000 +000f0004f03c00000042010af0080000006c040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000027000000000011f004000000010000000f0004f03c00000042010af0080000006d040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000002600000000 +0011f004000000010000000f0004f03c00000042010af0080000006e040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000025000000000011f004000000010000000f0004f03c00000042010af0080000006f040000000a000023000bf00c000000cb019c310000ff0108000800000010 +f00400000024000000000011f004000000010000000f0004f03c00000042010af00800000070040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000023000000000011f004000000010000000f0004f03c00000042010af00800000071040000000a000023000bf00c000000cb019c3100 +00ff0108000800000010f00400000022000000000011f004000000010000000f0004f03c00000042010af00800000072040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000021000000000011f004000000010000000f0004f05400000012000af00800000073040000000a000063000b +f024000000800102000000810100000000864113000000bf0110001000cb019c310000ff0108000800000010f00400000020000000000011f004000000010000000f0004f0e200000002000af00800000074040000000a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a0000 +007f0101000100800102000000810100000000864102000000bf0110001000ff011000180008000c000800045d060094560200045d060000000000785c06008056020000000000b06909005d680d005f040000c10d0000b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000ac01 +0000ac010000ac010000ac010000ac010000ac01600080000010f0040000001f000000000011f004000000010000000f0004f0e200000002000af00800000075040000000a0000b3000bf0b200000042015d680d004301b069090044010400000045c14600000046c12a0000007f01010001008001020000008101000000 +00864102000000bf0110001000ff011000180008000c000800045d060094560200045d060000000000785c06008056020000000000b06909005d680d005f040000c10d0000b0690900a809040027590200045d060094560200120014000200004000ac010000ac010000ac010000ac010000ac010000ac010000ac010000 +ac01600080000010f0040000001e000000000011f004000000010000000f0004f03c00000042010af00800000076040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000001d000000000011f004000000010000000f0004f03c00000042010af00800000077040000000a000023000bf00c +000000cb019c310000ff0108000800000010f0040000001c000000000011f004000000010000000f0004f03c00000042010af00800000078040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000001b000000000011f004000000010000000f0004f03c00000042010af008000000790400 +00000a000023000bf00c000000cb019c310000ff0108000800000010f0040000001a000000000011f004000000010000000f0004f03c00000042010af0080000007a040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000019000000000011f004000000010000000f0004f03c00000042 +010af0080000007b040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000018000000000011f004000000010000000f0004f03c00000042010af0080000007c040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000017000000000011f004000000010000 +000f0004f03c00000042010af0080000007d040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000016000000000011f004000000010000000f0004f03c00000042010af0080000007e040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000001500000000 +0011f004000000010000000f0004f03c00000042010af0080000007f040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000014000000000011f004000000010000000f0004f03c00000042010af00800000080040000000a000023000bf00c000000cb019c310000ff0108000800000010 +f00400000013000000000011f004000000010000000f0004f03c00000042010af00800000081040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000012000000000011f004000000010000000f0004f03c00000042010af00800000082040000000a000023000bf00c000000cb019c3100 +00ff0108000800000010f00400000011000000000011f004000000010000000f0004f03c00000042010af00800000083040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000010000000000011f004000000010000000f0004f03c00000042010af00800000084040000000a000023000b +f00c000000cb019c310000ff0108000800000010f0040000000f000000000011f004000000010000000f0004f03c00000042010af00800000085040000c00a000023000bf00c000000cb019c310000ff0108000800000010f0040000000e000000000011f004000000010000000f0004f0bc00000002000af00800000086 +040000000a0000e3000bf08c0000004201b500000043017800000044010400000045c11400000046c11e0000007f0101000100800100000000810100000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff00000000b5000000a1003c008d007800000000000c +0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f0040000000d000000000011f004000000010000000f0004f042000000b2040af00800000087040000000a000033000bf012000000044114000000bf0100001000ff0100000800000010f0040000000c000000000011f004000000010000 +000f0004f042000000b2040af00800000088040000000a000033000bf012000000044115000000bf0100001000ff0100000800000010f0040000000b000000000011f004000000010000000f0004f03c00000042010af00800000089040000000a000023000bf00c000000cb019c310000ff0108000800000010f0040000 +000a000000000011f004000000010000000f0004f0bc00000002000af0080000008a040000000a0000e3000bf08c00000042017800000043017800000044010400000045c11400000046c11e0000007f0101000100800100000000810100000000bf0110001000c00100000000c40100000000cb019c310000ce01000000 +00ff011800180005000500f0ff3c000000000078003c005000780078003c0000000c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f00400000009000000000011f004000000010000000f0004f0bc00000002000af0080000008b040000000a0000e3000bf08c00000042017800000043 +017800000044010400000045c11400000046c11e0000007f0101000100800100000000810100000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff3c007800000000003c002800780000003c0078000c0010000200004000ac010000ac010000ac010000ac01 +0000ac01600080000010f00400000008000000000011f004000000010000000f0004f07200000012000af0080000008c040000000a000093000bf036000000800000001200810000000000820000000000830000000000840000000000850002000000bf0012001b00bf0100001000ff0100000800000010f00400000007 +000000000011f0040000000100000000000df004000000000012000f0004f03c00000042010af0080000008e040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000006000000000011f004000000010000000f0004f03c00000042010af0080000008f040000000a000023000bf00c0000 +00cb019c310000ff0108000800000010f00400000005000000000011f004000000010000000f0004f03c00000042010af00800000090040000400a000023000bf00c000000cb019c310000ff0108000800000010f00400000004000000000011f004000000010000000f0004f0bc00000002000af0080000009104000000 +0a0000e3000bf08c0000004201b400000043018c00000044010400000045c11400000046c11e0000007f0101000100800100000000810100000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff00008c008c000000a0003c00b400780000008c000c00100002 +00004000ac010000ac010000ac010000ac010000ac01600080000010f00400000003000000000011f004000000010000000f0004f03c00000042010af00800000092040000000a000023000bf00c000000cb019c310000ff0108000800000010f00400000002000000000011f004000000010000000f0004f0bc00000002 +000af00800000093040000000a0000e3000bf08c00000042013d00000043015000000044010400000045c11400000046c11e0000007f0101000100800100000000810100000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff000028003d0050003d0028003d +000000000028000c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f00400000001000000000011f004000000010000000f0004f0bc00000002000af00800000094040000000a0000e3000bf08c00000042013c00000043015000000044010400000045c11400000046c11e0000007f0101 +000100800100000000810100000000bf0110001000c00100000000c40100000000cb019c310000ce0100000000ff011800180005000500f0ff3c0028000000500000002800000000003c0028000c0010000200004000ac010000ac010000ac010000ac010000ac01600080000010f00400000000000000000011f0040000 +00010000000f0004f04200000012000af00800000001040000000e000053000bf01e000000bf0100001000cb0100000000ff01000008000403090000003f0301000100000011f004000000010000002f0005f020000000000014f008000000010000000e040000000014f008000000020000004904000000000000010000 +0002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f0000002000000021 +00000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f000000400000 +004100000042000000430000004400000045000000460000004700000048000000490000004a0000004b0000004c0000004d0000004e0000004f000000500000005100000052000000530000005400000055000000560000005700000058000000590000005a0000005b0000005c0000005d0000005e0000005f00000060 +0000006100000062000000630000006400000065000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e0000006f000000700000007100000072000000730000007400000075000000760000007700000078000000790000007a0000007b0000007c0000007d0000007e000000460100 +0094040000290a0000261a0000650a0000761a00007400000000009304000038090000261a000075090000761a000074000000000092040000750900004e1a0000290a00004f1a0000740000000000910400002d1a0000600f0000e11a0000ec0f000074000000000090040000cd1a0000980e0000261d0000b00f000074 +00000000008f040000650a0000d6190000660a0000ee1a00007400000000008e04000038090000d619000039090000ee1a00007400000000008c040000a0050000e80e0000a4060000501000007400000000008b0400004006000030120000b8060000a81200007400000000008a04000040060000b90c0000b806000031 +0d0000740000000000890400007c060000090d00007d0600005812000074000000000088040000bc070000550c0000c5090000310d00007400000000008704000018060000550c000098080000310d000074000000000086040000a91b0000061700005e1c00007e170000740000000000850400004a1c0000421700007e +1f00006e18000074000000000084040000650a0000aa180000660a0000d619000074000000000083040000a50b0000aa180000a60b0000d619000074000000000082040000a9110000aa180000aa110000d6190000740000000000810400007d100000aa1800007e100000d619000074000000000080040000110e0000aa +180000120e0000d61900007400000000007f0400003d0f0000aa1800003e0f0000d61900007400000000007e040000e50c0000aa180000e60c0000d61900007400000000007d040000ed130000aa180000ee130000d61900007400000000007c0400002d150000aa1800002e150000d61900007400000000007b04000031 +1b0000aa180000321b0000d61900007400000000007a040000051a0000aa180000061a0000d61900007400000000007904000099170000aa1800009a170000d619000074000000000078040000c5180000aa180000c6180000d6190000740000000000770400006d160000aa1800006e160000d619000074000000000076 +040000d5120000aa180000d6120000d61900007400000000007504000014a4f9ff0caafdff710c0700bc1307007400000000007404000014a4f9ff0caafdff710c0700bc1307007400000000007304000042090000b4180000681c0000e019000074000000000072040000650a00008d0b0000660a0000b90c0000740000 +00000071040000a50b00008d0b0000a60b0000b90c000074000000000070040000a91100008d0b0000aa110000b90c00007400000000006f0400007d1000008d0b00007e100000b90c00007400000000006e040000110e00008d0b0000120e0000b90c00007400000000006d0400003d0f00008d0b00003e0f0000b90c00 +007400000000006c040000e50c00008d0b0000e60c0000b90c00007400000000006b040000ed1300008d0b0000ee130000b90c00007400000000006a0400002d1500008d0b00002e150000b90c000074000000000069040000311b00008d0b0000321b0000b90c000074000000000068040000051a00008d0b0000061a00 +00b90c000074000000000067040000991700008d0b00009a170000b90c000074000000000066040000c51800008d0b0000c6180000b90c0000740000000000650400006d1600008d0b00006e160000b90c000074000000000064040000d51200008d0b0000d6120000b90c00007400000000006304000014a4f9ff0caafd +ff710c0700bc1307007400000000006204000014a4f9ff0caafdff710c0700bc1307007400000000006104000057090000970b0000681c0000c30c00007400000000006004000014a4f9ff0caafdff710c0700bc1307007400000000005f04000014a4f9ff0caafdff710c0700bc1307007400000000005e040000570900 +00970b0000681c0000c30c00007400000000005d040000f21e00006c120000a61f0000e31200007400000000005c0400003a1d0000441200006a1f00001f1300007400000000005b040000951b000044120000161e00001f1300007400000000005a040000f119000044120000721c00001f130000740000000000590400 +004d18000044120000cd1a00001f13000074000000000058040000a916000044120000291900001f130000740000000000570400000515000044120000851700001f130000740000000000560400006113000044120000e11500001f13000074000000000055040000bd110000441200003d1400001f1300007400000000 +00540400001910000044120000991200001f13000074000000000053040000750e000044120000f51000001f13000074000000000052040000d10c000044120000510f00001f130000740000000000510400002d0b000044120000ad0d00001f130000740000000000500400008909000044120000090c00001f13000074 +00000000004f040000e407000044120000650a00001f1300007400000000004e0400004006000044120000c00800001f1300007400000000004b0400007e1f0000a7120000462000000f1400007400000000004a0400002e1f0000a8120000962000000f14000074000000000049040000ce1a000040090000ae1c0000bc +12000074000000000046040000761d00000c0e00003a220000240f0000740000000000430400008a1d00005e190000de230000761a000074000000000042040000fe1c00006e180000ba240000861900007400000000003f040000590c0000651b00001a1a00007d1c00007400000000003c040000711200003c10000001 +140000541100007400000000003b0400000d1200003c100000e9120000541100007400000000003a040000a91100003c100000851200005411000074000000000036040000b1090000660600002d0b00007e070000740000000000350400004d09000066060000290a00007e07000074000000000034040000d40800003e +060000d8090000a607000074000000000031040000f50b0000e9090000a2190000010b000074000000000030040000d5b1f9ff0caafdff710c0700bc1307007400000000002e04000061090000a81200005e1c0000aa1800007400000000002d04000014a4f9ff0caafdff710c0700bc1307007400000000002c04000014 +a4f9ff0caafdff710c0700bc1307007400000000002b0400004d090000b90c00005e1c0000a81200007400000000002a040000311b0000b90c00005e1c0000a812000074000000000029040000311b0000a81200005e1c0000aa1800007400000000002804000038090000a8120000650a0000aa18000074000000000027 +0400004d090000b90c0000650a0000a812000074000000000026040000631b00001d1500009f1b00001d15000074000000000025040000eb1a00005a100000631b00001d15000074000000000024040000bf1900005a100000371a00001d150000740000000000230400000b1900001d150000471900001d150000740000 +000000220400007f1800005a1000000b1900001d15000074000000000021040000531700005a100000cb1700001d150000740000000000200400009f1600001d150000db1600001d1500007400000000001f040000271600005a1000009f1600001d1500007400000000001e040000fb1400005a100000731500001d1500 +007400000000001d040000471400001d150000831400001d1500007400000000001c040000bb1300005a100000471400001d1500007400000000001b0400008f1200005a100000071300001d1500007400000000001a040000db1100001d150000171200001d15000074000000000019040000631100005a100000db1100 +001d15000074000000000018040000371000005a100000af1000001d150000740000000000170400006f0f00001d150000bf0f00001d15000074000000000016040000f70e00005a1000006f0f00001d15000074000000000015040000cb0d00005a100000430e00001d15000074000000000014040000170d00001d1500 +00530d00001d150000740000000000130400009f0c00005a100000170d00001d15000074000000000012040000730b00005a100000eb0b00001d15000074000000000011040000ab0a00001d150000e70a00001d15000074000000000010040000330a00005a100000ab0a00001d1500007400000000000f040000570900 +005a100000541c00001d1500007400000000000e0400002409000004090000f00a0000b21200007400000000000d040000d11b000092070000d61c0000a81200007400000000000c040000a51a000092070000d11b0000a81200007400000000000b040000c50900007e070000050b0000a81200007400000000000a0400 +00fc08000092070000c5090000a812000074000000000008040000811b000066060000fd1c00007e070000740000000000070400001d1b000066060000f91b00007e07000074000000000006040000a51a00003e060000a91b0000a607000074000000000004040000d9090000891a0000790a0000a11b00007400000000 +000304000089090000611a0000510a0000c91b0000740000000000000000004c0000007f00000080000000ee000000f40000004701000007000400070007001c00070000000000800000008100000083000000840000008c0000008f000000c4000000c7000000cf000000d20000001b0100001e0100003e0100003f0100 +004701000007003a0007003a0007003a0007003a0007003a0007003a0007003a000700ff40008001007d0000007d000000e00f2005010001007d000000000000000000000000000000021c000000000000000001000046010000a000000400000000a000000c00400000ffff01000000070055006e006b006e006f007700 +6e00ffff0100080000000000000000000000ffff010000000000ffff00000200ffff00000000ffff00000200ffff000000000400000047169001000002020603050405020304873a0020000000000000000000000000ff01000000000000540069006d006500730020004e0065007700200052006f006d0061006e000000 +35169001020005050102010706020507000000000000001000000000000000000000008000000000530079006d0062006f006c000000332690010000020b0604020202020204873a0020000000000000000000000000ff0100000000000041007200690061006c00000033169001000002020603050405020304877a0000 +000000800800000000000000ff00000000000000540049004d00450053000000220004007108881800f0d00200006801000000008ef4794690f47946000000000200020000000000000000000000010001000000040003100100000000000000000000000100010000000100000000000000210300f01000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a506c007b400b40080003230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000020000000703000000000032831100f01000df03000000000000000000000000000000000000000000000000000000000000ffff120000000000000000000000000000000f004b00720069007300200054006800690065006c0065006d0061006e0073000f004b00 +720069007300200054006800690065006c0065006d0061006e0073000000000000000000000000000000000000000000cc0032000000400000002800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd0000007700000051000000a0000000b809000050070000e90900008f070000b8090000500700000000000000000000060000000800000050000000300000008000000020000000000000002000cc00320000004000000028000000080000000800000001000100000000002000000003004f0062006a004900 +6e0066006f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120002010200000006000000ffffffff0000000000000000000000000000000000000000000000000000000000000000000000000300000006000000000000004f0062006a006500 +6300740050006f006f006c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000101ffffffffffffffffffffffff0000000000000000000000000000000000000000604fe64611d3c401604fe64611d3c40100000000000000000000000002004f006c00 +65005000720065007300300030003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180002010500000008000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000031000000906103000000000057006f00 +7200640044006f00630075006d0065006e007400000000000000000000000000000000000000000000000000000000000000000000000000000000001a000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000e2010000081d0000000000008100 +000082000000830000008400000085000000860000008700000088000000890000008a0000008b0000008c0000008d0000008e0000008f000000900000009100000092000000930000009400000095000000960000009700000098000000990000009a0000009b0000009c0000009d0000009e0000009f000000a0000000 +a1000000a2000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000aa000000ab000000ac000000ad000000ae000000af000000b0000000b1000000b2000000b3000000b4000000b5000000b6000000b7000000b8000000b9000000ba000000bb000000bc000000bd000000be000000bf000000c000 +0000c1000000c2000000c3000000c4000000c5000000c6000000c7000000c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d0000000d1000000d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da000000db000000dc000000dd000000de000000df000000 +e0000000e1000000e2000000e3000000e4000000e5000000e6000000e7000000e8000000e9000000ea000000eb000000ec000000ed000000ee000000ef000000f0000000f1000000f2000000f3000000f4000000f5000000f6000000f7000000f8000000f9000000fa000000fb000000fc000000fd000000fe000000ff00 +0000000100000101000002010000030100000401000005010000060100000701000008010000090100000a0100000b0100000c0100000d0100000e0100000f010000100100001101000012010000130100001401000015010000160100001701000018010000190100001a0100001b0100001c0100001d0100001e010000 +1f010000200100002101000022010000230100002401000025010000260100002701000028010000290100002a0100002b0100002c0100002d0100002e0100002f010000300100003101000032010000330100003401000035010000360100003701000038010000390100003a0100003b0100003c0100003d0100003e01 +00003f010000400100004101000042010000430100004401000045010000460100004701000048010000490100004a0100004b0100004c0100004d0100004e0100004f010000500100005101000052010000530100005401000055010000560100005701000058010000590100005a0100005b0100005c0100005d010000 +5e0100005f010000600100006101000062010000630100006401000065010000660100006701000068010000690100006a0100006b0100006c0100006d0100006e0100006f010000700100007101000072010000730100007401000075010000760100007701000078010000790100007a0100007b0100007c0100007d01 +00007e0100007f010000800100008101000082010000830100008401000085010000860100008701000088010000890100008a0100008b0100008c0100008d0100008e0100008f010000900100009101000092010000930100009401000095010000960100009701000098010000990100009a0100009b0100009c010000 +9d0100009e0100009f010000a0010000a1010000a2010000a3010000a4010000a5010000a6010000a7010000a8010000a9010000aa010000ab010000ac010000ad010000ae010000af010000b0010000b1010000b2010000b3010000b4010000b5010000b6010000b7010000b8010000b9010000ba010000bb010000bc01 +0000bd010000be010000bf010000c0010000c1010000c2010000c3010000c4010000c5010000c6010000c7010000c8010000c9010000ca010000cb010000cc010000cd010000ce010000cf010000d0010000d1010000d2010000d3010000d4010000d5010000d6010000d7010000d8010000d9010000da010000db010000 +dc010000dd010000de010000df010000e0010000e1010000feffffffe3010000e4010000e5010000e6010000e7010000e8010000e9010000ea010000eb010000ec010000ed010000ee010000ef010000f0010000fefffffffefffffff3010000f4010000f5010000f6010000f7010000f8010000f9010000fefffffffdff +fffffc010000fd010000fe010000ff01000000020000ffffffff030000000400000001000000ffffffff00000000000000007e4100005a33000068610300010009000003b4b0010011004c00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b02 +00000000050000000c02210c780f1c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a000c008a010c008a0100000a00040000002d010000050000000201010000001c000000fb02adff0000000000009001000000000440001254696d6573204e657720526f6d61 +6e005f95ed77d067ef77aa0d0afb00000a00040000002d010100050000000902000000020d000000320a0c0000000100040000000000780f210c2063260007000000fc020100000000000000040000002d01020008000000fa0205000100000000000000040000002d010300070000001b04950b4e04fe0afa0307000000 +fc020000ffffff000000040000002d01040008000000fa0200000000000000000000040000002d010500030000001e00070000001604930b4d04fe0afa03050000000201010000001c000000fb029cff0000000000009001010000000440001254494d455300000072030a5d5695ed775f95ed77d067ef7772030a5d0000 +0a00040000002d0106000d000000320a110bfa0301000400fa03fe0a4c04930b72002700040000002d0101000d000000320a1c0b210401000400fa03fe0a4c04930b20002600040000002701ffff040000002d010200040000002d010300070000001b04840b5f040e0b1b04040000002d010400040000002d0105000300 +00001e00070000001604830b5e040f0b1b04050000000201010000001c000000fb02adff0000000000009001010000000440001254494d4553000000eb030aa95695ed775f95ed77d067ef77eb030aa900000a00040000002d010700050000000902000000020d000000320a1f0b1b04010004001b040f0b5d04830b7300 +2000040000002d0101000d000000320a1f0b3b04010004001b040f0b5d04830b20002600040000002701ffff040000002d010200040000002d010300070000001b043103880b9a021b0b040000002d010400040000002d010500030000001e000700000016043003870b9a021b0b050000000201010000001c000000fb02 +9cff0000000000009001000000020440001253796d626f6c0000f2000aab5695ed775f95ed77d067ef77f2000aab00000a00040000002d010800050000000902000000020d000000320a9a021b0b010004001b0b9a02860b300332003200040000002d0101000d000000320ac7024d0b010004001b0b9a02860b30032000 +2600040000002701ffff040000002d010200040000002d010300070000001b042003a90bab024d0b040000002d010400040000002d010500030000001e000700000016041f03a90bab024d0b050000000201010000001c000000fb02adff0000000000009001010000020440001253796d626f6c0000d8080af55695ed77 +5f95ed77d067ef77d8080af500000a00040000002d010900050000000902000000020d000000320aaa024d0b010004004d0bab02a80b1f0371002b00040000002d0101000d000000320ac602780b010004004d0bab02a80b1f0320002600040000002701ffff040000002d010200040000002d010300070000001b042003 +160cab02760b040000002d010400040000002d010500030000001e000700000016041f03150cab02760b05000000020101000000040000002d0107000500000009020000000210000000320abb02760b03000400760bab02140c1f036d696e003c0017002a00040000002d0101000d000000320abb02f30b01000400760b +ab02140c1f0320002600040000002701ffff1000000026060f001600ffffffff0000ba0300002203000018040000cc07000008000000fa0200000800000000000000040000002d010a00040000002d01020008000000250302001204c607bf032703040000002d01050004000000f0010a00040000002d01040008000000 +26060f000600ffffffff01001000000026060f001600ffffffff00000d0400001a0300009e040000cc07000008000000fa0200000800000000000000040000002d010a00040000002d01020008000000250302001204c60798041f03040000002d01050004000000f0010a00040000002d0104000800000026060f000600 +ffffffff01001000000026060f001600ffffffff0000150b0000220300009d0b0000cc07000008000000fa0200000800000000000000040000002d010a00040000002d0102000800000025030200970bc6071a0b2703040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff0100 +1000000026060f001600ffffffff0000920b0000220300000a0c0000cc07000008000000fa0200000800000000000000040000002d010a00040000002d0102000800000025030200970bc607040c2703040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff0100100000002606 +0f001600ffffffff0000ca030000bd03000096040000d107000008000000fa0200000800000000000000040000002d010a00040000002d0102001000000025030600cf03c403f303c2031704c2035304c4037104c6038f04c903040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffff +ffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd08cf0bd006e503040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff000020040000b006000092040000ec08 +00000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d00640042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200100740042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000036000000430f2000cc000000080006000000000040003200500740042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00 +0000080006000000000040003200900740042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d0074004 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010084004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050084004280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c003200900840042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd087304d0064004040000002d01050004000000 +f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088c04cc087204040000002d01040004000000f0010a00040000002d01050004000000f0010b00100000002606 +0f001600ffffffff0000a6040000b006000018050000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006c604280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007c6042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007c6042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00 +000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007c6042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000 +430f2000cc000000080006000000000040003200d007c6042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000 +32001008c6042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008c604280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008c604280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d0102000700 +00001b04cd08f904d006c604040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000023050000b006000095050000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d01020005000000070104000000 +36000000430f2000cc000000080006000000000040003200d00643052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000 +000040003200100743052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200500743052800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200900743052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d00743052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200100843052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd0000007700 +0000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200500843052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +36000000430f2000cc00000008000600000000003c003200900843052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d0104000500 +00000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd087605d0064305040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff0000000400 +00002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088f05cc087505040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff0000a0050000b006000012060000ec0800000800000026060f000600ffffffff00000400 +00002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +00007700000036000000430f2000cc0000000800060000000000400032001007c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000 +0800060000000000400032005007c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007c0052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007c0052800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008c0052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08f305d006c005040000002d01050004000000f0010a00040000002d0104000800000026060f00 +0600ffffffff01001000000026060f001600ffffffff00001d060000b00600008f060000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d0063d0628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010073d0628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050073d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320090073d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd0000007700000036000000430f2000cc000000080006000000000040003200d0073d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000 +cc00000008000600000000004000320010083d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008 +3d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c00320090083d0628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa020000080000000000000004000000 +2d010a00040000002d010200070000001b04cd087006d0063d06040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd089106cc086f06 +040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff0000a2060000b006000014070000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc0000000800060000000000 +40003200d006c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007c20628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007c20628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000770000003600 +0000430f2000cc0000000800060000000000400032005008c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000 +3c0032009008c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffff +ffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08f506d006c206040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00001f070000b006000091070000ec08000008000000 +26060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d0063f072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010073f072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700 +000036000000430f2000cc00000008000600000000004000320050073f072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600 +000000004000320090073f072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d0073f07280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010083f07280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050083f07280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c00320090083f072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd087207d0063f07040000002d01050004000000f0010a000400 +00002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088b07cc087107040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffff +ffff00009c070000b00600000e080000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006bc07280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007bc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007bc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000036000000430f2000cc0000000800060000000000400032009007bc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00 +0000080006000000000040003200d007bc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008bc07 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008bc07280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008bc07280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08 +ef07d006bc07040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000019080000b006000093080000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f +2000cc000000080007000000000040003a00d00639082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a00 +100739082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a00500739082800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a00900739082800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a00d00739082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00 +000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a00100839082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd0000007700000036000000430f2000cc000000080007000000000040003a00500839082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f +2000cc00000008000700000000003c003a00900839082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d0104000500000007010100 +00000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd087408d0063908040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a00 +08000000fa0200000800000000000002040000002d010b00070000001b04cd088d08cc087308040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff00009e080000b006000010090000ec0800000800000026060f000600ffffffff0000040000002d010300 +040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +36000000430f2000cc0000000800060000000000400032001007be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000 +0000400032005007be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007be082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007be082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd0000007700 +0000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08f108d006be08040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff +01001000000026060f001600ffffffff00001b090000b00600008d090000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d0063b0928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010073b0928000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050073b092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00 +000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320090073b092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000036000000430f2000cc000000080006000000000040003200d0073b092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800 +0600000000004000320010083b092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050083b0928000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c00320090083b0928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a000400 +00002d010200070000001b04cd086e09d0063b09040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088709cc086d09040000002d01 +040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff000098090000b00600000a0a0000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006 +b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007b80928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007b80928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd0000007700000036000000430f2000cc0000000800060000000000400032001008b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000 +cc0000000800060000000000400032005008b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008 +b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff01000800 +0000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08eb09d006b809040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000150a0000b0060000900a0000ec0800000800000026060f000600 +ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080007000000000040003b00d006350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00 +000077000000dd0000007700000036000000430f2000cc000000080007000000000040003b001007350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000 +430f2000cc000000080007000000000040003b005007350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000700000000004000 +3b009007350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003b00d007350a280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003b001008350a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003b005008350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000700000000003c003b009008350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00 +000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08710ad006350a040000002d01050004000000f0010a00040000002d010400 +0800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088a0acc08700a040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff00009b0a +0000b00600000d0b0000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006bb0a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007bb0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007bb0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700 +000036000000430f2000cc0000000800060000000000400032009007bb0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600 +0000000040003200d007bb0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008bb0a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008bb0a280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008bb0a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08ee0ad006bb0a +040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000180b0000b00600008a0b0000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000 +080006000000000040003200d006380b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007380b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007380b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007380b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007380b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008380b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +00007700000036000000430f2000cc0000000800060000000000400032005008380b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000 +08000600000000003c0032009008380b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d0104000500000007010100000008000000 +26060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd086b0bd006380b040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa02 +00000800000000000002040000002d010b00070000001b04cd08840bcc086a0b040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff0000db030000480500005b040000cc0700000800000026060f000600ffffffff0000040000002d010300040000002d01 +020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f4600660000000800080000000000400040004d05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036004d0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040008d05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000 +430f4600660000000800070000000000400036008d0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +4000cd05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080007000000000040003600cd052004280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000d06e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036000d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800070000000000400036004d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000 +430f4600660000000800080000000000400040008d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000700000000004000 +36008d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd06e003280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080007000000000040003600cd062004280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036000d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040004d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000 +430f4600660000000800070000000000400036004d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000007000800010000003a00 +40008d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000007000700010000003a0036008d072004280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000000800000026060f000600544e5050070106000000260626000200000006000000260601100200000008000000fa02000000000000ffffff000400 +00002d010a000500000004010b000000050000002606001000000c00000024030400e0034d051204c60755044d05e0034d0512000000260602101a000000010105000000000000000000010000000000000000000000060000002606011002000200040000002d0103000600000026062600020001000500000004010d00 +000006000000260626000200000007000000fc020000000000000000040000002d010b000600000026062600020001000c00000024030400e0034d051204c60755044d05e0034d05060000002606260002000000050000000401070000000800000026060f000600544e5050060136000000430f46006600000008000800 +00000000400040004d05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036004d052004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d05e003280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036008d052004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000 +880000002200000088000000220000008800000036000000430f460066000000080007000000000040003600cd0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f4600660000000800080000000000400040000d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000700 +00000000400036000d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d06e003280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036004d062004280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d06e003280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036008d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000 +880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f460066000000080007000000000040003600cd0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800 +00000000400040000d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036000d072004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d07e003280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036004d072004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000007000800010000003a0040008d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000 +880000002200000088000000220000008800000036000000430f46006600000007000700010000003a0036008d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +00000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c00040000002d0102000c000000 +24030400e0034d051204c60755044d05e0034d05040000002d01050004000000f0010c00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d3030000c10700005b0400004d0a00000800000026060f000600ffffffff0000040000002d010300040000002d0102000500 +0000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f460066000000080008000000000040004000c607d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000 +8800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c60718042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f4600660000000800080000000000400040000608d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600 +66000000080008000000000040003e00060818042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004608 +d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004608180428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008608d80328000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00860818042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000 +8800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e00c60818042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600 +660000000800080000000000400040000609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000609 +18042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004609d80328000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004609180428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000 +8800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00860918042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040004000c609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600 +66000000080008000000000040003e00c60918042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000060a +d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00060a180428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002004000460ad80328000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a18042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000 +880000002200000088000000220000008800000022000000880000000800000026060f000600544e50500701060000002606260002000000060000002606011002000000040000002d010a000500000004010b000000050000002606001000000c00000024030400d803470a1204c6075504470ad803470a120000002606 +02101a000000010105000000000000000000010000000000000000000000060000002606011002000200040000002d0103000600000026062600020001000500000004010d000000060000002606260002000000040000002d010b000600000026062600020001000c00000024030400d803470a1204c6075504470ad803 +470a060000002606260002000000050000000401070000000800000026060f000600544e5050060136000000430f460066000000080008000000000040004000c607d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c60718042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000 +8800000036000000430f4600660000000800080000000000400040000608d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00060818042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004608d80328000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004608180428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008608d80328000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00860818042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000 +8800000036000000430f460066000000080008000000000040003e00c60818042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +080000000000400040000609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000609180428000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004609d80328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004609180428000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00860918042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000 +8800000036000000430f460066000000080008000000000040004000c609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00c60918042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000060ad80328000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00060a180428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002004000460ad80328000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a18042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +000088000000220000008800000022000000880000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000 +040000002d010c00040000002d0102000c00000024030400d803470a1204c6075504470ad803470a040000002d01050004000000f0010c00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000500b0000c1070000d80b00004d0a00000800000026060f000600ffffffff +0000040000002d010300040000002d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f460066000000080008000000000040004000c607550b2800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c607950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000608550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000036000000430f460066000000080008000000000040003e000608950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +4600660000000800080000000000400040004608550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00 +4608950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008608550b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008608950b2800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c608950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000036000000430f4600660000000800080000000000400040000609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e000609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000 +4609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004609950b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008609550b2800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000036000000430f460066000000080008000000000040003e00c609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040004000060a550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00 +060a950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002004000460a550b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a950b2800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000000800000026060f000600544e50500701060000002606260002000000060000002606011002000000040000002d010a000500000004010b000000050000002606001000000c00000024030400550b +470a970bc607d20b470a550b470a12000000260602101a000000010105000000000000000000010000000000000000000000060000002606011002000200040000002d0103000600000026062600020001000500000004010d000000060000002606260002000000040000002d010b000600000026062600020001000c00 +000024030400550b470a970bc607d20b470a550b470a060000002606260002000000050000000401070000000800000026060f000600544e5050060136000000430f460066000000080008000000000040004000c607550b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c607950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000 +22000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000608550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f460066000000080008000000000040003e000608950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000 +0800080000000000400040004608550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004608950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008608550b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008608950b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000 +22000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c608950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f4600660000000800080000000000400040000609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000 +080008000000000040003e000609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004609550b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004609950b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008609550b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000 +22000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f460066000000080008000000000040003e00c609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000 +080008000000000040004000060a550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00060a950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002004000460a550b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a950b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffff +ffff010008000000fa0200000800000000000000040000002d010c00040000002d0102000c00000024030400550b470a970bc607d20b470a550b470a040000002d01050004000000f0010c00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000500b000048050000d80b +0000cc0700000800000026060f000600ffffffff0000040000002d010300040000002d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f4600660000000800080000000000400040004d05550b280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d05950b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d05550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008d05950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f460066000000080008000000000040004000cd05550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000 +430f460066000000080008000000000040003e00cd05950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +40000d06550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000d06950b280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d06550b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d06550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f460066000000080008000000000040003e008d06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000 +430f460066000000080008000000000040004000cd06550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +3e00cd06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000d07550b280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000d07950b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d07550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d07950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f46006600000007000800010000003a0040008d07550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000 +430f46006600000007000800010000003a003e008d07950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000000800000026060f000600544e50500701060000002606 +260002000000060000002606011002000000040000002d010a000500000004010b000000050000002606001000000c00000024030400550b4d05970bc607d20b4d05550b4d0512000000260602101a000000010105000000000000000000010000000000000000000000060000002606011002000200040000002d010300 +0600000026062600020001000500000004010d000000060000002606260002000000040000002d010b000600000026062600020001000c00000024030400550b4d05970bc607d20b4d05550b4d05060000002606260002000000050000000401070000000800000026060f000600544e5050060136000000430f46006600 +00000800080000000000400040004d05550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d05950b +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d05550b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008d05950b280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd05550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00cd05950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000 +220000008800000036000000430f4600660000000800080000000000400040000d06550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +0000080008000000000040003e000d06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d06550b +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d06950b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d06550b280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008d06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd06550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000 +220000008800000036000000430f460066000000080008000000000040003e00cd06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +00000800080000000000400040000d07550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000d07950b +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d07550b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d07950b280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000007000800010000003a0040008d07550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f46006600000007000800010000003a003e008d07950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000 +22000000880000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c00040000002d01 +02000c00000024030400550b4d05970bc607d20b4d05550b4d05040000002d01050004000000f0010c00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000db03000048050000d80b0000cc0700000800000026060f000600ffffffff0000040000002d01030004000000 +2d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f4600660000000800080000000000400040004d05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0560042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d05a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d05e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0560062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200728000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d0560082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a00828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00828000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0560092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d05200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a00a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800060000000000400033004d05a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600428000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d0560052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d05a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0560062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d0520072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00728000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0560082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d05e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d0520092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a00928000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d05e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600b28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d05a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd0560042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd05a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd0520062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd0560062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a00628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd05e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05600828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a00828000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd05a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05600a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000 +40003300cd05a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00328000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200428000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0660042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d0660052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a00528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0660062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d06e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d0620072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a00728000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0660082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d06a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600928000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200b28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033000d06a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d0660042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a00428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00428000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0660052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d0620062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a00628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d06a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d06e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600828000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0660092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d06a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d06200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d06a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00328000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0660042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a00528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0660062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d06e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600728000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d0660082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d06a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200928000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0660092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d06200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040008d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a00a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d06a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a00428000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0660052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd06a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd06a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200828000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0660082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd0660092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a00928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00928000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd06e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +40004000cd06200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080006000000000040003300cd06a00b28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0760042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d07a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d0760062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200728000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d0760082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a00828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00828000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0760092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040000d07200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a00a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800060000000000400033000d07a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600428000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0760052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d07a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0760062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0720072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00728000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0760082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d0720092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a00928000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000 +400040004d07e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600b28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d07a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d0760042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700080001000000 +3a0040008d07a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d0720062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700080001000000 +3a0040008d0760062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a00628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d07e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700080001000000 +3a0040008d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07600828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a00828000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d07a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700080001000000 +3a0040008d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07600a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700060001000000 +3a0033008d07a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000000800000026060f000600544e5050070106000000260626000200000006000000260601100200 +0000040000002d010a000500000004010b000000050000002606001000000c00000024030400e0034d05d20b4d05d107c607e0034d0512000000260602101a000000010105000000000000000000010000000000000000000000060000002606011002000200040000002d01030006000000260626000200010005000000 +04010d000000060000002606260002000000040000002d010b000600000026062600020001000c00000024030400e0034d05d20b4d05d107c607e0034d05060000002606260002000000050000000401070000000800000026060f000600544e5050060136000000430f4600660000000800080000000000400040004d05 +e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d0560052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0560062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d0520072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +60072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a00728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0560082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d05e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +20092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200b28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d05a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d0560042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0560052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d0520062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +60062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a00628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d05e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +20082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a00828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d0560092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d05a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200a28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d05 +a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00328000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd0520052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +60052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a00528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd05e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +20072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05600728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a00728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd05a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05600928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd05600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00a28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080006000000000040003300cd05a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a00428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0660052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +20062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a00628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d06a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d0660092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d06200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033000d06a00b28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00328000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0660042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +20052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0660062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d0660082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0660092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d06200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a00a28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800060000000000400033004d06a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +20042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a00428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d0660052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d06a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0660082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +60092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a00928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040008d06e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600b28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d06a00b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd0660042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd06a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd0660062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a00828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0660092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080008000000000040004000cd06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600a28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a00a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +66000000080006000000000040003300cd06a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d0760052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0760062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d0720072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +60072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a00728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0760082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +20092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040000d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200b28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033000d07a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d0760042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0760052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d0720062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +60062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a00628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d07e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +20082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a00828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0760092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d07a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200a28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +660000000800080000000000400040004d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d07 +a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00328000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +6600000007000800010000003a0040008d0720052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +60052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a00528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +6600000007000800010000003a0040008d07e0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +20072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07600728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a00728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e0072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +6600000007000800010000003a0040008d07a0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07600928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600 +6600000007000800010000003a0040008d07600a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00a28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000600010000003a0033008d07a00b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f0000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c0004000000 +2d0102000c00000024030400e0034d05d20b4d05d107c607e0034d05040000002d01050004000000f0010c00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600 +ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000e4030000c1070000d80b00004d0a00000800000026060f000600ffffffff0000040000002d010300040000002d010200050000000701040000000600000026062600020001000500 +00000401070000000800000026060f000600544e5050060136000000430f460066000000080008000000000040004000c607e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c60729042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c60769042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9042800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c607e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c60729062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c607a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c607e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c60769092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c607a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607290a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607690a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c607290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c607690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a00c607a90b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9032800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000608e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9052800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000608a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040000608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040000608a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829092800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040000608690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a90a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e90a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608290b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a000608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004608e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000460829042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9042800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004608a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040004608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000460869072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040004608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000460829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000460869092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9092800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608290a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040004608290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608690b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a004608a90b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9032800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008608a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040008608e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869052800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000860869062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040008608a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000860829082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000860869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040008608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608690a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a90a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080005000000000040002a008608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c608e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869042800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c60869052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c608a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c60829072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c60869072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c608e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c60829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9092800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c608a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608690b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a00c608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040000609a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929052800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060969062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000609e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060929082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000609a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040000609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609690a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a90a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000609690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080005000000000040002a000609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9032800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929042800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000460929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000460969052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9052800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000460929072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004609a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040004609e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969092800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004609690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040004609a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e90a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609290b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a004609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000860929042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000860969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9042800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000860929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040008609e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000860969092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040008609a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609290a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609690a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008609290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +0800080000000000400040008609690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a008609a90b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9032800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c609e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c60929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9052800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c609a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c60969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c609a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929092800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000c609690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a90a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e90a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609290b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a00c609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060ae9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060a29042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9042800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060aa9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060ae9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060a69072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060aa9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060a29092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060a69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9092800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a290a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060ae90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +080008000000000040004000060a290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a690b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a00060aa90b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9032800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460aa9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +010008000700000002004000460ae9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69052800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460a69062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +010008000700000002004000460aa9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460a29082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +010008000700000002004000460a69082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460ae9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000 +010008000700000002004000460a290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a690a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa90a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae90a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010005000700000002002a00460aa90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000000800000026060f000600544e +50500701060000002606260002000000060000002606011002000000040000002d010a000500000004010b000000050000002606001000000c00000024030400e903470ad20b470ad107c607e903470a12000000260602101a00000001010500000000000000000001000000000000000000000006000000260601100200 +0200040000002d0103000600000026062600020001000500000004010d000000060000002606260002000000040000002d010b000600000026062600020001000c00000024030400e903470ad20b470ad107c607e903470a060000002606260002000000050000000401070000000800000026060f000600544e50500601 +36000000430f460066000000080008000000000040004000c607e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60729042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c607a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c607e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c60769072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c607a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9072800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c60729092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60769092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9092800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c607e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c607290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607690b2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a00c607a90b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040000608a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000608e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829052800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060869062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000608a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060829082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040000608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608690a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a90a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080005000000000040002a000608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004608e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000460869052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004608a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9052800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000460829072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000460869072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9072800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040004608e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000460829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869092800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040004608a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608290b2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608690b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a004608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000860869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008608a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000860829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860869062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040008608e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860829082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040008608a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608290a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608690a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040008608690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000 +000040002a008608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9032800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c60829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60869052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9052800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60829072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869072800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c608a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c608e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829092800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c608690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c608a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e90a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a00c608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060929042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040000609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040000609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000609e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060969092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000609a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9092800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609290a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040000609290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000609690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a000609a90b2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9032800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040004609e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000460929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969052800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040004609a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929072800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000460969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004609a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040004609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004609690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a90a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e90a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a004609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040008609e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860929042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040008609a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000860969072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9072800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000860929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860969092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9092800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f4600660000000800080000000000400040008609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008609290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609690b2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a008609a90b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c609a9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c609e9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929052800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c60969062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c609a9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c60929082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000c609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609690a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a90a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080005000000000040002a00c609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060ae9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060a69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060aa9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9052800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060a29072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060a69072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9072800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060ae9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060a29092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69092800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a690a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000080008000000000040004000060aa90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060ae90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a290b2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a690b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080005000000000040002a00060aa90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000010008000700000002004000460a69042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460aa9042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000010008000700000002004000460a29062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460a69062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000010008000700000002004000460ae9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460a29082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000010008000700000002004000460aa9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460ae9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a290a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a690a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a290b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +36000000430f460066000000010008000700000002004000460a690b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010005000700 +000002002a00460aa90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000000800000026060f000600544e50500701060000002606011002000100040000002d010200 +0500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c00040000002d0102000c00000024030400e903470ad20b470ad107c607e903470a040000002d01050004000000f0010c000400 +00002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00006e5ffdffda06ffffdaef0200e4f202000800000026060f000600ffffffff0100040000002d010200040000002d010300070000001b049704b00a2104fc04040000002d010400040000002d010500030000001e0007000000 +16049504af0a2104fc04050000000201010000001c000000fb02adff0000000000009001000000000440001254494d4553000000f9090a185695ed775f95ed77d067ef77f9090a1800000a00040000002d010c00050000000902000000024c000000320a3104fc042b000400fc042104ae0a9504417869616c2073656374 +696f6e207468726f75676820612063796c696e64726963616c207363616e6e6572003c002a001700250017001500200025002500170017002a002a00150017002a001c002a0029002a002a0015002500150024002a00170017002a0029001c00170025002500170015002000250025002a002a0025001c00040000002d01 +01000d000000320a3104950a01000400fc042104ae0a9504200a2500040000002701ffff040000002d010200040000002d010300070000001b0431031b049a02ae03040000002d010400040000002d010500030000001e0007000000160430031b049a02ae0305000000020101000000040000002d010800050000000902 +000000020d000000320a9a02ae0301000400ae039a021a043003320a3200040000002d0101000d000000320ac702e00301000400ae039a021a043003200a2600040000002701ffff040000002d010200040000002d010300070000001b0420033d04ab02e103040000002d010400040000002d010500030000001e000700 +000016041f033d04ab02e10305000000020101000000040000002d010900050000000902000000020d000000320aaa02e10301000400e103ab023c041f03710a2b00040000002d0101000d000000320ac6020c0401000400e103ab023c041f03200a2600040000002701ffff040000002d010200040000002d0103000700 +00001b042003aa04ab020a04040000002d010400040000002d010500030000001e000700000016041f03a904ab020a0405000000020101000000040000002d0107000500000009020000000210000000320abb020a04030004000a04ab02a8041f036d696eef3c0017002a00040000002d0101000d000000320abb028704 +010004000a04ab02a8041f03200a2600040000002701ffff040000002d010200040000002d010300070000001b043907b907c4065c07040000002d010400040000002d010500030000001e000700000016043807b807c4065c07050000000201010000001c000000fb02adff000000000000900100000002044000125379 +6d626f6c0000a6000ad25695ed775f95ed77d067ef77a6000ad200000a00040000002d010d00050000000902000000020d000000320ac3065c07010004005c07c406b7073807320a2a00040000002d0101000d000000320adf068607010004005c07c406b7073807200a2600040000002701ffff040000002d0102000400 +00002d010300070000001b043907e307c4068607040000002d010400040000002d010500030000001e000700000016043807e207c406860705000000020101000000040000002d010900050000000902000000020d000000320ac3068607010004008607c406e1073807710a2b00040000002d0101000d000000320adf06 +b107010004008607c406e1073807200a2600040000002701ffff040000002d010200040000002d010300070000001b0439075708c406b007040000002d010400040000002d010500030000001e0007000000160438075708c406b00705000000020101000000040000002d0107000500000009020000000210000000320a +d406b00703000400b007c406560838076d6178ef3c002a002500040000002d0101000d000000320ad4063b0801000400b007c40656083807200a2600040000002701ffff040000002d010200040000002d010300070000001b04e00be20a6a0b2605040000002d010400040000002d010500030000001e00070000001604 +de0be10a6a0b260505000000020101000000040000002d010c00050000000902000000024c000000320a7a0b26052b00040026056a0be00ade0b4c61726765737420616363657074616e6365206174207468652063656e747265206f662074686520464f5600330025001c002a0025002000170015002500250025002500 +2a00170025002a0025002500150025001700150017002a0025001500250024002a0016001c00250015002a001c00150017002a00240015002e003c003c00040000002d0101000d000000320a7a0bde0a0100040026056a0be00ade0b200a2600040000002701ffff040000002d010200040000002d010300070000001b04 +a40a4f0f2e0a150c040000002d010400040000002d010500030000001e00070000001604a20a4f0f2e0a150c05000000020101000000040000002d010c00050000000902000000022f000000320a3e0a150c18000400150c2e0a4e0fa20a536d616c6c65737420616363657074616e636520617420202e00410025001700 +1700250020001700150025002500250025002a00170025002a002500250015002500170015001500040000002d0101000d000000320a3e0a310f01000400150c2e0a4e0fa20a200a2600040000002701ffff040000002d010200040000002d010300070000001b04080bf30e920a4f0c040000002d010400040000002d01 +0500030000001e00070000001604060bf30e920a4f0c05000000020101000000040000002d010c000500000009020000000228000000320aa20a4f0c130004004f0c920af20e060b7468652074776f2065787472656d69746965738017002a002500150017003c002a00150025002a0017001c0025004100170017001700 +25002000040000002d0101000d000000320aa20ace0e010004004f0c920af20e060b200a2600040000002701ffff040000002d010200040000002d010300070000001b045006440eda05470c040000002d010400040000002d010500030000001e000700000016044f06440eda05470c0500000002010100000004000000 +2d010c00050000000902000000021d000000320aea05470c0c000400470cda05430e4f06496d61676520766f6c756d651c00410025002a002500150029002a0017002a0041002500040000002d0101000d000000320aea05270e01000400470cda05430e4f06200a2500040000002701ffff1000000026060f001600ffff +ffff0000270b0000d6030000fb0b0000d507000008000000fa0200000800000000000000040000002d010e00040000002d0102000e000000250305002c0be103660bdd03a00bdb03ca0bdc03f40bde03040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff010007000000fc02 +0000ffffff000000040000002d010e00040000002d010300040000002d010e00090000001d062100f00096009600c607fe0c040000002d010e00040000002d01040004000000f0010e00040000002d010500040000002d010200040000002d010300070000001b045d08740dc607200d040000002d010400040000002d01 +0500030000001e000700000016045b08740dc607200d05000000020101000000040000002d010600050000000902000000020d000000320ad907200d01000400200dc607730d5b087a002700040000002d0101000d000000320ae407470d01000400200dc607730d5b0820002600040000002701ffff1000000026060f00 +1600ffffffff00009a0200009b070000a7030000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0b01050000000b0217ffb0ff050000000c020b00 +20000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cffb3ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e00000000000000000000 +00000000ffffff00fffffffffffffffffffffffffffffffffffffffff81b037fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000490300009b07000056040000f90700000300 +00001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0b01050000000b0217ff9bff050000000c020b0020000400000003010800050000000c020a001f00050000000201 +01000000050000000102ffffff0005000000090200000000050000000b022cff9eff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffc0d81bfffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000f80300009b07000005050000f9070000030000001e00050000002e0100000000050000000a02000000000500 +0000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff86ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902000000000500 +00000b022cff89ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe06c0dfffffffffffffffffffffffffffffffffffffffff +040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000a70400009b070000b4050000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200 +040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff70ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff75ff3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb03607fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800 +000026060f000600ffffffff01001000000026060f001600ffffffff0000560500009b07000063060000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00 +780f0a01050000000b0217ff5bff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff61ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffd81b03fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffff +ffff0000050600009b07000012070000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff46ff050000000c020b0020000400 +000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff4cff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000 +ffffff00fffffffffffffffffffffffffffffffffffffffffec0d81fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000b40600009b070000c1070000f9070000030000001e00 +050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff31ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000 +050000000102ffffff0005000000090200000000050000000b022cff38ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb60 +6c1fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000630700009b07000070080000f9070000030000001e00050000002e0100000000050000000a0200000000050000000902 +00000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff1cff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b02 +2cff23ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9b0361fffffffffffffffffffffffffffffffffffffffff04000000 +2d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000120800009b0700001f090000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01020004000000 +2d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff07ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff0fff3b000000410bc60088000b002000000000000b002000 +0000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8d81b1fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff080000002606 +0f000600ffffffff01001000000026060f001600ffffffff0000c10800009b070000ce090000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01 +050000000b0217fff2fe050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cfffbfe3b000000410bc60088000b002000000000000b0020000000000028000000200000000b00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff86c0d9fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000 +700900009b0700007d0a0000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ffddfe050000000c020b002000040000000301 +0800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cffe6fe3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00 +fffffffffffffffffffffffffffffffffffffffff83606dfffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff00001f0a00009b0700002c0b0000f9070000030000001e0005000000 +2e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ffc8fe050000000c020b0020000400000003010800050000000c020a001f000500000002010100000005000000 +0102ffffff0005000000090200000000050000000b022cffd2fe3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff81b037fffff +ffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000ce0a00009b070000dc0b0000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000 +050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0b01050000000b0217ffb4fe050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cffbffe +3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc0d81bfffffffffffffffffffffffffffffffffffffffff040000002d010400 +040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff00007d0b00009b0700008b0c0000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d010300 +0400000003010800070000001204210c5c00780f0b01050000000b0217ff9ffe050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cffaafe3b000000410bc60088000b002000000000000b00200000000000 +28000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe06c0dfffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600 +ffffffff01001000000026060f001600ffffffff00002d0c00009b070000180d0000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780fe90005000000 +0b0217ff89fe050000000c020b001c000400000003010800050000000c020a001b0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff97fe3b000000410bc60088000b001c00000000000b001c000000000028000000200000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb0361ffffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000e00c0000 +a8070000360d0000e507000008000000fa0200000800000000000000040000002d010e0007000000fc020000000000000000040000002d010f000e00000024030500300dc607e50cdf07e50cc607e50cad07300dc607040000002d01050004000000f0010e00040000002d01040004000000f0010f000800000026060f00 +0600ffffffff01001000000026060f001600ffffffff0000c5030000b4040000f60b0000710500000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080008000000000040004000d404e50328000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404250428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d40465042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a5042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e5042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc000000080008000000000040004000d40425052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404 +65052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a50528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e50528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d40425062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d40465062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a5062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc000000080008000000000040004000d404e5062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404 +25072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404650728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a50728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e5072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d40425082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc000000080008000000000040004000d40465082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc000000080008000000000040004000d404a5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404 +e5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404250928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404650928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc000000080008000000000040004000d404250a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc000000080008000000000040004000d404650a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404 +a50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e50a28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404250b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404650b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080006000000000040003100d404a50b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e5032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc00000008000800000000003d004000140525042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405 +65042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a50428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e50428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d004000140525052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d004000140565052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc00000008000800000000003d0040001405e5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405 +25062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405650628000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a50628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e5062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d004000140525072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc00000008000800000000003d004000140565072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc00000008000800000000003d0040001405a5072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405 +e5072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405250828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405650828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc00000008000800000000003d004000140525092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc00000008000800000000003d004000140565092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405 +a5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e50928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405250a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405650a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc00000008000800000000003d0040001405250b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405 +650b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000600000000003d0031001405a50b28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa020000080000000000000004000000 +2d010e00040000002d010200070000001b045205d70bd404e503040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffff +ffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000c5030000b4040000f60b0000710500000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc00000008000800 +0000000040004000d404e5032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4042504280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4046504280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a504280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e5042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d40425052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc000000080008000000000040004000d40465052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +0000000040004000d404a5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e505280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4042506280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4046506280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a5062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e5062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc000000080008000000000040004000d40425072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +0000000040004000d40465072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a507280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e507280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4042508280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d40465082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc000000080008000000000040004000d404e5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +0000000040004000d40425092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4046509280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a509280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e509280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404250a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404650a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc000000080008000000000040004000d404a50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +0000000040004000d404e50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404250b280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404650b280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080006000000000040003100d404a50b280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e5032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000140525042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc00000008000800000000003d004000140565042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +000000003d0040001405a5042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e504280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00400014052505280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00400014056505280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc00000008000800000000003d004000140525062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +000000003d004000140565062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a506280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e506280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00400014052507280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000140565072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a5072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc00000008000800000000003d0040001405e5072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +000000003d004000140525082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00400014056508280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a508280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e508280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000140525092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000140565092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc00000008000800000000003d0040001405a5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +000000003d0040001405e5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405250a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405650a280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a50a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405250b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc00000008000800000000003d0040001405650b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000600 +000000003d0031001405a50b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000040000002d010500040000002d010400050000000701010000000800000026060f00 +0600ffffffff010008000000fa0200000800000000000000040000002d010e00040000002d010200070000001b045205d70bd404e503040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f20200 +0800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d4070000cb040000e00700005305000008000000fa0200000800000000000000040000002d010e00040000002d01 +02000800000025030200d907d004da074d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000053090000cb0400005f0900005305000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000 +250302005809d00459094d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00004d0a0000cb040000590a00005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200520a +d004530a4d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d0090000cb040000dc0900005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d509d004d6094d05 +040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d30a0000cb040000de0a00005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d80ad004d80a4d05040000002d01 +050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000500b0000cb0400005b0b00005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200550bd004550b4d05040000002d01050004000000 +f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000ce080000cb040000da0800005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d308d004d4084d05040000002d01050004000000f0010e000400 +00002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000049080000cb040000540800005305000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302004e08d0044e084d05040000002d01050004000000f0010e00040000002d010400 +0800000026060f000600ffffffff01001000000026060f001600ffffffff00005b050000cb040000660500005305000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302006005d00460054d05040000002d01050004000000f0010e00040000002d010400080000002606 +0f000600ffffffff01001000000026060f001600ffffffff000055060000cb040000600600005305000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302005a06d0045a064d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffff +ffff01001000000026060f001600ffffffff0000d8050000cb040000e30500005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200dd05d004dd054d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000 +000026060f001600ffffffff0000da060000cb040000e60600005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200df06d004e0064d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f00 +1600ffffffff000057070000cb040000630700005305000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302005c07d0045d074d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff +0000d5040000cb040000e10400005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200da04d004db044d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000050040000 +cb0400005c0400005305000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302005504d00456044d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000bc0300002b0a0000f60b +0000e80a00000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc0000000800080000000000400040004b0adc032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc0000000800080000000000400040004b0a9c042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000 +4b0adc042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c052800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc0000000800080000000000400040004b0a5c062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000 +4b0a9c062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c072800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc0000000800080000000000400040004b0a1c082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000 +4b0a5c082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c082800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc082800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc0000000800080000000000400040004b0adc092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000 +4b0a1c0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c0a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c0a2800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c0b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c0b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc000000080007000000000040003a004b0a9c0b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000 +8b0adc032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c042800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c042800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc00000008000800000000003d0040008b0a5c052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000 +8b0a9c052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c062800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc00000008000800000000003d0040008b0a1c072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000 +8b0a5c072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc072800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc00000008000800000000003d0040008b0adc082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000 +8b0a1c092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c092800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc00000008000800000000003d0040008b0a9c0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000 +8b0adc0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c0b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c0b2800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000700000000003d003a008b0a9c0b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010e00040000002d010200070000001b04c90ad70b4b0adc03040000002d010500 +04000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff +01001000000026060f001600ffffffff0000d4070000420a0000e0070000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d907470ada07c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff010010000000 +26060f001600ffffffff000053090000420a00005f090000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302005809470a5909c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600 +ffffffff00004d0a0000420a0000590a0000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200520a470a530ac40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000 +d0090000420a0000dc090000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d509470ad609c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d30a0000420a +0000de0a0000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d80a470ad80ac40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000500b0000420a00005b0b0000 +ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200550b470a550bc40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000ce080000420a0000da080000ca0a00000800 +0000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d308470ad408c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000049080000420a000054080000ca0a000008000000fa020000 +0800000000000000040000002d010e00040000002d01020008000000250302004e08470a4e08c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00005b050000420a000066050000ca0a000008000000fa020000080000000000 +0000040000002d010e00040000002d01020008000000250302006005470a6005c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000055060000420a000060060000ca0a000008000000fa020000080000000000000004000000 +2d010e00040000002d01020008000000250302005a06470a5a06c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d8050000420a0000e3050000ca0a000008000000fa0200000800000000000000040000002d010e000400 +00002d0102000800000025030200dd05470add05c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000da060000420a0000e6060000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d010200 +0800000025030200df06470ae006c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000057070000420a000063070000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d010200080000002503 +02005c07470a5d07c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d5040000420a0000e1040000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200da04470a +db04c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000050040000420a00005c040000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302005504470a5604c40a0400 +00002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000c50b0000ac090000260d0000340a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200200d2e0aca0bb109040000002d010500 +04000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000820b000093090000d80b0000d009000008000000fa0200000800000000000000040000002d010e0007000000fc020000000000000000040000002d010f000e00000024030500870b9809d20b9809 +ca0bb109c20bca09870b9809040000002d01050004000000f0010e00040000002d01040004000000f0010f000800000026060f000600ffffffff01001000000026060f001600ffffffff000089020000220500009603000080050000030000001e00050000002e0100000000050000000a02000000000500000009020000 +0000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0b01050000000b0263ffb2ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b0271ff +b5ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff040000002d01 +0400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff000038030000220500001304000080050000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d01 +03000400000003010800070000001204210c5c00780fda00050000000b0263ff9eff050000000c020b001a000400000003010800050000000c020a00190005000000020101000000050000000102ffffff0005000000090200000000050000000b0271ffa1ff3b000000410bc60088000b001a00000000000b001a000000 +000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb0307ffffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f00 +0600ffffffff01001000000026060f001600ffffffff0000af02000069050000ba020000ab07000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200b4026e05b402a507040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff +01001000000026060f001600ffffffff00009602000048050000d30200008505000008000000fa0200000800000000000000040000002d010e0007000000fc020000000000000000040000002d010f000e00000024030500b4024d059b027f05b4026e05cd027f05b4024d05040000002d01050004000000f0010e000400 +00002d01040004000000f0010f000800000026060f000600ffffffff01001000000026060f001600ffffffff0000960200008f070000d3020000cc07000008000000fa0200000800000000000000040000002d010e0007000000fc020000000000000000040000002d010f000e00000024030500b402c6079b029407b402 +a507cd029407b402c607040000002d01050004000000f0010e00040000002d01040004000000f0010f000800000026060f000600ffffffff0100040000002d010200040000002d010300070000001b04cd06c60236065802040000002d010400040000002d010500030000001e00070000001604cc06c502360658020500 +00000201010000001c000000fb029cff0000000000009001000000000440001254494d4553000000420c0a645695ed775f95ed77d067ef77420c0a6400000a00040000002d010e00050000000902000000020d000000320a4a0658020100040058023606c402cc0652004300040000002d0101000d000000320a55069b02 +0100040058023606c402cc0620002600040000002701ffff1000000026060f001600ffffffff0000d3030000bf0a0000de0300003e0b000008000000fa0200000800000000000000040000002d010f00040000002d0102000800000025030200d803c40ad803380b040000002d01050004000000f0010f00040000002d01 +04000800000026060f000600ffffffff01001000000026060f001600ffffffff000050040000bf0a00005c0400003e0b000008000000fa0200000800000000000000040000002d010f00040000002d01020008000000250302005504c40a5604380b040000002d01050004000000f0010f00040000002d01040008000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000260b0000100600002c0c00008f06000008000000fa0200000800000000000000040000002d010f00040000002d0102000800000025030200260c15062b0b8906040000002d01050004000000f0010f00040000002d0104000800000026060f000600 +ffffffff01001000000026060f001600ffffffff0000e30a000063060000390b0000a806000008000000fa0200000800000000000000040000002d010f0007000000fc020000000000000000040000002d0110000e00000024030500e80aa206230b68062b0b8106330b9a06e80aa206040000002d01050004000000f001 +0f00040000002d01040004000000f00110000800000026060f000600ffffffff01001000000026060f001600ffffffff0000ec030000f10a000042040000fc0a000008000000fa0200000800000000000000040000002d010f00040000002d0102000800000025030200f103f60a3c04f60a040000002d01050004000000 +f0010f00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d3030000e00a0000f70300000c0b000008000000fa0200000800000000000000040000002d010f0007000000fc020000000000000000040000002d0110000e00000024030500d803f60af103060bf103f60a +f103e50ad803f60a040000002d01050004000000f0010f00040000002d01040004000000f00110000800000026060f000600ffffffff01001000000026060f001600ffffffff000037040000e00a00005b0400000c0b000008000000fa0200000800000000000000040000002d010f0007000000fc020000000000000000 +040000002d0110000e000000240305005504f60a3c04060b3c04f60a3c04e50a5504f60a040000002d01050004000000f0010f00040000002d01040004000000f00110000800000026060f000600ffffffff0100040000002d010000030000000000ff0000007f00000051000000a0000000e00300004d0700001f040000 +8c070000e00300004d070000000000000000000008000000080000005000000030000000800000002000000000000000460066004000000040000000280000000800000008000000010001000000000020000000eca5c1006b2009040000f012bf000000000000100000000000040000460600000e00626a626a1fae1fae +00000000000000000000000000000000000009041600081d00007dc400007dc40000800000000000000000000000000000000000000000000000c500000000000000ffff0f000000000000000000ffff0f000000000000000000ffff0f00000000000000000000000000000000006c0000000000a000000000000000a000 +0000a000000000000000a00000000000000054030000000000005403000000000000540300001400000000000000000000008803000000000000880300000000000088030000000000008803000000000000880300000c00000094030000140000008803000000000000ce4d0000ea000000b403000000000000b4030000 +00000000b403000000000000b403000000000000b403000000000000bb4c000000000000bb4c000000000000bb4c000000000000414d000002000000434d000000000000434d000000000000434d000000000000434d000000000000434d000000000000434d000024000000b84e000020020000d850000066000000674d +000021000000000000000000000000000000000000005403000000000000bb4c00000000000000000000000000000000000000000000d53d0000e60e0000bb4c000000000000bb4c000000000000bb4c000000000000674d000000000000414d000000000000a000000000000000a000000000000000b403000000000000 +0000000000000000b4030000213a0000884d000016000000414d000000000000414d000000000000414d000000000000bb4c000028000000a0000000f2010000b4030000000000005403000000000000b403000000000000414d0000000000000000000000000000414d0000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000bb4c000000000000414d000000000000414d000000000000414d0000000000000000000000000000414d00000000000092020000c2000000540300000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000414d000000000000b403000000000000a80300000c000000102e7f897687c30188030000000000008803000000000000e34c00005e000000414d0000000000000000000000000000414d0000000000009e4d000030000000ce4d000000000000414d +0000000000003e51000000000000414d0000000000003e51000000000000414d000000000000414d00000000000068030000120000007a0300000e000000a000000000000000a000000000000000a000000000000000a0000000000000000200d90000000800080008000800080008000800080008000800080008000800 +080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800 +0800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000d0072000d000d0073000d000d0032f00d000d0071f00d00 +0d006d0069006e000d000d0041007800690061006c002000730065006300740069006f006e0020007400680072006f00750067006800200061002000630079006c0069006e00640072006900630061006c0020007300630061006e006e00650072000d000d0032f00d000d0071f00d000d006d0069006e000d000d0032f0 +0d000d0071f00d000d006d00610078000d000d004c00610072006700650073007400200061006300630065007000740061006e006300650020006100740020007400680065002000630065006e0074007200650020006f0066002000740068006500200046004f0056000d000d536d616c6c65737420616363657074616e +636520617420200d0d7468652074776f2065787472656d69746965730d0d496d61676520766f6c756d650d0d7a0d0d520d0d0d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000fe0400000005 +00000205000006050000080500000c0500000e0500001205000014050000180500001e05000022050000780500007c0500007e0500008205000084050000880500008e0500009205000094050000980500009a0500009e050000a4050000a8050000fe05000001060000190600001b0600002e060000300600003c060000 +3e0600003f060000410600004206000046060000f300dd00cb00ba00aa00cb009b00ba00aa00cb008e00aa00cb009b009b009b009b00dd007b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025422a01434a18004f4a0300514a0300 +5e4a0300614a18006d4809047068000000007348090419422a014f4a0100514a01006d480904706800000000734809041d422a014f4a0300514a03005e4a03006d480904706800000000734809041f360881422a014f4a0100514a01005d08816d4809047068000000007348090421422a01434a18004f4a0100514a0100 +614a18006d4809047068000000007348090423360881422a014f4a0300514a03005d08815e4a03006d480904706800000000734809042b360881422a01434a18004f4a0300514a03005d08815e4a0300614a18006d4809047068000000007348090418036a000000005508016d4800046e48000473480904750801260004 +00000005000004050000060500000a0500000c0500001005000012050000160500001805000020050000220500007a0500007c05000080050000820500008605000088050000900500009205000096050000980500009c0500009e050000a6050000a805000000060000010600001a0600001b060000fd00000000000000 +0000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000 +000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000 +fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000000000000000000000 +00010000001d000400000005000045060000fdfd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000404000101021b0600002f060000300600003d0600003e060000400600004106000043060000440600004506000046060000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd0000 +00000000000000000000fd000000000000000000000000fd000000000000000000000000fd000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000010000000a2800265009001fb0c34e20b0c04e21b0d11422b0d1142390d1182490d21825b0000017b0c20218b0c202807a1ff061000000f7355eddcba9ce050131cffe15e004aeff28000000080000000800000001000100000000002000000000000000000000000200000000 +00000000000000ffffff00aa00000055000000aa00000055000000aa00000055000000aa00000055000000807a1ff061000000882d3856588dba2a3098eae5741d25e9ff2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00 +000077000000dd00000077000000dd00000077000000807a1ff061000000c2064c9313ea80c3f925f36d11274317ff2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000 +00807a1ff061000000e15f66e670d1103cac18f143b750ddd1ff2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000403d1af0b60000009e2c64036a925739ffb63196 +5211997d480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e0062 +1da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce08734733d3671907611a85e01281b00caa83a08403d1af0b6000000af72de99f7573f1b7a231af24b840fa0480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aae +be6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce00f6fe37e6ce220ed2250bd02503600e7ea3abc403d1af0b6000000defb7bc273b37f6d22b6 +7a6fd2148d1a480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e +00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce01fdb81fbd8c441da45a07a05a06c00f68b3b16403d1af0b600000079b1d31c6c78051d55f0198933edb07a480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d2 +0aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce03773423d3671907611a85e01281b00d6663a50403d1af0b6000000f2bcd1396c7e7262 +5fae8dc2b376026d480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203 +206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce06fe3067b6ce220ed2250bd02503600eec83ae0403d1af0b6000000e42b72c2dd104a9ea6784cdcc47b69cc480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc +02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce0df811bf2d8c441da45a07a05a06c00faf93b28403d1af0b60000008351c1ede677 +c2a1a35858a8f7782452480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e00 +6203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce077428e3c3671907611a85e01281b00d89d3a59403d1af0b6000000ba81d8470ded384707175331f4f713e1480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b33333 +30bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce0e70633796ce220ed2250bd02503600dcd93a71403d1af0b60000001406be0e +4330f028b4842cf031c90c72480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e20 +0e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce0c70d69796ce220ed2250bd02503600def73a7d403d1af0b6000000d33427b288d1852f38f2a21f3cca13d5480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3 +333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce0470eef7c6ce220ed2250bd02503600df073a83403d1af0b60000000fe9 +d1efc9df8dfaa9004f9f15249840480100000000000000000000200000000b000000ed9b0300732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e18500062 +6e200e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce08719db7d6ce220ed2250bd02503600df0f3a86403d1af0b80000002fcf9fd73d7b01d5aacd533e8cc73a764801000000000000000000001c0000000b000000dd240300732a01008600000000fe78da63646060486140006920e642 +e22f6662607805a4155c7ddd181818193c181918d818402c34c00ac42c0c0c0e40890f68524240cc03d5230965ffffff9f4102ca068140205e83c71d302003c4dc401c00c40640dc00c43a50b9630c1d70790d909ba16c4624d71ee68360640072cb7f2ce037732236e1ff20ed2250bd0250360092783b5c807a1ff06100 +000087e1c598c8582827d388303de4319d40ff2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000807a1ff0610000001e2e7007831c9a15b9dddcb961954d4fff2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000403d1af0b6000000bfdd6c7b65df82588437082b732e12f6480100000000000000000000200000000b000000ed9b0300 +732a01008400000000fe78da63646060486140007920e642e2b3333330bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c40734292120e681ea9184b2ffffffcf20016583402010afc1e30e185000626e200e006203206e00621da8dc31860eb8bc06925a4624d71ee68360640072cb7f2ce0878484 +3c3671907611a85e01281b00be3939ba403d1af0b800000026c9a2885e03461c5dbfbca586f47ba54801000000000000000000001a0000000b00000055e90200732a01008600000000fe78da63646060486140004920e642e217323130bc02d20aaebe6e0c0c8c0c1e8c0c0c6c0c20161a60056216060607a0c407342921 +20e681ea9184b2ffffffcf20016583402010afc1e30e189002626e200e006203206e00621da8dc31860eb8bc06c8cd503623926b0ff341303200b9e53f16f09b991d9bf07f907611a85e01281b0043f43ac8df070000c6070000a00700008d07000000000000010000000800000007000000500000003000000080000000 +200000000000000046006600400000003a0000002800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000051000000a0000000e00700008d0700001f080000c6070000e007 +00008d07000000000000010000000800000007000000500000003000000080000000200000000000000046006600400000003a0000002800000008000000080000000100010000000000200000000500530075006d006d0061007200790049006e0066006f0072006d006100740069006f006e0000000000000000000000 +00000000000000000000000000000000280002010700000009000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000f20100000010000000000000050044006f00630075006d0065006e007400530075006d006d0061007200790049006e0066006f0072006d006100 +740069006f006e000000000000000000000038000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000fb01000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feff0000040002000000000000000000000000000000000001000000e0859ff2f94f6810ab910800 +2b27b3d93000000078010000110000000100000090000000020000009800000003000000a400000004000000b000000005000000c800000006000000d400000007000000e000000008000000f4000000090000000c01000012000000180100000a000000340100000c000000400100000d0000004c0100000e0000005801 +00000f000000600100001000000068010000130000007001000002000000e40400001e00000001000000000073001e00000001000000000073001e000000100000004b72697320546869656c656d616e73001e00000001000000007269731e00000001000000007269731e0000000b0000004e6f726d616c2e646f74006d +1e000000100000004b72697320546869656c656d616e73001e00000002000000320069731e000000130000004d6963726f736f667420576f726420392e30000040000000008c8647000000004000000000fc3f3d7687c301400000000088c6847687c3010300000001000000030000000000000003000000000000000300 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000102000002020000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeff000004000200000000000000000000000000000000000100000002d5cdd59c2e1b10939708002b2cf9ae30000000ec0000000c00000001000000680000000f0000007000000005000000800000000600000088000000110000009000 +000017000000980000000b000000a000000010000000a800000013000000b000000016000000b80000000d000000c00000000c000000cd00000002000000e40400001e000000050000004952534c0069746c03000000010000000300000001000000030000000000000003000000321109000b000000000000000b000000 +000000000b000000000000000b000000000000001e1000000100000001000000000c100000020000001e000000060000005469746c65000300000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050000050000000d0000004d45544146494c4550494354006e410000 +a6ccffffe833030008006e415a330000 +010009000003f099010016004c00000000000400000003010800050000000b0200000000050000000c02220c730f040000002e0118001c000000fb021000070000000000bc02000000000102022253797374656d000c730f000004b81100e172c730181022000c020000730f0000040000002d0100000400000002010100 +050000000902000000021c000000fb029cff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d010100030000001e00070000001604210c750f00000000030000001e00040000002c010000030000001e00030000001e0008000000fa02 +00000000000000000000040000002d01020007000000fc020000ffffff000000040000002d010300040000002e01000005000000090200000000050000000102ffffff000400000004010d001c000000fb029cff0000000000009001000000000740001254696d6573204e657720526f6d616e0000000000000000000000 +000000000000040000002d0104001c000000fb021000070000000000bc02000000000700000253797374656d0000000000000000000000000000000000000000000000000000040000002d01050004000000020101001c000000fb02adff0000000000009001000000000740001254696d6573204e657720526f6d616e00 +00000000000000000000000000000000040000002d010600050000000902000000000d000000320a0c0000000100040000000000780f210c202b260007000000fc020100000000000000040000002d01070008000000fa02050000000000ffffff00040000002d010800070000001b04950b4e04fe0afa0307000000fc02 +0000ffffff000000040000002d01090008000000fa0200000000000000000000040000002d010a00030000001e00070000001604930b4d04fe0afa0304000000020101001c000000fb029cff0000000000009001010000000740001254494d45530000000000000000000000000000000000000000000000000000000400 +00002d010b000d000000320a110bfa0301000400fa03fe0a4c04930b722b2700040000002d0106000d000000320a1c0b210401000400fa03fe0a4c04930b202b2600040000002701ffff040000002d010700040000002d010800070000001b04840b5f040e0b1b04040000002d010900040000002d010a00030000001e00 +070000001604830b5e040f0b1b0404000000020101001c000000fb02adff0000000000009001010000000740001254494d4553000000000000000000000000000000000000000000000000000000040000002d010c00050000000902000000000d000000320a1f0b1b04010004001b040f0b5d04830b732b200004000000 +2d0106000d000000320a1f0b3b04010004001b040f0b5d04830b202b2600040000002701ffff040000002d010700040000002d010800070000001b043103880b9a021b0b040000002d010900040000002d010a00030000001e000700000016043003870b9a021b0b04000000020101001c000000fb029cff000000000000 +9001000000020740001253796d626f6c0000000000000000000000000000000000000000000000000000040000002d010d00050000000902000000000d000000320a9a021b0b010004001b0b9a02860b3003322b3200040000002d0106000d000000320ac7024d0b010004001b0b9a02860b3003202b2600040000002701 +ffff040000002d010700040000002d010800070000001b042003a90bab024d0b040000002d010900040000002d010a00030000001e000700000016041f03a90bab024d0b04000000020101001c000000fb02adff0000000000009001010000020740001253796d626f6c0000000000000000000000000000000000000000 +000000000000040000002d010e00050000000902000000000d000000320aaa024d0b010004004d0bab02a80b1f03712b2b00040000002d0106000d000000320ac602780b010004004d0bab02a80b1f03202b2600040000002701ffff040000002d010700040000002d010800070000001b042003160cab02760b04000000 +2d010900040000002d010a00030000001e000700000016041f03150cab02760b0400000002010100040000002d010c000500000009020000000010000000320abb02760b03000400760bab02140c1f036d696e003c0017002a00040000002d0106000d000000320abb02f30b01000400760bab02140c1f03202b26000400 +00002701ffff08000000fa0200000800000000000000040000002d010f00040000002d01070008000000250302001204c607bf032703040000002d010a0004000000f0010f00040000002d01090008000000fa0200000800000000000000040000002d010f00040000002d01070008000000250302001204c60798041f03 +040000002d010a0004000000f0010f00040000002d01090008000000fa0200000800000000000000040000002d010f00040000002d0107000800000025030200970bc6071a0b2703040000002d010a0004000000f0010f00040000002d01090008000000fa0200000800000000000000040000002d010f00040000002d01 +07000800000025030200970bc607040c2703040000002d010a0004000000f0010f00040000002d01090008000000fa0200000800000000000000040000002d010f00040000002d0107001000000025030600cf03c403f303c2031704c2035304c4037104c6038f04c903040000002d010a0004000000f0010f0004000000 +2d01090007000000fc020000ffffff000000040000002d010f0008000000fa0200000800000000000000040000002d011000070000001b04cd08cf0bd006e503040000002d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b +2000cc00080006000000000040003200d00640042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320010074004 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200500740042800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032009007400428000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d00740042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200100840042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +35000000410b2000cc00080006000000000040003200500840042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c00 +3200900840042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000 +040000002d010f00040000002d010700070000001b04cd087304d0064004040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff000000040000002d010f0008000000fa0200000800000000000000040000002d011000070000001b04cd088c04cc087204040000002d01090004000000 +f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006c6042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007c6042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000035000000410b2000cc000800060000000000400032005007c6042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000 +0000400032009007c6042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d007c60428000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001008c604280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008c6042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00 +000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008c6042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08f904d006c604040000002d010a0004000000f0010f00040000002d010900040000002d010800040000002d010700040000000701 +040035000000410b2000cc00080006000000000040003200d00643052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000 +40003200100743052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320050074305280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200900743052800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d00743052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200100843052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000035000000410b2000cc00080006000000000040003200500843052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800 +0600000000003c003200900843052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa020000 +0800000000000000040000002d010f00040000002d010700070000001b04cd087605d0064305040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff000000040000002d010f0008000000fa0200000800000000000000040000002d011000070000001b04cd088f05cc08750504000000 +2d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006c0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007c0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd0000007700000035000000410b2000cc000800060000000000400032005007c0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000 +cc000800060000000000400032009007c0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d007c0052800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001008c00528000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008c005280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008c0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd0000007700 +0000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08f305d006c005040000002d010a0004000000f0010f00040000002d010900040000002d010800040000002d01 +0700040000000701040035000000410b2000cc00080006000000000040003200d0063d062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00 +08000600000000004000320010073d062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320050073d0628000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320090073d06280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d0073d062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320010083d062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320050083d062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000 +410b2000cc0008000600000000003c00320090083d062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d0109000400000007010100 +08000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd087006d0063d06040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff000000040000002d010f0008000000fa0200000800000000000000040000002d011000070000001b04cd089106 +cc086f06040000002d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006c20628000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007c2062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005007c2062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +35000000410b2000cc000800060000000000400032009007c2062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000 +3200d007c2062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001008c2062800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008c20628000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008c2062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08f506d006c206040000002d010a0004000000f0010f00040000002d010900040000002d01 +0800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d0063f072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000770000003500 +0000410b2000cc0008000600000000004000320010073f072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200 +50073f072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320090073f0728000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d0073f07280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320010083f072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320050083f072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000035000000410b2000cc0008000600000000003c00320090083f072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900 +040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd087207d0063f07040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff000000040000002d010f0008000000fa0200000800000000000000040000002d0110000700 +00001b04cd088b07cc087107040000002d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006bc072800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007bc072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005007bc072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000035000000410b2000cc000800060000000000400032009007bc072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800 +06000000000040003200d007bc072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001008bc07280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008bc072800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008bc072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08ef07d006bc07040000002d010a0004000000f0010f00040000002d01 +0900040000002d010800040000002d010700040000000701040035000000410b2000cc00080007000000000040003a00d00639082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +00007700000035000000410b2000cc00080007000000000040003a00100739082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000700 +0000000040003a00500739082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003a00900739082800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003a00d007390828000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003a00100839082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003a00500839082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd0000007700000035000000410b2000cc0008000700000000003c003a00900839082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00 +040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd087408d0063908040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff000000040000002d010f0008000000fa02000008000000000000000400 +00002d011000070000001b04cd088d08cc087308040000002d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006be08280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007be082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005007be082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032009007be082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000 +410b2000cc00080006000000000040003200d007be082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001008 +be082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008be08280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008be082800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08f108d006be08040000002d010a0004000000f001 +0f00040000002d010900040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d0063b092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00 +000077000000dd0000007700000035000000410b2000cc0008000600000000004000320010073b092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b +2000cc0008000600000000004000320050073b092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320090073b09 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d0073b092800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320010083b0928000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000004000320050083b092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c00320090083b092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd086e09d0063b09040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff000000040000002d010f0008000000fa0200000800 +000000000000040000002d011000070000001b04cd088709cc086d09040000002d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006b80928000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007b809280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005007b8092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032009007b8092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000035000000410b2000cc00080006000000000040003200d007b8092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000 +0000400032001008b8092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008b80928000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008b809280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08eb09d006b809040000002d01 +0a0004000000f0010f00040000002d010900040000002d010800040000002d010700040000000701040035000000410b2000cc00080007000000000040003b00d006350a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00 +000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003b001007350a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700 +000035000000410b2000cc00080007000000000040003b005007350a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800070000000000 +40003b009007350a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003b00d007350a280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003b001008350a2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080007000000000040003b005008350a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000700000000003c003b009008350a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08710ad006350a040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff000000040000002d010f000800 +0000fa0200000800000000000000040000002d011000070000001b04cd088a0acc08700a040000002d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006bb0a2800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007bb0a28000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005007bb0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032009007bb0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd0000007700000035000000410b2000cc00080006000000000040003200d007bb0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000 +cc000800060000000000400032001008bb0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008bb0a2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008bb0a28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd08ee0ad006 +bb0a040000002d010a0004000000f0010f00040000002d010900040000002d010800040000002d010700040000000701040035000000410b2000cc00080006000000000040003200d006380b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00 +000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001007380b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd0000007700000035000000410b2000cc000800060000000000400032005007380b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00 +0800060000000000400032009007380b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc00080006000000000040003200d007380b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032001008380b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc000800060000000000400032005008380b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000035000000410b2000cc0008000600000000003c0032009008380b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd00000077000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d010f00040000002d010700070000001b04cd086b0bd006380b040000002d010a0004000000f0010f00040000002d01090007000000fc020000ffffff0000000400 +00002d010f0008000000fa0200000800000000000000040000002d011000070000001b04cd08840bcc086a0b040000002d01090004000000f0010f00040000002d010a0004000000f0011000040000002d010800040000002d0107000400000007010400040000000401070035000000410b460066000800080000000000 +400040004d05e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036004d052004280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008d05e0032800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036008d0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000 +8800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000cd05e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000 +220000008800000035000000410b46006600080007000000000040003600cd0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800 +080000000000400040000d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036000d062004280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004d06e0032800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036004d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000035000000410b460066000800070000000000400036008d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b +46006600080008000000000040004000cd06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080007000000000040003600cd062004 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000d07e0032800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036000d07200428000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000 +880000002200000088000000220000008800000035000000410b460066000800070000000000400036004d0720042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200000088000000 +35000000410b4600660007000800000000003a0040008d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660007000700000000003a00 +36008d0720042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000008000000fa02000000000000ffffff00040000002d010f000400000004010b000c00000024030400 +e0034d051204c60755044d05e0034d05040000002d0108000400000004010d0007000000fc020000000000000000040000002d0110000c00000024030400e0034d051204c60755044d05e0034d05040000000401070035000000410b460066000800080000000000400040004d05e0032800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036004d05200428000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008d05e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036008d0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000035000000410b46006600080008000000000040004000cd05e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660008000700 +0000000040003600cd0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000d06e0032800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036000d06200428000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036004d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000035000000410b460066000800080000000000400040008d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600 +66000800070000000000400036008d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000cd06e0032800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080007000000000040003600cd06200428000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000d07e003280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800070000000000400036000d0720042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000035000000410b460066000800080000000000400040004d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003500 +0000410b460066000800070000000000400036004d0720042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660007000800000000003a004000 +8d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660007000700000000003a0036008d07200428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200000088000000040000002d0107000400000004010d00040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d01 +1100040000002d0107000c00000024030400e0034d051204c60755044d05e0034d05040000002d010a0004000000f0011100040000002d010900040000002d010800040000002d0107000400000007010400040000000401070035000000410b46006600080008000000000040004000c607d80328000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c6071804280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000608d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00060818042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000035000000410b460066000800080000000000400040004608d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600 +080008000000000040003e00460818042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008608d80328000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e0086081804280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000c608d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c60818042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000 +2200000088000000220000008800000035000000410b460066000800080000000000400040000609d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000 +410b46006600080008000000000040003e00060918042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004609 +d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e0046091804280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008609d8032800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00860918042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000c609d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000035000000410b46006600080008000000000040003e00c60918042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000 +40004000060ad8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00060a1804280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000002f000000410b46006600010008000000000002004000460ad8032800000008000000050000000100010000000000140000000000000000000000 +000000000000000000000000ffffff0088000000220000008800000022000000880000002f000000410b46006600010008000000000002003e00460a18042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff0088000000220000008800000022000000 +88000000040000002d010f000400000004010b000c00000024030400d803470a1204c6075504470ad803470a040000002d0108000400000004010d00040000002d0110000c00000024030400d803470a1204c6075504470ad803470a040000000401070035000000410b46006600080008000000000040004000c607d803 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c60718042800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000608d80328000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00060818042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000 +880000002200000088000000220000008800000035000000410b460066000800080000000000400040004608d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200000088000000 +35000000410b46006600080008000000000040003e00460818042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660008000800000000004000 +40008608d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00860818042800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000c608d80328000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c60818042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000609d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000035000000410b46006600080008000000000040003e00060918042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660008000800 +00000000400040004609d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00460918042800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008609d80328000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00860918042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000c609d8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000035000000410b46006600080008000000000040003e00c60918042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600 +6600080008000000000040004000060ad8032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00060a18042800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000002f000000410b46006600010008000000000002004000460ad80328000000080000000500000001000100000000001400 +00000000000000000000000000000000000000000000ffffff0088000000220000008800000022000000880000002f000000410b46006600010008000000000002003e00460a18042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00880000002200 +0000880000002200000088000000040000002d0107000400000004010d00040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d011100040000002d0107000c00000024030400d803470a1204c6075504470ad803470a040000002d010a0004000000f0011100 +040000002d010900040000002d010800040000002d0107000400000007010400040000000401070035000000410b46006600080008000000000040004000c607550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000 +880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c607950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200000088000000 +35000000410b460066000800080000000000400040000608550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660008000800000000004000 +3e000608950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004608550b2800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004608950b28000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008608550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e008608950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000035000000410b46006600080008000000000040004000c608550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660008000800 +0000000040003e00c608950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000609550b2800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e000609950b28000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004609550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004609950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000035000000410b460066000800080000000000400040008609550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600 +6600080008000000000040003e008609950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000c609550b2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c609950b28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000060a550b280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00060a950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800 +0000220000008800000022000000880000002f000000410b46006600010008000000000002004000460a550b2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff0088000000220000008800000022000000880000002f000000410b4600660001000800 +0000000002003e00460a950b2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff008800000022000000880000002200000088000000040000002d010f000400000004010b000c00000024030400550b470a970bc607d20b470a550b470a040000002d01 +08000400000004010d00040000002d0110000c00000024030400550b470a970bc607d20b470a550b470a040000000401070035000000410b46006600080008000000000040004000c607550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c607950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000035000000410b460066000800080000000000400040000608550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600 +080008000000000040003e000608950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004608550b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004608950b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008608550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e008608950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000 +2200000088000000220000008800000035000000410b46006600080008000000000040004000c608550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000 +410b46006600080008000000000040003e00c608950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000609 +550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e000609950b280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004609550b2800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004609950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008609550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000035000000410b46006600080008000000000040003e008609950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000 +40004000c609550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00c609950b280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000060a550b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00060a950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000 +880000002200000088000000220000008800000022000000880000002f000000410b46006600010008000000000002004000460a550b2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff0088000000220000008800000022000000880000002f000000 +410b46006600010008000000000002003e00460a950b2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff008800000022000000880000002200000088000000040000002d0107000400000004010d00040000002d010a00040000002d01090004000000 +0701010008000000fa0200000800000000000000040000002d011100040000002d0107000c00000024030400550b470a970bc607d20b470a550b470a040000002d010a0004000000f0011100040000002d010900040000002d010800040000002d0107000400000007010400040000000401070035000000410b46006600 +0800080000000000400040004d05550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004d05950b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008d05550b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e008d05950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000cd05550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000 +2200000088000000220000008800000035000000410b46006600080008000000000040003e00cd05950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000 +410b460066000800080000000000400040000d06550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e000d06 +950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004d06550b280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004d06950b2800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008d06550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e008d06950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000035000000410b46006600080008000000000040004000cd06550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000 +40003e00cd06950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000d07550b280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e000d07950b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004d07550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000 +8800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004d07950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000 +220000008800000035000000410b4600660007000800000000003a0040008d07550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000700 +0800000000003a003e008d07950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000220000008800000022000000880000002200000088000000040000002d010f000400000004010b000c00000024030400550b4d05970bc607 +d20b4d05550b4d05040000002d0108000400000004010d00040000002d0110000c00000024030400550b4d05970bc607d20b4d05550b4d05040000000401070035000000410b460066000800080000000000400040004d05550b280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004d05950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200000088000000 +22000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040008d05550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000 +8800000035000000410b46006600080008000000000040003e008d05950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000 +000040004000cd05550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00cd05950b28000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000d06550b280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e000d06950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040004d06550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000035000000410b46006600080008000000000040003e004d06950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600 +0800080000000000400040008d06550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e008d06950b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040004000cd06550b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e00cd06950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b460066000800080000000000400040000d07550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff0022000000880000002200000088000000 +2200000088000000220000008800000035000000410b46006600080008000000000040003e000d07950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000 +410b460066000800080000000000400040004d07550b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b46006600080008000000000040003e004d07 +950b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660007000800000000003a0040008d07550b280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000035000000410b4600660007000800000000003a003e008d07950b2800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff002200000088000000220000008800000022000000880000002200000088000000040000002d0107000400000004010d00040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d011100040000002d0107000c00000024030400550b4d05 +970bc607d20b4d05550b4d05040000002d010a0004000000f0011100040000002d010900040000002d010800040000002d0107000400000007010400040000000401070035000000410b460066000800080000000000400040004d05e0032800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0560042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800080000000000400040004d05a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004d05e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d052005280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0560052800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0520062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040004d0560062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a006 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e0062800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05200728000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0560072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040004d05e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40004d0520082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0560082800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a00828000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0520092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040004d0560092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040004d05a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e0092800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05200a28000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040004d05200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05600b2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033004d05a00b28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e003280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0560042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040008d05a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +8d05e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05200528000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d056005280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040008d0520062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040008d0560062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a00628000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e006280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0560072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040008d05a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040008d05e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05200828000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d056008280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040008d0560092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05 +a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e009280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05200a2800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040008d05e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040008d05200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05600b280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033008d05a00b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000cd0560042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000cd05a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e004280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0520052800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0560052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000cd0520062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd056006 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a0062800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e00628000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0520072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0560072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000cd05a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000cd05e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0520082800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05600828000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000cd0520092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000cd0560092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a0092800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e00928000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080008000000000040004000cd05e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05200b2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05600b28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080006000000000040003300cd05a00b280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040000d0660042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +0d06a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e00428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d062005280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040000d06e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040000d0620062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06600628000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a006280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040000d0660072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040000d06a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e00728000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d062008280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040000d0620092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06 +60092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a009280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0092800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040000d06a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040000d06e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06200b280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06600b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033000d06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800080000000000400040004d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004d0660042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a004280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0042800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0620052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040004d06e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d062006 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0660062800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a00628000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040004d0660072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40004d06a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0072800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06200828000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040004d06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040004d0620092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0660092800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a00928000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040004d06a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e00a2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06200b28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06600b280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033004d06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040008d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +8d0660042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a00428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e004280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0620052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040008d06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040008d06e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06200628000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d066006280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040008d0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040008d0660072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a00728000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e007280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0620082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040008d06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06 +20092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d066009280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a0092800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040008d06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040008d06a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e00a280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06200b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033008d06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000cd06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000cd0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd066004280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a0042800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0620052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000cd06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e005 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0620062800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06600628000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000cd0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000cd0660072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a0072800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e00728000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0620082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000cd06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000cd06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0620092800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06600928000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080008000000000040004000cd06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a00a2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e00a28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06200b280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b46006600080006000000000040003300cd06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040000d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +0d0720042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07600428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a004280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0720052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040000d0760052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040000d07a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e00528000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d072006280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0760062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040000d07e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040000d0720072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07600728000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a007280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0720082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0760082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040000d07a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07 +e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d072009280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0760092800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040000d07200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040000d07600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a00a280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e00a2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800060000000000400033000d07a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d072004280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0760042800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0720052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040004d0760052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a005 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e0052800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07200628000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0760062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040004d07e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40004d0720072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0760072800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a00728000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0720082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040004d0760082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040004d07a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e0082800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07200928000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0760092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040004d07200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07600a2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a00a28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e00a280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800060000000000400033004d07a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a004000 +8d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07200428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d076004280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b4600660007000800000000003a0040008d0720052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600070008000000 +00003a0040008d0760052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a00528000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e005280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0720062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0760062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +07000800000000003a0040008d07e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07200728000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d076007280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0720082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b4600660007000800000000003a0040008d0760082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07 +a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e008280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0720092800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0760092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b4600660007000800000000003a0040008d07e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000700080000000000 +3a0040008d07200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07600a280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a00a2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b4600660007000800000000003a0040008d07600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000700 +0600000000003a0033008d07a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000040000002d010f000400000004010b000c00000024030400e0034d05d20b4d05 +d107c607e0034d05040000002d0108000400000004010d00040000002d0110000c00000024030400e0034d05d20b4d05d107c607e0034d05040000000401070035000000410b460066000800080000000000400040004d05e003280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0560042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040004d05a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040004d05e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05200528000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d056005280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040004d0520062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040004d0560062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a00628000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e006280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0520072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0560072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040004d05e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05 +20082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d056008280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a0082800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0520092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040004d0560092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040004d05a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05e009280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05200a2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800080000000000400040004d05e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004d05200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d05600b280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033004d05a00b2800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0560042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040008d05a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e004 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520052800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05600528000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040008d0520062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40008d0560062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a0062800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e00628000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0560072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040008d05a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040008d05e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520082800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05600828000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0520092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040008d0560092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a0092800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05e00928000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05200a280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040008d05e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +8d05200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d05600b28000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033008d05a00b280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0520042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000cd0560042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +000040004000cd05a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e00428000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd052005280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0560052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +080008000000000040004000cd0520062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05600628000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a006280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0520072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0560072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000cd05a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05 +e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd052008280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0560082800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b46006600080008000000000040004000cd0520092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +40004000cd0560092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05a009280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05e0092800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000cd05a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000cd05e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05200b280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd05600b2800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080006000000000040003300cd05a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040000d0660042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a004 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0042800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06200528000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040000d06e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40000d0620062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0660062800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a00628000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040000d0660072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040000d06a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0072800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06200828000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040000d0620092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0660092800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06a00928000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06e009280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040000d06a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +0d06e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06200b28000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d06600b280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033000d06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040004d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040004d0660042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a00428000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e004280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0620052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040004d06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040004d06e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06200628000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d066006280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040004d0660072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06 +a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e007280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0620082800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040004d06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040004d0620092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d066009280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06a0092800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800080000000000400040004d06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004d06a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06e00a280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06200b2800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d06600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033004d06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040008d0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d066004 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a0042800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e00428000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0620052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040008d06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40008d06e0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0620062800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06600628000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040008d0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040008d0660072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a0072800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e00728000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0620082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040008d06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d0620092800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06600928000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06a009280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040008d06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +8d06a00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06e00a28000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06200b280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008d06600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800060000000000400033008d06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000cd06e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +000040004000cd0620042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06600428000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a004280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0620052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b46006600080008000000000040004000cd0660052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +080008000000000040004000cd06a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e00528000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd062006280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0660062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000cd0620072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06 +60072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a007280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e0072800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0620082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0660082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b46006600080008000000000040004000cd06a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +40004000cd06e0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd062009280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd0660092800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000cd06200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000cd06600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06a00a280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06e00a2800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000cd06600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080006000000000040003300cd06a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040000d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d072004 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0760042800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a00428000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0720052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040000d0760052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40000d07a0052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0052800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07200628000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0760062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040000d07e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040000d0720072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0760072800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a00728000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0720082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040000d0760082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040000d07a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0082800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07200928000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d076009280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040000d07200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +0d07600a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07a00a28000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07e00a280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000d07600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800060000000000400033000d07a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040004d07e0032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07200428000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d076004280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040004d0720052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040004d0760052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a00528000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e005280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0720062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0760062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040004d07e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07 +20072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d076007280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a0072800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0720082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040004d0760082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040004d07a0082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e008280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0720092800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d0760092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800080000000000400040004d07e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004d07200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07600a280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07a00a2800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040004d07600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800060000000000400033004d07a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e003 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0720042800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07600428000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e0042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b4600660007000800000000003a0040008d0720052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a00 +40008d0760052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0052800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e00528000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0720062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0760062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b4600660007000800000000003a0040008d07a0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800 +000000003a0040008d07e0062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0720072800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07600728000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e0072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0720082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +660007000800000000003a0040008d0760082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0082800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e00828000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d072009280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d0760092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b4600660007000800000000003a0040008d07e0092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a004000 +8d07200a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07600a28000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07a00a280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07e00a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660007000800000000003a0040008d07200b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b4600660007000800000000003a0040008d07600b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600070006000000 +00003a0033008d07a00b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000040000002d0107000400000004010d00040000002d010a00040000002d01090004000000 +0701010008000000fa0200000800000000000000040000002d011100040000002d0107000c00000024030400e0034d05d20b4d05d107c607e0034d05040000002d010a0004000000f0011100040000002d010900040000002d010800040000002d0107000400000007010400040000000401070035000000410b46006600 +080008000000000040004000c607e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607290428000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6076904280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60729052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000c60769052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607 +a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e905280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60729062800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60769062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b46006600080008000000000040004000c607e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +40004000c60729072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6076907280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a9072800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60729082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000c60769082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000c607a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e908280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60729092800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60769092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000c607290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607690a +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a90a2800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e90a28000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080005000000000040002a00c607a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40000608e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060829042800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608690428000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000060829052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000060869052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a9052800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e90528000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040000608e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060829072800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608690728000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a907280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b46006600080008000000000040004000060869082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +0608a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e90828000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400006082909280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040000608e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040000608290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608690a28000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a90a280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040000608690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +080005000000000040002a000608a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e90328000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400046082904280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460869042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000460829052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608 +69052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a905280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e9052800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040004608a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040004608e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400046082907280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460869072800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000460829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000460869082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a908280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e9082800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460829092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040004608e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608290a +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608690a2800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a90a28000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040004608690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000500000000004000 +2a004608a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e9032800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608290428000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860869042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040008608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000860829052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860869052800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a90528000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000860869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040008608a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e9062800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608290728000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400086086907280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b46006600080008000000000040004000860829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +860869082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a90828000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e908280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860829092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040008608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040008608e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608290a28000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608690a280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040008608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040008608690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a008608a90b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e903280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60829042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60869042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000c608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608 +29052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6086905280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a9052800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b46006600080008000000000040004000c60869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +40004000c608a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e906280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60829072800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60869072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000c608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000c60829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6086908280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a9082800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60829092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000c608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e909 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608290a2800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608690a28000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000c608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000c608690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a00c608a90b2800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e90328000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040000609a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040000609e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060929052800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609690528000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000060929062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080008000000000040004000060969062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a9062800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e90628000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400006092907280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040000609e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +060929082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609690828000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a908280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000060969092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040000609a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e90928000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609290a280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040000609e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040000609290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609690b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a000609a90b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040004609a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609 +e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400046092905280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460969052800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b46006600080008000000000040004000460929062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +40004000460969062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a906280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9062800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460929072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800080000000000400040004609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004609e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400046092908280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460969082800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000460969092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a909 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9092800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609290a28000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040004609e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40004609290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609690b2800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a004609a90b28000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000860969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040008609a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9042800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609290528000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860969052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080008000000000040004000860929062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860969062800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a90628000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e906280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860929072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040008609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +8609e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609290828000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400086096908280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000860929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +000040004000860969092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a90928000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e909280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040008609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040008609e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609290b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609690b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a008609a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000c60969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609 +a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e904280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60929052800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60969052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b46006600080008000000000040004000c609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +40004000c60929062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6096906280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a9062800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60929072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000c60969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000c609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e907280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60929082800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60969082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000c60929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6096909 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a9092800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e90928000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000c609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000c609e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609290b2800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609690b28000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a00c609a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000060a29042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000060a69042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa9042800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae90428000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a29052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a69052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080008000000000040004000060ae9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a29062800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a690628000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa906280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a29072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b46006600080008000000000040004000060a69072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +060aa9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae90728000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a2908280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a69082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000060ae9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +000040004000060a29092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a690928000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa909280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b46006600080008000000000040004000060a690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +080008000000000040004000060aa90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae90a28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a290b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a00060aa90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460ae9032800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000 +000002004000460a29042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690428000000080000000500000001000100000000001400 +00000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff00 +0000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460ae9042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b460066000100080000000000 +02004000460a29052800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a6905280000000800000005000000010001000000000014000000 +0000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9052800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000 +ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460ae9052800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b4600660001000800000000000200 +4000460a29062800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a69062800000008000000050000000100010000000000140000000000 +000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9062800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff00 +0000ff0000007f0000002f000000410b46006600010008000000000002004000460ae9062800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000 +460a29072800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690728000000080000000500000001000100000000001400000000000000 +00000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9072800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000 +ff0000007f0000002f000000410b46006600010008000000000002004000460ae9072800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a +29082800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a6908280000000800000005000000010001000000000014000000000000000000 +0000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9082800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff00 +00007f0000002f000000410b46006600010008000000000002004000460ae9082800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a2909 +2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a69092800000008000000050000000100010000000000140000000000000000000000 +000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9092800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff000000 +7f0000002f000000410b46006600010008000000000002004000460ae9092800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a290a2800 +000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690a28000000080000000500000001000100000000001400000000000000000000000000 +00000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa90a2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f00 +00002f000000410b46006600010008000000000002004000460ae90a2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a290b28000000 +08000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690b280000000800000005000000010001000000000014000000000000000000000000000000 +0000000000000000ffffff00f7000000ff000000ff000000ff0000007f00000035000000410b46006600010005000000000002002a00460aa90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f000000040000002d010f000400000004010b000c00000024030400e903470ad20b470ad107c607e903470a040000002d0108000400000004010d00040000002d0110000c00000024030400e903470ad20b470ad107c607e903470a040000000401070035000000410b460066000800080000000000 +40004000c607e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6072904280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60769042800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000c60729052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000c60769052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a905280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e9052800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60729062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60769062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000c607e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6072907 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60769072800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a90728000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60729082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000c60769082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000c607a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e9082800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607290928000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60769092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000c607e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000c607290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607690a2800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607a90a28000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000c607690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080005000000000040002a00c607a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e9032800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608290428000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400006086904280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b46006600080008000000000040004000060829052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +060869052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a90528000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e905280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040000608a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040000608e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608290728000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400006086907280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b46006600080008000000000040004000060829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +080008000000000040004000060869082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a90828000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e908280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060829092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040000608e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608 +290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608690a280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608a90a2800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040000608690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800050000000000 +40002a000608a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e903280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460829042800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460869042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b460066000800080000000000400040004608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000460829052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400046086905280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a9052800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +460066000800080000000000400040004608a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e906 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460829072800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608690728000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000460829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000460869082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a9082800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e90828000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460829092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b460066000800080000000000400040004608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +00000000400040004608e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608290a2800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608690a28000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040004608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040004608690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a004608a90b2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e90328000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400086082904280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860869042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040008608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +860829052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608690528000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a905280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000860869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +0000400040008608a9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e90628000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400086082907280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860869072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040008608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +080008000000000040004000860829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608690828000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a908280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860829092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b460066000800080000000000400040008608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608 +e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608290a280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608690a2800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040008608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040008608690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a008608a90b280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e9032800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60829042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60869042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000c608a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000c608e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6082905280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60869052800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60829062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000c60869062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a906 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e9062800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608290728000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60869072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000c608e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000c60829082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60869082800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a90828000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60829092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000c60869092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000c608a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e9092800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608290a28000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080008000000000040004000c608290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c608690b2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a00c608a90b28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e903280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b460066000800080000000000400040000609a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +0609e9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609290528000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400006096905280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000060929062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +000040004000060969062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a90628000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e906280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060929072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b460066000800080000000000400040000609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040000609e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609290828000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400006096908280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000060969092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609 +a9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609e909280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609290a2800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040000609e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040000609290b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040000609690b280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a000609a90b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000460969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +080000000000400040004609a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e904280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460929052800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460969052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000460929062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400046096906 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a9062800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e90628000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460929072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b460066000800080000000000400040004609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +40004609e9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000460929082800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609690828000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000460929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000460969092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a9092800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609e90928000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b460066000800080000000000400040004609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +66000800080000000000400040004609e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609290b2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040004609690b28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a004609a90b280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b46006600080008000000000040004000860969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +8609a9042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e90428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400086092905280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860969052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b460066000800080000000000400040008609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +000040004000860929062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609690628000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a906280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860929072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b46006600080008000000000040004000860969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +0800080000000000400040008609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e90728000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000400086092908280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000860969082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000860929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609 +69092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609a909280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609e9092800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b460066000800080000000000400040008609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +400040008609e90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609290b280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000400040008609690b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a008609a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f00000035000000410b46006600080008000000000040004000c60929042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800 +08000000000040004000c60969042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a904280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9042800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60929052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60969052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b +46006600080008000000000040004000c609e9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c6092906 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60969062800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a90628000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000 +f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60929072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f000000 +35000000410b46006600080008000000000040004000c60969072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800000000004000 +4000c609a9072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9072800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609290828000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60969082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000035000000410b46006600080008000000000040004000c609e9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600660008000800 +0000000040004000c60929092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c60969092800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609a90928000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000 +ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b4600 +6600080008000000000040004000c609a90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609e90a2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609290b28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000c609690b280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a00c609a90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae9032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003500 +0000410b46006600080008000000000040004000060a29042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000 +060a69042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa90428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae904280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a29052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a69052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f00000035000000410b46006600080008000000000040004000060aa9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000 +000040004000060ae9052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a290628000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a6906280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae9062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000035000000410b46006600080008000000000040004000060a29072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600 +080008000000000040004000060a69072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa90728000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae907280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a29082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a69082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000 +ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000 +410b46006600080008000000000040004000060ae9082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a +29092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a6909280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060aa9092800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae9092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a290a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000035000000410b46006600080008000000000040004000060a690a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b460066000800080000000000 +40004000060aa90a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060ae90a280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a290b2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080008000000000040004000060a690b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000ff000000f7000000ff000000ff000000ff0000007f00000035000000410b46006600080005000000000040002a00060aa90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000 +ff0000007f0000002f000000410b46006600010008000000000002004000460ae9032800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a +29042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a6904280000000800000005000000010001000000000014000000000000000000 +0000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff00 +00007f0000002f000000410b46006600010008000000000002004000460ae9042800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a2905 +2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a69052800000008000000050000000100010000000000140000000000000000000000 +000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9052800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff000000 +7f0000002f000000410b46006600010008000000000002004000460ae9052800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a29062800 +000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690628000000080000000500000001000100000000001400000000000000000000000000 +00000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9062800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f00 +00002f000000410b46006600010008000000000002004000460ae9062800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a290728000000 +08000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a6907280000000800000005000000010001000000000014000000000000000000000000000000 +0000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9072800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f000000 +2f000000410b46006600010008000000000002004000460ae9072800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a2908280000000800 +0000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a69082800000008000000050000000100010000000000140000000000000000000000000000000000 +000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9082800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f00 +0000410b46006600010008000000000002004000460ae9082800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a29092800000008000000 +050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690928000000080000000500000001000100000000001400000000000000000000000000000000000000 +00000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa9092800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000 +410b46006600010008000000000002004000460ae9092800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a290a28000000080000000500 +00000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690a280000000800000005000000010001000000000014000000000000000000000000000000000000000000 +0000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460aa90a2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b +46006600010008000000000002004000460ae90a2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a290b280000000800000005000000 +0100010000000000140000000000000000000000000000000000000000000000ffffff00f7000000ff000000ff000000ff0000007f0000002f000000410b46006600010008000000000002004000460a690b2800000008000000050000000100010000000000140000000000000000000000000000000000000000000000 +ffffff00f7000000ff000000ff000000ff0000007f00000035000000410b46006600010005000000000002002a00460aa90b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff000000 +7f000000040000002d0107000400000004010d00040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d011100040000002d0107000c00000024030400e903470ad20b470ad107c607e903470a040000002d010a0004000000f0011100040000002d0109000400 +00002d010700040000002d010800070000001b049704b00a2104fc04040000002d010900040000002d010a00030000001e000700000016049504af0a2104fc0404000000020101001c000000fb02adff0000000000009001000000000740001254494d455300000000000000000000000000000000000000000000000000 +0000040000002d011100050000000902000000004c000000320a3104fc042b000400fc042104ae0a9504417869616c2073656374696f6e207468726f75676820612063796c696e64726963616c207363616e6e6572003c002a001700250017001500200025002500170017002a002a00150017002a001c002a0029002a00 +2a0015002500150024002a00170017002a0029001c00170025002500170015002000250025002a002a0025001c00040000002d0106000d000000320a3104950a01000400fc042104ae0a9504202b2500040000002701ffff040000002d010700040000002d010800070000001b0431031b049a02ae03040000002d010900 +040000002d010a00030000001e0007000000160430031b049a02ae030400000002010100040000002d010d00050000000902000000000d000000320a9a02ae0301000400ae039a021a043003322b3200040000002d0106000d000000320ac702e00301000400ae039a021a043003202b2600040000002701ffff04000000 +2d010700040000002d010800070000001b0420033d04ab02e103040000002d010900040000002d010a00030000001e000700000016041f033d04ab02e1030400000002010100040000002d010e00050000000902000000000d000000320aaa02e10301000400e103ab023c041f03712b2b00040000002d0106000d000000 +320ac6020c0401000400e103ab023c041f03202b2600040000002701ffff040000002d010700040000002d010800070000001b042003aa04ab020a04040000002d010900040000002d010a00030000001e000700000016041f03a904ab020a040400000002010100040000002d010c000500000009020000000010000000 +320abb020a04030004000a04ab02a8041f036d696e003c0017002a00040000002d0106000d000000320abb028704010004000a04ab02a8041f03202b2600040000002701ffff040000002d010700040000002d010800070000001b043907b907c4065c07040000002d010900040000002d010a00030000001e0007000000 +16043807b807c4065c0704000000020101001c000000fb02adff0000000000009001000000020740001253796d626f6c0000000000000000000000000000000000000000000000000000040000002d011200050000000902000000000d000000320ac3065c07010004005c07c406b7073807322b2a00040000002d010600 +0d000000320adf068607010004005c07c406b7073807202b2600040000002701ffff040000002d010700040000002d010800070000001b043907e307c4068607040000002d010900040000002d010a00030000001e000700000016043807e207c40686070400000002010100040000002d010e0005000000090200000000 +0d000000320ac3068607010004008607c406e1073807712b2b00040000002d0106000d000000320adf06b107010004008607c406e1073807202b2600040000002701ffff040000002d010700040000002d010800070000001b0439075708c406b007040000002d010900040000002d010a00030000001e00070000001604 +38075708c406b0070400000002010100040000002d010c000500000009020000000010000000320ad406b00703000400b007c406560838076d6178003c002a002500040000002d0106000d000000320ad4063b0801000400b007c40656083807202b2600040000002701ffff040000002d010700040000002d0108000700 +00001b04e00be20a6a0b2605040000002d010900040000002d010a00030000001e00070000001604de0be10a6a0b26050400000002010100040000002d011100050000000902000000004c000000320a7a0b26052b00040026056a0be00ade0b4c61726765737420616363657074616e6365206174207468652063656e74 +7265206f662074686520464f5600330025001c002a00250020001700150025002500250025002a00170025002a0025002500150025001700150017002a0025001500250024002a0016001c00250015002a001c00150017002a00240015002e003c003c00040000002d0106000d000000320a7a0bde0a0100040026056a0b +e00ade0b202b2600040000002701ffff040000002d010700040000002d010800070000001b04a40a4f0f2e0a150c040000002d010900040000002d010a00030000001e00070000001604a20a4f0f2e0a150c0400000002010100040000002d011100050000000902000000002f000000320a3e0a150c18000400150c2e0a +4e0fa20a536d616c6c65737420616363657074616e636520617420202e004100250017001700250020001700150025002500250025002a00170025002a002500250015002500170015001500040000002d0106000d000000320a3e0a310f01000400150c2e0a4e0fa20a202b2600040000002701ffff040000002d010700 +040000002d010800070000001b04080bf30e920a4f0c040000002d010900040000002d010a00030000001e00070000001604060bf30e920a4f0c0400000002010100040000002d0111000500000009020000000028000000320aa20a4f0c130004004f0c920af20e060b7468652074776f2065787472656d697469657320 +17002a002500150017003c002a00150025002a0017001c002500410017001700170025002000040000002d0106000d000000320aa20ace0e010004004f0c920af20e060b202b2600040000002701ffff040000002d010700040000002d010800070000001b045006440eda05470c040000002d010900040000002d010a00 +030000001e000700000016044f06440eda05470c0400000002010100040000002d011100050000000902000000001d000000320aea05470c0c000400470cda05430e4f06496d61676520766f6c756d651c00410025002a002500150029002a0017002a0041002500040000002d0106000d000000320aea05270e01000400 +470cda05430e4f06202b2500040000002701ffff08000000fa0200000800000000000000040000002d011300040000002d0107000e000000250305002c0be103660bdd03a00bdb03ca0bdc03f40bde03040000002d010a0004000000f0011300040000002d01090007000000fc020000ffffff000000040000002d011300 +040000002d010800040000002d0113000c00000040092100f00000000000000096009600c607fe0c040000002d011300040000002d01090004000000f0011300040000002d010a00040000002d010700040000002d010800070000001b045d08740dc607200d040000002d010900040000002d010a00030000001e000700 +000016045b08740dc607200d0400000002010100040000002d010b00050000000902000000000d000000320ad907200d01000400200dc607730d5b087a2b2700040000002d0106000d000000320ae407470d01000400200dc607730d5b08202b2600040000002701ffff030000001e00040000002e010000050000000902 +00000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660014019e07970228000000200000000b00000001000100000000002c00 +00000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff81b037fffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01 +000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660014019e074c0328000000200000000b0000000100 +0100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc0d81bfffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff03000000 +1e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660013019e07fd03280000002000 +00000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe06c0dfffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a0004000000 +2701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660012019e07 +a90428000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb03607fffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d01090004000000 +2d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b0020000000 +0000660013019e07540528000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffd81b03fffffffffffffffffffffffffffffffffffffffff050000000102ffffff000500000009020000000004000000 +2d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc600 +88000b00200000000000660012019e07090628000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffec0d81fffffffffffffffffffffffffffffffffffffffff050000000102ffffff00050000000902 +00000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff0005000000090200000000 +3b000000410bc60088000b00200000000000660013019e07b40628000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb606c1fffffffffffffffffffffffffffffffffffffffff050000000102ffff +ff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff000500 +00000902000000003b000000410bc60088000b00200000000000660013019e07680728000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9b0361fffffffffffffffffffffffffffffffffffffffff +050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff000500000009020000000005000000 +0102ffffff00050000000902000000003b000000410bc60088000b00200000000000660013019e07140828000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8d81b1fffffffffffffffffffffffff +ffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffffff00050000000902 +00000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660012019e07c00828000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff86c0d9fffffffff +ffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100050000000102ffff +ff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660012019e07740928000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffff +f83606dfffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400000002010100 +050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660013019e071f0a28000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00ffffffffffffffffffffffff +fffffffffffffffff81b037fffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d010800 +0400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660013019e07cd0a28000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00ffffffff +fffffffffffffffffffffffffffffffffc0d81bfffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700 +040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000660013019e07820b28000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000 +ffffff00fffffffffffffffffffffffffffffffffffffffffe06c0dfffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00 +040000002d010700040000002d0108000400000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b001c00000000006600f2009e072b0c280000001e0000000b00000001000100000000002c000000000000000000000000000000 +0000000000000000ffffff00fffffffcfffffffcfffffffcfffffffcfffffffcfb0361fcfffffffcfffffffcfffffffcfffffffcfffffffc050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff08000000fa0200000800000000000000040000002d0113000700 +0000fc020000000000000000040000002d0114000e00000024030500300dc607e50cdf07e50cc607e50cad07300dc607040000002d010a0004000000f0011300040000002d01090004000000f0011400040000002d010800040000002d010700040000000701040035000000410b2000cc00080008000000000040004000 +d404e5032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404250428000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d4046504280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404a5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000 +f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404e5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000 +bf00000035000000410b2000cc00080008000000000040004000d40425052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000 +000040004000d40465052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404a50528000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404e505280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d40425062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d40465062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff00 +00005f000000bf00000035000000410b2000cc00080008000000000040004000d404a5062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00 +080008000000000040004000d404e5062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404250728000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d4046507280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404a5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404e5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000 +ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d40425082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000 +410b2000cc00080008000000000040004000d40465082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404 +a5082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404e508280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d40425092800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d40465092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f500 +0000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404a5092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00 +000035000000410b2000cc00080008000000000040004000d404e5092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc000800080000000000 +40004000d404250a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404650a280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404a50a2800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404e50a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc00080008000000000040004000d404250b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff000000 +5f000000bf00000035000000410b2000cc00080008000000000040004000d404650b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc000800 +06000000000040003100d404a50b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405e503280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d004000140525042800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d004000140565042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405a5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff00 +0000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405e5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b +2000cc0008000800000000003d004000140525052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d00400014056505 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405a5052800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405e50528000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d004000140525062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000 +fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d004000140565062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000 +35000000410b2000cc0008000800000000003d0040001405a5062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d00 +40001405e5062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d004000140525072800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405650728000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405a5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff00 +0000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405e5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f00 +0000bf00000035000000410b2000cc0008000800000000003d004000140525082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800 +000000003d004000140565082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405a5082800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405e50828000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d004000140525092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d004000140565092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000 +ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405a5092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000 +cc0008000800000000003d0040001405e5092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405250a2800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405650a28000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405a50a280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405e50a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb00 +0000ff000000ff0000005f000000bf00000035000000410b2000cc0008000800000000003d0040001405250b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf0000003500 +0000410b2000cc0008000800000000003d0040001405650b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000035000000410b2000cc0008000600000000003d003100 +1405a50b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000040000002d010a00040000002d010900040000000701010008000000fa02000008000000000000000400 +00002d011300040000002d010700070000001b045205d70bd404e503040000002d010a0004000000f0011300040000002d010900040000002d010800040000002d010700040000000701040035000000410b2000cc00080008000000000040004000d404e503280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d40425042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d40465042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000 +ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404a5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000 +410b2000cc00080008000000000040004000d404e5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404 +25052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d4046505280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404a5052800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404e5052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff00 +00007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d40425062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000035000000410b2000cc00080008000000000040004000d40465062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000 +40004000d404a5062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404e506280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d40425072800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d40465072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404a5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000 +ff0000007f00000035000000410b2000cc00080008000000000040004000d404e5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800 +08000000000040004000d40425082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d4046508280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404a5082800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404e5082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d40425092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff00 +0000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d40465092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b +2000cc00080008000000000040004000d404a5092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404e509 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404250a2800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404650a28000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404a50a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000d404e50a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000 +35000000410b2000cc00080008000000000040004000d404250b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000004000 +4000d404650b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080006000000000040003100d404a50b2800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405e50328000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d004000140525042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f700 +0000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d004000140565042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff00 +00007f00000035000000410b2000cc0008000800000000003d0040001405a5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800 +000000003d0040001405e5042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d004000140525052800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405650528000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405a5052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405e5052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000035000000410b2000cc0008000800000000003d004000140525062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000 +cc0008000800000000003d004000140565062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405a5062800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405e50628000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d00400014052507280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d004000140565072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f00 +0000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405a5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f0000003500 +0000410b2000cc0008000800000000003d0040001405e5072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d004000 +140525082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405650828000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405a508280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405e5082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000 +ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d004000140525092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff000000 +7f00000035000000410b2000cc0008000800000000003d004000140565092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000 +00003d0040001405a5092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405e50928000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405250a280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405650a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405a50a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f700 +0000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405e50a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00 +08000800000000003d0040001405250b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040001405650b28000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000600000000003d0031001405a50b280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000040000002d010a00040000002d010900040000000701010008000000fa0200000800000000000000040000002d011300040000002d010700070000001b045205d70bd404e503 +040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200d907d004da074d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01 +070008000000250302005809d00459094d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200520ad004530a4d05040000002d010a0004000000f0011300040000002d01090008000000fa02000008000000 +00000000040000002d011300040000002d0107000800000025030200d509d004d6094d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200d80ad004d80a4d05040000002d010a0004000000f00113000400 +00002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200550bd004550b4d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200d308d004d4084d05 +040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302004e08d0044e084d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01 +070008000000250302006005d00460054d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302005a06d0045a064d05040000002d010a0004000000f0011300040000002d01090008000000fa02000008000000 +00000000040000002d011300040000002d0107000800000025030200dd05d004dd054d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200df06d004e0064d05040000002d010a0004000000f00113000400 +00002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302005c07d0045d074d05040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200da04d004db044d05 +040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302005504d00456044d05040000002d010a0004000000f0011300040000002d010900040000002d010800040000002d010700040000000701040035000000410b +2000cc000800080000000000400040004b0adc032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a1c04 +2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a5c042800000008000000080000000100010000000000 +200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a9c0428000000080000000800000001000100000000002000000000000000000000000000000000000000 +00000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0adc042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a1c052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000 +35000000410b2000cc000800080000000000400040004b0a5c052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000004000 +40004b0a9c052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0adc052800000008000000080000000100 +010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a1c0628000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a5c062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f700 +0000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a9c062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff00 +00007f00000035000000410b2000cc000800080000000000400040004b0adc062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800 +00000000400040004b0a1c072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a5c072800000008000000 +080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a9c0728000000080000000800000001000100000000002000000000000000 +00000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0adc072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00 +ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a1c082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a5c082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000 +cc000800080000000000400040004b0a9c082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0adc082800 +000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a1c0928000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a5c09280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a9c092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f00 +0000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0adc092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f0000003500 +0000410b2000cc000800080000000000400040004b0a1c0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000000040004000 +4b0a5c0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a9c0a28000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0adc0a280000000800000008000000010001000000000020000000000000000000000000000000 +0000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a1c0b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000 +ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000400040004b0a5c0b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff000000 +7f00000035000000410b2000cc00080007000000000040003a004b0a9c0b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00080008000000 +00003d0040008b0adc032800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a1c0428000000080000000800 +00000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a5c04280000000800000008000000010001000000000020000000000000000000 +0000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a9c042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0adc042800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f700 +0000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a1c052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc00 +08000800000000003d0040008b0a5c052800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a9c0528000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0adc05280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a1c062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000 +ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a5c062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000 +ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a9c062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000 +410b2000cc0008000800000000003d0040008b0adc062800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a +1c072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a5c07280000000800000008000000010001000000 +0000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a9c072800000008000000080000000100010000000000200000000000000000000000000000000000 +000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0adc072800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff00 +00007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a1c082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000035000000410b2000cc0008000800000000003d0040008b0a5c082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800080000000000 +3d0040008b0a9c082800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0adc08280000000800000008000000 +0100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a1c092800000008000000080000000100010000000000200000000000000000000000 +000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a5c092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000 +f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a9c092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000 +ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0adc092800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc000800 +0800000000003d0040008b0a1c0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a5c0a280000000800 +0000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a9c0a2800000008000000080000000100010000000000200000000000 +000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0adc0a2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffff +ff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a1c0b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff00 +0000f7000000ff0000007f00000035000000410b2000cc0008000800000000003d0040008b0a5c0b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000035000000410b +2000cc0008000700000000003d003a008b0a9c0b2800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000040000002d010a00040000002d01090004000000070101000800 +0000fa0200000800000000000000040000002d011300040000002d010700070000001b04c90ad70b4b0adc03040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200d907470ada07c40a040000002d010a000400 +0000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302005809470a5909c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200 +520a470a530ac40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200d509470ad609c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d01 +1300040000002d0107000800000025030200d80a470ad80ac40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200550b470a550bc40a040000002d010a0004000000f0011300040000002d01090008000000 +fa0200000800000000000000040000002d011300040000002d0107000800000025030200d308470ad408c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302004e08470a4e08c40a040000002d010a000400 +0000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302006005470a6005c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200 +5a06470a5a06c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200dd05470add05c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d01 +1300040000002d0107000800000025030200df06470ae006c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302005c07470a5d07c40a040000002d010a0004000000f0011300040000002d01090008000000 +fa0200000800000000000000040000002d011300040000002d0107000800000025030200da04470adb04c40a040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d01070008000000250302005504470a5604c40a040000002d010a000400 +0000f0011300040000002d01090008000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200200d2e0aca0bb109040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d01130007000000fc0200000000000000000400 +00002d0114000e00000024030500870b9809d20b9809ca0bb109c20bca09870b9809040000002d010a0004000000f0011300040000002d01090004000000f0011400030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d01080004000000020101000500 +00000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b00200000000000650014012405860228000000200000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff818181fffffffffffffffffffffffffffffffffffffffff050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff030000001e00040000002e01000005000000090200000000050000000102ffffff00040000002d010700040000002d0108000400 +000002010100050000000102ffffff0005000000090200000000050000000102ffffff00050000000902000000003b000000410bc60088000b001a00000000006500e30024053c03280000001c0000000b00000001000100000000002c0000000000000000000000000000000000000000000000ffffff00fffffff0ffff +fff0fffffff0fffffff0fffffff0fb0307f0fffffff0fffffff0fffffff0fffffff0fffffff0050000000102ffffff0005000000090200000000040000002d010900040000002d010a00040000002701ffff08000000fa0200000800000000000000040000002d011300040000002d0107000800000025030200b4026e05 +b402a507040000002d010a0004000000f0011300040000002d01090008000000fa0200000800000000000000040000002d01130007000000fc020000000000000000040000002d0114000e00000024030500b4024d059b027f05b4026e05cd027f05b4024d05040000002d010a0004000000f0011300040000002d010900 +04000000f001140008000000fa0200000800000000000000040000002d01130007000000fc020000000000000000040000002d0114000e00000024030500b402c6079b029407b402a507cd029407b402c607040000002d010a0004000000f0011300040000002d01090004000000f0011400040000002d01070004000000 +2d010800070000001b04cd06c60236065802040000002d010900040000002d010a00030000001e00070000001604cc06c5023606580204000000020101001c000000fb029cff0000000000009001000000000740001254494d4553000000000000000000000000000000000000000000000000000000040000002d011300 +050000000902000000000d000000320a4a0658020100040058023606c402cc06522b4300040000002d0106000d000000320a55069b020100040058023606c402cc06202b2600040000002701ffff08000000fa0200000800000000000000040000002d011400040000002d0107000800000025030200d803c40ad803380b +040000002d010a0004000000f0011400040000002d01090008000000fa0200000800000000000000040000002d011400040000002d01070008000000250302005504c40a5604380b040000002d010a0004000000f0011400040000002d01090008000000fa0200000800000000000000040000002d011400040000002d01 +07000800000025030200260c15062b0b8906040000002d010a0004000000f0011400040000002d01090008000000fa0200000800000000000000040000002d01140007000000fc020000000000000000040000002d0115000e00000024030500e80aa206230b68062b0b8106330b9a06e80aa206040000002d010a000400 +0000f0011400040000002d01090004000000f001150008000000fa0200000800000000000000040000002d011400040000002d0107000800000025030200f103f60a3c04f60a040000002d010a0004000000f0011400040000002d01090008000000fa0200000800000000000000040000002d01140007000000fc020000 +000000000000040000002d0115000e00000024030500d803f60af103060bf103f60af103e50ad803f60a040000002d010a0004000000f0011400040000002d01090004000000f001150008000000fa0200000800000000000000040000002d01140007000000fc020000000000000000040000002d0115000e0000002403 +05005504f60a3c04060b3c04f60a3c04e50a5504f60a040000002d010a0004000000f0011400040000002d01090004000000f0011500040000002d010500040000002d010200040000002d010300040000002d01010004000000f001050004000000f001060004000000f001090004000000f0010a0004000000f0010b00 +04000000f0010c0004000000f0010d0004000000f0010e0004000000f0010f0004000000f001100004000000f001110004000000f001120004000000f0011300040000002d010300040000002d010200040000002701ffff1c000000fb021000070000000000bc02000000000102022253797374656d00009b99807cfc11 +2200fc112200f4eb160018102200685ec730040000002d01050004000000f0010400040000002701ffff040000002701ffff040000002701ffff0d000000320a210c780f0100040000000000750f210c202b2d00040000002d010000030000000000}{\result {\f8\insrsid3752688 +{\pict{\*\picprop\shplid1037{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pictureGray}{\sv 0}}{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fHitTestFill}{\sv 1}}{\sp{\sn fillShape}{\sv 1}} +{\sp{\sn fillUseRect}{\sv 0}}{\sp{\sn fNoFillHitTest}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fReallyHidden}{\sv 0}}{\sp{\sn fScriptAnchor}{\sv 0}}{\sp{\sn fFakeMaster}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}} +\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw16766\pich13146\picwgoal9505\pichgoal7453\wmetafile8\bliptag-1853674753\blipupi-197{\*\blipuid 91832aff450e651ce605b03ea356d195} +010009000003b4b0010011004c00000000001400000026060f001e00ffffffff040014000000576f72640e004d6963726f736f667420576f7264050000000b02 +00000000050000000c02210c780f1c000000fb021000070000000000bc02000000000000000253797374656d0000080000000c008a0100000a000c008a010c00 +8a0100000a00040000002d010000050000000201010000001c000000fb02adff0000000000009001000000000440001254696d6573204e657720526f6d616e00 +5f95ed77d067ef77aa0d0afb00000a00040000002d010100050000000902000000020d000000320a0c0000000100040000000000780f210c2063260007000000 +fc020100000000000000040000002d01020008000000fa0205000100000000000000040000002d010300070000001b04950b4e04fe0afa0307000000fc020000 +ffffff000000040000002d01040008000000fa0200000000000000000000040000002d010500030000001e00070000001604930b4d04fe0afa03050000000201 +010000001c000000fb029cff0000000000009001010000000440001254494d455300000072030a5d5695ed775f95ed77d067ef7772030a5d00000a0004000000 +2d0106000d000000320a110bfa0301000400fa03fe0a4c04930b72002700040000002d0101000d000000320a1c0b210401000400fa03fe0a4c04930b20002600 +040000002701ffff040000002d010200040000002d010300070000001b04840b5f040e0b1b04040000002d010400040000002d010500030000001e0007000000 +1604830b5e040f0b1b04050000000201010000001c000000fb02adff0000000000009001010000000440001254494d4553000000eb030aa95695ed775f95ed77 +d067ef77eb030aa900000a00040000002d010700050000000902000000020d000000320a1f0b1b04010004001b040f0b5d04830b73002000040000002d010100 +0d000000320a1f0b3b04010004001b040f0b5d04830b20002600040000002701ffff040000002d010200040000002d010300070000001b043103880b9a021b0b +040000002d010400040000002d010500030000001e000700000016043003870b9a021b0b050000000201010000001c000000fb029cff00000000000090010000 +00020440001253796d626f6c0000f2000aab5695ed775f95ed77d067ef77f2000aab00000a00040000002d010800050000000902000000020d000000320a9a02 +1b0b010004001b0b9a02860b300332003200040000002d0101000d000000320ac7024d0b010004001b0b9a02860b300320002600040000002701ffff04000000 +2d010200040000002d010300070000001b042003a90bab024d0b040000002d010400040000002d010500030000001e000700000016041f03a90bab024d0b0500 +00000201010000001c000000fb02adff0000000000009001010000020440001253796d626f6c0000d8080af55695ed775f95ed77d067ef77d8080af500000a00 +040000002d010900050000000902000000020d000000320aaa024d0b010004004d0bab02a80b1f0371002b00040000002d0101000d000000320ac602780b0100 +04004d0bab02a80b1f0320002600040000002701ffff040000002d010200040000002d010300070000001b042003160cab02760b040000002d01040004000000 +2d010500030000001e000700000016041f03150cab02760b05000000020101000000040000002d0107000500000009020000000210000000320abb02760b0300 +0400760bab02140c1f036d696e003c0017002a00040000002d0101000d000000320abb02f30b01000400760bab02140c1f0320002600040000002701ffff1000 +000026060f001600ffffffff0000ba0300002203000018040000cc07000008000000fa0200000800000000000000040000002d010a00040000002d0102000800 +0000250302001204c607bf032703040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600 +ffffffff00000d0400001a0300009e040000cc07000008000000fa0200000800000000000000040000002d010a00040000002d01020008000000250302001204 +c60798041f03040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000150b +0000220300009d0b0000cc07000008000000fa0200000800000000000000040000002d010a00040000002d0102000800000025030200970bc6071a0b27030400 +00002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000920b0000220300000a0c +0000cc07000008000000fa0200000800000000000000040000002d010a00040000002d0102000800000025030200970bc607040c2703040000002d0105000400 +0000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000ca030000bd03000096040000d10700000800 +0000fa0200000800000000000000040000002d010a00040000002d0102001000000025030600cf03c403f303c2031704c2035304c4037104c6038f04c9030400 +00002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000 +fa0200000800000000000002040000002d010b00070000001b04cd08cf0bd006e503040000002d01040004000000f0010a00040000002d01050004000000f001 +0b001000000026060f001600ffffffff000020040000b006000092040000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d01 +02000500000007010400000036000000430f2000cc000000080006000000000040003200d0064004280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000 +cc000000080006000000000040003200100740042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050074004 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200900740042800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000 +430f2000cc000000080006000000000040003200d007400428000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200 +100840042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008400428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +36000000430f2000cc00000008000600000000003c00320090084004280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d01040005000000 +0701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd087304 +d0064004040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d01 +0a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088c04cc087204040000002d01040004000000f0010a00040000002d010500 +04000000f0010b001000000026060f001600ffffffff0000a6040000b006000018050000ec0800000800000026060f000600ffffffff0000040000002d010300 +040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006c604280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000770000003600 +0000430f2000cc0000000800060000000000400032001007c6042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000 +32005007c6042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00 +000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007c6042800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700 +000036000000430f2000cc000000080006000000000040003200d007c60428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000 +0000400032001008c6042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008c60428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +00007700000036000000430f2000cc00000008000600000000003c0032009008c604280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d01 +0400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d01020007000000 +1b04cd08f904d006c604040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff +000023050000b006000095050000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000 +430f2000cc000000080006000000000040003200d006430528000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200 +100743052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007430528000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +36000000430f2000cc00000008000600000000004000320090074305280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000 +40003200d00743052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010084305280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000036000000430f2000cc000000080006000000000040003200500843052800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600 +000000003c003200900843052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600 +ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd087605d0064305040000002d01050004000000 +f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa020000080000000000 +0002040000002d010b00070000001b04cd088f05cc087505040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f00 +1600ffffffff0000a0050000b006000012060000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400 +000036000000430f2000cc000000080006000000000040003200d006c00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000 +0000400032001007c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007c00528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +00007700000036000000430f2000cc0000000800060000000000400032009007c005280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800 +06000000000040003200d007c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00 +000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008c005280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd0000007700000036000000430f2000cc0000000800060000000000400032005008c0052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00 +000008000600000000003c0032009008c0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d0104000500000007010100000008000000 +26060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08f305d006c005040000002d01 +050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00001d060000b00600008f060000ec08 +00000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc0000000800060000000000 +40003200d0063d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010073d06280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000036000000430f2000cc00000008000600000000004000320050073d062800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600 +000000004000320090073d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d0073d062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000036000000430f2000cc00000008000600000000004000320010083d0628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000 +08000600000000004000320050083d062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c00320090083d0628000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800 +000000000000040000002d010a00040000002d010200070000001b04cd087006d0063d06040000002d01050004000000f0010a00040000002d01040008000000 +26060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04 +cd089106cc086f06040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff0000a2060000b0060000 +14070000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc0000000800 +06000000000040003200d006c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00 +000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007c206280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd0000007700000036000000430f2000cc0000000800060000000000400032005007c2062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00 +00000800060000000000400032009007c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007c2062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00 +000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008c20628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f +2000cc0000000800060000000000400032005008c206280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008 +c2062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd0000007700 +0000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000 +fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08f506d006c206040000002d01050004000000f0010a00040000002d01 +04000800000026060f000600ffffffff01001000000026060f001600ffffffff00001f070000b006000091070000ec0800000800000026060f000600ffffffff +0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d0063f072800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000036000000430f2000cc00000008000600000000004000320010073f0728000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000 +08000600000000004000320050073f072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320090073f0728000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd0000007700000036000000430f2000cc000000080006000000000040003200d0073f07280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000 +cc00000008000600000000004000320010083f072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050083f07 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c00320090083f072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000004000000 +2d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a000400 +00002d010200070000001b04cd087207d0063f07040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000 +fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088b07cc087107040000002d010400 +04000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff00009c070000b00600000e080000ec0800000800000026060f00 +0600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006bc072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00 +000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007bc0728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f +2000cc0000000800060000000000400032005007bc07280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007 +bc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd0000007700 +0000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007bc07280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000770000003600 +0000430f2000cc0000000800060000000000400032001008bc072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000 +32005008bc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00 +000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008bc072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700 +0000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa020000080000000000000004000000 +2d010a00040000002d010200070000001b04cd08ef07d006bc07040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff +01001000000026060f001600ffffffff000019080000b006000093080000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d01 +02000500000007010400000036000000430f2000cc000000080007000000000040003a00d0063908280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000 +cc000000080007000000000040003a00100739082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a0050073908 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a00900739082800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000 +430f2000cc000000080007000000000040003a00d007390828000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a00 +100839082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003a005008390828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +36000000430f2000cc00000008000700000000003c003a0090083908280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d01040005000000 +0701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd087408 +d0063908040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d01 +0a0008000000fa0200000800000000000002040000002d010b00070000001b04cd088d08cc087308040000002d01040004000000f0010a00040000002d010500 +04000000f0010b001000000026060f001600ffffffff00009e080000b006000010090000ec0800000800000026060f000600ffffffff0000040000002d010300 +040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006be08280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000770000003600 +0000430f2000cc0000000800060000000000400032001007be082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000 +32005007be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00 +000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007be082800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700 +000036000000430f2000cc000000080006000000000040003200d007be0828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000 +0000400032001008be082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008be0828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +00007700000036000000430f2000cc00000008000600000000003c0032009008be08280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d01 +0400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d01020007000000 +1b04cd08f108d006be08040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff +00001b090000b00600008d090000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000 +430f2000cc000000080006000000000040003200d0063b0928000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200 +10073b092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd000000 +77000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320050073b0928000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000 +36000000430f2000cc00000008000600000000004000320090073b09280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000 +40003200d0073b092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000004000320010083b09280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000036000000430f2000cc00000008000600000000004000320050083b092800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600 +000000003c00320090083b092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600 +ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd086e09d0063b09040000002d01050004000000 +f0010a00040000002d0104000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa020000080000000000 +0002040000002d010b00070000001b04cd088709cc086d09040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f00 +1600ffffffff000098090000b00600000a0a0000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400 +000036000000430f2000cc000000080006000000000040003200d006b80928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000 +0000400032001007b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd0000007700 +0000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005007b80928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd00 +00007700000036000000430f2000cc0000000800060000000000400032009007b809280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800 +06000000000040003200d007b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00 +000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008b809280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd0000007700000036000000430f2000cc0000000800060000000000400032005008b8092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00 +000008000600000000003c0032009008b8092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00dd00000077000000dd00000077000000dd00000077000000dd00000077000000040000002d010500040000002d0104000500000007010100000008000000 +26060f000600ffffffff010008000000fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08eb09d006b809040000002d01 +050004000000f0010a00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000150a0000b0060000900a0000ec08 +00000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc0000000800070000000000 +40003b00d006350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000 +dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003b001007350a280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd000000 +7700000036000000430f2000cc000000080007000000000040003b005007350a2800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000700 +0000000040003b009007350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd000000 +77000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080007000000000040003b00d007350a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000036000000430f2000cc000000080007000000000040003b001008350a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000 +080007000000000040003b005008350a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000700000000003c003b009008350a28000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800 +000000000000040000002d010a00040000002d010200070000001b04cd08710ad006350a040000002d01050004000000f0010a00040000002d01040008000000 +26060f000600ffffffff010007000000fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04 +cd088a0acc08700a040000002d01040004000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff00009b0a0000b0060000 +0d0b0000ec0800000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc0000000800 +06000000000040003200d006bb0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00 +000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001007bb0a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd0000007700 +0000dd0000007700000036000000430f2000cc0000000800060000000000400032005007bb0a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00 +00000800060000000000400032009007bb0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007bb0a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00 +000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032001008bb0a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f +2000cc0000000800060000000000400032005008bb0a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008 +bb0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd0000007700 +0000dd00000077000000dd00000077000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000 +fa0200000800000000000000040000002d010a00040000002d010200070000001b04cd08ee0ad006bb0a040000002d01050004000000f0010a00040000002d01 +04000800000026060f000600ffffffff01001000000026060f001600ffffffff0000180b0000b00600008a0b0000ec0800000800000026060f000600ffffffff +0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc000000080006000000000040003200d006380b2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000 +dd0000007700000036000000430f2000cc0000000800060000000000400032001007380b28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc000000 +0800060000000000400032005007380b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032009007380b28000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd000000 +77000000dd0000007700000036000000430f2000cc000000080006000000000040003200d007380b280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000 +cc0000000800060000000000400032001008380b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000036000000430f2000cc0000000800060000000000400032005008380b +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000 +dd00000077000000dd0000007700000036000000430f2000cc00000008000600000000003c0032009008380b2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00dd00000077000000dd00000077000000dd00000077000000dd0000007700000004000000 +2d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010a000400 +00002d010200070000001b04cd086b0bd006380b040000002d01050004000000f0010a00040000002d0104000800000026060f000600ffffffff010007000000 +fc020000ffffff000000040000002d010a0008000000fa0200000800000000000002040000002d010b00070000001b04cd08840bcc086a0b040000002d010400 +04000000f0010a00040000002d01050004000000f0010b001000000026060f001600ffffffff0000db030000480500005b040000cc0700000800000026060f00 +0600ffffffff0000040000002d010300040000002d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f00 +0600544e5050060136000000430f4600660000000800080000000000400040004d05e00328000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000 +0800070000000000400036004d0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d05e00328000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000036000000430f4600660000000800070000000000400036008d052004280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600 +66000000080008000000000040004000cd05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080007000000000040003600cd052004 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000 +2200000088000000220000008800000036000000430f4600660000000800080000000000400040000d06e0032800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000 +430f4600660000000800070000000000400036000d06200428000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000 +4d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000 +880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036004d06200428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200000088000000 +36000000430f4600660000000800080000000000400040008d06e003280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000 +400036008d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000 +22000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd06e003280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000 +8800000036000000430f460066000000080007000000000040003600cd0620042800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800 +00000000400040000d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000 +8800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036000d0720042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000 +220000008800000036000000430f4600660000000800080000000000400040004d07e00328000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000 +0800070000000000400036004d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000007000800010000003a0040008d07e00328000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000 +88000000220000008800000036000000430f46006600000007000700010000003a0036008d072004280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000000800000026060f00 +0600544e5050070106000000260626000200000006000000260601100200000008000000fa02000000000000ffffff00040000002d010a000500000004010b00 +0000050000002606001000000c00000024030400e0034d051204c60755044d05e0034d0512000000260602101a00000001010500000000000000000001000000 +0000000000000000060000002606011002000200040000002d0103000600000026062600020001000500000004010d0000000600000026062600020000000700 +0000fc020000000000000000040000002d010b000600000026062600020001000c00000024030400e0034d051204c60755044d05e0034d050600000026062600 +02000000050000000401070000000800000026060f000600544e5050060136000000430f4600660000000800080000000000400040004d05e003280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f4600660000000800070000000000400036004d0520042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +00000800080000000000400040008d05e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800070000000000400036008d0520042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f460066000000080008000000000040004000cd05e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080007000000000040003600cd052004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000d06 +e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f4600660000000800070000000000400036000d062004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003600 +0000430f4600660000000800080000000000400040004d06e0032800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000700000000004000 +36004d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d06e0032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f4600660000000800070000000000400036008d06200428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000 +000040004000cd06e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080007000000000040003600cd06200428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f4600660000000800080000000000400040000d07e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +070000000000400036000d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d07e003280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f4600660000000800070000000000400036004d0720042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +000007000800010000003a0040008d07e0032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000007000700010000003a0036008d0720042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +00008800000022000000880000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d00000004000000 +2d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c000400 +00002d0102000c00000024030400e0034d051204c60755044d05e0034d05040000002d01050004000000f0010c00040000002d0104000800000026060f000600 +ffffffff01001000000026060f001600ffffffff0000d3030000c10700005b0400004d0a00000800000026060f000600ffffffff0000040000002d0103000400 +00002d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f46006600 +0000080008000000000040004000c607d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c60718042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040000608d80328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e0006081804280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004608 +d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000080008000000000040003e0046081804280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003600 +0000430f4600660000000800080000000000400040008608d8032800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +3e00860818042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608d8032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f460066000000080008000000000040003e00c608180428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000 +0000400040000609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000609180428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f4600660000000800080000000000400040004609d803280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00460918042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008609d803280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e00860918042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +0000080008000000000040004000c609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c60918042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f460066000000080008000000000040004000060ad80328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e00060a1804280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002004000460a +d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a1804280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000000800 +000026060f000600544e50500701060000002606260002000000060000002606011002000000040000002d010a000500000004010b0000000500000026060010 +00000c00000024030400d803470a1204c6075504470ad803470a12000000260602101a0000000101050000000000000000000100000000000000000000000600 +00002606011002000200040000002d0103000600000026062600020001000500000004010d000000060000002606260002000000040000002d010b0006000000 +26062600020001000c00000024030400d803470a1204c6075504470ad803470a060000002606260002000000050000000401070000000800000026060f000600 +544e5050060136000000430f460066000000080008000000000040004000c607d803280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00c60718042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000608d803280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e00060818042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +00000800080000000000400040004608d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00460818042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040008608d80328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e0086081804280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608 +d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c6081804280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003600 +0000430f4600660000000800080000000000400040000609d8032800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +3e00060918042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004609d8032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f460066000000080008000000000040003e004609180428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000 +0000400040008609d8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008609180428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f460066000000080008000000000040004000c609d803280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00c60918042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000060ad803280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e00060a18042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +0000010008000700000002004000460ad8032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a18042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +00008800000022000000880000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d00000004000000 +2d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c000400 +00002d0102000c00000024030400d803470a1204c6075504470ad803470a040000002d01050004000000f0010c00040000002d0104000800000026060f000600 +ffffffff01001000000026060f001600ffffffff0000500b0000c1070000d80b00004d0a00000800000026060f000600ffffffff0000040000002d0103000400 +00002d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f46006600 +0000080008000000000040004000c607550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c607950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040000608550b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e000608950b280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004608 +550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000080008000000000040003e004608950b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003600 +0000430f4600660000000800080000000000400040008608550b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +3e008608950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608550b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f460066000000080008000000000040003e00c608950b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000 +0000400040000609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000609950b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f4600660000000800080000000000400040004609550b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e004609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008609550b280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e008609950b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +0000080008000000000040004000c609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c609950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f460066000000080008000000000040004000060a550b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e00060a950b280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002004000460a +550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a950b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000000800 +000026060f000600544e50500701060000002606260002000000060000002606011002000000040000002d010a000500000004010b0000000500000026060010 +00000c00000024030400550b470a970bc607d20b470a550b470a12000000260602101a0000000101050000000000000000000100000000000000000000000600 +00002606011002000200040000002d0103000600000026062600020001000500000004010d000000060000002606260002000000040000002d010b0006000000 +26062600020001000c00000024030400550b470a970bc607d20b470a550b470a060000002606260002000000050000000401070000000800000026060f000600 +544e5050060136000000430f460066000000080008000000000040004000c607550b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00c607950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000608550b280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e000608950b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +00000800080000000000400040004608550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004608950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040008608550b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e008608950b280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000c608 +550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000080008000000000040003e00c608950b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003600 +0000430f4600660000000800080000000000400040000609550b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +3e000609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004609550b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f460066000000080008000000000040003e004609950b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000 +0000400040008609550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008609950b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f460066000000080008000000000040004000c609550b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00c609950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000060a550b280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e00060a950b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +0000010008000700000002004000460a550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000010008000700000002003e00460a950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +00008800000022000000880000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d00000004000000 +2d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c000400 +00002d0102000c00000024030400550b470a970bc607d20b470a550b470a040000002d01050004000000f0010c00040000002d0104000800000026060f000600 +ffffffff01001000000026060f001600ffffffff0000500b000048050000d80b0000cc0700000800000026060f000600ffffffff0000040000002d0103000400 +00002d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600544e5050060136000000430f46006600 +00000800080000000000400040004d05550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d05950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040008d05550b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e008d05950b280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd05 +550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000080008000000000040003e00cd05950b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003600 +0000430f4600660000000800080000000000400040000d06550b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +3e000d06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040004d06550b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f460066000000080008000000000040003e004d06950b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000 +0000400040008d06550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e008d06950b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f460066000000080008000000000040004000cd06550b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e00cd06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000d07550b280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e000d07950b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +00000800080000000000400040004d07550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d07950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f46006600000007000800010000003a0040008d07550b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +46006600000007000800010000003a003e008d07950b280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff0022000000880000002200000088000000220000008800000022000000880000000800000026060f000600544e5050070106000000260626000200 +0000060000002606011002000000040000002d010a000500000004010b000000050000002606001000000c00000024030400550b4d05970bc607d20b4d05550b +4d0512000000260602101a000000010105000000000000000000010000000000000000000000060000002606011002000200040000002d010300060000002606 +2600020001000500000004010d000000060000002606260002000000040000002d010b000600000026062600020001000c00000024030400550b4d05970bc607 +d20b4d05550b4d05060000002606260002000000050000000401070000000800000026060f000600544e5050060136000000430f460066000000080008000000 +0000400040004d05550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d05950b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f4600660000000800080000000000400040008d05550b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800 +08000000000040003e008d05950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +00008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040004000cd05550b280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800 +0000220000008800000036000000430f460066000000080008000000000040003e00cd05950b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600 +00000800080000000000400040000d06550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e000d06950b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200 +000088000000220000008800000036000000430f4600660000000800080000000000400040004d06550b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f +460066000000080008000000000040003e004d06950b280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040008d06 +550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800 +00002200000088000000220000008800000036000000430f460066000000080008000000000040003e008d06950b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff0022000000880000002200000088000000220000008800000022000000880000003600 +0000430f460066000000080008000000000040004000cd06550b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f46006600000008000800000000004000 +3e00cd06950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff0022000000880000002200 +0000880000002200000088000000220000008800000036000000430f4600660000000800080000000000400040000d07550b2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800 +000036000000430f460066000000080008000000000040003e000d07950b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000 +0000400040004d07550b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00220000008800 +000022000000880000002200000088000000220000008800000036000000430f460066000000080008000000000040003e004d07950b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff002200000088000000220000008800000022000000880000002200 +00008800000036000000430f46006600000007000800010000003a0040008d07550b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00220000008800000022000000880000002200000088000000220000008800000036000000430f4600660000000700 +0800010000003a003e008d07950b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff002200 +0000880000002200000088000000220000008800000022000000880000000800000026060f000600544e50500701060000002606011002000100040000002d01 +02000500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800 +000000000000040000002d010c00040000002d0102000c00000024030400550b4d05970bc607d20b4d05550b4d05040000002d01050004000000f0010c000400 +00002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000db03000048050000d80b0000cc0700000800000026060f000600 +ffffffff0000040000002d010300040000002d01020005000000070104000000060000002606260002000100050000000401070000000800000026060f000600 +544e5050060136000000430f4600660000000800080000000000400040004d05e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d056004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d05e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d05a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d052006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0560062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d05200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d05e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d056008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d05e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d05a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d05600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d05200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d05a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d05e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d056004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d05e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d05a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d052006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d0560062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d05200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d05e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d056008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d05e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d05a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d05600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d05200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d05a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd05e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd0520042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd056004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd05e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd05a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd052006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd0560062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd05200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd05e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd0520082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd056008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd05e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd05a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd05600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd05200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080006000000000040003300cd05a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d06e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d066004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d06a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d062006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d0660062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d06200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d06e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d066008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d06a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d06200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033000d06a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d06e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d066004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d06a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d062006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0660062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d06200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d06e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d066008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d06a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d06200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d06a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d06e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d066004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d06a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d062006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d0660062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d06200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d06e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d066008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d06a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d06600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d06200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d06a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd06e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd0620042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd066004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd06e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd06a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd062006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd0660062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd06200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd06e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd0620082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd066008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd06e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd06a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd06600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd06200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080006000000000040003300cd06a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d07e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d076004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d07a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d072006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d0760062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d07200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d07e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d076008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d07a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d07600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d07200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033000d07a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d07e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d076004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d07a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d072006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d0760062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d07200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d07e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d076008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d07a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d07600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d07200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d07a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000007000800010000003a0040008d07e003280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700 +0800010000003a0040008d0720042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d076004280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +000007000800010000003a0040008d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720052800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07600528000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000007000800010000003a0040008d07a005280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d072006280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d0760062800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a00 +40008d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e0062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f46006600000007000800010000003a0040008d07200728000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000070008000100 +00003a0040008d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a00728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000007000800010000003a0040008d07e007280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700 +0800010000003a0040008d0720082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d076008280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +000007000800010000003a0040008d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720092800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07600928000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000007000800010000003a0040008d07a009280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200a280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d07600a2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a00 +40008d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f46006600000007000800010000003a0040008d07200b28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000070008000100 +00003a0040008d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000600010000003a0033008d07a00b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f0000000800000026060f000600544e50500701060000002606260002000000060000002606011002000000040000002d010a000500000004010b000000 +050000002606001000000c00000024030400e0034d05d20b4d05d107c607e0034d0512000000260602101a000000010105000000000000000000010000000000 +000000000000060000002606011002000200040000002d0103000600000026062600020001000500000004010d00000006000000260626000200000004000000 +2d010b000600000026062600020001000c00000024030400e0034d05d20b4d05d107c607e0034d05060000002606260002000000050000000401070000000800 +000026060f000600544e5050060136000000430f4600660000000800080000000000400040004d05e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d052004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d05e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d0520052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0560052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d05a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d05e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d056006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0520072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d052008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d05e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d0520092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0560092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d05a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d05600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d05e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d05200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d05a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d052004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d05e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d0520052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0560052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d05a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d05e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d056006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d0520072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d052008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d05e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d0520092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0560092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d05a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d05600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d05e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d05200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d05a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd052004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd05e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd0520052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd05a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd05e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd056006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd05a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd0520072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd0560072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd052008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd05e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd0520092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0560092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd05a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd05e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd05600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd05a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd05e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd05200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd05600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080006000000000040003300cd05a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d062004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0660052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d06a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d066006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d0620072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d062008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0660092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d06a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d06600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d06e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d06200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033000d06a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d062004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0660052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d06a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d066006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0620072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d062008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0660092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d06a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d06600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d06e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d06200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d06a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d062004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d06e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0660052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d06a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d066006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d0620072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008d062008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008d06e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008d0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d0660092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008d06a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008d06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008d06600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008d06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008d06e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008d06200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008d06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033008d06a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd062004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd06e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd0620052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0660052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd06a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd06e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd066006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd06a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd0620072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd0660072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000cd062008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000cd06e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000cd0620092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd0660092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000cd06a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000cd06e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000cd06600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000cd06a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000cd06e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000cd06200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000cd06600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080006000000000040003300cd06a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d072004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d0720052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0760052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d07a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d07e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d076006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d0720072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000d072008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000d0720092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d0760092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000d07a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000d07600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000d07e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000d07200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033000d07a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d072004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d0720052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0760052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d07a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d07e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d076006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d0720072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004d072008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004d0720092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d0760092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004d07a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004d07600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004d07e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004d07200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800060000000000400033004d07a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00328000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000007000800010000003a0040008d072004280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +60042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a004280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d07e0042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a00 +40008d0720052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f46006600000007000800010000003a0040008d07a00528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000070008000100 +00003a0040008d07e0052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200628000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000007000800010000003a0040008d076006280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700 +0800010000003a0040008d07a0062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e006280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0720072800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +000007000800010000003a0040008d0760072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a0072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000007000800010000003a0040008d072008280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07 +60082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07a008280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f46006600000007000800010000003a0040008d07e0082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a00 +40008d0720092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d0760092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f46006600000007000800010000003a0040008d07a00928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000070008000100 +00003a0040008d07e0092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200a28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000007000800010000003a0040008d07600a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000700 +0800010000003a0040008d07a00a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07e00a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f46006600000007000800010000003a0040008d07200b2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +000007000800010000003a0040008d07600b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000007000600010000003a0033008d07a00b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f0000000800000026060f000600544e50500701060000002606011002000100040000002d0102000500000004010d00000004000000 +2d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010c000400 +00002d0102000c00000024030400e0034d05d20b4d05d107c607e0034d05040000002d01050004000000f0010c00040000002d0104000800000026060f000600 +ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600 +ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000e4030000c1070000d80b +00004d0a00000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000006000000260626000200010005000000 +0401070000000800000026060f000600544e5050060136000000430f460066000000080008000000000040004000c607e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c607290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60769042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c607e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c60729052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6076905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c607e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60729062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c607a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6072907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c60769072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c607a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c607290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60769082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c607e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c60729092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6076909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c607e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c607a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c607690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a00c607a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000608290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000608e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000060829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400006086905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060829062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000608a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400006082907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000060869072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000608290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000608e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000060829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400006086909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000608a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000608690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a000608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004608290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000460869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004608e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000460829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400046086905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460829062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004608a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400046082907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000460869072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004608290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000460869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004608e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000460829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400046086909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004608a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004608690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a004608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008608290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008608e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000860829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400086086905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860829062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008608a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400086082907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000860869072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008608290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008608e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000860829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400086086909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008608a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008608690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a008608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c608290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c608e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c60829052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6086905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c608e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60829062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c608a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6082907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c60869072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c608290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c608e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c60829092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6086909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c608e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c608a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c608690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a00c608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000609290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000609e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000060929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400006096905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060929062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000609a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400006092907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000060969072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000609290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000609e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000060929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400006096909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040000609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040000609a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000609690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a000609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004609290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000460969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004609e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000460929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400046096905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460929062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004609a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400046092907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000460969072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004609290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000460969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004609e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000460929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400046096909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040004609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040004609a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004609690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a004609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008609290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008609e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000860929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400086096905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860929062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008609a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400086092907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000860969072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008609290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000860969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008609e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000860929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000400086096909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +00000800080000000000400040008609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +4600660000000800080000000000400040008609a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008609690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a008609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c609290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c609e904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c60929052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6096905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c609e9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60929062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c609a906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609 +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6092907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c60969072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c609290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c60969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c609e908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c60929092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c6096909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c609e9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c609a90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609 +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c609690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a00c609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000060a290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060a69042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060ae904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000060a29052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a6905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060ae9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a29062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000060aa906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a2907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000060a69072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000060aa9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000060a290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060a69082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060ae908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000060a29092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a6909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060ae9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000060aa90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000060a690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000500000000004000 +2a00060aa90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9032800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000010008000700000002004000460a290428000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460a69042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa90428000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460ae904280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000100 +08000700000002004000460a29052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a6905280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9052800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000010008000700000002004000460ae9052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a29062800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a690628000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000010008000700000002004000460aa906280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a +e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a2907280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000010008000700000002004000460a69072800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000001000800070000000200 +4000460aa9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae9072800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000010008000700000002004000460a290828000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460a69082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa90828000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460ae908280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000100 +08000700000002004000460a29092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a6909280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9092800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000010008000700000002004000460ae9092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a290a2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a690a28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000010008000700000002004000460aa90a280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a +e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a290b280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000010008000700000002004000460a690b2800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000001000500070000000200 +2a00460aa90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f0000000800000026060f000600544e505007010600000026062600020000000600000026060110020000000400 +00002d010a000500000004010b000000050000002606001000000c00000024030400e903470ad20b470ad107c607e903470a12000000260602101a0000000101 +05000000000000000000010000000000000000000000060000002606011002000200040000002d0103000600000026062600020001000500000004010d000000 +060000002606260002000000040000002d010b000600000026062600020001000c00000024030400e903470ad20b470ad107c607e903470a0600000026062600 +02000000050000000401070000000800000026060f000600544e5050060136000000430f460066000000080008000000000040004000c607e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c60729042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c60769042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c6072905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c607e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c60729062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60769062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c607a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c607e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c6076907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c607a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c60729082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c60769082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c6072909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c607e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c607290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c607a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c607e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c607290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c607690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a00c607a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060829042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400006082905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000608e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000060829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060869062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000608a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000008000800000000004000400006086907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060829082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400006082909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000608e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000608a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000608290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000608690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a000608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000460829042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000460869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400046082905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004608e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000460829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460869062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004608a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000008000800000000004000400046086907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000460829082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000460869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400046082909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004608e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004608a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004608290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004608690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a004608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000860829042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000860869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400086082905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008608e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000860829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860869062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008608a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000008000800000000004000400086086907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000860829082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000860869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400086082909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008608e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008608a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008608290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008608690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a008608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c60829042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c60869042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c6082905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c608e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c60829062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60869062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c608a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c608e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c6086907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c608a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c60829082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c60869082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c6082909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c608e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c608290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c608a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c608e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c608290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c608690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a00c608a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060929042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400006092905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000609e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000060929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060969062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000609a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000008000800000000004000400006096907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040000609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060929082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400006092909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040000609e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40000609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040000609a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040000609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040000609290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040000609690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a000609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000460929042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000460969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400046092905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004609e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000460929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000460969062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004609a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000008000800000000004000400046096907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040004609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000460929082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000460969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400046092909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040004609e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40004609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040004609a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040004609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040004609290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040004609690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a004609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000860929042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000860969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400086092905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008609e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000860929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000860969062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008609a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f46006600000008000800000000004000400086096907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +080000000000400040008609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000860929082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000860969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +46006600000008000800000000004000400086092909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f4600660000000800080000000000400040008609e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +40008609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f4600660000000800080000000000400040008609a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +0000400040008609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800080000000000400040008609290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f4600660000000800080000000000400040008609690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a008609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c60929042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c60969042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c6092905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609 +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c609e9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c60929062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c60969062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c609a90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c609e9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c6096907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000c609a9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000c60929082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000c60969082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609e90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000c6092909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609 +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609a909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000c609e9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000c609290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000c609a90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000c609e90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000c609290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000c609690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a00c609a90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060a29042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060a69042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000060a2905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000060ae9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000060a29062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a69062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000060aa90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060ae9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060a6907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +08000000000040004000060aa9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000080008000000000040004000060a29082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000080008000000000040004000060a69082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060ae90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000080008000000000040004000060a2909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060aa909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000080008000000000040004000060ae9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000008000800000000004000 +4000060a290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000080008000000000040004000060aa90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000 +000040004000060ae90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000080008000000000040004000060a290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000080008000000000040004000060a690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000800 +05000000000040002a00060aa90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae903280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000010008000700000002004000460a29042800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000010008000700000002004000460a69042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9042800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae90428000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000010008000700000002004000460a2905280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a +69052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa905280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000010008000700000002004000460ae9052800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000001000800070000000200 +4000460a29062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a69062800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000010008000700000002004000460aa90628000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460ae9062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a290728000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460a6907280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000100 +08000700000002004000460aa9072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae907280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff00 +0000ff0000007f00000036000000430f460066000000010008000700000002004000460a29082800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600 +0000010008000700000002004000460a69082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa9082800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff00 +0000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460ae90828000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f +460066000000010008000700000002004000460a2909280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a +69092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f700 +0000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460aa909280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f0000003600 +0000430f460066000000010008000700000002004000460ae9092800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f46006600000001000800070000000200 +4000460a290a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff00 +0000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a690a2800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00 +000036000000430f460066000000010008000700000002004000460aa90a28000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700 +000002004000460ae90a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff00 +0000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f460066000000010008000700000002004000460a290b28000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff00 +00007f00000036000000430f460066000000010008000700000002004000460a690b280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000ff000000ff000000f7000000ff000000ff000000ff0000007f00000036000000430f4600660000000100 +05000700000002002a00460aa90b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000ff000000ff000000f7000000ff000000ff000000ff0000007f0000000800000026060f000600544e50500701060000002606011002000100040000002d01 +02000500000004010d000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800 +000000000000040000002d010c00040000002d0102000c00000024030400e903470ad20b470ad107c607e903470a040000002d01050004000000f0010c000400 +00002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00006e5ffdffda06ffffdaef0200e4f202000800000026060f000600 +ffffffff0100040000002d010200040000002d010300070000001b049704b00a2104fc04040000002d010400040000002d010500030000001e00070000001604 +9504af0a2104fc04050000000201010000001c000000fb02adff0000000000009001000000000440001254494d4553000000f9090a185695ed775f95ed77d067 +ef77f9090a1800000a00040000002d010c00050000000902000000024c000000320a3104fc042b000400fc042104ae0a9504417869616c2073656374696f6e20 +7468726f75676820612063796c696e64726963616c207363616e6e6572003c002a001700250017001500200025002500170017002a002a00150017002a001c00 +2a0029002a002a0015002500150024002a00170017002a0029001c00170025002500170015002000250025002a002a0025001c00040000002d0101000d000000 +320a3104950a01000400fc042104ae0a9504200a2500040000002701ffff040000002d010200040000002d010300070000001b0431031b049a02ae0304000000 +2d010400040000002d010500030000001e0007000000160430031b049a02ae0305000000020101000000040000002d010800050000000902000000020d000000 +320a9a02ae0301000400ae039a021a043003320a3200040000002d0101000d000000320ac702e00301000400ae039a021a043003200a2600040000002701ffff +040000002d010200040000002d010300070000001b0420033d04ab02e103040000002d010400040000002d010500030000001e000700000016041f033d04ab02 +e10305000000020101000000040000002d010900050000000902000000020d000000320aaa02e10301000400e103ab023c041f03710a2b00040000002d010100 +0d000000320ac6020c0401000400e103ab023c041f03200a2600040000002701ffff040000002d010200040000002d010300070000001b042003aa04ab020a04 +040000002d010400040000002d010500030000001e000700000016041f03a904ab020a0405000000020101000000040000002d01070005000000090200000002 +10000000320abb020a04030004000a04ab02a8041f036d696eef3c0017002a00040000002d0101000d000000320abb028704010004000a04ab02a8041f03200a +2600040000002701ffff040000002d010200040000002d010300070000001b043907b907c4065c07040000002d010400040000002d010500030000001e000700 +000016043807b807c4065c07050000000201010000001c000000fb02adff0000000000009001000000020440001253796d626f6c0000a6000ad25695ed775f95 +ed77d067ef77a6000ad200000a00040000002d010d00050000000902000000020d000000320ac3065c07010004005c07c406b7073807320a2a00040000002d01 +01000d000000320adf068607010004005c07c406b7073807200a2600040000002701ffff040000002d010200040000002d010300070000001b043907e307c406 +8607040000002d010400040000002d010500030000001e000700000016043807e207c406860705000000020101000000040000002d0109000500000009020000 +00020d000000320ac3068607010004008607c406e1073807710a2b00040000002d0101000d000000320adf06b107010004008607c406e1073807200a26000400 +00002701ffff040000002d010200040000002d010300070000001b0439075708c406b007040000002d010400040000002d010500030000001e00070000001604 +38075708c406b00705000000020101000000040000002d0107000500000009020000000210000000320ad406b00703000400b007c406560838076d6178ef3c00 +2a002500040000002d0101000d000000320ad4063b0801000400b007c40656083807200a2600040000002701ffff040000002d010200040000002d0103000700 +00001b04e00be20a6a0b2605040000002d010400040000002d010500030000001e00070000001604de0be10a6a0b260505000000020101000000040000002d01 +0c00050000000902000000024c000000320a7a0b26052b00040026056a0be00ade0b4c61726765737420616363657074616e6365206174207468652063656e74 +7265206f662074686520464f5600330025001c002a00250020001700150025002500250025002a00170025002a0025002500150025001700150017002a002500 +1500250024002a0016001c00250015002a001c00150017002a00240015002e003c003c00040000002d0101000d000000320a7a0bde0a0100040026056a0be00a +de0b200a2600040000002701ffff040000002d010200040000002d010300070000001b04a40a4f0f2e0a150c040000002d010400040000002d01050003000000 +1e00070000001604a20a4f0f2e0a150c05000000020101000000040000002d010c00050000000902000000022f000000320a3e0a150c18000400150c2e0a4e0f +a20a536d616c6c65737420616363657074616e636520617420202e004100250017001700250020001700150025002500250025002a00170025002a0025002500 +15002500170015001500040000002d0101000d000000320a3e0a310f01000400150c2e0a4e0fa20a200a2600040000002701ffff040000002d01020004000000 +2d010300070000001b04080bf30e920a4f0c040000002d010400040000002d010500030000001e00070000001604060bf30e920a4f0c05000000020101000000 +040000002d010c000500000009020000000228000000320aa20a4f0c130004004f0c920af20e060b7468652074776f2065787472656d69746965738017002a00 +2500150017003c002a00150025002a0017001c002500410017001700170025002000040000002d0101000d000000320aa20ace0e010004004f0c920af20e060b +200a2600040000002701ffff040000002d010200040000002d010300070000001b045006440eda05470c040000002d010400040000002d010500030000001e00 +0700000016044f06440eda05470c05000000020101000000040000002d010c00050000000902000000021d000000320aea05470c0c000400470cda05430e4f06 +496d61676520766f6c756d651c00410025002a002500150029002a0017002a0041002500040000002d0101000d000000320aea05270e01000400470cda05430e +4f06200a2500040000002701ffff1000000026060f001600ffffffff0000270b0000d6030000fb0b0000d507000008000000fa02000008000000000000000400 +00002d010e00040000002d0102000e000000250305002c0be103660bdd03a00bdb03ca0bdc03f40bde03040000002d01050004000000f0010e00040000002d01 +04000800000026060f000600ffffffff010007000000fc020000ffffff000000040000002d010e00040000002d010300040000002d010e00090000001d062100 +f00096009600c607fe0c040000002d010e00040000002d01040004000000f0010e00040000002d010500040000002d010200040000002d010300070000001b04 +5d08740dc607200d040000002d010400040000002d010500030000001e000700000016045b08740dc607200d05000000020101000000040000002d0106000500 +00000902000000020d000000320ad907200d01000400200dc607730d5b087a002700040000002d0101000d000000320ae407470d01000400200dc607730d5b08 +20002600040000002701ffff1000000026060f001600ffffffff00009a0200009b070000a7030000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0b01 +050000000b0217ffb0ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cffb3ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff81b037fffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff000049030000 +9b07000056040000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01 +0200040000002d0103000400000003010800070000001204210c5c00780f0b01050000000b0217ff9bff050000000c020b002000040000000301080005000000 +0c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff9eff3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffff +fffffffffffffffffffffffffc0d81bfffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff08000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000f80300009b07000005050000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01 +050000000b0217ff86ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cff89ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe06c0dfffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000a7040000 +9b070000b4050000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01 +0200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff70ff050000000c020b002000040000000301080005000000 +0c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff75ff3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffff +fffffffffffffffffffffffffb03607fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff08000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000560500009b07000063060000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01 +050000000b0217ff5bff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cff61ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffd81b03fffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff000005060000 +9b07000012070000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01 +0200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff46ff050000000c020b002000040000000301080005000000 +0c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff4cff3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffff +fffffffffffffffffffffffffec0d81fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff08000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000b40600009b070000c1070000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01 +050000000b0217ff31ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cff38ff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb606c1fffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff000063070000 +9b07000070080000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01 +0200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ff1cff050000000c020b002000040000000301080005000000 +0c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cff23ff3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffff +fffffffffffffffffffffffff9b0361fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff08000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000120800009b0700001f090000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01 +050000000b0217ff07ff050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cff0fff3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8d81b1fffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000c1080000 +9b070000ce090000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01 +0200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217fff2fe050000000c020b002000040000000301080005000000 +0c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cfffbfe3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffff +fffffffffffffffffffffffff86c0d9fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff08000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000700900009b0700007d0a0000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0a01 +050000000b0217ffddfe050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cffe6fe3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83606dfffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff00001f0a0000 +9b0700002c0b0000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01 +0200040000002d0103000400000003010800070000001204210c5c00780f0a01050000000b0217ffc8fe050000000c020b002000040000000301080005000000 +0c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cffd2fe3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffff +fffffffffffffffffffffffff81b037fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff08000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000ce0a00009b070000dc0b0000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780f0b01 +050000000b0217ffb4fe050000000c020b0020000400000003010800050000000c020a001f0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cffbffe3b000000410bc60088000b002000000000000b0020000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc0d81bfffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff00007d0b0000 +9b0700008b0c0000f9070000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01 +0200040000002d0103000400000003010800070000001204210c5c00780f0b01050000000b0217ff9ffe050000000c020b002000040000000301080005000000 +0c020a001f0005000000020101000000050000000102ffffff0005000000090200000000050000000b022cffaafe3b000000410bc60088000b00200000000000 +0b0020000000000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffff +fffffffffffffffffffffffffe06c0dfffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff08000000 +26060f000600ffffffff01001000000026060f001600ffffffff00002d0c00009b070000180d0000f9070000030000001e00050000002e010000000005000000 +0a020000000005000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780fe900 +050000000b0217ff89fe050000000c020b001c000400000003010800050000000c020a001b0005000000020101000000050000000102ffffff00050000000902 +00000000050000000b022cff97fe3b000000410bc60088000b001c00000000000b001c000000000028000000200000000b000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb0361ffffffffffffffffffffffffffffffffff +ffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000e00c0000 +a8070000360d0000e507000008000000fa0200000800000000000000040000002d010e0007000000fc020000000000000000040000002d010f000e0000002403 +0500300dc607e50cdf07e50cc607e50cad07300dc607040000002d01050004000000f0010e00040000002d01040004000000f0010f000800000026060f000600 +ffffffff01001000000026060f001600ffffffff0000c5030000b4040000f60b0000710500000800000026060f000600ffffffff0000040000002d0103000400 +00002d0102000500000007010400000036000000430f2000cc000000080008000000000040004000d404e5032800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000 +430f2000cc000000080008000000000040004000d404250428000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000 +d40465042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000 +fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a50428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000 +36000000430f2000cc000000080008000000000040004000d404e504280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc0000000800080000000000 +40004000d40425052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d4046505280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000 +bf00000036000000430f2000cc000000080008000000000040004000d404a5052800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800 +0000000040004000d404e5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d40425062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff000000 +5f000000bf00000036000000430f2000cc000000080008000000000040004000d404650628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000 +080008000000000040004000d404a5062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e50628000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000 +ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d4042507280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc000000080008000000000040004000d40465072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a507 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000 +ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e5072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000 +430f2000cc000000080008000000000040004000d404250828000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000 +d40465082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000 +fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404a50828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000 +36000000430f2000cc000000080008000000000040004000d404e508280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc0000000800080000000000 +40004000d40425092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d4046509280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000 +bf00000036000000430f2000cc000000080008000000000040004000d404a5092800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800 +0000000040004000d404e5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404250a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff000000 +5f000000bf00000036000000430f2000cc000000080008000000000040004000d404650a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000 +080008000000000040004000d404a50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404e50a28000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000 +ff0000005f000000bf00000036000000430f2000cc000000080008000000000040004000d404250b280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc000000080008000000000040004000d404650b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000080006000000000040003100d404a50b +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000 +ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e5032800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000 +430f2000cc00000008000800000000003d0040001405250428000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d004000 +140565042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000 +fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a50428000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000 +36000000430f2000cc00000008000800000000003d0040001405e504280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc0000000800080000000000 +3d004000140525052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d00400014056505280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000 +bf00000036000000430f2000cc00000008000800000000003d0040001405a5052800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800 +000000003d0040001405e5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d004000140525062800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff000000 +5f000000bf00000036000000430f2000cc00000008000800000000003d0040001405650628000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000 +08000800000000003d0040001405a5062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e50628000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000 +ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d00400014052507280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc00000008000800000000003d004000140565072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a507 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000 +ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e5072800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000 +430f2000cc00000008000800000000003d0040001405250828000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d004000 +140565082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000 +fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405a50828000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf000000 +36000000430f2000cc00000008000800000000003d0040001405e508280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc0000000800080000000000 +3d004000140525092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000 +f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d00400014056509280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000 +bf00000036000000430f2000cc00000008000800000000003d0040001405a5092800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800 +000000003d0040001405e5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405250a2800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff000000 +5f000000bf00000036000000430f2000cc00000008000800000000003d0040001405650a28000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc000000 +08000800000000003d0040001405a50a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405e50a28000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000 +ff0000005f000000bf00000036000000430f2000cc00000008000800000000003d0040001405250b280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000 +cc00000008000800000000003d0040001405650b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000ff000000f5000000fb000000ff000000ff0000005f000000bf00000036000000430f2000cc00000008000600000000003d0031001405a50b +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000ff000000f5000000fb000000 +ff000000ff0000005f000000bf000000040000002d010500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa02 +00000800000000000000040000002d010e00040000002d010200070000001b045205d70bd404e503040000002d01050004000000f0010e00040000002d010400 +0800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff0100 +1000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000 +c5030000b4040000f60b0000710500000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f +2000cc000000080008000000000040004000d404e503280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404 +25042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f00 +0000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4046504280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f0000003600 +0000430f2000cc000000080008000000000040004000d404a5042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000004000 +4000d404e5042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff00 +00007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d40425052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc000000080008000000000040004000d404650528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000 +000040004000d404a5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f700 +0000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e50528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff00 +00007f00000036000000430f2000cc000000080008000000000040004000d4042506280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800 +08000000000040004000d40465062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a506280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f700 +0000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e5062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00 +0000080008000000000040004000d40425072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d40465072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff00 +0000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a50728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc000000080008000000000040004000d404e507280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404 +25082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f00 +0000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d4046508280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f0000003600 +0000430f2000cc000000080008000000000040004000d404a5082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000004000 +4000d404e5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff00 +00007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d40425092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc000000080008000000000040004000d404650928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000 +000040004000d404a5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f700 +0000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e50928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff00 +00007f00000036000000430f2000cc000000080008000000000040004000d404250a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800 +08000000000040004000d404650a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404a50a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f700 +0000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404e50a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00 +0000080008000000000040004000d404250b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000d404650b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff00 +0000f7000000ff0000007f00000036000000430f2000cc000000080006000000000040003100d404a50b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc00000008000800000000003d0040001405e503280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405 +25042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f00 +0000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00400014056504280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f0000003600 +0000430f2000cc00000008000800000000003d0040001405a5042800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00 +40001405e5042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff00 +00007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000140525052800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc00000008000800000000003d0040001405650528000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000 +00003d0040001405a5052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f700 +0000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e50528000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff00 +00007f00000036000000430f2000cc00000008000800000000003d00400014052506280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800 +0800000000003d004000140565062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a506280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f700 +0000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e5062800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00 +000008000800000000003d004000140525072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000140565072800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff00 +0000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a50728000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f +2000cc00000008000800000000003d0040001405e507280000000800000008000000010001000000000020000000000000000000000002000000000000000000 +0000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405 +25082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f00 +0000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00400014056508280000000800000008000000010001000000 +0000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f0000003600 +0000430f2000cc00000008000800000000003d0040001405a5082800000008000000080000000100010000000000200000000000000000000000020000000000 +000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d00 +40001405e5082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff00 +00007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000140525092800000008000000080000000100 +010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00 +000036000000430f2000cc00000008000800000000003d0040001405650928000000080000000800000001000100000000002000000000000000000000000200 +00000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000 +00003d0040001405a5092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f700 +0000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e50928000000080000000800 +00000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff00 +00007f00000036000000430f2000cc00000008000800000000003d0040001405250a280000000800000008000000010001000000000020000000000000000000 +0000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800 +0800000000003d0040001405650a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff00 +0000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405a50a280000000800 +0000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f700 +0000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405e50a2800000008000000080000000100010000000000200000000000 +000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00 +000008000800000000003d0040001405250b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffff +ff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040001405650b2800 +000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff00 +0000f7000000ff0000007f00000036000000430f2000cc00000008000600000000003d0031001405a50b28000000080000000800000001000100000000002000 +00000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000040000002d01 +0500040000002d010400050000000701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010e0004000000 +2d010200070000001b045205d70bd404e503040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff0100100000002606 +0f001600ffffffff0000b359fdffda06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06 +ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d4070000cb040000e00700005305000008000000fa02 +00000800000000000000040000002d010e00040000002d0102000800000025030200d907d004da074d05040000002d01050004000000f0010e00040000002d01 +04000800000026060f000600ffffffff01001000000026060f001600ffffffff000053090000cb0400005f0900005305000008000000fa020000080000000000 +0000040000002d010e00040000002d01020008000000250302005809d00459094d05040000002d01050004000000f0010e00040000002d010400080000002606 +0f000600ffffffff01001000000026060f001600ffffffff00004d0a0000cb040000590a00005305000008000000fa0200000800000000000000040000002d01 +0e00040000002d0102000800000025030200520ad004530a4d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff +01001000000026060f001600ffffffff0000d0090000cb040000dc0900005305000008000000fa0200000800000000000000040000002d010e00040000002d01 +02000800000025030200d509d004d6094d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff0100100000002606 +0f001600ffffffff0000d30a0000cb040000de0a00005305000008000000fa0200000800000000000000040000002d010e00040000002d010200080000002503 +0200d80ad004d80a4d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff +0000500b0000cb0400005b0b00005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200550bd004550b +4d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000ce080000cb04 +0000da0800005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d308d004d4084d05040000002d01 +050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000049080000cb040000540800005305 +000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302004e08d0044e084d05040000002d01050004000000f001 +0e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00005b050000cb040000660500005305000008000000fa02 +00000800000000000000040000002d010e00040000002d01020008000000250302006005d00460054d05040000002d01050004000000f0010e00040000002d01 +04000800000026060f000600ffffffff01001000000026060f001600ffffffff000055060000cb040000600600005305000008000000fa020000080000000000 +0000040000002d010e00040000002d01020008000000250302005a06d0045a064d05040000002d01050004000000f0010e00040000002d010400080000002606 +0f000600ffffffff01001000000026060f001600ffffffff0000d8050000cb040000e30500005305000008000000fa0200000800000000000000040000002d01 +0e00040000002d0102000800000025030200dd05d004dd054d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff +01001000000026060f001600ffffffff0000da060000cb040000e60600005305000008000000fa0200000800000000000000040000002d010e00040000002d01 +02000800000025030200df06d004e0064d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff0100100000002606 +0f001600ffffffff000057070000cb040000630700005305000008000000fa0200000800000000000000040000002d010e00040000002d010200080000002503 +02005c07d0045d074d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff +0000d5040000cb040000e10400005305000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200da04d004db04 +4d05040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000050040000cb04 +00005c0400005305000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302005504d00456044d05040000002d01 +050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000bc0300002b0a0000f60b0000e80a +00000800000026060f000600ffffffff0000040000002d010300040000002d0102000500000007010400000036000000430f2000cc0000000800080000000000 +400040004b0adc032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000 +ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c04280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff000000 +7f00000036000000430f2000cc0000000800080000000000400040004b0a5c042800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +00000000400040004b0a9c042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000 +ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c0528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000 +0800080000000000400040004b0a5c052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c0528000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc05280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000 +cc0000000800080000000000400040004b0a1c062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c06 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000 +ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000 +430f2000cc0000000800080000000000400040004b0adc0628000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000 +4b0a1c072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c0728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000 +36000000430f2000cc0000000800080000000000400040004b0a9c07280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000 +400040004b0adc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000 +ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c08280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff000000 +7f00000036000000430f2000cc0000000800080000000000400040004b0a5c082800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +00000000400040004b0a9c082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000 +ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a1c0928000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000 +0800080000000000400040004b0a5c092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c0928000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0adc09280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000 +cc0000000800080000000000400040004b0a1c0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c0a +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000 +ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a9c0a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000 +430f2000cc0000000800080000000000400040004b0adc0a28000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000080008000000000040004000 +4b0a1c0b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000400040004b0a5c0b28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000 +36000000430f2000cc000000080007000000000040003a004b0a9c0b280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000 +3d0040008b0adc032800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000 +ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c04280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff000000 +7f00000036000000430f2000cc00000008000800000000003d0040008b0a5c042800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +000000003d0040008b0a9c042800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc042800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000 +ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c0528000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000 +08000800000000003d0040008b0a5c052800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c0528000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc05280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000 +cc00000008000800000000003d0040008b0a1c062800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c06 +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000 +ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c062800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000 +430f2000cc00000008000800000000003d0040008b0adc0628000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000 +8b0a1c072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c0728000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000 +36000000430f2000cc00000008000800000000003d0040008b0a9c07280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc0000000800080000000000 +3d0040008b0adc072800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000 +ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c08280000000800000008000000 +0100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff000000 +7f00000036000000430f2000cc00000008000800000000003d0040008b0a5c082800000008000000080000000100010000000000200000000000000000000000 +020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800 +000000003d0040008b0a9c082800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000 +f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc082800000008000000 +080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000 +ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a1c0928000000080000000800000001000100000000002000000000000000 +00000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc000000 +08000800000000003d0040008b0a5c092800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00 +ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c0928000000 +08000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000 +f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0adc09280000000800000008000000010001000000000020000000 +0000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000 +cc00000008000800000000003d0040008b0a1c0a2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000 +ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c0a +2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000 +ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a9c0a2800000008000000080000000100010000000000 +200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000 +430f2000cc00000008000800000000003d0040008b0adc0a28000000080000000800000001000100000000002000000000000000000000000200000000000000 +00000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d004000 +8b0a1c0b2800000008000000080000000100010000000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff000000 +7f000000ff000000f7000000ff0000007f00000036000000430f2000cc00000008000800000000003d0040008b0a5c0b28000000080000000800000001000100 +00000000200000000000000000000000020000000000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000 +36000000430f2000cc00000008000700000000003d003a008b0a9c0b280000000800000008000000010001000000000020000000000000000000000002000000 +0000000000000000ffffff00ff000000f7000000ff0000007f000000ff000000f7000000ff0000007f000000040000002d010500040000002d01040005000000 +0701010000000800000026060f000600ffffffff010008000000fa0200000800000000000000040000002d010e00040000002d010200070000001b04c90ad70b +4b0adc03040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdff +da06ffffdaef0200e4f202000800000026060f000600ffffffff01001000000026060f001600ffffffff0000b359fdffda06ffffdaef0200e4f2020008000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000d4070000420a0000e0070000ca0a000008000000fa020000080000000000000004000000 +2d010e00040000002d0102000800000025030200d907470ada07c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffff +ffff01001000000026060f001600ffffffff000053090000420a00005f090000ca0a000008000000fa0200000800000000000000040000002d010e0004000000 +2d01020008000000250302005809470a5909c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff010010000000 +26060f001600ffffffff00004d0a0000420a0000590a0000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000 +25030200520a470a530ac40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffff +ffff0000d0090000420a0000dc090000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d509470a +d609c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d30a0000 +420a0000de0a0000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d80a470ad80ac40a04000000 +2d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000500b0000420a00005b0b0000 +ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200550b470a550bc40a040000002d01050004000000 +f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000ce080000420a0000da080000ca0a000008000000 +fa0200000800000000000000040000002d010e00040000002d0102000800000025030200d308470ad408c40a040000002d01050004000000f0010e0004000000 +2d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000049080000420a000054080000ca0a000008000000fa02000008000000 +00000000040000002d010e00040000002d01020008000000250302004e08470a4e08c40a040000002d01050004000000f0010e00040000002d01040008000000 +26060f000600ffffffff01001000000026060f001600ffffffff00005b050000420a000066050000ca0a000008000000fa020000080000000000000004000000 +2d010e00040000002d01020008000000250302006005470a6005c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffff +ffff01001000000026060f001600ffffffff000055060000420a000060060000ca0a000008000000fa0200000800000000000000040000002d010e0004000000 +2d01020008000000250302005a06470a5a06c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff010010000000 +26060f001600ffffffff0000d8050000420a0000e3050000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000 +25030200dd05470add05c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffff +ffff0000da060000420a0000e6060000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200df06470a +e006c40a040000002d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000057070000 +420a000063070000ca0a000008000000fa0200000800000000000000040000002d010e00040000002d01020008000000250302005c07470a5d07c40a04000000 +2d01050004000000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d5040000420a0000e1040000 +ca0a000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200da04470adb04c40a040000002d01050004000000 +f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000050040000420a00005c040000ca0a000008000000 +fa0200000800000000000000040000002d010e00040000002d01020008000000250302005504470a5604c40a040000002d01050004000000f0010e0004000000 +2d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000c50b0000ac090000260d0000340a000008000000fa02000008000000 +00000000040000002d010e00040000002d0102000800000025030200200d2e0aca0bb109040000002d01050004000000f0010e00040000002d01040008000000 +26060f000600ffffffff01001000000026060f001600ffffffff0000820b000093090000d80b0000d009000008000000fa020000080000000000000004000000 +2d010e0007000000fc020000000000000000040000002d010f000e00000024030500870b9809d20b9809ca0bb109c20bca09870b9809040000002d0105000400 +0000f0010e00040000002d01040004000000f0010f000800000026060f000600ffffffff01001000000026060f001600ffffffff000089020000220500009603 +000080050000030000001e00050000002e0100000000050000000a020000000005000000090200000000050000000102ffffff00040000002d01020004000000 +2d0103000400000003010800070000001204210c5c00780f0b01050000000b0263ffb2ff050000000c020b0020000400000003010800050000000c020a001f00 +05000000020101000000050000000102ffffff0005000000090200000000050000000b0271ffb5ff3b000000410bc60088000b002000000000000b0020000000 +000028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff818181fffffffffffffffffffffffffffffffffffffffff040000002d010400040000002d010500040000002701ffff0800000026060f000600 +ffffffff01001000000026060f001600ffffffff000038030000220500001304000080050000030000001e00050000002e0100000000050000000a0200000000 +05000000090200000000050000000102ffffff00040000002d010200040000002d0103000400000003010800070000001204210c5c00780fda00050000000b02 +63ff9eff050000000c020b001a000400000003010800050000000c020a00190005000000020101000000050000000102ffffff00050000000902000000000500 +00000b0271ffa1ff3b000000410bc60088000b001a00000000000b001a000000000028000000200000000b000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb0307ffffffffffffffffffffffffffffffffffffffffff0400 +00002d010400040000002d010500040000002701ffff0800000026060f000600ffffffff01001000000026060f001600ffffffff0000af02000069050000ba02 +0000ab07000008000000fa0200000800000000000000040000002d010e00040000002d0102000800000025030200b4026e05b402a507040000002d0105000400 +0000f0010e00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff00009602000048050000d3020000850500000800 +0000fa0200000800000000000000040000002d010e0007000000fc020000000000000000040000002d010f000e00000024030500b4024d059b027f05b4026e05 +cd027f05b4024d05040000002d01050004000000f0010e00040000002d01040004000000f0010f000800000026060f000600ffffffff01001000000026060f00 +1600ffffffff0000960200008f070000d3020000cc07000008000000fa0200000800000000000000040000002d010e0007000000fc0200000000000000000400 +00002d010f000e00000024030500b402c6079b029407b402a507cd029407b402c607040000002d01050004000000f0010e00040000002d01040004000000f001 +0f000800000026060f000600ffffffff0100040000002d010200040000002d010300070000001b04cd06c60236065802040000002d010400040000002d010500 +030000001e00070000001604cc06c50236065802050000000201010000001c000000fb029cff0000000000009001000000000440001254494d4553000000420c +0a645695ed775f95ed77d067ef77420c0a6400000a00040000002d010e00050000000902000000020d000000320a4a0658020100040058023606c402cc065200 +4300040000002d0101000d000000320a55069b020100040058023606c402cc0620002600040000002701ffff1000000026060f001600ffffffff0000d3030000 +bf0a0000de0300003e0b000008000000fa0200000800000000000000040000002d010f00040000002d0102000800000025030200d803c40ad803380b04000000 +2d01050004000000f0010f00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff000050040000bf0a00005c040000 +3e0b000008000000fa0200000800000000000000040000002d010f00040000002d01020008000000250302005504c40a5604380b040000002d01050004000000 +f0010f00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000260b0000100600002c0c00008f06000008000000 +fa0200000800000000000000040000002d010f00040000002d0102000800000025030200260c15062b0b8906040000002d01050004000000f0010f0004000000 +2d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000e30a000063060000390b0000a806000008000000fa02000008000000 +00000000040000002d010f0007000000fc020000000000000000040000002d0110000e00000024030500e80aa206230b68062b0b8106330b9a06e80aa2060400 +00002d01050004000000f0010f00040000002d01040004000000f00110000800000026060f000600ffffffff01001000000026060f001600ffffffff0000ec03 +0000f10a000042040000fc0a000008000000fa0200000800000000000000040000002d010f00040000002d0102000800000025030200f103f60a3c04f60a0400 +00002d01050004000000f0010f00040000002d0104000800000026060f000600ffffffff01001000000026060f001600ffffffff0000d3030000e00a0000f703 +00000c0b000008000000fa0200000800000000000000040000002d010f0007000000fc020000000000000000040000002d0110000e00000024030500d803f60a +f103060bf103f60af103e50ad803f60a040000002d01050004000000f0010f00040000002d01040004000000f00110000800000026060f000600ffffffff0100 +1000000026060f001600ffffffff000037040000e00a00005b0400000c0b000008000000fa0200000800000000000000040000002d010f0007000000fc020000 +000000000000040000002d0110000e000000240305005504f60a3c04060b3c04f60a3c04e50a5504f60a040000002d01050004000000f0010f00040000002d01040004000000f00110000800000026060f000600ffffffff0100040000002d010000030000000000}}}}}{\insrsid6909422 +\par }\pard\plain \s62\qj \li0\ri12\sl360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\i0\insrsid6909422 Figure II.3}{\v\insrsid6909422 ;}{\b\i0\insrsid6909422 :}{ +\i0\insrsid6909422 }{\insrsid6909422 The acceptance angle }{\f3\insrsid6909422 \'71}{\insrsid6909422 of a cylindrical scanner varies within the field of view. The largest acceptance, }{\f3\insrsid6909422 \'71}{\fs12\dn3\insrsid6909422 max}{ +\insrsid6909422 , is found at the centre, whereas the minimum value }{\f3\insrsid6909422 \'71}{\fs12\dn3\insrsid6909422 min}{\insrsid6909422 corresponds to the aperture of the first and last image slices, at the extremities of the scanner. +\par }\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par }\pard\plain \s62\qj \li0\ri12\widctlpar\tqc\tx2560\tqc\tx6260\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\fs24\insrsid6909422 \tab A) }{\f3\fs24\insrsid6909422 \'7c\'71\'7c\'20\'a3 +\'20\'59\tab \'42\'29\'20\'59\'20\'a3\'20\'7c\'71\'7c\'20\'a3\'20\'70\'2f\'32}{\i0\fs24\insrsid6909422 +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\f8\insrsid3752688 {\pict{\*\picprop\shplid1038{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex77\picscaley69\piccropl0\piccropr0\piccropt0\piccropb0 +\picw21096\pich10231\picwgoal11960\pichgoal5800\wmetafile8\bliptag-944209315\blipupi120{\*\blipuid c7b8825d957d58fc3bf5af1a1f6d0aaa} +0100090000032d2800000800660000000000050000000b02feffbeff050000000c02220156020500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e002d000000420105000000280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00fe000000fd000000fb000000f7000000ef000000df000000bf0000007f000000040000002d010000 +08000000fa0206000100000000000000040000002d010100070000001b04d800f601700025012d00000042010500000028000000080000000800000001000100 +00000000200000000000000000000000000000000000000000000000ffffff00fe000000fd000000fb000000f7000000ef000000df000000bf0000007f000000 +040000002d01020004000000f0010000070000001b04da00e600710013002d000000420105000000280000000800000008000000010001000000000020000000 +0000000000000000000000000000000000000000ffffff00fe000000fd000000fb000000f7000000ef000000df000000bf0000007f000000040000002d010000 +04000000f001020008000000fa0205000100000000000000040000002d0102000b0000001a086f00f401d300f6011701020230001c01040000002d0101000b00 +000017086f00f401d300f6011701020230001c012d00000042010500000028000000080000000800000001000100000000002000000000000000000000000000 +00000000000000000000ffffff00fe000000fd000000fb000000f7000000ef000000df000000bf0000007f000000040000002d01030004000000f00100000400 +00002d0102000b0000001a087200e500d800e4001801f20031000b00040000002d0101000b00000017087200e500d800e4001801f20031000b002d0000004201 +050000002800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00fe000000fd000000fb000000 +f7000000ef000000df000000bf0000007f000000040000002d01000004000000f0010300040000002d0102000b0000001a08d8001400740013001801ee003200 +0700040000002d0101000b0000001708d8001400740013001801ee00320007002d00000042010500000028000000080000000800000001000100000000002000 +00000000000000000000000000000000000000000000ffffff00fe000000fd000000fb000000f7000000ef000000df000000bf0000007f000000040000002d01 +030004000000f0010000040000002d0102000b0000001a08d6002501720024011601ff0130001801040000002d0101000b0000001708d6002501720024011601 +ff013000180107000000fc020000ffffff000000040000002d01000004000000f00103000700000018047900f601650025012d00000042010500000028000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00fe000000fd000000fb000000f7000000ef000000 +df000000bf0000007f000000040000002d010300070000001804e300f601ce002501040000002d01000004000000f00103000700000018047a00e60066001300 +2d0000004201050000002800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00fe000000fd00 +0000fb000000f7000000ef000000df000000bf0000007f000000040000002d010300070000001804e500e600d100130008000000fa0206000200000000000000 +040000002d0104000500000014028500ed000500000013028300ec000500000014028300ec000500000013028200eb000500000014028200eb00050000001302 +8100e9000500000014028100e9000500000013028000e7000500000014028000e7000500000013028000e4000500000014028000e4000500000013027f00e100 +0500000014027f00e1000500000013027f00dd000500000014027f00dd000500000013027f00d9000500000014027f00d9000500000013027f00d40005000000 +14027f00d4000500000013027f00cf000500000014027f00cf000500000013027f00c9000500000014027f00c9000500000013028000c3000500000014028000 +c3000500000013028100bd000500000014028100bd000500000013028200b6000500000014028200b6000500000013028300b0000500000014028300b0000500 +000013028400a8000500000014028400a8000500000013028500a1000500000014028500a10005000000130287009a0005000000140287009a00050000001302 +89009200050000001402890092000500000013028b008a000500000014028b008a000500000013028d0082000500000014028d0082000500000013028f007a00 +0500000014028f007a00050000001302910073000500000014029100730005000000130293006b0005000000140293006b000500000013029600630005000000 +14029600630005000000130298005b0005000000140298005b000500000013029a0054000500000014029a0054000500000013029d004d000500000014029d00 +4d00050000001302a0004600050000001402a0004600050000001302a2003f00050000001402a2003f00050000001302a5003800050000001402a50038000500 +00001302a7003200050000001402a7003200050000001302aa002c00050000001402aa002c00050000001302ad002700050000001402ad002700050000001302 +af002200050000001402af002200050000001302b1001e00050000001402b1001e00050000001302b4001900050000001402b4001900050000001302b6001600 +050000001402b6001600050000001302b8001300050000001402b8001300050000001302bb001000050000001402bb001000050000001302bd000e0005000000 +1402bd000e00050000001302be000d00050000001402be000d00050000001302c0000c00050000001402c0000c00050000001302c2000b00050000001402c200 +0b00050000001302c3000b00050000001402c3000b00050000001302c5000c00050000001402c5000c00050000001302c6000d00050000001402c6000d000500 +00001302c7000f00050000001402c7000f00050000001302c8001100050000001402c8001100050000001302c8001400050000001402c8001400050000001302 +c9001700050000001402c9001700050000001302c9001b00050000001402c9001b00050000001302c9001f00050000001402c9001f00050000001302c9002400 +050000001402c9002400050000001302c9002900050000001402c9002900050000001302c9002f00050000001402c9002f00050000001302c800350005000000 +1402c8003500050000001302c7003b00050000001402c7003b00050000001302c6004200050000001402c6004200050000001302c5004800050000001402c500 +4800050000001302c4005000050000001402c4005000050000001302c3005700050000001402c3005700050000001302c1005f00050000001402c1005f000500 +00001302bf006600050000001402bf006600050000001302bd006e00050000001402bd006e00050000001302bb007600050000001402bb007600050000001302 +b9007e00050000001402b9007e00050000001302b7008600050000001402b7008600050000001302b5008d00050000001402b5008d00050000001302b2009500 +050000001402b2009500050000001302b0009d00050000001402b0009d00050000001302ae00a400050000001402ae00a400050000001302ab00ab0005000000 +1402ab00ab00050000001302a800b200050000001402a800b200050000001302a600b900050000001402a600b900050000001302a300c000050000001402a300 +c000050000001302a100c600050000001402a100c6000500000013029e00cc000500000014029e00cc000500000013029b00d1000500000014029b00d1000500 +000013029900d6000500000014029900d6000500000013029600da000500000014029600da000500000013029400df000500000014029400df00050000001302 +9200e2000500000014029200e2000500000013029000e5000500000014029000e5000500000013028d00e8000500000014028d00e8000500000013028b00ea00 +0500000014028b00ea000500000013028900eb000500000014028900eb000500000013028800ec000500000014028800ec000500000013028600ed0005000000 +14028600ed000500000013028500ed000500000007010100000048000000430fc60088000000110020000000000011002000b900070028000000200000001100 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffe1f +fffffffbffffffff7fffffffe3fffffffc7fffffffffffffffffffffffffffffffffffffffffffffffff48000000430fc6008800000011002000000000001100 +2000b3001c00280000002000000011000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffffdffffffffbffffffff1fffffffe3ffffffff7fffffffeffffffffdfffffffffffffffffffffffffffffffffffffffff48000000430f +c60088000000110020000000000011002000ad003100280000002000000011000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff8ffffffff1ffffffffbffffffff7fffffffe3fffffffc7fffffffffffffffffffffffffffff +ffffffffffffffffffff48000000430fc60088000000110020000000000011002000a7004600280000002000000011000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffdffffffffbffffffff1fffffffe3ffffffff7ffffff +feffffffffdfffffffffffffffffffffffffffffffffffffffff48000000430fc60088000000110020000000000011002000a1005b0028000000200000001100 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff87fffffff9f +fffffffbffffffff7fffffffe1fffffffe7fffffffffffffffffffffffffffffffffffffffffffffffff46000000430fc6008800000010002000000000001000 +20009c007000280000002000000010000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffffdffffffffb7fffffff8ffffffff3ffffffff7fffffffedfffffffffffffffffffffffffffffffffffffffff48000000430fc6008800 +000011002000000000001100200096008500280000002000000011000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffbfffffffc7fffffff9ffffffffbffffffff6ffffffff0ffffffff7fffffffffffffffffffffffffffff +ffffffffffff48000000430fc6008800000011002000000000001100200090009a00280000002000000011000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffffffffffdbffffffff7fffffff87fffffffbffffffff6ffffff +ffdfffffffffffffffffffffffffffffffffffffffff48000000430fc600880000001100200000000000110020008a00af002800000020000000110000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffc3fffffffdb +ffffffff7fffffffe7fffffff8ffffffff7fffffffffffffffffffffffffffffffffffffffff48000000430fc600880000001100200000000000110020008400 +c400280000002000000011000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffffdffffffffbffffffff3fffffffc7fffffffb7fffffffeffffffffdfffffffffffffffffffffffffffffffffffffffff44000000430fc6008800 +00000f001900000000000f0019008000d90028000000200000000f000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffff9fffffffe1ffffffffbffffffff7fffffffefffffffffffffffffffffffffffffffffffffffffff1c00 +0000fb02eeff0000000000009001000000020000005053796d626f6c000034080a435695ed775f95ed77d067ef7734080a4300000a00040000002d0105000700 +00002105010059006d0072002d000000420105000000280000000800000008000000010001000000000020000000000000000000000000000000000000000000 +0000ffffff00aa00000055000000aa00000055000000aa00000055000000aa00000055000000040000002d01060004000000f0010300040000002d0102000400 +0000f00104000e00000024030500c5ff2200c6ff2200c6ff2300c5ff2300c5ff22003c000000430fc600880000000b002000000000000b0020009f0001002800 +0000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffff81b037fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009f00160028000000200000000b00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc0d81bfffff +ffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009f002b0028000000200000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe06c0dfffffffffffffffffffff +ffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009f00400028000000200000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb03607fffffffffffffffffffffffffffffffffffff +ffff3c000000430fc600880000000b002000000000000b0020009f00550028000000200000000b000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffd81b03fffffffffffffffffffffffffffffffffffffffff3c000000430f +c600880000000b002000000000000b0020009f006a0028000000200000000b000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffffec0d81fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b00 +2000000000000b0020009f007f0028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffffb606c1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b00 +20009f00940028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffff9b0361fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009f00a9002800 +0000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffff8d81b1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009f00be0028000000200000000b00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff86c0d9fffff +ffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009f00d30028000000200000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff83606dfffffffffffffffffffff +ffffffffffffffffffff3c000000430fc600880000000b001d00000000000b001d009f00e80028000000200000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff81b03ffffffffffffffffffffffffffffffffffffff +ffff07000000fc020000000000000000040000002d01030004000000f0010600040000002d0101000e000000240305000301a400fd00a700ff00a400fd00a100 +0301a40066000000430fc6008800000020000b000000000020000b0014007700280000001000000020000000010001000000000000000000c30e0000c30e0000 +000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000 +ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00290077002800000010000000200000000100010000000000 +00000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000 +fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b003e0077002800000010000000 +20000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000 +ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00 +53007700280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000 +ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000 +fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc60088000000 +20000b000000000020000b0068007700280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00 +ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000 +ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000 +66000000430fc6008800000020000b000000000020000b007d007700280000001000000020000000010001000000000000000000c30e0000c30e000000000000 +0000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000 +fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000 +ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b0092007700280000001000000020000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000 +fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00a7007700280000001000000020000000 +010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000 +fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000 +ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00bc007700 +280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000 +ffff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000 +ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b00 +0000000020000b00d1007700280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000 +ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000 +430fc6008800000020000b000000000020000b00e6007700280000001000000020000000010001000000000000000000c30e0000c30e00000000000000000000 +00000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000 +ffff0000ffff000066000000430fc6008800000020000b000000000020000b00fb007700280000001000000020000000010001000000000000000000c30e0000 +c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000 +fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +ffff0000ffff0000ffff0000ffff0000ffff000044000000430fc600880000000f000b00000000000f000b001001770028000000100000000f00000001000100 +0000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000 +fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00000e000000240305007c00150079001b007c0019007f001b007c0015003c000000430fc600 +880000000b000b00000000000b000b0092005d0028000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000 +ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00000b000000170846005f0041007c00db00 +b2006f0047000b00000017088c00dc00a500df00ea00c100600037001c000000fb02eeff000000000000bc02000000020000005053796d626f6c000060090aab +5695ed775f95ed77d067ef7760090aab00000a00040000002d01040004000000f001050007000000210501006e00600054002d00000042010500000028000000 +08000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00aa00000055000000aa00000055000000aa000000 +55000000aa00000055000000040000002d010500040000002d0102000e00000024030500c5ff2200c6ff2200c6ff2300c5ff2300c5ff22002d00000042010500 +00002800000008000000080000000100010000000000200000000000000000000000000000000000000000000000ffffff00aa00000055000000aa0000005500 +0000aa00000055000000aa00000055000000040000002d01060004000000f00105000e00000024030500c5ff2200c6ff2200c6ff2300c5ff2300c5ff22000700 +0000fc020100000000000000040000002d01050004000000f0010600040000002d0101000700000018041a01f200300007003c000000430fc600880000000b00 +2000000000000b0020005a00610028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000c00000000000b00 +0c005a00760028000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff +0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00590061002800 +00001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff +0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000 +000020000b006e006100280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff +0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430f +c6008800000020000b000000000020000b0083006100280000001000000020000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff +0000ffff00004a000000430fc6008800000012000b000000000012000b0098006100280000001000000012000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff +0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00001c000000fb02eeff0000000000009001000000020000005053796d626f6c0000bc0c0a8f5695 +ed775f95ed77d067ef77bc0c0a8f00000a00040000002d01060004000000f0010400070000002105010059007b0075013c000000430fc600880000000b002000 +000000000b0020009e00120128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffff +fffffffffffffffffffffffffffffffff81b037fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000 +9e00270128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffff +fffffffffffffffffc0d81bfffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009e003c0128000000 +200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffff +fe06c0dfffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009e00510128000000200000000b000000 +010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb03607fffffffff +ffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009e00660128000000200000000b0000000100010000000000 +00000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffd81b03fffffffffffffffffffffffff +ffffffffffffffff3c000000430fc600880000000b002000000000000b0020009e007b0128000000200000000b000000010001000000000000000000c30e0000 +c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffec0d81fffffffffffffffffffffffffffffffffffffffff +3c000000430fc600880000000b002000000000000b0020009e00900128000000200000000b000000010001000000000000000000c30e0000c30e000000000000 +0000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb606c1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600 +880000000b002000000000000b0020009e00a50128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000 +ffffff00fffffffffffffffffffffffffffffffffffffffff9b0361fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000 +000000000b0020009e00ba0128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffff +fffffffffffffffffffffffffffffffff8d81b1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000 +9e00cf0128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffff +fffffffffffffffff86c0d9fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020009e00e40128000000 +200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffff +f83606dfffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b001600000000000b0016009e00f90128000000180000000b000000 +010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff81b7fffffffffff +ffffffffffffffffffffffffffffffff040000002d0103000e000000240305000d02a3000702a6000902a3000702a0000d02a30066000000430fc60088000000 +20000b000000000020000b0018008801280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00 +ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000 +66000000430fc6008800000020000b000000000020000b002d008801280000001000000020000000010001000000000000000000c30e0000c30e000000000000 +0000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000 +fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000 +ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b0042008801280000001000000020000000010001000000000000000000 +c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000 +ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b0057008801280000001000000020000000 +010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000 +fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b006c008801 +280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000 +ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b00 +0000000020000b0081008801280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000 +ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000 +fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000 +430fc6008800000020000b000000000020000b0096008801280000001000000020000000010001000000000000000000c30e0000c30e00000000000000000000 +00000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000 +ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000 +ffff0000ffff000066000000430fc6008800000020000b000000000020000b00ab008801280000001000000020000000010001000000000000000000c30e0000 +c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000 +fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000 +ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00c000880128000000100000002000000001000100 +0000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000 +ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000 +fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00d500880128000000 +1000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000 +fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000 +ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b0000000000 +20000b00ea008801280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000 +ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000 +ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000062000000430fc600 +880000001e000b00000000001e000b00ff00880128000000100000001e000000010001000000000000000000c30e0000c30e0000000000000000000000000000 +ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000 +ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00000e000000 +240305008d0119008a011f008d011d0090011f008d01190008000000fa0206000200000000000000040000002d0104000500000014026f006201050000001302 +a3008d01040000002d010000040000002d01010004000000f00104000e000000240305005e016a0061017700630170006b016f005e016a000500000014025800 +e7010500000013025700e5010500000014025700e5010500000013025600e4010500000014025600e4010500000013025600e1010500000014025600e1010500 +000013025600df010500000014025600df010500000013025600dc010500000014025600dc010500000013025700d9010500000014025700d901050000001302 +5800d5010500000014025800d5010500000013025900d1010500000014025900d1010500000013025b00cc010500000014025b00cc010500000013025e00c801 +0500000014025e00c8010500000013026000c3010500000014026000c3010500000013026300be010500000014026300be010500000013026600b80105000000 +14026600b8010500000013026a00b2010500000014026a00b2010500000013026d00ad010500000014026d00ad010500000013027100a6010500000014027100 +a6010500000013027600a0010500000014027600a0010500000013027a009a010500000014027a009a010500000013027f0094010500000014027f0094010500 +0000130284008d0105000000140284008d0105000000130289008701050000001402890087010500000013028e0081010500000014028e008101050000001302 +93007b0105000000140293007b0105000000130299007401050000001402990074010500000013029e006e010500000014029e006e01050000001302a3006801 +050000001402a3006801050000001302a9006301050000001402a9006301050000001302ae005d01050000001402ae005d01050000001302b300580105000000 +1402b3005801050000001302b9005301050000001402b9005301050000001302be004e01050000001402be004e01050000001302c3004a01050000001402c300 +4a01050000001302c8004601050000001402c8004601050000001302cc004201050000001402cc004201050000001302d1003e01050000001402d1003e010500 +00001302d5003b01050000001402d5003b01050000001302d9003901050000001402d9003901050000001302dd003701050000001402dd003701050000001302 +e0003501050000001402e0003501050000001302e3003401050000001402e3003401050000001302e6003301050000001402e6003301050000001302e9003201 +050000001402e9003201050000001302eb003201050000001402eb003201050000001302ed003301050000001402ed003301050000001302ee00330105000000 +1402ee003301050000001302ef003501050000001402ef003501050000001302f0003601050000001402f0003601050000001302f0003901050000001402f000 +3901050000001302f0003b01050000001402f0003b01050000001302f0003e01050000001402f0003e01050000001302ef004101050000001402ef0041010500 +00001302ee004501050000001402ee004501050000001302ed004901050000001402ed004901050000001302eb004e01050000001402eb004e01050000001302 +e8005201050000001402e8005201050000001302e6005701050000001402e6005701050000001302e3005c01050000001402e3005c01050000001302e0006201 +050000001402e0006201050000001302dc006801050000001402dc006801050000001302d9006e01050000001402d9006e01050000001302d500740105000000 +1402d5007401050000001302d0007a01050000001402d0007a01050000001302cc008001050000001402cc008001050000001302c7008601050000001402c700 +8601050000001302c2008d01050000001402c2008d01050000001302bd009301050000001402bd009301050000001302b8009901050000001402b80099010500 +00001302b300a001050000001402b300a001050000001302ad00a601050000001402ad00a601050000001302a800ac01050000001402a800ac01050000001302 +a300b201050000001402a300b2010500000013029d00b7010500000014029d00b7010500000013029800bd010500000014029800bd010500000013029300c201 +0500000014029300c2010500000013028d00c7010500000014028d00c7010500000013028800cc010500000014028800cc010500000013028300d00105000000 +14028300d0010500000013027e00d4010500000014027e00d4010500000013027a00d8010500000014027a00d8010500000013027500dc010500000014027500 +dc010500000013027100df010500000014027100df010500000013026d00e1010500000014026d00e1010500000013026900e3010500000014026900e3010500 +000013026600e5010500000014026600e5010500000013026300e6010500000014026300e6010500000013026000e7010500000014026000e701050000001302 +5d00e8010500000014025d00e8010500000013025b00e8010500000014025b00e8010500000013025900e7010500000014025900e7010500000013025800e701 +3c000000430fc600880000000b000b00000000000b000b0091006d0128000000100000000b000000010001000000000000000000c30e0000c30e000000000000 +0000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00000b00000017085800 +4d0140008d01cb00b4017d0066010b00000017086300d801a300ef01e800d1015e0047011c000000fb02eeff000000000000bc02000000020000005053796d62 +6f6c000060090aad5695ed775f95ed77d067ef7760090aad00000a00040000002d01040004000000f001060007000000210501006e00620053011c000000fb02 +eeff0000000000009001000000020000005053796d626f6c0000bc0c0a905695ed775f95ed77d067ef77bc0c0a9000000a00040000002d01060004000000f001 +0400070000002105010071009900d4011c000000fb02f4ff0000000000009001000000000000001054696d657300000060090aae5695ed775f95ed77d067ef77 +60090aae00000a00040000002d01040004000000f001060008000000210503006d6178009900de01040000002d010500070000001804190103022e0018010800 +0000fa0206000200000000000000040000002d0106003400000025031800ba016500b4016900ae016c00a8017000a20174009c01790096017e008f0182008901 +870083018c007c0192007601970070019c006a01a2006401a7005f01ad005901b2005401b7004f01bc004b01c1004701c6004301cb003f01cf003f01d0003400 +0000250318005e01e2006401df006a01db007001d7007601d3007c01cf008201ca008901c5008f01c0009501bb009c01b600a201b100a801ac00ae01a600b401 +a100b9019b00bf019600c4019100c9018b00ce018600d2018100d6017d00d9017800db0176003c000000430fc600880000000b002000000000000b0020006400 +580128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b00200064006d01280000002000 +00000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb03 +031fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b001100000000000b0011006400820128000000180000000b0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff86fffffffffffffffff +ffffffffffffffffffffffffffff66000000430fc6008800000020000b000000000020000b006400580128000000100000002000000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff +0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff +0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b007900580128000000100000002000 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff +0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff +0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc600880000001a000b00000000001a000b008e00 +580128000000100000001a000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff +0000ffff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff +0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00001c000000fb02eeff000000000000bc02000000020000005053796d626f6c000039050aea5695 +ed775f95ed77d067ef7739050aea00000a00040000002d01070004000000f001040007000000210501006e00190080001c000000fb02f4ff000000000000bc02 +000000000000001054696d657300000060090aaf5695ed775f95ed77d067ef7760090aaf00000a00040000002d01040004000000f00107000700000021050100 +7a0019008a001c000000fb02e8ff0000000000009001000000020000005053796d626f6c000039050aeb5695ed775f95ed77d067ef7739050aeb00000a000400 +00002d01070004000000f001040007000000210501005700d000ce001c000000fb02eeff0000000000009001000000020000005053796d626f6c000060090ab0 +5695ed775f95ed77d067ef7760090ab000000a00040000002d01040004000000f0010700070000002105010071009f00cb001c000000fb02eeff000000000000 +bc02000000020000005053796d626f6c000039050aec5695ed775f95ed77d067ef7739050aec00000a00040000002d01070004000000f0010400070000002105 +01006e001c0091011c000000fb02f4ff000000000000bc02000000000000001054696d657300000060090ab15695ed775f95ed77d067ef7760090ab100000a00 +040000002d01040004000000f001070007000000210501007a001c009b0160000000430fc600880000001d002000000000001d002000d7002e01280000002000 +00001d000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbff +fffffdfffffffeffffffff3fffffffdffffffffffffffffffffffffbffffffffffffffff7fffffffffffffffffffffffeffffffff3fffffffdfffffffeffffff +ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e000000430fc600880000001c002000000000001c002000c6004301280000002000 +00001c000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffffffffffff +fffffdffffffffffffffffbffffffffffffffffffffffff3fffffffdfffffffeffffffff7fffffffbffffffffffffffff7fffffffffffffffffffffffeffffff +ffffffffffdfffffffffffffffffffffffffffffffffffffffff60000000430fc600880000001d002000000000001d002000b400580128000000200000001d00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffdff +fffffeffffffff7fffffffbfffffffdffffffffffffffffbffffffffffffffffffffffff7fffffffffffffffeffffffff7fffffffbfffffffdfffffffe7fffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff60000000430fc600880000001d002000000000001d002000a2006d0128000000200000001d00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffffffffffdff +ffffffffffffffbffffffffffffffffffffffff7fffffffbfffffffdfffffffe7fffffffbffffffffffffffffffffffff7fffffffffffffffeffffffffffffff +ffffffffffdfffffffffffffffffffffffffffffffffffffffff5e000000430fc600880000001c002000000000001c0020009100820128000000200000001c00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffcff +ffffff7fffffffbfffffffdffffffffffffffffffffffffbffffffffffffffff7fffffffffffffffffffffffe7fffffffbfffffffdfffffffeffffffff7fffff +ffffffffffffffffffffffffffffffffffffffffffff60000000430fc600880000001d002000000000001d0020007f00970128000000200000001d0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffffffffffdffffffffff +ffffffffffffffbffffffffffffffff7fffffffbfffffffdfffffffeffffffff7fffffffbffffffffffffffff7fffffffffffffffffffffffeffffffffffffff +ffdfffffffffffffffffffffffffffffffffffffffff60000000430fc600880000001d002000000000001d0020006d00ac0128000000200000001d0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffbfffffffdfffffffeff +ffffff7fffffff9ffffffffffffffffffffffffbffffffffffffffff7fffffffffffffffffffffffeffffffff7fffffffbfffffffcffffffff7fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff60000000430fc600880000001d002000000000001d0020005b00c10128000000200000001d0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffffffffffdffffffffff +ffffffbffffffffffffffffffffffff7fffffff9fffffffeffffffff7fffffffbffffffffffffffffffffffff7fffffffffffffffeffffffffffffffffffffff +ffdfffffffffffffffffffffffffffffffffffffffff4c000000430fc600880000001300150000000000130015005300d6012800000018000000130000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff9fffffffeffffffff7f +ffffffbfffffffdffffffffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05000000140267006900050000001302a400 +7c00040000002d010000040000002d01010004000000f00106000e000000240305006700600065006d006a00670071006900670060001c000000fb02e8ff0000 +000000009001000000020000005053796d626f6c0000bc0c0a925695ed775f95ed77d067ef77bc0c0a9200000a00040000002d01060004000000f001040007000000210501005700cf00da01040000002701ffff030000000000}}{\insrsid6909422 +\par }\pard\plain \s62\qj \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\i0\fs24\insrsid6909422 +\par }{\b\i0\insrsid6909422 Figure II.4: }{\insrsid6909422 In }{\insrsid15669153 the Colsher }{\insrsid6909422 filter, for any frequency vector }{\insrsid3752688 {\pict{\*\picprop\shplid1039{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw318\pich388\picwgoal180\pichgoal220\wmetafile8\bliptag721319115\blipupi119{\*\blipuid 2afe74cb9519d764d2a0795b41758548}010009000003a300000002001c0000000000050000000b0200000000050000000c020b0009000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d5420457874726100050af05695ed775f95ed77d067ef7739050af000000a00040000002d010000070000002105020020200b000000 +07000000210502007220010003001c000000fb02f6ff0000000000009001020000020000005053796d626f6c00003d0f0ae25695ed775f95ed77d067ef773d0f +0ae200000a00040000002d01010004000000f001000007000000210502006e20090002000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 +, the 2D Ramp filter has to be weighted by the arc length of the intersection between the great circle perpendicular to }{\insrsid3752688 {\pict{\*\picprop\shplid1040{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw318\pich388\picwgoal180\pichgoal220\wmetafile8\bliptag890118555\blipupi119{\*\blipuid 350e219b4c9488adde3b40af370bd9c1}010009000003a300000002001c0000000000050000000b0200000000050000000c020b0009000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d5420457874726100080a395695ed775f95ed77d067ef7749080a3900000a00040000002d010000070000002105020020200b000000 +07000000210502007220010003001c000000fb02f6ff0000000000009001020000020000005053796d626f6c0000890c0aac5695ed775f95ed77d067ef77890c +0aac00000a00040000002d01010004000000f001000007000000210502006e20090002000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 with the set of measured directions of projection }{\f3\insrsid6909422 \'57}{\insrsid6909422 + represented on the unit sphere. Thus, }{\insrsid15669153 the Colsher }{\insrsid6909422 filter can be split into 2 regions depending on whether the great circle perpendicular to }{\insrsid3752688 +{\pict{\*\picprop\shplid1041{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw318\pich388\picwgoal180\pichgoal220\wmetafile8\bliptag1098413184\blipupi119{\*\blipuid 417874806d4a07622217107375068508}010009000003a300000002001c0000000000050000000b0200000000050000000c020b0009000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000a0000000504d54204578747261000d0ac55695ed775f95ed77d067ef778f0d0ac500000a00040000002d010000070000002105020020200b000000 +07000000210502007220010003001c000000fb02f6ff0000000000009001020000020000005053796d626f6c0000780c0a965695ed775f95ed77d067ef77780c +0a9600000a00040000002d01010004000000f001000007000000210502006e20090002000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}{\insrsid6909422 is contained in }{\f3\insrsid6909422 \'57}{\insrsid6909422 or not. +\par }{\b\i0\insrsid6909422 +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab A generalized Hamming apodizing window }{\pard\plain +\s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\dn8\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\object\objemb\rsltmerge\objw1900\objh240{\*\objclass Equation.3} +{\*\objdata 01050000020000000b0000004571756174696f6e2e330000000000000000005500000002000101000a0102846102980202862b02980202822802883102980202862d02980202846102822902980212826312826f12827302822802847002846e02822f02846e030f01000b011283610011000a0282290000 +01050000050000000d0000004d45544146494c455049435400080d000019feffffae0600000800080de7010000 +0100090000035303000007001c00000000000400000003010800050000000b0200000000050000000c0274001403040000002e0118001c000000fb021000070000000000bc02000000000102022253797374656d00001403000004b81100e172c730181022000c02000014030000040000002d0100000400000002010100 +050000000902000000021c000000fb029cff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d010100030000001e000700000016047300140300000000030000001e00040000002c010000030000001e00030000001e0008000000fa02 +00000000000000000000040000002d01020007000000fc020000ffffff000000040000002d010300040000002e01000005000000090200000000050000000102ffffff000400000004010d001c000000fb02bffc0000000000009001000000000740001254696d6573204e657720526f6d616e0000000000000000000000 +000000000000040000002d0104000400000004010d00040000002e011800040000000201010005000000090200000000050000000102ffffff00030000001e001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01 +050009000000320a5100080001000000615d32001c000000fb02adff0000000000009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a51005300010000002b5d32001c000000fb02adff0000000000009001 +000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a5100850001000000285d190009000000320a51009e0001000000315d2a001c000000fb02adff0000000000009001000000020700005053796d626f6c00000000 +00000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a5100d000010000002d5d32001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01050004000000f001 +060009000000320a5100020101000000615d32001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a5100450101000000295d19000c000000320a5100660103000000636f +730022002a00210009000000320a5100db0101000000285d19001c000000fb02adff0000000000009001020000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a5100fd0101000000705d290009000000320a51002f02 +010000006e5d29001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a51006902010000002f5d19001c000000fb02adff0000000000009001020000020700005053796d62 +6f6c0000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a51009b02010000006e5d2a001c000000fb02c6ff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d010600 +04000000f001050009000000320a6100c50201000000615d19001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a5100ee0201000000295d1900040000002701ffff0400 +00002d010200040000002d010300040000002d01010004000000f0010500040000002d010300040000002d010200040000002701ffff1c000000fb0285003a0000000000bc02000000000102022253797374656d00009b99807cfc112200fc112200f4eb160018102200685ec730040000002d01050004000000f0010400 +040000002701ffff040000002701ffff040000002701ffff0d000000320a51001803010004000000000014037300205d2d00040000002d010000030000000000}{\result {\dn8\insrsid3752688 {\pict{\*\picprop\shplid1042{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw3351\pich423\picwgoal1900\pichgoal240\wmetafile8\bliptag-1853442122\blipupi119{\*\blipuid 9186b7b6b08fc42a7d655b0b262263d5} +0100090000033c02000002001c0000000000050000000b0200000000050000000c020c005f000500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001020000020000005053796d626f6c0000bc0c0ae25695ed775f95ed77d067ef77bc0c0ae200000a00040000002d0100000700000021050100610008000100 +1c000000fb02f6ff0000000000009001000000020000005053796d626f6c000034080a965695ed775f95ed77d067ef7734080a9600000a00040000002d010100 +04000000f001000007000000210501002b0008000a001c000000fb02f6ff0000000000009001000000000000001054696d6573000000bc0c0ae35695ed775f95 +ed77d067ef77bc0c0ae300000a00040000002d01000004000000f0010100070000002105010028000800100007000000210501003100080013001c000000fb02 +f6ff0000000000009001000000020000005053796d626f6c000034080a975695ed775f95ed77d067ef7734080a9700000a00040000002d01010004000000f001 +000007000000210501002d00080019001c000000fb02f6ff0000000000009001020000020000005053796d626f6c0000bc0c0ae45695ed775f95ed77d067ef77 +bc0c0ae400000a00040000002d01000004000000f00101000700000021050100610008001f001c000000fb02f6ff000000000000900100000000000000105469 +6d657300000034080a985695ed775f95ed77d067ef7734080a9800000a00040000002d01010004000000f0010000070000002105010029000800270008000000 +21050300636f73ff08002b0007000000210501002800080039001c000000fb02f6ff0000000000009001020000020000005053796d626f6c0000bc0c0ae55695 +ed775f95ed77d067ef77bc0c0ae500000a00040000002d01000004000000f00101000700000021050100700008003d0007000000210501006e00080043001c00 +0000fb02f6ff0000000000009001000000000000001054696d657300000034080a995695ed775f95ed77d067ef7734080a9900000a00040000002d0101000400 +0000f001000007000000210501002f0008004a001c000000fb02f6ff0000000000009001020000020000005053796d626f6c0000bc0c0ae65695ed775f95ed77 +d067ef77bc0c0ae600000a00040000002d01000004000000f001010007000000210501006e00080050001c000000fb02f9ff0000000000009001020000000000 +001054696d657300000034080a9a5695ed775f95ed77d067ef7734080a9a00000a00040000002d01010004000000f0010000070000002105010061000a005500 +1c000000fb02f6ff0000000000009001000000000000001054696d6573000000bc0c0ae75695ed775f95ed77d067ef77bc0c0ae700000a00040000002d01000004000000f00101000700000021050100290008005a000a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}}}}{ +\insrsid6909422 has been included in }{\insrsid15669153 the Colsher }{\insrsid6909422 filter in order to limit the amplification of statistical noise. The parameter }{\i\f3\insrsid6909422 \'61}{\f3\insrsid6909422 \'20}{\insrsid6909422 +in the apodizing function allows to control the noise amplification due to the Ramp filter. }{\insrsid15669153 The Colsher }{\insrsid6909422 filter is one of an infinite number of possible filters allowing exact 3D reconstruction, but due to its minimum + norm property, it has the minimum noise amplifi}{\insrsid15797121 cation properties [Defrise, 1989}{\insrsid6909422 ]. +\par {\*\bkmkstart _Toc89164566}{\listtext\pard\plain\s3 \b\f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af36\dbch\af0\loch\f36 2.3.2\tab}}\pard\plain \s3\qj \fi-720\li720\ri12\sb320\widctlpar\brdrt\brdrdot\brdrw15 +\jclisttab\tx720\tx860\aspalpha\aspnum\faauto\ls2\ilvl2\outlinelevel2\adjustright\rin12\lin720\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Implementation of }{\insrsid15669153 the Colsher }{\insrsid6909422 filter +{\*\bkmkend _Toc89164566} +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab The filtering step is performed using the }{ +\insrsid9315117 STIR }{\insrsid6909422 FFT routines, which require the array dimensions to be integer powers of two. Aliasing in the discrete convolution is avoided by padding }{\insrsid9315117 +the data to a power of two greater (or equal) to twice the data size. }{\cs27\fs16\up6\insrsid2571840 \chftn {\footnote \pard\plain \s28\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\cs27\fs16\up6\insrsid2571840 \chftn }{\insrsid2571840 If desired, this can be reduced by a factor by setting the \lquote }{\insrsid2571840\charrsid9315117 Transaxial extension for FFT}{ +\insrsid2571840 \rquote parameter to 0. However, this should only be done if the data indeed zero for half the FOV. As there are likely tails from remaining scatter or randoms, this is }{\b\i\insrsid2571840 not recommended}{\insrsid2571840 .}}}{ +\insrsid6909422 +\par }{\insrsid2571840 Similarly to in the 2D case, there is a problem with the DC (and very low frequency) components of the filtered data if the Colsher filter is simply sampled in frequency space. It is well-known +that sampling should occur in the spatial domain instead. In the STIR implementation of 2D FBP this is done by computing an analytic inverse fourier of the ramp filter and sampling that spatial function. However, the Colsher fiter cannot analytically be + transformed. Instead, we approximate this procedure by +\par {\listtext\pard\plain\s61 \f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033\insrsid2571840 \hich\af36\dbch\af0\loch\f36 -\tab}}\pard \s61\qj \fi-360\li720\ri12\sa80\sl-360\slmult0\widctlpar +\tx560\jclisttab\tx720\aspalpha\aspnum\faauto\ls3\adjustright\rin12\lin720\itap0\pararsid2571840 {\insrsid2571840 sampling the Colsher filter in frequency space at a high sampling rate +\par {\listtext\pard\plain\s61 \f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033\insrsid2571840 \hich\af36\dbch\af0\loch\f36 -\tab}numerically inverse DFT to the spatial domain +\par {\listtext\pard\plain\s61 \f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033\insrsid2571840 \hich\af36\dbch\af0\loch\f36 -\tab}sub}{\insrsid608581 -}{\insrsid2571840 sample Colsher filter in spatial domain to the desired sampling size (given by the +sampling of the projection data) +\par {\listtext\pard\plain\s61 \f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033\insrsid2571840 \hich\af36\dbch\af0\loch\f36 -\tab}numerically DFT to }{\insrsid608581 the }{\insrsid2571840 frequency domain +\par }\pard \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0\pararsid608581 {\insrsid608581 +As the Colsher filter is independent of the azimuthal angle, this procedure has to be done only a few times per reconstruction. The amount of sub-sampling is determined by the \lquote }{\insrsid608581\charrsid608581 +Stretch factor for Colsher filter definition in planar direction}{\insrsid608581 \rquote parameter (and similar for axial direction).}{\insrsid608581\charrsid608581 +\par }\pard \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 {\insrsid6909422 +\par {\*\bkmkstart _Toc89164567}{\listtext\pard\plain\s2 \b\f4\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af4\dbch\af0\loch\f4 2.4\tab}}\pard\plain \s2\qj \fi-576\li576\ri12\sa80\sl360\slmult0\widctlpar +\jclisttab\tx576\tx680\aspalpha\aspnum\faauto\ls2\ilvl1\outlinelevel1\adjustright\rin12\lin576\itap0 \shading1000 \b\f4\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Forward Projection{\*\bkmkend _Toc89164567} +\par {\*\bkmkstart _Toc89164568}{\listtext\pard\plain\s3 \b\f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af36\dbch\af0\loch\f36 2.4.1\tab}}\pard\plain \s3\qj \fi-720\li720\ri12\sb320\widctlpar\brdrt\brdrdot\brdrw15 +\jclisttab\tx720\tx860\aspalpha\aspnum\faauto\ls2\ilvl2\outlinelevel2\adjustright\rin12\lin720\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Description{\*\bkmkend _Toc89164568} +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab The forward projection function allows to +estimate the unmeasured data for oblique sinograms with |}{\f3\insrsid6909422 \'71\'7c}{\insrsid6909422 > \'b1 1. }{\insrsid2571840 T}{\insrsid6909422 he problem of how to complete the partially-measured projections o}{\insrsid15669153 f}{ +\insrsid6909422 the truncated projections is detailed here. +\par {\*\bkmkstart _Toc89164569}{\listtext\pard\plain\s3 \b\f36\fs20\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af36\dbch\af0\loch\f36 2.4.2\tab}}\pard\plain \s3\qj \fi-720\li720\ri12\sb320\widctlpar\brdrt\brdrdot\brdrw15 +\jclisttab\tx720\tx860\aspalpha\aspnum\faauto\ls2\ilvl2\outlinelevel2\adjustright\rin12\lin720\itap0 \b\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Extending the effective axial length of the scanner (rmin and rmax) +{\*\bkmkend _Toc89164569} +\par }\pard\plain \s53\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab +The 3DRP algorithm necessitates the estimation of a number of unmeasured sinograms so as to satisfy the condition of axial shift invariance. Th +ese synthetic sinograms are found by forward-projecting an estimate of the image reconstructed from direct projections. Ray-tracing methods are particularly appropriate for the forward projection step. +\par \tab The forward projection processing which was carried +out with the implementation of Siddon's algorithm [Siddon et al., 1985], allows to estimate unmeasured oblique projection data which depend mainly on the number of elements in the unmeasured parts of the oblique projections. The forward projecting step es +timates all the truncated projection data on fictive rings and is equivalent to simulate a PET scanner with a longer axial length. +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 \tab +The problem of how to complete the partially-measured projections can be resolved by using one set of complete projections that are measured (i.e direct projections with }{\i\f3\insrsid6909422 \'71}{\insrsid6909422 + = 0) to reconstruct an initial image using 2D FBP. With ths initial image, it is then possible to simulate the projection process mathematically and to create the unmeasured parts of a projection by \'93forward projecting\'94 + along LORs that do not exist in the actual tomograph as shown in Figure II.5. In practice, the unmeasured samples are grouped together into \'93missing sinograms corresponding to ring indexes outside the physical range of the tomograph. +\par +\par }\pard\plain \qc \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\f8\insrsid3752688 {\pict{\*\picprop\shplid1043{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}} +{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex93\picscaley60\piccropl0\piccropr0\piccropt0\piccropb0 +\picw17286\pich10019\picwgoal9800\pichgoal5680\wmetafile8\bliptag-210062959\blipupi120{\*\blipuid f37ab191349264566ef9de6a9b057ded} +0100090000033b2700000600660000000000050000000b02aa001400050000000c021c01ea010500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e0007000000fc020000b3b3b3000000040000002d01000008000000fa02060001000000 +00000000040000002d010100070000001b045201fa00f80091000500000007010100000066000000430fc6008800000020000b000000000020000b00ac00c000 +280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000 +ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000 +ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b00 +0000000020000b00c100c000280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000 +ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000 +fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000 +430fc6008800000020000b000000000020000b00d600c000280000001000000020000000010001000000000000000000c30e0000c30e00000000000000000000 +00000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000 +ffff0000ffff000066000000430fc6008800000020000b000000000020000b00eb00c000280000001000000020000000010001000000000000000000c30e0000 +c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000 +fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000 +ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b000001c00028000000100000002000000001000100 +0000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000 +ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b001501c00028000000 +1000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000 +fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b0000000000 +20000b002a01c000280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000 +ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc600 +8800000020000b000000000020000b003f01c000280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000 +ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000 +fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000 +ffff000066000000430fc6008800000020000b000000000020000b005401c000280000001000000020000000010001000000000000000000c30e0000c30e0000 +000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000 +ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000ffff0000 +ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b006901c0002800000010000000200000000100010000000000 +00000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000 +fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000 +fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00004a000000430fc6008800000012000b000000000012000b007e01c0002800000010000000 +12000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000 +ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000007000000fc0200000000000000000400 +00002d01020004000000f00100000e00000024030500c5009301c2008a01c5008a01c8008a01c50093011c000000fb02f4ff0000000000009001020000020000 +005053796d626f6c0000f4090a4d5695ed775f95ed77d067ef77f4090a4d00000a00040000002d01000007000000210501007100e8002f011c000000fb02f4ff +0000000000009001020000000000001054696d6573000000ee090ae25695ed775f95ed77d067ef77ee090ae200000a00040000002d01030004000000f0010000 +07000000210501005200cb007600070000002105010052007b01a0001c000000fb02f6ff0000000000009001020000000000001054696d6573000000f4090a4e +5695ed775f95ed77d067ef77f4090a4e00000a00040000002d01000004000000f00103000800000021050300666f76007b01a8000a00000026060f000a00ffff +ffff0000000000001c000000fb02f4ff0000000000009001020000000000001054696d6573000000ee090ae35695ed775f95ed77d067ef77ee090ae300000a00 +040000002d01030004000000f00100000b0000002105090072202020202020203d00c70074011c000000fb02f6ff000000000000900102000000000000105469 +6d6573000000f4090a4f5695ed775f95ed77d067ef77f4090a4f00000a00040000002d01000004000000f001030008000000210503006d696e20cc007a011c00 +0000fb02f4ff0000000000009001000000000000001054696d6573000000ee090ae45695ed775f95ed77d067ef77ee090ae400000a00040000002d0103000400 +0000f001000007000000210501002000bd009e011c000000fb02f4ff0000000000009001020000000000001054696d6573000000f4090a505695ed775f95ed77 +d067ef77f4090a5000000a00040000002d01000004000000f0010300090000002105050064656c746100bd00a1011c000000fb02f4ff00000000000090010000 +00000000001054696d6573000000ee090ae55695ed775f95ed77d067ef77ee090ae500000a00040000002d01030004000000f00100000800000021050300202a +2874bd00b7011c000000fb02f4ff0000000000009001020000000000001054696d6573000000f4090a515695ed775f95ed77d067ef77f4090a5100000a000400 +00002d01000004000000f001030007000000210501005200bd00c4011c000000fb02f6ff0000000000009001020000000000001054696d6573000000ee090ae6 +5695ed775f95ed77d067ef77ee090ae600000a00040000002d01030004000000f00100000800000021050300666f7674bd00cc011c000000fb02f4ff00000000 +00009001000000000000001054696d6573000000f4090a525695ed775f95ed77d067ef77f4090a5200000a00040000002d01000004000000f001030007000000 +210502002b20bd00d9011c000000fb02f4ff0000000000009001020000000000001054696d6573000000ee090ae75695ed775f95ed77d067ef77ee090ae70000 +0a00040000002d01030004000000f001000007000000210501005200bd00e3011c000000fb02f4ff0000000000009001000000000000001054696d6573000000 +f4090a535695ed775f95ed77d067ef77f4090a5300000a00040000002d01000004000000f001030007000000210501002900bd00eb01050000001402c4009b01 +050000001302c400f30107000000210501003200cf00bb011c000000fb02f4ff0000000000009001020000000000001054696d6573000000ee090ae85695ed77 +5f95ed77d067ef77ee090ae800000a00040000002d01030004000000f001000007000000210501005200cf00c1010a00000026060f000a00ffffffff01000000 +00001c000000fb02eeff000000000000bc02000000000000001054696d6573000000f4090a545695ed775f95ed77d067ef77f4090a5400000a00040000002d01 +000004000000f00103000800000021050300464f56ff14019a00050000001402d0004000050000001302d000bc000e000000240305003700d0004000d3004000 +d0004000cd003700d0000e00000024030500c500d000bc00d300bc00d000bc00cd00c500d00007000000fc020000ffffff000000040000002d01030008000000 +fa0205000100000000000000040000002d0104000e00000024030500ca008b01dc008b01dc009d01ca009d01ca008b011c000000fb02f4ff0000000000009001 +020000000000001054696d6573000000ee090ae95695ed775f95ed77d067ef77ee090ae900000a00040000002d01050004000000f00100000700000021050100 +7a009701ce000e00000024030500a500ae012101ae012101c001a500c001a500ae011c000000fb02f4ff0000000000009001000000000000001054696d657300 +0000f4090a555695ed775f95ed77d067ef77f4090a5500000a00040000002d01000004000000f00105001200000021051700457874656e646564206465746563 +746f722072696e677300ba01a900040000002d010100050000001402a801ef0005000000130273014601040000002d0102000e00000024030500490171014601 +7701460173014201710149017101050000001402a601c600050000001302730143000e0000002403050040007101470070014400720145007601400071013c00 +0000430fc600880000000b002000000000000b002000ee00300028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc6008800 +00000b002000000000000b002000ee00450028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffb03031fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b0020000000 +00000b002000ee005a0028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff860607fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000ee00 +6f0028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffffc0c0c1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000ee008400280000002000 +00000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff981 +819fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000ee00990028000000200000000b0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff830303fffffffffffff +ffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000ee00ae0028000000200000000b00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffe06061fffffffffffffffffffffffffffff +ffffffffffff3c000000430fc600880000000b002000000000000b002000ee00c30028000000200000000b000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8c0c0dfffffffffffffffffffffffffffffffffffffffff3c00 +0000430fc600880000000b002000000000000b002000ee00d80028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc6008800 +00000b002000000000000b002000ee00ed0028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffb03031fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b0020000000 +00000b002000ee00020128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff860607fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000ee00 +170128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffffc0c0c1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000ee002c01280000002000 +00000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff981 +819fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b001900000000000b001900ee00410128000000200000000b0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff8303fffffffffffffff +ffffffffffffffffffffffffffff0500000014026c01bc000500000013026c019a000e00000024030500c5006c01bc006901bc006c01bc006f01c5006c010e00 +00002403050091006c019a0069019a006c019a006f0191006c013c000000430fc600880000000b002000000000000b0020005201300028000000200000000b00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffff +ffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020005201450028000000200000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb03031fffffffffffffffffffff +ffffffffffffffffffff3c000000430fc600880000000b002000000000000b00200052015a0028000000200000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff860607fffffffffffffffffffffffffffffffffffff +ffff3c000000430fc600880000000b002000000000000b00200052016f0028000000200000000b000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc0c0c1fffffffffffffffffffffffffffffffffffffffff3c000000430f +c600880000000b002000000000000b0020005201840028000000200000000b000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff981819fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b00 +2000000000000b0020005201990028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffff830303fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b00 +20005201ae0028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffffe06061fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020005201c3002800 +0000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffff8c0c0dfffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020005201d80028000000200000000b00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffff +ffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020005201ed0028000000200000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffb03031fffffffffffffffffffff +ffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020005201020128000000200000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff860607fffffffffffffffffffffffffffffffffffff +ffff3c000000430fc600880000000b002000000000000b0020005201170128000000200000000b000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc0c0c1fffffffffffffffffffffffffffffffffffffffff3c000000430f +c600880000000b002000000000000b00200052012c0128000000200000000b000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff981819fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b00 +1900000000000b0019005201410128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffff8303fffffffffffffffffffffffffffffffffffffffffff05000000140208015401050000001302510135003c00 +0000430fc600880000000b002000000000000b0020004c01310028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc6008800 +00000b002000000000000b0020004c01460028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffffb03031fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b0020000000 +00000b0020004c015b0028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff860607fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b0020004c01 +700028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffffc0c0c1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b001100000000000b0011004c018500280000001800 +00000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff98f +ffffffffffffffffffffffffffffffffffffffffffff1c000000fb02f4ff0000000000009001020000020000005053796d626f6c0000ee090aea5695ed775f95 +ed77d067ef77ee090aea00000a00040000002d01050004000000f0010000070000002105010071004d01760066000000430fc6008800000020000b0000000000 +20000b004f018c00280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000 +ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000 +fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc600 +880000001a000b00000000001a000b0064018c0028000000100000001a000000010001000000000000000000c30e0000c30e0000000000000000000000000000 +ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000 +fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00000b000000170839019700510199008d0172001501 +faff050000001402f9005501050000001302410136000a00000026060f000a00ffffffff0000000000000a00000026060f000a00ffffffff0000000000000400 +00002d010300040000002d0104000e000000240305001a003b012b003b012b004d011a004d011a003b011c000000fb02f4ff0000000000009001000000a00000 +00504d5420457874726100090a565695ed775f95ed77d067ef77f4090a5600000a00040000002d01000004000000f001050007000000210501004d0048011e00 +07000000210501004d001f011f000a00000026060f000a00ffffffff00000000000007000000fc020000e6e6e6000000040000002d010500040000002d010100 +070000001b0458013600f3001e000a00000026060f000a00ffffffff000000000000040000002d01030004000000f0010500040000002d0104000e0000002403 +05001e00570136005701360091011e0091011e0057013c000000430fc600880000000b002000000000000b0020005201190028000000200000000b0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffff +ffffffffffffffffffffffffffff3c000000430fc600880000000b000d00000000000b000d0052012e0028000000100000000b00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff +0000ffff000066000000430fc6008800000020000b000000000020000b0052013000280000001000000020000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b0067013000280000001000000020000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff +0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc600880000001a000b00000000001a000b007c013000280000001000 +00001a000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff +0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff +0000ffff0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b0020008b011b0028000000200000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffff +ffffffffffffffffffff3c000000430fc600880000000b000d00000003000b000d008b01190028000000100000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffdf0000ffff0000ffff0000ffff0000ffff0000ffff +000066000000430fc6008800000020000b000000000020000b0076011900280000001000000020000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff +0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b006101190028000000100000002000000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000fbff +0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff +0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc600880000001a000b00000000001a000b005201190028000000100000001a00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff +0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff +0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b0020007d01190028000000200000000b00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffff +ffffffffffff3c000000430fc600880000000b000d00000000000b000d007d012e0028000000100000000b000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00003c00 +0000430fc600880000000b002000000000000b0020006f01190028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc6008800 +00000b000d00000000000b000d006f012e0028000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000040000002d01010005000000140257011e00 +050000001302570135003c000000430fc600880000000b002000000000000b0020006101190028000000200000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffff +ffff3c000000430fc600880000000b000d00000000000b000d0061012e0028000000100000000b000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00000a0000002606 +0f000a00ffffffff01000000000005000000140201011e000500000013020101350005000000140210011e00050000001302100135000500000014021e011e00 +0500000013021e0135000500000014022c011e000500000013022c0135000500000014023b011e000500000013023b01350005000000140249011e0005000000 +1302490135000a00000026060f000a00ffffffff000000000000040000002d0104000e000000240305001e00ba003600ba003600f4001e00f4001e00ba003c00 +0000430fc600880000000b002000000000000b002000b500190028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000 +000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc6008800 +00000b000d00000000000b000d00b5002e0028000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000 +000020000b00b5003000280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff +0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff +0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430f +c6008800000020000b000000000020000b00ca003000280000001000000020000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff +0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff +0000ffff00005a000000430fc600880000001a000b00000000001a000b00df00300028000000100000001a000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff +0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00003c000000430f +c600880000000b002000000000000b002000ee001b0028000000200000000b000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b00 +0d00000003000b000d00ee00190028000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +0000ffff0000ffff0000ffff0000ffff0000ffdf0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b00000000002000 +0b00d9001900280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff +0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff +0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800 +000020000b000000000020000b00c4001900280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff +0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff +00005a000000430fc600880000001a000b00000000001a000b00b500190028000000100000001a000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff +0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00003c000000430fc6008800 +00000b002000000000000b002000e000190028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000d000000 +00000b000d00e0002e0028000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff +0000ffff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b002000d100 +190028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000d00000000000b000d00d1002e00280000001000 +00000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff +0000ffff0000ffff0000ffff0000ffff0000ffff0000040000002d010100050000001402ba001e00050000001302ba0035003c000000430fc600880000000b00 +2000000000000b002000c300190028000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000d00000000000b00 +0d00c3002e0028000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff +0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00000a00000026060f000a00ffffffff0100000000000a00000026060f000a00 +ffffffff0100000000000a00000026060f000a00ffffffff010000000000050000001402f3001e00050000001302f30035000a00000026060f000a00ffffffff +010000000000050000001402c7005501050000001302100136000a00000026060f000a00ffffffff00000000000007000000fc020000e6e6e600000004000000 +2d010500070000001b0458016d01f30054010a00000026060f000a00ffffffff000000000000040000002d01030004000000f0010500040000002d0104000e00 +000024030500540157016d0157016d01910154019101540157013c000000430fc600880000000b002000000000000b00200052014f0128000000200000000b00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffff +ffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000e00000000000b000e005201640128000000100000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fb7f0000ffff0000ffff0000ffff +0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b0052016701280000001000000020000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff +0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff +0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00670167012800000010000000200000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff +0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff +0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc600880000001a000b00000000001a000b007c0167012800 +0000100000001a000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff +0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff +0000ffff0000ffff0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b0020008b01520128000000200000000b0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffffc0c0c1fffffffffffff +ffffffffffffffffffffffffffff3c000000430fc600880000000b000e00000002000b000e008b014f0128000000100000000b00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fe7f0000ffff0000ffff0000ffff0000ffff +0000ffff000066000000430fc6008800000020000b000000000020000b0076014f01280000001000000020000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff +0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b0061014f01280000001000000020000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff +0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff +0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc600880000001a000b00000000001a000b0052014f01280000001000 +00001a000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff +0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000ffff +0000ffff0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b0020007d014f0128000000200000000b000000010001000000 +000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffff +ffffffffffffffffffff3c000000430fc600880000000b000e00000000000b000e007d01640128000000100000000b000000010001000000000000000000c30e +0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fb7f0000ffff0000ffff0000ffff0000ffff0000ffff +00003c000000430fc600880000000b002000000000000b0020006f014f0128000000200000000b000000010001000000000000000000c30e0000c30e00000000 +00000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430f +c600880000000b000e00000000000b000e006f01640128000000100000000b000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fb7f0000ffff0000ffff0000ffff0000ffff0000ffff0000040000002d010100050000001402 +5701540105000000130257016c013c000000430fc600880000000b002000000000000b00200060014f0128000000200000000b00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffff +ffffffffffff3c000000430fc600880000000b000e00000000000b000e006001640128000000100000000b000000010001000000000000000000c30e0000c30e +0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fb7f0000ffff0000ffff0000ffff0000ffff0000ffff00000a00 +000026060f000a00ffffffff0100000000000500000014020101540105000000130201016c010500000014021001540105000000130210016c01050000001402 +1e0154010500000013021e016c010500000014022c0154010500000013022c016c010500000014023a0154010500000013023a016c0105000000140249015401 +05000000130249016c01040000002d0104000e000000240305005401ba006d01ba006d01f4005401f4005401ba003c000000430fc600880000000b0020000000 +00000b002000b5004f0128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffff +fffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000e00000000000b000e00b500 +640128000000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff +0000ffff0000fb7f0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00b5006701280000001000 +000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff +0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff +0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b00000000002000 +0b00ca006701280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff +0000ffff0000ffff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff +0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc6008800 +00001a000b00000000001a000b00df00670128000000100000001a000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffff +ff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff +0000ffff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b00 +2000ee00520128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffffc0c0c1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000e00000002000b000e00ee004f012800 +0000100000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff +0000fe7f0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00d9004f0128000000100000002000 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff +0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff +0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000066000000430fc6008800000020000b000000000020000b00c400 +4f01280000001000000020000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff +0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff +0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00005a000000430fc600880000001a00 +0b00000000001a000b00b5004f0128000000100000001a000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +0000ffff0000ffff0000ffff0000ffff0000fbff0000fbff0000fbff0000ffff0000ffff0000fbff0000fbff0000fbff0000fbff0000fbff0000fbff0000ffff +0000ffff0000fbff0000fbff0000fbff0000ffff0000ffff0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b002000e000 +4f0128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffff +fffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000e00000000000b000e00e0006401280000001000 +00000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fb7f +0000ffff0000ffff0000ffff0000ffff0000ffff00003c000000430fc600880000000b002000000000000b002000d1004f0128000000200000000b0000000100 +01000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffff +ffffffffffffffffffffffffffff3c000000430fc600880000000b000e00000000000b000e00d100640128000000100000000b00000001000100000000000000 +0000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fb7f0000ffff0000ffff0000ffff0000ffff +0000ffff0000040000002d010100050000001402ba005401050000001302ba006c013c000000430fc600880000000b002000000000000b002000c3004f012800 +0000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b000e00000000000b000e00c300640128000000100000000b00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff0000ffff0000ffff0000ffff0000ffff0000fb7f0000ffff +0000ffff0000ffff0000ffff0000ffff0000050000001402f3005401050000001302f3006c010a00000026060f000a00ffffffff0100000000003c000000430f +c600880000000b002000000000000b002000f300f40028000000200000000b000000010001000000000000000000c30e0000c30e000000000000000000000000 +0000ffffff00fffffffffffffffffffffffffffffffffffffffff818181fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b00 +2000000000000b002000f300090128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffff +fffffffffffffffffffffffffffffffffffffb03031fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b00 +2000f3001e0128000000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffff +fffffffffffffffffffff860607fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b002000000000000b002000f30033012800 +0000200000000b000000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00ffffffffffffffffffffffffffffffffffff +fffffc0c0c1fffffffffffffffffffffffffffffffffffffffff3c000000430fc600880000000b001200000000000b001200f300480128000000180000000b00 +0000010001000000000000000000c30e0000c30e0000000000000000000000000000ffffff00fffffffffffffffffffffffffffffffffffffffff987ffffffffffffffffffffffffffffffffffffffffffff0b0000001708d4002701f9002b0194012c015e00f6ff040000002701ffff030000000000}}{\insrsid6909422 + +\par }\pard\plain \s62\qj \li0\ri12\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \i\f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\i0\insrsid6909422 +\par Figure II.5: }{\insrsid6909422 Extending the effective axial length of the scanner by forward projection (here}{\f3\insrsid6909422 \'20\'79\'20\'3c\'20\'59\'29\'20}{\insrsid6909422 +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par +\par \tab The calculation of the lower and upper bound ring numbers of the extra detectors rings }{\i\insrsid6909422 rmin}{\insrsid6909422 and }{\i\insrsid6909422 rmax}{\insrsid6909422 is based on the following formula: +\par }\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar +\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\dn26\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\object\objemb\rsltmerge\objw6561\objh580{\*\objclass Equation.3}{\*\objdata 01050000020000000b0000004571756174696f6e2e3300 +0000000000000000ce010000 +02000101000a0112827412826112826e02822812837412836812836512837412836102822902980202863d029802030e000001128372030f01000b0112826d12826912826e0011000a0286b4128372030f01000b01128373001100000a01128352030f01000b0112836612836f1283760011000a02862b02980212835200 +0002980202863d029802030e00000112836412836512836c1283741283610298020286b4128372030f01000b01128373001100000a01028832128352000002980202980202980202980202980202980202980202980202980202980202980202980202980202980202980202980202980202980202980202980202980202 +980202980202980202980202863d02863e029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802029802128372030f01000b0112826d12826912826e0011000a +02980202863d029802030e00000112836412836512836c12837412836102980202822a028228128352030f01000b0112836612836f1283760011000a02862b02980212835202822900010288321283520000000001050000050000000d0000004d45544146494c455049435400122d000001fcffffa80e0000 +0800122dff030000 +0100090000035007000008001c00000000000400000003010800050000000b0200000000050000000c02f200a50a040000002e0118001c000000fb021000070000000000bc02000000000102022253797374656d0000a50a000004b81100e172c730181022000c020000a50a0000040000002d0100000400000002010100 +050000000902000000021c000000fb029cff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d010100030000001e00070000001604f200a50a00000000030000001e00040000002c010000030000001e00030000001e0008000000fa02 +00000000000000000000040000002d01020007000000fc020000ffffff000000040000002d010300040000002e01000005000000090200000000050000000102ffffff000400000004010d001c000000fb02befc0000000000009001000000000740001254696d6573204e657720526f6d616e0000000000000000000000 +000000000000040000002d0104000400000004010d00040000002e011800040000000201010005000000090200000000050000000102ffffff00030000001e001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01 +05000c000000320a860008000300000074616e0019002200290009000000320a8600750001000000285d19001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00105000f000000320a86009600 +0500000074686574610019002a00210019002a001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a86003d0101000000295d19001c000000fb02adff0000000000009001 +000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a86005e01010000003d5d32001c000000fb02adff0000000000009001020000000700001054696d65730000000000000000000000000000000000000000000000 +00000000040000002d01050004000000f001060009000000320a4b00a90101000000725d21001c000000fb02c6ff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f00105000c000000320a6400c201030000006d69 +6e002a00100019001c000000fb02adff0000000000009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000320a4b00370201000000b45d32001c000000fb02adff0000000000009001020000000700001054696d65 +73000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320a4b00710201000000725d21001c000000fb02c6ff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d010500 +04000000f001060009000000320a64008a0201000000735d19001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01060004000000f001050009000000320ac000a90101000000525d32001c000000fb02c6ff0000 +000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f00106000c000000320ad900e30103000000666f76001100190021001c000000fb02adff0000000000009001000000020700005053796d626f6c00000000000000000000 +00000000000000000000000000000000040000002d01060004000000f001050009000000320ac0003f02010000002b5d32001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001060009000000 +320ac000820201000000525d320008000000fa0206000800000000000000040000002d0106000500000014026400a1010500000013026400ab021c000000fb02adff0000000000009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01070004000000 +f001050009000000320a8600c402010000003d5d32001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f00107000f000000320a4b0007030500000064656c7461002a002100190019002a001c00 +0000fb02adff0000000000009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01070004000000f001050009000000320a4b00b60301000000b45d32001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000 +000000000000000000000000000000000000040000002d01050004000000f001070009000000320a4b00f90301000000725d21001c000000fb02c6ff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f00105000900 +0000320a6400120401000000735d19001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001070009000000320ac0006b0301000000325d2a001c000000fb02adff000000000000900102000000 +0700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001050009000000320ac0009d0301000000525d32000500000014026400ff0205000000130264002b041c000000fb02adff0000000000009001000000020700005053796d626f6c000000000000 +0000000000000000000000000000000000000000040000002d01050004000000f001070009000000320a8600a105010000003d5d320009000000320a8600d305010000003e5d32001c000000fb02adff0000000000009001020000000700001054696d657300000000000000000000000000000000000000000000000000 +0000040000002d01070004000000f001050009000000320a8600a60701000000725d21001c000000fb02c6ff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f00107000c000000320a9600bf07030000006d696e00 +2a00100019001c000000fb02adff0000000000009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01070004000000f001050009000000320a86002b08010000003d5d32001c000000fb02adff0000000000009001020000000700001054696d657300 +0000000000000000000000000000000000000000000000000000040000002d01050004000000f00107000f000000320a43006e080500000064656c7461002a002100190019002a001c000000fb02adff0000000000009001000000000700001054696d657300000000000000000000000000000000000000000000000000 +0000040000002d01070004000000f001050009000000320a43001d09010000002a5d2a0009000000320a43004f0901000000285d19001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f0010700 +09000000320a4300700901000000525d32001c000000fb02c6ff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f00105000c000000320a5300ab0903000000666f76001000190022001c000000fb02adff00000000 +00009001000000020700005053796d626f6c0000000000000000000000000000000000000000000000000000040000002d01050004000000f001070009000000320a43000f0a010000002b5d32001c000000fb02adff0000000000009001020000000700001054696d657300000000000000000000000000000000000000 +0000000000000000040000002d01070004000000f001050009000000320a4300490a01000000525d32001c000000fb02adff0000000000009001000000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01050004000000f001070009000000320a43007b0a0100 +0000295d190009000000320ac0004f0901000000325d2a001c000000fb02adff0000000000009001020000000700001054696d6573000000000000000000000000000000000000000000000000000000040000002d01070004000000f001050009000000320ac000810901000000525d3200050000001402640066080500 +000013026400940a040000002701ffff040000002d010200040000002d010300040000002d01010004000000f001060004000000f0010700040000002d010300040000002d010200040000002701ffff1c000000fb0286003a0000000000bc02000000000102022253797374656d00009b99807cfc112200fc112200f4eb +160018102200685ec730040000002d01050004000000f0010400040000002701ffff040000002701ffff040000002701ffff0d000000320a8600ad0a0100040000000000a50af200205d2d00040000002d010000030000000000}{\result {\dn26\insrsid3752688 +{\pict{\*\picprop\shplid1044{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw11571\pich1023\picwgoal6560\pichgoal580\wmetafile8\bliptag-1764558810\blipupi119{\*\blipuid 96d2f8262e7786563ddcf3ae900f8c00} +010009000003f705000003001c0000000000050000000b0200000000050000000c021d0048010500000004010d000000050000002e0118000000050000000201 +0100000005000000090200000000050000000102ffffff00030000001e000a00000026060f000a00ffffffff0000000000001c000000fb02f6ff000000000000 +9001000000000000001054696d6573000000f4090a605695ed775f95ed77d067ef77f4090a6000000a00040000002d010000080000002105030074616eff1000 +01000700000021050100280010000e001c000000fb02f6ff0000000000009001020000000000001054696d6573000000d1080ad85695ed775f95ed77d067ef77 +d1080ad800000a00040000002d01010004000000f00100000900000021050500746865746100100012001c000000fb02f6ff0000000000009001000000000000 +001054696d6573000000f4090a615695ed775f95ed77d067ef77f4090a6100000a00040000002d01000004000000f00101000700000021050100290010002600 +1c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000d1080ad95695ed775f95ed77d067ef77d1080ad900000a00040000002d010100 +04000000f001000007000000210501003d0010002a001c000000fb02f6ff0000000000009001020000000000001054696d6573000000f4090a625695ed775f95 +ed77d067ef77f4090a6200000a00040000002d01000004000000f001010007000000210501007200090033001c000000fb02f9ff000000000000900100000000 +0000001054696d6573000000d1080ada5695ed775f95ed77d067ef77d1080ada00000a00040000002d01010004000000f001000008000000210503006d696e74 +0c0036001c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000f4090a635695ed775f95ed77d067ef77f4090a6300000a0004000000 +2d01000004000000f00101000700000021050100b400090044001c000000fb02f6ff0000000000009001020000000000001054696d6573000000d1080adb5695 +ed775f95ed77d067ef77d1080adb00000a00040000002d01010004000000f00100000700000021050100720009004b001c000000fb02f9ff0000000000009001 +020000000000001054696d6573000000f4090a645695ed775f95ed77d067ef77f4090a6400000a00040000002d01000004000000f00101000700000021050100 +73000c004e001c000000fb02f6ff0000000000009001020000000000001054696d6573000000d1080adc5695ed775f95ed77d067ef77d1080adc00000a000400 +00002d01010004000000f001000007000000210501005200170033001c000000fb02f9ff0000000000009001020000000000001054696d6573000000f4090a65 +5695ed775f95ed77d067ef77f4090a6500000a00040000002d01000004000000f00101000800000021050300666f76741a003a001c000000fb02f6ff00000000 +00009001000000020000005053796d626f6c0000d1080add5695ed775f95ed77d067ef77d1080add00000a00040000002d01010004000000f001000007000000 +210501002b00170045001c000000fb02f6ff0000000000009001020000000000001054696d6573000000f4090a665695ed775f95ed77d067ef77f4090a660000 +0a00040000002d01000004000000f00101000700000021050100520017004d0008000000fa0206000100000000000000040000002d0101000500000014020c00 +32000500000013020c0052001c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000d1080ade5695ed775f95ed77d067ef77d1080ade +00000a00040000002d01020004000000f001000007000000210501003d00100055001c000000fb02f6ff0000000000009001020000000000001054696d657300 +0000f4090a675695ed775f95ed77d067ef77f4090a6700000a00040000002d01000004000000f0010200090000002105050064656c74610009005d001c000000 +fb02f6ff0000000000009001000000020000005053796d626f6c0000d1080adf5695ed775f95ed77d067ef77d1080adf00000a00040000002d01020004000000 +f00100000700000021050100b400090072001c000000fb02f6ff0000000000009001020000000000001054696d6573000000f4090a685695ed775f95ed77d067 +ef77f4090a6800000a00040000002d01000004000000f00102000700000021050100720009007a001c000000fb02f9ff00000000000090010200000000000010 +54696d6573000000d1080ae05695ed775f95ed77d067ef77d1080ae000000a00040000002d01020004000000f0010000070000002105010073000c007d001c00 +0000fb02f6ff0000000000009001000000000000001054696d6573000000f4090a695695ed775f95ed77d067ef77f4090a6900000a00040000002d0100000400 +0000f001020007000000210501003200170069001c000000fb02f6ff0000000000009001020000000000001054696d6573000000d1080ae15695ed775f95ed77 +d067ef77d1080ae100000a00040000002d01020004000000f00100000700000021050100520017006f000500000014020c005c000500000013020c0080001c00 +0000fb02f6ff0000000000009001000000020000005053796d626f6c0000f4090a6a5695ed775f95ed77d067ef77f4090a6a00000a00040000002d0100000400 +0000f001020007000000210501003d001000ad0007000000210501003e001000b3001c000000fb02f6ff0000000000009001020000000000001054696d657300 +0000d1080ae25695ed775f95ed77d067ef77d1080ae200000a00040000002d01020004000000f0010000070000002105010072001000eb001c000000fb02f9ff +0000000000009001000000000000001054696d6573000000f4090a6b5695ed775f95ed77d067ef77f4090a6b00000a00040000002d01000004000000f0010200 +08000000210503006d696e741200ee001c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000d1080ae35695ed775f95ed77d067ef77 +d1080ae300000a00040000002d01020004000000f001000007000000210501003d001000fb001c000000fb02f6ff000000000000900102000000000000105469 +6d6573000000f4090a6c5695ed775f95ed77d067ef77f4090a6c00000a00040000002d01000004000000f0010200090000002105050064656c74610008000301 +1c000000fb02f6ff0000000000009001000000000000001054696d6573000000d1080ae45695ed775f95ed77d067ef77d1080ae400000a00040000002d010200 +04000000f001000007000000210501002a00080018010700000021050100280008001e011c000000fb02f6ff0000000000009001020000000000001054696d65 +73000000f4090a6d5695ed775f95ed77d067ef77f4090a6d00000a00040000002d01000004000000f001020007000000210501005200080022011c000000fb02 +f9ff0000000000009001020000000000001054696d6573000000d1080ae55695ed775f95ed77d067ef77d1080ae500000a00040000002d01020004000000f001 +00000800000021050300666f76740a0029011c000000fb02f6ff0000000000009001000000020000005053796d626f6c0000f4090a6e5695ed775f95ed77d067 +ef77f4090a6e00000a00040000002d01000004000000f001020007000000210501002b00080035011c000000fb02f6ff00000000000090010200000000000010 +54696d6573000000d1080ae65695ed775f95ed77d067ef77d1080ae600000a00040000002d01020004000000f00100000700000021050100520008003c011c00 +0000fb02f6ff0000000000009001000000000000001054696d6573000000f4090a6f5695ed775f95ed77d067ef77f4090a6f00000a00040000002d0100000400 +0000f001020007000000210501002900080042010700000021050100320017001e011c000000fb02f6ff0000000000009001020000000000001054696d657300 +0000d1080ae75695ed775f95ed77d067ef77d1080ae700000a00040000002d01020004000000f001000007000000210501005200170024010500000014020c0002010500000013020c0045010a00000026060f000a00ffffffff010000000000040000002701ffff030000000000}}}}}{\insrsid6909422 \tab (Eq. 5) + +\par }\pard\plain \s61\qj \li0\ri12\sa80\sl-360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 where }{\i\insrsid6909422 R}{\i\dn4\insrsid6909422 fov}{ +\insrsid6909422 is the FOV radius,}{\i\insrsid6909422 R }{\insrsid6909422 the ring radius, and }{\i\insrsid6909422 delta}{\insrsid6909422 the ring difference of the corresponding oblique sinograms. +\par +\par The rmax value is calculated as follows : +\par }\pard\plain \s55\qj \li0\ri12\sl360\slmult0\widctlpar\tx7760\aspalpha\aspnum\faauto\adjustright\rin12\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\i\insrsid6909422 rmax}{\insrsid6909422 = }{\i\insrsid6909422 num_rings}{ +\insrsid6909422 \endash }{\i\insrsid6909422 min}{\insrsid6909422 \endash 1 \endash }{\i\insrsid6909422 delta}{\insrsid6909422 \tab (Eq. 6) +\par In the actual code, there is an adjustment of this formula for the case of axial compression (}{\i\insrsid6909422 span}{\insrsid6909422 ) as the sampling}{\insrsid1639708 }{\insrsid6909422 in z position is different in that case. +\par Note that the maxim}{\insrsid15669153 u}{\insrsid6909422 m ring difference which is used for the 3D reconstruction can be arbitrarily chosen up to the maximum aperture of the tomograph defined by }{\i\f3\insrsid6909422 \'71}{\dn4\insrsid6909422 max}{ +\insrsid6909422 . The number of additional rings depends obviously on the axial and transaxial dimensions of the FOV that is to be reconstructed. In fact, the amount of forward projected data increases rapidly for larger ring d +ifferences, such that the amount of the measured data incorporated is only increasing slowly. Typically, the maximum ring difference which used for the 3D reconstruction is chosen so that the number of forward projected sinograms is about the same than th +e number of measured sinograms. +\par +\par {\*\bkmkstart _Toc89164570}{\listtext\pard\plain\s1 \b\f4\up6\lang1033\langfe1033\langnp1033\langfenp1033 \hich\af4\dbch\af0\loch\f4 3\tab}}\pard\plain \s1\qj \fi-432\li432\ri12\sb220\sa220\sl360\slmult0\keep\keepn\widctlpar +\jclisttab\tx432\tx560\aspalpha\aspnum\faauto\ls2\outlinelevel0\adjustright\rin12\lin432\itap0 \b\f4\fs24\up6\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 REFERENCES{\*\bkmkend _Toc89164570} +\par }\pard\plain \s52\qj \fi-567\li567\ri12\sl360\slmult0\widctlpar\tx560\aspalpha\aspnum\faauto\adjustright\rin12\lin567\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 Cherry S.R, Dahlbom M, and Hoffman E.J (1992) \'93 +Evaluation of a 3D reconstruction algorithm for multi-slice PET scanners,\'94, Physics in Medicine and Biology, 37(3), p. 779-790, p. 103-115. +\par Colsher J G (1980) \'93Fully three-dimensional positron emission tomography,\'94 Physics in Medicine and Biology, 25(1), p. 103-115. +\par Defrise M., Townsend D.W. and Clack R. (1989) \'93Three-dimensional image reconstruction from complete projections,\'94. Phys Med Biol. 34:5:573-587. +\par Egger M L (1996) \'93Fast Volume Reconstruction in Positron Emission Tomography: Implementation of Four Algorithms on a High-Performance Scalable Parallel Platform,\'94 PhD Thesis, University of Lausanne. +\par Kinahan P E and Rogers J G (1989), \'93Analytic 3D image reconstruction using all detected events,\'94 IEEE Transactions on Nuclear Science, 36-1, p. 964-968. +\par Siddon R L (1985) \'93Fast calculation of the exact radiological path for a three-dimensional CT array,\'94 Medical Physics, 12-2, p. 252-255. +\par }\pard\plain \s23\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f36\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid6909422 +\par }} \ No newline at end of file diff --git a/documentation/a4wide.sty b/documentation/a4wide.sty new file mode 100644 index 0000000000..2985221f9b --- /dev/null +++ b/documentation/a4wide.sty @@ -0,0 +1,36 @@ +% +% "moretext" document style option. +% Jean-Francois Lamy, July 86 +% +% Redefines the margins so that they are more in line with +% what we are used to see. +% + +\input a4.sty + +\ifcase \@ptsize + % mods for 10 pt + \oddsidemargin 0.15 in % Left margin on odd-numbered pages. + \evensidemargin 0.35 in % Left margin on even-numbered pages. + \marginparwidth 1 in % Width of marginal notes. + \oddsidemargin 0.25 in % Note that \oddsidemargin = \evensidemargin + \evensidemargin 0.25 in + \marginparwidth 0.75 in + \textwidth 5.875 in % Width of text line. +\or % mods for 11 pt + \oddsidemargin 0.1 in % Left margin on odd-numbered pages. + \evensidemargin 0.15 in % Left margin on even-numbered pages. + \marginparwidth 1 in % Width of marginal notes. + \oddsidemargin 0.125 in % Note that \oddsidemargin = \evensidemargin + \evensidemargin 0.125 in + \marginparwidth 0.75 in + \textwidth 6.125 in % Width of text line. +\or % mods for 12 pt + \oddsidemargin -10 pt % Left margin on odd-numbered pages. + \evensidemargin 10 pt % Left margin on even-numbered pages. + \marginparwidth 1 in % Width of marginal notes. + \oddsidemargin 0 in % Note that \oddsidemargin = \evensidemargin + \evensidemargin 0 in + \marginparwidth 0.75 in + \textwidth 6.375 true in % Width of text line. +\fi diff --git a/documentation/bugs.htm b/documentation/bugs.htm new file mode 100644 index 0000000000..0c2a6a8846 --- /dev/null +++ b/documentation/bugs.htm @@ -0,0 +1,52 @@ + + + + Known problems in the current release of the STIR software + + + +

Known problems in the current release of the STIR software

+See also the release notes for the current version. + +
    +
  • Currently the implementation if the incremental interpolating +backprojector can have problems on certain processors due to floating point +rounding errors. You would notice problems in the central voxel, which +will influence neighboring voxels in the iterative algorithms. +Running the recon_test_pack will tell you if you have the problem (but +there might still be a problem for your particular scanner/pixel size). + +Update Thanks to an update by Bing Bai, this seems less of +an issue now, but it does still occur. +Please notify the mailing list if this problem still occurs +on your system (give details of OS, processor, compiler and compiler switches). + +See the User's Guide for details on how to choose another backprojector. +
  • +
  • Currently the implementation if the incremental interpolating +backprojector fails when the number of views is not even. Images +are wrong, even though the programs might run till the end. +
  • +
  • Images have to have the default number of planes. Trying to +forward project images with smaller or larger number of planes +will show up some problems, which we thought to have removed already :-/ . +
  • +
  • CPU times reported are invalid on Windows 9?, maybe ME as well. They are +fine on NT and later.There doesn't seem to be a way to get +CPU times in the older Windows versions. +
  • +
  • In STIR 2.x, the default settings for the forward projector/back projector pair result in + unmatched projectors. This can give problems in certain +situations. It is strongly recommended to change this to use +the ray tracing matrix projectors (use some extra rays to approximate strip-integrals). +
+ + +
+ + + +Last modified: Mon Jan 13 20:03:14 GMT 2014 + + + diff --git a/documentation/contrib/Motion_files_KCL/Documentation/MotionCoordinates.pptx b/documentation/contrib/Motion_files_KCL/Documentation/MotionCoordinates.pptx new file mode 100755 index 0000000000..844946eb1e Binary files /dev/null and b/documentation/contrib/Motion_files_KCL/Documentation/MotionCoordinates.pptx differ diff --git a/documentation/contrib/Motion_files_KCL/Documentation/Software_Description.docx b/documentation/contrib/Motion_files_KCL/Documentation/Software_Description.docx new file mode 100755 index 0000000000..74f7eae632 Binary files /dev/null and b/documentation/contrib/Motion_files_KCL/Documentation/Software_Description.docx differ diff --git a/documentation/contrib/OSMAPOSL_MPI/Description.txt b/documentation/contrib/OSMAPOSL_MPI/Description.txt new file mode 100644 index 0000000000..9f9d8ecd15 --- /dev/null +++ b/documentation/contrib/OSMAPOSL_MPI/Description.txt @@ -0,0 +1,94 @@ +Description of the work + +To customize the STIR reconstruction for a parallel use on multi-core or +cluster systems, a parallelization concept was designed and implemented in +parts. The idea of a parallelization is a logical consequence of the +technical progress towards architectures with multiple processing cores. It +intends to achieve faster reconstruction and better system utilization. + +The parallelization was achieved by distributing the independently +computable reconstruction of related viewgrams among the available slave +nodes. To achieve a good load balancing a workpool approach was used, where +some slaves ask a master node for additional work as soon as they are +available again. Within every iteration, every segment and the currently +processed subset, the related viewgrams of every single view are +distributed to the working nodes. The master component was implemented in +the loop over the views within the distributable.cxx, where the current +viewgram is sent to the next requesting slave. The slave is realized by an +infinite loop over a receiving routine, which is implemented within the +DistributedWorker.cxx. The slave needs to be initialized with all objects +needed for the actual reconstruction. When receiving a related viewgrams +object, the slave simply calls the reonstruction and saves the computed +results within a local target image. These target images are reduced at the +master at the end of every subiteration to get a new image estimate. The +current image estimate is broadcasted between the slaves at the beginning +of each iteration. + +In addition a caching concept is used to save computation time for +calculating the projection matrix elements and to save communication +time. The latter is achieved by assigning the viewgrams to the slaves in +the same way they were distributed in a previous iteration. That way a +simple identifier is enough to tell each slave which of its saved related +viewgram objects shall be reconstructed again. Additionally this leads to a +better reuse of already cached parts of the projection matrix. This +algorithm is performed within the distributableMPICacheEnabled.cxx, which +is a replacement for the distributable.cxx in the sequential case. To +differ between the two parallel versions (with and without caching) the +parameter enable distributed caching can be set to 0 or 1 within the +par-file. To realize that algorithm the master needs to save the +distribution scheme of the initial distribution. This is implemented in the +DistributedCachingInformation class, which computes the next +view-segment.number for a given slave and subset. A load balancing approach +was integrated by reallocating the related viewgrams if needed. + +The parallelization was implemented using the Message Passing Interface +(MPI). The package distributed provides functions for sending, receiving +and reducing objects with the facilities of MPI. These functions are +implemented in DistributedFunctions.cxx. DistributedTestFunctions.cxx +implements some test functions which where needed to verify the +functionality of the send and receive operations. The tests can be +activated by the parameter enable distributed tests. Having all send and +receive functions within one file allows easy reuse and extensions. + +The following files were modified: + +(ii) config.mk +This had to be adapted to the use of MPI compilers. +(iii) distributable.cxx +The parallel case was integrated by using preprocessor directives and +distributing the related viewgrams objects. +(iv) FBP2DReconstruction.cxx +The filtered backprojection was parallelized using OpenMP. That was easily +integrated by using a parallel for directive on the main loop over the views. +(v) PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.cxx +The list-mode case was not implemented, so the parallel case had to be +handled here as a warning. +(vi) PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx and +PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h +These had to be modified for intialization purposes. All needed objects +are sent to the slave within the set_up() method and some parameter +processing had to be added. +(vii) RelatedViewgrams.h +The constructor had to be made public for the parallel version. +(viii) OSMAPOSL.cxx +Here the slave components are started. + +New files: +a. DistributedFunctions.cxx +b. DistributedFunctions.h +c. DistributedTestFunctions.cxx +d. DistributedTestFunctions.h + +e. distributableMPICacheEnabled.cxx +f. distributableMPICacheEnabled.h +g. DistributedCachingInformation.cxx +h. DistributedCachingInformation.h +i. DistributedWorker.cxx +j. DistributedWorker.h + + +Contributors: +Tobias Beisel (University of Paderborn) + +Based on previous parallellisation work by the PARAPET project +and discussions with Kris Thielemans (Hammersmith Imanet Ltd) diff --git a/documentation/contrib/README.txt b/documentation/contrib/README.txt new file mode 100644 index 0000000000..2593cb920e --- /dev/null +++ b/documentation/contrib/README.txt @@ -0,0 +1,26 @@ +Author: +Kris Thielemans +20 May 2008 + + +This directory contains some documentation on 'external' contributions to STIR +(i.e. not by the original PARAPET partners or Hammersmith Imanet Ltd (HIL)). + +Note that up to 2011, the authors have all kindly assigned their copyright to +HIL, such that HIL can distribute the whole of STIR under a uniform license +condition. + +Current contributions listed here that were integrated into STIR (see sub-directories for more info): + +- updates to the Shape3D hierarchy + by C. Ross Schmidtlein and Assen S. Kirov. +Added "wedge" capabilities to EllipsoidalCylinder and Box3D. + +- parallelisation of OSMAPOSL using MPI and FBP2D using OPEN_MP + by Tobias Beisel + +- code for SimSET support + by Pablo Aguiar, Nikolaos Dikaios, Charalampos Tsoumpas, Kris Thielemans + +- code for (spatial) warping and motion correction (and GIPL IO and raw GATE projection data conversion) (licensed under LGPL) + by Charalampos Tsoumpas diff --git a/documentation/contrib/Shape3D_enhancements_RS_AK/generate_image_upgrade.tex b/documentation/contrib/Shape3D_enhancements_RS_AK/generate_image_upgrade.tex new file mode 100644 index 0000000000..8462173fd7 --- /dev/null +++ b/documentation/contrib/Shape3D_enhancements_RS_AK/generate_image_upgrade.tex @@ -0,0 +1,133 @@ +\documentclass[10pt]{article} +\usepackage{epsfig} +\usepackage{amssymb} +\usepackage{amsfonts} +\usepackage{fancybox} +\usepackage{graphicx} +\usepackage{times} +\usepackage{rotating} +\usepackage{makeidx} +\usepackage{rotate} +\newcommand{\X}[1]{#1\index{#1}} + +\title{Adding features to STIR's generate image utility} + +\author{C. Ross Schmidtlein, and Assen S. Kirov} + +%\address{Department of Medical Physics\\ +%Memorial Sloan-Kettering Cancer Center\\ +%1275 York Avenue\\ +%New York, New York 10021} + + +\begin{document} +\maketitle + +\begin{abstract} +Several features are added to the generate\_image function in STIR. These are the the ability to model sectors of elliptical cylinders and generate a three dimensional box type shape. In addition, the volumes and surface areas of these new shapes are accurately calculated. +\end{abstract} + +\section{Changed/added files} + +The following files were modified or added:\\ + +\noindent Modified files: +\begin{itemize} +\parskip 0.01 pt +\item EllipsoidalCylinder.h +\item EllipsoidalCylinder.cxx +\item Shape\_buildblock\_registries.cxx +\item test\_ROIs.cxx +\item lib.mk +\end{itemize} + +\noindent New Files: +\begin{itemize} +\parskip 0.01 pt +\item Box3D.h +\item Box3D.cxx +\end{itemize} + +\section{Changes to EllipsoidalCylinder} + +In the shape EllipsoidalCylinder modifications were made to allow sectors of cylindrical ellipses to be generated via the generate\_image program. + +\subsection{Functions: EllipsoidalCylinder(), ~initialize\_keymap(), ~set\_defaults(), ~and ~post\_processing()} + +To do this two new overload functions were defined for the function EllipsoidalCylinder(). These functions added the angular variables theta\_1 and theta\_2 used to define the start and end of an elliptical cylinder. One function is defined to allow the use of direction vectors and the other to allow the user of Euler angles in order to allow the object to pitch, yaw, and roll to a specified orientation. Also, the initialize\_keymap(), set\_defaults(), and post\_processing() functions were modified to allow parsing the sector angles, defining a default sector size (0 to 360 degrees, a full ellipse), and to produce error messages if the user defined values are nonsensical. + +\subsection{Functions: is\_inside\_shape()} + +This function has been modified to determine if a point in within the sector of ellipsoidal cylinder. Special care was take to account for the branch cuts of the arctangent function. + +\subsection{Functions: get\_geometric\_volume()} + +This function has been modified to calculate the volume of an sector of an ellipsoidal cylinder. The volume is defined by the equation: + +\begin{equation} +V = \pi ~a ~b ~l ~(atan(a/b~ tan(\theta_2)) - atan(a/b ~tan(\theta_1))), +\end{equation} + +\noindent where $a$ is the semi-major axis, $b$ is the semi-minor axis, $l$ is the length, $\theta_1$ is the beginning of the sector and $\theta_2$ is the end of the sector. Again, special care was take to account for the branch cuts of the arctangent function. + +\subsection{Functions: get\_geometric\_area()} + +This function has been modified to calculate the area of an sector of an ellipsoidal cylinder including the end caps and the sector's planes. No closed form solution exists that exactly calculates the perimeter of a full or partial ellipse. For a full ellipsoid the sector length is estimated via Cantrell's approximation which is a modification to Ramanujan's second approximation of an ellipsoid's perimeter. This is given by + +\begin{equation} +L = \pi ~a ~b ~[1 + 3 h/(10 +\sqrt{4-3 h}) + 4 ~h^{12} (1/\pi - 7/22)], +\end{equation} + +\noindent where $h = [(a-b)/(a+b)]^2$. This approximation is never worse than $\pm ~15$ ppm.\\ + + For a sector of an ellipse the arc length is defined by the equation: + +\begin{equation} +L = \int_{\theta_1}^{\theta_2}{a \sqrt{1-e^2 ~sin^2(\theta)}~d\theta}, +\end{equation} + +\noindent where $e^2 = 1 - b^2/a^2$ is the eccentricity of the ellipse. This integral is an incomplete elliptic integral of the second kind and has no closed form solution. It is approximated here via Simpson rule due to it's reasonable accuracy and ease of implementation. Because the quadrature method uses a uniform step size with respect to angle it should be expected that the accuracy of this method will be worse for $e \sim 1$ than for more circular ellipses. + +In addition, the area of the plane of the sector is calculated by the equation of the ellipse. It is given by, + +\begin{equation} +r_{\theta_1} = \sqrt{a^2 ~cos^2(\theta_1)+ b^2~sin^2(\theta_1)}, ~\mbox{and}~ r_{\theta_2} = \sqrt{a^2 ~cos^2(\theta_2)+ b^2~sin^2(\theta_2)}, +\end{equation} + +\noindent the calculation of the surface area, $S$, is thus given by + +\begin{equation} +S = (L + r_{\theta_1} + r_{\theta_2}) ~l + 2 \pi ~a ~b ~(atan(a/b ~tan(\theta_2)) - atan(a/b ~tan(\theta_1))). +\end{equation} + +\section{Additions in Box3D} + +\subsection{Box3D.h and Box3D.cxx} + +In order to generate box shaped images in the generate\_image program the Class Box3D was created. + +Functions: +\begin{itemize} +\item registered\_name() +\item initialize\_keymap() +\item set\_defaults() +\item post\_processing() +\item Box3D() +\item is\_inside\_shape() +\item scale() +\item get\_geometric\_volume() +\item get\_geometric\_area() +\item clone() +\end{itemize} + +These function mirror those in Class EllipsiodialCylinder. + +\subsection{Modifications in files Shape\_buildblock\_registries.cxx, and lib.mk} + +Additions were made in these files to add the Class Box3D. + +\section{Tests} + +The file test\_ROIs.cxx tests the implementation of the the various shapes used in the generate\_image program. An additional test was added for Box3D that mirrors those used by the Class Ellipsoid. No additional tests were added for EllipsiodialCylinder to examine the behavior of the sectors addition. However, many sector values were tested including those where $\theta_1$ was greater than $\theta_2$. + +\end{document} diff --git a/documentation/contrib/Shape3D_enhancements_RS_AK/iopams.sty b/documentation/contrib/Shape3D_enhancements_RS_AK/iopams.sty new file mode 100644 index 0000000000..044dde9297 --- /dev/null +++ b/documentation/contrib/Shape3D_enhancements_RS_AK/iopams.sty @@ -0,0 +1,87 @@ +%% +%% This is file `iopams.sty' +%% File to include AMS fonts and extra definitions for bold greek +%% characters for use with iopart.cls +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{iopams}[1997/02/13 v1.0] +\RequirePackage{amsgen}[1995/01/01] +\RequirePackage{amsfonts}[1995/01/01] +\RequirePackage{amssymb}[1995/01/01] +\RequirePackage{amsbsy}[1995/01/01] +% +\iopamstrue % \newif\ifiopams in iopart.cls & iopbk2e.cls +% % allows optional text to be in author guidelines +% +% Bold lower case Greek letters +% +\newcommand{\balpha}{\boldsymbol{\alpha}} +\newcommand{\bbeta}{\boldsymbol{\beta}} +\newcommand{\bgamma}{\boldsymbol{\gamma}} +\newcommand{\bdelta}{\boldsymbol{\delta}} +\newcommand{\bepsilon}{\boldsymbol{\epsilon}} +\newcommand{\bzeta}{\boldsymbol{\zeta}} +\newcommand{\bfeta}{\boldsymbol{\eta}} +\newcommand{\btheta}{\boldsymbol{\theta}} +\newcommand{\biota}{\boldsymbol{\iota}} +\newcommand{\bkappa}{\boldsymbol{\kappa}} +\newcommand{\blambda}{\boldsymbol{\lambda}} +\newcommand{\bmu}{\boldsymbol{\mu}} +\newcommand{\bnu}{\boldsymbol{\nu}} +\newcommand{\bxi}{\boldsymbol{\xi}} +\newcommand{\bpi}{\boldsymbol{\pi}} +\newcommand{\brho}{\boldsymbol{\rho}} +\newcommand{\bsigma}{\boldsymbol{\sigma}} +\newcommand{\btau}{\boldsymbol{\tau}} +\newcommand{\bupsilon}{\boldsymbol{\upsilon}} +\newcommand{\bphi}{\boldsymbol{\phi}} +\newcommand{\bchi}{\boldsymbol{\chi}} +\newcommand{\bpsi}{\boldsymbol{\psi}} +\newcommand{\bomega}{\boldsymbol{\omega}} +\newcommand{\bvarepsilon}{\boldsymbol{\varepsilon}} +\newcommand{\bvartheta}{\boldsymbol{\vartheta}} +\newcommand{\bvaromega}{\boldsymbol{\varomega}} +\newcommand{\bvarrho}{\boldsymbol{\varrho}} +\newcommand{\bvarzeta}{\boldsymbol{\varsigma}} %NB really sigma +\newcommand{\bvarsigma}{\boldsymbol{\varsigma}} +\newcommand{\bvarphi}{\boldsymbol{\varphi}} +% +% Bold upright capital Greek letters +% +\newcommand{\bGamma}{\boldsymbol{\Gamma}} +\newcommand{\bDelta}{\boldsymbol{\Delta}} +\newcommand{\bTheta}{\boldsymbol{\Theta}} +\newcommand{\bLambda}{\boldsymbol{\Lambda}} +\newcommand{\bXi}{\boldsymbol{\Xi}} +\newcommand{\bPi}{\boldsymbol{\Pi}} +\newcommand{\bSigma}{\boldsymbol{\Sigma}} +\newcommand{\bUpsilon}{\boldsymbol{\Upsilon}} +\newcommand{\bPhi}{\boldsymbol{\Phi}} +\newcommand{\bPsi}{\boldsymbol{\Psi}} +\newcommand{\bOmega}{\boldsymbol{\Omega}} +% +% Bold versions of miscellaneous symbols +% +\newcommand{\bpartial}{\boldsymbol{\partial}} +\newcommand{\bell}{\boldsymbol{\ell}} +\newcommand{\bimath}{\boldsymbol{\imath}} +\newcommand{\bjmath}{\boldsymbol{\jmath}} +\newcommand{\binfty}{\boldsymbol{\infty}} +\newcommand{\bnabla}{\boldsymbol{\nabla}} +\newcommand{\bdot}{\boldsymbol{\cdot}} +% +% Symbols for caption +% +\renewcommand{\opensquare}{\mbox{$\square$}} +\renewcommand{\opentriangle}{\mbox{$\vartriangle$}} +\renewcommand{\opentriangledown}{\mbox{$\triangledown$}} +\renewcommand{\opendiamond}{\mbox{$\lozenge$}} +\renewcommand{\fullsquare}{\mbox{$\blacksquare$}} +\newcommand{\fulldiamond}{\mbox{$\blacklozenge$}} +\newcommand{\fullstar}{\mbox{$\bigstar$}} +\newcommand{\fulltriangle}{\mbox{$\blacktriangle$}} +\newcommand{\fulltriangledown}{\mbox{$\blacktriangledown$}} + +\endinput +%% +%% End of file `iopams.sty'. diff --git a/documentation/contrib/Shape3D_enhancements_RS_AK/iopart.cls b/documentation/contrib/Shape3D_enhancements_RS_AK/iopart.cls new file mode 100644 index 0000000000..cc065d7302 --- /dev/null +++ b/documentation/contrib/Shape3D_enhancements_RS_AK/iopart.cls @@ -0,0 +1,1007 @@ +%% +%% This is file `iopart.cls' +%% +%% This file 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. +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +% +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{iopart}[1996/06/10 v0.0 IOP Journals LaTeX article class] +\newcommand\@ptsize{0} +\newif\if@restonecol +\newif\if@titlepage +\newif\ifiopams +\@titlepagefalse +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{letterpaper} + {\setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{landscape} + {\setlength\@tempdima {\paperheight}% + \setlength\paperheight {\paperwidth}% + \setlength\paperwidth {\@tempdima}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{11pt}{\renewcommand\@ptsize{2}} % No 11pt version +\DeclareOption{12pt}{\renewcommand\@ptsize{2}} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{titlepage}{\@titlepagetrue} +\DeclareOption{notitlepage}{\@titlepagefalse} +\ExecuteOptions{letterpaper,final} +\ProcessOptions +\DeclareMathAlphabet{\bi}{OML}{cmm}{b}{it} +\DeclareMathAlphabet{\bcal}{OMS}{cmsy}{b}{n} +\input{iopart1\@ptsize.clo} +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setlength\parindent{2em} +\setcounter{topnumber}{8} +\renewcommand\topfraction{1} +\setcounter{bottomnumber}{3} +\renewcommand\bottomfraction{.99} +\setcounter{totalnumber}{8} +\renewcommand\textfraction{0.01} +\renewcommand\floatpagefraction{.8} +\setcounter{dbltopnumber}{6} +\renewcommand\dbltopfraction{1} +\renewcommand\dblfloatpagefraction{.8} +% +\pretolerance=5000 +\tolerance=8000 +% +% Headings for all pages apart from first +% +\def\ps@headings{\let\@oddfoot\@empty + \let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil\itshape\rightmark}% + \def\@oddhead{{\itshape\leftmark}\hfil\thepage}% + \let\@mkboth\markboth + \let\sectionmark\@gobble + \let\subsectionmark\@gobble} +% +% Headings for first page +% +\def\ps@myheadings{\let\@oddfoot\@empty\let\@evenfoot\@empty + \let\@oddhead\@empty\let\@evenhead\@empty + \let\@mkboth\@gobbletwo + \let\sectionmark\@gobble + \let\subsectionmark\@gobble} +% +% \maketitle just ends page +% +\newcommand\maketitle{\newpage} +% +% Article titles +% +% Usage: \title[Short title]{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\renewcommand{\title}{\@ifnextchar[{\@stitle}{\@ftitle}} +\def\@stitle[#1]#2{\markboth{#1}{#1}% + \thispagestyle{myheadings}% + \vspace*{3pc}{\exhyphenpenalty=10000\hyphenpenalty=10000 + \Large\raggedright\noindent + \bf#2\par}} +\def\@ftitle#1{\markboth{#1}{#1}% + \thispagestyle{myheadings}% + \vspace*{3pc}{\exhyphenpenalty=10000\hyphenpenalty=10000 + \Large\raggedright\noindent + \bf#1\par}} +% +% Can use \paper instead of \title +% +\let\paper=\title +% +% Generic title command for articles other than papers +% +% Usage: \article[Short title]{ARTICLE TYPE}{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\newcommand{\article}{\@ifnextchar[{\@sarticle}{\@farticle}} +\def\@sarticle[#1]#2#3{\markboth{#1}{#1}% + \thispagestyle{myheadings}% + \vspace*{.5pc}% + {\parindent=\mathindent \bf #2\par}% + \vspace*{1.5pc}% + {\exhyphenpenalty=10000\hyphenpenalty=10000 + \Large\raggedright\noindent + \bf#3\par}}% +\def\@farticle#1#2{\markboth{#2}{#2}% + \thispagestyle{myheadings}% + \vspace*{.5pc}% + {\parindent=\mathindent \bf #1\par}% + \vspace*{1.5pc}% + {\exhyphenpenalty=10000\hyphenpenalty=10000 + \Large\raggedright\noindent + \bf#2\par}}% +% +% Letters to the Editor +% +% Usage \letter{Full title} +% No short title is required for Letters +% +\def\letter#1{\article[Letter to the Editor]{LETTER TO THE EDITOR}{#1}} +% +% Review articles +% +% Usage: \review[Short title]{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\def\review{\@ifnextchar[{\@sreview}{\@freview}} +\def\@sreview[#1]#2{\@sarticle[#1]{REVIEW ARTICLE}{#2}} +\def\@freview#1{\@farticle{REVIEW ARTICLE}{#1}} +% +% Topical Review +% +% Usage: \topical[Short title]{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\def\topical{\@ifnextchar[{\@stopical}{\@ftopical}} +\def\@stopical[#1]#2{\@sarticle[#1]{TOPICAL REVIEW}{#2}} +\def\@ftopical#1{\@farticle{TOPICAL REVIEW}{#1}} +% +% Comments +% +% Usage: \comment[Short title]{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\def\comment{\@ifnextchar[{\@scomment}{\@fcomment}} +\def\@scomment[#1]#2{\@sarticle[#1]{COMMENT}{#2}} +\def\@fcomment#1{\@farticle{COMMENT}{#1}} +% +% Rapid Communications +% +% Usage: \rapid[Short title]{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\def\rapid{\@ifnextchar[{\@srapid}{\@frapid}} +\def\@srapid[#1]#2{\@sarticle[#1]{RAPID COMMUNICATION}{#2}} +\def\@frapid#1{\@farticle{RAPID COMMUNICATION}{#1}} +% +% Notes +% +% Usage: \note[Short title]{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\def\note{\@ifnextchar[{\@snote}{\@fnote}} +\def\@snote[#1]#2{\@sarticle[#1]{NOTE}{#2}} +\def\@fnote#1{\@farticle{NOTE}{#1}} +% +% Preliminary Communications +% +% Usage: \prelim[Short title]{Full title} +% [Short title] is optional; use where title is too long +% or contains footnotes, 50 characters maximum +% +\def\prelim{\@ifnextchar[{\@sprelim}{\@fprelim}} +\def\@sprelim[#1]#2{\@sarticle[#1]{PRELIMINARY COMMUNICATION}{#2}} +\def\@fprelim#1{\@farticle{PRELIMINARY COMMUNICATION}{#1}} +% +% List of authors +% +% Usage \author[Short form]{List of all authors} +% The short form excludes footnote symbols linking authors to addresses +% and is used for running heads in printed version (but not on preprints) +% +\renewcommand{\author}{\@ifnextchar[{\@sauthor}{\@fauthor}} +\def\@sauthor[#1]#2{\markright{#1} % for production only + \vspace*{1.5pc}% + \begin{indented}% + \item[]\normalsize\bf\raggedright#2 + \end{indented}% + \smallskip} +\def\@fauthor#1{%\markright{#1} for production only + \vspace*{1.5pc}% + \begin{indented}% + \item[]\normalsize\bf\raggedright#1 + \end{indented}% + \smallskip} +% +% Affiliation (authors address) +% +% Usage: \address{Address of first author} +% \address{Address of second author} +% Use once for each address, use symbols \dag \ddag \S \P $\|$ +% to connect authors with addresses +% +\newcommand{\address}[1]{\begin{indented} + \item[]\rm\raggedright #1 + \end{indented}} +% +% American Mathematical Society Classification Numbers +% Usage: \ams{57.XX, 58.XX} +% +\def\ams#1{\vspace{10pt} + \begin{indented} + \item[]\rm AMS classification scheme numbers: #1\par + \end{indented}} +% +% A single Physics & Astronomy Classification Number +% Usage \pacno{31.10} +% +\def\pacno#1{\vspace{10pt} + \begin{indented} + \item[]\rm PACS number: #1\par + \end{indented}} +% +% Physics & Astronomy Classification Numbers (more than one) +% Usage \pacs{31.10, 31.20T} +% +\def\pacs#1{\vspace{10pt} + \begin{indented} + \item[]\rm PACS numbers: #1\par + \end{indented}} +% +% Submission details. If \jl command used journals name printed +% otherwise Institute of Physics Publishing +% +\def\submitted{\vspace{28pt plus 10pt minus 18pt} + \noindent{\small\rm Submitted to: {\it \journal}\par}} +% +\def\submitto#1{\vspace{28pt plus 10pt minus 18pt} + \noindent{\small\rm Submitted to: {\it #1}\par}} +% +% For articles (other than Letters) not divided into sections +% Usage \nosections Start of text +% +\def\nosections{\vspace{30\p@ plus12\p@ minus12\p@} + \noindent\ignorespaces} +% +% Acknowledgments (no heading if letter) +% Usage \ack for Acknowledgments, \ackn for Acknowledgement +% +\def\ack{\ifletter\bigskip\noindent\ignorespaces\else + \section*{Acknowledgments}\fi} +\def\ackn{\ifletter\bigskip\noindent\ignorespaces\else + \section*{Acknowledgment}\fi} +% +% Footnotes: symbols selected in order \dag (1), \ddag (2), \S (3), +% $\|$ (4), $\P$ (5), $^+$ (6), $^*$ (7), \sharp (8), \dagger\dagger (9) +% unless optional argument of [] use to specify required symbol, +% 1=\dag, 2=\ddag, etc +% Usage: \footnote{Text of footnote} +% \footnote[3]{Text of footnote} +% +\def\footnoterule{}% +\setcounter{footnote}{1} +\long\def\@makefntext#1{\parindent 1em\noindent + \makebox[1em][l]{\footnotesize\rm$\m@th{\fnsymbol{footnote}}$}% + \footnotesize\rm #1} +\def\@makefnmark{\hbox{${\fnsymbol{footnote}}\m@th$}} +\def\@thefnmark{\fnsymbol{footnote}} +\def\footnote{\@ifnextchar[{\@xfootnote}{\stepcounter{\@mpfn}% + \begingroup\let\protect\noexpand + \xdef\@thefnmark{\thempfn}\endgroup + \@footnotemark\@footnotetext}} +\def\@xfootnote[#1]{\setcounter{footnote}{#1}% + \addtocounter{footnote}{-1}\footnote} +\def\@fnsymbol#1{\ifcase#1\or \dagger\or \ddagger\or \S\or + \|\or \P\or ^{+}\or ^{\tsty *}\or \sharp + \or \dagger\dagger \else\@ctrerr\fi\relax} +% +% IOP Journals +% +\newcounter{jnl} +\newcommand{\jl}[1]{\setcounter{jnl}{#1}} +\def\journal{\ifnum\thejnl=0 Institute of Physics Publishing\fi + \ifnum\thejnl=1 J. Phys.\ A: Math.\ Gen.\ \fi + \ifnum\thejnl=2 J. Phys.\ B: At.\ Mol.\ Opt.\ Phys.\ \fi + \ifnum\thejnl=3 J. Phys.:\ Condens. Matter\ \fi + \ifnum\thejnl=4 J. Phys.\ G: Nucl.\ Part.\ Phys.\ \fi + \ifnum\thejnl=5 Inverse Problems\ \fi + \ifnum\thejnl=6 Class. Quantum Grav.\ \fi + \ifnum\thejnl=7 Network: Comput.\ Neural Syst.\ \fi + \ifnum\thejnl=8 Nonlinearity\ \fi + \ifnum\thejnl=9 J. Opt. B: Quantum Semiclass. Opt.\ \fi + \ifnum\thejnl=10 Waves Random Media\ \fi + \ifnum\thejnl=11 J. Opt. A: Pure Appl. Opt.\ \fi + \ifnum\thejnl=12 Phys. Med. Biol.\ \fi + \ifnum\thejnl=13 Modelling Simul.\ Mater.\ Sci.\ Eng.\ \fi + \ifnum\thejnl=14 Plasma Phys. Control. Fusion\ \fi + \ifnum\thejnl=15 Physiol. Meas.\ \fi + \ifnum\thejnl=16 Combust. Theory Modelling\ \fi + \ifnum\thejnl=17 High Perform.\ Polym.\ \fi + \ifnum\thejnl=18 Public Understand. Sci.\ \fi + \ifnum\thejnl=19 Rep.\ Prog.\ Phys.\ \fi + \ifnum\thejnl=20 J.\ Phys.\ D: Appl.\ Phys.\ \fi + \ifnum\thejnl=21 Supercond.\ Sci.\ Technol.\ \fi + \ifnum\thejnl=22 Semicond.\ Sci.\ Technol.\ \fi + \ifnum\thejnl=23 Nanotechnology\ \fi + \ifnum\thejnl=24 Measur.\ Sci.\ Technol.\ \fi + \ifnum\thejnl=25 Plasma.\ Sources\ Sci.\ Technol.\ \fi + \ifnum\thejnl=26 Smart\ Mater.\ Struct.\ \fi + \ifnum\thejnl=27 J.\ Micromech.\ Microeng.\ \fi + \ifnum\thejnl=28 Distrib.\ Syst.\ Engng\ \fi + \ifnum\thejnl=29 Bioimaging\ \fi + \ifnum\thejnl=30 J.\ Radiol. Prot.\ \fi + \ifnum\thejnl=31 Europ. J. Phys.\ \fi + \ifnum\thejnl=32 J. Opt. A: Pure Appl. Opt.\ \fi + \ifnum\thejnl=33 New. J. Phys.\ \fi} +% +% E-mail addresses (to provide links from headers) +% +\def\eads#1{\vspace*{5pt}\address{E-mail: #1}} +\def\ead#1{\vspace*{5pt}\address{E-mail: \mailto{#1}}} +\def\mailto#1{{\tt #1}} +% +% Switches +% +\newif\ifletter +% +\setcounter{secnumdepth}{3} +\newcounter {section} +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand\thesection {\arabic{section}} +\renewcommand\thesubsection {\thesection.\arabic{subsection}} +\renewcommand\thesubsubsection {\thesubsection.\arabic{subsubsection}} +\renewcommand\theparagraph {\thesubsubsection.\arabic{paragraph}} +\renewcommand\thesubparagraph {\theparagraph.\arabic{subparagraph}} +\def\@chapapp{Section} + +\newcommand\section{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\reset@font\normalsize\bfseries\raggedright}} +\newcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\reset@font\normalsize\itshape\raggedright}} +\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {-1em \@plus .2em}% + {\reset@font\normalsize\itshape}} +\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus1ex \@minus.2ex}% + {-1em}% + {\reset@font\normalsize\itshape}} +\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\reset@font\normalsize\itshape}} +\def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth + \let\@svsec\@empty\else + \refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname. }\fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup #6\relax + \noindent{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par}% + \endgroup + \csname #1mark\endcsname{#7}\addcontentsline + {toc}{#1}{\ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}\fi + #7}\else + \def\@svsechd{#6\hskip #3\relax %% \relax added 2 May 90 + \@svsec #8\csname #1mark\endcsname + {#7}\addcontentsline + {toc}{#1}{\ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}\fi + #7}}\fi + \@xsect{#5}} +% +\def\@ssect#1#2#3#4#5{\@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup #4\noindent{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup + \else \def\@svsechd{#4\hskip #1\relax #5}\fi + \@xsect{#3}} + +\setlength\leftmargini{2em} +\setlength\leftmarginii{2em} +\setlength\leftmarginiii{1.8em} +\setlength\leftmarginiv{1.6em} +\setlength\leftmarginv{1em} +\setlength\leftmarginvi{1em} +\setlength\leftmargin{\leftmargini} +\setlength\labelsep{0.5em} +\setlength\labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\roman{enumi}} +\renewcommand\theenumii{\alph{enumii}} +\renewcommand\theenumiii{\arabic{enumiii}} +\renewcommand\theenumiv{\Alph{enumiv}} +\newcommand\labelenumi{(\theenumi)} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{(\theenumiv)} +\renewcommand\p@enumii{(\theenumi)} +\renewcommand\p@enumiii{(\theenumi.\theenumii)} +\renewcommand\p@enumiv{(\theenumi.\theenumii.\theenumiii)} +\newcommand\labelitemi{$\m@th\bullet$} +\newcommand\labelitemii{\normalfont\bfseries --} +\newcommand\labelitemiii{$\m@th\ast$} +\newcommand\labelitemiv{$\m@th\cdot$} +\newenvironment{description} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +\newcommand\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1} +\newenvironment{abstract}{% + \vspace{16pt plus3pt minus3pt} + \begin{indented} + \item[]{\bfseries \abstractname.}\quad\rm\ignorespaces} + {\end{indented}\if@titlepage\newpage\else\vspace{18\p@ plus18\p@}\fi} +\newenvironment{verse} + {\let\\=\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item[]} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item[]} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item[]} + {\endlist} +\newenvironment{titlepage} + {% + \@restonecolfalse\newpage + \thispagestyle{empty}% + \if@compatibility + \setcounter{page}{0} + \else + \setcounter{page}{1}% + \fi}% + {\newpage\setcounter{page}{1}} +\def\appendix{\@ifnextchar*{\@appendixstar}{\@appendix}} +\def\@appendix{\eqnobysec\@appendixstar} +\def\@appendixstar{\@@par + \ifnumbysec % Added 30/4/94 to get Table A1, + \@addtoreset{table}{section} % Table B1 etc if numbering by + \@addtoreset{figure}{section}\fi % section + \setcounter{section}{0} + \setcounter{subsection}{0} + \setcounter{subsubsection}{0} + \setcounter{equation}{0} + \setcounter{figure}{0} + \setcounter{table}{0} + \def\thesection{Appendix \Alph{section}} + \def\theequation{\ifnumbysec + \Alph{section}.\arabic{equation}\else + \Alph{section}\arabic{equation}\fi} % Comment A\arabic{equation} maybe + \def\thetable{\ifnumbysec % better? 15/4/95 + \Alph{section}\arabic{table}\else + A\arabic{table}\fi} + \def\thefigure{\ifnumbysec + \Alph{section}\arabic{figure}\else + A\arabic{figure}\fi}} +\def\noappendix{\setcounter{figure}{0} + \setcounter{table}{0} + \def\thetable{\arabic{table}} + \def\thefigure{\arabic{figure}}} +\setlength\arraycolsep{5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand\theequation{\arabic{equation}} +\newcounter{figure} +\renewcommand\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment{figure}{\footnotesize\rm\@float{figure}}% + {\end@float\normalsize\rm} +\newenvironment{figure*}{\footnotesize\rm\@dblfloat{figure}}{\end@dblfloat} +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment{table}{\footnotesize\rm\@float{table}}% + {\end@float\normalsize\rm} +\newenvironment{table*}{\footnotesize\rm\@dblfloat{table}}% + {\end@dblfloat\normalsize\rm} +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +% +% Added redefinition of \@caption so captions are not written to +% aux file therefore less need to \protect fragile commands +% +\long\def\@caption#1[#2]#3{\par\begingroup + \@parboxrestore + \normalsize + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} +% +\long\def\@makecaption#1#2{\vskip \abovecaptionskip + \begin{indented} + \item[]{\bf #1.} #2 + \end{indented}\vskip\belowcaptionskip} +\let\@portraitcaption=\@makecaption + +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\ifiopams +\renewcommand{\cal}{\protect\pcal} +\else +\newcommand{\cal}{\protect\pcal} +\fi +\newcommand{\pcal}{\@fontswitch{\relax}{\mathcal}} +\ifiopams +\renewcommand{\mit}{\protect\pmit} +\else +\newcommand{\mit}{\protect\pmit} +\fi +\newcommand{\pmit}{\@fontswitch{\relax}{\mathnormal}} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg {2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{3} +\newcommand\tableofcontents{% + \section*{\contentsname + \@mkboth{\uppercase{\contentsname}}{\uppercase{\contentsname}}}% + \@starttoc{toc}% + } +\newcommand\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty{\@secpenalty}% + \addvspace{2.25em \@plus\p@}% + \begingroup + \setlength\@tempdima{3em}% + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hbox to\@pnumwidth{\hss #2}}\par + \nobreak + \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}} + \fi + \endgroup + \fi} +\newcommand\l@section[2]{% + \ifnum \c@tocdepth >\z@ + \addpenalty{\@secpenalty}% + \addvspace{1.0em \@plus\p@}% + \setlength\@tempdima{1.5em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \bfseries + \advance\leftskip\@tempdima + \hskip -\leftskip + #1\nobreak\hfil \nobreak\hbox to\@pnumwidth{\hss #2}\par + \endgroup + \fi} +\newcommand\l@subsection {\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand\l@paragraph {\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand\l@subparagraph {\@dottedtocline{5}{10em}{5em}} +\newcommand\listoffigures{% + \section*{\listfigurename + \@mkboth{\uppercase{\listfigurename}}% + {\uppercase{\listfigurename}}}% + \@starttoc{lof}% + } +\newcommand\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \section*{\listtablename + \@mkboth{\uppercase{\listtablename}}{\uppercase{\listtablename}}}% + \@starttoc{lot}% + } +\let\l@table\l@figure +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\section*{\indexname}]% + \@mkboth{\uppercase{\indexname}}% + {\uppercase{\indexname}}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem {\par\hangindent 40\p@} +\newcommand\subitem {\par\hangindent 40\p@ \hspace*{20\p@}} +\newcommand\subsubitem{\par\hangindent 40\p@ \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} +\newcommand\contentsname{Contents} +\newcommand\listfigurename{List of Figures} +\newcommand\listtablename{List of Tables} +\newcommand\refname{References} +\newcommand\indexname{Index} +\newcommand\figurename{Figure} +\newcommand\tablename{Table} +\newcommand\partname{Part} +\newcommand\appendixname{Appendix} +\newcommand\abstractname{Abstract} +\newcommand\today{\number\day\space\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\year} +\setlength\columnsep{10\p@} +\setlength\columnseprule{0\p@} + +\newcommand{\Tables}{\clearpage\section*{Tables and table captions} + \def\fps@table{hp}\noappendix} +\newcommand{\Figures}{\clearpage\section*{Figure captions} + \def\fps@figure{hp}\noappendix} +% +\newcommand{\Figure}[1]{\begin{figure} + \caption{#1} + \end{figure}} +% +\newcommand{\Table}[1]{\begin{table} + \caption{#1} + \begin{indented} + \lineup + \item[]\begin{tabular}{@{}l*{15}{l}}} + +\def\endTable{\end{tabular}\end{indented}\end{table}} +\let\endtab=\endTable +% +\newcommand{\fulltable}[1]{\begin{table} + \caption{#1} + \lineup + \begin{tabular*}{\textwidth}{@{}l*{15}{@{\extracolsep{0pt plus 12pt}}l}}} +\def\endfulltable{\end{tabular*}\end{table}} +% +% +\newcommand{\Bibliography}[1]{\section*{References}\par\numrefs{#1}} +\newcommand{\References}{\section*{References}\par\refs} + +\def\thebibliography#1{\list + {\hfil[\arabic{enumi}]}{\topsep=0\p@\parsep=0\p@ + \partopsep=0\p@\itemsep=0\p@ + \labelsep=5\p@\itemindent=-10\p@ + \settowidth\labelwidth{\footnotesize[#1]}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \advance\leftmargin -\itemindent + \usecounter{enumi}}\footnotesize + \def\newblock{\ } + \sloppy\clubpenalty4000\widowpenalty4000 + \sfcode`\.=1000\relax} +\let\endthebibliography=\endlist +\def\numrefs#1{\begin{thebibliography}{#1}} +\def\endnumrefs{\end{thebibliography}} +\let\endbib=\endnumrefs +% +\def\thereferences{\list{}{\topsep=0\p@\parsep=0\p@ + \partopsep=0\p@\itemsep=0\p@\labelsep=0\p@\itemindent=-18\p@ +\labelwidth=0\p@\leftmargin=18\p@ +}\footnotesize\rm +\def\newblock{\ } +\sloppy\clubpenalty4000\widowpenalty4000 +\sfcode`\.=1000\relax +} +% +\let\endthereferences=\endlist +\newlength{\indentedwidth} +\newdimen\mathindent +\indentedwidth=\mathindent +% +% Macro to used for references in the Harvard system +% +\newenvironment{harvard}{\list{}{\topsep=0\p@\parsep=0\p@ +\partopsep=0\p@\itemsep=0\p@\labelsep=0\p@\itemindent=-18\p@ +\labelwidth=0\p@\leftmargin=18\p@ +}\footnotesize\rm +\def\newblock{\ } +\sloppy\clubpenalty4000\widowpenalty4000 +\sfcode`\.=1000\relax}{\endlist} +% +\def\refs{\begin{harvard}} +\def\endrefs{\end{harvard}} +% +\newenvironment{indented}{\begin{indented}}{\end{indented}} +\newenvironment{varindent}[1]{\begin{varindent}{#1}}{\end{varindent}} +% +\def\indented{\list{}{\itemsep=0\p@\labelsep=0\p@\itemindent=0\p@ + \labelwidth=0\p@\leftmargin=\mathindent\topsep=0\p@\partopsep=0\p@ + \parsep=0\p@\listparindent=15\p@}\footnotesize\rm} + +\let\endindented=\endlist + +\def\varindent#1{\setlength{\varind}{#1}% + \list{}{\itemsep=0\p@\labelsep=0\p@\itemindent=0\p@ + \labelwidth=0\p@\leftmargin=\varind\topsep=0\p@\partopsep=0\p@ + \parsep=0\p@\listparindent=15\p@}\footnotesize\rm} + +\let\endvarindent=\endlist + +\def\[{\relax\ifmmode\@badmath\else + \begin{trivlist} + \@beginparpenalty\predisplaypenalty + \@endparpenalty\postdisplaypenalty + \item[]\leavevmode + \hbox to\linewidth\bgroup$ \displaystyle + \hskip\mathindent\bgroup\fi} +\def\]{\relax\ifmmode \egroup $\hfil \egroup \end{trivlist}\else \@badmath \fi} +\def\equation{\@beginparpenalty\predisplaypenalty + \@endparpenalty\postdisplaypenalty +\refstepcounter{equation}\trivlist \item[]\leavevmode + \hbox to\linewidth\bgroup $ \displaystyle +\hskip\mathindent} +\def\endequation{$\hfil \displaywidth\linewidth\@eqnnum\egroup \endtrivlist} +% +\@namedef{equation*}{\[} +\@namedef{endequation*}{\]} +% +\def\eqnarray{\stepcounter{equation}\let\@currentlabel=\theequation +\global\@eqnswtrue +\global\@eqcnt\z@\tabskip\mathindent\let\\=\@eqncr +\abovedisplayskip\topsep\ifvmode\advance\abovedisplayskip\partopsep\fi +\belowdisplayskip\abovedisplayskip +\belowdisplayshortskip\abovedisplayskip +\abovedisplayshortskip\abovedisplayskip +$$\halign to +\linewidth\bgroup\@eqnsel$\displaystyle\tabskip\z@ + {##{}}$&\global\@eqcnt\@ne $\displaystyle{{}##{}}$\hfil + &\global\@eqcnt\tw@ $\displaystyle{{}##}$\hfil + \tabskip\@centering&\llap{##}\tabskip\z@\cr} +\def\endeqnarray{\@@eqncr\egroup + \global\advance\c@equation\m@ne$$\global\@ignoretrue } +\mathindent = 6pc +% +\def\eqalign#1{\null\vcenter{\def\\{\cr}\openup\jot\m@th + \ialign{\strut$\displaystyle{##}$\hfil&$\displaystyle{{}##}$\hfil + \crcr#1\crcr}}\,} +% +\def\eqalignno#1{\displ@y \tabskip\z@skip + \halign to\displaywidth{\hspace{5pc}$\@lign\displaystyle{##}$% + \tabskip\z@skip + &$\@lign\displaystyle{{}##}$\hfill\tabskip\@centering + &\llap{$\@lign\hbox{\rm##}$}\tabskip\z@skip\crcr + #1\crcr}} +% +\newif\ifnumbysec +\def\theequation{\ifnumbysec + \arabic{section}.\arabic{equation}\else + \arabic{equation}\fi} +\def\eqnobysec{\numbysectrue\@addtoreset{equation}{section}} + +\newcounter{eqnval} +\def\numparts{\addtocounter{equation}{1}% + \setcounter{eqnval}{\value{equation}}% + \setcounter{equation}{0}% + \def\theequation{\ifnumbysec + \arabic{section}.\arabic{eqnval}{\it\alph{equation}}% + \else\arabic{eqnval}{\it\alph{equation}}\fi}} + +\def\endnumparts{\def\theequation{\ifnumbysec + \arabic{section}.\arabic{equation}\else + \arabic{equation}\fi}% + \setcounter{equation}{\value{eqnval}}} +% +\def\cases#1{% + \left\{\,\vcenter{\def\\{\cr}\normalbaselines\openup1\jot\m@th% + \ialign{\strut$\displaystyle{##}\hfil$&\tqs + \rm##\hfil\crcr#1\crcr}}\right.}% +% +\newcommand{\e}{\mathrm{e}} +\newcommand{\rme}{\mathrm{e}} +\newcommand{\rmi}{\mathrm{i}} +\newcommand{\rmd}{\mathrm{d}} +\renewcommand{\qquad}{\hspace*{25pt}} +\newcommand{\tdot}[1]{\stackrel{\dots}{#1}} % Added 1/9/94 +\newcommand{\tqs}{\hspace*{25pt}} +\newcommand{\fl}{\hspace*{-\mathindent}} +\newcommand{\Tr}{\mathop{\mathrm{Tr}}\nolimits} +\newcommand{\tr}{\mathop{\mathrm{tr}}\nolimits} +\newcommand{\Or}{\mathord{\mathrm{O}}} %changed from \mathop 20/1/95 +\newcommand{\lshad}{[\![} +\newcommand{\rshad}{]\!]} +\newcommand{\case}[2]{{\textstyle\frac{#1}{#2}}} +\def\pt(#1){({\it #1\/})} +\newcommand{\dsty}{\displaystyle} +\newcommand{\tsty}{\textstyle} +\newcommand{\ssty}{\scriptstyle} +\newcommand{\sssty}{\scriptscriptstyle} +\def\lo#1{\llap{${}#1{}$}} +\def\eql{\llap{${}={}$}} +\def\lsim{\llap{${}\sim{}$}} +\def\lsimeq{\llap{${}\simeq{}$}} +\def\lequiv{\llap{${}\equiv{}$}} +% +\newcommand{\eref}[1]{(\ref{#1})} +\newcommand{\sref}[1]{section~\ref{#1}} +\newcommand{\fref}[1]{figure~\ref{#1}} +\newcommand{\tref}[1]{table~\ref{#1}} +\newcommand{\Eref}[1]{Equation (\ref{#1})} +\newcommand{\Sref}[1]{Section~\ref{#1}} +\newcommand{\Fref}[1]{Figure~\ref{#1}} +\newcommand{\Tref}[1]{Table~\ref{#1}} + +\newcommand{\opencircle}{\mbox{\Large$\circ\,$}} % moved Large outside maths +\newcommand{\opensquare}{\mbox{$\rlap{$\sqcap$}\sqcup$}} +\newcommand{\opentriangle}{\mbox{$\triangle$}} +\newcommand{\opentriangledown}{\mbox{$\bigtriangledown$}} +\newcommand{\opendiamond}{\mbox{$\diamondsuit$}} +\newcommand{\fullcircle}{\mbox{{\Large$\bullet\,$}}} % moved Large outside maths +\newcommand{\fullsquare}{\,\vrule height5pt depth0pt width5pt} +\newcommand{\dotted}{\protect\mbox{${\mathinner{\cdotp\cdotp\cdotp\cdotp\cdotp\cdotp}}$}} +\newcommand{\dashed}{\protect\mbox{-\; -\; -\; -}} +\newcommand{\broken}{\protect\mbox{-- -- --}} +\newcommand{\longbroken}{\protect\mbox{--- --- ---}} +\newcommand{\chain}{\protect\mbox{--- $\cdot$ ---}} +\newcommand{\dashddot}{\protect\mbox{--- $\cdot$ $\cdot$ ---}} +\newcommand{\full}{\protect\mbox{------}} + +\def\;{\protect\psemicolon} +\def\psemicolon{\relax\ifmmode\mskip\thickmuskip\else\kern .3333em\fi} +\def\lineup{\def\0{\hbox{\phantom{\footnotesize\rm 0}}}% + \def\m{\hbox{$\phantom{-}$}}% + \def\-{\llap{$-$}}} +% +%%%%%%%%%%%%%%%%%%%%% +% Tables rules % +%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\boldarrayrulewidth}{1\p@} +% Width of bold rule in tabular environment. + +\def\bhline{\noalign{\ifnum0=`}\fi\hrule \@height +\boldarrayrulewidth \futurelet \@tempa\@xhline} + +\def\@xhline{\ifx\@tempa\hline\vskip \doublerulesep\fi + \ifnum0=`{\fi}} + +% +% Rules for tables with extra space around +% +\newcommand{\br}{\ms\bhline\ms} +\newcommand{\mr}{\ms\hline\ms} +% +\newcommand{\centre}[2]{\multispan{#1}{\hfill #2\hfill}} +\newcommand{\crule}[1]{\multispan{#1}{\hspace*{\tabcolsep}\hrulefill + \hspace*{\tabcolsep}}} +\newcommand{\fcrule}[1]{\ifnum\thetabtype=1\multispan{#1}{\hrulefill + \hspace*{\tabcolsep}}\else\multispan{#1}{\hrulefill}\fi} +% +% Extra spaces for tables and displayed equations +% +\newcommand{\ms}{\noalign{\vspace{3\p@ plus2\p@ minus1\p@}}} +\newcommand{\bs}{\noalign{\vspace{6\p@ plus2\p@ minus2\p@}}} +\newcommand{\ns}{\noalign{\vspace{-3\p@ plus-1\p@ minus-1\p@}}} +\newcommand{\es}{\noalign{\vspace{6\p@ plus2\p@ minus2\p@}}\displaystyle}% +% +\newcommand{\etal}{{\it et al\/}\ } +\newcommand{\dash}{------} +\newcommand{\nonum}{\par\item[]} %\par added 1/9/93 +\newcommand{\mat}[1]{\underline{\underline{#1}}} +% +% abbreviations for IOPP journals +% +\newcommand{\CQG}{{\it Class. Quantum Grav.} } +\newcommand{\CTM}{{\it Combust. Theory Modelling\/} } +\newcommand{\DSE}{{\it Distrib. Syst. Engng\/} } +\newcommand{\EJP}{{\it Eur. J. Phys.} } +\newcommand{\HPP}{{\it High Perform. Polym.} } % added 4/5/93 +\newcommand{\IP}{{\it Inverse Problems\/} } +\newcommand{\JHM}{{\it J. Hard Mater.} } % added 4/5/93 +\newcommand{\JO}{{\it J. Opt.} } +\newcommand{\JOA}{{\it J. Opt. A: Pure Appl. Opt.} } +\newcommand{\JOB}{{\it J. Opt. B: Quantum Semiclass. Opt.} } +\newcommand{\JPA}{{\it J. Phys. A: Math. Gen.} } +\newcommand{\JPB}{{\it J. Phys. B: At. Mol. Phys.} } %1968-87 +\newcommand{\jpb}{{\it J. Phys. B: At. Mol. Opt. Phys.} } %1988 and onwards +\newcommand{\JPC}{{\it J. Phys. C: Solid State Phys.} } %1968--1988 +\newcommand{\JPCM}{{\it J. Phys.: Condens. Matter\/} } %1989 and onwards +\newcommand{\JPD}{{\it J. Phys. D: Appl. Phys.} } +\newcommand{\JPE}{{\it J. Phys. E: Sci. Instrum.} } +\newcommand{\JPF}{{\it J. Phys. F: Met. Phys.} } +\newcommand{\JPG}{{\it J. Phys. G: Nucl. Phys.} } %1975--1988 +\newcommand{\jpg}{{\it J. Phys. G: Nucl. Part. Phys.} } %1989 and onwards +\newcommand{\MSMSE}{{\it Modelling Simulation Mater. Sci. Eng.} } +\newcommand{\MST}{{\it Meas. Sci. Technol.} } %1990 and onwards +\newcommand{\NET}{{\it Network: Comput. Neural Syst.} } +\newcommand{\NJP}{{\it New J. Phys.} } +\newcommand{\NL}{{\it Nonlinearity\/} } +\newcommand{\NT}{{\it Nanotechnology} } +\newcommand{\PAO}{{\it Pure Appl. Optics\/} } +\newcommand{\PM}{{\it Physiol. Meas.} } % added 4/5/93 +\newcommand{\PMB}{{\it Phys. Med. Biol.} } +\newcommand{\PPCF}{{\it Plasma Phys. Control. Fusion\/} } % added 4/5/93 +\newcommand{\PSST}{{\it Plasma Sources Sci. Technol.} } +\newcommand{\PUS}{{\it Public Understand. Sci.} } +\newcommand{\QO}{{\it Quantum Opt.} } +\newcommand{\QSO}{{\em Quantum Semiclass. Opt.} } +\newcommand{\RPP}{{\it Rep. Prog. Phys.} } +\newcommand{\SLC}{{\it Sov. Lightwave Commun.} } % added 4/5/93 +\newcommand{\SST}{{\it Semicond. Sci. Technol.} } +\newcommand{\SUST}{{\it Supercond. Sci. Technol.} } +\newcommand{\WRM}{{\it Waves Random Media\/} } +\newcommand{\JMM}{{\it J. Micromech. Microeng.\/} } +% +% Other commonly quoted journals +% +\newcommand{\AC}{{\it Acta Crystallogr.} } +\newcommand{\AM}{{\it Acta Metall.} } +\newcommand{\AP}{{\it Ann. Phys., Lpz.} } +\newcommand{\APNY}{{\it Ann. Phys., NY\/} } +\newcommand{\APP}{{\it Ann. Phys., Paris\/} } +\newcommand{\CJP}{{\it Can. J. Phys.} } +\newcommand{\JAP}{{\it J. Appl. Phys.} } +\newcommand{\JCP}{{\it J. Chem. Phys.} } +\newcommand{\JJAP}{{\it Japan. J. Appl. Phys.} } +\newcommand{\JP}{{\it J. Physique\/} } +\newcommand{\JPhCh}{{\it J. Phys. Chem.} } +\newcommand{\JMMM}{{\it J. Magn. Magn. Mater.} } +\newcommand{\JMP}{{\it J. Math. Phys.} } +\newcommand{\JOSA}{{\it J. Opt. Soc. Am.} } +\newcommand{\JPSJ}{{\it J. Phys. Soc. Japan\/} } +\newcommand{\JQSRT}{{\it J. Quant. Spectrosc. Radiat. Transfer\/} } +\newcommand{\NC}{{\it Nuovo Cimento\/} } +\newcommand{\NIM}{{\it Nucl. Instrum. Methods\/} } +\newcommand{\NP}{{\it Nucl. Phys.} } +\newcommand{\PL}{{\it Phys. Lett.} } +\newcommand{\PR}{{\it Phys. Rev.} } +\newcommand{\PRL}{{\it Phys. Rev. Lett.} } +\newcommand{\PRS}{{\it Proc. R. Soc.} } +\newcommand{\PS}{{\it Phys. Scr.} } +\newcommand{\PSS}{{\it Phys. Status Solidi\/} } +\newcommand{\PTRS}{{\it Phil. Trans. R. Soc.} } +\newcommand{\RMP}{{\it Rev. Mod. Phys.} } +\newcommand{\RSI}{{\it Rev. Sci. Instrum.} } +\newcommand{\SSC}{{\it Solid State Commun.} } +\newcommand{\ZP}{{\it Z. Phys.} } +% +\pagestyle{headings} +\pagenumbering{arabic} % Arabic page numbers +\raggedbottom +\onecolumn +\endinput +%% +%% End of file `iopart.cls'. + diff --git a/documentation/contrib/Shape3D_enhancements_RS_AK/setstack.sty b/documentation/contrib/Shape3D_enhancements_RS_AK/setstack.sty new file mode 100644 index 0000000000..da428a6160 --- /dev/null +++ b/documentation/contrib/Shape3D_enhancements_RS_AK/setstack.sty @@ -0,0 +1,139 @@ +%% +%% This is file `setstack.sty', created by VIK 15 Dec 1998 +%% Reproduces useful macros from amsmath.sty, thus avoiding the need to load the entire +%% amsmath.sty and run into conflicts +%% Adds definitions for \overset, \underset, \sideset, \substack, \boxed, \leftroot, +%% \uproot, \dddot, \ddddot, \varrow, \harrow (see The LateX Companion, pp 225-227) +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1998/12/15]% LaTeX date must December 1998 or later +\ProvidesPackage{setstack} +\DeclareRobustCommand{\text}{% + \ifmmode\expandafter\text@\else\expandafter\mbox\fi} + \let\nfss@text\text + \def\text@#1{\mathchoice + {\textdef@\displaystyle\f@size{#1}}% + {\textdef@\textstyle\tf@size{\firstchoice@false #1}}% + {\textdef@\textstyle\sf@size{\firstchoice@false #1}}% + {\textdef@\textstyle \ssf@size{\firstchoice@false #1}}% + \check@mathfonts +} +\def\textdef@#1#2#3{\hbox{{% + \everymath{#1}% + \let\f@size#2\selectfont #3}}} + +% adds underset, overset, sideset and +% substack features from amsmath.sty (Companion p. 226) + +\def\invalid@tag#1{\@amsmath@err{#1}{\the\tag@help}\gobble@tag} +\def\dft@tag{\invalid@tag{\string\tag\space not allowed here}} +\def\default@tag{\let\tag\dft@tag} + +\def\Let@{\let\\\math@cr} +\def\restore@math@cr{\def\math@cr@@@{\cr}} + +\def\overset#1#2{\binrel@{#2}% +\binrel@@{\mathop{\kern\z@#2}\limits^{#1}}} +\def\underset#1#2{\binrel@{#2}% +\binrel@@{\mathop{\kern\z@#2}\limits_{#1}}} +\def\sideset#1#2#3{% +\@mathmeasure\z@\displaystyle{#3}% +\global\setbox\@ne\vbox to\ht\z@{}\dp\@ne\dp\z@ + \setbox\tw@\box\@ne +\@mathmeasure4\displaystyle{\copy\tw@#1}% +\@mathmeasure6\displaystyle{#3\nolimits#2}% +\dimen@-\wd6 \advance\dimen@\wd4 \advance\dimen@\wd\z@ +\hbox to\dimen@{}\mathop{\kern-\dimen@\box4\box6}% +} + +\newenvironment{subarray}[1]{% +\vcenter\bgroup +\Let@ \restore@math@cr \default@tag +\baselineskip\fontdimen10 \scriptfont\tw@ +\advance\baselineskip\fontdimen12 \scriptfont\tw@ +\lineskip\thr@@\fontdimen8 \scriptfont\thr@@ +\lineskiplimit\lineskip +\ialign\bgroup\ifx c#1\hfil\fi +$\m@th\scriptstyle##$\hfil\crcr +}{% +\crcr\egroup\egroup +} +\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} + +% definitions of dddot and ddddot(p. 225) + +\def\dddot#1{{\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@ + \hbox{\normalfont ...}\vss}}}} +\def\ddddot#1{{\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@ + \hbox{\normalfont....}\vss}}}} + +% definitions of leftroot, uproot (p.225) + +\begingroup \catcode`\"=12 +\gdef\@@sqrt#1{\radical"270370 {#1}} +\endgroup + +\def\leftroot{\@amsmath@err{\Invalid@@\leftroot}\@eha} +\def\uproot{\@amsmath@err{\Invalid@@\uproot}\@eha} +\newcount\uproot@ +\newcount\leftroot@ +\def\root{\relaxnext@ + \DN@{\ifx\@let@token\uproot\let\next@\nextii@\else + \ifx\@let@token\leftroot\let\next@\nextiii@\else + \let\next@\plainroot@\fi\fi\next@}% + \def\nextii@\uproot##1{\uproot@##1\relax\FN@\nextiv@}% + \def\nextiv@{\ifx\@let@token\@sptoken\DN@. {\FN@\nextv@}\else + \DN@.{\FN@\nextv@}\fi\next@.}% + \def\nextv@{\ifx\@let@token\leftroot\let\next@\nextvi@\else + \let\next@\plainroot@\fi\next@}% + \def\nextvi@\leftroot##1{\leftroot@##1\relax\plainroot@}% + \def\nextiii@\leftroot##1{\leftroot@##1\relax\FN@\nextvii@}% + \def\nextvii@{\ifx\@let@token\@sptoken + \DN@. {\FN@\nextviii@}\else + \DN@.{\FN@\nextviii@}\fi\next@.}% + \def\nextviii@{\ifx\@let@token\uproot\let\next@\nextix@\else + \let\next@\plainroot@\fi\next@}% + \def\nextix@\uproot##1{\uproot@##1\relax\plainroot@}% + \bgroup\uproot@\z@\leftroot@\z@\FN@\next@} +\def\plainroot@#1\of#2{\setbox\rootbox\hbox{% + $\m@th\scriptscriptstyle{#1}$}% + \mathchoice{\r@@t\displaystyle{#2}}{\r@@t\textstyle{#2}} + {\r@@t\scriptstyle{#2}}{\r@@t\scriptscriptstyle{#2}}\egroup} +\def\r@@t#1#2{\setboxz@h{$\m@th#1\@@sqrt{#2}$}% + \dimen@\ht\z@\advance\dimen@-\dp\z@ + \setbox\@ne\hbox{$\m@th#1\mskip\uproot@ mu$}% + \advance\dimen@ by1.667\wd\@ne + \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@\copy\rootbox + \mkern-10mu\mkern\leftroot@ mu\boxz@} + +% definition of \boxed (math in frame, no dollars) p 225 + +\def\boxed#1{\fbox{\m@th$\displaystyle#1$}} + +% definition of \smash for top and bottom parts of expression in braces (p.227) +\renewcommand{\smash}[2][tb]{% + \def\smash@{#1}% + \ifmmode\@xp\mathpalette\@xp\mathsm@sh\else + \@xp\makesm@sh\fi{#2}} + +% additional difinitions for arrows +% zero mm wide #2 mm long vertical arrow shifted 1 mm to left, 1 mm up +\newcommand{\varrow}[2]{% +\unitlength=1mm + \begin{picture}(0,6) % (0,0) + % - for #1 to point arrow down,+ to point arrow up + \end{picture}% + \put(0,6){\vector(0,#1 3){#2}} % 6,- for down, 0, + for up +} +% 1 mm high #2 mm long horizontal arrow shifted 1 mm up (0,-1) +\newcommand{\harrow}[2]{% +\unitlength=1mm + \begin{picture}(8,1)(0,-1) % + % 1 mm distance between arrow and stackreled object over it (8,1) + \put(0,0){\vector(#1 2,0){#2}} % - to point arrow left, + right + \end{picture}% +} + +\endinput +%% end of setstack.sty +%% Corrections history: +%% diff --git a/documentation/contrib/SimSET_STIR/Description.txt b/documentation/contrib/SimSET_STIR/Description.txt new file mode 100644 index 0000000000..ebd35f5949 --- /dev/null +++ b/documentation/contrib/SimSET_STIR/Description.txt @@ -0,0 +1,12 @@ +Description of the work + +The intention of this work was to be able to run the SimSET Monte Carlo package +on images written using STIR routines, and to convert the SimSET output +to a file format which is readable by STIR. + +Contributors: +Pablo Aguiar (Biophysics and Bioengineering Unit of the University of Barcelona, Spain) +Nikolaos Dikaios (University of Patras and National Technical University of Athens, Greece) +Charalampos Tsoumpas (Imperial College London) +Kris Thielemans (Hammersmith Imanet Ltd) + diff --git a/documentation/credits.htm b/documentation/credits.htm new file mode 100644 index 0000000000..b2c8ad25a7 --- /dev/null +++ b/documentation/credits.htm @@ -0,0 +1,193 @@ + + + + STIR credits + + + + + + +

STIR credits

+
+ +

Overall technical development supervisor: +Thielemans, Kris

+ + + +

contributions since the PARAPET EU project (April 2000)

+

See also the contrib sub-directory available in the documentation zip file.

+ +

Overall technical development supervisor: +Thielemans, Kris

+ +

Institutions/individuals contributing (ordered roughly chronologically):

+
+1.  Medical Research Council (MRC), Cyclotron Unit
+   London, UK
+   (1/4/2000 - 13/02/2001)
+   Thielemans, Kris 
+
+2. Imaging Research Solutions Ltd (later called Hammersmith Imanet Ltd)
+   London UK   
+   (14/02/2001 - 30/06/2011 )
+   Thielemans, Kris 
+   Mustafovic, Sanida
+   Tsoumpas, Charalampos
+   Kerrouche, Nacer
+   Borgeaud, Timothy
+
+3. Imperial College London and Medical Research Council
+   London UK
+   Mustafovic, Sanida (2000 - 2003)
+   Tsoumpas, Charalampos (2004 - 2008) 
+
+4. National Technical University of Athens, Greece
+   (2005-2007)
+   Basic support for SimSET, single scatter implementation, B-splines
+   Tsoumpas, Charalampos
+   Dikaios, Nikolaos 
+   supervisors Nikita, Konstantina and Thielemans, Kris 
+
+5. Univ of Barcelona, Spain
+   (2005)
+   Basic support for SimSET, testing of single scatter implementation
+   Aguiar, Pablo
+   supervisors Ros, Domenec and Thielemans, Kris 
+
+6. Memorial Sloan-Kettering Cancer Center
+   (2005)
+   Updates to the Shape3D hierarchy 
+   Schmidtlein, C. Ross
+   Kirov, Assen S 
+
+7. Univ of Paderborn, Germany
+   (2007)
+   Initial version for parallelisation of OSMAPOSL using MPI
+   Beisel, Tobias
+   supervisor Lietsch, Stefan and Thielemans, Kris 
+
+8. Algorithms and Software Consulting Ltd, UK
+   (2011-2013)
+   General maintenance, swig updates for Python support
+   Thielemans, Kris
+
+9. King's College London, UK
+   (2013)
+   Initial version for motion utilities including motion-corrected reconstruction from gated data
+   Some additional IO
+   Tsoumpas, Charalampos
+
+10. University College London, UK
+   (2013-2014)
+   Some bug fixes, help with integration and general maintenance
+   Thielemans, Kris
+
+11. University of Barcelona, Spain
+   (2013)
+   SPECT projector matrix 
+   Falcón, Carlés
+
+12. Institute for Bioengineering of Catalonia, Spain
+    (2013)
+    Integration of SPECT UB code into STIR, SPECT Interfile IO, ITK IO.
+    Martí Fuster, Berta
+
+ +

Contributors during the PARAPET EU project

+(1997 - 30/03/2000) +

Institutions

+
+1. Hammersmith Hospital - Medical Research Council (MRC)
+   London, UK
+   Terry SPINKS
+
+2. Brunel University
+   Department of Mathematical Sciences
+   London, UK
+   Gautam MITRA
+
+3. Ospedale San Raffaele (HSR)
+   Dipartemento di Scienze e Technologie Biomediche
+   Milan, Italy
+   Maria Carla GILARDI
+
+4. Technion - Israel Institute of Technology
+   MINERVA, Optimization Center (MOC)
+   Haifa, Israel
+   Aharon BEN-TAL, Roni LEVKOVITZ
+
+5. ELGEMS Ltd.
+   Haifa, Israel
+   Michael WILK
+
+6. Geneva University Hospital (HUG)
+   Division of Nuclear Medicine
+   Geneva, Switzerland
+   Christian MOREL
+
+7. Parsytec GmbH
+   Aachen, Germany
+   Arwed EXNER, Carsten RIETBROCK, Stefan KAISER, Volkmar FRIEDRICH
+
+ +

Programmers

+
+	Zverovich, Alexey (Brunel)
+	Zibulevsky, Michael (MOC)
+	Zaidi, Habib (HUG)
+	Valente, Patrick (Brunel)
+	Thielemans, Kris (MRC)
+	Sauge, Damien (HUG)
+	Sadki, Mustapha (Brunel)
+	Pagani, Elizabetta (HSR)
+	Mustafovic, Sanida (MRC)
+	Labbe, Claire (HUG)
+	Jacobson, Matthew (MOC)
+	Hague, Darren (Brunel)
+	Gordon, Ekaterina (MOC)
+	Belluzzo, Damiano (HSR)
+
+Design I:
+
+	Zibulevsky, Michael (MOC)
+	Thielemans, Kris (MRC)
+	de Oliveira, Cristina (MRC)
+	Labbe, Claire (HUG)
+	Hague, Darren (Brunel)
+
+Design II:
+
+	Zverovich, Alexey (Brunel)
+	Thielemans, Kris (MRC, IRSL) 
+	Sadki, Mustapha (Brunel)
+	Mustafovic, Sanida (MRC, IRSL)
+	Jacobson, Matthew (MOC)
+
+ +Overall technical development supervisor: Thielemans, Kris (MRC) + +

Institutions/individuals who contributed code before the PARAPET EU project

+ +
+1. University of Lausanne, Switserland
+   Matthias Egger, Christian Morel
+   Incremental interpolating backprojector, ray-tracing forward projector,
+   Colsher filter for 3DRP, FORE
+
+ +

STIR logo

+Pablo Aguiar + +

Web site

+The STIR web-site is maintained by Algorithms and Software Consulting Ltd. +It is loosely based on the PARAPET +web site, as designed by Patrick Valente (Brunel). +
+ + +Last modified: Mon Jan 13 20:10:45 GMT 2014 + + + diff --git a/documentation/future.htm b/documentation/future.htm new file mode 100644 index 0000000000..8eae1bd34c --- /dev/null +++ b/documentation/future.htm @@ -0,0 +1,38 @@ + + + + STIR Future developments + + + + +

Future developments

+ +

The STIR library, in its current state, possesses many +capabilities, but some desirable developments would be: +

+
    +
  • Expanded library of polymorphic classes (e.g. image grids, and +ordered subsets)
  • +
  • Additional data formats support, without conversion to Interfile.
  • +
  • More algorithms: OSCB, COSEM
  • +
  • More projectors
  • +
  • More priors
  • +
  • Additional scanners
  • +
  • Allow images of arbitrary size in z-direction as well.
  • +
  • Allow x,y offset in images (at least for some projectors)
  • +
  • Automatic segmentation
  • +
+ +

However, which feature is actually finalised/implemented +depends on the needs of the developers. If you want one of these +features and are willing to help, let us know. +

+ +
+ + +Last modified: Mon Jan 13 20:00:16 GMT 2014 + + + diff --git a/documentation/graphics/STIR-developers-overviewFig1.eps b/documentation/graphics/STIR-developers-overviewFig1.eps new file mode 100644 index 0000000000..50ebabc7c7 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig1.eps @@ -0,0 +1,2233 @@ +%!PS-Adobe-3.0 +%%Creator: Advanced Batch Converter +%%Title: +%%CreationDate: Mon Oct 25 18:55:02 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 594 841 +%%EndComments +%%BeginProlog +10 dict begin +%%EndProlog +%%Page: 1 1 +0 842 translate +595 -566 scale +730 695 8 +[ 730 0 0 695 0 0 ] +/rstr 730 string def +/gstr 730 string def +/bstr 730 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 94098 ASCII Bytes +colorimage +JcF$qq?2BLJcC<$JcF^/J,~> +JcF$qq?2BLJcC<$JcF^/J,~> +JcF$qq?2BLJcC<$JcF^/J,~> +JcF!pq?2BLJcC<$JcFa0J,~> +JcF!pq?2BLJcC<$JcFa0J,~> +JcF!pq?2BLJcC<$JcFa0J,~> +JcEsoq#l9KJcC<$JcFg2J,~> +JcEsoq#l9KJcC<$JcFg2J,~> +JcEsoq#l9KJcC<$JcFg2J,~> +JcEmmq#l9KJcC<$JcFm4J,~> +JcEmmq#l9KJcC<$JcFm4J,~> +JcEmmq#l9KJcC<$JcFm4J,~> +JcEjlq#l9KJcC<$JcFp5J,~> +JcEjlq#l9KJcC<$JcFp5J,~> +JcEjlq#l9KJcC<$JcFp5J,~> +JcEdjq#l9KJcC<$JcG!7J,~> +JcEdjq#l9KJcC<$JcG!7J,~> +JcEdjq#l9KJcC<$JcG!7J,~> +JcE^hq#l9KJcC<$JcG'9J,~> +JcE^hq#l9KJcC<$JcG'9J,~> +JcE^hq#l9KJcC<$JcG'9J,~> +JcE[gp]Q0JJcC<$JcG-;J,~> +JcE[gp]Q0JJcC<$JcG-;J,~> +JcE[gp]Q0JJcC<$JcG-;J,~> +JcEUeq#l9KJcC<$JcG0 +JcEUeq#l9KJcC<$JcG0 +JcEUeq#l9KJcC<$JcG0 +JcEOcq#l9KJcC<$JcG6>J,~> +JcEOcq#l9KJcC<$JcG6>J,~> +JcEOcq#l9KJcC<$JcG6>J,~> +JcEIaq#l9KJcC<$JcG<@J,~> +JcEIaq#l9KJcC<$JcG<@J,~> +JcEIaq#l9KJcC<$JcG<@J,~> +JcEF`p]Q0JJcC<$JcGBBJ,~> +JcEF`p]Q0JJcC<$JcGBBJ,~> +JcEF`p]Q0JJcC<$JcGBBJ,~> +JcE@^q#l9KJcC<$JcGECJ,~> +JcE@^q#l9KJcC<$JcGECJ,~> +JcE@^q#l9KJcC<$JcGECJ,~> +JcE:\q#l9KJcC<$JcGKEJ,~> +JcE:\q#l9KJcC<$JcGKEJ,~> +JcE:\q#l9KJcC<$JcGKEJ,~> +JcE4Zq#l9KJcC<$JcGQGJ,~> +JcE4Zq#l9KJcC<$JcGQGJ,~> +JcE4Zq#l9KJcC<$JcGQGJ,~> +JcE1Yq#l9KJcC<$JcGTHJ,~> +JcE1Yq#l9KJcC<$JcGTHJ,~> +JcE1Yq#l9KJcC<$JcGTHJ,~> +JcE+Wq#l9KJcC<$JcGZJJ,~> +JcE+Wq#l9KJcC<$JcGZJJ,~> +JcE+Wq#l9KJcC<$JcGZJJ,~> +JcE%Uq#l9KJcC<$JcG`LJ,~> +JcE%Uq#l9KJcC<$JcG`LJ,~> +JcE%Uq#l9KJcC<$JcG`LJ,~> +JcE"Tp]Q0JJcC<$Jc>`MJ,~> +JcE"Tp]Q0JJcC<$Jc>`MJ,~> +JcE"Tp]Q0JJcC<$Jc>`MJ,~> +JcDqRq#l9KJcC<$JcC9~> +JcDqRq#l9KJcC<$JcC9~> +JcDqRq#l9KJcC<$JcC9~> +JcDkPq#l9KJcC<$KE$K~> +JcDkPq#l9KJcC<$KE$K~> +JcDkPq#l9KJcC<$KE$K~> +JcDeNq#l9KJcC<$L&Z]~> +JcDeNq#l9KJcC<$L&Z]~> +JcDeNq#l9KJcC<$L&Z]~> +JcDbMq#l9KJcC<$LAuf~> +JcDbMq#l9KJcC<$LAuf~> +JcDbMq#l9KJcC<$LAuf~> +JcD\Kq#l9KJcC<$M#W#~> +JcD\Kq#l9KJcC<$M#W#~> +JcD\Kq#l9KJcC<$M#W#~> +JcDVIq#l9KJcC<$MZ85~> +JcDVIq#l9KJcC<$MZ85~> +JcDVIq#l9KJcC<$MZ85~> +JcDSHp]Q0JJcC<$N;nG~> +JcDSHp]Q0JJcC<$N;nG~> +JcDSHp]Q0JJcC<$N;nG~> +JcDMFq#l9KJcC<$NW4P~> +JcDMFq#l9KJcC<$NW4P~> +JcDMFq#l9KJcC<$NW4P~> +JcDGDq#l9KJcC<$O8jb~> +JcDGDq#l9KJcC<$O8jb~> +JcDGDq#l9KJcC<$O8jb~> +JcDABq#l9KJcC<$OoKt~> +JcDABq#l9KJcC<$OoKt~> +JcDABq#l9KJcC<$OoKt~> +JcD>Ap]Q0JJcC<$PQ-1~> +JcD>Ap]Q0JJcC<$PQ-1~> +JcD>Ap]Q0JJcC<$PQ-1~> +JcD8?q#l9KJcC<$PlH:~> +JcD8?q#l9KJcC<$PlH:~> +JcD8?q#l9KJcC<$PlH:~> +JcD2=q#l9KJcC<$QN)L~> +JcD2=q#l9KJcC<$QN)L~> +JcD2=q#l9KJcC<$QN)L~> +JcD,;q#l9KJcC<$R/_^~> +JcD,;q#l9KJcC<$R/_^~> +JcD,;q#l9KJcC<$R/_^~> +JcD):q#l9KJcC<$RK%g~> +JcD):q#l9KJcC<$RK%g~> +JcD):q#l9KJcC<$RK%g~> +JcD#8q#l9KJcC<$S,\$~> +JcD#8q#l9KJcC<$S,\$~> +JcD#8q#l9KJcC<$S,\$~> +JcCr6q#l9KJcC<$Sc=6~> +JcCr6q#l9KJcC<$Sc=6~> +JcCr6q#l9KJcC<$Sc=6~> +JcCo5p]Q0JJcC<$TDsH~> +JcCo5p]Q0JJcC<$TDsH~> +JcCo5p]Q0JJcC<$TDsH~> +JcCi3q#l9KJcC<$T`9Q~> +JcCi3q#l9KJcC<$T`9Q~> +JcCi3q#l9KJcC<$T`9Q~> +JcCc1q#l9KJcC<$UAoc~> +JcCc1q#l9KJcC<$UAoc~> +JcCc1q#l9KJcC<$UAoc~> +JcC]/q#l9KJcC<$V#Pu~> +JcC]/q#l9KJcC<$V#Pu~> +JcC]/q#l9KJcC<$V#Pu~> +JcCZ.q#l9KJcC<$V>l)~> +JcCZ.q#l9KJcC<$V>l)~> +JcCZ.q#l9KJcC<$V>l)~> +JcCT,q#l9KJcC<$VuM;~> +JcCT,q#l9KJcC<$VuM;~> +JcCT,q#l9KJcC<$VuM;~> +JcCN*q#l9KJcC<$WW.M~> +JcCN*q#l9KJcC<$WW.M~> +JcCN*q#l9KJcC<$WW.M~> +JcCK)p]Q0JJcC<$X8d_~> +JcCK)p]Q0JJcC<$X8d_~> +JcCK)p]Q0JJcC<$X8d_~> +JcCE'q#l9KJcC<$XT*h~> +JcCE'q#l9KJcC<$XT*h~> +JcCE'q#l9KJcC<$XT*h~> +JcC?%q#l9KJcC<$Y5a%~> +JcC?%q#l9KJcC<$Y5a%~> +JcC?%q#l9KJcC<$Y5a%~> +JcC<$!WN +JcC<$!WN +JcC<$!WN +JcC<$s8VltJcC<$JcE"TJ:~> +JcC<$s8VltJcC<$JcE"TJ:~> +JcC<$s8VltJcC<$JcE"TJ:~> +JcC<$rVuZrJcC<$JcE(VJ:~> +JcC<$rVuZrJcC<$JcE(VJ:~> +JcC<$rVuZrJcC<$JcE(VJ:~> +JcC<$qu?HpJcC<$JcE.XJ:~> +JcC<$qu?HpJcC<$JcE.XJ:~> +JcC<$qu?HpJcC<$JcE.XJ:~> +JcC<$qZ$ +JcC<$qZ$ +JcC<$qZ$ +JcC<$q#C-mJcC<$JcE7[J:~> +JcC<$q#C-mJcC<$JcE7[J:~> +JcC<$q#C-mJcC<$JcE7[J:~> +JcC<$pAapkJcC<$JcE=]J:~> +JcC<$pAapkJcC<$JcE=]J:~> +JcC<$pAapkJcC<$JcE=]J:~> +JcC<$o`+^iJcC<$JcEC_J:~> +JcC<$o`+^iJcC<$JcEC_J:~> +JcC<$o`+^iJcC<$JcEC_J:~> +JcC<$oDeRgJcC<$JcEIaJ:~> +JcC<$oDeRgJcC<$JcEIaJ:~> +JcC<$oDeRgJcC<$JcEIaJ:~> +JcC<$nc/CfJcC<$JcELbJ:~> +JcC<$nc/CfJcC<$JcELbJ:~> +JcC<$nc/CfJcC<$JcELbJ:~> +JcC<$n,N1dJcC<$JcERdJ:~> +JcC<$n,N1dJcC<$JcERdJ:~> +JcC<$n,N1dJcC<$JcERdJ:~> +JcC<$mJltbJcC<$JcEXfJ:~> +JcC<$mJltbJcC<$JcEXfJ:~> +JcC<$mJltbJcC<$JcEXfJ:~> +JcC<$m/QkaJcC<$JcE[gJ:~> +JcC<$m/QkaJcC<$JcE[gJ:~> +JcC<$m/QkaJcC<$JcE[gJ:~> +JcC<$lMpY_JcC<$JcEaiJ:~> +JcC<$lMpY_JcC<$JcEaiJ:~> +JcC<$lMpY_JcC<$JcEaiJ:~> +JcC<$kl:G]JcC<$JcEgkJ:~> +JcC<$kl:G]JcC<$JcEgkJ:~> +JcC<$kl:G]JcC<$JcEgkJ:~> +JcC<$kPt;[JcC<$JcEmmJ:~> +JcC<$kPt;[JcC<$JcEmmJ:~> +JcC<$kPt;[JcC<$JcEmmJ:~> +JcC<$jo>,Zc2Rt-^p8],s8Ds$f9lb9ZN#LUJcCf2J,~> +JcC<$jo>,Zc2Rt-^p8],s8Ds$f9lb9ZN#LUJcCf2J,~> +JcC<$jo>,Zc2Rt-^p8],s8Ds$f9lb9ZN#LUJcCf2J,~> +JcC<$j8\oXdJj6?J,t0'rr`@Qs8N$!L'7GX!TX32s+133s*t~> +JcC<$j8\oXdJj6?J,t0'rr`@Qs8N$!L'7GX!TX32s+133s*t~> +JcC<$j8\oXdJj6CJ,t0'rr`@Qs8N$!L'7GX!TX32s+133s*t~> +JcC<$iW&]Vd/O-P"9J_Ars/ShAsqraJ-5oV_#JucJcCi3J:~> +JcC<$iW&]Vd/O-P"9J_Ars/ShAsqraJ-5oV_#JucJcCi3J:~> +JcC<$iW&]Vd/O-P"9J_Ars/ShAsqraJ-5oV_#JucJcCi3J:~> +JcC<$i;`TUdJj68"9J_krr`9qfDkmN!JU^Y"Mk%gs+133s*t~> +JcC<$i;`TUdJj68"9J_krr`9qfDkmN!JU^Y"Mk%gs+133s*t~> +JcC<$i;`TUdJj68"9J_krr`9qfDkmN!JU^Y"Mk%gs+133s*t~> +JcC<$hZ*BSe,KME"ASmus+&`$rr3!n"9J_^s+13$s,d82~> +JcC<$hZ*BSe,KME"ASmus+&`$rr3!n"9J_^s+13$s,d82~> +JcC<$hZ*BSe,KME"ASmus+&`$rr3!n"9J_^s+13$s,d82~> +JcC<$h#I0Qf)Gd,"9eq$s+\>hrr3#T"TJUUs+131s+(~> +JcC<$h#I0Qf)Gd,"9eq$s+\>hrr3#T"TJUUs+131s+(~> +JcC<$h#I0Qf)Gd,"9eq(s+\>hrr3#T"TJUUs+131s+(~> +JcC<$g].$Of`(uX"9\kZZCq6rrrKD.!X+qkJcC<$O8j`~> +JcC<$g].$Of`(uX"9\kZZCq6rrrKD.!X+qkJcC<$O8j`~> +JcC<$g].$Of`(uX"9\kZZD@O!rrKD.!X+qkJcC<$O8j`~> +JcC<$g&LjNg&D(b"9SeBB)hf/!G2H9"P<[)s+132s+#~> +JcC<$g&LjNg&D(b"9SeBB)hf/!G2H9"P<[)s+132s+#~> +JcC<$g&LjNg&D(b"9SeBB)hf/!G2H9"P<[)s+132s+#~> +JcC<$fDkXLqu?!cp\t9Z"9\j>:$VcWrrMBfrrdoQJcC`0J:~> +JcC<$fDkXLqu?!cp\t9Z"9\j>:$VcWrrMBfrrdoQJcC`0J:~> +JcC<$fDkXLqu?!cp\t9Z"9\j>:$VcWrrMBfrrdoQJcC`0J:~> +JcC<$ec5FJhZ!Vl"TJT*ZN'k&!O;h0"I]:@s+131s+$~> +JcC<$ec5FJhZ!Vl"TJT*ZN'k&!O;h0"I]:@s+131s+$~> +JcC<$ec5FJhZ!Vl"TJT*ZN'k&!O;h0"I]:@s+131s+$~> +JcC<$eGo:Hi;Wh."9J^ +JcC<$eGo:Hi;Wh."9J^ +JcC<$eGo:Hi;Wh."9J^ +JcC<$df9+GiW&l[!S@ALrrMBfrrdoQJcC]/JH~> +JcC<$df9+GiW&l[!S@ALrrMBfrrdoQJcC]/JH~> +JcC<$df9+GiW&l[!S@ALrrMBfrrdoQJcC]/JH~> +JcC<$d/WnEjSo84"9J^ +JcC<$d/WnEjSo84"9J^ +JcC<$d/WnEjSo84"9J^ +JcC<$cN!\Ck5PIM"9J_Xs82fsAcr/ +JcC<$cN!\Ck5PIM"9J_Xs82fsAcr/ +JcC<$cN!\Ck5PIM"9J_Xs82fsAcr/ +JcC<$c2[SBkPkQW"9AZ*qu6]^"TJT,s4<\=JcC<$O8jb~> +JcC<$c2[SBkPkQW"9AZ*qu6]^"TJT,s4<\=JcC<$O8jb~> +JcC<$c2[SBkPkQW"9AZ*qu6]^"TJT,s4<\=JcC<$O8jb~> +JcC<$bQ%A@lMgnF"9J^\s82fs^]XcCLAuf(JcC<$NrOY~> +JcC<$bQ%A@lMgnF"9J^\s82fs^]XcCLAuf(JcC<$NrOY~> +JcC<$bQ%A@lMgnF"9J^\s82fs^]XcCLAuf(JcC<$NrOY~> +JcC<$aoD/>m/I*l"9J_As82fsTEGB#At\GhJcC<$NrOY~> +JcC<$aoD/>m/I*l"9J_As82fsTEGB#At\GhJcC<$NrOY~> +JcC<$aoD/>m/I*l"9J_As82fsU]^f'Au+_lJcC<$NrOY~> +JcC<$aT)# +JcC<$aT)# +JcC<$aT)# +JcC<$`rGi;JcC<$JcG$8JG~> +JcC<$`rGi;JcC<$JcG$8JG~> +JcC<$`rGi;JcC<$JcG$8JG~> +JcC<$`;fW9g&DTQ^mP?*h.?eElMnY3"GZsRrrUf&"9Sd=TEP2r!rq9`rWIfPJcE@^J,~> +JcC<$`;fW9g&DTQ^mP?*h.?eElMnY3"GZsRrrUf&"9Sd=TEP2r!rq9`rWIfPJcE@^J,~> +JcC<$`;fW9g&DTQ^mP?*h.?eElMnY3"GZsRrrUf&"9Sd=U]gW!!rq9`rWIfPJcE@^J,~> +JcC<$_Z0E7g]%>*AcrPG^uPHf"GX5Bs1ec1s8Ds"^]_IQ#lgP#RFb.9nc&all3+p&JcC<$]DmB~> +JcC<$_Z0E7g]%>*AcrPG^uPHf"GX5Bs1ec1s8Ds"^]_IQ#lgP#RFb.9nc&all3+p&JcC<$]DmB~> +JcC<$_Z0E7g]%>*AcrPG^uPHj"GX5Bs1ec5s8Ds"^]_IQ#lg\'RFb.9nc&all3+p&JcC<$]DmB~> +JcC<$_>j<6gAh0UrVum#!UB^brrN +JcC<$_>j<6gAh0UrVum#!UB^brrN +JcC<$_>j<6gAh0UrVum#!UB^brrN +JcC<$^]4*4h#IBWrVum#rVum#r;ZeIrVum#s8N8<"GX4ts+13$s1//[~> +JcC<$^]4*4h#IBWrVum#rVum#r;ZeIrVum#s8N8<"GX4ts+13$s1//[~> +JcC<$^]4*4h#IBWrVum#rVum#r;ZeIrVum#s8N8<"GX4ts+13$s1//[~> +JcC<$^&Rm2hZ*TYrVum#rVum#q#:E2J-5lUs8W*$J-:W,JcC<$\Gq)~> +JcC<$^&Rm2hZ*TYrVum#rVum#q#:E2J-5lUs8W*$J-:W,JcC<$\Gq)~> +JcC<$^&Rm2hZ*TYrVum#rVum#q#:E2J-5lUs8W*$J-:W,JcC<$\Gq)~> +JcC<$]`7a0i;`f[rVum#rVum#qu6iiTM;*E"9AZ*s8N,b"9J_ks+13$s1//[~> +JcC<$]`7a0i;`f[rVum#rVum#qu6iiTM;*E"9AZ*s8N,b"9J_ks+13$s1//[~> +JcC<$]`7a0i;`f[rVum#rVum#qu6iiUeRZM"9AZ*s8N,b"9J_ks+13$s1//[~> +JcC<$])VR/iW&o\rVum#rVum#r;Qob9n;d6!WN9'"TSN%"GWQPJH(3#JcE:\J:~> +JcC<$])VR/iW&o\rVum#rVum#r;Qob9n;d6!WN9'"TSN%"GWQPJH(3#JcE:\J:~> +JcC<$])VR/iW&o\rVum#rVum#r;Qob9n;d6!WN9'"TSN%"GW]TJH(3#JcE:\J:~> +JcC<$\Gu@-j8],^rVum#rVum#r;Qk2"S)Nls8N6%s8Tk;s+UZ^s+13$s185\~> +JcC<$\Gu@-j8],^rVum#rVum#r;Qk2"S)Nls8N6%s8Tk;s+UZ^s+13$s185\~> +JcC<$\Gu@-j8],^rVum#rVum#r;Qk2"S)Nls8N6%s8Tk;s+UZ^s+13$s185\~> +JcC<$[f?.+q#C9qo)J^mrVum#rVum#r;Zd"rVum#"96uGs8W*$J-=L(JcC<$]DmD~> +JcC<$[f?.+q#C9qo)J^mrVum#rVum#r;Zd"rVum#"96uGs8W*$J-=L(JcC<$]DmD~> +JcC<$[f?.+q#C9qo)J^mrVum#rVum#r;Zd"rVum#"96uKs8W*$J-=L(JcC<$]DmD~> +JcC<$[K$")qu?QsoD\jC"9J_rrrW5c"9J_krrW5c"9J_ks8N$&L'41LlC\7_"J>nfs8W*"l3%.k +_#JucJcEC_J,~> +JcC<$[K$")qu?QsoD\jC"9J_rrrW5c"9J_krrW5c"9J_ks8N$&L'41LlC\7_"J>nfs8W*"l3%.k +_#JucJcEC_J,~> +JcC<$[K$")qu?QsoD\jC"9J_rrrW5c"9J_krrW5c"9J_ks8N$&L'4=PlD+Oc"Jc1js8W*"l3%.k +_#JucJcEC_J,~> +JcC<$ZiBh(rVu]sp&Fpms8W$#s8W$#rVm,fL'2,(s-X#h"TSK&iro;`JcC<$]`3N~> +JcC<$ZiBh(rVu]sp&Fpms8W$#s8W$#rVm,fL'2,(s-X#h"TSK&iro;`JcC<$]`3N~> +JcC<$ZiBh(rVu]sp&Fpms8W$#s8W$#rVm,fL'2,(s-X#h"TSK&iro;`JcC<$]`3N~> +JcC<$Z2aV&s8VouJcC<$M#Vu~> +JcC<$Z2aV&s8VouJcC<$M#Vu~> +JcC<$Z2aV&s8VouJcC<$M#Vu~> +JcC<$YQ+.rJcC<$M#W#~> +JcC<$YQ+.rJcC<$M#W#~> +JcC<$YQ+.rJcC<$M#W#~> +JcC<$Y5e(rJcC<$M#W#~> +JcC<$Y5e(rJcC<$M#W#~> +JcC<$Y5e(rJcC<$M#W#~> +JcC<$XT.qrJcC<$M#W#~> +JcC<$XT.qrJcC<$M#W#~> +JcC<$XT.qrJcC<$M#W#~> +JcC<$WrMerJcC<$M#W#~> +JcC<$WrMerJcC<$M#W#~> +JcC<$WrMerJcC<$M#W#~> +JcC<$WW2_rrr;csJcC<$PQ-.~> +JcC<$WW2_rrr;csJcC<$PQ-.~> +JcC<$WW2_rrr;csJcC<$PQ-.~> +JcC<$VuQPq!WN;t"G-T(s-3P6~> +JcC<$VuQPq!WN;t"G-T(s-3P6~> +JcC<$VuQPq!WN;t"G-T(s-3P6~> +JcC<$VZ6&eJcC<$Q2cA~> +JcC<$VZ6&eJcC<$Q2cA~> +JcC<$VZ6&eJcC<$Q2cA~> +JcC<$VZ6Z!!WN;m"G-T(s-E\8~> +JcC<$VZ6Z!!WN;m"G-T(s-E\8~> +JcC<$VZ6Z!!WN;m"G-T(s-E\8~> +JcC<$VZ6Z!s8VWms8W$#Z2Y(!TOn=$T]?''s+14As*t~> +JcC<$VZ6Z!s8VWms8W$#Z2Y(!TOn=$T]?''s+14As*t~> +JcC<$VZ6Z!s8VWms8W$#Z2Y(!Uh0a(UuVK+s+14As*t~> +JcC<$VZ6Z!rVuNns8Vs!Zi:0[9ptPO"TQ7?_#JucJcGBBJH~> +JcC<$VZ6Z!rVuNns8Vs!Zi:0[9ptPO"TQ7?_#JucJcGBBJH~> +JcC<$VZ6Z!rVuNns8Vs!Zi:0[9ptPO"TQ7?_#JucJcGBBJH~> +JcC<$VZ6Z!qu?Eos8Vlt[Jp?\"JGenrr^jUZN#LUJcGECJH~> +JcC<$VZ6Z!qu?Eos8Vlt[Jp?\"JGenrr^jUZN#LUJcGECJH~> +JcC<$VZ6Z!qu?Eos8Vlt[Jp?\"Jl(rrr^jUZN#LUJcGECJH~> +JcC<$VZ6Z!qZ$ +JcC<$VZ6Z!qZ$ +JcC<$VZ6Z!qZ$ +JcC<$o)IJJgAh0Uq#Bje[f6GA"P<\Nrr_Nh:&feEJcGHDJ:~> +JcC<$o)IJJgAh0Uq#Bje[f6GA"P<\Nrr_Nh:&feEJcGHDJ:~> +JcC<$o)IJJgAh0Uq#Bje[f6GA"P<\Nrr_Nh:&feEJcGHDJ:~> +JcC<$!WN;="RH*e"SD`c"LnC3f)u*Ws7uZsAd#pLJcC<$p]#a~> +JcC<$!WN;="RH*e"SD`c"LnC3f)u*Ws7uZsAd#pLJcC<$p]#a~> +JcC<$!WN;="RH*e"SD`c"LnC3f)u*Ws7uZsAd#pLJcC<$p]#a~> +JcCK)Zioq!rWMflo`Vc("(h[js7uZsTEJm,JcC<$p]#d~> +JcCK)Zioq!rWMflo`Vc("(h[js7uZsTEJm,JcC<$p]#d~> +JcCK)Zioq!rWMflo`Vc("(h[js7uZsU]b<0JcC<$p]#d~> +JcC`0V?H\orWMckp&qo*!U9dh"Mk'5rrL^S!X.Q`JcC<$q#>j~> +JcC`0V?H\orWMckp&qo*!U9dh"Mk'5rrL^S!X.Q`JcC<$q#>j~> +JcC`0V?H\orWMckp&qo*!U9dh"Mk'5rrL^S!X.Q`JcC<$q#>j~> +JcCu7hZVa7hZWuZrWM]ip]UQqqujk9!Peg>"Mk'5rrM-_!X-==JcC<$q#>m~> +JcCu7hZVa7hZWuZrWM]ip]UQqqujk9!Peg>"Mk'5rrM-_!X-==JcC<$q#>m~> +JcCu7hZVa7hZWuZrWM]ip]UQqqujk9!Peg>"Mk'5rrM-_!X-==JcC<$q#>m~> +JcD2=k6/U#k615Qmf^Q.!LX&l"QTOXrrMWm!X+8XJcC<$q#>m~> +JcD2=k6/U#k615Qmf^Q.!LX&l"QTOXrrMWm!X+8XJcC<$q#>m~> +JcD2=k6/U#k615Qmf^Q.!LX&l"QTOXrrMWm!X+8XJcC<$q#>m~> +JcD>AkleBnklgPVn-$Z/!JU^Y"QTOWs8N3&JH(3#JcGNFJH~> +JcD>AkleBnklgPVn-$Z/!JU^Y"QTOWs8N3&JH(3#JcGNFJH~> +JcD>AkleBnklgPVn-$Z/!JU^Y"QTOWs8N3&JH(3#JcGNFJH~> +JcDJElia3clicq[nH?f1rWMrprWIfPJcGKEJH~> +JcDJElia3clicq[nH?f1rWMrprWIfPJcGKEJH~> +JcDJElia3clicq[nH?f1rWMrprWIfPJcGKEJH~> +JcDSHn-#-Yn-&C`qZQlto`WM=rWMrprWIfPJcGKEJH~> +JcDSHn-#-Yn-&C`qZQlto`WM=rWMrprWIfPJcGKEJH~> +JcDSHn-#-Yn-&C`qZQlto`WM=rWMrprWIfPJcGKEJH~> +JcD_LncXpOnc\^equluuo*!A=rWMrprWIfPJcGKEJH~> +JcD_LncXpOnc\^equluuo*!A=rWMrprWIfPJcGKEJH~> +JcD_LncXpOnc\^equluuo*!A=rWMrprWIfPJcGKEJH~> +JcDkPncXXGnc\ghr<3*!nc[;=rWMrprWIfPJcGKEJH~> +JcDkPncXXGnc\ghr<3*!nc[;=rWMrprWIfPJcGKEJH~> +JcDkPncXXGnc\ghr<3*!nc[;=rWMrprWIfPJcGKEJH~> +JcE"TncXODr;Z +JcE"TncXODr;Z +JcE"TncXODr;Z +JcE.XnH=FCpAa4Wqu?Qsd/O,s"9AZ*q#:B["9J^\s+13$s7lVE~> +JcE.XnH=FCpAa4Wqu?Qsd/O,s"9AZ*q#:B["9J^\s+13$s7lVE~> +JcE.XnH=FCpAa4Wqu?Qsd/O,s"9AZ*q#:B["9J^\s+13$s7lVE~> +JcE7[ncXODmf2PTq>^Brd/O-7"9J_ds7uZqirfDdRK%j +JcE7[ncXODmf2PTq>^Brd/O-7"9J_ds7uZqirfDdRK%j +JcE7[ncXODmf2PTq>^Brd/O-7"9J_ds7uZqirfDdRK%j +JcE=]oE9aFk5XfOqu?Qsd/O-^"9J_ds7uZqh#mc^_#JucJcGNFJH~> +JcE=]oE9aFk5XfOqu?Qsd/O-^"9J_ds7uZqh#mc^_#JucJcGNFJH~> +JcE=]oE9aFk5XfOqu?Qsd/O-^"9J_ds7uZqh#mc^_#JucJcGNFJH~> +JcEF`o`TjGrWM3[joj'2!U9dh"Mk'5rrKnm~> +JcEF`o`TjGrWM3[joj'2!U9dh"Mk'5rrKnm~> +JcEF`o`TjGrWM3[joj'2!U9dh"Mk'5rrKnm~> +JcEOcp&osHrVuj"h>cO=ec,_`"I];crr\YlB)dG^JcGKEJH~> +JcEOcp&osHrVuj"h>cO=ec,_`"I];crr\YlB)dG^JcGKEJH~> +JcEOcp&osHrVuj"h>cO=ec,_`"I];crr\YlB)dG^JcGKEJH~> +JcEUepB6'IqZ$NtgAg: +JcEUepB6'IqZ$NtgAg: +JcEUepB6'IqZ$NtgAg: +JcE^hp&osHq#C +JcE^hp&osHq#C +JcE^hp&osHq#C +JcEgkp&osHp&G!oec4k:jT#/]q#:HP"GZsRrr[uYh>`'+JcGHDJH~> +JcEgkp&osHp&G!oec4k:jT#/]q#:HP"GZsRrr[uYh>`'+JcGHDJH~> +JcEgkp&osHp&G!oec4k:jT#/]q#:HP"GZsRrr[uYh>`'+JcGHDJH~> +JcEpnp&osHo`+pocig"P<\Prr^jUZN#LUJcGECJH~> +JcEpnp&osHo`+pocig"P<\Prr^jUZN#LUJcGECJH~> +JcEpnp&osHo`+pocik"P<\Prr^jUZN#LUJcGECJH~> +JcF!pp&osHo)J^mc2[89s8Vs!lMpecpAYH)"MjR-lBtA^s+13$s7H>A~> +JcF!pp&osHo)J^mc2[89s8Vs!lMpecpAYH)"MjR-lBtA^s+13$s7H>A~> +JcF!pp&osHo)J^mc2[89s8Vs!lMpecpAYH)"MjR-lBtA^s+13$s7H>A~> +JcF*sp&osHn,NCjb5_):s8Vltm/R"eo`#0VR8!frZLRsGs+14As+(~> +JcF*sp&osHn,NCjb5_):s8Vltm/R"eo`#0VR8!frZLRsGs+14As+(~> +JcF*sp&osHn,NCjb5_):s8Vltm/R"eo`#0VR8!frZLRsGs+14As+(~> +JcF0upB6'Im/R(ga8bN0m/R"eJcC<$hZ&,~> +JcF0upB6'Im/R(ga8bN0m/R"eJcC<$hZ&,~> +JcF0upB6'Im/R(ga8bN0m/R"eJcC<$hZ&,~> +JcF7"p]Q0Jl2Ubd`;f<0mJm+fJcC<$h>`#~> +JcF7"p]Q0Jl2Ubd`;f<0mJm+fJcC<$h>`#~> +JcF7"p]Q0Jl2Ubd`;f<0mJm+fJcC<$h>`#~> +JcF@%pB6'IkPtPb_Z000mJm+fJcC<$h>`#~> +JcF@%pB6'IkPtPb_Z000mJm+fJcC<$h>`#~> +JcF@%pB6'IkPtPb_Z000mJm+fJcC<$h>`#~> +JcFF'pB6'Ikl:Vb^Amg.mJm+fJcC<$h>`#~> +JcFF'pB6'Ikl:Vb^Amg.mJm+fJcC<$h>`#~> +JcFF'pB6'Ikl:Vb^Amg.mJm+fJcC<$h>`#~> +JcFL)pB6'Ik5YD`]`7[.mf34gJcC<$h#Do~> +JcFL)pB6'Ik5YD`]`7[.mf34gJcC<$h#Do~> +JcFL)pB6'Ik5YD`]`7[.mf34gJcC<$h#Do~> +JcFR+p]Q0Jj8])]\c;F-rr;m!p](0pJcC<$h#Dn~> +JcFR+p]Q0Jj8])]\c;F-rr;m!p](0pJcC<$h#Dn~> +JcFR+p]Q0Jj8])]\c;F-rr;m!p](0pJcC<$h#Dn~> +JcFX-p]Q0JiW&l[\Gu"#qZ$KsJcC<$g])g~> +JcFX-p]Q0JiW&l[\Gu"#qZ$KsJcC<$g])g~> +JcFX-p]Q0JiW&l[\Gu"#qZ$KsJcC<$g])g~> +JcF^/p]Q0JhuEZY\,Yq#qZ$KsJcC<$g])g~> +JcF^/p]Q0JhuEZY\,Yq#qZ$KsJcC<$g])g~> +JcF^/p]Q0JhuEZY\,Yq#qZ$KsJcC<$g])g~> +JcFd1p]Q0JN;rJPr;Z]uJcC<$gAc^~> +JcFd1p]Q0JN;rJPr;Z]uJcC<$gAc^~> +JcFd1p]Q0JN;rJPr;Z]uJcC<$gAc^~> +JcFj3p]Q0JM?!JVrVug!rVucuJcC<$gAc^~> +JcFj3p]Q0JM?!JVrVug!rVucuJcC<$gAc^~> +JcFj3p]Q0JM?!JVrVug!rVucuJcC<$gAc^~> +JcFp5p]Q0JL]@8TrVuEkJcC<$h#Dp~> +JcFp5p]Q0JL]@8TrVuEkJcC<$h#Dp~> +JcFp5p]Q0JL]@8TrVuEkJcC<$h#Dp~> +JcG!7p]Q0JK`CuRrVuEkJcC<$h#Dp~> +JcG!7p]Q0JK`CuRrVuEkJcC<$h#Dp~> +JcG!7p]Q0JK`CuRrVuEkJcC<$h#Dp~> +JcG'9p]Q0JK)b'`$~> +JcG'9p]Q0JK)b'`$~> +JcG'9p]Q0JK)b'`$~> +JcG-;p]Q0JJcGcMnc\pkr<.]OJcFR+JH~> +JcG-;p]Q0JJcGcMnc\pkr<.]OJcFR+JH~> +JcG-;p]Q0JJcGcMnc\pkr<.]OJcFR+JH~> +JcG0 +JcG0 +JcG0 +JcG6>q#l9KeGoOOVuQ\us8Vs!rVug!JcC<$h>`"~> +JcG6>q#l9KeGoOOVuQ\us8Vs!rVug!JcC<$h>`"~> +JcG6>q#l9KeGoOOVuQ\us8Vs!rVug!JcC<$h>`"~> +JcG<@q#l9Kec5UOT)\EcJcC<$h>`!~> +JcG<@q#l9Kec5UOT)\EcJcC<$h>`!~> +JcG<@q#l9Kec5UOT)\EcJcC<$h>`!~> +JcG?Aq#l9KeGoLNSH& +JcG?Aq#l9KeGoLNSH& +JcG?Aq#l9KeGoLNSH& +JcGECq#l9Kdf9:LSH&![JcC<$jo9l~> +JcGECq#l9Kdf9:LSH&![JcC<$jo9l~> +JcGECq#l9Kdf9:LSH&![JcC<$jo9l~> +JcGHDq?2BLd/X(JRK)d[JcC<$jo9l~> +JcGHDq?2BLd/X(JRK)d[JcC<$jo9l~> +JcGHDq?2BLd/X(JRK)d[JcC<$jo9l~> +JcGNFq#l9Kci +JcGNFq#l9Kci +JcGNFq#l9Kci +JcGTHq#l9Ke,TCMrr;s#R/d0h!WN;r"TAAu"G-T(s6fo;~> +JcGTHq#l9Ke,TCMrr;s#R/d0h!WN;r"TAAu"G-T(s6fo;~> +JcGTHq#l9Ke,TCMrr;s#R/d0h!WN;r"TAAu"G-T(s6fo;~> +JcGWIq#l9Kdf9:L!WN9'"TOefrri?$pB:Nrp]Q0JJcG6>J:~> +JcGWIq#l9Kdf9:L!WN9'"TOefrri?$pB:Nrp]Q0JJcG6>J:~> +JcGWIq#l9Kdf9:L!WN9'"TOefrri?$pB:Nrp]Q0JJcG6>J:~> +JcG]Kq#l9Kbl@\GQ2gjerVuTp!WN;u"G-T(s7$&=~> +JcG]Kq#l9Kbl@\GQ2gjerVuTp!WN;u"G-T(s7$&=~> +JcG]Kq#l9Kbl@\GQ2gjerVuTp!WN;u"G-T(s7$&=~> +JcGcMq#l9Kb5_JEQ2gjequ?'eJcC<$nc+,~> +JcGcMq#l9Kb5_JEQ2gjequ?'eJcC<$nc+,~> +JcGcMq#l9Kb5_JEQ2gjequ?'eJcC<$nc+,~> +Jc>cN"Sr7Ps2k<@"I9#e"Sr)l"TJH""G-T(s7-,>~> +Jc>cN"Sr7Ps2k<@"I9#e"Sr)l"TJH""G-T(s7-,>~> +Jc>cN"Sr7Ps2k<@"I9#e"Sr)l"TJH""G-T(s7-,>~> +K)bWLJcEdjrre_hrWMooq#p]sr<.]OJcG9?JF~> +K)bWLJcEdjrre_hrWMooq#p]sr<.]OJcG9?JF~> +K)bWLJcEdjrre_hrWMooq#p]sr<.]OJcG9?JF~> +KE(cNJcEgkrWJPerWMlnq?6ftr<.]OJcG9?JF~> +KE(cNJcEgkrWJPerWMlnq?6ftr<.]OJcG9?JF~> +KE(cNJcEgkrWJPerWMlnq?6ftr<.]OJcG9?JF~> +K`ClOJcEdjrWJPerWMflo`TjGJcG9?JH~> +K`ClOJcEdjrWJPerWMflo`TjGJcG9?JH~> +K`ClOJcEdjrWJPerWMflo`TjGJcG9?JH~> +LB%)QJcEpnrWN6#rWJPerWM`jp]UNpquhTNJcGTHJH~> +LB%)QJcEpnrWN6#rWJPerWM`jp]UNpquhTNJcGTHJH~> +LB%)QJcEpnrWN6#rWJPerWM`jp]UNpquhTNJcGTHJH~> +L]@2RJcFa0rWMTfrWJ>_rWM`jpB1Ns"S`+Ns+14Js+'~> +L]@2RJcFa0rWMTfrWJ>_rWM`jpB1Ns"S`+Ns+14Js+'~> +L]@2RJcFa0rWMTfrWJ>_rWM`jpB1Ns"S`+Ns+14Js+'~> +M#[;SJcFa0r<2KerWJDarrhZfmKA+@JcGZJJ:~> +M#[;SJcFa0r<2KerWJDarrhZfmKA+@JcGZJJ:~> +M#[;SJcFa0r<2KerWJDarrhZfmKA+@JcGZJJ:~> +MZJcC9~> +MZJcC9~> +MZJcC9~> +MuWVVJcFX-r<2KerWJDarrhNbq#pZrp&osHK`?T~> +MuWVVJcFX-r<2KerWJDarrhNbq#pZrp&osHK`?T~> +MuWVVJcFX-r<2KerWJDarrhNbq#pZrp&osHK`?T~> +NW8eWJcFU,r<2QgrrdoQnc/IhrVuQoec,g5^p8],s8Ds$f9lb9ZN#LU_#Jr~> +NW8eWJcFU,r<2QgrrdoQnc/IhrVuQoec,g5^p8],s8Ds$f9lb9ZN#LU_#Jr~> +NW8eWJcFU,r<2QgrrdoQnc/IhrVuQoec,g5^p8],s8Ds$f9lb9ZN#LU_#Jr~> +NrSqYJcFO*r<2QgrrdoQnGiChrVuQofDblEJ,t0'rr`@Qs8N$!L'7GX!TX32s2"_c~> +NrSqYJcFO*r<2QgrrdoQnGiChrVuQofDblEJ,t0'rr`@Qs8N$!L'7GX!TX32s2"_c~> +NrSqYJcFO*r<2QgrrdoQnGiChrVuQofDblIJ,t0'rr`@Qs8N$!L'7GX!TX32s2"_c~> +O8o%ZJcFL)r<2QgrrdoQn,N%`rVug!ec,ZU"9J_Ars/ShAsqraJ-5oV_#Juc_>f%~> +O8o%ZJcFL)r<2QgrrdoQn,N%`rVug!ec,ZU"9J_Ars/ShAsqraJ-5oV_#Juc_>f%~> +O8o%ZJcFL)r<2QgrrdoQn,N%`rVug!ec,ZU"9J_Ars/ShAsqraJ-5oV_#Juc_>f%~> +OoP7\JcFF'r<2QgrrdoQmf2t`rVug!ec,Z<"9J_krr`9qfDkmN!JU^Y"Mk%gs2"_c~> +OoP7\JcFF'r<2QgrrdoQmf2t`rVug!ec,Z<"9J_krr`9qfDkmN!JU^Y"Mk%gs2"_c~> +OoP7\JcFF'r<2QgrrdoQmf2t`rVug!ec,Z<"9J_krr`9qfDkmN!JU^Y"Mk%gs2"_c~> +P5k@]JcFC&r<2QgrrdoQmf2t`rVug!ec,_G"ASmus+&`$rr3!n"9J_^s+13ds+(~> +P5k@]JcFC&r<2QgrrdoQmf2t`rVug!ec,_G"ASmus+&`$rr3!n"9J_^s+13ds+(~> +P5k@]JcFC&r<2QgrrdoQmf2t`rVug!ec,_G"ASmus+&`$rr3!n"9J_^s+13ds+(~> +PQ1I^JcF@%r<2QgrrdoQli6b`rVug!f)Gd,"9eq$s+\>hrr3#T"TJUUs1eSa~> +PQ1I^JcF@%r<2QgrrdoQli6b`rVug!f)Gd,"9eq$s+\>hrr3#T"TJUUs1eSa~> +PQ1I^JcF@%r<2QgrrdoQli6b`rVug!f)Gd,"9eq(s+\>hrr3#T"TJUUs1eSa~> +Q2g[`JcF:#r<2ZjrWJGbrWLmRoE53p"Si2XrrKD."9d>^T`=uj!O;h0"I]:@s1nYb~> +Q2g[`JcF:#r<2ZjrWJGbrWLmRoE53p"Si2XrrKD."9d>^T`=uj!O;h0"I]:@s1nYb~> +Q2g[`JcF:#r<2ZjrWJGbrWLmRoE53p"Si2XrrKD."9d>^V#UDn!O;h0"I]:@s1nYb~> +QN-daJcF7"r<2ZjrWJGbrWLjQklfuF!G2H:"MeXLr;Qe0"9J_Xs+13cs+(~> +QN-daJcF7"r<2ZjrWJGbrWLjQklfuF!G2H:"MeXLr;Qe0"9J_Xs+13cs+(~> +QN-daJcF7"r<2ZjrWJGbrWLjQklfuF!G2H:"MeXLr;Qe0"9J_Xs+13cs+(~> +QiHmbJcF4!r<2ZjrWJGbrWLgPklg&H!U9dj"D1Bns8Drul3.+iJcEIaJ:~> +QiHmbJcF4!r<2ZjrWJGbrWLgPklg&H!U9dj"D1Bns8Drul3.+iJcEIaJ:~> +QiHmbJcF4!r<2ZjrWJGbrWLgPklg&H!U9dj"D1Bns8Drul3.+iJcEIaJ:~> +R/d$dJcF-tr<2cmrWJ>_rWLaNlNH8J!Pej<"9Gh.r;Qf'"9J^os+13bs+(~> +R/d$dJcF-tr<2cmrWJ>_rWLaNlNH8J!Pej<"9Gh.r;Qf'"9J^os+13bs+(~> +R/d$dJcF-tr<2cmrWJ>_rWLaNlNH8J!Pej<"9Gh.r;Qf'"9J^os+13bs+(~> +RK*-eJcF*sr<2cmrWJ>_rWL^MlicAK!It:S"D7]2rrH^7!X.-TJcELbJ:~> +RK*-eJcF*sr<2cmrWJ>_rWL^MlicAK!It:S"D7]2rrH^7!X.-TJcELbJ:~> +RK*-eJcF*sr<2cmrWJ>_rWL^MlicAK!It:S"D7]2rrH^7!X.-TJcELbJ:~> +S,` +S,` +S,` +SH&EgJcF$qr<.`PrrgXIk61,N!S7GU"D7]2rrKD.!X+qkJcEIaJH~> +SH&EgJcF$qr<.`PrrgXIk61,N!S7GU"D7]2rrKD.!X+qkJcEIaJH~> +SH&EgJcF$qr<.`PrrgXIk61,N!S7GU"D7]2rrKD.!X+qkJcEIaJH~> +ScANhJcF!pr<.`PrrgUHncT!n"Si2drrJMj!X.-Tqu6\/"9J_Xs+13as+(~> +ScANhJcF!pr<.`PrrgUHncT!n"Si2drrJMj!X.-Tqu6\/"9J_Xs+13as+(~> +ScANhJcF!pr<.`PrrgUHncT!n"Si2drrJMj!X.-Tqu6\/"9J_Xs+13as+(~> +T)\ZjJcEpnr<.`PrrgOFklgAQ!DN[t"TSB!!U9gf"9\\URK%j<_#Jr~> +T)\ZjJcEpnr<.`PrrgOFklgAQ!DN[t"TSB!!U9gf"9\\URK%j<_#Jr~> +T)\ZjJcEpnr<.`PrrgOFklgAQ!DN[t"TSB!!U9gf"9\\URK%j<_#Jr~> +TE"ckJcEmmr<.`PrrgLEqZHs""Si3"s8<)frrM-_!X+8Xqu6]4"9\j^s+(-#s1eSa~> +TE"ckJcEmmr<.`PrrgLEqZHs""Si3"s8<)frrM-_!X+8Xqu6]4"9\j^s+(-#s1eSa~> +TE"ckJcEmmr<.`PrrgLEqZHs""Si3"s8<)frrM-_!X+8Xqu6]4"9\j^s+(-#s1eSa~> +T`=llJcEjlr<.`PrrgIDqZQs!q?6ftr<2Nf!O;h0"Mk'7rrJbq"9`>0lMlG8^]/h~> +T`=llJcEjlr<.`PrrgIDqZQs!q?6ftr<2Nf!O;h0"Mk'7rrJbq"9`>0lMlG8^]/h~> +T`=llJcEjlr<.`PrrgIDqZQs!q?6ftr<2Nf!O;h0"Mk'7rrJnu"9`>4lMlG8^]/h~> +U&XumJcEgkr<2iorreMbrWL7@qZQouqum$!r<2Nf!G2H9"R?$arrh-\9u-d[s1SG_~> +U&XumJcEgkr<2iorreMbrWL7@qZQouqum$!r<2Nf!G2H9"R?$arrh-\9u-d[s1SG_~> +U&XumJcEgkr<2iorreMbrWL7@qZQouqum$!r<2Nf!G2H9"R?$arrh-\9u-d[s1SG_~> +UAt)nJcEdjr<2iorreMbrWL4?qZQoup&osHRK%g~> +UAt)nJcEdjr<2iorreMbrWL4?qZQoup&osHRK%g~> +UAt)nJcEdjr<2iorreMbrWL4?qZQoup&osHRK%g~> +U]:2oJcEair<2iorreMbrWL1>qZQoup]UQqr<.]OT`9N~> +U]:2oJcEair<2iorreMbrWL1>qZQoup]UQqr<.]OT`9N~> +U]:2oJcEair<2iorreMbrWL1>qZQoup]UQqr<.]OT`9N~> +V#U;pJcE^hr<2rrrWJ>_rWL.=qZQs!p&kEr"T8ISs.KCB~> +V#U;pJcE^hr<2rrrWJ>_rWL.=qZQs!p&kEr"T8ISs.KCB~> +V#U;pJcE^hr<2rrrWJ>_rWL.=qZQs!p&kEr"T8ISs.KCB~> +VZ6JqJcE[gr<2rrrWJ>_rWL+ +VZ6JqJcE[gr<2rrrWJ>_rWL+ +VZ6JqJcE[gr<2rrrWJ>_rWL+ +VuQSrJcEXfr<3&urWIfPb5_;@r;ZEmrVucuJcDbMJ=~> +VuQSrJcEXfr<3&urWIfPb5_;@r;ZEmrVucuJcDbMJ=~> +VuQSrJcEXfr<3&urWIfPb5_;@r;ZEmrVucuJcDbMJ=~> +W;l\sJcEUer<3&urWIfPaoD2?qu?Bns8Vism/IUd^mP?*h.?eElMnY3"GZsRrrUf&"9Sd=TEP2r +!rq9`rWIfPkl6/~> +W;l\sJcEUer<3&urWIfPaoD2?qu?Bns8Vism/IUd^mP?*h.?eElMnY3"GZsRrrUf&"9Sd=TEP2r +!rq9`rWIfPkl6/~> +W;l\sJcEUer<3&urWIfPaoD2?qu?Bns8Vism/IUd^mP?*h.?eElMnY3"GZsRrrUf&"9Sd=U]gW! +!rq9`rWIfPkl6/~> +WW2huJcEOcr<3&urWIfPa8c#>qZ$?os8Vism/I-;AcrPG^uPHf"GX5Bs1ec1s8Ds"^]_IQ#lgP# +RFb.9nc&all3+p&JcFs6J,~> +WW2huJcEOcr<3&urWIfPa8c#>qZ$?os8Vism/I-;AcrPG^uPHf"GX5Bs1ec1s8Ds"^]_IQ#lgP# +RFb.9nc&all3+p&JcFs6J,~> +WW2huJcEOcr<3&urWIfPa8c#>qZ$?os8Vism/I-;AcrPG^uPHj"GX5Bs1ec5s8Ds"^]_IQ#lg\' +RFb.9nc&all3+p&JcFs6J,~> +WrMr!JcELbr<3&urWIfP`rGo=qZ#sdli6tfrVum#!UB^brrN +WrMr!JcELbr<3&urWIfP`rGo=qZ#sdli6tfrVum#!UB^brrN +WrMr!JcELbr<3&urWIfP`rGo=qZ#sdli6tfrVum#!UB^brrN +X8i&"JcEIar<3&urWIfP`W,f +X8i&"JcEIar<3&urWIfP`W,f +X8i&"JcEIar<3&urWIfP`W,f +XT//#JcEF`r<3&urWIfP`;f];r;ZEmrr;p"li6tfrVum#rVum#q#:E2J-5lUs8W*$J-:W,JcFj3 +J:~> +XT//#JcEF`r<3&urWIfP`;f];r;ZEmrr;p"li6tfrVum#rVum#q#:E2J-5lUs8W*$J-:W,JcFj3 +J:~> +XT//#JcEF`r<3&urWIfP`;f];r;ZEmrr;p"li6tfrVum#rVum#q#:E2J-5lUs8W*$J-:W,JcFj3 +J:~> +XoJ8$JcEC_r<3-"rreD_rrf_/qZQisp&tBpr<2Hdrri<#rri<#rri6!"nA6[T]uX\"TSN%!U9dh +"R?# +XoJ8$JcEC_r<3-"rreD_rrf_/qZQisp&tBpr<2Hdrri<#rri<#rri6!"nA6[T]uX\"TSN%!U9dh +"R?# +XoJ8$JcEC_r<3-"rreD_rrf_/qZQisp&tBpr<2Hdrri<#rri<#rri6!"nAB_V!8'`"TSN%!U9dh +"R?# +Y5eA%JcE@^r<3-"rreD_rrf\.qZQltqud'#"T8K&s8<)ds8N6#s8N6#s8N6"rrhU]JFWX?rr`?* +s8W*%L7e["s+144s+'~> +Y5eA%JcE@^r<3-"rreD_rrf\.qZQltqud'#"T8K&s8<)ds8N6#s8N6#s8N6"rrhU]JFWX?rr`?* +s8W*%L7e["s+144s+'~> +Y5eA%JcE@^r<3-"rreD_rrf\.qZQltqud'#"T8K&s8<)ds8N6#s8N6#s8N6"rrhU]JFWX?rr`?* +s8W*%L84s&s+144s+'~> +YQ+J&JcE=]r<3-"rreMbrWKJ*qZQZnpB9d]rri<#rri<#rri9""(h]+s8W-!"TSN%^]a[l"LA&Y +s6'E4~> +YQ+J&JcE=]r<3-"rreMbrWKJ*qZQZnpB9d]rri<#rri<#rri9""(h]+s8W-!"TSN%^]a[l"LA&Y +s6'E4~> +YQ+J&JcE=]r<3-"rreMbrWKJ*qZQZnpB9d]rri<#rri<#rri9""(h]+s8W-!"TSN%^]a[l"LA&Y +s6'E4~> +YlFS'JcE:\r<3-"rreMbrWKG)qZQZnpB9g^rri<#rri<#rri9"rri<#rr`H(f:`0Drr[cSfDgF% +kl60~> +YlFS'JcE:\r<3-"rreMbrWKG)qZQZnpB9g^rri<#rri<#rri9"rri<#rr`H(f:`0Drr[cSfDgF% +kl60~> +YlFS'JcE:\r<3-"rreMbrWKG)qZQZnpB9g^rri<#rri<#rri9"rri<#rr`H(f;/HHrr[cSfDgF% +kl60~> +Z2a\(JcE7[r<3-"rreMbrWKD(qZQ]oo`X^_!S7GU"S)Kns69^g"R?!gs69^g"R?$drs"2\T`=;M +"9\k#"S)NlrrMBf!X-==JcG!7J,~> +Z2a\(JcE7[r<3-"rreMbrWKD(qZQ]oo`X^_!S7GU"S)Kns69^g"R?!gs69^g"R?$drs"2\T`=;M +"9\k#"S)NlrrMBf!X-==JcG!7J,~> +Z2a\(JcE7[r<3-"rreMbrWKD(qZQ]oo`X^_!S7GU"S)Kns69^g"R?!gs69^g"R?$drs"2\V#T_U +"9\k'"S)NlrrMBf!X-==JcG!7J,~> +ZN'e)JcE4Zr +ZN'e)JcE4Zr +ZN'e)JcE4Zr +ZN'h*JcE1Yr&qulTjq#l9KZN#I~> +ZN'h*JcE1Yr&qulTjq#l9KZN#I~> +ZN'h*JcE1Yr&qulTjq#l9KZN#I~> +ZiBq+JcE.Xr +ZiBq+JcE.Xr +ZiBq+JcE.Xr +[/^%,JcE+Wr +[/^%,JcE+Wr +[/^%,JcE+Wr +[K$+,JcE+Wr +[K$+,JcE+Wr +[K$+,JcE+Wr +[f?4-JcE(Vr<17B"/#eKs3(HB"K)4r"SMfp"TAAr"G-T`s+#~> +[f?4-JcE(Vr<17B"/#eKs3(HB"K)4r"SMfp"TAAr"G-T`s+#~> +[f?4-JcE(Vr<17B"/H(Os3(HB"K)4r"SMfp"TAAr"G-T`s+#~> +\,Z=.JcE%Ur<17B!_igtb5_JEV>pDqpAb-qr;ZNpJcE@^J:~> +\,Z=.JcE%Ur<17B!_igtb5_JEV>pDqpAb-qr;ZNpJcE@^J:~> +\,Z=.JcE%Ur<17B!_igtb5_JEV>pDqpAb-qr;ZNpJcE@^J:~> +\GuF/JcE"Tr<1:C"5O*Js3CZD"9JN*! +\GuF/JcE"Tr<1:C"5O*Js3CZD"9JN*! +\GuF/JcE"Tr<1:C"5O*Js3CZD"9JN*! +\c;O0JcDtSr<1:C".9;Js3CZC"JPkm"Si#s"Si#m"G-Tes*t~> +\c;O0JcDtSr<1:C".9;Js3CZC"JPkm"Si#s"Si#m"G-Tes*t~> +\c;O0JcDtSr<1:C".9;Js3CZC"JPkm"Si#s"Si#m"G-Tes*t~> +])VX1JcDtSquk1B!X)6tbl@YFT`=llr;Za!o`+^iJcEOcJ:~> +])VX1JcDtSquk1B!X)6tbl@YFT`=llr;Za!o`+^iJcEOcJ:~> +])VX1JcDtSquk1B!X)6tbl@YFT`=llr;Za!o`+^iJcEOcJ:~> +]Dqa2JcDqRquk4C"4m[Ks31NB"J>_k"TAB""S;Zg"G-Tis*t~> +]Dqa2JcDqRquk4C"4m[Ks31NB"J>_k"TAB""S;Zg"G-Tis*t~> +]Dqa2JcDqRquk4C"4m[Os31NB"J>_k"TAB""S;Zg"G-Tis*t~> +]Dqd3JcDnQquk4C".9;Js+144s8)rus8E/ks7leKs24ke~> +]Dqd3JcDnQquk4C".9;Js+144s8)rus8E/ks7leKs24ke~> +]Dqd3JcDnQquk4C".9;Js+144s8)rus8E/ks7leKs24ke~> +]`7m4JcDkPquk4C!X)6tJcFg2qum$!rWM]iq#l9K`W(I~> +]`7m4JcDkPquk4C!X)6tJcFg2qum$!rWM]iq#l9K`W(I~> +]`7m4JcDkPquk4C!X)6tJcFg2qum$!rWM]iq#l9K`W(I~> +^&S!5JcDhOquk7D"4m[Ks+141s83$"s8E/gs7leKs2Y.i~> +^&S!5JcDhOquk7D"4m[Ks+141s83$"s8E/gs7leKs2Y.i~> +^&S!5JcDhOquk7D"4m[Os+141s83$"s8E/gs7leKs2Y.i~> +^An'5JcDeNr<1@E".9;Js+140s8)r`s7leKs2b4j~> +^An'5JcDeNr<1@E".9;Js+140s8)r`s7leKs2b4j~> +^An'5JcDeNr<1@E".9;Js+140s8)r`s7leKs2b4j~> +^]406JcDhOqZP:G"S'9^9a(J!!f"Mje,TCMQ2g^akPt>\JcEmmJ@~> +^]406JcDhOqZP:G"S'9^9a(J!!f"Mje,TCMQ2g^akPt>\JcEmmJ@~> +^]406JcDhOqZP:G"S'9^9a(J!!f"Mje,TCMQ2g^akPt>\JcEmmJ@~> +_#O97JcDeNqZP@I%Ip(oJAAGnRFc$RB'TEHs8E.cs8)r]s7leKs31Ln~> +_#O97JcDeNqZP@I%Ip(oJAAGnRFc$RB'TEHs8E.cs8)r]s7leKs31Ln~> +_#O97JcDeNqZP@I%Ip4sJAAGnRFc$RB'TEHs8E.cs8)r]s7leKs31Ln~> +_#O<8JcDhOrriB%r<1UL!SpHO9u-c3s-X#Grri?r"G$O&s8E.bs8)r]s7c_Js3CXp~> +_#O<8JcDhOrriB%r<1UL!SpHO9u-c3s-X#Grri?r"G$O&s8E.bs8)r]s7c_Js3CXp~> +_#O<8JcDhOrriB%r<1UL!SpHO9u-c3s-X#Grri?r"G$O&s8E.bs8)r]s7c_Js3CXp~> +_>jE9JcDeNrriB%r<1XM"P3cNlMpna!X)6ts8N,8"9J_^s475L"Hrf_"Q]UY"G-U!s+#~> +_>jE9JcDeNrriB%r<1XM"P3cNlMpna!X)6ts8N,8"9J_^s475L"Hrf_"Q]UY"G-U!s+#~> +_>jE9JcDeNrriB%r<1XM"P3cNlMpna!X)6ts8N,8"9J_^s475L"Hrf_"Q]UY"G-U!s+#~> +_Z0N:JcDbMrriB%r<1[N!S7GU"QTO^rr^jUT`>&l!TO:a"LA'Ys8E.`s83#[s7leKs3^js~> +_Z0N:JcDbMrriB%r<1[N!S7GU"QTO^rr^jUT`>&l!TO:a"LA'Ys8E.`s83#[s7leKs3^js~> +_Z0N:JcDbMrriB%r<1[N!S7GU"QTO^rr^jUV#UJp!TO:a"LA'Ys8E.`s83#[s7leKs3^js~> +_uKT:JcDbMrriB%r<1^O"R8\aZN'q(",6s=s8W*"irfDdLB#p+rre>]qul$Zq#l9Ke,Or~> +_uKT:JcDbMrriB%r<1^O"R8\aZN'q(",6s=s8W*"irfDdLB#p+rre>]qul$Zq#l9Ke,Or~> +_uKT:JcDbMrriB%r<1^O"R8\aZN'q(",6s=s8W*"irfDdLB#p+rre>]qul$Zq#l9Ke,Or~> +_uKW;JcD_LrriB%r<1^O",6qQs8N$#nH +_uKW;JcD_LrriB%r<1^O",6qQs8N$#nH +_uKW;JcD_LrriB%r<1^O",6qQs8N$#nH +`;f`ZN'q(!Peg>"Mk&is8N4ds8E0!s83#Xs7leKs474# +~> +`;f`ZN'q(!Peg>"Mk&is8N4ds8E0!s83#Xs7leKs474# +~> +`;f`ZN'q(!Peg>"Mk&is8N4ds8E0!s83#Xs7leKs474# +~> +`W,i=JcDbMrWN3"r<1aP!JU^Y"R?$drr[cSlMpk`!It:S"R?$>s8N4ds8E/us83#Ws7leKs4I@% +~> +`W,i=JcDbMrWN3"r<1aP!JU^Y"R?$drr[cSlMpk`!It:S"R?$>s8N4ds8E/us83#Ws7leKs4I@% +~> +`W,i=JcDbMrWN3"r<1aP!JU^Y"R?$drr[cSlMpk`!It:S"R?$>s8N4ds8E/us83#Ws7leKs4I@% +~> +`rGo=JcDbMrWN3"r<1dQ!V$9o"ASpqrr_coB)hl1!V$9o"D7\cs8N4ds8E/ts83#Ws7c_Js4[L' +~> +`rGo=JcDbMrWN3"r<1dQ!V$9o"ASpqrr_coB)hl1!V$9o"D7\cs8N4ds8E/ts83#Ws7c_Js4[L' +~> +`rGo=JcDbMrWN3"r<1dQ!V$9o"ASpqrr_coB)hl1!V$9o"D7\cs8N4ds8E/ts83#Ws7c_Js4[L' +~> +`rGr>JcDJEr<1dQ!S7GU"I];hrr^%>ZN'q(!Peg>"P<\*s8N4ds8E/ts8)rUs7leKs4dR(~> +`rGr>JcDJEr<1dQ!S7GU"I];hrr^%>ZN'q(!Peg>"P<\*s8N4ds8E/ts8)rUs7leKs4dR(~> +`rGr>JcDJEr<1dQ!S7GU"I];hrr^%>ZN'q(!Peg>"P<\*s8N4ds8E/ts8)rUs7leKs4dR(~> +a8c&?JcDGDr<1dQ!Peg>"Mk':rr[cSlMpk`"(h[ds4RGO"Hrfa"Sr)q"Pj%Q"G-U/s+(~> +a8c&?JcDGDr<1dQ!Peg>"Mk':rr[cSlMpk`"(h[ds4RGO"Hrfa"Sr)q"Pj%Q"G-U/s+(~> +a8c&?JcDGDr<1dQ!Peg>"Mk':rr[cSlMpk`"(h[ds4RGO"Hrfa"Sr)q"Pj%Q"G-U/s+(~> +aT)/@JcDDCr<1dQ!Peg>"Mk';rr_coB)hl1!Peg>"R?$?s8E.cs8N5ps83#Ss7leKs53j,~> +aT)/@JcDDCr<1dQ!Peg>"Mk';rr_coB)hl1!Peg>"R?$?s8E.cs8N5ps83#Ss7leKs53j,~> +aT)/@JcDDCr<1dQ!Peg>"Mk';rr_coB)hl1!Peg>"R?$?s8E.cs8N5ps83#Ss7leKs53j,~> +aoD5@JcDDCr<1dQ!Peg>"Mk';rr^%>ZN't)"R8\afDjV*rWJA`rrhuoqukdSp]Q0JiW"F~> +aoD5@JcDDCr<1dQ!Peg>"Mk';rr^%>ZN't)"R8\afDjV*rWJA`rrhuoqukdSp]Q0JiW"F~> +aoD5@JcDDCr<1dQ!Peg>"Mk';rr^%>ZN't)"R8\afDjV*rWJA`rrhuoqukdSp]Q0JiW"F~> +aoD8AJcDABr<1dQ!U9dh"G$OPrr[cSlMh%fl:hE5s4[MP"Hi`a"SD`l"PNhN"G-U4s+#~> +aoD8AJcDABr<1dQ!U9dh"G$OPrr[cSlMh%fl:hE5s4[MP"Hi`a"SD`l"PNhN"G-U4s+#~> +aoD8AJcDABr<1dQ!U9dh"G$OPrr[cSlMh%fl:hE5s4[MP"Hi`a"SD`l"PNhN"G-U4s+#~> +b5_ABJcD>Ar<1aP!JU^]"QTOP"D7Z8s5QfT:"TEus8E.`s8N5ns83#Ps7leKs5a31~> +b5_ABJcD>Ar<1aP!JU^]"QTOP"D7Z8s5QfT:"TEus8E.`s8N5ns83#Ps7leKs5a31~> +b5_ABJcD>Ar<1aP!JU^]"QTOP"D7Z8s5QfT:"TEus8E.`s8N5ns83#Ps7leKs5a31~> +bQ%JCJcD_LrWN#rr<1^O%"JITf>%NWf7jE_nc+1?jo>>`o)JUjfDkXLJcFm4JE~> +bQ%JCJcD_LrWN#rr<1^O%"JITf>%NWf7jE_nc+1?jo>>`o)JUjfDkXLJcFm4JE~> +bQ%JCJcD_LrWN#rr<1^O%"JITf>%NWf7jE_nc+1?jo>>`o)JUjfDkXLJcFm4JE~> +bl@PCJcD_LrWN#rr<1[N!nW/0rWE=XZKhI@s5X.Z"S2Ti"P<\L"G-U9s+'~> +bl@PCJcD_LrWN#rr<1[N!nW/0rWE=XZKhI@s5X.Z"S2Ti"P<\L"G-U9s+'~> +bl@PCJcD_LrWN#rr<1[N!nW/0rWE=XZKhI@s5X.Z"S2Ti"P<\L"G-U9s+'~> +bl@SDJcD\KrWN#rr<1UL"6p#>s+140s8E/is83#Ms7leKs69Q6~> +bl@SDJcD\KrWN#rr<1UL"6p#>s+140s8E/is83#Ms7leKs69Q6~> +bl@SDJcD\KrWN#rr<1UL"6p#>s+140s8E/is83#Ms7leKs69Q6~> +c2[\EJcDYJrWN#rr<1UL"0r'Fs+140s8E/hs83#Ls7leKs6K]8~> +c2[\EJcDYJrWN#rr<1UL"0r'Fs+140s8E/hs83#Ls7leKs6K]8~> +c2[\EJcDYJrWN#rr<1UL"0r'Fs+140s8E/hs83#Ls7leKs6K]8~> +cN!eFJcDVIrWN#rr<1UL"(h]+s+140s8E/gs83#Ls7c_Js6]i:~> +cN!eFJcDVIrWN#rr<1UL"(h]+s+140s8E/gs83#Ls7c_Js6]i:~> +cN!eFJcDVIrWN#rr<1UL"(h]+s+140s8E/gs83#Ls7c_Js6]i:~> +cis3q#J"Hi``"RZ6d"OmDH"G-U@s+(~> +cis3q#J"Hi``"RZ6d"OmDH"G-U@s+(~> +cis3q#J"Hi``"RZ6d"OmDH"G-U@s+(~> +ci +ci +ci +d/X"HJcDYJrWMoor<1XM"(h]+s3q#J"G-UJs83#Hs7leKs762?~> +d/X"HJcDYJrWMoor<1XM"(h]+s3q#J"G-UJs83#Hs7leKs762?~> +d/X"HJcDYJrWMoor<1XM"(h]+s3q#J"G-UJs83#Hs7leKs762?~> +dJs+IJcDVIrWMoor<1[N"6p#>s4./K"G-UGs83#Hs7leKs7?8@~> +dJs+IJcDVIrWMoor<1[N"6p#>s4./K"G-UGs83#Hs7leKs7?8@~> +dJs+IJcDVIrWMoor<1[N"6p#>s4./K"G-UGs83#Hs7leKs7?8@~> +dJs+IJcDVIrWMoor<1[N"0r'Fs4./K"G-UGs83#Fs7leKs7QDB~> +dJs+IJcDVIrWMoor<1[N"0r'Fs4./K"G-UGs83#Fs7leKs7QDB~> +dJs+IJcDVIrWMoor<1[N"0r'Fs4./K"G-UGs83#Fs7leKs7QDB~> +df94JJcDSHrWMoor +df94JJcDSHrWMoor +df94JJcDSHrWMoor +df97KJcDVIrrhomr +df97KJcDVIrrhomr +df97KJcDVIrrhomr +e,T=KJcDVIrrhomr +e,T=KJcDVIrrhomr +e,T=KJcDVIrrhomr +eGoFLJcDSHrrhomr +eGoFLJcDSHrrhomr +eGoFLJcDSHrrhomr +eGoFLJcDSHrrhomn-$0!rWJA`rrh<\quk+@q#l9Krr7M~> +eGoFLJcDSHrrhomn-$0!rWJA`rrh<\quk+@q#l9Krr7M~> +eGoFLJcDSHrrhomn-$0!rWJA`rrh<\quk+@q#l9Krr7M~> +ec5OMJcDPGrrhrnjoiEurWJJcrWM*Xquk+@q#l9Ks8RV~> +ec5OMJcDPGrrhrnjoiEurWJJcrWM*Xquk+@q#l9Ks8RV~> +ec5OMJcDPGrrhrnjoiEurWJJcrWM*Xquk+@q#l9Ks8RV~> +ec5RNJcCo5iWR7#rreJarWM'Wr<1.?q#l9KJ-~> +ec5RNJcCo5iWR7#rreJarWM'Wr<1.?q#l9KJ-~> +ec5RNJcCo5iWR7#rreJarWM'Wr<1.?q#l9KJ-~> +f)PXNJcCo5g]Yh#rreJarWM'Wquk"=q#l?MJ-~> +f)PXNJcCo5g]Yh#rreJarWM'Wquk"=q#l?MJ-~> +f)PXNJcCo5g]Yh#rreJarWM'Wquk"=q#l?MJ-~> +fDkaOJcCl4r<2cmkQK94rreJarWM$Vquk"=p]Q +fDkaOJcCl4r<2cmkQK94rreJarWM$Vquk"=p]Q +fDkaOJcCl4r<2cmkQK94rreJarWM$Vquk"=p]Q +h>d!JJcD&9r<2HdmKD#=rreJarWM$Vqujq;q#lHPJH~> +h>d!JJcD&9r<2HdmKD#=rreJarWM$Vqujq;q#lHPJH~> +h>d!JJcD&9r<2HdmKD#=rreJarWM$Vqujq;q#lHPJH~> +hZ*!HJcD,;r<29_n-%>BrrePcrrh!Squjn:q#lNRJH~> +hZ*!HJcD,;r<29_n-%>BrrePcrrh!Squjn:q#lNRJH~> +hZ*!HJcD,;r<29_n-%>BrrePcrrh!Squjn:q#lNRJH~> +huE$GJcD/ +huE$GJcD/ +huE$GJcD/ +hZ*!HJcDqRrWMWgr<1mTo`TjGm/R(gfDkaO_#O04N;nE~> +hZ*!HJcDqRrWMWgr<1mTo`TjGm/R(gfDkaO_#O04N;nE~> +hZ*!HJcDqRrWMWgr<1mTo`TjGm/R(gfDkaO_#O04N;nE~> +hZ*$IJcDnQrWMWgr<1dQo`TjGo)J[leGoFL^]4*4NW4N~> +hZ*$IJcDnQrWMWgr<1dQo`TjGo)J[leGoFL^]4*4NW4N~> +hZ*$IJcDnQrWMWgr<1dQo`TjGo)J[leGoFL^]4*4NW4N~> +h>d!JJcDqRrrhWer<1[No`TjGp&G!oeGoFL^&Rm2O8j`~> +h>d!JJcDqRrrhWer<1[No`TjGp&G!oeGoFL^&Rm2O8j`~> +h>d!JJcDqRrrhWer<1[No`TjGp&G!oeGoFL^&Rm2O8j`~> +h#HsKJcDnQrrhWer<1RKo`TjGq#C +h#HsKJcDnQrrhWer<1RKo`TjGq#C +h#HsKJcDnQrrhWer<1RKo`TjGq#C +g]-pLb5VKS"S`*%L9fk>JcG?ArrhWer<1IHp&osHr;ZZtdf97K]Dq[0P5g(~> +g]-pLb5VKS"S`*%L9fk>JcG?ArrhWer<1IHp&osHr;ZZtdf97K]Dq[0P5g(~> +g]-pLb5VKS"S`*%L9fk>JcG?ArrhWer<1IHp&osHr;ZZtdf97K]Dq[0P5g(~> +h#I$MaSu=t9a(J!!Pna8rrV5R"9J^\s+14Bs8N5es8<)Es7ZZas8N4cs83#Js83#2s7le^s+(~> +h#I$MaSu=t9a(J!!Pna8rrV5R"9J^\s+14Bs8N5es8<)Es7ZZas8N4cs83#Js83#2s7le^s+(~> +h#I$MaSu=t9a(J!!Pna8rrV5V"9J^\s+14Bs8N5es8<)Es7ZZas8N4cs83#Js83#2s7le^s+(~> +h>d-N`r?(q"TJT*nc/Rf"R8\aJH(3#p&G$plMpecaoD,=nGiLkPQ1Ubci +h>d-N`r?(q"TJT*nc/Rf"R8\aJH(3#p&G$plMpecaoD,=nGiLkPQ1Ubci +h>d-N`r?(q"TJT*nc/Rf"R8\aJH(3#p&G$plMpecaoD,=nGiLkPQ1Ubci +h>d*Ma8Z2#"9J^ +h>d*Ma8Z2#"9J^ +h>d*Ma8Z2#"9J^ +hZ*KV!WN;t"NgZEf)u-XT`=oh!V$9o"G$N's7u]o"R,ma"NCE9"SD`o"G-U/s83#/s7lecs+(~> +hZ*KV!WN;t"NgZEf)u-XT`=oh!V$9o"G$N's7u]o"R,ma"NCE9"SD`o"G-U/s83#/s7lecs+(~> +hZ*KV!WN;t"NgZEf)u-XV#U>l!V$9o"G$N's7u]o"R,ma"NCE9"SD`o"G-U/s83#/s7lecs+(~> +hZ*NWs8Vcqb5VL8"9J_^s8)cp"G-UJs8E/bs8<) +hZ*NWs8Vcqb5VL8"9J_^s8)cp"G-UJs8E/bs8<) +hZ*NWs8Vcqb5VL<"9J_^s8)cp"G-UJs8E/bs8<) +huETWrr;Wobl7]U"9AZ*q>^EsJcGNFrWMHbr<0t:p]UNprWE9%"9AZ*JcFR+qujD,q#m8gJ:~> +huETWrr;Wobl7]U"9AZ*q>^EsJcGNFrWMHbr<0t:p]UNprWE9%"9AZ*JcFR+qujD,q#m8gJ:~> +huETWrr;Wobl7]U"9AZ*q>^EsJcGNFrWMHbr<0t:p]UNprWE9%"9AZ*JcFR+qujD,q#m8gJ:~> +huEWXr;ZBlci4%2"9J^Vs8)`rl3%.kB)dG^q>^Eskl:Sa^]4'3!WN9("TJW)"G-U+s8<),s7leh +s*t~> +huEWXr;ZBlci4%2"9J^Vs8)`rl3%.kB)dG^q>^Eskl:Sa^]4'3!WN9("TJW)"G-U+s8<),s7leh +s*t~> +huEWXr;ZBlci4%2"9J^Vs8)`rl3%.kB)dG^q>^Eskl:Sa^]4'3!WN9("TJW)"G-U+s8<),s7leh +s*t~> +i;`]Xqu?6jdJj6_"9J_As8)`r^]X]AT`9TCq>^Eskl:Sa^&Rg0!WN<&"IB)e"NUQ?"LA('"JGdF +~> +i;`]Xqu?6jdJj6_"9J_As8)`r^]X]AT`9TCq>^Eskl:Sa^&Rg0!WN<&"IB)e"NUQ?"LA('"JGdF +~> +i;`]Xqu?6jdJj6_"9J_As8)`r^]X]AV#Q#Gq>^Eskl:Sa^&Rg0!WN<&"IB)e"NUQ?"LA('"JGdF +~> +i;``YqZ$Eq!WN;u"OmAOJ-5oVj8\uU!DN[u"QTN5s82ir"Qf[^"M=^0"Hrfa"NLK?"L.q%"N: +i;``YqZ$Eq!WN;u"OmAOJ-5oVj8\uU!DN[u"QTN5s82ir"Qf[^"M=^0"Hrfa"NLK?"L.q%"N: +i;``YqZ$Eq!WN;u"OmAOJ-5oVj8\uU!DN[u"QTN5s82ir"Qf[^"M=^0"Hrfa"NLK?"L.q%"N: +iW&fYq>^?qrr;cseGoOO!DWUjrrIiW!X,h/JcGTHrrhH`r<0\2qZN)^rWL7@quj8(p]SY;"+UNB +rrW5+"9J^\s60K5~> +iW&fYq>^?qrr;cseGoOO!DWUjrrIiW!X,h/JcGTHrrhH`r<0\2qZN)^rWL7@quj8(p]SY;"+UNB +rrW5+"9J^\s60K5~> +iW&fYq>^?qrr;cseGoOO!DWUjrrIiW!X,h/JcGTHrrhH`r<0\2qZN)^rWL7@quj8(p]SY;"+UNB +rrW5+"9J^\s60K5~> +iW&iZp](-orVuZrfDbm'"9J^os8;lunUL`D"G$N's7u]p"Qf[^"Le@0"Hrfa"NCE>"Kqe#"NgZE +TEG +iW&iZp](-orVuZrfDbm'"9J^os8;lunUL`D"G$N's7u]p"Qf[^"Le@0"Hrfa"NCE>"Kqe#"NgZE +TEG +iW&iZp](-orVuZrfDbm'"9J^os8;lunUL`D"G$N's7u]p"Qf[^"Le@0"Hrfa"NCE>"Kqe#"NgZE +U]^`%nc/Xh",6ras60K5~> +irAoZpAb*pqZ$?og&D)G"9J_3s8W*$n_Ki@rr`A.s+14(s8<).s8N4bs8E/?s83#%s7lf@rrGgs +! +irAoZpAb*pqZ$?og&D)G"9J_3s8W*$n_Ki@rr`A.s+14(s8<).s8N4bs8E/?s83#%s7lf@rrGgs +! +irAoZpAb*pqZ$?og&D)K"9J_3s8W*$n_KuDrr`A.s+14(s8<).s8N4bs8E/?s83#%s7lf@rrGgs +! +irAr[lMpV^g]%:K"9Sd]Ad&&8"+[]Is+14's8<)1s8E.as8N5dNT"7ZNS +s60K5~> +irAr[lMpV^g]%:K"9Sd]Ad&&8"+[]Is+14's8<)1s8E.as8N5dNT"7ZNS +s60K5~> +irAr[lMpV^g]%:K"9Sd]Ad&&8"+[]Is+14's8<)1s8E.as8N5dNT"7ZNS +s60K5~> +j8]#[kl:D\hZ!W:"9J^Vs8N$!Z3143_#JucfDkdP\GuO2P5kOb_>jE9X8hqtci4#X"9J^ +j8]#[kl:D\hZ!W:"9J^Vs8N$!Z3143_#JucfDkdP\GuO2P5kOb_>jE9X8hqtci4#X"9J^ +j8]#[kl:D\hZ!W:"9J^Vs8N$!Z3143_#JucfDkdP\GuO2P5kOb_>jE9X8hqtci4#X"9J^ +j8]&\jo>,Zhu<__"9J_As8N$!l3%.kJH(3#qu?[!huEWX\GuO2P5kOb_#O?9WW2bsd/O-^"TJT* +RK)=IJ-~> +j8]&\jo>,Zhu<__"9J_As8N$!l3%.kJH(3#qu?[!huEWX\GuO2P5kOb_#O?9WW2bsd/O-^"TJT* +RK)=IJ-~> +j8]&\jo>,Zhu<__"9J_As8N$!l3%.kJH(3#qu?[!huEWX\GuO2P5kOb_#O?9WW2bsd/O-^"TJT* +RK)=IJ-~> +jT#,\j8\oXiVrq/"9J_ks8DruAcr/ +jT#,\j8\oXiVrq/"9J_ks8DruAcr/ +jT#,\j8\oXiVrq/"9J_ks8DruAcr/ +jT#/]i;`TUjSo8N"9J^ +jT#/]i;`TUjSo8N"9J^ +jT#/]i;`TUjSo8N"9J^ +jT#/]huEHSk5PIt"9J_!s8;lth#mc^JH(3#r;Zd"huEWXJcEjlrWKq7quinsq#o1H!Pej<"9E-7 +jo9l~> +jT#/]huEHSk5PIt"9J_!s8;lth#mc^JH(3#r;Zd"huEWXJcEjlrWKq7quinsq#o1H!Pej<"9E-7 +jo9l~> +jT#/]huEHSk5PIt"9J_%s8;lth#mc^JH(3#r;Zd"huEWXJcEjlrWKq7quinsq#o1H!Pej<"9E-7 +jo9l~> +jo>8^h#I-Pkl1[O"9J_^s82fs9`tM#nc+1?rVum#huEWXJcEjlrWKn6r +jo>8^h#I-Pkl1[O"9J_^s82fs9`tM#nc+1?rVum#huEWXJcEjlrWKn6r +jo>8^h#I-Pkl1[O"9J_^s82fs9`tM#nc+1?rVum#huEWXJcEjlrWKn6r +jo>8^gAgsOl2U_cq>UJg"9J_Xs+14Ks8N5Zs8<(Os2k +jo>8^gAgsOl2U_cq>UJg"9J_Xs+14Ks8N5Zs8<(Os2k +jo>8^gAgsOl2U_cq>UJk"9J_Xs+14Ks8N5Zs8<(Os2k +k5Y>^f`1aMm/I+B"9J^\s8)`rh#mc^RK%j +k5Y>^f`1aMm/I+B"9J^\s8)`rh#mc^RK%j +k5Y>^f`1aMm/I+B"9J^\s8)`rh#mc^RK%j +k5YA_ec5FJmf*<\"9J_As7uZq9`tM#nc+1?rWM'Wr<0_3rreVerWKb2r +k5YA_ec5FJmf*<\"9J_As7uZq9`tM#nc+1?rWM'Wr<0_3rreVerWKb2r +k5YA_ec5FJmf*<`"9J_As7uZq9`tM#nc+1?rWM'Wr<0_3rreVerWKb2r +kPtG_eGo:HnG`M`"9J_ks7uZqTEG +kPtG_eGo:HnG`M`"9J_ks7uZqTEG +kPtG_eGo:HnG`M`"9J_ks7uZqU]^`%_#JucrWM'Wr<0_3rreVerWKb2quiYlq#o^W"2G&ks8;os +"9Fqjk5Ts~> +kPtJ`dJrtEoD\j,"TJW!rrLpYrr`Afs+::M"Ps+V"MOj7"G-Tms8<(ks7lfYrr]P0B)hi0"P3cN +lMp#HJH~> +kPtJ`dJrtEoD\j,"TJW!rrLpYrr`Afs+::M"Ps+V"MOj7"G-Tms8<(ks7lfYrr]P0B)hi0"P3cN +lMp#HJH~> +kPtJ`dJrtEoD\j,"TJW!rrLpYrr`Afs+::M"Ps+V"MOj7"G-Tms8<(ks7lfYrr]P0B)hi0"P3cN +lMp#HJH~> +kl:P`ci!heiYq>^Es"&7D;s+LFO"Ps+V"MOj7"G-Tms83"js7lfZrrIiW!sF/1 +rrW5P9`e&@s5j92~> +kl:P`ci!heiYq>^Es"&7D;s+LFO"Ps+V"MOj7"G-Tms83"js7lfZrrIiW!sF/1 +rrW5P9`e&@s5j92~> +kl:P`ci!i5,]q>^Es"&7D;s+LFO"Ps+V"MOj7"G-Tms83"js7lfZrrIiW!sF/1 +rrW5P9`e&@s5j92~> +kl:Sabl@JAq>UIi"Sr6%B)h`-!LX)h"9Gh.L]@AWgAh*S^&S'7JcE^hr0nc.\MJE~> +kl:Sabl@JAq>UIi"Sr6%B)h`-!LX)h"9Gh.L]@AWgAh*S^&S'7JcE^hr0nc.\MJE~> +kl:Sabl@JAq>UIi"Sr6%B)h`-!LX)h"9Gh.L]@AWgAh*S^&S'7JcE^hr4nc.\MJE~> +l2UYab5_8?JcFp5rrh'Ur<0q9rWIfP_Z0N:RfE0doDe^keGk%~> +l2UYab5_8?JcFp5rrh'Ur<0q9rWIfP_Z0N:RfE0doDe^keGk%~> +l2UYab5_8?JcFp5rrh'Ur<0q9rWIfP_Z0N:RfE0doDe^keGk%~> +l2U\baT)#jH:RK*$bo`+jmeGk%~> +l2U\baT)#jH:RK*$bo`+jmeGk%~> +l2U\baT)#jH:RK*$bo`+jmeGk%~> +lMpbb`rGf:JcG0 +lMpbb`rGf:JcG0 +lMpbb`rGf:JcG0 +lMpec_uKN8JcG3=rWLmRr<0q9rWJDarrfV,r +lMpec_uKN8JcG3=rWLmRr<0q9rWJDarrfV,r +lMpec_uKN8JcG3=rWLmRr<0q9rWJDarrfV,r +lMpec_>j<6JcG9?rWLmRr<0q9rWJDarrfV,r +lMpec_>j<6JcG9?rWLmRr<0q9rWJDarrfV,r +lMpec_>j<6JcG9?rWLmRr<0q9rWJDarrfV,r +li6nd^An!3JcEdjr<1";rreMbrWKD(r +li6nd^An!3JcEdjr<1";rreMbrWKD(r +li6nd^An!3JcEdjr<1";rreMbrWKD(r +li6nd^&Rj1JcEjlr<1";rreMbrWKD(r +li6nd^&Rj1JcEjlr<1";rreMbrWKD(r +li6nd^&Rj1JcEjlr<1";rreMbrWKD(r +li6nd]DqX/JcEpnr<1";rreVerWK;%r +li6nd]DqX/JcEpnr<1";rreVerWK;%r +li6nd]DqX/JcEpnr<1";rreVerWK;%r +m/R"e\Gu@-JcEsor<1";rreVerWK8$r +m/R"e\Gu@-JcEsor<1";rreVerWK8$r +m/R"e\Gu@-JcEsor<1";rreVerWK8$r +m/R"e[f?.+JcF$qr<1";rreVerWK8$r +m/R"e[f?.+JcF$qr<1";rreVerWK8$r +m/R"e[f?.+JcF$qr<1";rreVerWK8$r +mJm+fZiBh(JcGcMrWLdOr<1";rreVerWK5#r +mJm+fZiBh(JcGcMrWLdOr<1";rreVerWK5#r +mJm+fZiBh(JcGcMrWLdOr<1";rreVerWK5#r +mJm+fZN'\&JcG]Pec5RNJcF7"rWK5#r +mJm+fZN'\&JcG]Pec5RNJcF7"rWK5#r +mJm+fZN'\&JcG]Pec5RNJcF7"rWK5#r +mJm+fYlFJ$KE(oRec5RNJcF=$rrf5!r +mJm+fYlFJ$KE(oRec5RNJcF=$rrf5!r +mJm+fYlFJ$KE(oRec5RNJcF=$rrf5!r +mf34gXoJ2"LB%8Vdf97KJcF=$rrf1ur<.uWp&s+LJ-~> +mf34gXoJ2"LB%8Vdf97KJcF=$rrf1ur<.uWp&s+LJ-~> +mf34gXoJ2"LB%8Vdf97KJcF=$rrf1ur<.uWp&s+LJ-~> +mf34gX8htuM#[JXdf97KJcF=$rrf1ur +mf34gX8htuM#[JXdf97KJcF=$rrf1ur +mf34gX8htuM#[JXdf97KJcF=$rrf1ur +mf34gWW2bsMZ<\Zdf97KJcF=$rrf1ur +mf34gWW2bsMZ<\Zdf97KJcF=$rrf1ur +mf34gWW2bsMZ<\Zdf97KJcF=$rrf1ur +n,N=hVuQMpN;rn\df97KaT)5BP5kObV#UArNrSSOh#Dp~> +n,N=hVuQMpN;rn\df97KaT)5BP5kObV#UArNrSSOh#Dp~> +n,N=hVuQMpN;rn\df97KaT)5BP5kObV#UArNrSSOh#Dp~> +n,N=hV>p;n])R +n,N=hV>p;n])R +n,N=hV>p;n])R +n,N=hU]:,m]DmEb_$#>hec5RNJcFF'J-~> +n,N=hU]:,m]DmEb_$#>hec5RNJcFF'J-~> +n,N=hU]:,m]DmEb_$#>hec5RNJcFF'J-~> +nGiFiT`=fj^&NWd_$#>hec5RNJcFF'J-~> +nGiFiT`=fj^&NWd_$#>hec5RNJcFF'J-~> +nGiFiT`=fj^&NWd_$#>hec5RNJcFF'J-~> +nGiFiT)\Th^]/if_$#>hec5RNJcFF'J-~> +nGiFiT)\Th^]/if_$#>hec5RNJcFF'J-~> +nGiFiT)\Th^]/if_$#>hec5RNJcFF'J-~> +nc/OjSH&?e_>jH:huEZYk5XrSpuD;Up#GTGjo>>`huEWXJcF7"r<.]OgAc^~> +nc/OjSH&?e_>jH:huEZYk5XrSpuD;Up#GTGjo>>`huEWXJcF7"r<.]OgAc^~> +nc/OjSH&?e_>jH:huEZYk5XrSpuD;Up#GTGjo>>`huEWXJcF7"r<.]OgAc^~> +nc/OjRfE-c_uKZ +nc/OjRfE-c_uKZ +nc/OjRfE-c_uKZ +nc/OjR/csb`;fc=huEZYmJle]mc46Km,R^@m/R(ghuEWX])Vd5ScAWkJcFI(J-~> +nc/OjR/csb`;fc=huEZYmJle]mc46Km,R^@m/R(ghuEWX])Vd5ScAWkJcFI(J-~> +nc/OjR/csb`;fc=huEZYmJle]mc46Km,R^@m/R(ghuEWX])Vd5ScAWkJcFI(J-~> +o)JXkQ2gX_`rGu?huEZYnGi+`lf7pHl/VC=o)J[lh>dEV])Vd5SH&NjJcFL)J-~> +o)JXkQ2gX_`rGu?huEZYnGi+`lf7pHl/VC=o)J[lh>dEV])Vd5SH&NjJcFL)J-~> +o)JXkQ2gX_`rGu?huEZYnGi+`lf7pHl/VC=o)J[lh>dEV])Vd5SH&NjJcFL)J-~> +o)JXkPQ1F]aT)2AhuEZYo)J@cki;UEk2Z+;o`+mnh>dEV])Vd5SH&NjJcFL)J-~> +o)JXkPQ1F]aT)2AhuEZYo)J@cki;UEk2Z+;o`+mnh>dEV])Vd5SH&NjJcFL)J-~> +o)JXkPQ1F]aT)2AhuEZYo)J@cki;UEk2Z+;o`+mnh>dEV])Vd5SH&NjJcFL)J-~> +o)JXkP5k:[b5_DChuEZYo`+XgjQ$1AioBb9pAb*ph>dEV^&S'7RfE +o)JXkP5k:[b5_DChuEZYo`+XgjQ$1AioBb9pAb*ph>dEV^&S'7RfE +o)JXkP5k:[b5_DChuEZYo`+XgjQ$1AioBb9pAb*ph>dEV^&S'7RfE +oDealO8ntXbl@VEd/WnEiT'k>hrFM8p](3qh>dEV^&S'7RK*3gJcFO*JH~> +oDealO8ntXbl@VEd/WnEiT'k>hrFM8p](3qh>dEV^&S'7RK*3gJcFO*JH~> +oDealO8ntXbl@VEd/WnEiT'k>hrFM8p](3qh>dEV^&S'7RK*3gJcFO*JH~> +oDealNW8eWc2[_Fdf9+GhrFY^Esh>dEV^&S'7RK*3gJcFO*JH~> +oDealNW8eWc2[_Fdf9+GhrFY^Esh>dEV^&S'7RK*3gJcFO*JH~> +oDealNW8eWc2[_Fdf9+GhrFY^Esh>dEV^&S'7RK*3gJcFO*JH~> +oDealMuWSUcidEV^An-7R/d*fJcFR+JH~> +oDealMuWSUcidEV^An-7R/d*fJcFR+JH~> +oDealMuWSUcidEV^An-7R/d*fJcFR+JH~> +o`+jmM#[8RdJs.Jf)PLJguJ>9g>hr2s8W*%gAh*S^An-7R/d*fJcFR+JH~> +o`+jmM#[8RdJs.Jf)PLJguJ>9g>hr2s8W*%gAh*S^An-7R/d*fJcFR+JH~> +o`+jmM#[8RdJs.Jf)PLJguJ>9g>hr2s8W*%gAh*S^An-7R/d*fJcFR+JH~> +o`+jmL]@,Pe,T@Lf`1^Lg>i,7f]2Z.gAh*S^An08QiI!eJcFR+JH~> +o`+jmL]@,Pe,T@Lf`1^Lg>i,7f]2Z.gAh*S^An08QiI!eJcFR+JH~> +o`+jmL]@,Pe,T@Lf`1^Lg>i,7f]2Z.gAh*S^An08QiI!eJcFR+JH~> +o`+jmL&^oNec5RNjT#2^qZ$ +o`+jmL&^oNec5RNjT#2^qZ$ +o`+jmL&^oNec5RNjT#2^qZ$ +p&FsnK)bWLf)P[OjT#2^qu?Hpf&Q]3eDp?-g].3T_#OE;PQ1RaJcFU,JH~> +p&FsnK)bWLf)P[OjT#2^qu?Hpf&Q]3eDp?-g].3T_#OE;PQ1RaJcFU,JH~> +p&FsnK)bWLf)P[OjT#2^qu?Hpf&Q]3eDp?-g].3T_#OE;PQ1RaJcFU,JH~> +p&FsnJc>cN"Sr8Rs8<)]s8E0"s7lfIj8B,/j7ri6s8<)9s8N4cs8<(Os5*d+~> +p&FsnJc>cN"Sr8Rs8<)]s8E0"s7lfIj8B,/j7ri6s8<)9s8N4cs8<(Os5*d+~> +p&FsnJc>cN"Sr8Rs8<)]s8E0"s7lfIj8B,/j7ri6s8<)9s8N4cs8<(Os5*d+~> +p&FsnJcG`Lq#oFOr<23]rWN6#q?57,r<1L-q?5[Tr<0q9rrePcr<.]OhZ&+~> +p&FsnJcG`Lq#oFOr<23]rWN6#q?57,r<1L-q?5[Tr<0q9rrePcr<.]OhZ&+~> +p&FsnJcG`Lq#oFOr<23]rWN6#q?57,r<1L-q?5[Tr<0q9rrePcr<.]OhZ&+~> +p&FsnJcG]Kp]TCPr<23]rWN9$q?54+r<1R/rr`A_"T&>Zs8<)9s8N4cs8<(Os5*d+~> +p&FsnJcG]Kp]TCPr<23]rWN9$q?54+r<1R/rr`A_"T&>Zs8<)9s8N4cs8<(Os5*d+~> +p&FsnJcG]Kp]TCPr<23]rWN9$q?54+r<1R/rr`A_"T&>Zs8<)9s8N4cs8<(Os5*d+~> +pAb'oJcGTHp]TIRr<23]rWE9%"T/DKj8B,/j8T8]j8/u;s8<) +pAb'oJcGTHp]TIRr<23]rWE9%"T/DKj8B,/j8T8]j8/u;s8<) +pAb'oJcGTHp]TIRr<23]rWE9%"T/DKj8B,/j8T8]j8/u;s8<) +pAb'oJcGNFq#oUTr<29_rri?$qZP4)r<1R/rri;\qZPmXr<1%_r<.]OhuA4~> +pAb'oJcGNFq#oUTr<29_rri?$qZP4)r<1R/rri;\qZPmXr<1%_r<.]OhuA4~> +pAb'oJcGNFq#oUTr<29_rri?$qZP4)r<1R/rri;\qZPmXr<1%_r<.]OhuA4~> +pAb'oJcGHDq#o[Vr<29_rriB%qZP1(r<1R/rri8[q?5jYr<1%_r<.]OhuA4~> +pAb'oJcGHDq#o[Vr<29_rriB%qZP1(r<1R/rri8[q?5jYr<1%_r<.]OhuA4~> +pAb'oJcGHDq#o[Vr<29_rriB%qZP1(r<1R/rri8[q?5jYr<1%_r<.]OhuA4~> +pAb'oJcGBBq#oaXr<29_p]Sh$r<1R/rri5Zq?5mZr<.]Oci +pAb'oJcGBBq#oaXr<29_p]Sh$r<1R/rri5Zq?5mZr<.]Oci +pAb'oJcGBBq#oaXr<29_p]Sh$r<1R/rri5Zq?5mZr<.]Oci +p](0pJcG<@p]T^Yr<2Bbp&rS!r<1[2rWN#Vq?5p[r<.]OcN!hGJcF[.J-~> +p](0pJcG<@p]T^Yr<2Bbp&rS!r<1[2rWN#Vq?5p[r<.]OcN!hGJcF[.J-~> +p](0pJcG<@p]T^Yr<2Bbp&rS!r<1[2rWN#Vq?5p[r<.]OcN!hGJcF[.J-~> +p](0pJcG6>p]Td[r<2BbpB8Y!r<1[2rWMrTqZQ']r<.]OcN!hGJcF[.J-~> +p](0pJcG6>p]Td[r<2BbpB8Y!r<1[2rWMrTqZQ']r<.]OcN!hGJcF[.J-~> +p](0pJcG6>p]Td[r<2BbpB8Y!r<1[2rWMrTqZQ']r<.]OcN!hGJcF[.J-~> +p](0pJcG0 +p](0pJcG0 +p](0pJcG0 +p](0pJcG*:q#p!_r<2Bbq?4k!r<1[2rWMlRqZQ-_r<.]OcN!hGJcF[.J-~> +p](0pJcG*:q#p!_r<2Bbq?4k!r<1[2rWMlRqZQ-_r<.]OcN!hGJcF[.J-~> +p](0pJcG*:q#p!_r<2Bbq?4k!r<1[2rWMlRqZQ-_r<.]OcN!hGJcF[.J-~> +q#C9qJcG!7q#p'ar<2Ecq?4gur<1[2rWMiQq?6*`r<14ArWJ)Xr<.]OiW"H~> +q#C9qJcG!7q#p'ar<2Ecq?4gur<1[2rWMiQq?6*`r<14ArWJ)Xr<.]OiW"H~> +q#C9qJcG!7q#p'ar<2Ecq?4gur<1[2rWMiQq?6*`r<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFs6p]U$br<2EcqZOmur<1d5rWM]MqZQ3ar<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFs6p]U$br<2EcqZOmur<1d5rWM]MqZQ3ar<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFs6p]U$br<2EcqZOmur<1d5rWM]MqZQ3ar<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFm4p]U*dr<2HdqZOjtr<1d5rWMZLqZQ6br<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFm4p]U*dr<2HdqZOjtr<1d5rWMZLqZQ6br<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFm4p]U*dr<2HdqZOjtr<1d5rWMZLqZQ6br<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFg2q#p6fr<2Kequjmsr<1d5rWMTJqulBdr<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFg2q#p6fr<2Kequjmsr<1d5rWMTJqulBdr<14ArWJ)Xr<.]OiW"H~> +q#C9qJcFg2q#p6fr<2Kequjmsr<1d5rWMTJqulBdr<14ArWJ)Xr<.]OiW"H~> +q>^BrJcF^/q#p +q>^BrJcF^/q#p +q>^BrJcF^/q#p +q>^BrJcFX-q#pBjr<2QgqZOaqr<1d5rWMQIqZQ?er<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFX-q#pBjr<2QgqZOaqr<1d5rWMQIqZQ?er<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFX-q#pBjr<2QgqZOaqr<1d5rWMQIqZQ?er<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFU,p]U?kr<2Qgqujgqr<0jpqulHfr<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFU,p]U?kr<2Qgqujgqr<0jpqulHfr<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFU,p]U?kr<2Qgqujgqr<0jpqulHfr<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFO*p]UEmr<2ThqZO^pr<0goqulKgr<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFO*p]UEmr<2ThqZO^pr<0goqulKgr<1=DrWIrTr<.]Oir=Q~> +q>^BrJcFO*p]UEmr<2ThqZO^pr<0goqulKgr<1=DrWIrTr<.]Oir=Q~> +qZ$KsJcFF'q#pQor<2Wiq?4Uor<0dnqulNhr<1=DrWIoSr<.]Oj8XZ~> +qZ$KsJcFF'q#pQor<2Wiq?4Uor<0dnqulNhr<1=DrWIoSr<.]Oj8XZ~> +qZ$KsJcFF'q#pQor<2Wiq?4Uor<0dnqulNhr<1=DrWIoSr<.]Oj8XZ~> +qZ$KsJcF@%q#pWqr<2ZjqZOXnr<0dnqZQHhr<1=DrWIoSr<.]Oj8XZ~> +qZ$KsJcF@%q#pWqr<2ZjqZOXnr<0dnqZQHhr<1=DrWIoSr<.]Oj8XZ~> +qZ$KsJcF@%q#pWqr<2ZjqZOXnr<0dnqZQHhr<1=DrWIoSr<.]Oj8XZ~> +qZ$KsJcF:#q#p]sr<2]kqZOUmr<0amqZQKir<1CFrrdoQr<.]Oj8XZ~> +qZ$KsJcF:#q#p]sr<2]kqZOUmr<0amqZQKir<1CFrrdoQr<.]Oj8XZ~> +qZ$KsJcF:#q#p]sr<2]kqZOUmr<0amqZQKir<1CFrrdoQr<.]Oj8XZ~> +qZ$KsJcF7"p]LWt"TAPps8)r4j8B+lj89&Ns8<)Fs8N4Qs8<(Os5X-0~> +qZ$KsJcF7"p]LWt"TAPps8)r4j8B+lj89&Ns8<)Fs8N4Qs8<(Os5X-0~> +qZ$KsJcF7"p]LWt"TAPps8)r4j8B+lj89&Ns8<)Fs8N4Qs8<(Os5X-0~> +qu?TtJcF-to`XmdqujXlr<2!;rWM-=qulWkr<1CFrrdoQ!WN<%"G-U6s+#~> +qu?TtJcF-to`XmdqujXlr<2!;rWM-=qulWkr<1CFrrdoQ!WN<%"G-U6s+#~> +qu?TtJcF-to`XmdqujXlr<2!;rWM-=qulWkr<1CFrrdoQ!WN<%"G-U6s+#~> +qu?TtJcF'rpB:-gqujUkr<2!;rWM* +qu?TtJcF'rpB:-gqujUkr<2!;rWM* +qu?TtJcF'rpB:-gqujUkr<2!;rWM* +qu?TtJcF!pq#pBjqZOLjr<2'=rrh*:qZQTlr<1LIrWIfPrr;p"JcFg2J:~> +qu?TtJcF!pq#pBjqZOLjr<2'=rrh*:qZQTlr<1LIrWIfPrr;p"JcFg2J:~> +qu?TtJcF!pq#pBjqZOLjr<2'=rrh*:qZQTlr<1LIrWIfPrr;p"JcFg2J:~> +qu?TtJcEpnq#pHlqZOLjr<2'=rrh'9qul]mr<1LIrWIfPrr;p"JcFg2J:~> +qu?TtJcEpnq#pHlqZOLjr<2'=rrh'9qul]mr<1LIrWIfPrr;p"JcFg2J:~> +qu?TtJcEpnq#pHlqZOLjr<2'=rrh'9qul]mr<1LIrWIfPrr;p"JcFg2J:~> +qu?TtJcEmmp]UHnq?4Cir<2'=rrh$8qul`nr<.]Ob5_DCJcFg2JH~> +qu?TtJcEmmp]UHnq?4Cir<2'=rrh$8qul`nr<.]Ob5_DCJcFg2JH~> +qu?TtJcEmmp]UHnq?4Cir<2'=rrh$8qul`nr<.]Ob5_DCJcFg2JH~> +qu?TtJcEjlpB:Eor<0Uir<2'=rrh!7r<2ior<.]Ob5_DCJcFg2JH~> +qu?TtJcEjlpB:Eor<0Uir<2'=rrh!7r<2ior<.]Ob5_DCJcFg2JH~> +qu?TtJcEjlpB:Eor<0Uir<2'=rrh!7r<2ior<.]Ob5_DCJcFg2JH~> +r;Z]uJcEgkp&tBpqujLhr<2'=rrh!7qulcor<.]OaoD;BJcFj3JH~> +r;Z]uJcEgkp&tBpqujLhr<2'=rrh!7qulcor<.]OaoD;BJcFj3JH~> +r;Z]uJcEgkp&tBpqujLhr<2'=rrh!7qulcor<.]OaoD;BJcFj3JH~> +r;Z]uJcEgkr<*0$"Sr6%rri9'\)[Dii8ah?fAlc3q#C9qJcEjlr<.]Ojo9l~> +r;Z]uJcEgkr<*0$"Sr6%rri9'\)[Dii8ah?fAlc3q#C9qJcEjlr<.]Ojo9l~> +r;Z]uJcEgkr<*0$"Sr6%rri9'\)[Dii8ah?fAlc3q#C9qJcEjlr<.]Ojo9l~> +r;Z]uJcEgkr<3-"o`Vbar<20@rWLd3qulfpr<.]OaoD;BJcFj3J-~> +r;Z]uJcEgkr<3-"o`Vbar<20@rWLd3qulfpr<.]OaoD;BJcFj3J-~> +r;Z]uJcEgkr<3-"o`Vbar<20@rWLd3qulfpr<.]OaoD;BJcFj3J-~> +r;Z]uJcEgkr<3*!p&qkbr<20@rWLa2quliqr<1ULrWIfPqZ$KsJcFj3JH~> +r;Z]uJcEgkr<3*!p&qkbr<20@rWLa2quliqr<1ULrWIfPqZ$KsJcFj3JH~> +r;Z]uJcEgkr<3*!p&qkbr<20@rWLa2quliqr<1ULrWIfPqZ$KsJcFj3JH~> +r;Z]uJcEgkr<3#tp]S(dr<20@rWL^1r<2rrr<1ULrWIfPqZ$KsJcFj3JH~> +r;Z]uJcEgkr<3#tp]S(dr<20@rWL^1r<2rrr<1ULrWIfPqZ$KsJcFj3JH~> +r;Z]uJcEgkr<3#tp]S(dr<20@rWL^1r<2rrr<1ULrWIfPqZ$KsJcFj3JH~> +r;Z]uJcEgkr<2usp]S+er<20@rWL^1qullrr<1[NrrdoQp](0pJcFj3JH~> +r;Z]uJcEgkr<2usp]S+er<20@rWL^1qullrr<1[NrrdoQp](0pJcFj3JH~> +r;Z]uJcEgkr<2usp]S+er<20@rWL^1qullrr<1[NrrdoQp](0pJcFj3JH~> +r;Z]uJcEgkr<2usp&qter<20@rWL[0r<2usr<1[NrrdoQpAb'oJcFm4JH~> +r;Z]uJcEgkr<2usp&qter<20@rWL[0r<2usr<1[NrrdoQpAb'oJcFm4JH~> +r;Z]uJcEgkr<2usp&qter<20@rWL[0r<2usr<1[NrrdoQpAb'oJcFm4JH~> +rVug!JcEdjr<3#tqud&\"Sr86j8B,Cj8K2-j89&Ws8<)Ns8N4Qs7ZKk"G-U8s+#~> +rVug!JcEdjr<3#tqud&\"Sr86j8B,Cj8K2-j89&Ws8<)Ns8N4Qs7ZKk"G-U8s+#~> +rVug!JcEdjr<3#tqud&\"Sr86j8B,Cj8K2-j89&Ws8<)Ns8N4Qs7ZKk"G-U8s+#~> +rVug!JcEdjr<3#tr<3,[p]S=kr<29CrWLO,r<3#tr<1[NrrdoQpAb'oJcFm4J:~> +rVug!JcEdjr<3#tr<3,[p]S=kr<29CrWLO,r<3#tr<1[NrrdoQpAb'oJcFm4J:~> +rVug!JcEdjr<3#tr<3,[p]S=kr<29CrWLO,r<3#tr<1[NrrdoQpAb'oJcFm4J:~> +rVug!JcEdjr<3&uqulrXp]SCmr<0@bqulrtr<1[NrrdoQpAb'oJcFm4JH~> +rVug!JcEdjr<3&uqulrXp]SCmr<0@bqulrtr<1[NrrdoQpAb'oJcFm4JH~> +rVug!JcEdjr<3&uqulrXp]SCmr<0@bqulrtr<1[NrrdoQpAb'oJcFm4JH~> +rVug!JcEdjr<3&uqullVq#nOor<0=ar<3&ur<1[NrrdoQpAb'oJcFm4JH~> +rVug!JcEdjr<3&uqullVq#nOor<0=ar<3&ur<1[NrrdoQpAb'oJcFm4JH~> +rVug!JcEdjr<3&uqullVq#nOor<0=ar<3&ur<1[NrrdoQpAb'oJcFm4JH~> +rVug!JcEdjr<3*!qZQ]Sq#nUqr<0=aquluur<1dQrWIfPo`+jmJcFm4JH~> +rVug!JcEdjr<3*!qZQ]Sq#nUqr<0=aquluur<1dQrWIfPo`+jmJcFm4JH~> +rVug!JcEdjr<3*!qZQ]Sq#nUqr<0=aquluur<1dQrWIfPo`+jmJcFm4JH~> +rVug!JcEdjr<3*!r<2cQq#n[sr<0:`r<3*!r<1dQrWIfPo`+jmJcFm4JH~> +rVug!JcEdjr<3*!r<2cQq#n[sr<0:`r<3*!r<1dQrWIfPo`+jmJcFm4JH~> +rVug!JcEdjr<3*!r<2cQq#n[sr<0:`r<3*!r<1dQrWIfPo`+jmJcFm4JH~> +rr;p"JcEair<3-"qulWOp]SXtr<0:`qum$!r<1jSrrdoQnGiFiJcFp5JH~> +rr;p"JcEair<3-"qulWOp]SXtr<0:`qum$!r<1jSrrdoQnGiFiJcFp5JH~> +rr;p"JcEair<3-"qulWOp]SXtr<0:`qum$!r<1jSrrdoQnGiFiJcFp5JH~> +rr;p"JcEair<3-"r<2WMp]S_!r<07_r<3-"r<1jSrrdoQnGiFiJcFp5JH~> +rr;p"JcEair<3-"r<2WMp]S_!r<07_r<3-"r<1jSrrdoQnGiFiJcFp5JH~> +rr;p"JcEair<3-"r<2WMp]S_!r<07_r<3-"r<1jSrrdoQnGiFiJcFp5JH~> +rr;p"JcEair<3-"r<2QKq#nk#r<2KIrWL4#r<3-"r<1jSrrf;#"lmCdB#+HErrqq\"ARMJgAh*S +JcFp5J-~> +rr;p"JcEair<3-"r<2QKq#nk#r<2KIrWL4#r<3-"r<1jSrrf;#"lmCdB#+HErrqq\"ARMJgAh*S +JcFp5J-~> +rr;p"JcEair<3-"r<2QKq#nk#r<2KIrWL4#r<3-"r<1jSrrf;#"lmCdB#+HErrqq\"ARMJgAh*S +JcFp5J-~> +rr;p"JcEair<30#qulBHq#nq%r<2KIrWL1"r<30#r<1jSrrf>$qud'qnc/Ug!nU-Lrr`?ss4[MO +"G-U9s+"~> +rr;p"JcEair<30#qulBHq#nq%r<2KIrWL1"r<30#r<1jSrrf>$qud'qnc/Ug!nU-Lrr`?ss4[MO +"G-U9s+"~> +rr;p"JcEair<30#qulBHq#nq%r<2KIrWL1"r<30#r<1jSrrf>$qud'qnc/Ug!nU-Lrr`?ss4[MO +"G-U9s+"~> +rr;p"JcEair<*0$"T8Jfj7ri'j8B,Ij8K2"j8B,\s8<)Ss8N5"rrV"N"9J_3s8W*"f*)!Sg&M!R +JcFp5J:~> +rr;p"JcEair<*0$"T8Jfj7ri'j8B,Ij8K2"j8B,\s8<)Ss8N5"rrV"N"9J_3s8W*"f*)!Sg&M!R +JcFp5J:~> +rr;p"JcEair<*0$"T8Jfj7ri'j8B,Ij8K2"j8B,\s8<)Ss8N5"rrV"N"9J_3s8W*"f*)!Sg&M!R +JcFp5J:~> +rr;p"JcEair<*0$"T8Jej7ic(j8B,Ij8K2"j8B,\s8<)Ss8N5!rrL^S!X*-8$308nZN&s8"Mk&k +s8<(Os6'E4~> +rr;p"JcEair<*0$"T8Jej7ic(j8B,Ij8K2"j8B,\s8<)Ss8N5!rrL^S!X*-8$308nZN&s8"Mk&k +s8<(Os6'E4~> +rr;p"JcEair<*0$"T8Jej7ic(j8B,Ij8K2"j8B,\s8<)Ss8N5!rrL^S!X*-8$308nZN&s8"Mk&k +s8<(Os6'E4~> +rr;p"JcEair<*0$"TAPcj7ic*j8B,Ij8K2!j8B)]rri<(JcGZJ!DN\#"R?#!fDjA#r<.]OkPp(~> +rr;p"JcEair<*0$"TAPcj7ic*j8B,Ij8K2!j8B)]rri<(JcGZJ!DN\#"R?#!fDjA#r<.]OkPp(~> +rr;p"JcEair<*0$"TAPcj7ic*j8B,Ij8K2!j8B)]rri<(JcGZJ!DN\#"R?#!fDjA#r<.]OkPp(~> +s8W$#JcE^hr<*0$"TAPaj7ri,j8B,Kj8T7tj8B)]rri<(JcGZJ!MBPu"Mh=9s3grG"G-U:s+#~> +s8W$#JcE^hr<*0$"TAPaj7ri,j8B,Kj8T7tj8B)]rri<(JcGZJ!MBPu"Mh=9s3grG"G-U:s+#~> +s8W$#JcE^hr<*0$"TAPaj7ri,j8B,Kj8T7tj8B)]rri<(JcGZJ!Mfi$"Mh==s3grG"G-U:s+#~> +s8W$#JcE^hr<*0$"TAP_j7ri.j8B,Kj8T7tj8B)]rri<(JcGZJ!S7GV"AOFHdJs.JJcFs6J:~> +s8W$#JcE^hr<*0$"TAP_j7ri.j8B,Kj8T7tj8B)]rri<(JcGZJ!S7GV"AOFHdJs.JJcFs6J:~> +s8W$#JcE^hr<*0$"TAP_j7ri.j8B,Kj8T7tj8B)]rri<(JcGZJ!S7GV"AOFHdJs.JJcFs6J:~> +s8W$#JcE^hq#oR7q#o=0r<2QKrrg*sq#l9Kqu?Wu!TX4-s8<(Os60K5~> +s8W$#JcE^hq#oR7q#o=0r<2QKrrg*sq#l9Kqu?Wu!TX4-s8<(Os60K5~> +s8W$#JcE^hq#oR7q#o=0r<2QKrrg*sq#l9Kqu?Wu!TX4-s8<(Os60K5~> +s8W$#JcE^hq#oO6p]T:1r<2QKrrg*sq#l9Kqu6\b"9J_^s3^lF"G-U:s+#~> +s8W$#JcE^hq#oO6p]T:1r<2QKrrg*sq#l9Kqu6\b"9J_^s3^lF"G-U:s+#~> +s8W$#JcE^hq#oO6p]T:1r<2QKrrg*sq#l9Kqu6\b"9J_^s3^lF"G-U:s+#~> +s8W$#JcE^hq#oI4p]T@3r<2QKrrg*sq#l9Kqu6]K"9J_!s3^lF"G-U:s+#~> +s8W$#JcE^hq#oI4p]T@3r<2QKrrg*sq#l9Kqu6]K"9J_!s3^lF"G-U:s+#~> +s8W$#JcE^hq#oI4p]T@3r<2QKrrg*sq#l9Kqu6]K"9J_%s3^lF"G-U:s+#~> +s8W$#JcE^hq#oC2q#oL5r<2ZNrWKppq#oXUrreqn!O;h0"ASpDs8<(Os60K5~> +s8W$#JcE^hq#oC2q#oL5r<2ZNrWKppq#oXUrreqn!O;h0"ASpDs8<(Os60K5~> +s8W$#JcE^hq#oC2q#oL5r<2ZNrWKppq#oXUrreqn!O;h0"ASpDs8<(Os60K5~> +s8W$#JcE^hq?5C0q#oR7r<2ZNr<0goq?5aVrreto!U>19J-5oVh>bq'r<.]Okl6/~> +s8W$#JcE^hq?5C0q#oR7r<2ZNr<0goq?5aVrreto!U>19J-5oVh>bq'r<.]Okl6/~> +s8W$#JcE^hq?5C0q#oR7r<2ZNr<0goq?5aVrreto!U>19J-5oVh>bq'r<.]Okl6/~> +s8W$#JcE^hq?5=.q#oX9r<2ZNr<0goq?5aVrreto",>jO"9J_3s3grG"G-U:s+#~> +s8W$#JcE^hq?5=.q#oX9r<2ZNr<0goq?5aVrreto",>jO"9J_3s3grG"G-U:s+#~> +s8W$#JcE^hq?5=.q#oX9r<2ZNr<0goq?5aVrreto",>jO"9J_3s3grG"G-U:s+#~> +s8W$#JcE^hq?5:-p]TU:r<2WMrWKppq?5aVrrf"p"Mg]1irfDdB)hl1!oosRf`1mQJcFs6J:~> +s8W$#JcE^hq?5:-p]TU:r<2WMrWKppq?5aVrrf"p"Mg]1irfDdB)hl1!oosRf`1mQJcFs6J:~> +s8W$#JcE^hq?5:-p]TU:r<2WMrWKppq?5aVrrf"p"Mgi5irfDdB)hl1!op*Vf`1mQJcFs6J:~> +s8W$#JcE^hqZP:+p]T[ +s8W$#JcE^hqZP:+p]T[ +s8W$#JcE^hqZP:+p]T[ +s8W$#JcE^hqZP4)q#og>r<2]OrrfmmqZPsZrWK"r#,"]Bl:p==s8N+m"9o!sj1kfLs4@;L"G-U: +s*t~> +s8W$#JcE^hqZP4)q#og>r<2]OrrfmmqZPsZrWK"r#,"]Bl:p==s8N+m"9o!sj1kfLs4@;L"G-U: +s*t~> +s8W$#JcE^hqZP4)q#og>r<2]OrrfmmqZPsZrWK"r#,FuFl:p==s8N+q"9o!sj1kfLs4@;L"G-U: +s*t~> +s8W$#JcEgkp]Sh$q#om@r<0(ZqZPsZrWK"rr<*/Qs8N$!h$!][!_q_Tf)P[OJcFs6JC~> +s8W$#JcEgkp]Sh$q#om@r<0(ZqZPsZrWK"rr<*/Qs8N$!h$!][!_q_Tf)P[OJcFs6JC~> +s8W$#JcEgkp]Sh$q#om@r<0(ZqZPsZrWK"rr<*/Qs8N$!h$!][!_q_Tf)P[OJcFs6JC~> +s8W$#JcEgkq#nh"q#osBr<0%Yqul'[rWK"r"Mb.Ph>dEQ"L8/)T` +s8W$#JcEgkq#nh"q#osBr<0%Yqul'[rWK"r"Mb.Ph>dEQ"L8/)T` +s8W$#JcEgkq#nh"q#osBr<0%Yqul'[rWK"r"Mb.Ph>dEQ"L8/)V#SsEr<.]Okl62~> +s8W$#JcEgkq#ne!p]TpCr<0%Yqul-]rrdoQjT#/]JcFs6J?~> +s8W$#JcEgkq#ne!p]TpCr<0%Yqul-]rrdoQjT#/]JcFs6J?~> +s8W$#JcEgkq#ne!p]TpCr<0%Yqul-]rrdoQjT#/]JcFs6J?~> +!WN<%"G-Tns7lf;j7icEj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tns7lf;j7icEj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tns7lf;j7icEj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tns7lf9j7riGj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tns7lf9j7riGj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tns7lf9j7riGj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tls8)r9j7riIj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tls8)r9j7riIj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tls8)r9j7riIj8B+Yj89&As8N4Qs5X.X"G-U;s*t~> +!WN<%"G-Tos8E-%rri9'^uP4no&KZOp#H#S[c@8gjo>>`JcFd1r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^uP4no&KZOp#H#S[c@8gjo>>`JcFd1r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^uP4no&KZOp#H#S[c@8gjo>>`JcFd1r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^Z5(lo],lQp#H#S[c@8gkl:VbJcF^/r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^Z5(lo],lQp#H#S[c@8gkl:VbJcF^/r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^Z5(lo],lQp#H#S[c@8gkl:VbJcF^/r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^#Skjp>c)SpuD>VZfCrdkl:VbJcF^/r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^#Skjp>c)SpuD>VZfCrdkl:VbJcF^/r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9'^#Skjp>c)SpuD>VZfCrdkl:VbJcF^/r<.]Ol2Q;~> +!WN<%"G-Tos8E-%rri9']Ar\ipZ)2TpuD>VZfCrdK)bcPaT)2AJcG!7JH~> +!WN<%"G-Tos8E-%rri9']Ar\ipZ)2TpuD>VZfCrdK)bcPaT)2AJcG!7JH~> +!WN<%"G-Tos8E-%rri9']Ar\ipZ)2TpuD>VZfCrdK)bcPaT)2AJcG!7JH~> +!WN<%"G-Tos8E-%rri9'\`VZfCrdKE(cNb5_DCJcG!7JH~> +!WN<%"G-Tos8E-%rri9'\`VZfCrdKE(cNb5_DCJcG!7JH~> +!WN<%"G-Tos8E-%rri9'\`VZfCrdKE(cNb5_DCJcG!7JH~> +!WN<%"G-Tqs8N6#s8<)/j7riTj8B,Uj8K1ej8B+4s7lfAs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<)/j7riTj8B,Uj8K1ej8B+4s7lfAs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<)/j7riTj8B,Uj8K1ej8B+4s7lfAs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<).j7icUj8B,Uj8K1ej8B+4s7ZZAs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<).j7icUj8B,Uj8K1ej8B+4s7ZZAs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<).j7icUj8B,Uj8K1ej8B+4s7ZZAs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<),j7icWj8B,Xj8K1bj8B+3s7QTBs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<),j7icWj8B,Xj8K1bj8B+3s7QTBs8<(Os69Q6~> +!WN<%"G-Tqs8N6#s8<),j7icWj8B,Xj8K1bj8B+3s7QTBs8<(Os69Q6~> +!WN<%"G-Tts8E/us8<)*j7rfYiro>aqr@YYYN,QaJcG?Fdf97KJcG!7JH~> +!WN<%"G-Tts8E/us8<)*j7rfYiro>aqr@YYYN,QaJcG?Fdf97KJcG!7JH~> +!WN<%"G-Tts8E/us8<)*j7rfYiro>aqr@YYYN,QaJcG?Fdf97KJcG!7JH~> +!WN<%"G-Tts8E/us8<)(j7WWQj8K1bj8B,Js8N4fs76BCs8<(Os69Q6~> +!WN<%"G-Tts8E/us8<)(j7WWQj8K1bj8B,Js8N4fs76BCs8<(Os69Q6~> +!WN<%"G-Tts8E/us8<)(j7WWQj8K1bj8B,Js8N4fs76BCs8<(Os69Q6~> +!WN<%"P3U("G$],"J,bIs8<(Os69Q6~> +!WN<%"P3U("G$],"J,bIs8<(Os69Q6~> +!WN<%"P3U("G$],"J,bIs8<(Os69Q6~> +!WN<%"P<[)"G$],"IoVHs8<(Os69Q6~> +!WN<%"P<[)"G$],"IoVHs8<(Os69Q6~> +!WN<%"P<[)"G$],"IoVHs8<(Os69Q6~> +!WN<%"PEa*"G$],"I]JGs8<(Os69Q6~> +!WN<%"PEa*"G$],"I]JGs8<(Os69Q6~> +!WN<%"PEa*"G$],"I]JGs8<(Os69Q6~> +!WN<%"P<[)"G$],"IoVHs8<(Os69Q6~> +!WN<%"P<[)"G$],"IoVHs8<(Os69Q6~> +!WN<%"P<[)"G$],"IoVHs8<(Os69Q6~> +!WN<%"G-Tks8<)!j8B,[j8K1_j8B,Ms8E.cs7$6Cs8<(Os69Q6~> +!WN<%"G-Tks8<)!j8B,[j8K1_j8B,Ms8E.cs7$6Cs8<(Os69Q6~> +!WN<%"G-Tks8<)!j8B,[j8K1_j8B,Ms8E.cs7$6Cs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.cs76BCs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.cs76BCs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.cs76BCs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.ds7?HBs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.ds7?HBs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.ds7?HBs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.ds7QTBs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.ds7QTBs8<(Os69Q6~> +!WN<%"G-U"s8E/rs8<)!j8B+Xj8B,Ms8E.ds7QTBs8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ms8E.es7ZZAs8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ms8E.es7ZZAs8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ms8E.es7ZZAs8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ps8E.bs7lfAs8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ps8E.bs7lfAs8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ps8E.bs7lfAs8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ps8E.cs7ul@s8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ps8E.cs7ul@s8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j8B+Xj8B,Ps8E.cs7ul@s8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j89%Xj8B,Ps8E.bs8<)As8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j89%Xj8B,Ps8E.bs8<)As8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j89%Xj8B,Ps8E.bs8<)As8<(Os69Q6~> +!WN<%"G-U$s8N5ps8<)!j89%Xj8B,Ps8E.Ps475K"G-U;s+(~> +!WN<%"G-U$s8N5ps8<)!j89%Xj8B,Ps8E.Ps475K"G-U;s+(~> +!WN<%"G-U$s8N5ps8<)!j89%Xj8B,Ps8E.Ps475K"G-U;s+(~> +!WN<%"G-U's8E/ms8<)!j89%Xj8B,Ps8E.Ps475K"G-U;s+(~> +!WN<%"G-U's8E/ms8<)!j89%Xj8B,Ps8E.Ps475K"G-U;s+(~> +!WN<%"G-U's8E/ms8<)!j89%Xj8B,Ps8E.Ps475K"G-U;s+(~> +!WN<%"G-U's8E/ms83#!j89%Yj89%2s2G$:"G-U;s+(~> +!WN<%"G-U's8E/ms83#!j89%Yj89%2s2G$:"G-U;s+(~> +!WN<%"G-U's8E/ms83#!j89%Yj89%2s2G$:"G-U;s+(~> +!WN<%"G-U's8E/ms83#!j89%Yj89%2s2G$:"G-U;s+(~> +!WN<%"G-U's8E/ms83#!j89%Yj89%2s2G$:"G-U;s+(~> +!WN<%"G-U's8E/ms83#!j89%Yj89%2s2G$:"G-U;s+(~> +!WN<%"G-U)s8N5ks83#"j89%Xj89%2s2G$:"G-U;s+(~> +!WN<%"G-U)s8N5ks83#"j89%Xj89%2s2G$:"G-U;s+(~> +!WN<%"G-U)s8N5ks83#"j89%Xj89%2s2G$:"G-U;s+(~> +!WN<%"G-U)s8N5ks83#"j89%Xj89%2s2G$:"G-U;s+(~> +!WN<%"G-U)s8N5ks83#"j89%Xj89%2s2G$:"G-U;s+(~> +!WN<%"G-U)s8N5ks83#"j89%Xj89%2s2G$:"G-U;s+(~> +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[XJcE^hr<.]Ol2Q9~> +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[XJcE^hr<.]Ol2Q9~> +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[XJcE^hr<.]Ol2Q9~> +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[XJcE^hr<.]Ol2Q9~> +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[XJcE^hr<.]Ol2Q9~> +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[XJcE^hr<.]Ol2Q9~> +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[Xq#C +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[Xq#C +!WN<%"G-U)s8N5ks83#%j8K/^iro>aVrR[Xq#C +!WN<%"G-Tks83#%j8K/^iro>aVrR[Xq#C +!WN<%"G-Tks83#%j8K/^iro>aVrR[Xq#C +!WN<%"G-Tks83#%j8K/^iro>aVrR[Xq#C +!WN<%"G-Tks83#%j8K/^iro>aVrR[XqZ$QuJcF$qr<.]Ol2Q;~> +!WN<%"G-Tks83#%j8K/^iro>aVrR[XqZ$QuJcF$qr<.]Ol2Q;~> +!WN<%"G-Tks83#%j8K/^iro>aVrR[XqZ$QuJcF$qr<.]Ol2Q;~> +s8W$#JcE^hquj.^rWE8^"TAP%j89&Vs8N4Qs3L`D"G-U:s+#~> +s8W$#JcE^hquj.^rWE8^"TAP%j89&Vs8N4Qs3L`D"G-U:s+#~> +s8W$#JcE^hquj.^rWE8^"TAP%j89&Vs8N4Qs3L`D"G-U:s+#~> +s8W$#JcE^hqZO1arWN2[r<0(ZqZQcqrrdoQci +s8W$#JcE^hqZO1arWN2[r<0(ZqZQcqrrdoQci +s8W$#JcE^hqZO1arWN2[r<0(ZqZQcqrrdoQci +s8W$#JcE^hqZO1arWN2[r<0(ZqZQcqrrdoQci +s8W$#JcE^hqZO1arWN2[r<0(ZqZQcqrrdoQci +s8W$#JcE^hqZO1arWN2[r<0(ZqZQcqrrdoQci +s8W$#JcFU,rWMQeqZNqZr<0(ZqZQcqrrdoQci +s8W$#JcFU,rWMQeqZNqZr<0(ZqZQcqrrdoQci +s8W$#JcFU,rWMQeqZNqZr<0(ZqZQcqrrdoQci +s8W$#JcFU,rWMQeq?3kZr<0+[q?6ZprrdoQci +s8W$#JcFU,rWMQeq?3kZr<0+[q?6ZprrdoQci +s8W$#JcFU,rWMQeq?3kZr<0+[q?6ZprrdoQci +s8W$#JcFU,rWMQeq?3kZr<0+[q?6csrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq?3kZr<0+[q?6csrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq?3kZr<0+[q?6csrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq?3kZr<0+[q?6csrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq?3kZr<0+[q?6csrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq?3kZr<0+[q?6csrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq#meZr<0.\q#pZrrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq#meZr<0.\q#pZrrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq#meZr<0.\q#pZrrWIfPc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq#meZr<0.\q#p]sr<.]Oc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq#meZr<0.\q#p]sr<.]Oc2[_FJcFs6J:~> +s8W$#JcFU,rWMQeq#meZr<0.\q#p]sr<.]Oc2[_FJcFs6J:~> +s8W$#JcF[.rrhQcq#n+crri2Yr<0.\q#p]sr<.]Oc2[_FJcFs6JH~> +s8W$#JcF[.rrhQcq#n+crri2Yr<0.\q#p]sr<.]Oc2[_FJcFs6JH~> +s8W$#JcF[.rrhQcq#n+crri2Yr<0.\q#p]sr<.]Oc2[_FJcFs6JH~> +s8W$#JcF[.rrhQcq#n+crri2Yr<0.\q#p]srWIfPbl@VEJcFs6JH~> +s8W$#JcF[.rrhQcq#n+crri2Yr<0.\q#p]srWIfPbl@VEJcFs6JH~> +s8W$#JcF[.rrhQcq#n+crri2Yr<0.\q#p]srWIfPbl@VEJcFs6JH~> +s8W$#JcFd1rWMB`r<*0$"TAP7j8K2Vj8B+]j8B)]rri3%JcEjlr<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j8K2Vj8B+]j8B)]rri3%JcEjlr<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j8K2Vj8B+]j8B)]rri3%JcEjlr<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j89&Vj8B+]j8B)]rri3%JcEjlr<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j89&Vj8B+]j8B)]rri3%JcEjlr<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j89&Vj8B+]j8B)]rri3%JcEjlr<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j89&Vj8B+]j8B)]rri<(JcEair<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j89&Vj8B+]j8B)]rri<(JcEair<.]Okl62~> +s8W$#JcFd1rWMB`r<*0$"TAP7j89&Vj8B+]j8B)]rri<(JcEair<.]Okl62~> +rr;p"JcFg2rWMB`r<30#r<0XjrWN)Xr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0XjrWN)Xr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0XjrWN)Xr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0^lrri)Vr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0^lrri)Vr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0^lrri)Vr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0^lrri)Vr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0^lrri)Vr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFg2rWMB`r<30#r<0^lrri)Vr<04^r<30#r<.]Oa8c)@JcFp5JH~> +rr;p"JcFp5rWM9]r<3-"r<0amrri)Vr<07_r<3-"r<.]Oa8c)@JcFp5JH~> +rr;p"JcFp5rWM9]r<3-"r<0amrri)Vr<07_r<3-"r<.]Oa8c)@JcFp5JH~> +rr;p"JcFp5rWM9]r<3-"r<0amrri)Vr<07_r<3-"r<.]Oa8c)@JcFp5JH~> +rr;p"JcFp5rWM9]r<3-"r<0amrri)Vr<07_r<30#quhTNa8c)@JcFp5JH~> +rr;p"JcFp5rWM9]r<3-"r<0amrri)Vr<07_r<30#quhTNa8c)@JcFp5JH~> +rr;p"JcFp5rWM9]r<3-"r<0amrri)Vr<07_r<30#quhTNa8c)@JcFp5JH~> +rr;p"JcEair<3-"quj[mrri)Vr<0:`qum'"quhTNa8c)@JcFp5JH~> +rr;p"JcEair<3-"quj[mrri)Vr<0:`qum'"quhTNa8c)@JcFp5JH~> +rr;p"JcEair<3-"quj[mrri)Vr<0:`qum'"quhTNa8c)@JcFp5JH~> +rr;p"JcEair<3*!r<0mqrWMoSr<0:`r<3-"quhTNa8c)@JcFp5JH~> +rr;p"JcEair<3*!r<0mqrWMoSr<0:`r<3-"quhTNa8c)@JcFp5JH~> +rr;p"JcEair<3*!r<0mqrWMoSr<0:`r<3-"quhTNa8c)@JcFp5JH~> +rVug!JcEdjr<3*!qujgqrWMoSr<0=aqum$!quhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3*!qujgqrWMoSr<0=aqum$!quhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3*!qujgqrWMoSr<0=aqum$!quhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3&ur<0prrWMoSr<0=ar<3*!quhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3&ur<0prrWMoSr<0=ar<3*!quhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3&ur<0prrWMoSr<0=ar<3*!quhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3&uqujjrrWMoSr<0@bquluuquhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3&uqujjrrWMoSr<0@bquluuquhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3&uqujjrrWMoSr<0@bquluuquhTNaT)2AJcFm4JH~> +rVug!JcEdjr<3#tr<0ssrWMoSr<0@br<30#rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcEdjr<3#tr<0ssrWMoSr<0@br<30#rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcEdjr<3#tr<0ssrWMoSr<0@br<30#rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcG'9rWM0Zr<3#tquj@dr<0Ccqum'"rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcG'9rWM0Zr<3#tquj@dr<0Ccqum'"rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcG'9rWM0Zr<3#tquj@dr<0Ccqum'"rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcG'9rWM0Zr<2usr<0Ier<0Ccr<3-"rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcG'9rWM0Zr<2usr<0Ier<0Ccr<3-"rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcG'9rWM0Zr<2usr<0Ier<0Ccr<3-"rWE9%"TAOTs2b6="G-U8s+#~> +rVug!JcG'9rWM0Zr<2usqujCer<0Fdqum$!rWE9%"TAOTs2k<>"G-U7s+#~> +rVug!JcG'9rWM0Zr<2usqujCer<0Fdqum$!rWE9%"TAOTs2k<>"G-U7s+#~> +rVug!JcG'9rWM0Zr<2usqujCer<0Fdqum$!rWE9%"TAOTs2k<>"G-U7s+#~> +r;Z]uJcG0"G-U7s+#~> +r;Z]uJcG0"G-U7s+#~> +r;Z]uJcG0"G-U7s+#~> +r;Z]uJcG0 +r;Z]uJcG0 +r;Z]uJcG0 +r;Z]uJcG0 +r;Z]uJcG0 +r;Z]uJcG0 +r;Z]uJcG9?rWM!Ur<2oqquk1&rWM`Nr<0Lfr<*0$"TJW%s8<(Os2k<>"G-U7s+#~> +r;Z]uJcG9?rWM!Ur<2oqquk1&rWM`Nr<0Lfr<*0$"TJW%s8<(Os2k<>"G-U7s+#~> +r;Z]uJcG9?rWM!Ur<2oqquk1&rWM`Nr<0Lfr<*0$"TJW%s8<(Os2k<>"G-U7s+#~> +r;Z]uJcG9?rWM!Ur<2lpquk4'rWM`Nr<0Ogqud'#"TJW%s8<(Os2k<>"G-U7s+#~> +r;Z]uJcG9?rWM!Ur<2lpquk4'rWM`Nr<0Ogqud'#"TJW%s8<(Os2k<>"G-U7s+#~> +r;Z]uJcG9?rWM!Ur<2lpquk4'rWM`Nr<0Ogqud'#"TJW%s8<(Os2k<>"G-U7s+#~> +r;Z]uJcG9?rWM!Ur<2ior<1F+rWMWKr<0Ogr<30#rWN,ur<.]OaoD;BJcFj3J:~> +r;Z]uJcG9?rWM!Ur<2ior<1F+rWMWKr<0Ogr<30#rWN,ur<.]OaoD;BJcFj3J:~> +r;Z]uJcG9?rWM!Ur<2ior<1F+rWMWKr<0Ogr<30#rWN,ur<.]OaoD;BJcFj3J:~> +qu?TtJcG<@rWM!Ur<2ioquk@+rWMWKr<0Rhqul`nr<.]Ob5_DCJcFg2JH~> +qu?TtJcG<@rWM!Ur<2ioquk@+rWMWKr<0Rhqul`nr<.]Ob5_DCJcFg2JH~> +qu?TtJcG<@rWM!Ur<2ioquk@+rWMWKr<0Rhqul`nr<.]Ob5_DCJcFg2JH~> +qu?TtJcG<@rWM!Ur<2fnqukC,rWMWKr<0Uiqul]mr<.]Ob5_DCJcFg2JH~> +qu?TtJcG<@rWM!Ur<2fnqukC,rWMWKr<0Uiqul]mr<.]Ob5_DCJcFg2JH~> +qu?TtJcG<@rWM!Ur<2fnqukC,rWMWKr<0Uiqul]mr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2fnqZP=,rWMWKr<0XjqZQTlr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2fnqZP=,rWMWKr<0XjqZQTlr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2fnqZP=,rWMWKr<0XjqZQTlr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2cmqukF-rWMWKr<0XjqulZlr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2cmqukF-rWMWKr<0XjqulZlr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2cmqukF-rWMWKr<0XjqulZlr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2`lqukO0rrhWIr<0[kqulWkr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2`lqukO0rrhWIr<0[kqulWkr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2`lqukO0rrhWIr<0[kqulWkr<.]Ob5_DCJcFg2JH~> +qu?TtJcGECrWLmRr<2]kqukR1rrhWIr<0^lqum$!rWN#rr<.]Ob5_DCJcFg2J:~> +qu?TtJcGECrWLmRr<2]kqukR1rrhWIr<0^lqum$!rWN#rr<.]Ob5_DCJcFg2J:~> +qu?TtJcGECrWLmRr<2]kqukR1rrhWIr<0^lqum$!rWN#rr<.]Ob5_DCJcFg2J:~> +qZ$KsJcGHDrWLmRr<2]kqZPL1rrhWIr<0amqZQourWN#rr<.]ObQ%MDJcFd1J:~> +qZ$KsJcGHDrWLmRr<2]kqZPL1rrhWIr<0amqZQourWN#rr<.]ObQ%MDJcFd1J:~> +qZ$KsJcGHDrWLmRr<2]kqZPL1rrhWIr<0amqZQourWN#rr<.]ObQ%MDJcFd1J:~> +qZ$KsJcEmmr<2ZjqZPO2rrhWIr<0dnqZQltrWN#rr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2ZjqZPO2rrhWIr<0dnqZQltrWN#rr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2ZjqZPO2rrhWIr<0dnqZQltrWN#rr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2WiqukX3rrhWIr<0dnqum$!rri#pr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2WiqukX3rrhWIr<0dnqum$!rri#pr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2WiqukX3rrhWIr<0dnqum$!rri#pr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2Thquk[4rrhWIr<0goquluurri#pr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2Thquk[4rrhWIr<0goquluurri#pr<.]ObQ%MDJcFd1JH~> +qZ$KsJcEmmr<2Thquk[4rrhWIr<0goquluurri#pr<.]ObQ%MDJcFd1JH~> +q>^BrJcEpnr<2Qgqukg8rWMHFr<0jpqum'"rWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcEpnr<2Qgqukg8rWMHFr<0jpqum'"rWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcEpnr<2Qgqukg8rWMHFr<0jpqum'"rWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcEpnr<2QgqZPa8rWMHFr<0mqqZQs!rWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcEpnr<2QgqZPa8rWMHFr<0mqqZQs!rWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcEpnr<2QgqZPa8rWMHFr<0mqqZQs!rWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcGZJrWL^Mr<2NfqZOdrr<0prqZQourWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcGZJrWL^Mr<2NfqZOdrr<0prqZQourWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcGZJrWL^Mr<2NfqZOdrr<0prqZQourWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcGZJrWL^Mr<2Kequjmsr<0prquluurWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcGZJrWL^Mr<2Kequjmsr<0prquluurWMimr<.]Obl@VEJcFa0JH~> +q>^BrJcGZJrWL^Mr<2Kequjmsr<0prquluurWMimr<.]Obl@VEJcFa0JH~> +q#C9qJcG]KrWL^Mr<2HdqZOjtr<1!tqZQisrWMimr<.]Oc2[_FJcF^/JH~> +q#C9qJcG]KrWL^Mr<2HdqZOjtr<1!tqZQisrWMimr<.]Oc2[_FJcF^/JH~> +q#C9qJcG]KrWL^Mr<2HdqZOjtr<1!tqZQisrWMimr<.]Oc2[_FJcF^/JH~> +q#C9qJcGcMrrg^Kr<2EcqZOmur<1$uqZQourWM`jr<.]Oc2[_FJcF^/JH~> +q#C9qJcGcMrrg^Kr<2EcqZOmur<1$uqZQourWM`jr<.]Oc2[_FJcF^/JH~> +q#C9qJcGcMrrg^Kr<2EcqZOmur<1$uqZQourWM`jr<.]Oc2[_FJcF^/JH~> +q#C9qJcGcMrrg^Kr<2Ecq?4gur<1(!q?6ftrWM`jr<.]Oc2[_FJcF^/JH~> +q#C9qJcGcMrrg^Kr<2Ecq?4gur<1(!q?6ftrWM`jr<.]Oc2[_FJcF^/JH~> +q#C9qJcGcMrrg^Kr<2Ecq?4gur<1(!q?6ftrWM`jr<.]Oc2[_FJcF^/JH~> +q#C9qJcGcMrrg^Kr<2?aqZQ-Crrh?Ar<1+"qZQisrWM`jr<.]Oc2[_FJcF^/J:~> +q#C9qJcGcMrrg^Kr<2?aqZQ-Crrh?Ar<1+"qZQisrWM`jr<.]Oc2[_FJcF^/J:~> +q#C9qJcGcMrrg^Kr<2?aqZQ-Crrh?Ar<1+"qZQisrWM`jr<.]Oc2[_FJcF^/J:~> +p](0pJc>cN"9AZ*dJs.JkPtD^l/VdHioBt?`oHq!qu?WunGiFiJcF$qr<.]Oi;\?~> +p](0pJc>cN"9AZ*dJs.JkPtD^l/VdHioBt?`oHq!qu?WunGiFiJcF$qr<.]Oi;\?~> +p](0pJc>cN"9AZ*dJs.JkPtD^l/VdHioBt?`oHq!qu?WunGiFiJcF$qr<.]Oi;\?~> +p](0pJc>cN"9AZ*dJs.Jk5Y;]lJqmIioBt?aQ*+"qZ$NtnGiFiJcF$qr<.]Oi;\?~> +p](0pJc>cN"9AZ*dJs.Jk5Y;]lJqmIioBt?aQ*+"qZ$NtnGiFiJcF$qr<.]Oi;\?~> +p](0pJc>cN"9AZ*dJs.Jk5Y;]lJqmIioBt?aQ*+"qZ$NtnGiFiJcF$qr<.]Oi;\?~> +p](0pKE(oRcN!hGjo>/[m,S*KioBt?alE4#q>^EsnGiFiJcF$qr<.]Oi;\?~> +p](0pKE(oRcN!hGjo>/[m,S*KioBt?alE4#q>^EsnGiFiJcF$qr<.]Oi;\?~> +p](0pKE(oRcN!hGjo>/[m,S*KioBt?alE4#q>^EsnGiFiJcF$qr<.]Oi;\?~> +p](0pKE(oRcN!hGjT#&ZmGn3LioBt?b2`=$jT#/]JcF$qr<.]Oi;\?~> +p](0pKE(oRcN!hGjT#&ZmGn3LioBt?b2`=$jT#/]JcF$qr<.]Oi;\?~> +p](0pKE(oRcN!hGjT#&ZmGn3LioBt?b2`=$jT#/]JcF$qr<.]Oi;\?~> +pAb'oK`D#ScN!hGj8\rYmc4 +pAb'oK`D#ScN!hGj8\rYmc4 +pAb'oK`D#ScN!hGj8\rYmc4 +pAb'oK`D#ScN!hGiW&cXo&K]Pi8ab=biAR'iW&iZJcF'rr<.]OhuA6~> +pAb'oK`D#ScN!hGiW&cXo&K]Pi8ab=biAR'iW&iZJcF'rr<.]OhuA6~> +pAb'oK`D#ScN!hGiW&cXo&K]Pi8ab=biAR'iW&iZJcF'rr<.]OhuA6~> +pAb'oK`D#ScN!hGi;`ZWoAffQi8ab=c/\[(i;``YJcF'rr<.]OhuA6~> +pAb'oK`D#ScN!hGi;`ZWoAffQi8ab=c/\[(i;``YJcF'rr<.]OhuA6~> +pAb'oK`D#ScN!hGi;`ZWoAffQi8ab=c/\[(i;``YJcF'rr<.]OhuA6~> +pAb'oL]@>VbQ%MDhuENUp#H#Si8ab=cf=j)huEWXJcF'rr<.]OhuA6~> +pAb'oL]@>VbQ%MDhuENUp#H#Si8ab=cf=j)huEWXJcF'rr<.]OhuA6~> +pAb'oL]@>VbQ%MDhuENUp#H#Si8ab=cf=j)huEWXJcF'rr<.]OhuA6~> +p&FsnM#[GWbQ%MDhZ*ETp>c,Ti8ab=d,Xs*p](3qli6ndJcF*sr<.]OhZ&-~> +p&FsnM#[GWbQ%MDhZ*ETp>c,Ti8ab=d,Xs*p](3qli6ndJcF*sr<.]OhZ&-~> +p&FsnM#[GWbQ%MDhZ*ETp>c,Ti8ab=d,Xs*p](3qli6ndJcF*sr<.]OhZ&-~> +p&FsnM#[GWbQ%MDh>d9RpuD>Vi8ab=dc:-+pAb*pli6ndJcF*sr<.]OhZ&-~> +p&FsnM#[GWbQ%MDh>d9RpuD>Vi8ab=dc:-+pAb*pli6ndJcF*sr<.]OhZ&-~> +p&FsnM#[GWbQ%MDh>d9RpuD>Vi8ab=dc:-+pAb*pli6ndJcF*sr<.]OhZ&-~> +p&FsnJcF'rr<1mTq#pWUrrh0 +p&FsnJcF'rr<1mTq#pWUrrh0 +p&FsnJcF'rr<1mTq#pWUrrh0 +p&FsnJcF'rr<1jSp]UTVrrh0 +p&FsnJcF'rr<1jSp]UTVrrh0 +p&FsnJcF'rr<1jSp]UTVrrh0 +o`+jmJcF*sr<1dQp]LWX"9AYchW+P;f]2`0p&Fsnkl:SaJcF-tr<.]Oh>`$~> +o`+jmJcF*sr<1dQp]LWX"9AYchW+P;f]2`0p&Fsnkl:SaJcF-tr<.]Oh>`$~> +o`+jmJcF*sr<1dQp]LWX"9AYchW+P;f]2`0p&Fsnkl:SaJcF-tr<.]Oh>`$~> +o`+jmJcF*sr<1^OpB9=4r<1j7p]U3grWMEar<.]OdJs.JJcFR+J-~> +o`+jmJcF*sr<1^OpB9=4r<1j7p]U3grWMEar<.]OdJs.JJcFR+J-~> +o`+jmJcF*sr<1^OpB9=4r<1j7p]U3grWMEar<.]OdJs.JJcFR+J-~> +o`+jmJcF*sr<1XMq#oO6r<1m8q#p6frWMEar<.]OdJs.JJcFR+J-~> +o`+jmJcF*sr<1XMq#oO6r<1m8q#p6frWMEar<.]OdJs.JJcFR+J-~> +o`+jmJcF*sr<1XMq#oO6r<1m8q#p6frWMEar<.]OdJs.JJcFR+J-~> +o`+jmNrT(]`rGu?df9+GhrFY +o`+jmNrT(]`rGu?df9+GhrFY +o`+jmNrT(]`rGu?df9+GhrFY +oDealO8o1^`rGu?d/WnEiT'k>hrFM8mJm.gkPtJ`JcF0ur<.]Oh#Dp~> +oDealO8o1^`rGu?d/WnEiT'k>hrFM8mJm.gkPtJ`JcF0ur<.]Oh#Dp~> +oDealO8o1^`rGu?d/WnEiT'k>hrFM8mJm.gkPtJ`JcF0ur<.]Oh#Dp~> +oDealO8o1^`rGu?ci<_BjQ$1AioBb9mf3:ijT#/]JcF0ur<.]Oh#Dp~> +oDealO8o1^`rGu?ci<_BjQ$1AioBb9mf3:ijT#/]JcF0ur<.]Oh#Dp~> +oDealO8o1^`rGu?ci<_BjQ$1AioBb9mf3:ijT#/]JcF0ur<.]Oh#Dp~> +o)JXkOT5:_`rGu?c2[G>ki;UEk2Z+;m/R(gjT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?c2[G>ki;UEk2Z+;m/R(gjT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?c2[G>ki;UEk2Z+;m/R(gjT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?bQ%2;lf7pHl/VC=lMpkejT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?bQ%2;lf7pHl/VC=lMpkejT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?bQ%2;lf7pHl/VC=lMpkejT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?aT(l8mc46Km,R^@kPtPbjT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?aT(l8mc46Km,R^@kPtPbjT#/]JcF4!r<.]Og])g~> +o)JXkOT5:_`rGu?aT(l8mc46Km,R^@kPtPbjT#/]JcF4!r<.]Og])g~> +nc/OjPlL^c_uKZ +nc/OjPlL^c_uKZ +nc/OjPlL^c_uKZ +nc/OjPlL^c_uKZbZGj8])]irAr[JcF7"r<.]OgAc^~> +nc/OjPlL^c_uKZbZGj8])]irAr[JcF7"r<.]OgAc^~> +nc/OjPlL^c_uKZbZGj8])]irAr[JcF7"r<.]OgAc^~> +nc/OjPlL^c_uG8j_$#>heGoIMJcFI(JE~> +nc/OjPlL^c_uG8j_$#>heGoIMJcFI(JE~> +nc/OjPlL^c_uG8j_$#>heGoIMJcFI(JE~> +nGiFiQN-md_uG8j_$#>hec5RNJcFF'JE~> +nGiFiQN-md_uG8j_$#>hec5RNJcFF'JE~> +nGiFiQN-md_uG8j_$#>hec5RNJcFF'JE~> +nGiFiQN-md_uG8j_$#>hec5RNJcFF'JE~> +nGiFiQN-md_uG8j_$#>hec5RNJcFF'JE~> +nGiFiQN-md_uG8j_$#>hec5RNJcFF'JE~> +nGiFiQN-pe_Z,/i_$#>hf)P[OJcFC&JE~> +nGiFiQN-pe_Z,/i_$#>hf)P[OJcFC&JE~> +nGiFiQN-pe_Z,/i_$#>hf)P[OJcFC&JE~> +n,N=hRK*9iOoPC`ec5RNJcC<$p](0pJcFC&JH~> +n,N=hRK*9iOoPC`ec5RNJcC<$p](0pJcFC&JH~> +n,N=hRK*9iOoPC`ec5RNJcC<$p](0pJcFC&JH~> +n,N=hRK*9iOoPC`ec5RNJcC<$p](0pJcFC&JH~> +n,N=hRK*9iOoPC`ec5RNJcC<$p](0pJcFC&JH~> +n,N=hRK*9iOoPC`ec5RNJcC<$p](0pJcFC&JH~> +mf34gRfEBjPQ1Xcdf97KJcC<$q#C9qJcF@%JH~> +mf34gRfEBjPQ1Xcdf97KJcC<$q#C9qJcF@%JH~> +mf34gRfEBjPQ1Xcdf97KJcC<$q#C9qJcF@%JH~> +mf34gRfEBjPQ1Xcdf97Kc2[bGJcDqRr<.]OfDg@~> +mf34gRfEBjPQ1Xcdf97Kc2[bGJcDqRr<.]OfDg@~> +mf34gRfEBjPQ1Xcdf97Kc2[bGJcDqRr<.]OfDg@~> +mf34gRfEBjPQ1Xcdf97Kc2[bGJcDqRr<.]OfDg@~> +mf34gRfEBjPQ1Xcdf97Kc2[bGJcDqRr<.]OfDg@~> +mf34gRfEBjPQ1Xcdf97Kc2[bGJcDqRr<.]OfDg@~> +mJm+fJcDeNrrgdMr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDeNrrgdMr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDeNrrgdMr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDeNrrgdMr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDeNrrgdMr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDeNrrgdMr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDnQrWLUJr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDnQrWLUJr<1CFrWIfPYlFY)JcF=$JH~> +mJm+fJcDnQrWLUJr<1CFrWIfPYlFY)JcF=$JH~> +m/R"eJcDqRrWLUJr<1LIrWIfPY5eG'JcF:#JH~> +m/R"eJcDqRrWLUJr<1LIrWIfPY5eG'JcF:#JH~> +m/R"eJcDqRrWLUJr<1LIrWIfPY5eG'JcF:#JH~> +m/R"eJcDqRrWLUJr<1LIrWIfPY5eG'JcF:#JH~> +m/R"eJcDqRrWLUJr<1LIrWIfPY5eG'JcF:#JH~> +m/R"eJcDqRrWLUJr<1LIrWIfPY5eG'JcF:#JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +li6ndUAt5rJcFR+r<1LIrWIfPYQ+P(JcF7"JH~> +lMpecVZ6VuJcFL)r<1RKrrdoQXoJ>&JcF4!JH~> +lMpecVZ6VuJcFL)r<1RKrrdoQXoJ>&JcF4!JH~> +lMpecVZ6VuJcFL)r<1RKrrdoQXoJ>&JcF4!JH~> +lMpecVZ6VuJcFL)r<1RKrrdoQXoJ>&JcF4!JH~> +lMpecVZ6VuJcFL)r<1RKrrdoQXoJ>&JcF4!JH~> +lMpecVZ6VuJcFL)r<1RKrrdoQXoJ>&JcF4!JH~> +lMpbbVuQ`!PlLadb5_DCdf9=MJcDnQquhTNe,Oq~> +lMpbbVuQ`!PlLadb5_DCdf9=MJcDnQquhTNe,Oq~> +lMpbbVuQ`!PlLadb5_DCdf9=MJcDnQquhTNe,Oq~> +l2U\bVuQ`!PlLadb5_DCdf9=MJcDnQr<.]Odf4h~> +l2U\bVuQ`!PlLadb5_DCdf9=MJcDnQr<.]Odf4h~> +l2U\bVuQ`!PlLadb5_DCdf9=MJcDnQr<.]Odf4h~> +l2UYaW;li"PlLadb5_DCdf9=MJcDqRquhTNdf4h~> +l2UYaW;li"PlLadb5_DCdf9=MJcDqRquhTNdf4h~> +l2UYaW;li"PlLadb5_DCdf9=MJcDqRquhTNdf4h~> +kl:SaX8i/%OoPFab5_DCdf9=MJcDqRr<.]OdJn_~> +kl:SaX8i/%OoPFab5_DCdf9=MJcDqRr<.]OdJn_~> +kl:SaX8i/%OoPFab5_DCdf9=MJcDqRr<.]OdJn_~> +kl:P`XT/8&OoPFab5_DCJcC<$s8W!"JcF-tJH~> +kl:P`XT/8&OoPFab5_DCJcC<$s8W!"JcF-tJH~> +kl:P`XT/8&OoPFab5_DCJcC<$s8W!"JcF-tJH~> +kPtJ`XT/8&OoPFab5_DCJcC<$s8W$#JcF*sJH~> +kPtJ`XT/8&OoPFab5_DCJcC<$s8W$#JcF*sJH~> +kPtJ`XT/8&OoPFab5_DCJcC<$s8W$#JcF*sJH~> +kPtG_YQ+V*OoPC`aT)2AJcC<$!WN<$"G-U"s+#~> +kPtG_YQ+V*OoPC`aT)2AJcC<$!WN<$"G-U"s+#~> +kPtG_YQ+V*OoPC`aT)2AJcC<$!WN<$"G-U"s+#~> +k5YA_YQ+V*OoPC`aT)2AJcC<$!WN<%"G-U!s+#~> +k5YA_YQ+V*OoPC`aT)2AJcC<$!WN<%"G-U!s+#~> +k5YA_YQ+V*OoPC`aT)2AJcC<$!WN<%"G-U!s+#~> +k5YA_YQ+V*OoPC`aT)2AJcC<$quhTNci8O~> +k5YA_YQ+V*OoPC`aT)2AJcC<$quhTNci8O~> +k5YA_YQ+V*OoPC`aT)2AJcC<$quhTNci8O~> +jo>8^YlF_+OoPC`aT)2Af`1pRJcDkPr<.]OcMrC~> +jo>8^YlF_+OoPC`aT)2Af`1pRJcDkPr<.]OcMrC~> +jo>8^YlF_+OoPC`aT)2Af`1pRJcDkPr<.]OcMrC~> +jo>8^YlF_+OoPC`aT)2Af`1pRJcDkPr<.]OcMrC~> +jo>8^YlF_+OoPC`aT)2Af`1pRJcDkPr<.]OcMrC~> +jo>8^YlF_+OoPC`aT)2Af`1pRJcDkPr<.]OcMrC~> +jo>5]JcEUerWL4?r<1jSrrdoQX8i,$JcF!pJH~> +jo>5]JcEUerWL4?r<1jSrrdoQX8i,$JcF!pJH~> +jo>5]JcEUerWL4?r<1jSrrdoQX8i,$JcF!pJH~> +jT#/]JcEUerWL4?r<1jSrrdoQX8i,$JcF!pJH~> +jT#/]JcEUerWL4?r<1jSrrdoQX8i,$JcF!pJH~> +jT#/]JcEUerWL4?r<1jSrrdoQX8i,$JcF!pJH~> +jT#,\JcE^hrrg4=r<1jSrrdoQXT/2$JcF!pJH~> +jT#,\JcE^hrrg4=r<1jSrrdoQXT/2$JcF!pJH~> +jT#,\JcE^hrrg4=r<1jSrrdoQXT/2$JcF!pJH~> +j8]&\JcE^hrrg4=r<1jSrrdoQXT/5%JcEsoJH~> +j8]&\JcE^hrrg4=r<1jSrrdoQXT/5%JcEsoJH~> +j8]&\JcE^hrrg4=r<1jSrrdoQXT/5%JcEsoJH~> +j8]#[JcEairrg4=r<1jSrrdoQXoJ;%JcEsoJH~> +j8]#[JcEairrg4=r<1jSrrdoQXoJ;%JcEsoJH~> +j8]#[JcEairrg4=r<1jSrrdoQXoJ;%JcEsoJH~> +irAr[\c;X3JcF*sr<1jSrrdoQXoJ>&JcEpnJH~> +irAr[\c;X3JcF*sr<1jSrrdoQXoJ>&JcEpnJH~> +irAr[\c;X3JcF*sr<1jSrrdoQXoJ>&JcEpnJH~> +irAoZ])Va4JcF*sr<1sVrWIfPXT/2$JcEpnJH~> +irAoZ])Va4JcF*sr<1sVrWIfPXT/2$JcEpnJH~> +irAoZ])Va4JcF*sr<1sVrWIfPXT/2$JcEpnJH~> +iW&iZ])Va4JcF*sr<1sVrWIfPXT/5%JcEmmJH~> +iW&iZ])Va4JcF*sr<1sVrWIfPXT/5%JcEmmJH~> +iW&iZ])Va4JcF*sr<1sVrWIfPXT/5%JcEmmJH~> +iW&fY]Dqj5JcF*sr<2$XrrdoQWrMu"JcEmmJH~> +iW&fY]Dqj5JcF*sr<2$XrrdoQWrMu"JcEmmJH~> +iW&fY]Dqj5JcF*sr<2$XrrdoQWrMu"JcEmmJH~> +i;``Y]Dqj5JcF*sr<2$XrrdoQWrN##JcEjlJH~> +i;``Y]Dqj5JcF*sr<2$XrrdoQWrN##JcEjlJH~> +i;``Y]Dqj5JcF*sr<2$XrrdoQWrN##JcEjlJH~> +i;`]X^An39OoPC`_#O?9huE]ZJcDeNquhTNao?k~> +i;`]X^An39OoPC`_#O?9huE]ZJcDeNquhTNao?k~> +i;`]X^An39OoPC`_#O?9huE]ZJcDeNquhTNao?k~> +huEWX^An39OoPC`_#O?9huE]ZJcDeNr<.]OaT$b~> +huEWX^An39OoPC`_#O?9huE]ZJcDeNr<.]OaT$b~> +huEWX^An39OoPC`_#O?9huE]ZJcDeNr<.]OaT$b~> +huETW^]4<:OoPC`_#O?9huE]ZJcDhOquhTNaT$b~> +huETW^]4<:OoPC`_#O?9huE]ZJcDhOquhTNaT$b~> +huETW^]4<:OoPC`_#O?9huE]ZJcDhOquhTNaT$b~> +hZ*NW_Z0T +hZ*NW_Z0T +hZ*NW_Z0T +hZ*KV_uK]=OoPFa^&S$6JcCT,quhTNa8^\~> +hZ*KV_uK]=OoPFa^&S$6JcCT,quhTNa8^\~> +hZ*KV_uK]=OoPFa^&S$6JcCT,quhTNa8^\~> +h>dBU`;ff>OoPFa^&S$6JcCW-quhTN`rCS~> +h>dBU`;ff>OoPFa^&S$6JcCW-quhTN`rCS~> +h>dBU`;ff>OoPFa^&S$6JcCW-quhTN`rCS~> +h>dBU`;ff>OoPFa^&S$6JcCW-quhTN`rCS~> +h>dBU`;ff>OoPFa^&S$6JcCW-quhTN`rCS~> +h>dBU`;ff>OoPFa^&S$6JcCW-quhTN`rCS~> +h#I9T`W,o?OoPFa^&S$6JcCZ.quhTN`W(J~> +h#I9T`W,o?OoPFa^&S$6JcCZ.quhTN`W(J~> +h#I9T`W,o?OoPFa^&S$6JcCZ.quhTN`W(J~> +g].3Ta8c/BP5kI`]Dqg4JcCZ.r<.]O`;bA~> +g].3Ta8c/BP5kI`]Dqg4JcCZ.r<.]O`;bA~> +g].3Ta8c/BP5kI`]Dqg4JcCZ.r<.]O`;bA~> +g].0SaT)8CP5kI`]Dqg4JcC]/quhTN`;bA~> +g].0SaT)8CP5kI`]Dqg4JcC]/quhTN`;bA~> +g].0SaT)8CP5kI`]Dqg4JcC]/quhTN`;bA~> +gAh'RaoDADP5kI`]Dqg4irB#]JcDnQquhTN_uG5~> +gAh'RaoDADP5kI`]Dqg4irB#]JcDnQquhTN_uG5~> +gAh'RaoDADP5kI`]Dqg4irB#]JcDnQquhTN_uG5~> +gAh'RJcFI(rrfh2r<2-[rrdoQY5eD&JcEXfJH~> +gAh'RJcFI(rrfh2r<2-[rrdoQY5eD&JcEXfJH~> +gAh'RJcFI(rrfh2r<2-[rrdoQY5eD&JcEXfJH~> +g&LsQJcFL)rrfh2r<2-[rrdoQYQ+M'JcEUeJH~> +g&LsQJcFL)rrfh2r<2-[rrdoQYQ+M'JcEUeJH~> +g&LsQJcFL)rrfh2r<2-[rrdoQYQ+M'JcEUeJH~> +f`1mQJcFL)rrfh2r<2-[rrdoQYQ+P(JcERdJH~> +f`1mQJcFL)rrfh2r<2-[rrdoQYQ+P(JcERdJH~> +f`1mQJcFL)rrfh2r<2-[rrdoQYQ+P(JcERdJH~> +f`1jPJcFO*rrfh2r<2-[rrdoQYlFV(JcERdJH~> +f`1jPJcFO*rrfh2r<2-[rrdoQYlFV(JcERdJH~> +f`1jPJcFO*rrfh2r<2-[rrdoQYlFV(JcERdJH~> +fDkaOJcFR+rrfh2r<26^rWIfPYQ+M'JcEOcJH~> +fDkaOJcFR+rrfh2r<26^rWIfPYQ+M'JcEOcJH~> +fDkaOJcFR+rrfh2r<26^rWIfPYQ+M'JcEOcJH~> +fDkaOd/X%IJcEair<26^rWIfPYQ+M'JcEOcJH~> +fDkaOd/X%IJcEair<26^rWIfPYQ+M'JcEOcJH~> +fDkaOd/X%IJcEair<26^rWIfPYQ+M'JcEOcJH~> +f)PXNdJs.JJcEair<26^rWIfPYlFV(JcELbJH~> +f)PXNdJs.JJcEair<26^rWIfPYlFV(JcELbJH~> +f)PXNdJs.JJcEair<26^rWIfPYlFV(JcELbJH~> +ec5RNdJs.JJcEair<2?arWIfPXoJ>&JcEIaJH~> +ec5RNdJs.JJcEair<2?arWIfPXoJ>&JcEIaJH~> +ec5RNdJs.JJcEair<2?arWIfPXoJ>&JcEIaJH~> +ec5OMeGoOOJcEUer<2?arWIfPY5eD&JcEIaJH~> +ec5OMeGoOOJcEUer<2?arWIfPY5eD&JcEIaJH~> +ec5OMeGoOOJcEUer<2?arWIfPY5eD&JcEIaJH~> +eGoFLec5XPJcEUer<2?arWIfPYQ+M'JcEF`JH~> +eGoFLec5XPJcEUer<2?arWIfPYQ+M'JcEF`JH~> +eGoFLec5XPJcEUer<2?arWIfPYQ+M'JcEF`JH~> +eGoFLf`1pROoPFaZN'k+kl:VbJcDqRquhTN^&NT~> +eGoFLf`1pROoPFaZN'k+kl:VbJcDqRquhTN^&NT~> +eGoFLf`1pROoPFaZN'k+kl:VbJcDqRquhTN^&NT~> +e,T=Kg&M$SOoPFaZN'k+kl:VbJcDtSquhTN]`3K~> +e,T=Kg&M$SOoPFaZN'k+kl:VbJcDtSquhTN]`3K~> +e,T=Kg&M$SOoPFaZN'k+kl:VbJcDtSquhTN]`3K~> +df97Kg&M$SOoPFaZN'k+li6qeJcDkPr<.]O]DmB~> +df97Kg&M$SOoPFaZN'k+li6qeJcDkPr<.]O]DmB~> +df97Kg&M$SOoPFaZN'k+li6qeJcDkPr<.]O]DmB~> +df94JgAh-TOoPFaZN'k+li6qeJcDnQquhTN]DmB~> +df94JgAh-TOoPFaZN'k+li6qeJcDnQquhTN]DmB~> +df94JgAh-TOoPFaZN'k+li6qeJcDnQquhTN]DmB~> +dJs+Ig].6UOoPFaZN'k+li6qeJcDqRquhTN])R9~> +dJs+Ig].6UOoPFaZN'k+li6qeJcDqRquhTN])R9~> +dJs+Ig].6UOoPFaZN'k+li6qeJcDqRquhTN])R9~> +dJs+Ig].6UPlL^cYlFY)JcD&9quhTN])R<~> +dJs+Ig].6UPlL^cYlFY)JcD&9quhTN])R<~> +dJs+Ig].6UPlL^cYlFY)JcD&9quhTN])R<~> +d/X"HhZ*TYOoPC`YlFY)JcD):quhTN\c73~> +d/X"HhZ*TYOoPC`YlFY)JcD):quhTN\c73~> +d/X"HhZ*TYOoPC`YlFY)JcD):quhTN\c73~> +ci +ci +ci +ci&JcD/ +ci&JcD/ +ci&JcD/ +cN!eFi;`f[PlL^cXoJ>&JcD/ +cN!eFi;`f[PlL^cXoJ>&JcD/ +cN!eFi;`f[PlL^cXoJ>&JcD/ +c2[\EiW&o\PlL^cXoJ>&mf37hJcDtSquhTN[f:j~> +c2[\EiW&o\PlL^cXoJ>&mf37hJcDtSquhTN[f:j~> +c2[\EiW&o\PlL^cXoJ>&mf37hJcDtSquhTN[f:j~> +bl@SDJcG?ArWKA'r<2QgrWIfPZ2a_)JcE.XJH~> +bl@SDJcG?ArWKA'r<2QgrWIfPZ2a_)JcE.XJH~> +bl@SDJcG?ArWKA'r<2QgrWIfPZ2a_)JcE.XJH~> +bl@PCJcGBBrWKA'r<2WirrdoQYQ+J&JcE.XJH~> +bl@PCJcGBBrWKA'r<2WirrdoQYQ+J&JcE.XJH~> +bl@PCJcGBBrWKA'r<2WirrdoQYQ+J&JcE.XJH~> +bQ%JCJcGHDrrfA%r<2WirrdoQYQ+M'JcE+WJH~> +bQ%JCJcGHDrrfA%r<2WirrdoQYQ+M'JcE+WJH~> +bQ%JCJcGHDrrfA%r<2WirrdoQYQ+M'JcE+WJH~> +b5_ABJcGKErrfA%r<2WirrdoQYlFV(JcE(VJH~> +b5_ABJcGKErrfA%r<2WirrdoQYlFV(JcE(VJH~> +b5_ABJcGKErrfA%r<2WirrdoQYlFV(JcE(VJH~> +aoD8AJcGNFrrfA%r<2`lrWIfPYQ+M'JcE%UJH~> +aoD8AJcGNFrrfA%r<2`lrWIfPYQ+M'JcE%UJH~> +aoD8AJcGNFrrfA%r<2`lrWIfPYQ+M'JcE%UJH~> +aoD8Ali6qeJcE7[r<2`lrWIfPYlFS'JcE%UJH~> +aoD8Ali6qeJcE7[r<2`lrWIfPYlFS'JcE%UJH~> +aoD8Ali6qeJcE7[r<2`lrWIfPYlFS'JcE%UJH~> +aT)/@m/R%fJcE7[r<2`lrWIfPYlFV(JcE"TJH~> +aT)/@m/R%fJcE7[r<2`lrWIfPYlFV(JcE"TJH~> +aT)/@m/R%fJcE7[r<2`lrWIfPYlFV(JcE"TJH~> +a8c&?mJm.gJcE7[r<2`lrWIfPZ2a_)JcDtSJH~> +a8c&?mJm.gJcE7[r<2`lrWIfPZ2a_)JcDtSJH~> +a8c&?mJm.gJcE7[r<2`lrWIfPZ2a_)JcDtSJH~> +a8c#>nGiLkJcE.Xr<2`lrWIfPZN'h*JcDqRJH~> +a8c#>nGiLkJcE.Xr<2`lrWIfPZN'h*JcDqRJH~> +a8c#>nGiLkJcE.Xr<2`lrWIfPZN'h*JcDqRJH~> +`rGr>nGiLkJcE.Xr<2iorWIfPYlFS'JcDqRJH~> +`rGr>nGiLkJcE.Xr<2iorWIfPYlFS'JcDqRJH~> +`rGr>nGiLkJcE.Xr<2iorWIfPYlFS'JcDqRJH~> +`W,i=nc/UlOoPC`W;lf!pAb*pJcDtSquhTNY5a"~> +`W,i=nc/UlOoPC`W;lf!pAb*pJcDtSquhTNY5a"~> +`W,i=nc/UlOoPC`W;lf!pAb*pJcDtSquhTNY5a"~> +`;f` +`;f` +`;f` +`;f];oDegnOoPC`W;lf!pAb*pJcE%UquhTNXT*e~> +`;f];oDegnOoPC`W;lf!pAb*pJcE%UquhTNXT*e~> +`;f];oDegnOoPC`W;lf!pAb*pJcE%UquhTNXT*e~> +_uKW;pAb*pP5kLaV>pJspAb*pJcE(VqZMKMXT*e~> +_uKW;pAb*pP5kLaV>pJspAb*pJcE(VqZMKMXT*e~> +_uKW;pAb*pP5kLaV>pJspAb*pJcE(VqZMKMXT*e~> +_Z0N:p](3qP5kLaV>pJsJcDSHquhTNX8d_~> +_Z0N:p](3qP5kLaV>pJsJcDSHquhTNX8d_~> +_Z0N:p](3qP5kLaV>pJsJcDSHquhTNX8d_~> +_>jE9q#C +_>jE9q#C +_>jE9q#C +_>jB8q>^EsPlLadUAt/pJcDYJquhTNWW.M~> +_>jB8q>^EsPlLadUAt/pJcDYJquhTNWW.M~> +_>jB8q>^EsPlLadUAt/pJcDYJquhTNWW.M~> +_#O97qZ$NtPlLadUAt/pJcD\KqZMKMWW.M~> +_#O97qZ$NtPlLadUAt/pJcD\KqZMKMWW.M~> +_#O97qZ$NtPlLadUAt/pJcD\KqZMKMWW.M~> +^]406rVum#OoPFaUAt/pJcD_LqZMKMW;hD~> +^]406rVum#OoPFaUAt/pJcD_LqZMKMW;hD~> +^]406rVum#OoPFaUAt/pJcD_LqZMKMW;hD~> +^An*6rVum#OoPFaUAt/pJcDbMqZMKMVuM;~> +^An*6rVum#OoPFaUAt/pJcDbMqZMKMVuM;~> +^An*6rVum#OoPFaUAt/pJcDbMqZMKMVuM;~> +^&S!5rr +^&S!5rr +^&S!5rr +]`7m4OT5:_T`=rnr;Za!JcE(VquhTNV>l)~> +]`7m4OT5:_T`=rnr;Za!JcE(VquhTNV>l)~> +]`7m4OT5:_T`=rnr;Za!JcE(VquhTNV>l)~> +]`7j3OoPC`T`=rnrr +]`7j3OoPC`T`=rnrr +]`7j3OoPC`T`=rnrr +]Dqa2P5kLaT`=rnrr +]Dqa2P5kLaT`=rnrr +]Dqa2P5kLaT`=rnrr +])VX1PQ1UbT`=rnrr +])VX1PQ1UbT`=rnrr +])VX1PQ1UbT`=rnrr +\c;O0PlL^cT`=rnrr +\c;O0PlL^cT`=rnrr +\c;O0PlL^cT`=rnrr +\GuF/JcE"Tr<3-"rrdoQ[K$+,JcDGDJH~> +\GuF/JcE"Tr<3-"rrdoQ[K$+,JcDGDJH~> +\GuF/JcE"Tr<3-"rrdoQ[K$+,JcDGDJH~> +\,Z=.JcE%Uq?2BL[/^"+JcDDCJH~> +\,Z=.JcE%Uq?2BL[/^"+JcDDCJH~> +\,Z=.JcE%Uq?2BL[/^"+JcDDCJH~> +[f?4-JcE(Vq?2BL[K$+,JcDABJH~> +[f?4-JcE(Vq?2BL[K$+,JcDABJH~> +[f?4-JcE(Vq?2BL[K$+,JcDABJH~> +[K$.-JcE(Vp]Q0J\GuF/JcD>AJH~> +[K$.-JcE(Vp]Q0J\GuF/JcD>AJH~> +[K$.-JcE(Vp]Q0J\GuF/JcD>AJH~> +[/^%,JcE+Wr<30#rWIfP\GuI0JcD;@JH~> +[/^%,JcE+Wr<30#rWIfP\GuI0JcD;@JH~> +[/^%,JcE+Wr<30#rWIfP\GuI0JcD;@JH~> +ZiBq+T)\cmS,`Eis8W'$JcE:\quhTNSH"-~> +ZiBq+T)\cmS,`Eis8W'$JcE:\quhTNSH"-~> +ZiBq+T)\cmS,`Eis8W'$JcE:\quhTNSH"-~> +ZiBn*T`=rnS,`Eis8W'$JcE=]quhTNS,\$~> +ZiBn*T`=rnS,`Eis8W'$JcE=]quhTNS,\$~> +ZiBn*T`=rnS,`Eis8W'$JcE=]quhTNS,\$~> +ZN'e)U&Y&oS,`Eis8W'$JcE@^qZMKMS,\$~> +ZN'e)U&Y&oS,`Eis8W'$JcE@^qZMKMS,\$~> +ZN'e)U&Y&oS,`Eis8W'$JcE@^qZMKMS,\$~> +Z2a\(UAt2qRfE6fJcE:\qZMKMRf@p~> +Z2a\(UAt2qRfE6fJcE:\qZMKMRf@p~> +Z2a\(UAt2qRfE6fJcE:\qZMKMRf@p~> +YlFS'VZ6VuQiHpcJcE=]qZMKMRK%g~> +YlFS'VZ6VuQiHpcJcE=]qZMKMRK%g~> +YlFS'VZ6VuQiHpcJcE=]qZMKMRK%g~> +YQ+J&VuQ`!QiHpcJcE@^qZMKMR/_^~> +YQ+J&VuQ`!QiHpcJcE@^qZMKMR/_^~> +YQ+J&VuQ`!QiHpcJcE@^qZMKMR/_^~> +Y5eA%W;li"QiI!eJcE=]qZMKMQiDU~> +Y5eA%W;li"QiI!eJcE=]qZMKMQiDU~> +Y5eA%W;li"QiI!eJcE=]qZMKMQiDU~> +XoJ8$WW2r#QiI!eJcE@^qZMKMQN)L~> +XoJ8$WW2r#QiI!eJcE@^qZMKMQN)L~> +XoJ8$WW2r#QiI!eJcE@^qZMKMQN)L~> +XT//#WrN&$QiI!eJcEC_qZMKMQ2cC~> +XT//#WrN&$QiI!eJcEC_qZMKMQ2cC~> +XT//#WrN&$QiI!eJcEC_qZMKMQ2cC~> +X8i&"XoJD(PlL[bJcEF`qZMKMPlH:~> +X8i&"XoJD(PlL[bJcEF`qZMKMPlH:~> +X8i&"XoJD(PlL[bJcEF`qZMKMPlH:~> +WrMr!Y5eM)PlL[bJcEIaqZMKMPQ-1~> +WrMr!Y5eM)PlL[bJcEIaqZMKMPQ-1~> +WrMr!Y5eM)PlL[bJcEIaqZMKMPQ-1~> +WW2huYQ+V*Q2gabJcELbqZMKMP5g(~> +WW2huYQ+V*Q2gabJcELbqZMKMP5g(~> +WW2huYQ+V*Q2gabJcELbqZMKMP5g(~> +W;l_tYlF_+Q2gabJcERdq?2BLOoKt~> +W;l_tYlF_+Q2gabJcERdq?2BLOoKt~> +W;l_tYlF_+Q2gabJcERdq?2BLOoKt~> +VuQSrZN'q-Q2gabJcEUeq?2BLOT0k~> +VuQSrZN'q-Q2gabJcEUeq?2BLOT0k~> +VuQSrZN'q-Q2gabJcEUeq?2BLOT0k~> +VZ6Jq[f?=0PQ1O`JcEXfq?2BLO8jb~> +VZ6Jq[f?=0PQ1O`JcEXfq?2BLO8jb~> +VZ6Jq[f?=0PQ1O`JcEXfq?2BLO8jb~> +V>pAp\,ZF1PQ1O`JcE[gqZMKMNW4P~> +V>pAp\,ZF1PQ1O`JcE[gqZMKMNW4P~> +V>pAp\,ZF1PQ1O`JcE[gqZMKMNW4P~> +U]:2o\GuO2QN-pe!WN<%"G-Tls8)qMs,?u.~> +U]:2o\GuO2QN-pe!WN<%"G-Tls8)qMs,?u.~> +U]:2o\GuO2QN-pe!WN<%"G-Tls8)qMs,?u.~> +UAt)nJcEpnrWE9%"TAOTs2P*9"G-T2s+(~> +UAt)nJcEpnrWE9%"TAOTs2P*9"G-T2s+(~> +UAt)nJcEpnrWE9%"TAOTs2P*9"G-T2s+(~> +U&XumJcEsorWE9%"TAOTs2Y0:"G-T1s+(~> +U&XumJcEsorWE9%"TAOTs2Y0:"G-T1s+(~> +U&XumJcEsorWE9%"TAOTs2Y0:"G-T1s+(~> +T`=llJcF!prWE9%"TAOTs2b6;"G-T0s+(~> +T`=llJcF!prWE9%"TAOTs2b6;"G-T0s+(~> +T`=llJcF!prWE9%"TAOTs2b6;"G-T0s+(~> +TE"ckJcF$qrWE9%"TAOTs2k<<"G-T/s+(~> +TE"ckJcF$qrWE9%"TAOTs2k<<"G-T/s+(~> +TE"ckJcF$qrWE9%"TAOTs2k<<"G-T/s+(~> +T)\ZjJcF0urWN3"r<.]Ob5_>AJcCN*J:~> +T)\ZjJcF0urWN3"r<.]Ob5_>AJcCN*J:~> +T)\ZjJcF0urWN3"r<.]Ob5_>AJcCN*J:~> +ScANh`;fi?PQ1UbrVug!JcEsoq?2BLLAud~> +ScANh`;fi?PQ1UbrVug!JcEsoq?2BLLAud~> +ScANh`;fi?PQ1UbrVug!JcEsoq?2BLLAud~> +SH&Eg`W,r@PQ1UbrVug!JcF!pq?2BLL&Z[~> +SH&Eg`W,r@PQ1UbrVug!JcF!pq?2BLL&Z[~> +SH&Eg`W,r@PQ1UbrVug!JcF!pq?2BLL&Z[~> +S,` +S,` +S,` +RK*-ea8c/BQ2gjeqZ$KsJcF'rqZMKMK)^@~> +RK*-ea8c/BQ2gjeqZ$KsJcF'rqZMKMK)^@~> +RK*-ea8c/BQ2gjeqZ$KsJcF'rqZMKMK)^@~> +R/d$daT)8CN;rhZJcF*sqZMKMJcC9~> +R/d$daT)8CN;rhZJcF*sqZMKMJcC9~> +R/d$daT)8CN;rhZJcF*sqZMKMJcC9~> +QiHmbc2[bGMZ`MJH~> +QiHmbc2[bGMZ`MJH~> +QiHmbc2[bGMZ`MJH~> +QN-dacN!kHMZ +QN-dacN!kHMZ +QN-dacN!kHMZ +Q2g[`ci +Q2g[`ci +Q2g[`ci +PQ1I^dJs1KMZ +PQ1I^dJs1KMZ +PQ1I^dJs1KMZ +P5k@]df9:LMZ +P5k@]df9:LMZ +P5k@]df9:LMZ +OoP7\e,TCMQN-peq#C9qJcFC&q?2BLJcGTHJH~> +OoP7\e,TCMQN-peq#C9qJcFC&q?2BLJcGTHJH~> +OoP7\e,TCMQN-peq#C9qJcFC&q?2BLJcGTHJH~> +O8o%ZfDkjRPQ1Ubq#C9qJcFI(q?2BLJcGNFJH~> +O8o%ZfDkjRPQ1Ubq#C9qJcFI(q?2BLJcGNFJH~> +O8o%ZfDkjRPQ1Ubq#C9qJcFI(q?2BLJcGNFJH~> +NrSqYf`1sSQN-pep&FsnJcFL)q?2BLJcGKEJH~> +NrSqYf`1sSQN-pep&FsnJcFL)q?2BLJcGKEJH~> +NrSqYf`1sSQN-pep&FsnJcFL)q?2BLJcGKEJH~> +NW8hXg&M'TQN-pep&FsnJcFR+q#l9KJcGHDJH~> +NW8hXg&M'TQN-pep&FsnJcFR+q#l9KJcGHDJH~> +NW8hXg&M'TQN-pep&FsnJcFR+q#l9KJcGHDJH~> +MuWVVg].9VQN-pep&FsnJcFU,q?2BLJcGBBJH~> +MuWVVg].9VQN-pep&FsnJcFU,q?2BLJcGBBJH~> +MuWVVg].9VQN-pep&FsnJcFU,q?2BLJcGBBJH~> +MZ +MZ +MZ +M?!DTJcG6>rWMoor<.]OiW&`WJcC<$nc+.~> +M?!DTJcG6>rWMoor<.]OiW&`WJcC<$nc+.~> +M?!DTJcG6>rWMoor<.]OiW&`WJcC<$nc+.~> +L]@2RJcGBBrri/tr<3-"r<3*!r<.]OlMp\`JcC<$nGe"~> +L]@2RJcGBBrri/tr<3-"r<3*!r<.]OlMp\`JcC<$nGe"~> +L]@2RJcGBBrri/tr<3-"r<3*!r<.]OlMp\`JcC<$nGe"~> +LB%)QJcGECrri2uq?-j!"TAQ(s7ukLs6Td^"G-T(s6ou<~> +LB%)QJcGECrri2uq?-j!"TAQ(s7ukLs6Td^"G-T(s6ou<~> +LB%)QJcGECrri2uq?-j!"TAQ(s7ukLs6Td^"G-T(s6ou<~> +L&^rOJcGKErri/tmKA+@mJm"cJcC<$mJh_~> +L&^rOJcGKErri/tmKA+@mJm"cJcC<$mJh_~> +L&^rOJcGKErri/tmKA+@mJm"cJcC<$mJh_~> +KE(cNJcGWIrWMuqmKA+@mf3+dJcC<$m/MV~> +KE(cNJcGWIrWMuqmKA+@mf3+dJcC<$m/MV~> +KE(cNJcGWIrWMuqmKA+@mf3+dJcC<$m/MV~> +K)bWLli6qeQN-pepAaUbJcG3=q#l9KJcG'9J:~> +K)bWLli6qeQN-pepAaUbJcG3=q#l9KJcG'9J:~> +K)bWLli6qeQN-pepAaUbJcG3=q#l9KJcG'9J:~> +Jc>cN"Sr8gs8E.es8E/ps6p/Bs7--b"G-T(s69Q6~> +Jc>cN"Sr8gs8E.es8E/ps6p/Bs7--b"G-T(s69Q6~> +Jc>cN"Sr8gs8E.es8E/ps6p/Bs7--b"G-T(s69Q6~> +JcGcMq#p-crWJPerWMooncXODnc/CfJcC<$kl60~> +JcGcMq#p-crWJPerWMooncXODnc/CfJcC<$kl60~> +JcGcMq#p-crWJPerWMooncXODnc/CfJcC<$kl60~> +JcG]Kq#p9grrePcrWMooncXODoDeUhJcC<$k5Ts~> +JcG]Kq#p9grrePcrWMooncXODoDeUhJcC<$k5Ts~> +JcG]Kq#p9grrePcrWMooncXODoDeUhJcC<$k5Ts~> +JcGWIq#p?irrduSoE9aFo`+^iJcC<$jSsc~> +JcGWIq#p?irrduSoE9aFo`+^iJcC<$jSsc~> +JcGWIq#p?irrduSoE9aFo`+^iJcC<$jSsc~> +JcGTHq#pBjrrduSoE9aFp&FgjJcC<$j8XZ~> +JcGTHq#pBjrrduSoE9aFp&FgjJcC<$j8XZ~> +JcGTHq#pBjrrduSoE9aFp&FgjJcC<$j8XZ~> +JcGNFq#pHlrrdrRp&osHpAapkJcC<$iW"H~> +JcGNFq#pHlrrdrRp&osHpAapkJcC<$iW"H~> +JcGNFq#pHlrrdrRp&osHpAapkJcC<$iW"H~> +JcGHDq?6TnrrdrRp&osHp]('mJcC<$huA6~> +JcGHDq?6TnrrdrRp&osHp]('mJcC<$huA6~> +JcGHDq?6TnrrdrRp&osHp]('mJcC<$huA6~> +JcGECq#pZrrWIfPs8VisJcGNFq#l9KJcFU,JH~> +JcGECq#pZrrWIfPs8VisJcGNFq#l9KJcFU,JH~> +JcGECq#pZrrWIfPs8VisJcGNFq#l9KJcFU,JH~> +JcG?Aq#p`trWJPerWMWgp]Q0JqZ$?oJcC<$h#Dn~> +JcG?Aq#p`trWJPerWMWgp]Q0JqZ$?oJcC<$h#Dn~> +JcG?Aq#p`trWJPerWMWgp]Q0JqZ$?oJcC<$h#Dn~> +JcG<@q#g`u"TJUks8<)es7ukLs8)ck"G-T(s4dR(~> +JcG<@q#g`u"TJUks8<)es7ukLs8)ck"G-T(s4dR(~> +JcG<@q#g`u"TJUks8<)es7ukLs8)ck"G-T(s4dR(~> +JcG6>pB6i_r<2Keq?2BLr;ZQqJcC<$g&HS~> +JcG6>pB6i_r<2Keq?2BLr;ZQqJcC<$g&HS~> +JcG6>pB6i_r<2Keq?2BLr;ZQqJcC<$g&HS~> +JcG0 +JcG0 +JcG0 +JcG-;p]R#brrhTdquhTNs8VisJcC<$f)L8~> +JcG-;p]R#brrhTdquhTNs8VisJcC<$f)L8~> +JcG-;p]R#brrhTdquhTNs8VisJcC<$f)L8~> +JcG*:pB6ucrrhQcrWIfP!WN;u"G-T(s4%(!~> +JcG*:pB6ucrrhQcrWIfP!WN;u"G-T(s4%(!~> +JcG*:pB6ucrrhQcrWIfP!WN;u"G-T(s4%(!~> +JcG*:o`UrfrWLmR"lmCkL/%^Drr]Q$h>a,Ip]Q0JJcF0uJH~> +JcG*:o`UrfrWLmR"lmCkL/%^Drr]Q$h>a,Ip]Q0JJcF0uJH~> +JcG*:o`UrfrWLmR"lmCoL/%^Drr]Q$h>a,Ip]Q0JJcF0uJH~> +JcFp5p]R>krWLpSqZHr8s8)cq"9E-7U&XljJcC<$d/SX~> +JcFp5p]R>krWLpSqZHr8s8)cq"9E-7U&XljJcC<$d/SX~> +JcFp5p]R>krWLpSqZHr8s8)cq"9E-7U&XljJcC<$d/SX~> +JcFj3p]RMprWLaN!oluX!X+qkqYpRj"9AZ*U]:)lJcC<$cMrF~> +JcFj3p]RMprWLaN!oluX!X+qkqYpRj"9AZ*U]:)lJcC<$cMrF~> +JcFj3p]RMprWLaN!oluX!X+qkqYpRj"9AZ*U]:)lJcC<$cMrF~> +JcFd1p]RSrrWL^M!Peg>"D7]1rr^jU:&h'ip]Q0JJcEsoJH~> +JcFd1p]RSrrWL^M!Peg>"D7]1rr^jU:&h'ip]Q0JJcEsoJH~> +JcFd1p]RSrrWL^M!Peg>"D7]1rr^jU:&h'ip]Q0JJcEsoJH~> +JcF^/p]RYtrWL^M!TO=_"ShuuL7/(>s7c_Js+13ms+&~> +JcF^/p]RYtrWL^M!TO=_"ShuuL7/(>s7c_Js+13ms+&~> +JcF^/p]RYtrWL^M!TO=_"ShuuL7/(>s7c_Js+13ms+&~> +JcFX-p]R`!rWL^M!U9gf"Sr'"nH@nPWW2_rJcC<$aT$e~> +JcFX-p]R`!rWL^M!U9gf"Sr'"nH@nPWW2_rJcC<$aT$e~> +JcFX-p]R`!rWL^M!U9gf"Sr'"nH@nPWW2_rJcC<$aT$e~> +JcFR+p]Rf#rWL[LrWE8^s82ftR>1aAs7c_Js+13is+#~> +JcFR+p]Rf#rWL[LrWE8^s82ftR>1aAs7c_Js+13is+#~> +JcFR+p]Rf#rWL[LrWE8^s82ftR>1aAs7c_Js+13is+#~> +JcFL)pB7f%rWL[LrWE8^s8;m!h+dG>XoJ+uJcC<$`;bA~> +JcFL)pB7f%rWL[LrWE8^s8;m!h+dG>XoJ+uJcC<$`;bA~> +JcFL)pB7f%rWL[LrWE8^s8;m!h+dG>XoJ+uJcC<$`;bA~> +JcFF'pB7u*rWLRI!G2H9"Ps+UrrPpHs/uCr"G-T(s2+ed~> +JcFF'pB7u*rWLRI!G2H9"Ps+UrrPpHs/uCr"G-T(s2+ed~> +JcFF'pB7u*rWLRI!G2H9"Ps+UrrPpHs/uCr"G-T(s2+ed~> +JcF@%pB8&,rWLRI!JU^Y"Mk'9rrRqCs0)Is"G-T(s1nYb~> +JcF@%pB8&,rWLRI!JU^Y"Mk'9rrRqCs0)Is"G-T(s1nYb~> +JcF@%pB8&,rWLRI!JU^Y"Mk'9rrRqCs0)Is"G-T(s1nYb~> +JcF7"p]Q?O!JU^Y"Mk':rrTuds02Ou"G-T(s1SG_~> +JcF7"p]Q?O!JU^Y"Mk':rrTuds02Ou"G-T(s1SG_~> +JcF7"p]Q?O!JU^Y"Mk':rrTuds02Ou"G-T(s1SG_~> +JcF0upB6?Q!LX&l"LA(-rr_:UlMn3jpB6'IJcE@^JA~> +JcF0upB6?Q!LX&l"LA(-rr_:UlMn3jpB6'IJcE@^JA~> +JcF0upB6?Q!LX&l"LA(-rr_:UlMn3jpB6'IJcE@^JA~> +JcF*sp&p?S!Peg>"GZpZs7&h8s0_n#"G-T(s1//[~> +JcF*sp&p?S!Peg>"GZpZs7&h8s0_n#"G-T(s1//[~> +JcF*sp&p?S!Peg>"GZpZs7&h8s0_n#"G-T(s1//[~> +JcF!pp&pHV!Peg>"GZpYs+%ET\,Z.)JcC<$[f:l~> +JcF!pp&pHV!Peg>"GZpYs+%ET\,Z.)JcC<$[f:l~> +JcF!pp&pHV!Peg>"GZpYs+%ET\,Z.)JcC<$[f:l~> +JcEpnp&pNX!Peg?"D7\%!L`tts7QSHs+13Ws+#~> +JcEpnp&pNX!Peg?"D7\%!L`tts7QSHs+13Ws+#~> +JcEpnp&pNX!Peg?"D7\%!L`tts7QSHs+13Ws+#~> +JcEgkp&r\@rWLCD!TO=_"9P6Hs187("G-T(s0;TS~> +JcEgkp&r\@rWLCD!TO=_"9P6Hs187("G-T(s0;TS~> +JcEgkp&r\@rWLCD!TO=_"9PBLs187("G-T(s0;TS~> +JcE^hp&reCrWLCD!TO=_"9E-7]`7[.JcC<$Y5a$~> +JcE^hp&reCrWLCD!TO=_"9E-7]`7[.JcC<$Y5a$~> +JcE^hp&reCrWLCD!TO=_"9E-7]`7[.JcC<$Y5a$~> +JcEUepB8tFrWLCD!U9di"AS1]^Amp1JcC<$X8d^~> +JcEUepB8tFrWLCD!U9di"AS1]^Amp1JcC<$X8d^~> +JcEUepB8tFrWLCD!U9di"AS1]^Amp1JcC<$X8d^~> +JcEOcp&rtHrWL@C!sD?`s1n[."G-T(s/H$K~> +JcEOcp&rtHrWL@C!sD?`s1n[."G-T(s/H$K~> +JcEOcp&rtHrWL@C!sD?`s1n[."G-T(s/H$K~> +JcEF`o`X"KrWLCD"6p$Ls24m0"G-T(s/,gH~> +JcEF`o`X"KrWLCD"6p$Ls24m0"G-T(s/,gH~> +JcEF`o`X"KrWLCD"6p$Ls24m0"G-T(s/,gH~> +JcE=]oE=.QrWL=B"6rV4s2P*2"G-T(s.fUE~> +JcE=]oE=.QrWL=B"6rV4s2P*2"G-T(s.fUE~> +JcE=]oE=.QrWL=B"6rV4s2P*2"G-T(s.fUE~> +JcE7[nc\(SrWL=B!eAo&aoCo7JcC<$U&TX~> +JcE7[nc\(SrWL=B!eAo&aoCo7JcC<$U&TX~> +JcE7[nc\(SrWL=B!eAo&aoCo7JcC<$U&TX~> +JcE.XnHA+VrWL@C!eA)dbl@29JcC<$T)X=~> +JcE.XnHA+VrWL@C!eA)dbl@29JcC<$T)X=~> +JcE.XnHA+VrWL@C!eA)dbl@29JcC<$T)X=~> +JcE"Tnc\=ZrWLCDs.IX:ncXODJcD2=JH~> +JcE"Tnc\=ZrWLCDs.IX:ncXODJcD2=JH~> +JcE"Tnc\=ZrWLCDs.mp>ncXODJcD2=JH~> +JcDkPnc\I^rWLRI#1lS"nX6'MdJrb?JcC<$QN)J~> +JcDkPnc\I^rWLRI#1lS"nX6'MdJrb?JcC<$QN)J~> +JcDkPnc\I^rWLRI#1lS"nX63QdJrb?JcC<$QN)J~> +JcD_Lnc\UbrWLRI!DN^s"9G1qeGo(BJcC<$P5g&~> +JcD_Lnc\UbrWLRI!DN^s"9G1qeGo(BJcC<$P5g&~> +JcD_Lnc\UbrWLRI!DN^s"9G=ueGo(BJcC<$P5g&~> +JcDSHn-&^irWLIF"J>mJh>c(+o)sXEJcCc1JH~> +JcDSHn-&^irWLIF"J>mJh>c(+o)sXEJcCc1JH~> +JcDSHn-&^irWLIF"Jc0Nh>c(+o)sXEJcCc1JH~> +JcDJEli`jYp&osHJcCZ.JH~> +JcDJEli`jYp&osHJcCZ.JH~> +JcDJEli`jYp&osHJcCZ.JH~> +JcD>Akldd]q?2BLJcCN*JH~> +JcD>Akldd]q?2BLJcCN*JH~> +JcD>Akldd]q?2BLJcCN*JH~> +JcD2=k6.darWIfPJcCB&JH~> +JcD2=k6.darWIfPJcCB&JH~> +JcD2=k6.darWIfPJcCB&JH~> +JcCu7hZVa7hZSN1JcC<$rVqE~> +JcCu7hZVa7hZSN1JcC<$rVqE~> +JcCu7hZVa7hZSN1JcC<$rVqE~> +JcC`0V?DJMJcC<$pA][~> +JcC`0V?DJMJcC<$pA][~> +JcC`0V?DJMJcC<$pA][~> +JcCK)Ziks[JcC<$n,Iq~> +JcCK)Ziks[JcC<$n,Iq~> +JcCK)Ziks[JcC<$n,Iq~> +JcC<$!WN;="G-T(s+147s+#~> +JcC<$!WN;="G-T(s+147s+#~> +JcC<$!WN;="G-T(s+147s+#~> +JcC<$o)IJJJcC<$JcFL)J:~> +JcC<$o)IJJJcC<$JcFL)J:~> +JcC<$o)IJJJcC<$JcFL)J:~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +JcC<$JcC<$JcDYJJH~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig1.png b/documentation/graphics/STIR-developers-overviewFig1.png new file mode 100644 index 0000000000..55b789eea2 Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig1.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig10.eps b/documentation/graphics/STIR-developers-overviewFig10.eps new file mode 100644 index 0000000000..52b335e3f8 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig10.eps @@ -0,0 +1,694 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (STIR-developers-overviewFig10.eps) +%%CreationDate: (Mon Oct 25 16:23:51 2004) +%%BoundingBox: 0 0 543 79 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 0 +%%EndComments + +%%BeginDefaults +%%PageOrientation: Portrait +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/buffer 512 string def +/byte 1 string def +/color_packet 3 string def +/pixels 768 string def + +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-RunlengthEncodedCompression or 1-NoCompression. + % hex color packets. + % + gsave + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Helvetica findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 544 80 +userdict begin +%%BeginData: +DisplayImage +0 0 +544 80 +12.000000 +544 80 +1 +0 +0 +256 +ffffff +000000 +ffffc0 +9f9f60 +900000 +009000 +000090 +c0c0c0 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +008a01ff010a00ff0014010000ff0008010000ff0014010000ff0008010000ff00140100 +00ff0008010000ff0014010000ff0008010000ff0014010000ff0008010000ff00140100 +004201050026010000010104000e0100000f0100000d0104000901040002010000490100 +00ff0014010000420100002b01000001010000030100001e0100000d0100000301000008 +010000030100004c010000ff001401000042010000070102000301000000010100020100 +000201000001010200030100000001000001010100000100000101000003010000020100 +000001000001010200020100000201020003010200010102000101020003010000000100 +000001000003010000010100000201000001010000030100000101000001010000000101 +0043010000ff001401000042010000060100000201000002010100000100000201000002 +010000000100000201000002010100010100000101010001010000030100000201010001 +010000020100000101000001010000020100000101000002010000010100000101000002 +010000020101000101000003010000010100000201000001010000030100000101000001 +0101000101000042010000ff001401000042010400020100000201000002010000020100 +000101000001010000050100000201000002010000020100000101040003010000020100 +000201000001010000010100000201000001010000050100000101000002010000020100 +000201040002010000020100000101040002010000010100000201000042010000ff0014 +010000420100000601000002010000020100000201000001010000010100000201030002 +010000020100000201000001010000070100000201000002010000010100000101040001 +010000050100000101000002010000020100000201000003010000010100000101000002 +0100000301000001010000010100000201000042010000ff001401000042010000060100 +000201000002010000020100000001000000010000000100000101000002010000020100 +000201000002010000010100000701000002010000020100000101000001010000050100 +000501000001010000020100000201000002010000030100000201000000010000020100 +000301000001010000010100000201000042010000ff0014010000420100000601000002 +010000020100000301000002010000020100000201000002010000020100000101010001 +010000070100000201000002010000010100000101000002010000010100000201000001 +010000010100000201000002010000020100000301000002010000000100000201000003 +01000001010000010100000201000042010000ff00140100004201000007010200030100 +000301000002010000030102000001000001010000030101000001000001010000070100 +000301020002010000020102000301020002010100010102000301000002010400040100 +000301040002010000010100000201000042010000ff0014010000860100002801000056 +010000ff0014010000860100002701000057010000ff0014010000850100002701000058 +010000ff0014010000ff0008010000ff0014010000ff0008010000ff0014010000ff0008 +010000ff0014010000ff0008010000ff0014010000ff0008010000ff001401ff010a00ff +0099060000ff00ff001e060000ff00ff001d060200ff00ff001c060200ff00ff001b0604 +00ff00ff001a060400ff00ff001c060000ff00ff001e060000ff00ff001e060000ff00ff +001e060000ff00ff001e060000ff00ff001e060000ff00ff001e060000ff00ff001e0600 +00ff00ff001e060000ff00ff001e060000ff009406ff061500ff0009060000ff00130600 +00ff0009060000ff0013060000ff0009060000ff0013060000ff0009060000ff00130600 +00ff0009060000ff0013060000ff0009060000ff0013060000ff0009060000ff00130600 +00ff0009060000ff0013060000ff0009060000ff0013060000ff0009060000ff00130600 +00ff0009060000ff0013060000ff0009060000ff0013060000ff0009060000ff00130600 +00ff0009060000ff0013060000ff0009060000ff00130600008403840600038400090384 +0600038502ff020803000009030002ff0208030102ff020803000009030002ff02080301 +02ff020803000009030002ff0208030102ff020803000009030002ff0208030102ff0208 +03000009030002ff02080301021201050226010002010104020e0100020f0100020d0104 +0209010402020100020801000203010002070100020f0104020f01060213010002200300 +00090300020501050226010002010104020e0100020f0100020d01040209010402020100 +020801000203010002070100020f0104020e010002010100020601000208010002060100 +020701040209010402020100020c030102120100022b01000201010002030100021e0100 +020d0100020301000208010002030100020b010002030100021801000203010002110100 +023803000009030002050100022b01000201010002030100021e0100020d010002030100 +0208010002030100020b0100020301000218010002030100021001010204010102080100 +020f0100020301000208010002030100020f030102120100020701020203010002000101 +020201000202010002010102020301000200010002010101020001000201010002030100 +020201000200010002010102020201000202010202030102020101020201010202030100 +020001000200010002030100020101000202010002010100020301000201010002010100 +020001010202010002030100020201010202010002010100020001010203010102000100 +020101000203010002020102020201000202010002030100020401000200010002010102 +020301020202010002010100020001010203010102000100021203000009030002050100 +020701020203010002000101020201000202010002010102020301000200010002010101 +020001000201010002030100020201000200010002010102020201000202010202030102 +020101020201010202030100020001000200010002030100020101000202010002010100 +020301000201010002010100020001010202010002030100020201010202010002010100 +020001010203010102000100020101000203010002020100020001000201010202020100 +020101010204010102020102020101020201010002000100020001000200010002030100 +020001000203010002010100020201000201010002030100020101000201010002000101 +020603010212010002060100020201000202010102000100020201000202010002000100 +020201000202010102010100020101010201010002030100020201010201010002020100 +020101000201010002020100020101000202010002010100020101000202010002020101 +020101000203010002010100020201000201010002030100020101000201010102010100 +020101000203010002010100020101000201010002010101020101000201010002010101 +020101000203010002010100020201000201010002020100020301000204010102010100 +020201000201010002020100020101000201010102010100020101000201010102120300 +000903000205010002060100020201000202010102000100020201000202010002000100 +020201000202010102010100020101010201010002030100020201010201010002020100 +020101000201010002020100020101000202010002010100020101000202010002020101 +020101000203010002010100020201000201010002030100020101000201010102010100 +020101000203010002010100020101000201010002010101020101000201010002010101 +020101000203010002020101020101000202010002010100020101000200010002020100 +020001000201010002020100020101000202010102010100020101000201010002010100 +020301000201010002020100020101000203010002010100020101010201010002050301 +021201040202010002020100020201000202010002010100020101000205010002020100 +020201000202010002010104020301000202010002020100020101000201010002020100 +020101000205010002010100020201000202010002020104020201000202010002010104 +020201000201010002020100020101000203010002010100020401000201010002020100 +020101000202010002010104020601000201010002020100020301000204010002060100 +020101000205010002010100020201000201010002020100021203000009030002050104 +020201000202010002020100020201000201010002010100020501000202010002020100 +020201000201010402030100020201000202010002010100020101000202010002010100 +020501000201010002020100020201000202010402020100020201000201010402020100 +020101000202010002010100020301000201010002040100020101000202010002010100 +020201000201010402030100020201000202010002010100020101000200010002020100 +020001000205010002010100020201000202010002020101020201040202010002020100 +020101040202010002010100020201000205030102120100020601000202010002020100 +020201000201010002010100020201030202010002020100020201000201010002070100 +020201000202010002010100020101040201010002050100020101000202010002020100 +020201000203010002010100020101000202010002030100020101000201010002020100 +020101000203010002020101020201000201010002020100020101000202010002010100 +020201000203010302010100020101000204010002040100020301030201010002050100 +020101000202010002010100020201000212030000090300020501000206010002020100 +020201000202010002010100020101000202010302020100020201000202010002010100 +020701000202010002020100020101000201010402010100020501000201010002020100 +020201000202010002030100020101000201010002020100020301000201010002010100 +020201000201010002030100020201010202010002010100020201000201010002020100 +020101000207010002020100020201000201010002010100020101000200010002010100 +020201030201010002020100020201000202010102020100020301000201010002010100 +020201000203010002010100020101000202010002050301021201000206010002020100 +020201000202010002000100020001000200010002010100020201000202010002020100 +020201000201010002070100020201000202010002010100020101000205010002050100 +020101000202010002020100020201000203010002020100020001000202010002030100 +020101000201010002020100020101000203010002040100020101000201010002020100 +020101000202010002010100020301000201010002020100020201000200010002040100 +020401000202010002020100020101000205010002010100020201000201010002020100 +021203000009030002050100020601000202010002020100020201000200010002000100 +020001000201010002020100020201000202010002020100020101000207010002020100 +020201000201010002010100020501000205010002010100020201000202010002020100 +020301000202010002000100020201000203010002010100020101000202010002010100 +020301000204010002010100020101000202010002010100020201000201010002070100 +020201000202010002010100020101000201010002000100020101000201010002020100 +020101000202010002020100020101000201010002010100020301000202010002000100 +020201000203010002010100020101000202010002050301021201000206010002020100 +020201000203010002020100020201000202010002020100020201000201010102010100 +020701000202010002020100020101000201010002020100020101000202010002010100 +020101000202010002020100020201000203010002020100020001000202010002030100 +020101000201010002020100020101000203010002010100020101000201010002010100 +020201000201010002010101020101000203010002010100020201000202010002000100 +020401000204010002020100020201000201010002020100020101000201010002020100 +020101000201010102120300000903000205010002060100020201000202010002030100 +020201000202010002020100020201000202010002010101020101000207010002020100 +020201000201010002010100020201000201010002020100020101000201010002020100 +020201000202010002030100020201000200010002020100020301000201010002010100 +020201000201010002030100020101000201010002010100020101000202010002010100 +020101010201010002070100020201000202010002010100020101000202010002020100 +020101000202010002010100020201000202010002000100020301000200010002030100 +020201000200010002020100020301000201010002010100020201000205030102120100 +020701020203010002030100020201000203010202000100020101000203010102000100 +020101000207010002030102020201000202010202030102020201010201010202030100 +020201040204010002030104020201000201010002020100020201030203010102020100 +020101000202010002020101020001000201010002030100020201020200010002020100 +020501000204010002030102020001000201010202020100020101000202010002020101 +020001000212030000090300020501000207010202030100020301000202010002030102 +020001000201010002030101020001000201010002070100020301020202010002020102 +020301020202010102010102020301000202010402040100020301040202010002010100 +020201000202010302030101020201000201010002020100020201010200010002010100 +020701000203010202020100020101000202010002020100020201020200010002000101 +020101000202010002000100020301000200010402040100020301040202010002010100 +020201000205030102560100022801000231010002120100022b01000212030000090300 +02490100022801000231010002150100022e0100021903010256010002270100022e0100 +0202010002110100022801000202010002120300000903000249010002270100022e0100 +0202010002150100022d0100021a030102550100022701000230010202110100022a0102 +021303000009030002480100022701000230010202150100022d0100021b030102ff0208 +03000009030002ff0208030102ff020803000009030002ff0208030102ff020803000009 +030002ff0208030102ff020803000009030002ff0208030102ff020803000009030002ff +020803ff030b000903ff0309 +%%EndData +end +%%PageTrailer +%%Trailer +%%BoundingBox: 0 0 543 79 +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig10.png b/documentation/graphics/STIR-developers-overviewFig10.png new file mode 100644 index 0000000000..ca765d07e6 Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig10.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig11.eps b/documentation/graphics/STIR-developers-overviewFig11.eps new file mode 100644 index 0000000000..6f14a8ca72 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig11.eps @@ -0,0 +1,681 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (STIR-developers-overviewFig11.eps) +%%CreationDate: (Mon Oct 25 16:23:51 2004) +%%BoundingBox: 0 0 503 79 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 0 +%%EndComments + +%%BeginDefaults +%%PageOrientation: Portrait +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/buffer 512 string def +/byte 1 string def +/color_packet 3 string def +/pixels 768 string def + +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-RunlengthEncodedCompression or 1-NoCompression. + % hex color packets. + % + gsave + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Helvetica findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 504 80 +userdict begin +%%BeginData: +DisplayImage +0 0 +504 80 +12.000000 +504 80 +1 +0 +0 +256 +ffffff +000000 +ffffc0 +9f9f60 +900000 +009000 +000090 +c0c0c0 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +008001f600ff0000010000f4010000ff0000010000f4010000ff0000010000f4010000ff +0000010000f4010000ff0000010000f4010000ff00000100004201040010010000040104 +000e0100000f0100000d010400090104000201000049010000ff00000100004201000003 +0100000f01000004010000030100001e0100000d0100000301000008010000030100004c +010000ff0000010000420100000301000002010200030102000201000001010000010100 +000301000002010000000100000101020002010000020102000301020001010200010102 +000301000000010000000100000301000001010000020100000101000003010000010100 +00010100000001010043010000ff00000100004201000003010000010100000201000001 +010000020100000101000000010000020100000301000002010100010100000201000001 +010000010100000201000001010000020100000101000001010000020100000201010001 +010000030100000101000002010000010100000301000001010000010101000101000042 +010000ff0000010000420104000601000001010000050101000301040003010000020100 +000201000001010000010100000201000001010000050100000101000002010000020100 +000201040002010000020100000101040002010000010100000201000042010000ff0000 +010000420100000301000002010300010100000501010003010000070100000201000002 +010000010100000101040001010000050100000101000002010000020100000201000003 +0100000101000001010000020100000301000001010000010100000201000042010000ff +000001000042010000030100000101000002010000010100000501000000010000020100 +000701000002010000020100000101000001010000050100000501000001010000020100 +000201000002010000030100000201000000010000020100000301000001010000010100 +000201000042010000ff0000010000420100000301000001010000020100000101000002 +010000010100000101000001010000070100000201000002010000010100000101000002 +010000010100000201000001010000010100000201000002010000020100000301000002 +01000000010000020100000301000001010000010100000201000042010000ff00000100 +004201040003010200000100000101020002010000020100000001000007010000030102 +000201000002010200030102000201010001010200030100000201040004010000030104 +0002010000010100000201000042010000ff0000010000720100002801000056010000ff +0000010000720100002701000057010000ff0000010000710100002701000058010000ff +0000010000f4010000ff0000010000f4010000ff0000010000f4010000ff0000010000f4 +010000ff0000010000f4010000ff000001f600ff007b060000ff00f6060000ff00f50602 +00ff00f4060200ff00f3060400ff00f2060400ff00f4060000ff00f6060000ff00f60600 +00ff00f6060000ff00f6060000ff00f6060000ff00f6060000ff00f6060000ff00f60600 +00ff00f6060000ff007606ff060100f5060000ff060000f5060000ff060000f5060000ff +060000f5060000ff060000f5060000ff060000f5060000ff060000f5060000ff060000f5 +060000ff060000f5060000ff060000f5060000ff060000f5060000ff060000f5060000ff +060000f5060000ff060000f5060000ff060000f5060000ff0600007a037a0600037a0009 +037a0600037b02f403000009030002f4030102f403000009030002f4030102f403000009 +030002f4030102f403000009030002f4030102f403000009030002f40301020501040210 +010002040104020e0100020f0100020d0104020901040202010002080100020301000207 +0100020f0104020e01000201010002060100020801000206010002070104020901040202 +0100020c030000090300021001040210010002040104020e0100020f0100020d01040209 +010402020100020801000203010002070100020f010002080100021b0100020801000201 +0100021e03010205010002030100020f01000204010002030100021e0100020d01000203 +01000208010002030100020b010002030100021801000203010002100101020401010208 +0100020f0100020301000208010002030100020f0300000903000210010002030100020f +01000204010002030100021e0100020d0100020301000208010002030100020b01000203 +01000218010002080100021b010002080100022103010205010002030100020201020203 +010202020100020101000201010002030100020201000200010002010102020201000202 +010202030102020101020201010202030100020001000200010002030100020101000202 +010002010100020301000201010002010100020001010202010002030100020201010202 +010002010100020001010203010102000100020101000203010002020100020001000201 +010202020100020101010204010102020102020101020201010002000100020001000200 +010002030100020001000203010002010100020201000201010002030100020101000201 +010002000101020603000009030002100100020301000202010202030102020201000201 +010002010100020301000202010002000100020101020202010002020102020301020201 +010202010102020301000200010002000100020301000201010002020100020101000203 +010002010100020101000200010102020100020301000202010102020100020101000200 +010102030101020001000201010002010100020001010201010202010102020301000200 +010002000100020001010203010202020100020201020201010202000100020201020202 +010002000101021103010205010002030100020101000202010002010100020201000201 +010002000100020201000203010002020101020101000202010002010100020101000202 +010002010100020201000201010002010100020201000202010102010100020301000201 +010002020100020101000203010002010100020101010201010002010100020301000201 +010002010100020101000201010102010100020101000201010102010100020301000202 +010102010100020201000201010002010100020001000202010002000100020101000202 +010002010100020201010201010002010100020101000201010002030100020101000202 +010002010100020301000201010002010101020101000205030000090300021001000203 +010002010100020201000201010002020100020101000200010002020100020301000202 +010102010100020201000201010002010100020201000201010002020100020101000201 +010002020100020201010201010002030100020101000202010002010100020301000201 +010002010101020101000201010002030100020101000201010002010100020101010201 +010002010100020101010201010002010101020101000201010002010100020201000202 +010102010101020101000201010002020100020101000201010002020100020101000201 +010002010100020201000201010102010100021003010205010402060100020101000205 +010102030104020301000202010002020100020101000201010002020100020101000205 +010002010100020201000202010002020104020201000202010002010104020201000201 +010002020100020101000203010002010100020401000201010002020100020101000202 +010002010104020301000202010002020100020101000201010002000100020201000200 +010002050100020101000202010002020100020201010202010402020100020201000201 +010402020100020101000202010002050300000903000210010402060100020101000205 +010102030104020301000202010002020100020101000201010002020100020101000205 +010002010100020201000202010002020104020201000202010002010104020201000201 +010002020100020101000203010002010100020401000201010002020100020101000202 +010002010100020101000202010002010100020101000202010002020100020201000202 +010002010100020201000201010002050100020101000201010002010100020201000201 +010002020100021003010205010002030100020201030201010002050101020301000207 +010002020100020201000201010002010104020101000205010002010100020201000202 +010002020100020301000201010002010100020201000203010002010100020101000202 +010002010100020301000202010102020100020101000202010002010100020201000201 +010002070100020201000202010002010100020101000201010002000100020101000202 +010302010100020201000202010002020101020201000203010002010100020101000202 +010002030100020101000201010002020100020503000009030002100100020301000202 +010302010100020501010203010002070100020201000202010002010100020101040201 +010002050100020101000202010002020100020201000203010002010100020101000202 +010002030100020101000201010002020100020101000203010002020101020201000201 +010002020100020101000202010002010100020101000202010002010100020101040202 +010002020100020201000201010002020100020101000202010302010100020101000201 +010002020100020101000202010002100301020501000203010002010100020201000201 +010002050100020001000202010002070100020201000202010002010100020101000205 +010002050100020101000202010002020100020201000203010002020100020001000202 +010002030100020101000201010002020100020101000203010002040100020101000201 +010002020100020101000202010002010100020701000202010002020100020101000201 +010002010100020001000201010002010100020201000201010002020100020201000201 +010002010100020101000203010002020100020001000202010002030100020101000201 +010002020100020503000009030002100100020301000201010002020100020101000205 +010002000100020201000207010002020100020201000201010002010100020501000205 +010002010100020201000202010002020100020301000202010002000100020201000203 +010002010100020101000202010002010100020301000204010002010100020101000202 +010002010100020201000201010002010100020201000201010002010100020601000202 +010002020100020101000202010002010100020101000202010002010100020101000201 +010002020100020101000202010002100301020501000203010002010100020201000201 +010002020100020101000201010002010100020701000202010002020100020101000201 +010002020100020101000202010002010100020101000202010002020100020201000203 +010002020100020001000202010002030100020101000201010002020100020101000203 +010002010100020101000201010002010100020201000201010002010101020101000207 +010002020100020201000201010002010100020201000202010002010100020201000201 +010002020100020201000200010002030100020001000203010002020100020001000202 +010002030100020101000201010002020100020503000009030002100100020301000201 +010002020100020101000202010002010100020101000201010002070100020201000202 +010002010100020101000202010002010100020201000201010002010100020201000202 +010002020100020301000202010002000100020201000203010002010100020101000202 +010002010100020301000201010002010100020101000201010002020100020101000201 +010102010100020101000202010002010100020101000202010002020100020201010201 +010002010100020201000201010002010100020201000201010002010100020101000202 +010002010100020201000210030102050104020301020200010002010102020201000202 +010002000100020701000203010202020100020201020203010202020101020101020203 +010002020104020401000203010402020100020101000202010002020103020301010202 +010002010100020201000202010102000100020101000207010002030102020201000201 +010002020100020201000202010202000100020001010201010002020100020001000203 +010002000104020401000203010402020100020101000202010002050300000903000210 +010402030102020001000201010202020100020201000200010002070100020301020202 +010002020102020301020202010102010102020301000202010402040100020301040202 +010002010100020201000202010302030101020201000201010002020100020201010200 +010002010100020101000202010002010101020101020203010002020100020001010203 +010202020100020201020200010002000101020001000202010202020100020201000210 +030102350100022801000231010002150100022e01000219030000090300024001000228 +010002310100021a0100023903010235010002270100022e01000202010002150100022d +0100021a0300000903000240010002270100022e010002020100021a0100023903010234 +0100022701000230010202150100022d0100021b030000090300023f0100022701000230 +0102021b01000239030102f403000009030002f4030102f403000009030002f4030102f4 +03000009030002f4030102f403000009030002f4030102f403000009030002f403f70009 +03f5 +%%EndData +end +%%PageTrailer +%%Trailer +%%BoundingBox: 0 0 503 79 +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig11.png b/documentation/graphics/STIR-developers-overviewFig11.png new file mode 100644 index 0000000000..7d71093dec Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig11.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig12.eps b/documentation/graphics/STIR-developers-overviewFig12.eps new file mode 100644 index 0000000000..c28c2309b0 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig12.eps @@ -0,0 +1,651 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (STIR-developers-overviewFig12.eps) +%%CreationDate: (Mon Oct 25 16:23:51 2004) +%%BoundingBox: 0 0 407 79 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 0 +%%EndComments + +%%BeginDefaults +%%PageOrientation: Portrait +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/buffer 512 string def +/byte 1 string def +/color_packet 3 string def +/pixels 768 string def + +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-RunlengthEncodedCompression or 1-NoCompression. + % hex color packets. + % + gsave + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Helvetica findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 408 80 +userdict begin +%%BeginData: +DisplayImage +0 0 +408 80 +12.000000 +408 80 +1 +0 +0 +256 +ffffff +000000 +ffffc0 +9f9f60 +900000 +009000 +000090 +c0c0c0 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +006801c600d0010000c4010000d0010000c4010000d0010000c4010000d0010000c40100 +00d0010000c4010000d0010000350104000e010000010100000601000008010000060100 +000701040009010400020100003c010000d0010000350100000301000010010100040101 +00080100000f0100000301000008010000030100003f010000d001000035010000030100 +000201000000010000010102000201000001010100040101000201020001010200010100 +000001000000010000000100000301000000010000030100000101000002010000010100 +000301000001010000010100000001010036010000d00100003501000003010000020101 +000101000002010000010100000101000000010000020100000001000001010000020100 +000101000002010100010100000101000001010000010100000301000001010000020100 +00010100000301000001010000010101000101000035010000d001000035010400030100 +000201000002010000010100000101000000010000020100000001000005010000010100 +000201000002010000020101000201040002010000020100000101040002010000010100 +000201000035010000d00100003501000007010000020100000201000001010000010100 +000101000000010000010100000201030001010000020100000201000002010100020100 +000301000001010000010100000201000003010000010100000101000002010000350100 +00d001000035010000070100000201000002010000010100000101000001010000000100 +000101000001010000020100000101000002010000020100000101000001010000010100 +000301000002010000000100000201000003010000010100000101000002010000350100 +00d001000035010000070100000201000002010000010100000101000002010000020100 +000101000002010000010100000201000002010000000100000301000000010000030100 +000201000000010000020100000301000001010000010100000201000035010000d00100 +003501000007010000030102000201000001010000020100000201000002010200000100 +000001010001010000020100000001000003010000000104000401000003010400020100 +00010100000201000035010000d0010000490100002e01000049010000d0010000490100 +002d0100004a010000d0010000480100002d0100004b010000d0010000c4010000d00100 +00c4010000d0010000c4010000d0010000c4010000d0010000c4010000d001c600ff0033 +060000ff0096060000ff0095060200ff0094060200ff0093060400ff0092060400ff0094 +060000ff0096060000ff0096060000ff0096060000ff0096060000ff0096060000ff0096 +060000ff0096060000ff0096060000ff0096060000ff002e06d100c5060000cf060000c5 +060000cf060000c5060000cf060000c5060000cf060000c5060000cf060000c5060000cf +060000c5060000cf060000c5060000cf060000c5060000cf060000c5060000cf060000c5 +060000cf060000c5060000cf060000c5060000cf060000c5060000cf060000c5060000cf +06000062036206000362000903620600036302c403000009030002c4030102c403000009 +030002c4030102c403000009030002c4030102c403000009030002c4030102c403000009 +030002c4030102050104020e010002010100020601000208010002060100020701040209 +010402020100020801000203010002070100020f0104020f010602130100021303000009 +0300021c0104020e01000201010002060100020801000206010002070104020901040202 +010002080105021601050201010002010100022303010205010002030100021001010204 +010102080100020f0100020301000208010002030100020b010002030100021801000203 +010002110100022b030000090300021c010002030100021001010204010102080100020f +0100020301000208010002030100020b0100021b01000209010002230301020501000203 +010002020100020001000201010202020100020101010204010102020102020101020201 +010002000100020001000200010002030100020001000203010002010100020201000201 +010002030100020101000201010002000101020201000203010002020101020201000201 +010002000101020301010200010002010100020301000202010202020100020201000203 +010002040100020001000201010202030102020201000201010002000101020301010200 +01000205030000090300021c010002030100020201000200010002010102020201000201 +010102040101020201020201010202010100020001000200010002000100020301000200 +010002030100020101000202010002010100020301000201010002010100020001010202 +010002070100020001000201010202020100020001000201010002020100020601000201 +010002020102021d03010205010002030100020201010201010002020100020101000201 +010002000100020201000200010002010100020201000201010002020101020101000201 +010002010100020101000203010002010100020201000201010002030100020101000201 +010102010100020101000203010002010100020101000201010002010101020101000201 +010002010101020101000203010002010100020201000201010002020100020301000204 +010102010100020201000201010002020100020101000201010102010100020101000201 +01010205030000090300021c010002030100020201010201010002020100020101000201 +010002000100020201000200010002010100020201000201010002020101020101000201 +010002010100020101000203010002010100020201000201010002030100020101000201 +010102010100020101000207010102010100020201000201010102000101020001000201 +010002060100020101000201010002020100021c03010205010402030100020201000202 +010002010100020101000200010002020100020001000205010002010100020201000202 +010002020101020201040202010002020100020101040202010002010100020201000201 +010002030100020101000204010002010100020201000201010002020100020101040206 +010002010100020201000203010002040100020601000201010002050100020101000202 +010002010100020201000205030000090300021c01040203010002020100020201000201 +010002010100020001000202010002000100020501000201010002020100020201000202 +010102020104020201000202010002010104020201000201010002020100020101040203 +010002020100020201000201010002010100020101000201010402020100020101000201 +010002020100021c03010205010002070100020201000202010002010100020101000201 +010002000100020101000202010302010100020201000202010002020101020201000203 +010002010100020101000202010002030100020101000201010002020100020101000203 +010002020101020201000201010002020100020101000202010002010100020201000203 +010302010100020101000204010002040100020301030201010002050100020101000202 +010002010100020201000205030000090300021c01000207010002020100020201000201 +010002010100020101000200010002010100020201030201010002020100020201000202 +010102020100020301000201010002010100020201000203010002010100020101000202 +010002010100020701000202010002020100020101000201010002010100020101000206 +01000201010002010104021c030102050100020701000202010002020100020101000201 +010002010100020001000201010002010100020201000201010002020100020201000201 +010002010100020101000203010002020100020001000202010002030100020101000201 +010002020100020101000203010002040100020101000201010002020100020101000202 +010002010100020301000201010002020100020201000200010002040100020401000202 +010002020100020101000205010002010100020201000201010002020100020503000009 +0300021c0100020701000202010002020100020101000201010002010100020001000201 +010002010100020201000201010002020100020201000201010002010100020101000203 +010002020100020001000202010002030100020101000201010002020100020101000207 +010002020100020201000201010002010100020101000201010002060100020101000201 +010002200301020501000207010002020100020201000201010002010100020201000202 +010002010100020201000201010002020100020201000200010002030100020001000203 +010002020100020001000202010002030100020101000201010002020100020101000203 +010002010100020101000201010002010100020201000201010002010101020101000203 +010002010100020201000202010002000100020401000204010002020100020201000201 +01000202010002010100020101000202010002010100020101010205030000090300021c +010002070100020201000202010002010100020101000202010002020100020101000202 +010002010100020201000202010002000100020301000200010002030100020201000200 +010002020100020301000201010002010100020201000201010002070100020201000202 +01000201010002010100020101000201010002060100020101000201010002020100021c +030102050100020701000203010202020100020101000202010002020100020201020200 +010002000101020101000202010002000100020301000200010402040100020301040202 +010002010100020201000202010302030101020201000201010002020100020201010200 +010002010100020301000202010202000100020201000205010002040100020301020200 +01000201010202020100020101000202010002020101020001000205030000090300021c +010002070100020301020202010002010100020201000202010002020102020001000200 +010102010100020201000200010002030100020001040204010002030104020201000201 +010002020100020101000207010002030102020201000201010002010100020101000206 +01000201010002020102021d030102190100022e01000231010002120100022b01000205 +03000009030002300100022e01000262030102190100022d0100022e0100020201000211 +01000228010002020100020503000009030002300100022d01000263030102180100022d +01000230010202110100022a01020206030000090300022f0100022d01000264030102c4 +03000009030002c4030102c403000009030002c4030102c403000009030002c4030102c4 +03000009030002c4030102c403000009030002c403c7000903c5 +%%EndData +end +%%PageTrailer +%%Trailer +%%BoundingBox: 0 0 407 79 +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig12.png b/documentation/graphics/STIR-developers-overviewFig12.png new file mode 100644 index 0000000000..a8a20462fd Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig12.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig2.eps b/documentation/graphics/STIR-developers-overviewFig2.eps new file mode 100644 index 0000000000..88a503c807 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig2.eps @@ -0,0 +1,3412 @@ +%!PS-Adobe-3.0 +%%Creator: Advanced Batch Converter +%%Title: +%%CreationDate: Mon Oct 25 18:57:50 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 594 841 +%%EndComments +%%BeginProlog +10 dict begin +%%EndProlog +%%Page: 1 1 +0 842 translate +594 -361 scale +824 501 8 +[ 824 0 0 501 0 0 ] +/rstr 824 string def +/gstr 824 string def +/bstr 824 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 186660 ASCII Bytes +colorimage +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcE=]s+&,h#O7sV"APQZs+13$s+13$s4.."~> +JcE=]s+&,h#O7sV"APQZs+13$s+13$s4.."~> +JcE=]s+&,h#O8*Z"AP]^s+13$s+13$s4.."~> +JcE=]s+&/i!nWk?!rp%=!X*-8JcC<$JcC<$ec1.~> +JcE=]s+&/i!nWk?!rp%=!X*-8JcC<$JcC<$ec1.~> +JcE=]s+&/i!nWk?!rp%=!X*-8JcC<$JcC<$ec1.~> +JcC<$s8N2k"R?$err^kILAui)JcC<$JcF:#JH~> +JcC<$s8N2k"R?$err^kILAui)JcC<$JcF:#JH~> +JcC<$s8N2k"R?$err^kILAui)JcC<$JcF:#JH~> +JcE[g!q?En^]+A."TO&QJcEOcs+&,h#O7sV"APQZs+14"s+"~> +JcE[g!q?En^]+A."TO&QJcEOcs+&,h#O7sV"APQZs+14"s+"~> +JcE[g!q?En^]+A2"TO&QJcEOcs+&,h#O8*Z"AP]^s+14"s+"~> +JcE[g!nRST^]+@I"TO&QJcEOcs+&/i!nWk?!rp%=!X*-8JcF7"JA~> +JcE[g!nRST^]+@I"TO&QJcEOcs+&/i!nWk?!rp%=!X*-8JcF7"JA~> +JcE[g!nRST^]+@I"TO&QJcEOcs+&/i!nWk?!rp%=!X*-8JcF7"JA~> +JcE[g!epjX^]4<:JcC<$K`;/E"R?$err^kILAui)eGk(~> +JcE[g!epjX^]4<:JcC<$K`;/E"R?$err^kILAui)eGk(~> +JcE[g!epjX^]4<:JcC<$K`;/E"R?$err^kILAui)eGk(~> +JcE^h!MBPr"TQ7:rrdoQJcEjl!q?En^]+A."TO&Qc2W=~> +JcE^h!MBPr"TQ7:rrdoQJcEjl!q?En^]+A."TO&Qc2W=~> +JcE^h!Mfi!"TQ7:rrdoQJcEjl!q?En^]+A2"TO&Qc2W=~> +JcFs6#MitpB%QPUs8;lu^jlOi"G#,(qYpW4J-6#YL>Dla"T/E%rrhl-R0 +JcFs6#MitpB%QPUs8;lu^jlOi"G#,(qYpW4J-6#YL>Dla"T/E%rrhl-R0 +JcFs6#MitpB%QPUs8;lu^jlOi"G#,(qYpW4J-6#YL>Dla"T/E%rrhl-R0 +JcG!7"2G&4rrW59"9AZ*rr3)cB#+EMs49sJT`=ri"b<99s5O4`"P +JcG!7"2G&4rrW59"9AZ*rr3)cB#+EMs49sJT`=ri"b<99s5O4`"P +JcG!7"2G&8rrW59"9AZ*rr3)cB#+EMs49sJV#UAm"b +JcG!7!bMT8rr3&*"TSK$!eA)drr3#T"9J_As8N$"J;4+'rr\ns:&b7o"9AZ*qu6]e"9AZ*r;Qhd +LB%5P"2G%is8W*"nH8jqTE:eOrri@p"G$OGrrSUCs8Ds"^]]2frVum#JcC<$b5VL8"9AZ*^]4<: +JcEsoJA~> +JcG!7!bMT8rr3&*"TSK$!eA)drr3#T"9J_As8N$"J;4+'rr\ns:&b7o"9AZ*qu6]e"9AZ*r;Qhd +LB%5P"2G%is8W*"nH8jqTE:eOrri@p"G$OGrrSUCs8Ds"^]]2frVum#JcC<$b5VL8"9AZ*^]4<: +JcEsoJA~> +JcG!7!bMT8rr3&*"TSK$!eA)drr3#T"9J_As8N$"J;4+'rr]&":&b7o"9AZ*qu6]e"9AZ*r;Qhd +LB%5P"2G%is8W*"nH8jqU]R@Wrri@t"G$OGrrSUCs8Ds"^]]2frVum#JcC<$b5VL<"9AZ*^]4<: +JcEsoJA~> +JcG!7rr`A_s8W*#nHAmlrrTt=s8;os"9F&Qs8N2Q"Ps+Wrr_dcJH#ZM"9AZ*qZ$Qur;QlZ"Ps+U +rr[cSfDkmNrr`ASs8N$!nH8jqs7cNqirn3 +JcG!7rr`A_s8W*#nHAmlrrTt=s8;os"9F&Qs8N2Q"Ps+Wrr_dcJH#ZM"9AZ*qZ$Qur;QlZ"Ps+U +rr[cSfDkmNrr`ASs8N$!nH8jqs7cNqirn3 +JcG!7rr`A_s8W*#nHAmlrrTt=s8;os"9F&Qs8N2Q"Ps+Wrr_dcJH#ZM"9AZ*qZ$Qur;QlZ"Ps+U +rr[cSfDkmNrr`ASs8N$!nH8jqs7cNqirn3 +JcG!7"GR%RfDkaJ!JUaP"TJE&L'7POs8N5ts8N6"rrShrs82fuf*$j.s8W*%qu?[!pAY2e"TSB! +"4m[1s8N&u"G-T(s6fmh^]^>1!rp%=!9Xs8W*#J7\od"TP+tr<*/:s7QBtJ=5s-n\>9Xs8;os"G-Tss+&~> +JcG!7"GR%RfDkaJ!JUaP"TJE&L'7POs8N5ts8N6"rrShrs82fuf*$j.s8W*%qu?[!pAY2e"TSB! +"4m[1s8N&u"G-T(s6fmh^]^>1!rp%=!9Xs8W*#J7\od"TP+tr<*/:s7QBtJ=5s-n\>9Xs8;os"G-Tss+&~> +JcG!7"GR%RfDkaJ!JUaP"TJE&L'7POs8N5ts8N6"rrSu!s82fuf*$j.s8W*%qu?[!pAY2i"TSB! +"4m[1s8N&u"G-T(s6fmh^]^J5!rp%=!D`8irfDdfDbmO"9AZ* +r;QhKAcr,;s82g%J=5s-n\>9Xs8W*#J7\od"TP8#r<*/:s7QBtJ=5s-n\>9Xs8;os"G-Tss+&~> +JcFs6!JU^Z"D5ILrVum#p&G$pp](6rq>^Htr;Qgm"TSB!!U9dg"TSN%rri6!rri&q!_igtqu6]^ +"9AZ*rr1b?rr^%>JH,TJrrdoQbl<3~> +JcFs6!JU^Z"D5ILrVum#p&G$pp](6rq>^Htr;Qgm"TSB!!U9dg"TSN%rri6!rri&q!_igtqu6]^ +"9AZ*rr1b?rr^%>JH,TJrrdoQbl<3~> +JcFs6!JU^Z"D5ILrVum#p&G$pp](6rq>^Htr;Qgm"TSB!!U9dg"TSN%rri6!rri&q!_igtqu6]^ +"9AZ*rr1b?rr^%>JH,TJrrdoQbl<3~> +JcFp5!o8S6!sD?Ms8W-!"SMfp"S_rr"Sr)t"T8<""Sr)t"TJH$"T/6!"SVlq"Sr)t"TAB#"G-T( +s6fpe"9IQ_s8N/j"TSN%!l+s=r;Zd"!J(4Mrr^jUh>dKS"7]*9rrN-&!dEQ +"+UO+s8W-!"9I-Srr3#h"9AZ*p\t?U"Ps+Urr[cSfDkjMrrdoQbl<4~> +JcFp5!o8S6!sD?Ms8W-!"SMfp"S_rr"Sr)t"T8<""Sr)t"TJH$"T/6!"SVlq"Sr)t"TAB#"G-T( +s6fpe"9IQ_s8N/j"TSN%!l+s=r;Zd"!J(4Mrr^jUh>dKS"7]*9rrN-&!dEQ +"+UO+s8W-!"9I-Srr3#h"9AZ*p\t?U"Ps+Urr[cSfDkjMrrdoQbl<4~> +JcFp5!o8S6!sD?Ms8W-!"SMfp"S_rr"Sr)t"T8<""Sr)t"TJH$"T/6!"SVlq"Sr)t"TAB#"G-T( +s6fpe"9IQ_s8N/j"TSN%!l+s=r;Zd"!J(4Mrr^jUh>dKS"7]*9rrN-&!dEQ +"+UO+s8W-!"9I-Srr3#h"9AZ*p\t?U"Ps+Urr[cSfDkjMrrdoQbl<4~> +JcFj3!oo" +JcFj3!oo" +JcFj3!oo" +JcFd1"/#d/rri@P"GZsRrrHa3s8N1O"LA(+rrV_&rrN-&! +JcFd1"/#d/rri@P"GZsRrrHa3s8N1O"LA(+rrV_&rrN-&! +JcFd1"/H'3rri@P"GZsRrrHa3s8N1O"LA(+rrV_&rrN-&!!s8W*% +qu?[!pAY5L"P<\NrrN>!s8N&u"G-T(s6]geL'.S]B#+HFs8N5ps8N5rs8N5ts8N6"rrPmts82fs +l3%+js8W-!"T/6!"SVis9a(LnrrMBf! +JcG!7!X/&nrVum#s8N,8"9J_Xs8Ds!f9u[=rrg+?:%A8_rrTKorrN-&! +JcG!7!X/&nrVum#s8N,8"9J_Xs8Ds!f9u[=rrg+?:%A8_rrTKorrN-&! +JcG!7!X/&nrVum#s8N,8"9J_Xs8Ds!f9u[=rrg+?:%A8_rrTKorrN-&! +JcG!7!X+qkrVlp%JH,ZL!DN\!"MjR-"TR(Jh>dKS"AK#Lj8T8^h#ud^Htq>^Htr;Zd"!UB^^rrN=8s8W-!"T/6!"SVlq"9Iffqu6^#B)hl1rrdoQbl<4~> +JcG!7!X+qkrVlp%JH,ZL!DN\!"MjR-"TR(Jh>dKS"AK#Lj8T8^h#ud^Htq>^Htr;Zd"!UB^^rrN=8s8W-!"T/6!"SVlq"9Iffqu6^#B)hl1rrdoQbl<4~> +JcG!7!X+qkrVlp%JH,ZL!DN\!"MjR-"TR(Jh>dKS"AK#Lj8T8^h#ud^Htq>^Htr;Zd"!UB^^rrN=8s8W-!"T/6!"SVlq"9Iffqu6^#B)hl1rrdoQbl<4~> +JcG!7rr`CXlMh"eTM=_Os8N/c9a(@s!MKJkrrLpYqud%ns8W*"R0"Mk'2rr[cS_#FQ;nXtF4rVlo6"9J_^s+13$s6BUdTEJm, +"TNuTLB%/N!G;B3rr[cSZN'n'!qBn&!WN9'"TS>urri9"",6s1s82ft"JGeps8N6!s8N5qrr[uY +fDkaJ!X,1rrr +JcG!7rr`CXlMh"eTM=_Os8N/c9a(@s!MKJkrrLpYqud%ns8W*"R0"Mk'2rr[cS_#FQ;nXtF4rVlo6"9J_^s+13$s6BUdTEJm, +"TNuTLB%/N!G;B3rr[cSZN'n'!qBn&!WN9'"TS>urri9"",6s1s82ft"JGeps8N6!s8N5qrr[uY +fDkaJ!X,1rrr +JcG!7rr`CXlMh"eUeU.Ss8N/c9a(@s!MoborrLpYqud%rs8W*"R0"Mk'2rr[cS_#FQ;nYC^8rVlo6"9J_^s+13$s6BUdU]b<0 +"TNuTLB%/N!G;B3rr[cSZN'n'!qBn&!WN9'"TS>urri9"",6s1s82ft"Jl(ts8N6!s8N5qrr[uY +fDkaJ!X,>!rr +JcG!7"9e8HJ-5rWRHjhMrrTK<"9Sdph>dBP!pZ0V!sF/+s8N$%nV.0Yj8]/ZqZQfr!l0"P<\PrrUf?s8W*%^][C% +s8N$"ZC1^nrr`?*s8)cq"T89%f*$j.r;QlZ"QTO^s8N6!s8N5qrr^jULB%2O"60OEs8N&u"G-Ts +s+(~> +JcG!7"9e8HJ-5rWRHjhMrrTK<"9Sdph>dBP!pZ0V!sF/+s8N$%nV.0Yj8]/ZqZQfr!l0"P<\PrrUf?s8W*%^][C% +s8N$"ZC1^nrr`?*s8)cq"T89%f*$j.r;QlZ"QTO^s8N6!s8N5qrr^jULB%2O"60OEs8N&u"G-Ts +s+(~> +JcG!7"9e8HJ-5rWRHjhMrrTK<"9Sdph>dBP!pZ0V!sF/+s8N$%nV.0Yj8]/ZqZQfr!l0"P<\PrrUf?s8W*%^][C% +s8N$"ZC1^nrr`?*s8)cq"T89%f*$j.r;QlZ"QTO^s8N6!s8N5qrr^jULB%2O"60OEs8N&u"G-Ts +s+(~> +JcC<$JcC<$lMgngRK*6c!X+&Rs8N*o"9SeBnc&alf1k*$rr3*q"G#P4"TR9\j8T/["9eqDs1j0b +rrdHRs-`fbrrdoQbl<1~> +JcC<$JcC<$lMgngRK*6c!X+&Rs8N*o"9SeBnc&alf1k*$rr3*q"G#P4"TR9\j8T/["9eqDs1j0b +rrdHRs-`fbrrdoQbl<1~> +JcC<$JcC<$lMgngRK*6c!X+&Rs8N*o"9SeBnc&alf1k*$rr3*q"G#P4"TR9\j8T/["9eqDs1j0b +rrdHRs-`fbrrdoQbl<1~> +JcC<$JcC<$lMpke!f$"?"TP,hlMpna!pWJ_qud%ns8Druh$!WY!MKJmrrJMjrWE8^s8W*"^]X]A +_#O?4"+UNirriAlTRd(ArrKn"Ps*/s3CXp +~> +JcC<$JcC<$lMpke!f$"?"TP,hlMpna!pWJ_qud%ns8Druh$!WY!MKJmrrJMjrWE8^s8W*"^]X]A +_#O?4"+UNirriAlTRd(ArrKn"Ps*/s3CXp +~> +JcC<$JcC<$lMpke!f$"?"TP8llMpna!pWJ_qud%rs8Druh$!WY!MobqrrJMjrWE8^s8W*"^]X]A +_#O?4"+UNirriAlUk&LErrKn"Ps*/s3CXp +~> +JcC<$JcC<$lMgtin^i9o!sG%Ws8;luZ=X4A"I\*Gqu6`_R03TpJCji#rrqqI"D6]os8Vs!qu6`5 +J-5rWJCji#s8)s!s8)rlrrTud"9SdWfDkjMq#l9Kci8L~> +JcC<$JcC<$lMgtin^i9o!sG%Ws8;luZ=X4A"I\*Gqu6`_R03TpJCji#rrqqI"D6]os8Vs!qu6`5 +J-5rWJCji#s8)s!s8)rlrrTud"9SdWfDkjMq#l9Kci8L~> +JcC<$JcC<$lMgtin^i9o!sG%Ws8;luZ=X4A"I\*Gqu6`_R03TpJCji#rrqqI"D6]os8Vs!qu6`5 +J-5rWJCji#s8)s!s8)rlrrTud"9SdWfDkjMq#l9Kci8L~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$ao?k~> +JcG0 +JcG0 +JcG0 +JcG0 +JcG0 +JcG0 +JcD#8!V$9n"TO&QJcC<$JcE:\J:~> +JcD#8!V$9n"TO&QJcC<$JcE:\J:~> +JcD#8!V$9n"TO&QJcC<$JcE:\J:~> +JcCu7rrdoQJcFa0"S'9q"TP"ls+#\#_uG8~> +JcCu7rrdoQJcFa0"S'9q"TP"ls+#\#_uG8~> +JcCu7rrdoQJcFa0"S'9q"TP"ls+#\#_uG8~> +JcCu7rrdoQJcFa0!e=kc! +JcCu7rrdoQJcFa0!e=kc! +JcCu7rrdoQJcFa0!e=kc! +JcCu7rrdoQJcF^/!V$9n"TO&QJcFO*JA~> +JcCu7rrdoQJcF^/!V$9n"TO&QJcFO*JA~> +JcCu7rrdoQJcF^/!V$9n"TO&QJcFO*JA~> +JcCu7rrdoQJcF[.rrhik!q?Enir9)M"TO&QOoKt~> +JcCu7rrdoQJcF[.rrhik!q?Enir9)M"TO&QOoKt~> +JcCu7rrdoQJcF[.rrhik!q?Enir9)M"TO&QOoKt~> +JcG6>"S'9q"TSK$"S'9q"TJ]+h1,W?fDkmN"i+^QB#+HFrrUf&"9Sd=fDkaJ!nVr*!sE5Os8)`s +^jlOi"G#,(oD]'OAcu_tnHAmjs8N6$rrhl-R0dHR!l03~> +JcG6>"S'9q"TSK$"S'9q"TJ]+h1,W?fDkmN"i+^QB#+HFrrUf&"9Sd=fDkaJ!nVr*!sE5Os8)`s +^jlOi"G#,(oD]'OAcu_tnHAmjs8N6$rrhl-R0dHR!l03~> +JcG6>"S'9q"TSK$"S'9q"TJ]+h1,W?fDkmN"i+^QB#+HFrrUf&"9Sd=fDkaJ!nVr*!sE5Os8)`s +^jlOi"G#,(oD]'OAcu_tnHAmjs8N6$rrhl-R0dHR!l03~> +JcG6>!e=kc!1!rp%=! +JcG6>!e=kc!1!rp%=! +JcG6>!e=kc! +JcG3=!V$9n"TSH#!V$9n"J?!mlMpC)"G!-HT^)O[s.BL,s8W*#9a(Lrrr_9aJH,WK"2G&qs8N$# +TEN(1rr3%M_#OE6!Smk["Mk'2rrQd8s8N$"Z3:4+s8N6#rrMWm! +JcG3=!V$9n"TSH#!V$9n"J?!mlMpC)"G!-HT^)O[s.BL,s8W*#9a(Lrrr_9aJH,WK"2G&qs8N$# +TEN(1rr3%M_#OE6!Smk["Mk'2rrQd8s8N$"Z3:4+s8N6#rrMWm! +JcG3=!V$9n"TSH#!V$9n"Jc9ulMpC)"G!9LV!@s_s.fd0s8W*#9a(Lrrr_9aJH,WK"2G&qs8N$# +U]eL5rr3%M_#OE6!Smk["Mk'2rrQd8s8N$"Z3:4+s8N6#rrMWm! +JcG0dHRrri?$s+((Jrri<#!bMT8rVlub"D7]6rrTt=s8;os"9F&Q +pAb-q!TX4[rrV]ns8Dut"T8<""T89%f*'q0rr32m9n<8Z"TSE"rr`@Qs+13,rrUf,"9Sdprr`?* +s8;lu^jlOi"G#,(s8N+S"T/E"rrTud"9SdWfDkdK!l0q>Urp^mP?*^h*_Ts7*mm"TSK$"S'9q"TJ]+f4G.t_#OB5!nVr*!sE5Os+14, +s+"~> +JcG0dHRrri?$s+((Jrri<#!bMT8rVlub"D7]6rrTt=s8;os"9F&Q +pAb-q!TX4[rrV]ns8Dut"T8<""T89%f*'q0rr32m9n<8Z"TSE"rr`@Qs+13,rrUf,"9Sdprr`?* +s8;lu^jlOi"G#,(s8N+S"T/E"rrTud"9SdWfDkdK!l0q>Urp^mP?*^h*_Ts7*mm"TSK$"S'9q"TJ]+f4G.t_#OB5!nVr*!sE5Os+14, +s+"~> +JcG0dHRrri?$s+((Jrri<#!bMT8rVlub"D7]6rrTt=s8;os"9F&Q +pAb-q!TX4[rrV]ns8Dut"T8<""T89%f*'q0rr32m9n<8Z"TSE"rr`@Qs+13,rrUf,"9Sdprr`?* +s8;lu^jlOi"G#,(s8N+S"T/E"rrTud"9SdWfDkdK!l0q>Urp^mP?*^h*_Ts7*mm"TSK$"S'9q"TJ]+f4G.t_#OB5!nVr*!sE5Os+14, +s+"~> +JcG0m[NJE-Y3s1j-f!U_NRIU=I^]]2fs8W+2rr`@q"TJT*:&k%hs(;96!MBSq"9_I!J7\ob"TSK$ +!e=kc!sJXs"T8H(_#OH7"/&BErrW59"T8ISs5F!.~> +JcG0m[NJE-Y3s1j-f!U_NRIU=I^]]2fs8W+2rr`@q"TJT*:&k%hs(;96!MBSq"9_I!J7\ob"TSK$ +!e=kc!sJXs"T8H(_#OH7"/&BErrW59"T8ISs5F!.~> +JcG0m[RJE-Y3s1j-f!U_NRIU=I^]]2fs8W+2rr`@u"TJT*:&k%hs(;96!Mfku"9_I!J7\ob"TSK$ +!e=kc!sJY""T8H(_#OH7"/JZIrrW59"T8ISs5F!.~> +JcG01b?rr^%>JH,ZL!V$9p"G#P4p&>'_"9SdWj8])X!V$9n"TSH# +!V$9n"J>ghlMh"eTEKfF"TQ7?h>dKS"/#e4s+14.s+%~> +JcG01b?rr^%>JH,ZL!V$9p"G#P4p&>'_"9SdWj8])X!V$9n"TSH# +!V$9n"J>ghlMh"eTEKfF"TQ7?h>dKS"/#e4s+14.s+%~> +JcG01b?rr^%>JH,ZL!V$9p"G#P4p&>'_"9SdWj8])X!V$9n"TSH# +!V$9n"Jc*plMh"eU]c5J"TQ7?h>dKS"/H(8s+14.s+%~> +JcG0dKS"7]*9s8N&u"T/3$irn3 +JcG0dKS"7]*9s8N&u"T/3$irn3 +JcG0dKS"7]*9s8N&u"T/3$irn3 +JcG0 +JcG0 +JcG0 +JcG0^Htqu?[!qu?[!s8N15"R?$crrN +JcG0^Htqu?[!qu?[!s8N15"R?$crrN +JcG0^Htqu?[!qu?[!s8N15"R?$crrN +JcG0 +JcG0 +JcG0 +JcG0 +JcG0 +JcG0 +JcG3=!Peg>"Mk':rrKn"Mk';rrKn&l!pWJ_ +qud%ns+13.rrZj9_#O?4rri?$"+UN/s82fsB)ho2rri6!"+UN/s82g"B)dAaZN'n'!qBn&rr +JcG3=!Peg>"Mk':rrKn"Mk';rrKn&l!pWJ_ +qud%ns+13.rrZj9_#O?4rri?$"+UN/s82fsB)ho2rri6!"+UN/s82g"B)dAaZN'n'!qBn&rr +JcG3=!Peg>"Mk':rrKn"Mk';rrKn!s8W-!"S)Nl"Sr)t"T/6!"T/6!"TJE'nUR#1!sF.is+14,s+#~> +JcG6>qZQs!qZQs!qZQs!qZI9+l=L0Rj8YMMZN't)!nU-Lq#g`(s8N$"Z=X4A"I\*Go`#$sn^i9o +!sG%Ws8W,r"9JN*qulrt!pZ0V!sF/+s8;luZ=X4A"I\*GJcCW-!O;h0"R?$drrMBf!"P<\Prs./Ds1eb3nc/Ug!j\6orr +JcG6>qZQs!qZQs!qZQs!qZI9+l=L0Rj8YMMZN't)!nU-Lq#g`(s8N$"Z=X4A"I\*Go`#$sn^i9o +!sG%Ws8W,r"9JN*qulrt!pZ0V!sF/+s8;luZ=X4A"I\*GJcCW-!O;h0"R?$drrMBf!"P<\Prs./Ds1eb3nc/Ug!j\6orr +JcG6>qZQs!qZQs!qZQs!qZI9+l=L0Rj8YMMZN't)!nU-Lq#g`(s8N$"Z=X4A"I\*Go`#$sn^i9o +!sG%Ws8W,r"9JN*qulrt!pZ0V!sF/+s8;luZ=X4A"I\*GJcCW-!O;h0"R?$drrMBf!"P<\Prs./Ds1eb3nc/Ug!j\6orr +JcE^h!o:0^qu6c`^]a[gs+13frrqpe"AQ]3"9723"9J_rs8W*"9`tP$_"%F-s4:!$s8W-!"9cO? +^juIbrrGgs!sHF0rriAR:#5gQs%NWHj8T8^h#ud +JcE^h!o:0^qu6c`^]a[gs+13frrqpe"AQ]3"9723"9J_rs8W*"9`tP$_"%F-s4:!$s8W-!"9cO? +^juIbrrGgs!sHF0rriAR:#5gQs%NWHj8T8^h#ud +JcE^h!o:0^qu6c`^]a[gs+13frrqpe"AQ]3"9723"9J_rs8W*"9`tP$_"%F-s4:!$s8W-!"9cO? +^juIbrrGgs!sHF0rriAR:#5gQs%NWHj8T8^h#ud +JcEai"7]+Us7uZq:&feEJcEUe!o6QRrWE9sl3%+jAcZND"97X\"T/B'T`>#k!LX)i"9IQ_s8N/c +9a(@s!MKJmrrLpYqud%ns8DruR0dEQ +!Peg>"Mk':rrKn +JcEai"7]+Us7uZq:&feEJcEUe!o6QRrWE9sl3%+jAcZND"97X\"T/B'T`>#k!LX)i"9IQ_s8N/c +9a(@s!MKJmrrLpYqud%ns8DruR0dEQ +!Peg>"Mk':rrKn +JcEai"7]+Us7uZq:&feEJcEUe!o6QRrWE9sl3%+jAcZND"97X\"T/B'V#UGo!LX)i"9IQ_s8N/c +9a(@s!MobqrrLpYqud%rs8DruR0dEQ +!Peg>"Mk':rrKn +JcEai!epjXq>UN3T`9TCJcERd$gO-S"GZ4A"I['qs8N$"Z=X4A"I\*GrVm&kL'2,Ks8;luZ=X4A +"I\*GrVlraR03TpJCji!rrqqI"D6]or;Qi6J-5rWJCji#s8)rls8)rts8)s!s8)s!s8)p#f1cDD +"9Gh.JcFa0J-~> +JcEai!epjXq>UN3T`9TCJcERd$gO-S"GZ4A"I['qs8N$"Z=X4A"I\*GrVm&kL'2,Ks8;luZ=X4A +"I\*GrVlraR03TpJCji!rrqqI"D6]or;Qi6J-5rWJCji#s8)rls8)rts8)s!s8)s!s8)p#f1cDD +"9Gh.JcFa0J-~> +JcEai!epjXq>UN3V#Q#GJcERd$gO-S"GZ4A"I['qs8N$"Z=X4A"I\*GrVm&kL'2,Ks8;luZ=X4A +"I\*GrVlraR03TpJCji!rrqqI"D6]or;Qi6J-5rWJCji#s8)rls8)rts8)s!s8)s!s8)p#f1cDD +"9Gh.JcFa0J-~> +JcEairr`Eu^uPIorr_)FJH(3#JcC<$^&J/iZN'h%"7!Z)s+140s+&~> +JcEairr`Eu^uPIorr_)FJH(3#JcC<$^&J/iZN'h%"7!Z)s+140s+&~> +JcEairr`Eu^uPIorr_)FJH(3#JcC<$^&J/iZN'h%"7!Z)s+140s+&~> +JcEai!nU-Lq?-hRs+13$s+13`rr_dcnc/Fb!DWTFs5O'/~> +JcEai!nU-Lq?-hRs+13$s+13`rr_dcnc/Fb!DWTFs5O'/~> +JcEai!nU-Lq?-hRs+13$s+13`rr_dcnc/Fb!DWTFs5O'/~> +JcE^h"7a0]"TJT,At\2ao`+poJcC<$JcEpn!epjXq>UN3T`9TCir=Q~> +JcE^h"7a0]"TJT,At\2ao`+poJcC<$JcEpn!epjXq>UN3T`9TCir=Q~> +JcE^h"7a0]"TJT,Au+Jeo`+poJcC<$JcEpn!epjXq>UN3V#Q#Gir=Q~> +JcDkPrrdoQJcC<$bl@\G"&6Sks8N$#h3ifnJcF^/JH~> +JcDkPrrdoQJcC<$bl@\G"&6Sks8N$#h3ifnJcF^/JH~> +JcDkPrrdoQJcC<$bl@\G"&6Sks8N$#h3ifnJcF^/JH~> +JcDkPrrdoQJcC<$bl7ar9a(:q!J^W*s5 +JcDkPrrdoQJcC<$bl7ar9a(:q!J^W*s5 +JcDkPrrdoQJcC<$bl7ar9a(:q!J^W*s5 +JcDkPrrdoQJcC<$bPq\7^kN!l"9W8/j8X]1huA6~> +JcDkPrrdoQJcC<$bPq\7^kN!l"9W8/j8X]1huA6~> +JcDkPrrdoQJcC<$bPq\7^kN!l"9W83j8X]1huA6~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDkPrrdoQJcC<$JcDABJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcC<$JcDDCJ;~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDhOrrdoQJcCT,rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCW-rrdoQRf@p~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDeNrrdoQJcCZ.rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC]/rrdoQRK%g~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcDbMrrdoQJcC`0rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCc1rrdoQR/_^~> +JcD_LrrdoQJcCf2rrdoQQiDU~> +JcD_LrrdoQJcCf2rrdoQQiDU~> +JcD_LrrdoQJcCf2rrdoQQiDU~> +JcD_LrrdoQJcCf2rrdoQQiDU~> +JcD_LrrdoQJcCf2rrdoQQiDU~> +JcD_LrrdoQJcCf2rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcCi3rrdoQQiDU~> +JcD\KrrdoQJcD):rri9"rri<#rrdoQSc=6~> +JcD\KrrdoQJcD):rri9"rri<#rrdoQSc=6~> +JcD\KrrdoQJcD):rri9"rri<#rrdoQSc=6~> +JcD\KrrdoQJcD):r<3-"rriB%r<.]OSc=6~> +JcD\KrrdoQJcD):r<3-"rriB%r<.]OSc=6~> +JcD\KrrdoQJcD):r<3-"rriB%r<.]OSc=6~> +JcD\KrrdoQJcD):qum'"rr`B&"TAOTs.'+>~> +JcD\KrrdoQJcD):qum'"rr`B&"TAOTs.'+>~> +JcD\KrrdoQJcD):qum'"rr`B&"TAOTs.'+>~> +JcD\KrrdoQJcD&9oE9aFSH"-~> +JcD\KrrdoQJcD&9oE9aFSH"-~> +JcD\KrrdoQJcD&9oE9aFSH"-~> +JcD\KrrdoQJcD&9rr`B&"Si1Os-s%=~> +JcD\KrrdoQJcD&9rr`B&"Si1Os-s%=~> +JcD\KrrdoQJcD&9rr`B&"Si1Os-s%=~> +JcD\KrrdoQJcD#8rriB%rWN9$rrdoQS,\"~> +JcD\KrrdoQJcD#8rriB%rWN9$rrdoQS,\"~> +JcD\KrrdoQJcD#8rriB%rWN9$rrdoQS,\"~> +JcDYJrrdoQJcD&9rri6!rrdoQRf@p~> +JcDYJrrdoQJcD&9rri6!rrdoQRf@p~> +JcDYJrrdoQJcD&9rri6!rrdoQRf@p~> +JcDYJrrdoQJcD#8rri9"rrdoQRf@p~> +JcDYJrrdoQJcD#8rri9"rrdoQRf@p~> +JcDYJrrdoQJcD#8rri9"rrdoQRf@p~> +JcDYJrrdoQJcD#8rri<#rrdoQRK%g~> +JcDYJrrdoQJcD#8rri<#rrdoQRK%g~> +JcDYJrrdoQJcD#8rri<#rrdoQRK%g~> +JcDYJrrdoQJcCu7rri?$rrdoQRK%g~> +JcDYJrrdoQJcCu7rri?$rrdoQRK%g~> +JcDYJrrdoQJcCu7rri?$rrdoQRK%g~> +JcDYJrrdoQJcCu7rriB%rrdoQR/_^~> +JcDYJrrdoQJcCu7rriB%rrdoQR/_^~> +JcDYJrrdoQJcCu7rriB%rrdoQR/_^~> +JcDYJrrdoQJcCr6rr`B&"9AZ*JcD/ +JcDYJrrdoQJcCr6rr`B&"9AZ*JcD/ +JcDYJrrdoQJcCr6rr`B&"9AZ*JcD/ +JcDYJrrdoQJcCr6r<.]OQiDU~> +JcDYJrrdoQJcCr6r<.]OQiDU~> +JcDYJrrdoQJcCr6r<.]OQiDU~> +JcDYJrrdoQJcCo5rWIfPQiDU~> +JcDYJrrdoQJcCo5rWIfPQiDU~> +JcDYJrrdoQJcCo5rWIfPQiDU~> +JcDVIrrgdMrrdoQJcE[grrdoQQN)L~> +JcDVIrrgdMrrdoQJcE[grrdoQQN)L~> +JcDVIrrgdMrrdoQJcE[grrdoQQN)L~> +e,Ot%JHUN,JHUN,p&p!IJ-~> +e,Ot%JHUN,JHUN,p&p!IJ-~> +e,Ot%JHUN,JHUN,p&p!IJ-~> +e,Ot%JHUN,JHUN,p&p!IJ-~> +e,Ot%JHUN,JHUN,p&p!IJ-~> +e,Ot%JHUN,JHUN,p&p!IJ-~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`mf37hnc/Rkg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`mf37hnc/Rkg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`mf37hnc/Rkg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`mf37hnc/Rkg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`mf37hnc/Rkg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`mf37hnc/Rkg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`li6tfoDedmg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`li6tfoDedmg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`li6tfoDedmg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`li6tfoDedmg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`li6tfoDedmg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`li6tfoDedmg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`l2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`l2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`l2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`l2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`l2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?sk5YD`l2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMal2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMal2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMal2Ubdp&G!og].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMakPtPbp](3qg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMakPtPbp](3qg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMakPtPbp](3qg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMakPtPbp](3qg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMakPtPbp](3qg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMakPtPbp](3qg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMajo>;_qZ$Ntg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMajo>;_qZ$Ntg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMajo>;_qZ$Ntg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMajo>;_qZ$Ntg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMajo>;_qZ$Ntg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMajo>;_qZ$Ntg].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](6rkPtMag].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb-qkl:Vbg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb-qkl:Vbg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb-qkl:Vbg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb-qkl:VbhZ*TY!WN<&"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU +"P`tV"PWnU"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb-qkl:VbhZ*TY!WN<&"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU +"P`tV"PWnU"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb-qkl:VbhZ*TY!WN<&"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU +"P`tV"PWnU"P`tV"PWnU"G6Z(~> +e,TFNnG`R[R03TpRHjhDs8E/lrrqrKZA&M^nGiLknc&jSR8!fYRH+>=s8E/Us8N5qs8N5cs8E/X +s8N3&rri?)g].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNnG`R[R03TpRHjhDs8E/lrrqrKZA&M^nGiLknc&jSR8!fYRH+>=s8E/Us8N5qs8N5cs8E/X +s8N3&rri?)g].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNnG`R[R03TpRHjhDs8E/lrrqrKZA&M^nGiLknc&jSR8!fYRH+>=s8E/Us8N5qs8N5cs8E/X +s8N3&rri?)g].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNnc&^V9u-c3s49uss7H?j"S2QpL9c=4! +e,TFNnc&^V9u-c3s49uss7H?j"S2QpL9c=4! +e,TFNnc&^V9u-c3s49uss7H?j"S2QpL9c=4! +e,TFNo)Ag^9u-f.rr^kIlMpPWrWM]irrhfjrrhrn"RuV_lMgtdh1,V0"P<\Hs8E/Us8N5qs8N5c +s8E/Vs8<)Ts8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5Us8N4Rs+#~> +e,TFNo)Ag^9u-f.rr^kIlMpPWrWM]irrhfjrrhrn"RuV_lMgtdh1,V0"P<\Hs8E/Us8N5qs8N5c +s8E/Vs8<)Ts8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5Us8N4Rs+#~> +e,TFNo)Ag^9u-f.rr^kIlMpPWrWM]irrhfjrrhrn"RuV_lMgtdh1,V0"P<\Hs8E/Us8N5qs8N5c +s8E/Vs8<)Ts8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5Us8N4Rs+#~> +e,TFNo)AcZ:&k.k!bR2ep&G!on,NCjn,NCjoD\lb_#O?4",6qjs7QEk"P`tV"SVlq"R,mb"SMcu +j1q=[WXh.D3;oDealg].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VgAh0UK)^A~> +e,TFNo)AcZ:&k.k!bR2ep&G!on,NCjn,NCjoD\lb_#O?4",6qjs7QEk"P`tV"SVlq"R,mb"SMcu +j1q=[WXh.D3;oDealg].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VgAh0UK)^A~> +e,TFNo)AcZ:&k.k!bR2ep&G!on,NCjn,NCjoD\lf_#O?4",6qjs7QEk"P`tV"SVlq"R,mb"SMcu +j1qI@h>[WXh.D3;oDealg].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VgAh0UK)^A~> +e,TFNoD\p_"JGemrr^%>lMpSXrWM]irrhfjrrhrn!L`ubrrMBf!"ASpes8<)Us8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5Us8N4R +s+%~> +e,TFNoD\p_"JGemrr^%>lMpSXrWM]irrhfjrrhrn!L`ubrrMBf!"ASpes8<)Us8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5Us8N4R +s+%~> +e,TFNoD\p_"Jl(qrr^%>lMpSXrWM]irrhfjrrhrn!L`ubrrMBf!"ASpes8<)Us8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5Us8N4R +s+%~> +e,TFNoD\p."P<\Orr_9aZN'XurWM]irrhfjrrhWe!X)6tp&G!og].9VpAb-qkl:Vbo`#'S"GZs. +"P;Z:_#O!*r<1pUrrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNoD\p."P<\Orr_9aZN'XurWM]irrhfjrrhWe!X)6tp&G!og].9VpAb-qkl:Vbo`#'S"GZs. +"P;Z:_#O!*r<1pUrrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNoD\p."P<\Orr_9aZN'XurWM]irrhfjrrhWe!X)6tp&G!og].9VpAb-qkl:Vbo`#'S"GZs. +"P;Z:_#O!*r<1pUrrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNoD\oI"QTO[rr_coLB$uIrWM]irrhfjrrhWe!X,1rp&G!og].9Vp&G$pl2U_co`#*1"Mj'' +s6fpd"9JN*! +e,TFNoD\oI"QTO[rr_coLB$uIrWM]irrhfjrrhWe!X,1rp&G!og].9Vp&G$pl2U_co`#*1"Mj'' +s6fpd"9JN*! +e,TFNoD\oI"QTO[rr_coLB$uIrWM]irrhfjrrhWe!X,>!p&G!og].9Vp&G$pl2U_co`#*1"Mj'' +s6fpd"9JN*! +e,TFNoD\o)"S)NhrrN +e,TFNoD\o)"S)NhrrN +e,TFNoD\o)"S)NhrrN +e,TFNoDegnq>^Htp&G!on,NCjn,NCjli.$ZLB$oGrWM!Urri#prrhTdrWMln"9_H)lMp8OrWE9% +"9AZ*huE]Zg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9Vr;Qo["GZs."P;Z:_#N[!rrdrR +JH~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjli.$ZLB$oGrWM!Urri#prrhTdrWMln"9_H)lMp8OrWE9% +"9AZ*huE]Zg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9Vr;Qo["GZs."P;Z:_#N[!rrdrR +JH~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjli.$^LB$oGrWM!Urri#prrhTdrWMln"9_H)lMp8OrWE9% +"9AZ*huE]Zg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9Vr;Qo["GZs."P;Z:_#N[!rrdrR +JH~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjm/I1X"R?$Zs8E/Us8N5ps8N5ds8E/orrh-\B#+H5s8E0# +s8N5[s8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N6"rrp1@^uMa#jo>>`K)^B~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjm/I1X"R?$Zs8E/Us8N5ps8N5ds8E/orrh-\B#+H5s8E0# +s8N5[s8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N6"rrp1@^uMa#jo>>`K)^B~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjm/I1X"R?$Zs8E/Us8N5ps8N5ds8E/orrh-\B#+H5s8E0# +s8N5[s8N5Vs8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N6"rrp1@^uMa#jo>>`K)^B~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjm/I-T_#O$+rWM!Urri#prrhTdrWMoo"0r&As6K^a"TJH$ +"Q9=["P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"T89&L'6P)s5a4["G6Z(~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjm/I-T_#O$+rWM!Urri#prrhTdrWMoo"0r&As6K^a"TJH$ +"Q9=["P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"T89&L'6P)s5a4["G6Z(~> +e,TFNoDegnq>^Htp&G!on,NCjn,NCjm/I-T_#O$+rWM!Urri#prrhTdrWMoo"0r&As6K^a"TJH$ +"Q9=["P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"T89&L'6P)s5a4["G6Z(~> +e,TFNoD\kd"TS>u!X*-8pAb*pn,NCjn,NCjmJd7>JH,3?rWM!Urri#prrhTdrWMoo"+UNis6K^a +"T8 +e,TFNoD\kd"TS>u!X*-8pAb*pn,NCjn,NCjmJd7>JH,3?rWM!Urri#prrhTdrWMoo"+UNis6K^a +"T8 +e,TFNoD\kd"TS>u!X*-8pAb*pn,NCjn,NCjmJd7>JH,3?rWM!Urri#prrhTdrWMoo"+UNis6K^a +"T8 +e,TFNoD\oI"R?$brr_9aLB$uIrWM]irrhfjrrhci!pXCtnc/Rkg].9Vp&G$pl2U_cp&G$pl2U_c +r;Za!j8],^g].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VrVm#V"D5ILj8],^K)^@~> +e,TFNoD\oI"R?$brr_9aLB$uIrWM]irrhfjrrhci!pXCtnc/Rkg].9Vp&G$pl2U_cp&G$pl2U_c +r;Za!j8],^g].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VrVm#V"D5ILj8],^K)^@~> +e,TFNoD\oI"R?$brr_9aLB$uIrWM]irrhfjrrhci!pXCtnc/Rkg].9Vp&G$pl2U_cp&G$pl2U_c +r;Za!j8],^g].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VrVm#V"D5ILj8],^K)^@~> +e,TFNoD\p."Ps+Urr_'[_#O-.rWM]irrhfjrrhci!bU`tnc/Rkg].9Vp&G$pl2U_cpAY6H"I];a +rrq\<"D6]oqZ$Ntr;Za!j8],^g].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VrVlu*"D7\n +s8N4Rs+#~> +e,TFNoD\p."Ps+Urr_'[_#O-.rWM]irrhfjrrhci!bU`tnc/Rkg].9Vp&G$pl2U_cpAY6H"I];a +rrq\<"D6]oqZ$Ntr;Za!j8],^g].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VrVlu*"D7\n +s8N4Rs+#~> +e,TFNoD\p."Ps+Urr_'[_#O-.rWM]irrhfjrrhci!bU`tnc/Rkg].9Vp&G$pl2U_cpAY6H"I];a +rrq\<"D6]oqZ$Ntr;Za!j8],^g].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0Ug].9VrVlu*"D7\n +s8N4Rs+#~> +e,TFNoD\pX"LA(*rr]P0nc/=_rWM]irrhfjrrhfj!eAo&nGiIjg].9Vp&G$pl2U_cpAY5f"Mk'4 +rs.fl_#N!hj8]#VrWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrri<#"+UNis5O(Y +"G6Z(~> +e,TFNoD\pX"LA(*rr]P0nc/=_rWM]irrhfjrrhfj!eAo&nGiIjg].9Vp&G$pl2U_cpAY5f"Mk'4 +rs.fl_#N!hj8]#VrWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrri<#"+UNis5O(Y +"G6Z(~> +e,TFNoD\pX"LA(*rr]P0nc/=_rWM]irrhfjrrhfj!eAo&nGiIjg].9Vp&G$pl2U_cpAY5j"Mk'4 +rs.fl_#N!hj8]#VrWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrri<#"+UNis5O(Y +"G6Z(~> +e,TFNo)AcGB)hf/!bR2ep&G!on,NCjn,NCjnG`Q?fDkdK!Pna/s8E/Us8N5os8N5es8E/prrZj9 +lMpYZ!bR2es8N.nB)hc.rWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrri<#rrh9[ +rrdrRJ:~> +e,TFNo)AcGB)hf/!bR2ep&G!on,NCjn,NCjnG`Q?fDkdK!Pna/s8E/Us8N5os8N5es8E/prrZj9 +lMpYZ!bR2es8N.nB)hc.rWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrri<#rrh9[ +rrdrRJ:~> +e,TFNo)AcGB)hf/!bR2ep&G!on,NCjn,NCjnG`Q?fDkdK!Pna/s8E/Us8N5os8N5es8E/prrZj9 +lMpYZ!bR2es8N.rB)hc.rWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrri<#rrh9[ +rrdrRJ:~> +e,TFNo)AgW"Mk':rr^&2lMpPWrWM]irrhfjrrhll!eAo&rVlu[J=ur9s8E/Us8N5os8N5es8E/d +rr^jU_#OH7"4m\-s8;or"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"TJE'f*%NA +iW&o\K)^B~> +e,TFNo)AgW"Mk':rr^&2lMpPWrWM]irrhfjrrhll!eAo&rVlu[J=ur9s8E/Us8N5os8N5es8E/d +rr^jU_#OH7"4m\-s8;or"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"TJE'f*%NA +iW&o\K)^B~> +e,TFNo)AgW"Mk':rr^&2lMpPWrWM]irrhfjrrhll!eAo&rVlu[J>E5=s8E/Us8N5os8N5es8E/d +rr^jU_#OH7"4m\-s8;or"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"TJE'f*%NA +iW&o\K)^B~> +e,TFNnc&^C9u-c3s1h@\s7H?j"RuElirfDdj8\ZLrrhom!It=K"9IQ_pAb*pp&G&BqZ$SGqZ$SG +qu?[!o`+polMphdlMgsZ"QTO^rr_NhRK*3brWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'U +rrh*Vrri?$"/#e4s7u[*n\COqs4q8iL?efSAd!kgrVlrNJ->iSrVucu!rq9`rWJA`J-~> +e,TFNnc&^C9u-c3s1h@\s7H?j"RuElirfDdj8\ZLrrhom!It=K"9IQ_pAb*pp&G&BqZ$SGqZ$SG +qu?[!o`+polMphdlMgsZ"QTO^rr_NhRK*3brWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'U +rrh*Vrri?$"/#e4s7u[*n\COqs4q8iL?efSAd!kgrVlrNJ->iSrVucu!rq9`rWJA`J-~> +e,TFNnc&^C9u-c3s1h@\s7H?j"RuElirfDdj8\ZLrrhom!It=K"9IQ_pAb*pp&G&BqZ$SGqZ$SG +qu?[!o`+polMphdlMgs^"QTO^rr_NhRK*3brWM!Urrh*VrWM!Urrh*VrWM!Urrh'Urrh*Vrrh'U +rrh*Vrri?$"/H(8s7u[*n\COqs4q8iL?efSAd!kgrVlrNJ->iSrVucu!rq9`rWJA`J-~> +e,TFNnG`^QL'15Dnc/4\rWMckqZQHhrrhrn!It=K"9E-7p&G!op&G&BqZ$SGqZ$SGqu?[!o`+po +lMphdlMgs:"S)NkrrN=8s8;or"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"TJE' +Ad%E!q>UMHAcrPG^uPHf"GX5Bs1ec1s8W*$^]_IQ!WN9("I];hrrgqJ"S)Kps69a&s,m>3~> +e,TFNnG`^QL'15Dnc/4\rWMckqZQHhrrhrn!It=K"9E-7p&G!op&G&BqZ$SGqZ$SGqu?[!o`+po +lMphdlMgs:"S)NkrrN=8s8;or"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"TJE' +Ad%E!q>UMHAcrPG^uPHf"GX5Bs1ec1s8W*$^]_IQ!WN9("I];hrrgqJ"S)Kps69a&s,m>3~> +e,TFNnG`^QL'15Hnc/4\rWMckqZQHhrrhrn!It=K"9E-7p&G!op&G&BqZ$SGqZ$SGqu?[!o`+po +lMphdlMgs:"S)NkrrN=8s8;or"P`tV"P`tU"P`tV"P`tU"P`tV"PWnU"P`tV"PWnU"P`tV"TJE' +Ad%E!q>UMHAcrPG^uPHj"GX5Bs1ec5s8W*$^]_IQ!WN9("I];hrrgqJ"S)Kps69a&s,m>3~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?Wup&G$pl2Ubdg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Uq>^JFqZ$SGqZ$SGp](6rnGiLkrVum#!UB^brrN +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?Wup&G$pl2Ubdg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Uq>^JFqZ$SGqZ$SGp](6rnGiLkrVum#!UB^brrN +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?Wup&G$pl2Ubdg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Uq>^JFqZ$SGqZ$SGp](6rnGiLkrVum#!UB^brrN +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?Wup&G$pl2Ubdg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Uq>^JFqZ$SGqZ$SGp](6rnGiLkrVum#rVum#rr<"Krr;s#qu6i8"GX4t +s,[21~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?Wup&G$pl2Ubdg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Uq>^JFqZ$SGqZ$SGp](6rnGiLkrVum#rVum#rr<"Krr;s#qu6i8"GX4t +s,[21~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?Wup&G$pl2Ubdg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Uq>^JFqZ$SGqZ$SGp](6rnGiLkrVum#rVum#rr<"Krr;s#qu6i8"GX4t +s,[21~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?WuoDedmm/R(gg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#qYpT3"TJW$rr[cSLB!;6JH~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?WuoDedmm/R(gg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#qYpT3"TJW$rr[cSLB!;6JH~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMpker;Zd"qu?WuoDedmm/R(gg].6Ug].9Vg].6U +g].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#qYpT3"TJW$rr[cSLB!;6JH~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMgot"TSH#!X+&Rr;Za!oDedmm/R(gg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#rVm#jTM;'^rri2u!U9dh"R?#Js+%~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMgot"TSH#!X+&Rr;Za!oDedmm/R(gg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#rVm#jTM;'^rri2u!U9dh"R?#Js+%~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+polMphdlMgot"TSH#!X+&Rr;Za!oDedmm/R(gg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#rVm#jUeRWfrri2u!U9dh"R?#Js+%~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qelMgsS"QTO^rr_9aRK*3brWM`jrrhcirrh*VrWM!U +rrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrhikrri<#rri<#rri?$"mSg4nc&al"T&-$L7e["s,[21 +~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qelMgsS"QTO^rr_9aRK*3brWM`jrrhcirrh*VrWM!U +rrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrhikrri<#rri<#rri?$"mSg4nc&al"T&-$L7e["s,[21 +~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qelMgsS"QTO^rr_9aRK*3brWM`jrrhcirrh*VrWM!U +rrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrhikrri<#rri<#rri?$"mSg4nc&al"T&-$L84s&s,[21 +~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qelMgt<"P<\Rrr^jUfDkdKrWM`jrrhcirrh*VrWM!U +rrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrhikrri<#rri<#rri?$"(h]+rrN-&rri6!s1ed;L'4g^ +OT0i~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qelMgt<"P<\Rrr^jUfDkdKrWM`jrrhcirrh*VrWM!U +rrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrhikrri<#rri<#rri?$"(h]+rrN-&rri6!s1ed;L'4g^ +OT0i~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qelMgt<"P<\Rrr^jUfDkdKrWM`jrrhcirrh*VrWM!U +rrh*VrWM!Urrh'Urrh*Vrrh'Urrh*Vrrhikrri<#rri<#rri?$"(h]+rrN-&rri6!s1ed;L'4g^ +OT0i~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qel2LfsLB%;R!h![#qu?WunGiLkmf3:ig].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#rr&l"+UO+s,m>3 +~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qel2LfsLB%;R!h![#qu?WunGiLkmf3:ig].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#rr&l"+UO+s,m>3 +~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qel2LfsLB%;R!h![#qu?WunGiLkmf3:ig].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9VnGiLkrVum#rVum#rr3 +~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qel2M"K"P<[h"QTOZs8E/hs8N5ks8N5Vs8E/Us8N5V +s8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5lrrL^S!X/&n!rqNg!X.fg!rqNg!X.fg#60D\T`=9[rr`E' +ZMt(-TEOfbs8N,b"9J_As-!D4~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qel2M"K"P<[h"QTOZs8E/hs8N5ks8N5Vs8E/Us8N5V +s8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5lrrL^S!X/&n!rqNg!X.fg!rqNg!X.fg#60D\T`=9[rr`E' +ZMt(-TEOfbs8N,b"9J_As-!D4~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qel2M"K"P<[h"QTOZs8E/hs8N5ks8N5Vs8E/Us8N5V +s8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5lrrL^S!X/&n!rqNg!X.fg!rqNg!X.fg#60D\V#T]_rr`E' +ZMt(-U]g5fs8N,b"9J_As-!D4~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qekl1hBAd!kKs8)cp"Rc +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qekl1hBAd!kKs8)cp"Rc +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qekl1hBAd!kKs8)cp"Rc +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6Um/R(go)J^mg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6UlMphdp&G$pg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6UlMphdp&G$pg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnli6qeg].6UlMphdp&G$pg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6UlMphdp&G$pg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6UlMphdp&G$pg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6UlMphdp&G$pg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^mm/R%fg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uj8],^qu?[!g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UiW&o\rVum#g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UiW&o\rVum#g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UiW&o\rVum#g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UiW&o\rVum#g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UiW&o\rVum#g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UiW&o\rVum#g].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UhuEZY!WN9'"TR9WrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UhuEZY!WN9'"TR9WrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UhuEZY!WN9'"TR9WrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UhuEZY!WN9'"TR9WrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UhuEZY!WN9'"TR9WrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6UhuEZY!WN9'"TR9WrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Uh#I?Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Ug].6Uh#I?Vg].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Ug].6Uh#I?Vg].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/UlmJm.gg].6Ug].6Uh#I?Vg].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].6Uh#I?Vg].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].6Uh#I?Vg].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].6Uh#I?Vg].9Vg].6Ug].9VgAh0Ug].9V +gAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9V!WN9'"TRBZrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9V!WN9'"TRBZrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9V!WN9'"TRBZrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9V!WN9'"TRBZrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9V!WN9'"TRBZrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9V!WN9'"TRBZrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJF~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?squ?[!s8W*%o)J[lg].6Ug].9V!WN9'"TRBZrWM!Urrh*V +rWM!Urrh'Urrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?squ?[!s8W*%o)J[lg].6Ug].9V!WN9'"TRBZrWM!Urrh*V +rWM!Urrh'Urrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C?squ?[!s8W*%o)J[lg].6Ug].9V!WN9'"TRBZrWM!Urrh*V +rWM!Urrh'Urrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vq#C +e,TFNg].6Ug].9Vg].6Ug].9Vq#C +e,TFNg].6Ug].9Vg].6Ug].9Vq#C +e,TFNg].6Ug].9Vg].6Ug].9Vp](0prr;iuo)J[lg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](0prr;iuo)J[lg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](0prr;iuo)J[lg].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vp](-o!WN<%"9JN*! +e,TFNg].6Ug].9Vg].6Ug].9Vp](-o!WN<%"9JN*! +e,TFNg].6Ug].9Vg].6Ug].9Vp](-o!WN<%"9JN*! +e,TFNg].6Ug].9Vg].6Ug].9VpAapk!WN9'"TS&mrWM!UrWM!Urrh*VrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9VpAapk!WN9'"TS&mrWM!UrWM!Urrh*VrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9VpAapk!WN9'"TS&mrWM!UrWM!Urrh*VrWM!Urrh*VrWM!Urrh'U +rrh*Vrrh'Urrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb!mrr^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb!mrr^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9VpAb!mrr^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp&G$pqu?[!nc/Rkg].6Ug].9Vq>^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp&G$pqu?[!nc/Rkg].6Ug].9Vq>^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vp&G$pqu?[!nc/Rkg].6Ug].9Vq>^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+por;Zd"nc/Rkg].6Ug].9Vq>^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+por;Zd"nc/Rkg].6Ug].9Vq>^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+por;Zd"nc/Rkg].6Ug].9Vq>^Htjo>;_g].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+porVum#nGiIjg].6Ug].9Vp](6rkPtMag].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+porVum#nGiIjg].6Ug].9Vp](6rkPtMag].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo`+porVum#nGiIjg].6Ug].9Vp](6rkPtMag].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9VoDegnrr +e,TFNg].6Ug].9Vg].6Ug].9VoDegnrr +e,TFNg].6Ug].9Vg].6Ug].9VoDegnrr +e,TFNg].6Ug].9Vg].6Ug].9VoDedms8W*%nGiIjg].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9VoDedms8W*%nGiIjg].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9VoDedms8W*%nGiIjg].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^ms8W*%nGiIjg].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^ms8W*%nGiIjg].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vo)J^ms8W*%nGiIjg].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9V +gAh0Ug].9VgAh0Ug].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/Ojn,N@ig].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/Ojn,N@ig].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/Ojn,N@ig].6Ug].9Vp&G!olMphdg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/Ojn,N@ig].6Ug].9Vo)J^mm/R%fg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/Ojn,N@ig].6Ug].9Vo)J^mm/R%fg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vnc/Ojn,N@ig].6Ug].9Vo)J^mm/R%fg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiIjn,N@ig].6Ug].9Vo)J^mm/R%fg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiIjn,N@ig].6Ug].9Vo)J^mm/R%fg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiIjn,N@ig].6Ug].9Vo)J^mm/R%fg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9VnGiLkmf37hg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9VnGiLkmf37hg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9VnGiLkmf37hg].6Ug].9VnGiLkmf37hg].9Vg].6Ug].9VgAh0U +g].9VgAh0Ug].9VgAh0UK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENq>^Htq>^EsnDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENq>^Htq>^EsnDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENq>^Htq>^EsnDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENq>^Htq>^EsnDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENq>^Htq>^EsnDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENq>^Htq>^EsnDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENo)J^m!WN<&"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj +"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENo)J^m!WN<&"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj +"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENo)J^m!WN<&"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj +"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENo)J^m!WN<&"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj +"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENo)J^m!WN<&"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj +"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENo)J^m!WN<&"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj +"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENnGiFinDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N=hn`0TOn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N=hn`0TOn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N=hn`0TOn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N7foAffQn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@iro="]p#H#Sn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@iro="]p#H#Sn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@iro="]p#H#Sn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@iro="]p#H#Sn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@iro="]p#H#Sn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@iro="]p#H#Sn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ir8[e[pZ)5Un,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@ip#H&Tro +e,TFNp](6rrr3&iR03TpRHjhKs8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/mj8T5_iroAbn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrr3&iR03TpRHjhKs8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/mj8T5_iroAbn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrr3&iR03TpRHjhKs8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/mj8T5_iroAbn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rs8N2d9u-c3s49uss82iq"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"S:[R"9INcrrhfjrrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ=~> +e,TFNp](6rs8N2d9u-c3s49uss82iq"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"S:[R"9INcrrhfjrrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ=~> +e,TFNp](6rs8N2d9u-c3s49uss82iq"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"S:[R"9INcrrhfjrrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ=~> +e,TFNp](6r"TS!d_#OE6"4p94s8;or"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"S(ON"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj +"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6r"TS!d_#OE6"4p94s8;or"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"S(ON"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj +"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6r"TS!d_#OE6"4p94s8;or"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"S(ON"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj +"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6r"94c`s8;luAqp?`s8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/kj8B,Ls8N5jj8T8Ns8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+(~> +e,TFNp](6r"94c`s8;luAqp?`s8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/kj8B,Ls8N5jj8T8Ns8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+(~> +e,TFNp](6r"94c`s8;luAqp?`s8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/kj8B,Ls8N5jj8T8Ns8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+(~> +e,TFNp](6r"7ZMes8;m!^]`s&rVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@in`0QNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r"7ZMes8;m!^]`s&rVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@in`0QNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r"7ZMis8;m!^]`s&rVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@in`0QNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r"2G&ks8;m!irl[frVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjHMnGiLkn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r"2G&ks8;m!irl[frVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjHMnGiLkn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r"2G&ks8;m!irl[frVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjHMnGiLkn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r",6s=s8;m!nH=UHrVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjHMnGiLkn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r",6s=s8;m!nH=UHrVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjHMnGiLkn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r",6s=s8;m!nH=UHrVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjHMnGiLkn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6r"(h]+s82ft"ASpps8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/jj8K/^rr`?*s7?9j"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6r"(h]+s82ft"ASpps8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/jj8K/^rr`?*s7?9j"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6r"(h]+s82ft"ASpps8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/jj8K/^rr`?*s7?9j"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKN!WN9'"TS)nrrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfN +rWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJG~> +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKN!WN9'"TS)nrrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfN +rWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJG~> +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKN!WN9'"TS)nrrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfN +rWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJG~> +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNrr +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNrr +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNrr +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNrr +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNrr +e,TFNp](0pq>^Htr;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNrr +e,TFNp](6r!_igtqYpU"B)hi0rWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`jrWM]Mrrhfj +rWM`NrWM`jrWM]MrrhfjrWM`NrWN6#rrhuorrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ:~> +e,TFNp](6r!_igtqYpU"B)hi0rWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`jrWM]Mrrhfj +rWM`NrWM`jrWM]MrrhfjrWM`NrWN6#rrhuorrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ:~> +e,TFNp](6r!_igtqYpU"B)hi0rWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`jrWM]Mrrhfj +rWM`NrWM`jrWM]MrrhfjrWM`NrWN6#rrhuorrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ:~> +e,TFNp](6r",6sDs8;m!irk,:rVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r",6sDs8;m!irk,:rVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r",6sDs8;m!irk,:rVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r"2G&qs8;m!h#tOnrVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r"2G&qs8;m!h#tOnrVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r"2G&qs8;m!h#tOnrVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r"6p#ps8;m!Z39^trVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r"6p#ps8;m!Z39^trVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r"6p#ps8;m!Z39^trVuj"nDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNnGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6r"94*fs8;luAqp?`s8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5jj8T8Ns8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+#~> +e,TFNp](6r"94*fs8;luAqp?`s8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5jj8T8Ns8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+#~> +e,TFNp](6r"94*fs8;luAqp?`s8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5jj8K2Ns8E/ij8T8N +s8E/jj8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5jj8T8Ns8E/jj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+#~> +e,TFNp](6r"TR`i_#OE6"2IXrs8;or"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj +"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6r"TR`i_#OE6"2IXrs8;or"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj +"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6r"TR`i_#OE6"2IXrs8;or"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"RtIN"RlBj"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj +"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rs8N2Q9u-c3s1h@\s82iq"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"RtIN"S_rr"T/6!"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rs8N2Q9u-c3s1h@\s82iq"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"RtIN"S_rr"T/6!"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rs8N2Q9u-c3s1h@\s82iq"RtIN"RlBj"RkCM"RuHj"RtIN"RlBj"RkCM"RuHj"RkCN +"RlBi"RtIN"RuHj"RkCN"RlBi"RtIN"S_rr"T/6!"RkCN"RlBi"RtIN"RlBj"RkCM"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rrr32_L'15Dnc/IcrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`jrWM]Mrrhfj +rWM`NrWM`jrWM]MrrhfjrWM`NrWMuqrri6!rrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ:~> +e,TFNp](6rrr32_L'15Dnc/IcrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`jrWM]Mrrhfj +rWM`NrWM`jrWM]MrrhfjrWM`NrWMuqrri6!rrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ:~> +e,TFNp](6rrr32_L'15Hnc/IcrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`jrWM]Mrrhfj +rWM`NrWM`jrWM]MrrhfjrWM`NrWMuqrri6!rrhfNrrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ:~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNp&G$prVum#n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNoDegns8W*%n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNoDegns8W*%n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNoDegns8W*%n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNoDegns8W*%n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNoDegns8W*%n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNoDegns8W*%n)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNnc/Ojn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNnc/Ojn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNnc/Ojn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNnc/Ojn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNnc/Ojn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNnc/Ojn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,N@inDjNOn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCj!TO:`"QT+6rrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`j +rWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCj!TO:`"QT+6rrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`j +rWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCj!TO:`"QT+6rrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`j +rWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCj!TO:`"QT+6rrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`j +rWM]MrrhfjrWM`NrWM]irri2urrhQcq#mJmJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCj!TO:`"QT+6rrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`j +rWM]MrrhfjrWM`NrWM]irri2urrhQcq#mJmJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCj!TO:`"QT+6rrhfjrWM`NrWM]irrhfNrWM`jrWM`NrWM]irrhfNrWM`j +rWM]MrrhfjrWM`NrWM]irri2urrhQcq#mJmJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2Le?"T&<&T`:hfJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2Le?"T&<&T`:hfJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2Le?"T&<&V#R7jJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2LjYJFW[>rrVJks.fUE~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2LjYJFW[>rrVJks.fUE~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2Lj]JFW[>rrVJks.fUE~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2Lfsj8]/Z!pZ3RUAoa~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2Lfsj8]/Z!pZ3RUAoa~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qul2Lfsj8]/Z!pZ3RUAoa~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjq;_GWqW%SYqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjp>c/Ur8[e[qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjp>c/Ur8[e[qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjp>c/Ur8[e[qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjp>c/Ur8[e[qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjp>c/Ur8[e[qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjp>c/Ur8[e[qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#Ca5LJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#Ca5LJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#Ca5LJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo],rSro="]qu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo&K`Q!TO:`"TSE"rWN#rrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo&K`Q!TO:`"TSE"rWN#rrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo&K`Q!TO:`"TSE"rWN#rrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo&K`Q!TO:`"TSE"rWN#rrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo&K`Q!TO:`"TSE"rWN#rrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjo&K`Q!TO:`"TSE"rWN#rrWM`NrWM]irrhfNrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjnDjKNqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjnDjKNqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjnDjKNqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjnDjKNqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjnDjKNqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjnDjKNqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qul2U_cSc=6~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qul2U_cSc=6~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qul2U_cSc=6~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qul2UYaTDsH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qul2UYaTDsH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qul2UYaTDsH~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qukl:M_U&TZ~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qukl:M_U&TZ~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qukl:M_U&TZ~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qukl:G]U]5l~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qukl:G]U]5l~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qukl:G]U]5l~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QukPt;[V>l)~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QukPt;[V>l)~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QukPt;[V>l)~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +nGe%BJHUN,JHUN,Z370,JE~> +nGe%BJHUN,JHUN,Z370,JE~> +nGe%BJHUN,JHUN,Z370,JE~> +nc+.CJHUN,JHUN,Ylq'+JE~> +nc+.CJHUN,JHUN,Ylq'+JE~> +nc+.CJHUN,JHUN,Ylq'+JE~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C#WWW.M~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C#WWW.M~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C#WWW.M~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENq#C?sqZ$NtnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QukPt;[V>l)~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENq#C?sqZ$NtnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QukPt;[V>l)~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENq#C?sqZ$NtnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QukPt;[V>l)~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENq#C?sqZ$NtnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QukPt>\V#Pu~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENq#C?sqZ$NtnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QukPt>\V#Pu~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENq#C?sqZ$NtnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QukPt>\V#Pu~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qukl:J^UAo`~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qukl:J^UAo`~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qukl:J^UAo`~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qukl:P`T`9N~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qukl:P`T`9N~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qukl:P`T`9N~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qul2U\bT)X<~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qul2U\bT)X<~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wus8W*%r;Za!nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qul2U\bT)X<~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?WurVum#rr;s#nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qul2U_cSc=3~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?WurVum#rr;s#nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qul2U_cSc=3~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?WurVum#rr;s#nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Qul2U_cSc=3~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?WurVum#rr;s#nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?WurVum#rr;s#nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?WurVum#rr;s#nDjKNn,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuqu?NrnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CdEQ!nVr*!sE5fs8W*% +n\COqrs&MTAcu_]s8N$$n\COqrs&MTAcu_]s82ft^jlOi"G#,(s8NDq^mP?*^h*_Ts6fo;~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CdEQ!nVr*!sE5fs8W*% +n\COqrs&MTAcu_]s8N$$n\COqrs&MTAcu_]s82ft^jlOi"G#,(s8NDq^mP?*^h*_Ts6fo;~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CdEQ!nVr*!sE5fs8W*% +n\COqrs&MTAcu_]s8N$$n\COqrs&MTAcu_]s82ft^jlOi"G#,(s8NDq^mP?*^h*_Ts6fo;~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iroc,Tn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/I-!"TSK$!jVt/rr3%MLB%8Q"/#cks8N$"9a(Lrrr_9a +JH,ZL!V$9n"J>ghlMh"eTEKfFrr3#h"9AXu!heiY"TP+tJH,WK!eA)drr3#T"9J_ArrW5j"9SdW +j8\HFJ:~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iroc,Tn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/I-!"TSK$!jVt/rr3%MLB%8Q"/#cks8N$"9a(Lrrr_9a +JH,ZL!V$9n"J>ghlMh"eTEKfFrr3#h"9AXu!heiY"TP+tJH,WK!eA)drr3#T"9J_ArrW5j"9SdW +j8\HFJ:~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iroc,Tn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/I-!"TSK$!jVt/rr3%MLB%8Q"/H&os8N$"9a(Lrrr_9a +JH,ZL!V$9n"Jc*plMh"eU]c5Jrr3#h"9AY$!i5,]"TP8#JH,WK!eA)drr3#T"9J_ArrW5j"9SdW +j8\HFJ:~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iroc,Tn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/R(g!TX4[rrV]ns8W*$f*'q0rr3)j9n<9Cs8RWJs8N6# +s8N3&fDkjM!V$9n"TSH#rr`ASs8N$!nH8jqs8W*#^]a]8s8N3&JH,ZLrrhQcJ-~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iroc,Tn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/R(g!TX4[rrV]ns8W*$f*'q0rr3)j9n<9Cs8RWJs8N6# +s8N3&fDkjM!V$9n"TSH#rr`ASs8N$!nH8jqs8W*#^]a]8s8N3&JH,ZLrrhQcJ-~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iroc,Tn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/R(g!TX4[rrV]ns8W*$f*'q0rr3)j9n<9Cs8RWJs8N6# +s8N3&fDkjM!V$9n"TSH#rr`ASs8N$!nH8jqs8W*#^]a]8s8N3&JH,ZLrrhQcJ-~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/I3C"ARMJqu6_P"TRukrri<#rri6!rri9"rri6!rri?$ +!JUaP"TJH$"R,l9~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/I3C"ARMJqu6_P"TRukrri<#rri6!rri9"rri6!rri?$ +!JUaP"TJH$"R,l9~> +e,TFNp](6rrVum#pAb*pnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKN +nGiIjn)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$Qum/I3C"ARMJqu6_P"TRukrri<#rri6!rri9"rri6!rri?$ +!JUaP"TJH$"R,l9~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.!?"9Sd=_#OB5rrhom"5TV^"9AZ*rr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.!?"9Sd=_#OB5rrhom"5TV^"9AZ*rr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.!?"9Sd=_#OB5rrhom"5Tbb"9AZ*rr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QulMgqAL'.S]:"TFFs8N5orro&iB#*p>! +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QulMgqAL'.S]:"TFFs8N5orro&iB#*p>! +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iqr@\ZpuD>Vn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QulMgqAL'.S]:"TFFs8N5orro2mB#*p>! +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CdKSrri<#rri6! +rri9"rri6!rri?$"+UN/s82fsB)ho2rrhQcJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CdKSrri<#rri6! +rri9"rri6!rri?$"+UN/s82fsB)ho2rrhQcJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CdKSrri<#rri6! +rri9"rri6!rri?$"+UN/s82fsB)ho2rrhQcJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)8Vr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I+inc/RfrriB%"Mb.7nc/Ug!j\6os8W*%r;Zd"rVum#qu?[! +r;Zd"qu?[!rr3#7"9J_Xs8Ds!f9u[=s8N5cs+(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)8Vr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I+inc/RfrriB%"Mb.7nc/Ug!j\6os8W*%r;Zd"rVum#qu?[! +r;Zd"qu?[!rr3#7"9J_Xs8Ds!f9u[=s8N5cs+(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)8Vr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I+inc/RfrriB%"Mb.7nc/Ug!j\6os8W*%r;Zd"rVum#qu?[! +r;Zd"qu?[!rr3#7"9J_Xs8Ds!f9u[=s8N5cs+(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)8Vr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I+iRK*6c!X+&Rs8N3r"G#P4"TR9\j8]/Z",6s7s8N&u"9S+d +rrN-&! +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)8Vr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I+iRK*6c!X+&Rs8N3r"G#P4"TR9\j8]/Z",6s7s8N&u"9S+d +rrN-&! +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)8Vr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I+iRK*6c!X+&Rs8N3r"G#P4"TR9\j8]/Z",6s7s8N&u"9S+h +rrN-&! +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)2Tro +^]X]A_#OE6!Peg>"Mk';rrKn +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)2Tro +^]X]A_#OE6!Peg>"Mk';rrKn +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ipZ)2Tro +^]X]A_#OE6!Peg>"Mk';rrKn +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ip#H#Ss5X(]n,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I1kn^i9o!sG%Ws8Ds!lBqbW"G#,(r;R,hAd!kKs-X"qrri6& +s8Vs!!WN<#"TSN!"TA?%Z=X4A"I\*Gs8Vs!lMlC~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ip#H#Ss5X(]n,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I1kn^i9o!sG%Ws8Ds!lBqbW"G#,(r;R,hAd!kKs-X"qrri6& +s8Vs!!WN<#"TSN!"TA?%Z=X4A"I\*Gs8Vs!lMlC~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ip#H#Ss5X(]n,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Qum/I1kn^i9o!sG%Ws8Ds!lBqbW"G#,(r;R,hAd!kKs-X"qrri6& +s8Vs!!WN<#"TSN!"TA?%Z=X4A"I\*Gs8Vs!lMlC~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#Cc)Ss5X(]n,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#Cc)Ss5X(]n,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#Cc)Ss5X(]n,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CVr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CVr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CVr8[bZn,NCjn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CVrr;s#p&G$pn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Quci=#q[f:j~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CVrr;s#p&G$pn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Quci=#q[f:j~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CVrr;s#p&G$pn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$Quci=#q[f:j~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CK.~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CK.~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#CK.~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C-mp#H#Squ?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C-mp#H#Squ?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C-mp#H#Squ?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?WuqZ$Bpo&K]Pqu?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?WuqZ$Bpo&K]Pqu?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?WuqZ$Bpo&K]Pqu?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?3inDjKNqu?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?3inDjKNqu?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?3inDjKNqu?[!p](6rn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqZ$^Htq>^Htn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqZ$^Htq>^Htn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqZ$^Htq>^Htn)OBMnGiIjnDjKNn,NCjn)OBM +nGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNq>^Htq>^Htn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNq>^Htq>^Htn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNq>^Htq>^Htn)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QulMgq;J-5rWB%R(^s83$!rrIiWrWN9$"S'9q"TSE"#MitpB%QPU +s2=qf~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QulMgq;J-5rWB%R(^s83$!rrIiWrWN9$"S'9q"TSE"#MitpB%QPU +s2=qf~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QulMgq;J-5rWB%R(^s83$!rrIiWrWN9$"S'9q"TSE"#MitpB%QPU +s2=qf~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.7+"Mk'-J-=L(rr3#7"9AZ*rVum#!Pna8rrR^_"9AZ*rVlu8 +"JGbrs1ea<"TQF?JG~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.7+"Mk'-J-=L(rr3#7"9AZ*rVum#!Pna8rrR^_"9AZ*rVlu8 +"JGbrs1ea<"TQF?JG~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.7+"Mk'-J-=L(rr3#7"9AZ*rVum#!Pna8rrR^_"9AZ*rVlu8 +"Jl&!s1ea<"TQF?JG~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.#\"TSN%"60N7s8Ds"^]]Dlrr3$oh>dHR!V$9n"TSH#!bMT8 +rr3&*"TQF?JH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.#\"TSN%"60N7s8Ds"^]]Dlrr3$oh>dHR!V$9n"TSH#!bMT8 +rr3&*"TQF?JH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNp](6rqu?[!n)OBMnGiIjnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$Quli.#\"TSN%"60N7s8Ds"^]]Dlrr3$oh>dHR!V$9n"TSH#!bMT8 +rr3&*"TQF?JH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C>`qYpYJ"MiUifDk^Irri9""GR%RfDiYdJE~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C>`qYpYJ"MiUifDk^Irri9""GR%RfDiYdJE~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C>`qYpYJ"MiUifDk^Irri9""GR%RfDiYdJE~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qukl1b@TOn<-"TS>u"(h\(s7u]p"T/3"L'.S]B#+G`s+%~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qukl1b@TOn<-"TS>u"(h\(s7u]p"T/3"L'.S]B#+G`s+%~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qukl1b@Uh0`1"TS>u"(h\(s7u]p"T/3"L'.S]B#+G`s+%~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QulMh$\9kM32"9AZ*qYpTJ"9J_ks8)cq"T&-"h1c%7"ARMJ`;bA~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QulMh$\9kM32"9AZ*qYpTJ"9J_ks8)cq"T&-"h1c%7"ARMJ`;bA~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QulMh$`9kM32"9AZ*qYpTJ"9J_ks8)cq"T&-"h1c%7"ARMJ`;bA~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Quli6uZ!T!eUs8N5urs%bCiri*As82ir"Shuuj+[[<"P<[ms+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Quli6uZ!T!eUs8N5urs%bCiri*As82ir"Shuuj+[[<"P<[ms+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Quli6uZ!T!eUs8N5urs%bCiri*As82ir"Shuuj+[[<"P<[ms+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qum/I0\"Ps+Ws8N5urs"#Ds47C(s82ir"SVitTEJm,`W(J~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qum/I0\"Ps+Ws8N5urs"#Ds47C(s82ir"SVitTEJm,`W(J~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qum/I0`"Ps+Ws8N5urs"#Ds47C(s82ir"SVitU]b<0`W(J~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qum/R(gr;Zd"qu6_PlMpna"0r&[s8;os"T89$"S)Njs8N5?s+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qum/R(gr;Zd"qu6_PlMpna"0r&[s8;os"T89$"S)Njs8N5?s+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$Qum/R(gr;Zd"qu6_PlMpna"0r&[s8;os"T89$"S)Njs8N5?s+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C"Mk': +s8N3'L?edAs.E*Os2G"g~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C"Mk': +s8N3'L?edAs.E*Os2G"g~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C"Mk': +s8N3'L?edAs.iBSs2G"g~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENqu?Wuq#C +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ir8Rj&ZK(lC"Mb/liroAbn,NCjrT!n\p#H#SnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ir8Rj&ZK(lC"Mb/liroAbn,NCjrT!n\p#H#SnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@ir8Rj&ZK(lC"Mb/liroAbn,NCjrT!n\p#H#SnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@irT!p.qVq_&"O,m/rrhfjrri;\rri#TrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@irT!p.qVq_&"O,m/rrhfjrri;\rri#TrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@irT!p.qVq_&"O,m/rrhfjrri;\rri#TrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iro4*d"O,p'irlXjbi8j+"RlBj"T.6Z"S^sU"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iro4*d"O,p'irlXjbi8j+"RlBj"T.6Z"S^sU"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iro4*d"O,p'irlXjbi8j+"RlBj"T.6Z"S^sU"RuHj"RtIN +"RlBj"RkCM"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iro4&HJE-Ld"J>nAiroAbn,NCjqr@\ZpZ)5UnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iro4&HJE-Ld"J>nAiroAbn,NCjqr@\ZpZ)5UnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@iro4&HJE-Ld"Jc1EiroAbn,NCjqr@\ZpZ)5UnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^@~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5O3e"Mj'oirXE-irS0Crrhfjrri5Zrri)VrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5O3e"Mj'oirXE-irS0Crrhfjrri5Zrri)VrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5O3e"Mj'oirXE-irS0Crrhfjrri5Zrri)VrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5X,Gq;VS5"CL0iiroAbn,NCjq;_JXq;_GWnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5X,Gq;VS5"CL0iiroAbn,NCjq;_JXq;_GWnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5X,Gq;VS5"CL0iiroAbn,NCjq;_JXq;_GWnGiIjnDjKN +n,NCjn)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i!oq'!p&kDhirS0Crrhfjrri/Xrri/XrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i!oq'!p&kDhirS0Crrhfjrri/Xrri/XrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i!oq'!p&kDlirS0Crrhfjrri/Xrri/XrWM`jrWM`NrWM]i +rrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJH~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"QO\/biAQ["*Xn"irS0Crrhfjrri)VrWN/ZrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"QO\/biAQ["*Xn"irS0Crrhfjrri)VrWN/ZrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"QO\/biAQ["*Xn"irS0Crrhfjrri)VrWN/ZrWM`jrWM`N +rWM]irrhfNrWM`jrWM]MrrhfjrWM`NrWM]irri2urrdrRJ-~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"60MNj8.d +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"60MNj8.d +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"60MNj8.d +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"2G%ij8.d"`s5X(]n,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"2G%ij8.d"`s5X(]n,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"2G%ij8.d"`s5X(]n,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'8j8.d;"CL3gj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'8j8.d;"CL3gj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'8j8.d;"CL3gj8K2Ms8N5jj8K2Ns8E/jj8K2Ms8N5j +j8K2Ns8E/ij8T8Ns8E/jj8K2Ms8N5us8N4Rs+#~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Fj87j=TENL!ro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Fj87j=TENL!ro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Fj87j=U]ep%ro +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Rj8@p>f*%c,rT!k[n,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Rj8@p>f*%c,rT!k[n,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Rj8@p>f*%o0rT!k[n,NCjn)OBMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Rj8@s;GPgG""RlBj"RkCM"RuHj"RtIN"RlBj"RkCM +"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Rj8@s;GPgG""RlBj"RkCM"RuHj"RtIN"RlBj"RkCM +"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"0r'Rj8@s;GPgG""RlBj"RkCM"RuHj"RtIN"RlBj"RkCM +"RuHj"RkCN"RlBi"RtIN"RlBj"T&/u"G6Z(~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"4m[Kj8J$ +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"4m[Kj8J$ +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"4m[Oj8J$ +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"QPdNZJu)J^gEbpqW%PXn,NCjnDjHMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"QPdNZJu)J^gEbpqW%PXn,NCjnDjHMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@i"QPdNZJu)J^gEntqW%PXn,NCjnDjHMnGiIjnDjKNn,NCj +n)OBMnGiIjn)OENn,N@inDjKNn,NCjqZ$QuK)^?~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5O +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5O +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@is5O +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O?Lnc/RknDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)O9JoDedmnDjKNn,NCjn)OBMnGiIjn)OEN +n,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMrr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMrr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMrr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMrr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMrr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMrr +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMr;Zd"p](3qnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMr;Zd"p](3qnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp](6rnGiIjnDjKNn,NCjn)OBMnGiIjnDjKNn,NCjn)OBMnGiIjn)OENn,N@inDjKNnGiIj +n)OENn,N@inDjKNn,NCjn)OENn,N@inDjKNn,NCjn)OBMr;Zd"p](3qnDjKNn,NCjn)OBMnGiIj +n)OENn,N@inDjKNn,NCjqZ$QuK)^B~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNp]#dIJHUN,JHUl6qZ$QuK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9Vmf3:in,NCjg].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9Vmf3:in,NCjg].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9Vmf3:in,NCjg].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9Vmf3:in,NCjg].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9Vmf3:in,NCjg].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9Vmf3:in,NCjg].9V +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vqu6\/"SW$":&jY]rrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vqu6\/"SW$":&jY]rrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vqu6\/"SW$":&jY]rrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;Qoi"GYt:r;Qob9a'b]mf3:iK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;Qoi"GYt:r;Qob9a'b]mf3:iK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;Qoi"GYt:r;Qob9a'b]mf3:iK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;QiSB)h`-"+UO+s6]jd"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;QiSB)h`-"+UO+s6]jd"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;QiSB)h`-"+UO+s6]jd"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;Qi(_#O<3".9:bs6Tdc"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;Qi(_#O<3".9:bs6Tdc"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;Qi(_#O<3".9:fs6Tdc"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;QhQj8]&W"0r&as6K^b"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;QhQj8]&W"0r&as6K^b"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9Vr;QhQj8]&W"0r&as6K^b"G6Z(~> +e,TFNo)Ad]R03TpRHjhDrrV`H"TJVqrs.SP9a"1Yj8\]Mrrh*VrWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!UrrhNbrri&qrrh*Vrrh'Urrh*Vrri#p"4mZfs6BXa"G6Z(~> +e,TFNo)Ad]R03TpRHjhDrrV`H"TJVqrs.SP9a"1Yj8\]Mrrh*VrWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!UrrhNbrri&qrrh*Vrrh'Urrh*Vrri#p"4mZfs6BXa"G6Z(~> +e,TFNo)Ad]R03TpRHjhDrrV`H"TJVqrs.SP9a"1Yj8\]Mrrh*VrWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!UrrhNbrri&qrrh*Vrrh'Urrh*Vrri#p"4mZfs6BXa"G6Z(~> +e,TFNoD\pX9u-c3s49uss7H +e,TFNoD\pX9u-c3s49uss7H +e,TFNoD\pX9u-c3s49uss7H +e,TFNo`#$`9u-f.rr^kIlMpJUrWMln"RuV_lMgtdh1,V0"P<\Gs8N5Vs8E/Us8N5Vs8E/Us8E/U +s8N5Vs8E/Us8N5Vs8E/Us8N5`s8N5ss8N5Vs8N5Us8N5Vs8N5qrrZj9fDk+8rrdrRJE~> +e,TFNo`#$`9u-f.rr^kIlMpJUrWMln"RuV_lMgtdh1,V0"P<\Gs8N5Vs8E/Us8N5Vs8E/Us8E/U +s8N5Vs8E/Us8N5Vs8E/Us8N5`s8N5ss8N5Vs8N5Us8N5Vs8N5qrrZj9fDk+8rrdrRJE~> +e,TFNo`#$`9u-f.rr^kIlMpJUrWMln"RuV_lMgtdh1,V0"P<\Gs8N5Vs8E/Us8N5Vs8E/Us8E/U +s8N5Vs8E/Us8N5Vs8E/Us8N5`s8N5ss8N5Vs8N5Us8N5Vs8N5qrrZj9fDk+8rrdrRJE~> +e,TFNo`"u\:&k.k!bR2eoDedmo`"uc_#O?4",6qjs7H?k"P`tU"P`tV"P`tU"P`tU"P`tV"P`tU +"P`tV"P`tU"P`tV"Qf[`"Si#s"P`tV"PWnU"P`tV"S_ouL'4g^kl:YcK)^B~> +e,TFNo`"u\:&k.k!bR2eoDedmo`"uc_#O?4",6qjs7H?k"P`tU"P`tV"P`tU"P`tU"P`tV"P`tU +"P`tV"P`tU"P`tV"Qf[`"Si#s"P`tV"PWnU"P`tV"S_ouL'4g^kl:YcK)^B~> +e,TFNo`"u\:&k.k!bR2eoDedmo`"ug_#O?4",6qjs7H?k"P`tU"P`tV"P`tU"P`tU"P`tV"P`tU +"P`tV"P`tU"P`tV"Qf[`"Si#s"P`tV"PWnU"P`tV"S_ouL'4g^kl:YcK)^B~> +e,TFNp&>-a"JGemrr^%>lMpMVrWMln!L`ubrrMBf! +e,TFNp&>-a"JGemrr^%>lMpMVrWMln!L`ubrrMBf! +e,TFNp&>-a"Jl(qrr^%>lMpMVrWMln!L`ubrrMBf! +e,TFNp&>-0"P<\Orr_9aZN'RsrWMQe!X)6to`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vj8])]qu?[!g].9VgAh0Ug].9Vq>UQK"G$O7s8N4Rs+'~> +e,TFNp&>-0"P<\Orr_9aZN'RsrWMQe!X)6to`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vj8])]qu?[!g].9VgAh0Ug].9Vq>UQK"G$O7s8N4Rs+'~> +e,TFNp&>-0"P<\Orr_9aZN'RsrWMQe!X)6to`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vj8])]qu?[!g].9VgAh0Ug].9Vq>UQK"G$O7s8N4Rs+'~> +e,TFNp&>,K"QTO[rr_coLB$oGrWMQe!X,1ro`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vj8])]qu?[!g].9VgAh0Ug].9VqYp]`"AS1]k5YGaK)^B~> +e,TFNp&>,K"QTO[rr_coLB$oGrWMQe!X,1ro`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vj8])]qu?[!g].9VgAh0Ug].9VqYp]`"AS1]k5YGaK)^B~> +e,TFNp&>,K"QTO[rr_coLB$oGrWMQe!X,>!o`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vj8])]qu?[!g].9VgAh0Ug].9VqYp]`"AS1]k5YGaK)^B~> +e,TFNp&>,+"S)NhrrN +e,TFNp&>,+"S)NhrrN +e,TFNp&>,+"S)NhrrN +e,TFNp&G$pq>^HtoDedmm/I-[LB$lFrrh*VrWM!Urrh*VrWM!UrWM!Urrh*VrWM!Urrh*VrWM!U +rrh9[rri<#rrh*Vrrh'Urrhiks+'tGs+'tGs*t.M"9AZ*r;QkL"Mk&us8N4Rs+(~> +e,TFNp&G$pq>^HtoDedmm/I-[LB$lFrrh*VrWM!Urrh*VrWM!UrWM!Urrh*VrWM!Urrh*VrWM!U +rrh9[rri<#rrh*Vrrh'Urrhiks+'tGs+'tGs*t.M"9AZ*r;QkL"Mk&us8N4Rs+(~> +e,TFNp&G$pq>^HtoDedmm/I-_LB$lFrrh*VrWM!Urrh*VrWM!UrWM!Urrh*VrWM!Urrh*VrWM!U +rrh9[rri<#rrh*Vrrh'Urrhiks+'tGs+'tGs*t.M"9AZ*r;QkL"Mk&us8N4Rs+(~> +e,TFNp&G$pq>^HtoDedmmJd:Y"R?$Ys8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5Vs8E/Us8N5Vs8E/U +s8N5Ys8N6%s8N5Vs8N5Us8N5Vs8N6"rr\nsRK*0a!onh2m/R(gK)^A~> +e,TFNp&G$pq>^HtoDedmmJd:Y"R?$Ys8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5Vs8E/Us8N5Vs8E/U +s8N5Ys8N6%s8N5Vs8N5Us8N5Vs8N6"rr\nsRK*0a!onh2m/R(gK)^A~> +e,TFNp&G$pq>^HtoDedmmJd:Y"R?$Ys8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5Vs8E/Us8N5Vs8E/U +s8N5Ys8N6%s8N5Vs8N5Us8N5Vs8N6"rr]&"RK*0a!onh2m/R(gK)^A~> +e,TFNp&G$pq>^HtoDedmmJd6U_#O-.s+(.Lrri?$s+'tGs+'A6rWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!Urrh3YrriB%rrh*Vrrh'Urrh*Vrri<#"4m[+s8)`sL; +e,TFNp&G$pq>^HtoDedmmJd6U_#O-.s+(.Lrri?$s+'tGs+'A6rWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!Urrh3YrriB%rrh*Vrrh'Urrh*Vrri<#"4m[+s8)`sL; +e,TFNp&G$pq>^HtoDedmmJd6U_#O-.s+(.Lrri?$s+'tGs+'A6rWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!Urrh3YrriB%rrh*Vrrh'Urrh*Vrri<#"4m[+s8)`sL; +e,TFNp&>(f"TS>u!X*-8o`+mnmf*@?JH, +e,TFNp&>(f"TS>u!X*-8o`+mnmf*@?JH, +e,TFNp&>(f"TS>u!X*-8o`+mnmf*@?JH, +e,TFNp&>,K"R?$brr_9aLB$oGrWM]i!pXCtnGiLkg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vh#I +e,TFNp&>,K"R?$brr_9aLB$oGrWM]i!pXCtnGiLkg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vh#I +e,TFNp&>,K"R?$brr_9aLB$oGrWM]i!pXCtnGiLkg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vh#I +e,TFNp&>-0"Ps+Urr_'[_#O',rWM]i!bU`tnGiLkg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vh#I~> +e,TFNp&>-0"Ps+Urr_'[_#O',rWM]i!bU`tnGiLkg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vh#I~> +e,TFNp&>-0"Ps+Urr_'[_#O',rWM]i!bU`tnGiLkg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9Vh#I~> +e,TFNp&>-Z"LA(*rr]P0nc/7]rWM`j!eAo&n,NCjg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9Vli.$:AcrSH^uPHf"GX5Bs1ec1rr`H-^]_IQ"TP+tRK*9d +"P6?Nnc&all3+p&R/_^~> +e,TFNp&>-Z"LA(*rr]P0nc/7]rWM`j!eAo&n,NCjg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9Vli.$:AcrSH^uPHf"GX5Bs1ec1rr`H-^]_IQ"TP+tRK*9d +"P6?Nnc&all3+p&R/_^~> +e,TFNp&>-Z"LA(*rr]P0nc/7]rWM`j!eAo&n,NCjg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9Vli.$:AcrSH^uPHj"GX5Bs1ec5rr`H-^]_IQ"TP8#RK*9d +"P6?Nnc&all3+p&R/_^~> +e,TFNo`"uIB)hf/!bR2eoDedmnc&Z@fDkdK!Pna.s8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5Vs8E/U +s8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5ds8N6#s8N3&lMpna!sD?u"9Sd$"TSN%!V$9n"TSH# +#O2Fdnc+.)s-Nb9~> +e,TFNo`"uIB)hf/!bR2eoDedmnc&Z@fDkdK!Pna.s8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5Vs8E/U +s8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5ds8N6#s8N3&lMpna!sD?u"9Sd$"TSN%!V$9n"TSH# +#O2Fdnc+.)s-Nb9~> +e,TFNo`"uIB)hf/!bR2eoDedmnc&Z@fDkdK!Pna.s8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5Vs8E/U +s8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5ds8N6#s8N3&lMpna!sD?u"9Sd$"TSN%!V$9n"TSH# +#O2Fdnc+.)s-Nb9~> +e,TFNo`#$Y"Mk':rr^&2lMpJUrWMfl!eAo&rVlu[J=ur8s8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5V +s8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5ds8N6#s8N6#s8N3&rr`?*J,t3#rr +e,TFNo`#$Y"Mk':rr^&2lMpJUrWMfl!eAo&rVlu[J=ur8s8N5Vs8E/Us8N5Vs8E/Us8E/Us8N5V +s8E/Us8N5Vs8E/Us8N5Us8N5Vs8N5Us8N5Vs8N5ds8N6#s8N6#s8N3&rr`?*J,t3#rr +e,TFNo`#$Y"Mk':rr^&2lMpJUrWMfl!eAo&rVlu[J>E5 +e,TFNoD\pE9u-c3s1h@\s763h"9IQ_p&>&C"Si0$j8\fPrrh*VrWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*VrrhTdrri<#rri<#rr`B&"9AZ*rr3&8J-5lUs82fu +J-:W,Q2cA~> +e,TFNoD\pE9u-c3s1h@\s763h"9IQ_p&>&C"Si0$j8\fPrrh*VrWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*VrrhTdrri<#rri<#rr`B&"9AZ*rr3&8J-5lUs82fu +J-:W,Q2cA~> +e,TFNoD\pE9u-c3s1h@\s763h"9IQ_p&>&C"Si0$j8\fPrrh*VrWM!Urrh*VrWM!UrWM!Urrh*V +rWM!Urrh*VrWM!Urrh'Urrh*Vrrh'Urrh*VrrhTdrri<#rri<#rr`B&"9AZ*rr3&8J-5lUs82fu +J-:W,Q2cA~> +e,TFNo)ApSL'15Dnc/1[qZQWm!It=K"9E-7o`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9Vl2UbdrVum#rVum#!WN9-"TS"b9q^bS! +e,TFNo)ApSL'15Dnc/1[qZQWm!It=K"9E-7o`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9Vl2UbdrVum#rVum#!WN9-"TS"b9q^bS! +e,TFNo)ApSL'15Hnc/1[qZQWm!It=K"9E-7o`+pog].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9V +g].6Ug].9VgAh0Ug].9VgAh0Ug].9Vl2UbdrVum#rVum#!WN9-"TS"f9r.%W! +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Urr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ur;Zd"irB#] +gAh0Ug].9VlMgn:"9J_rrrW5c"9J_krrW5c"9J_k":#'a"JGe[TEG?"s0DY-s.BMbs8W*"l3%.k +_#Ki&JH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ur;Zd"irB#] +gAh0Ug].9VlMgn:"9J_rrrW5c"9J_krrW5c"9J_k":#'a"JGe[TEG?"s0DY-s.BMbs8W*"l3%.k +_#Ki&JH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ur;Zd"irB#] +gAh0Ug].9VlMgn:"9J_rrrW5c"9J_krrW5c"9J_k":#'a"Jl(_U]^c&s0DY-s.fefs8W*"l3%.k +_#Ki&JH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ur;Zd"irB#] +gAh0Ug].9Vli6kcs8W$#s8Vs!$gNHLB#+G7"GZ4A"TAQ(rrM-_r +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ur;Zd"irB#] +gAh0Ug].9Vli6kcs8W$#s8Vs!$gNHLB#+G7"GZ4A"TAQ(rrM-_r +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ur;Zd"irB#] +gAh0Ug].9Vli6kcs8W$#s8Vs!$gNHLB#+G7"GZ4A"TAQ(rrM-_r +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UqZ$Ntjo>>` +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UqZ$Ntjo>>` +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UqZ$Ntjo>>` +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UqZ$Ntjo>>` +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UqZ$Ntjo>>` +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UqZ$Ntjo>>` +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up](6rkPtPb +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up&G$pl2Ubd +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up&G$pl2Ubd +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up&G$pl2Ubd +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up&G$pl2Ubd +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up&G$pl2Ubd +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Up&G$pl2Ubd +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UoDegnli6tf +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Uli6tfoDegn +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Uli6tfoDegn +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Uli6tfoDegn +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Uli6tfoDegn +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Uli6tfoDegn +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Uli6tfoDegn +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +gAh0Ug].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +pAY +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +pAY +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ul2Ubdp&G$p +pAY +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UkPtPbp](6r +p\t9M"TAQ(rrKn +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UkPtPbp](6r +p\t9M"TAQ(rrKn +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UkPtPbp](6r +p\t9M"TAQ(rrKn +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UkPtPbp](6r +p&>0T"GZs."P;Z:_#Np(rrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UkPtPbp](6r +p&>0T"GZs."P;Z:_#Np(rrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UkPtPbp](6r +p&>0T"GZs."P;Z:_#Np(rrh*Vrrh'UrrdrRJH~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>32"Mj''s6Tdc"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>32"Mj''s6Tdc"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>32"Mj''s6Tdc"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>/L"QPpMli6tfg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>/L"QPpMli6tfg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>/L"QPpMli6tfg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>-t9sX'ali6tfg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>-t9sX'ali6tfg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ujo>;_qZ$Qu +p&>-t9sX'ali6tfg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UirB#]r;Zd" +pAY9O"D5ILlMpkeg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UirB#]r;Zd" +pAY9O"D5ILlMpkeg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UirB#]r;Zd" +pAY9O"D5ILlMpkeg].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UirB#]r;Zd" +pAY6#"D7\us8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UirB#]r;Zd" +pAY6#"D7\us8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0UirB#]r;Zd" +pAY6#"D7\us8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ui;`f[rr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ui;`f[rr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ui;`f[rr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ui;`f[rr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ui;`f[rr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ui;`f[rr +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t?I +"I];as8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t?I +"I];as8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t?I +"I];as8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t>g +"Mk'3s8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t>g +"Mk'3s8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t>k +"Mk'3s8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t>- +"R?$]s8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t>- +"R?$]s8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vp\t>- +"R?$]s8N5os8N5Vs8N5Us8N4Rs+#~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vl2Ubd +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vl2Ubd +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vl2Ubd +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vl2Ubd +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vl2Ubd +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vl2Ubd +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].3Tli6tf +o`+pog].9VgAh0UK)^A~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vs8W*% +mJm1ho`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vs8W*% +mJm1ho`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vs8W*% +mJm1ho`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vs8W*% +mJm1ho`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vs8W*% +mJm1ho`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vs8W*% +mJm1ho`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VrVum# +n,NCjo`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VrVum# +n,NCjo`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VrVum# +n,NCjo`+pog].9VgAh0UK)^@~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VrVum# +nG`OL"9J_ds7ZKm"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VrVum# +nG`OL"9J_ds7ZKm"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VrVum# +nG`OL"9J_ds7ZKm"P`tV"PWnU"G6Z(~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +o`+dkpAb-qg].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +o`+dkpAb-qg].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +o`+dkpAb-qg].9VgAh0UK)^B~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +j8],^g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +j8],^g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +j8],^g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +j8],^g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +j8],^g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vqu?Wu +j8],^g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vq#C?s +jo>>`g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vq#C?s +jo>>`g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vq#C?s +jo>>`g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vq#C?s +jo>>`g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vq#C?s +jo>>`g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9Vq#C?s +jo>>`g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VpAb-q +kPtPbg].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,TFNg].6Ug].9Vg].6Ug].9Vg].6Ug].6Ug].9Vg].6Ug].9Vg].6Ug].9VgAh0Ug].9VgAh0U +g].9VgAh0UK)^?~> +e,Ot%JHUN,JHUN,p&p!IJH~> +e,Ot%JHUN,JHUN,p&p!IJH~> +e,Ot%JHUN,JHUN,p&p!IJH~> +e,Ot%JHUN,JHUN,p&p!IJH~> +e,Ot%JHUN,JHUN,p&p!IJH~> +e,Ot%JHUN,JHUN,p&p!IJH~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +JcC<$JcC<$JcC<$ao?n~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig2.png b/documentation/graphics/STIR-developers-overviewFig2.png new file mode 100644 index 0000000000..31e1fb357e Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig2.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig3.eps b/documentation/graphics/STIR-developers-overviewFig3.eps new file mode 100644 index 0000000000..47bf7da8a0 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig3.eps @@ -0,0 +1,1132 @@ +%!PS-Adobe-3.0 +%%Creator: Advanced Batch Converter +%%Title: +%%CreationDate: Mon Oct 25 17:14:32 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 594 841 +%%EndComments +%%BeginProlog +10 dict begin +%%EndProlog +%%Page: 1 1 +0 842 translate +595 -703 scale +263 311 8 +[ 263 0 0 311 0 0 ] +/rstr 263 string def +/gstr 263 string def +/bstr 263 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 55773 ASCII Bytes +colorimage +JcC<$qYu(~> +JcC<$qYu(~> +JcC<$qYu(~> +JcC<$qYu(~> +JcC<$qYu(~> +JcC<$qYu(~> +s8N/@I/j*D!N5t/rrE-"q#:?ps+14)s*u~> +s8N/@I/j*D!N5t/rrE-"q#:?ps+14)s*u~> +s8N/@I/j*D!N5t/rrE-"q#:?ps+14)s*u~> +s8N.u!<;rr!fXGbZ2ah(JcFI(J:~> +s8N.u!<;rr!fXGbZ2ah(JcFI(J:~> +s8N.u!<;rr!fXGbZ2ah(JcFI(J:~> +s8N1K!87DMrr^UJnGfcn! +s8N1K!87DMrr^UJnGfcn! +s8N1K!87DMrr^UJnGfcn! +s8W*!!ODb'rr_Kca8`FE! +s8W*!!ODb'rr_Kca8`FE! +s8W*!!ODb'rr_Kca8`FE! +"omg]!.=hDrrN1Zs3:TC!<)rt!!3*"! +"omg]!.=hDrrN1Zs3:TC!<)rt!!3*"! +"omg]!.=hDrrN1Zs3:TC!<)rt!!3*"! +"olrI9`Y4jrrN0ps3:QG!<3'!rVls"rrE)ts8N*!rrW9$!<<#t! +"olrI9`Y4jrrN0ps3:QG!<3'!rVls"rrE)ts8N*!rrW9$!<<#t! +"olrI9`Y4jrrN0ps3:QG!<3'!rVls"rrE)ts8N*!rrW9$!<<#t! +#62!LRK2%@r;ZcsbQ%SBr;ZcsqYpQrs8W-!!;uit!<;Zjrr@WMli2K~> +#62!LRK2%@r;ZcsbQ%SBr;ZcsqYpQrs8W-!!;uit!<;Zjrr@WMli2K~> +#62!LRK2%@r;ZcsbQ%SBr;ZcsqYpQrs8W-!!;uit!<;Zjrr@WMli2K~> +!rn2Zrr<)*s8;os!6kHF!<3'!r;Qcts82fs!<33%!<3'!rVllus7H>B!:^'as+"~> +!rn2Zrr<)*s8;os!6kHF!<3'!r;Qcts82fs!<33%!<3'!rVllus7H>B!:^'as+"~> +!rn2Zrr<)*s8;os!6kHF!<3'!r;Qcts82fs!<33%!<3'!rVllus7H>B!:^'as+"~> +#6+]'kl?\Br;Qfu:&iK'nrr<'"s+14GrrE-" +!ri9#q>Yt~> +#6+]'kl?\Br;Qfu:&iK'nrr<'"s+14GrrE-" +!ri9#q>Yt~> +#6+]'kl?\Br;Qfu:&iK'nrr<'"s+14GrrE-" +!ri9#q>Yt~> +!lo]g"TM0rl2U_^!W\2Zc2RkGrrE)urrE-"!ri9#r;Qctrri?%rrE)trrE-"pAY-nrrN-"! +!lo]g"TM0rl2U_^!W\2Zc2RkGrrE)urrE-"!ri9#r;Qctrri?%rrE)trrE-"pAY-nrrN-"! +!lo]g"TM0rl2U_^!W\2Zc2RkGrrE)urrE-"!ri9#r;Qctrri?%rrE)trrE-"pAY-nrrN-"! +rW!!!!!3.Zs8N$#klAd(c2[_BrVlp!rr<'"s8N&t!!3*"rW)rtrW)]m! +rW!!!!!3.Zs8N$#klAd(c2[_BrVlp!rr<'"s8N&t!!3*"rW)rtrW)]m! +rW!!!!!3.Zs8N$#klAd(c2[_BrVlp!rr<'"s8N&t!!3*"rW)rtrW)]m! +pAY6J!:^#ds8N)ts82kJ^\5G@!<)qJ~> +pAY6J!:^#ds8N)ts82kJ^\5G@!<)qJ~> +pAY6J!:^#ds8N)ts82kJ^\5G@!<)qJ~> +pAY2QZN$j&! +pAY2QZN$j&! +pAY2QZN$j&! +pAY/ks/5kt!<<*!q#Gu\pV6_.rr3!!s8N%K~> +pAY/ks/5kt!<<*!q#Gu\pV6_.rr3!!s8N%K~> +pAY/ks/5kt!<<*!q#Gu\pV6_.rr3!!s8N%K~> +S,WKhrrN-"q#Gu\pV6_.rVllus8N%K~> +S,WKhrrN-"q#Gu\pV6_.rVllus8N%K~> +S,WKhrrN-"q#Gu\pV6_.rVllus8N%K~> +ScA]i!WN/p!.ho[^]"36RK*9d! +ScA]i!WN/p!.ho[^]"36RK*9d! +ScA]i!WN/p!.ho[^]"36RK*9d! +T)SilrrDcnJ\UuprW)tdrVllus8N%K~> +T)SilrrDcnJ\UuprW)tdrVllus8N%K~> +T)SilrrDcnJ\UuprW)tdrVllus8N%K~> +TE"N`J\UuprrE#t!L`ufrrE-"rr7M~> +TE"N`J\UuprrE#t!L`ufrrE-"rr7M~> +TE"N`J\UuprrE#t!L`ufrrE-"rr7M~> +U&XZ`J\V#qrrDrrs-Wrg!<<&uJH~> +U&XZ`J\V#qrrDrrs-Wrg!<<&uJH~> +U&XZ`J\V#qrrDrrs-Wrg!<<&uJH~> +U]9iaJ\V#qrrDoqs-Wrg!<<&uJH~> +U]9iaJ\V#qrrDoqs-Wrg!<<&uJH~> +U]9iaJ\V#qrrDoqs-Wrg!<<&uJH~> +U]9lbJ\V#qrrDfn!gs&grr7N~> +U]9lbJ\V#qrrDfn!gs&grr7N~> +U]9lbJ\V#qrrDfn!gs&grr7N~> +V#LGqrrN-"p&KZYqS3"0!rn\gq#:?ps8N%K~> +V#LGqrrN-"p&KZYqS3"0!rn\gq#:?ps8N%K~> +V#LGqrrN-"p&KZYqS3"0!rn\gq#:?ps8N%K~> +V>gPrs8N&l!.ho^^]+<4s8SM_rrE-"rr7M~> +V>gPrs8N&l!.ho^^]+<4s8SM_rrE-"rr7M~> +V>gPrs8N&l!.ho^^]+<4s8SM_rrE-"rr7M~> +VZ-Yss8;ol!.ho^^]+<1rrJPfqu6Zss8N%K~> +VZ-Yss8;ol!.ho^^]+<1rrJPfqu6Zss8N%K~> +VZ-Yss8;ol!.ho^^]+<1rrJPfqu6Zss8N%K~> +W;lktqu?EkJ\V)srrDlp!L`ubrrE-"rr7M~> +W;lktqu?EkJ\V)srrDlp!L`ubrrE-"rr7M~> +W;lktqu?EkJ\V)srrDlp!L`ubrrE-"rr7M~> +WW)u!s82ik!.ho^^]+97RK**_!L`ucrrE-"rr7N~> +WW)u!s82ik!.ho^^]+97RK**_!L`ucrrE-"rr7N~> +WW)u!s82ik!.ho^^]+97RK**_!L`ucrrE-"rr7N~> +WrE)"s82ip!!0h7rW%MaqnN.2s8N+fs7u]pRJm-d!<<&uJ,~> +WrE)"s82ip!!0h7rW%MaqnN.2s8N+fs7u]pRJm-d!<<&uJ,~> +WrE)"s82ip!!0h7rW%MaqnN.2s8N+fs7u]pRJm-d!<<&uJ,~> +X8`2#s8;op!<9h4!.ho_^B"?7rVlnds7lTpRK* +X8`2#s8;op!<9h4!.ho_^B"?7rVlnds7lTpRK* +X8`2#s8;op!<9h4!.ho_^B"?7rVlnds7lTpRK* +XT&;$s8;op!<0b4!.ho`^]+<1s8SM^s8SJgrrE)us+(~> +XT&;$s8;op!<0b4!.ho`^]+<1s8SM^s8SJgrrE)us+(~> +XT&;$s8;op!<0b4!.ho`^]+<1s8SM^s8SJgrrE)us+(~> +Y5eM%qu?TpqnE.3^Oa0!^]+<0s8SM^s8SJgrrE)us+(~> +Y5eM%qu?TpqnE.3^Oa0!^]+<0s8SM^s8SJgrrE)us+(~> +Y5eM%qu?TpqnE.3^Oa0!^]+<0s8SM^s8SJgrrE)us+(~> +YQ"V's82ip!.hoY^]+98s-`o_rrJPfq#:D`!<<&uJ:~> +YQ"V's82ip!.hoY^]+98s-`o_rrJPfq#:D`!<<&uJ:~> +YQ"V's82ip!.hoY^]+98s-`o_rrJPfq#:D`!<<&uJ:~> +Yl=_(s82ip!.hoY^]+<5rrJPfq>UJ`s7lTp!<<&uJ:~> +Yl=_(s82ip!.hoY^]+<5rrJPfq>UJ`s7lTp!<<&uJ:~> +Yl=_(s82ip!.hoY^]+<5rrJPfq>UJ`s7lTp!<<&uJ:~> +Z2Xh)s82ip!.hoY^B"?7r;Qecs7u]pRJHj`!<<&uJ:~> +Z2Xh)s82ip!.hoY^B"?7r;Qecs7u]pRJHj`!<<&uJ:~> +Z2Xh)s82ip!.hoY^B"?7r;Qecs7u]pRJHj`!<<&uJ:~> +ZiC%*qu?QoJ\Uon!^J_q>UHqs8N%K~> +ZiC%*qu?QoJ\Uon!^J_q>UHqs8N%K~> +ZiC%*qu?QoJ\Uon!^J_q>UHqs8N%K~> +[/U.,s82ip!.hoY^]+ +[/U.,s82ip!.hoY^]+ +[/U.,s82ip!.hoY^]+ +[Jp7-s82ip!9q8t!!A4qN;s"[NPGD+s';83rr<-#RK*'^!L`u`rrJPfr;Qcts8N%K~> +[Jp7-s82ip!9q8t!!A4qN;s"[NPGD+s';83rr<-#RK*'^!L`u`rrJPfr;Qcts8N%K~> +[Jp7-s82ip!9q8t!!A4qN;s"[NPGD+s';83rr<-#RK*'^!L`u`rrJPfr;Qcts8N%K~> +[f6@.s82ip!9h0"N^J_rVllus8N%K~> +[f6@.s82ip!9h0"N^J_rVllus8N%K~> +[f6@.s82ip!9h0"N^J_rVllus8N%K~> +\,QI/s82ip!9V#t!'7mp^B.]>^R;h;!<<#ts-`Z^!L`u`s8SMcrrE-"rr7K~> +\,QI/s82ip!9V#t!'7mp^B.]>^R;h;!<<#ts-`Z^!L`u`s8SMcrrE-"rr7K~> +\,QI/s82ip!9V#t!'7mp^B.]>^R;h;!<<#ts-`Z^!L`u`s8SMcrrE-"rr7K~> +\c;[0qu?QojhCn'!3!X6^J;Q@^]"64^B9/iBts\_rVutt!!E;#!,94H^B1c;!<)us^]"37NG60, +^BArb:9MA1^]"3;S,egq!0t=V^B"?7qYpSas7uZqRK*'^!L`ufrrE-"rr7K~> +\c;[0qu?QojhCn'!3!X6^J;Q@^]"64^B9/iBts\_rVutt!!E;#!,94H^B1c;!<)us^]"37NG60, +^BArb:9MA1^]"3;S,egq!0t=V^B"?7qYpSas7uZqRK*'^!L`ufrrE-"rr7K~> +\c;[0qu?QojhCn'!3!X6^J;Q@^]"64^B9/iBts\_rVutt!!E;#!,94H^B1c;!<)us^]"37NG60, +^BArb:9MA1^]"3;S,egq!0t=V^B"?7qYpSas7uZqRK*'^!L`ufrrE-"rr7K~> +])Md2s82io!9Cm!N<"sQS:/0K^]+<6^BL>3VuVgl$GVi+?*lY,^J:`BrP&MW!2omG^\kkH!!8Yj +^]2%PF/#f;:;?_Arr<7t!'3jT:;>`%!W\Ygq>^J_q>^J_q#CA^!ri9#rr7K~> +])Md2s82io!9Cm!N<"sQS:/0K^]+<6^BL>3VuVgl$GVi+?*lY,^J:`BrP&MW!2omG^\kkH!!8Yj +^]2%PF/#f;:;?_Arr<7t!'3jT:;>`%!W\Ygq>^J_q>^J_q#CA^!ri9#rr7K~> +])Md2s82io!9Cm!N<"sQS:/0K^]+<6^BL>3VuVgl$GVi+?*lY,^J:`BrP&MW!2omG^\kkH!!8Yj +^]2%PF/#f;:;?_Arr<7t!'3jT:;>`%!W\Ygq>^J_q>^J_q#CA^!ri9#rr7K~> +]Dhm3s82ip!91`tVuUPHF/$GG^]+<6^BJZY^AqQSs1eR6"ht$u^Au%H^]+97^An97^\kkH!!9<; +^]2%N!0t;!! +]Dhm3s82ip!91`tVuUPHF/$GG^]+<6^BJZY^AqQSs1eR6"ht$u^Au%H^]+97^An97^\kkH!!9<; +^]2%N!0t;!! +]Dhm3s82ip!91`tVuUPHF/$GG^]+<6^BJZY^AqQSs1eR6"ht$u^Au%H^]+97^An97^\kkH!!9<; +^]2%N!0t;!! +]`/!4s82ip!8tWl!!9nr^\PYE!<9h3!<0_8>l^,i!s"U#^\khK3WQnp! +]`/!4s82ip!8tWl!!9nr^\PYE!<9h3!<0_8>l^,i!s"U#^\khK3WQnp! +]`/!4s82ip!8tWl!!9nr^\PYE!<9h3!<0_8>l^,i!s"U#^\khK3WQnp! +^An35qZ$KohnK;.!/5.%q7lq0s1eR6qnE5S!,2E8!,6krr4`Dh!2om=^\kkH!;jM4Y&aRD!5JHH +rr<)7!!3/8!!*)7jM(]qs8;ltRK*'^!L`u`rrJPfq#:?ps8N%K~> +^An35qZ$KohnK;.!/5.%q7lq0s1eR6qnE5S!,2E8!,6krr4`Dh!2om=^\kkH!;jM4Y&aRD!5JHH +rr<)7!!3/8!!*)7jM(]qs8;ltRK*'^!L`u`rrJPfq#:?ps8N%K~> +^An35qZ$KohnK;.!/5.%q7lq0s1eR6qnE5S!,2E8!,6krr4`Dh!2om=^\kkH!;jM4Y&aRD!5JHH +rr<)7!!3/8!!*)7jM(]qs8;ltRK*'^!L`u`rrJPfq#:?ps8N%K~> +^]+<7s8)co!8bHkN;s"[Q,!.0rrE)6rrDr2!K@'\!) +^]+<7s8)co!8bHkN;s"[Q,!.0rrE)6rrDr2!K@'\!) +^]+<7s8)co!8bHkN;s"[Q,!.0rrE)6rrDr2!K@'\!) +_#FE8s82io!8YBjVuQl![(lFOrrE)6"'ko*^\tnJVuQl!PlLjcW5&8F"0PD+^\Y_F!;sS6:&r$/ +! +_#FE8s82io!8YBjVuQl![(lFOrrE)6"'ko*^\tnJVuQl!PlLjcW5&8F"0PD+^\Y_F!;sS6:&r$/ +! +_#FE8s82io!8YBjVuQl![(lFOrrE)6"'ko*^\tnJVuQl!PlLjcW5&8F"0PD+^\Y_F!;sS6:&r$/ +! +_>aN9s82io!8G6i3_mHb^]+<6^BKSsKrA_#s1\TA!!3/8!!*)7qnE/,!<3$#3hjCf^]+<3^]+97 +U&Y2o^\kkH!!0h7!W]t8!^J_q#:A_s82fs!<<&uJ:~> +_>aN9s82io!8G6i3_mHb^]+<6^BKSsKrA_#s1\TA!!3/8!!*)7qnE/,!<3$#3hjCf^]+<3^]+97 +U&Y2o^\kkH!!0h7!W]t8!^J_q#:A_s82fs!<<&uJ:~> +_>aN9s82io!8G6i3_mHb^]+<6^BKSsKrA_#s1\TA!!3/8!!*)7qnE/,!<3$#3hjCf^]+<3^]+97 +U&Y2o^\kkH!!0h7!W]t8!^J_q#:A_s82fs!<<&uJ:~> +_Z'W:s82ip!85*gF+qC)^\n04^BATXBsbYS^BFUO^Kin8qnE/[!<)s!:;?eCr;cf2#(8P&>l];f +rkJ1-l+[6!s8N$!RK*'^!L`u_rrJPfq>UJ`s8;lt!<<&uJH~> +_Z'W:s82ip!85*gF+qC)^\n04^BATXBsbYS^BFUO^Kin8qnE/[!<)s!:;?eCr;cf2#(8P&>l];f +rkJ1-l+[6!s8N$!RK*'^!L`u_rrJPfq>UJ`s8;lt!<<&uJH~> +_Z'W:s82ip!85*gF+qC)^\n04^BATXBsbYS^BFUO^Kin8qnE/[!<)s!:;?eCr;cf2#(8P&>l];f +rkJ1-l+[6!s8N$!RK*'^!L`u_rrJPfq>UJ`s8;lt!<<&uJH~> +`;fi;qZ$KoZG-E]!<)u@^B"?7r;Zebq#CA^q#:A_s7u]pRJm-d!<<&uJA~> +`;fi;qZ$KoZG-E]!<)u@^B"?7r;Zebq#CA^q#:A_s7u]pRJm-d!<<&uJA~> +`;fi;qZ$KoZG-E]!<)u@^B"?7r;Zebq#CA^q#:A_s7u]pRJm-d!<<&uJA~> +`W#r=s8)co!4'?@Er`rW^Ap=0beF/Ys82irRJ?g^RJ?d_RK**_s-`ic! +`W#r=s8)co!4'?@Er`rW^Ap=0beF/Ys82irRJ?g^RJ?d_RK**_s-`ic! +`W#r=s8)co!4'?@Er`rW^Ap=0beF/Ys82irRJ?g^RJ?d_RK**_s-`ic! +`r?&>s8)co!3s9?3WQ;bXoO0jc+a8Zs7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJ:~> +`r?&>s8)co!3s9?3WQ;bXoO0jc+a8Zs7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJ:~> +`r?&>s8)co!3s9?3WQ;bXoO0jc+a8Zs7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJ:~> +a8Z/?s82io!3j3AU0Ra[ID=(Brr<*"R/r`Uq>^J_q#CA^q>^J_q#CA^!ri9#rr7N~> +a8Z/?s82io!3j3AU0Ra[ID=(Brr<*"R/r`Uq>^J_q#CA^q>^J_q#CA^!ri9#rr7N~> +a8Z/?s82io!3j3AU0Ra[ID=(Brr<*"R/r`Uq>^J_q#CA^q>^J_q#CA^!ri9#rr7N~> +aoDA@qZ$KoJ\Uon! +aoDA@qZ$KoJ\Uon! +aoDA@qZ$KoJ\Uon! +b5VJBs8)co!.hoY^B"?7r;Qecs7lTpRK*'^!L`u`rrJPfq#:D`!<<&uJH~> +b5VJBs8)co!.hoY^B"?7r;Qecs7lTpRK*'^!L`u`rrJPfq#:D`!<<&uJH~> +b5VJBs8)co!.hoY^B"?7r;Qecs7lTpRK*'^!L`u`rrJPfq#:D`!<<&uJH~> +bPqSCs8)co!.hoY^B"?7qYpSas7lTpRK*'^!L`u`rrJPfq#:?ps8N%K~> +bPqSCs8)co!.hoY^B"?7qYpSas7lTpRK*'^!L`u`rrJPfq#:?ps8N%K~> +bPqSCs8)co!.hoY^B"?7qYpSas7lTpRK*'^!L`u`rrJPfq#:?ps8N%K~> +bl7\Ds8)co!.hoY^B+D's7u]pRJ?g^RJ?d_RK**_s-`]_! +bl7\Ds8)co!.hoY^B+D's7u]pRJ?g^RJ?d_RK**_s-`]_! +bl7\Ds8)co!.hoY^B+D's7u]pRJ?g^RJ?d_RK**_s-`]_! +c2ReEs82io!.hoZ^]+<6s8SM^rrJPfq#:A_s7u]pRJ?d_RK*0a! +c2ReEs82io!.hoZ^]+<6s8SM^rrJPfq#:A_s7u]pRJ?d_RK*0a! +c2ReEs82io!.hoZ^]+<6s8SM^rrJPfq#:A_s7u]pRJ?d_RK*0a! +ci="FqZ$HnJ\Uro! +ci="FqZ$HnJ\Uro! +ci="FqZ$HnJ\Uro! +d/O+Hs8)co!.hoY^B"?7qu6\bs7uZqRK*'^!L`u_rrJPfq>UJ`s8;lt!<<&uJH~> +d/O+Hs8)co!.hoY^B"?7qu6\bs7uZqRK*'^!L`u_rrJPfq>UJ`s8;lt!<<&uJH~> +d/O+Hs8)co!.hoY^B"?7qu6\bs7uZqRK*'^!L`u_rrJPfq>UJ`s8;lt!<<&uJH~> +dJj4Is8)co!.hoY^B"?7q>UJ`s7u]pRJ?g^RJ?d_RK**_s-`ic! +dJj4Is8)co!.hoY^B"?7q>UJ`s7u]pRJ?g^RJ?d_RK**_s-`ic! +dJj4Is8)co!.hoY^B"?7q>UJ`s7u]pRJ?g^RJ?d_RK**_s-`ic! +df0=Js8)co!.hoY^B4K9RK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`ufrrE-"rr7N~> +df0=Js8)co!.hoY^B4K9RK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`ufrrE-"rr7N~> +df0=Js8)co!.hoY^B4K9RK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`ufrrE-"rr7N~> +eGoOKq>^BnJ\UrorrE&us-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ,~> +eGoOKq>^BnJ\UrorrE&us-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ,~> +eGoOKq>^BnJ\UrorrE&us-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ,~> +ec,XMs8)cn!.hoZ^B"?7rVuncq>^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7N~> +ec,XMs8)cn!.hoZ^B"?7rVuncq>^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7N~> +ec,XMs8)cn!.hoZ^B"?7rVuncq>^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7N~> +f)GaNs8)cn!.hoZ^B"?7qYpSas7uZqRK*'^!L`u_rrJPfq>UJ`s7lTqR/m9ds+#~> +f)GaNs8)cn!.hoZ^B"?7qYpSas7uZqRK*'^!L`u_rrJPfq>UJ`s7lTqR/m9ds+#~> +f)GaNs8)cn!.hoZ^B"?7qYpSas7uZqRK*'^!L`u_rrJPfq>UJ`s7lTqR/m9ds+#~> +fDbjOs8)co!.hoY^B"?7q#:A_s7uZqRK*'^!L`u_rrJPfq>UJ`s7lTp!<<&uJ:~> +fDbjOs8)co!.hoY^B"?7q#:A_s7uZqRK*'^!L`u_rrJPfq>UJ`s7lTp!<<&uJ:~> +fDbjOs8)co!.hoY^B"?7q#:A_s7uZqRK*'^!L`u_rrJPfq>UJ`s7lTp!<<&uJ:~> +f`(sPs8)co!.hoZ^]+97s-WnUs7uZqRK**_s-`Z^s-`Z^!L`u`s8SM_rrE-"rr7N~> +f`(sPs8)co!.hoZ^]+97s-WnUs7uZqRK**_s-`Z^s-`Z^!L`u`s8SM_rrE-"rr7N~> +f`(sPs8)co!.hoZ^]+97s-WnUs7uZqRK**_s-`Z^s-`Z^!L`u`s8SM_rrE-"rr7N~> +gAh0Qq>^BnJ\Uro!^J_q#CA^q#:A_s7u]pRJHj`!<<&uJH~> +gAh0Qq>^BnJ\Uro!^J_q#CA^q#:A_s7u]pRJHj`!<<&uJH~> +gAh0Qq>^BnJ\Uro!^J_q#CA^q#:A_s7u]pRJHj`!<<&uJH~> +g]%9Ss7u]n!.hoZ^B"?7r;Qecs7u]pRJ?d_RK*'^!L`u`s8SM^rrJPfqu6Zss8N%K~> +g]%9Ss7u]n!.hoZ^B"?7r;Qecs7u]pRJ?d_RK*'^!L`u`s8SM^rrJPfqu6Zss8N%K~> +g]%9Ss7u]n!.hoZ^B"?7r;Qecs7u]pRJ?d_RK*'^!L`u`s8SM^rrJPfqu6Zss8N%K~> +e,T=GPJ@(ske@,us8)`rRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`ucrrE-"rr7M~> +e,T=GPJ@(ske@,us8)`rRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`ucrrE-"rr7M~> +e,T=GPJ@(ske@,us8)`rRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`ucrrE-"rr7M~> +g]%9Ss8;oq!0P%m!:@N&!1El_s8SM^rrJPfq>^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ:~> +g]%9Ss8;oq!0P%m!:@N&!1El_s8SM^rrJPfq>^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ:~> +g]%9Ss8;oq!0P%m!:@N&!1El_s8SM^rrJPfq>^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ:~> +g].!JOMCMio"Y2)s-`Z^s-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_rVllus8N%K~> +g].!JOMCMio"Y2)s-`Z^s-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_rVllus8N%K~> +g].!JOMCMio"Y2)s-`Z^s-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_rVllus8N%K~> +g].9Rrr;osO2(;ep:gV.s8N$!RK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfs8N*"s8N%K +~> +g].9Rrr;osO2(;ep:gV.s8N$!RK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfs8N*"s8N%K +~> +g].9Rrr;osO2(;ep:gV.s8N$!RK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfs8N*"s8N%K +~> +g].9Rs8W#tNkb&`qnE.3s8;osRJ?g^RJHm_RJ?g^RJ?g^RJHm_RJ?g^R0*Bgs8N%K~> +g].9Rs8W#tNkb&`qnE.3s8;osRJ?g^RJHm_RJ?g^RJ?g^RJHm_RJ?g^R0*Bgs8N%K~> +g].9Rs8W#tNkb&`qnE.3s8;osRJ?g^RJHm_RJ?g^RJ?g^RJHm_RJ?g^R0*Bgs8N%K~> +g].9Rs8RWMo)SXes-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ-~> +g].9Rs8RWMo)SXes-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ-~> +g].9Rs8RWMo)SXes-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ-~> +g].9RrVqEKoDn^e!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:D`!<<&uJH~> +g].9RrVqEKoDn^e!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:D`!<<&uJH~> +g].9RrVqEKoDn^e!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:D`!<<&uJH~> +g].9RrVqEKnc8Od!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:?ps8N%K~> +g].9RrVqEKnc8Od!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:?ps8N%K~> +g].9RrVqEKnc8Od!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:?ps8N%K~> +g].9RM#ZW^J_q#:A_s7u]pRJ?g^RJ?d_RK**_s-`]_! +g].9RM#ZW^J_q#:A_s7u]pRJ?g^RJ?d_RK**_s-`]_! +g].9RM#ZW^J_q#:A_s7u]pRJ?g^RJ?d_RK**_s-`]_! +g].9RM#Z]>!L`u`s8SM^rrJPfq>^J_q#CA^q#:A_s7u]pRJHj`!<<&uJH~> +g].9RM#Z]>!L`u`s8SM^rrJPfq>^J_q#CA^q#:A_s7u]pRJHj`!<<&uJH~> +g].9RM#Z]>!L`u`s8SM^rrJPfq>^J_q#CA^q#:A_s7u]pRJHj`!<<&uJH~> +g].9RM#ZiBs8N*"rrW4gs7lTpRK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s82fs!<<&uJH~> +g].9RM#ZiBs8N*"rrW4gs7lTpRK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s82fs!<<&uJH~> +g].9RM#ZiBs8N*"rrW4gs7lTpRK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s82fs!<<&uJH~> +g].9RM#ZuFrr3!!rrW3#s8W*"RK*'^!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfr;Qcts8N%K +~> +g].9RM#ZuFrr3!!rrW3#s8W*"RK*'^!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfr;Qcts8N%K +~> +g].9RM#ZuFrr3!!rrW3#s8W*"RK*'^!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfr;Qcts8N%K +~> +g].9RM#[/Kq>UHqrrW3#s8N&uRJ?g^RJ?d_RK**_s-`Z^s-`Z^!L`u`s8SMcrrE-"rr7K~> +g].9RM#[/Kq>UHqrrW3#s8N&uRJ?g^RJ?d_RK**_s-`Z^s-`Z^!L`u`s8SMcrrE-"rr7K~> +g].9RM#[/Kq>UHqrrW3#s8N&uRJ?g^RJ?d_RK**_s-`Z^s-`Z^!L`u`s8SMcrrE-"rr7K~> +g].9RM#[;Op&>$mrrW3#s8N&uRJ?g^RJ?d_RK**_s-`Z^s-`Z^!L`u`s8SMcrrE-"rr7K~> +g].9RM#[;Op&>$mrrW3#s8N&uRJ?g^RJ?d_RK**_s-`Z^s-`Z^!L`u`s8SMcrrE-"rr7K~> +g].9RM#[;Op&>$mrrW3#s8N&uRJ?g^RJ?d_RK**_s-`Z^s-`Z^!L`u`s8SMcrrE-"rr7K~> +g].9RM#[GSnc&UirrW3#s8;ltRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfs8N*"s8N%K +~> +g].9RM#[GSnc&UirrW3#s8;ltRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfs8N*"s8N%K +~> +g].9RM#[GSnc&UirrW3#s8;ltRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfs8N*"s8N%K +~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RPlCaas7cNo!<;Qg!UJ`s7lTqR/m9d +s+'~> +g].9RPlCaas7cNo!<;Qg!UJ`s7lTqR/m9d +s+'~> +g].9RPlCaas7cNo!<;Qg!UJ`s7lTqR/m9d +s+'~> +g].9RM?!SUn,ECgrrW3#s7lTpRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrE-"rr7K~> +g].9RM?!SUn,ECgrrW3#s7lTpRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrE-"rr7K~> +g].9RM?!SUn,ECgrrW3#s7lTpRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrE-"rr7K~> +g].9R_uB`;s4RDQ!<;Wi!^J_q#CA^q#:A_s7u]pRJHj` +!<<&uJA~> +g].9R_uB`;s4RDQ!<;Wi!^J_q#CA^q#:A_s7u]pRJHj` +!<<&uJA~> +g].9R_uB`;s4RDQ!<;Wi!^J_q#CA^q#:A_s7u]pRJHj` +!<<&uJA~> +g].9R_uB`;s4RDQ!<;Wi! +g].9R_uB`;s4RDQ!<;Wi! +g].9R_uB`;s4RDQ!<;Wi! +g].9R_uK`:rr;rtrVlp!rr<'"s8Dur!<)ou!<<&u!W`6#! +g].9R_uK`:rr;rtrVlp!rr<'"s8Dur!<)ou!<<&u!W`6#! +g].9R_uK`:rr;rtrVlp!rr<'"s8Dur!<)ou!<<&u!W`6#! +g].9R_uB`;s8N$#!<3'!s8W&u!ri9#rr3!!rrW3#s8N$#!<3'!!WN0"!!<0#s8N$!!<<*!rrE&u +!s&?$s8Dru!<;Qg! +g].9R_uB`;s8N$#!<3'!s8W&u!ri9#rr3!!rrW3#s8N$#!<3'!!WN0"!!<0#s8N$!!<<*!rrE&u +!s&?$s8Dru!<;Qg! +g].9R_uB`;s8N$#!<3'!s8W&u!ri9#rr3!!rrW3#s8N$#!<3'!!WN0"!!<0#s8N$!!<<*!rrE&u +!s&?$s8Dru!<;Qg! +g].9R_uB`;s8Dut!<)ou!<3-#!<<&u! +g].9R_uB`;s8Dut!<)ou!<3-#!<<&u! +g].9R_uB`;s8Dut!<)ou!<3-#!<<&u! +g].9R_uB`;s8N$#!<3'!rr3!!rrW3#s8N$!!<3-#!<<&u!UJ`s7lTpRK* +g].9R_uB`;s8N$#!<3'!rr3!!rrW3#s8N$!!<3-#!<<&u!UJ`s7lTpRK* +g].9R_uB`;s8N$#!<3'!rr3!!rrW3#s8N$!!<3-#!<<&u!UJ`s7lTpRK* +g].9R_uB`;s8N$#!<3'!rr3!!rrW3#s8Dut!;uit!<<#t! +g].9R_uB`;s8N$#!<3'!rr3!!rrW3#s8Dut!;uit!<<#t! +g].9R_uB`;s8N$#!<3'!rr3!!rrW3#s8Dut!;uit!<<#t! +g].9R_uBf=rrE'%rrE'!s8N$!!<3-#!<<&u! +g].9R_uBf=rrE'%rrE'!s8N$!!<3-#!<<&u! +g].9R_uBf=rrE'%rrE'!s8N$!!<3-#!<<&u! +g].9R_uK`:rr;oss8W&u!WN-#!<<*!quH]qrrE*!rW!!!!!**"s8W*!s8W&us8W#trr;rtnG`Lh +rrW3#s7uZqRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrSSgs8N%K~> +g].9R_uK`:rr;oss8W&u!WN-#!<<*!quH]qrrE*!rW!!!!!**"s8W*!s8W&us8W#trr;rtnG`Lh +rrW3#s7uZqRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrSSgs8N%K~> +g].9R_uK`:rr;oss8W&u!WN-#!<<*!quH]qrrE*!rW!!!!!**"s8W*!s8W&us8W#trr;rtnG`Lh +rrW3#s7uZqRK*'^!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrSSgs8N%K~> +g].9RYQ"V's8W*"!<:=D!UJ`s7lTp!<<&u +J-~> +g].9RYQ"V's8W*"!<:=D!UJ`s7lTp!<<&u +J-~> +g].9RYQ"V's8W*"!<:=D!UJ`s7lTp!<<&u +J-~> +g].9RYQ"V's8W*"!<:=D!^J_q>UHqs8N%K +~> +g].9RYQ"V's8W*"!<:=D!^J_q>UHqs8N%K +~> +g].9RYQ"V's8W*"!<:=D!^J_q>UHqs8N%K +~> +g].9RY5eJ$bPqSCrrW3#R/r`Uq>^J_q#:A_s7u]pRJ?g^RJ?d_RK**_s-`]_! +g].9RY5eJ$bPqSCrrW3#R/r`Uq>^J_q#:A_s7u]pRJ?g^RJ?d_RK**_s-`]_! +g].9RY5eJ$bPqSCrrW3#R/r`Uq>^J_q#:A_s7u]pRJ?g^RJ?d_RK**_s-`]_! +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7K~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RiVrrJBEMr,!<;uss*UR@!^J_q#CA^q#:A_s7u]pRJm-d +!<<&uJG~> +g].9RiVrrJBEMr,!<;uss*UR@!^J_q#CA^q#:A_s7u]pRJm-d +!<<&uJG~> +g].9RiVrrJBEMr,!<;uss*UR@!^J_q#CA^q#:A_s7u]pRJm-d +!<<&uJG~> +g].9RiVs(M!9'@Hs8;osI%pWA!<3-#!<;us!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_ +s8W*"!<<&uJH~> +g].9RiVs(M!9'@Hs8;osI%pWA!<3-#!<;us!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_ +s8W*"!<<&uJH~> +g].9RiVs(M!9'@Hs8;osI%pWA!<3-#!<;us!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_ +s8W*"!<<&uJH~> +g].9RiW&oX"97<[s-s#h!<3-#!<;rrs-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJH~> +g].9RiW&oX"97<[s-s#h!<3-#!<;rrs-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJH~> +g].9RiW&oX"97<[s-s#h!<3-#!<;rrs-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJH~> +g].9RiW&oXs8N*"s8Dus!<<)u!!BM,iW&iU"/c.)s8N$"n7Vh$!<)rs!!9ims8N$$VZ:Dps8N&t +!!^dMa-m"Ks4mVT!<3-#!<;rrs-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ:~> +g].9RiW&oXs8N*"s8Dus!<<)u!!BM,iW&iU"/c.)s8N$"n7Vh$!<)rs!!9ims8N$$VZ:Dps8N&t +!!^dMa-m"Ks4mVT!<3-#!<;rrs-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ:~> +g].9RiW&oXs8N*"s8Dus!<<)u!!BM,iW&iU"/c.)s8N$"n7Vh$!<)rs!!9ims8N$$VZ:Dps8N&t +!!^dMa-m"Ks4mVT!<3-#!<;rrs-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJ:~> +g].9RiVs"=!6>-9s8N)us8N'$f`6F"rVm&J!8.A!s8W*&RK2:HVuQ\prr<,I!<<*!"e+-/!,2E2 +s8N''f`4`[!,2DfrrE-"!ri9#q>UJ`s7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!gs&grr7N~> +g].9RiVs"=!6>-9s8N)us8N'$f`6F"rVm&J!8.A!s8W*&RK2:HVuQ\prr<,I!<<*!"e+-/!,2E2 +s8N''f`4`[!,2DfrrE-"!ri9#q>UJ`s7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!gs&grr7N~> +g].9RiVs"=!6>-9s8N)us8N'$f`6F"rVm&J!8.A!s8W*&RK2:HVuQ\prr<,I!<<*!"e+-/!,2E2 +s8N''f`4`[!,2DfrrE-"!ri9#q>UJ`s7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!gs&grr7N~> +g].9RiVrrC9`e&Rs82ir!<3#u!!3*"!]rrA#Xs8W*!!WN-#!<;usrr<,bN;rqX!s$CA +!!**"rVult!WN-$!9jIa!<:jS!UJ`s7lTp +!<<&uJ,~> +g].9RiVrrC9`e&Rs82ir!<3#u!!3*"!]rrA#Xs8W*!!WN-#!<;usrr<,bN;rqX!s$CA +!!**"rVult!WN-$!9jIa!<:jS!UJ`s7lTp +!<<&uJ,~> +g].9RiVrrC9`e&Rs82ir!<3#u!!3*"!]rrA#Xs8W*!!WN-#!<;usrr<,bN;rqX!s$CA +!!**"rVult!WN-$!9jIa!<:jS!UJ`s7lTp +!<<&uJ,~> +g].9Ri;WiB9`e&Rs8;os!<3#u!!3*"!^J_q#CA^q#:A_s7u]pRJHj`!<<&u +JH~> +g].9Ri;WiB9`e&Rs8;os!<3#u!!3*"!^J_q#CA^q#:A_s7u]pRJHj`!<<&u +JH~> +g].9Ri;WiB9`e&Rs8;os!<3#u!!3*"!^J_q#CA^q#:A_s7u]pRJHj`!<<&u +JH~> +g].9RiVs&]s3Lb)s8;os!<3#u!!3*"! +g].9RiVs&]s3Lb)s8;os!<3#u!!3*"! +g].9RiVs&]s3Lb)s8;os!<3#u!!3*"! +g].9RiVru[l2L_a!<;usrrE&urr<*"!!**"rVult!WN-#!<<&u"OI-Cl2U\]rrDus"6iP,!!**" +rVult!WN-$!<3$"!<:jS!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-" +rr7N~> +g].9RiVru[l2L_a!<;usrrE&urr<*"!!**"rVult!WN-#!<<&u"OI-Cl2U\]rrDus"6iP,!!**" +rVult!WN-$!<3$"!<:jS!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-" +rr7N~> +g].9RiVru[l2L_a!<;usrrE&urr<*"!!**"rVult!WN-#!<<&u"OI-Cl2U\]rrDus"6iP,!!**" +rVult!WN-$!<3$"!<:jS!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-" +rr7N~> +g].9RiVs&]d/O)?s8;os!<3#u!!3*"!]rrA#Xs8N2cB^l&us8N)srrZp7rr<'"s8Dut +!!3*"!W`6#! +g].9RiVs&]d/O)?s8;os!<3#u!!3*"!]rrA#Xs8N2cB^l&us8N)srrZp7rr<'"s8Dut +!!3*"!W`6#! +g].9RiVs&]d/O)?s8;os!<3#u!!3*"!]rrA#Xs8N2cB^l&us8N)srrZp7rr<'"s8Dut +!!3*"!W`6#! +g].9RiVs&]N8Xc7s8;os!<3#u!!2 +g].9RiVs&]N8Xc7s8;os!<3#u!!2 +g].9RiVs&]N8Xc7s8;os!<3#u!!2 +g].9RiVs&]l$R16s8Dur!!3*"qZ-Qo".B4Ys8N$!VZ?\r!GMN4s8;rrrs#Aqd!Phks8W,n!8RST +!<3-#!<;us!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJH~> +g].9RiVs&]l$R16s8Dur!!3*"qZ-Qo".B4Ys8N$!VZ?\r!GMN4s8;rrrs#Aqd!Phks8W,n!8RST +!<3-#!<;us!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJH~> +g].9RiVs&]l$R16s8Dur!!3*"qZ-Qo".B4Ys8N$!VZ?\r!GMN4s8;rrrs#Aqd!Phks8W,n!8RST +!<3-#!<;us!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJH~> +g].9R^Ae5&!<)u3rrE-"!ri9#qu?\aq#CA^q>^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7N~> +g].9R^Ae5&!<)u3rrE-"!ri9#qu?\aq#CA^q>^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7N~> +g].9R^Ae5&!<)u3rrE-"!ri9#qu?\aq#CA^q>^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7N~> +g].9R^]+A(!<30$!)^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7K~> +g].9R^]+A(!<30$!)^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7K~> +g].9R^]+A(!<30$!)^J_q#CA^q#CA^q>^J_q#CA^!ri9#rr7K~> +g].9R^]+@0!9jUM!4)X=rrE-"!ri9#q>UJ`s7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!gs&g +rr7N~> +g].9R^]+@0!9jUM!4)X=rrE-"!ri9#q>UJ`s7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!gs&g +rr7N~> +g].9R^]+@0!9jUM!4)X=rrE-"!ri9#q>UJ`s7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!gs&g +rr7N~> +g].9R^]+JjHiQm=s1SF5!<3-#!<;io!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:?ps8N%K +~> +g].9R^]+JjHiQm=s1SF5!<3-#!<;io!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:?ps8N%K +~> +g].9R^]+JjHiQm=s1SF5!<3-#!<;io!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:?ps8N%K +~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7K~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC!UJ`s7lTpRK* +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ubrrE-"rr7N~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pRJm-d!<<&uJ,~> +g].9RJcGECr;c`p!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJ,~> +g].9RJcGECr;c`p!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJ,~> +g].9RJcGECr;c`p!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8W*"!<<&uJ,~> +g].9RJcGECr;c]os-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJH~> +g].9RJcGECr;c]os-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJH~> +g].9RJcGECr;c]os-`Z^s-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<<&uJH~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTqR/m9ds+(~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!UJ`s7lTp!<<&uJ:~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q>UHqs8N%K~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ucrrE-"rVqE~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ucrrE-"rVqE~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`Z^!L`ucrrE-"rVqE~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q#:A_s7u]pR0*Bgs82hH~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pR0*Bgs82hH~> +g].9RJcGEC!^J_q#CA^q#:A_s7u]pR0*Bgs82hH~> +g].9RJcGEC!^J_q#CA^q#:A_s7uZqR/d6fs8)bG~> +g].9RJcGEC!^J_q#CA^q#:A_s7uZqR/d6fs8)bG~> +g].9RJcGEC!^J_q#CA^q#:A_s7uZqR/d6fs8)bG~> +g].9RJcGEC!UJ`s8)`r!<;ioJ,~> +g].9RJcGEC!UJ`s8)`r!<;ioJ,~> +g].9RJcGEC!UJ`s8)`r!<;ioJ,~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!UJ`rrW3#s7QDB~> +g].9RJcGEC!UJ`rrW3#s7QDB~> +g].9RJcGEC!UJ`rrW3#s7QDB~> +g].9RJcGEC!^HpoDa=~> +g].9RJcGEC!^HpoDa=~> +g].9RJcGEC!^HpoDa=~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!~> +g].9RJcGEC!~> +g].9RJcGEC!~> +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`ld! +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`ld! +g].9RJcGEC!^J_q#:A_s7lTpRK**_s-`ld! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#CA^q>UHqs6]i:~> +g].9RJcGEC!^J_q#CA^q>UHqs6]i:~> +g].9RJcGEC!^J_q#CA^q>UHqs6]i:~> +g].9RJcGEC!^J_q#CA^qYpQrs6Tc9~> +g].9RJcGEC!^J_q#CA^qYpQrs6Tc9~> +g].9RJcGEC!^J_q#CA^qYpQrs6Tc9~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#:A_s7lTqRK!6f!<;-[JF~> +g].9RJcGEC!^J_q#:A_s7lTqRK!6f!<;-[JF~> +g].9RJcGEC!^J_q#:A_s7lTqRK!6f!<;-[JF~> +g].9RJcGEC!^J_q#:A_s7lTqR/m9Hs+'~> +g].9RJcGEC!^J_q#:A_s7lTqR/m9Hs+'~> +g].9RJcGEC!^J_q#:A_s7lTqR/m9Hs+'~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_qu6Zss5 +g].9RJcGEC!^J_qu6Zss5 +g].9RJcGEC!^J_qu6Zss5 +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC!^J_q#:?ps474#~> +g].9RJcGEC!^J_q#:?ps474#~> +g].9RJcGEC!^J_q#:?ps474#~> +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +g].9RJcGEC! +gA_0Rs+14DrrE-"!ri9#qu?\aq#CA^qYpQrs3L^q~> +gA_0Rs+14DrrE-"!ri9#qu?\aq#CA^qYpQrs3L^q~> +gA_0Rs+14DrrE-"!ri9#qu?\aq#CA^qYpQrs3L^q~> +gA_0Rs+14DrrE-"!ri9#q>UJ`s7lTpRK*9drrC=DJH~> +gA_0Rs+14DrrE-"!ri9#q>UJ`s7lTpRK*9drrC=DJH~> +gA_0Rs+14DrrE-"!ri9#q>UJ`s7lTpRK*9drrC=DJH~> +gA_0Rs+14DrrE-"!ri9#q#:A_s7lTpRK!?g!<::CJH~> +gA_0Rs+14DrrE-"!ri9#q#:A_s7lTpRK!?g!<::CJH~> +gA_0Rs+14DrrE-"!ri9#q#:A_s7lTpRK!?g!<::CJH~> +h>d0KJcGZJ! +h>d0KJcGZJ! +h>d0KJcGZJ! +hZ*3JJcG]K! +hZ*3JJcG]K! +hZ*3JJcG]K! +rW!!!!<3&srrE-"li6VXJcG]K! +rW!!!!<3&srrE-"li6VXJcG]K! +rW!!!!<3&srrE-"li6VXJcG]K! +!ri9#s8N*"s5a4R!.k1JrrE-"!ri9#s8N+fs7lTpRK*9d! +!ri9#s8N*"s5a4R!.k1JrrE-"!ri9#s8N+fs7lTpRK*9d! +!ri9#s8N*"s5a4R!.k1JrrE-"!ri9#s8N+fs7lTpRK*9d! +!ri9#s8N*"s5a4R!.k1JrrE-"!ri9#rr<"dq#CA^!ri9#`rCS~> +!ri9#s8N*"s5a4R!.k1JrrE-"!ri9#rr<"dq#CA^!ri9#`rCS~> +!ri9#s8N*"s5a4R!.k1JrrE-"!ri9#rr<"dq#CA^!ri9#`rCS~> +!ri9#s8N*"s5X.R!.k1JrrE-"!ri9#rr<"dq#CA^! +!ri9#s8N*"s5X.R!.k1JrrE-"!ri9#rr<"dq#CA^! +!ri9#s8N*"s5X.R!.k1JrrE-"!ri9#rr<"dq#CA^! +!ri9#s8N*"s8;lt!<<&u! +!ri9#s8N*"s8;lt!<<&u! +!ri9#s8N*"s8;lt!<<&u! +s8N0$rrE)ss8N)urrW9$!<<*!!s&?$rrW3#s7u]h!.k1JrrE-"!ri9#qu?\ar;Zcs_Z,/~> +s8N0$rrE)ss8N)urrW9$!<<*!!s&?$rrW3#s7u]h!.k1JrrE-"!ri9#qu?\ar;Zcs_Z,/~> +s8N0$rrE)ss8N)urrW9$!<<*!!s&?$rrW3#s7u]h!.k1JrrE-"!ri9#qu?\ar;Zcs_Z,/~> +s8N0$rrE)rrrE-"s8W&urr3'#rrE'#rrE)ps7ZMEs8;lt!<3-#!<;rrs-`ic! +s8N0$rrE)rrrE-"s8W&urr3'#rrE'#rrE)ps7ZMEs8;lt!<3-#!<;rrs-`ic! +s8N0$rrE)rrrE-"s8W&urr3'#rrE'#rrE)ps7ZMEs8;lt!<3-#!<;rrs-`ic! +s8N0$rrE)rrrE-"s8N*"s8Ds!!<3$$!<3'!q#C*hJcGZJ! +s8N0$rrE)rrrE-"s8N*"s8Ds!!<3$$!<3'!q#C*hJcGZJ! +s8N0$rrE)rrrE-"s8N*"s8Ds!!<3$$!<3'!q#C*hJcGZJ! +s8N0$rrE)rrrE-"s8N*"s8;or!!<0#s7lWh!.k1JrrE-"!ri9#q#:D`!<9h6JH~> +s8N0$rrE)rrrE-"s8N*"s8;or!!<0#s7lWh!.k1JrrE-"!ri9#q#:D`!<9h6JH~> +s8N0$rrE)rrrE-"s8N*"s8;or!!<0#s7lWh!.k1JrrE-"!ri9#q#:D`!<9h6JH~> +rr3!!s8)`r!<<*!!s&?$s8N$!!<3-#!<;fnp],mFr;QctrrW3#R/r`Uqu?Zr^&NW~> +rr3!!s8)`r!<<*!!s&?$s8N$!!<3-#!<;fnp],mFr;QctrrW3#R/r`Uqu?Zr^&NW~> +rr3!!s8)`r!<<*!!s&?$s8N$!!<3-#!<;fnp],mFr;QctrrW3#R/r`Uqu?Zr^&NW~> +rr3!!s82iq!<3#u!<)ou!<3-#!<;fnq#H!Gqu6]trr<'"rrW4gs8Dru!<9_3JH~> +rr3!!s82iq!<3#u!<)ou!<3-#!<;fnq#H!Gqu6]trr<'"rrW4gs8Dru!<9_3JH~> +rr3!!s82iq!<3#u!<)ou!<3-#!<;fnq#H!Gqu6]trr<'"rrW4gs8Dru!<9_3JH~> +gAh!LJcGWIrr<-#!<3-#RK*9d! +gAh!LJcGWIrr<-#!<3-#RK*9d! +gAh!LJcGWIrr<-#!<3-#RK*9d! +g].'LJcGWI! +g].'LJcGWI! +g].'LJcGWI! +gAh!LJcGWI! +gAh!LJcGWI! +gAh!LJcGWI! +gAc^(o)Sgj! +gAc^(o)Sgj! +gAc^(o)Sgj! +g&LsMJcGKE! +g&LsMJcGKE! +g&LsMJcGKE! +g&LsMJcGKE!s&?$s0_lW~> +g&LsMJcGKE!s&?$s0_lW~> +g&LsMJcGKE!s&?$s0_lW~> +g&M!NJcGHDrrBD*J@~> +g&M!NJcGHDrrBD*J@~> +g&M!NJcGHDrrBD*J@~> +f`1pNJcDVIJ,~> +f`1pNJcDVIJ,~> +f`1pNJcDVIJ,~> +f`1pNJcDVIJ,~> +f`1pNJcDVIJ,~> +f`1pNJcDVIJ,~> +fDbjOs+13Is+%~> +fDbjOs+13Is+%~> +fDbjOs+13Is+%~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +JcC<$qYu)~> +a8c,="24`J!!3/6s7H?j!5JR5!0dG5~> +a8c,="24`J!!3/6s7H?j!5JR5!0dG5~> +a8c,="24`J!!3/6s7H?j!5JR5!0dG5~> +a8Z7T!0$sXrrTKps763i!5AL5!0dG5~> +a8Z7T!0$sXrrTKps763i!5AL5!0dG5~> +a8Z7T!0$sXrrTKps763i!5AL5!0dG5~> +`r?)?:&k7n!dru,o)J^i^An35PQ-/~> +`r?)?:&k7n!dru,o)J^i^An35PQ-/~> +`r?)?:&k7n!dru,o)J^i^An35PQ-/~> +`r?-g!9*qZs(MH/rr]/!ZN'k&rrE*!rW!!!!!**"rr;rt#1*@jRK1D.qu6c(!0$sRs8E!&ciD+T +!6>-:rr]/!ZN'k&!beJ3! +`r?-g!9*qZs(MH/rr]/!ZN'k&rrE*!rW!!!!!**"rr;rt#1*@jRK1D.qu6c(!0$sRs8E!&ciD+T +!6>-:rr]/!ZN'k&!beJ3! +`r?-g!9*qZs(MH/rr]/!ZN'k&rrE*!rW!!!!!**"rr;rt#1*@jRK1D.qu6c(!0$sRs8E!&ciD+T +!6>-:rr]/!ZN'k&!beJ3! +`r?7V!58EZVuQYo"jd8&!7:cEs8N)us8N'"rr<'"s8Dut!!_*V9kXN?s8;m#f`9t2^&Rp.rr<8V +!)7,,B`J#1"jd8&!7:cFrr]P,f`2$Qs8;m#f`9t2^&O`)JH~> +`r?7V!58EZVuQYo"jd8&!7:cEs8N)us8N'"rr<'"s8Dut!!_*V9kXN?s8;m#f`9t2^&Rp.rr<8V +!)7,,B`J#1"jd8&!7:cFrr]P,f`2$Qs8;m#f`9t2^&O`)JH~> +`r?7V!58EZVuQYo"jd8&!7:cEs8N)us8N'"rr<'"s8Dut!!_*V9kXN?s8;m#f`9t2^&Rp.rr<8V +!)7,,B`J#1"jd8&!7:cFrr]P,f`2$Qs8;m#f`9t2^&O`)JH~> +`r?8%!0$rHg&LsL"cNH]!0$sVs8N)us8N'"rr<'"s8Dut!!3*"!W_Hb!^Hp +!WN-$!9jIa!<;us"cNH]!0$sWrr[WKrr<'"s8;m#RK3?fI/fi=JH~> +`r?8%!0$rHg&LsL"cNH]!0$sVs8N)us8N'"rr<'"s8Dut!!3*"!W_Hb!^Hp +!WN-$!9jIa!<;us"cNH]!0$sWrr[WKrr<'"s8;m#RK3?fI/fi=JH~> +`r?8%!0$rHg&LsL"cNH]!0$sVs8N)us8N'"rr<'"s8Dut!!3*"!W_Hb!^Hp +!WN-$!9jIa!<;us"cNH]!0$sWrr[WKrr<'"s8;m#RK3?fI/fi=JH~> +`W,r +`W,r +`W,r +`W$("!4%R`qZ$Qq!WN-#!<<#trrE&urr<*"!!**"rVult!WN-$!<3$"!<;usrrD`lrr<*"!!30# +!!**"r;Zcs!WN-#!<<&urr<*"!!**"r;ZcsS,\!~> +`W$("!4%R`qZ$Qq!WN-#!<<#trrE&urr<*"!!**"rVult!WN-$!<3$"!<;usrrD`lrr<*"!!30# +!!**"r;Zcs!WN-#!<<&urr<*"!!**"r;ZcsS,\!~> +`W$("!4%R`qZ$Qq!WN-#!<<#trrE&urr<*"!!**"rVult!WN-$!<3$"!<;usrrD`lrr<*"!!30# +!!**"r;Zcs!WN-#!<<&urr<*"!!**"r;ZcsS,\!~> +`W#tP!!3/@s8)cq!!3*"! +`W#tP!!3/@s8)cq!!3*"! +`W#tP!!3/@s8)cq!!3*"! +`W#tt!!3/is8)a!Mu`kXN;rkVrrE&urr<*"!!**"rVult!WN-$!<3$"!<;us"+1+-s7cQn!!3*" +!W`6#!]rrA#Xrr3(6!<3$"!<;us"+1+-s.01?~> +`W#tt!!3/is8)a!Mu`kXN;rkVrrE&urr<*"!!**"rVult!WN-$!<3$"!<;us"+1+-s7cQn!!3*" +!W`6#!]rrA#Xrr3(6!<3$"!<;us"+1+-s.01?~> +`W#tt!!3/is8)a!Mu`kXN;rkVrrE&urr<*"!!**"rVult!WN-$!<3$"!<;us"+1+-s7cQn!!3*" +!W`6#!]rrA#Xrr3(6!<3$"!<;us"+1+-s.01?~> +`;]m5B`Io."jd8.!6>-^Hp!WN-$ +!<3$"!<;us"jd8.!6>-=rr]/!`rQ,>r;Qr6!4(RBs.B=A~> +`;]m5B`Io."jd8.!6>-^Hp!WN-$ +!<3$"!<;us"jd8.!6>-=rr]/!`rQ,>r;Qr6!4(RBs.B=A~> +`;]m5B`Io."jd8.!6>-^Hp!WN-$ +!<3$"!<;us"jd8.!6>-=rr]/!`rQ,>r;Qr6!4(RBs.B=A~> +`;]n-ZN'_"".B4Ys8Dur!<<'$i;gOkrrE&upAk*j"I]=LnGi@bpAk*j".B4Ys8Ds%n7]+@ZK_De +rrebjN:?k>s*t~> +`;]n-ZN'_"".B4Ys8Dur!<<'$i;gOkrrE&upAk*j"I]=LnGi@bpAk*j".B4Ys8Ds%n7]+@ZK_De +rrebjN:?k>s*t~> +`;]n-ZN'_"".B4Ys8Dur!<<'$i;gOkrrE&upAk*j"I]=LnGi@bpAk*j".B4Ys8Ds%n7]+@ZK_De +rrebjN:?k>s*t~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +JcC<$qYu*~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig3.png b/documentation/graphics/STIR-developers-overviewFig3.png new file mode 100644 index 0000000000..4e2d80d343 Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig3.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig4.eps b/documentation/graphics/STIR-developers-overviewFig4.eps new file mode 100644 index 0000000000..230aa9b7c7 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig4.eps @@ -0,0 +1,1153 @@ +%!PS-Adobe-3.0 +%%Creator: Advanced Batch Converter +%%Title: +%%CreationDate: Mon Oct 25 17:14:32 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 594 841 +%%EndComments +%%BeginProlog +10 dict begin +%%EndProlog +%%Page: 1 1 +0 842 translate +594 -677 scale +268 305 8 +[ 268 0 0 305 0 0 ] +/rstr 268 string def +/gstr 268 string def +/bstr 268 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 56049 ASCII Bytes +colorimage +JcC<$p&BO~> +JcC<$p&BO~> +JcC<$p&BO~> +JcC<$p&BO~> +JcC<$p&BO~> +JcC<$p&BO~> +r;Zn4l2U_^!N5tDs8E#us8N)rrrE-"g])g)nc8IbJ5~> +r;Zn4l2U_^!N5tDs8E#us8N)rrrE-"g])g)nc8IbJ5~> +r;Zn4l2U_^!N5tDs8E#us8N)rrrE-"g])g)nc8IbJ5~> +!WN-&!9!p:s8Ds!N3`K0rrE-"s8N*"s4%)J!.k1HrrE-"rr3!!s7u\F~> +!WN-&!9!p:s8Ds!N3`K0rrE-"s8N*"s4%)J!.k1HrrE-"rr3!!s7u\F~> +!WN-&!9!p:s8Ds!N3`K0rrE-"s8N*"s4%)J!.k1HrrE-"rr3!!s7u\F~> +!WN-$!<3$"!<<#t"4.&;s3UcH!<<*!! +!WN-$!<3$"!<<#t"4.&;s3UcH!<<*!! +!WN-$!<3$"!<<#t"4.&;s3UcH!<<*!! +!WN-&!<3$ns8Ds"klAd(d/O+Hs8W*"!<:[N! +!WN-&!<3$ns8Ds"klAd(d/O+Hs8W*"!<:[N! +!WN-&!<3$ns8Ds"klAd(d/O+Hs8W*"!<:[N! +!WN-&!9!pks8;lu!0$s)rrE-"s8N*"s82fs!<<*!! +!WN-&!9!pks8;lu!0$s)rrE-"s8N*"s82fs!<<*!! +!WN-&!9!pks8;lu!0$s)rrE-"s8N*"s82fs!<<*!! +!WN0"!!.KIqu6]t:&iQ>!s&?$s82ir!<<'$!<3'!rr3!!s8W*$!<3'!nc&Uis8Dus!.hoX^]"61 +s*t~> +!WN0"!!.KIqu6]t:&iQ>!s&?$s82ir!<<'$!<3'!rr3!!s8W*$!<3'!nc&Uis8Dus!.hoX^]"61 +s*t~> +!WN0"!!.KIqu6]t:&iQ>!s&?$s82ir!<<'$!<3'!rr3!!s8W*$!<3'!nc&Uis8Dus!.hoX^]"61 +s*t~> +!WN-&!<7GEs8;os!7(TH!<3'!qYpQrrrN-"rrE#t!MB!!<0# +s8;nI~> +!WN-&!<7GEs8;os!7(TH!<3'!qYpQrrrN-"rrE#t!MB!!<0# +s8;nI~> +!WN-&!<7GEs8;os!7(TH!<3'!qYpQrrrN-"rrE#t!MB!!<0# +s8;nI~> +!WN-#!<3-#!<;usrrC@E!s&?$s8)`r!<3-#!<;rr!W`6#!s&?$s7H?k!<3#q!.hoZ^B4K9!<3-# +!<;usJG~> +!WN-#!<3-#!<;usrrC@E!s&?$s8)`r!<3-#!<;rr!W`6#!s&?$s7H?k!<3#q!.hoZ^B4K9!<3-# +!<;usJG~> +!WN-#!<3-#!<;usrrC@E!s&?$s8)`r!<3-#!<;rr!W`6#!s&?$s7H?k!<3#q!.hoZ^B4K9!<3-# +!<;usJG~> +!WN-#!<3-#!<;us!WYspci4(IrrE)qrrE-"!ri9#qu6d!rrE'!! +!WN-#!<3-#!<;us!WYspci4(IrrE)qrrE-"!ri9#qu6d!rrE'!! +!WN-#!<3-#!<;us!WYspci4(IrrE)qrrE-"!ri9#qu6d!rrE'!! +!WN-&!<9a$s8;lu!0$s'rrE-"q>UHqrri?%rrE)ts8N*!rrE-"p&>$mrrN-"q>c)]pV-e1rrE)u +rrE-"r;V<~> +!WN-&!<9a$s8;lu!0$s'rrE-"q>UHqrri?%rrE)ts8N*!rrE-"p&>$mrrN-"q>c)]pV-e1rrE)u +rrE-"r;V<~> +!WN-&!<9a$s8;lu!0$s'rrE-"q>UHqrri?%rrE)ts8N*!rrE-"p&>$mrrN-"q>c)]pV-e1rrE)u +rrE-"r;V<~> +r;ZkWs8;m!klAd(cMmnFs8)cp!<<*!!;lcs!<3-#!<;cm!W`6#p],l[pqQe.!rn\gs8N*"s8;nI +~> +r;ZkWs8;m!klAd(cMmnFs8)cp!<<*!!;lcs!<3-#!<;cm!W`6#p],l[pqQe.!rn\gs8N*"s8;nI +~> +r;ZkWs8;m!klAd(cMmnFs8)cp!<<*!!;lcs!<3-#!<;cm!W`6#p],l[pqQe.!rn\gs8N*"s8;nI +~> +pAY6J!:^#fs7HAC^\GSD!<)rtR0*Bgs8;nI~> +pAY6J!:^#fs7HAC^\GSD!<)rtR0*Bgs8;nI~> +pAY6J!:^#fs7HAC^\GSD!<)rtR0*Bgs8;nI~> +pAY2QZN$s)oDjHWq7ln/qYpVb!<;usJG~> +pAY2QZN$s)oDjHWq7ln/qYpVb!<;usJG~> +pAY2QZN$s)oDjHWq7ln/qYpVb!<;usJG~> +pAY/ks/Q+j!.ho]^B4K9!<;oq!gs&gr;V:~> +pAY/ks/Q+j!.ho]^B4K9!<;oq!gs&gr;V:~> +pAY/ks/Q+j!.ho]^B4K9!<;oq!gs&gr;V:~> +TE"H^J\V&r"9AH%RK**_! +TE"H^J\V&r"9AH%RK**_! +TE"H^J\V&r"9AH%RK**_! +TE"K_J\V&r!s&?$rrW4gs8)`r!<;usJH~> +TE"K_J\V&r!s&?$rrW4gs8)`r!<;usJH~> +TE"K_J\V&r!s&?$rrW4gs8)`r!<;usJH~> +T`5#mrrN-"pAfcZqS3"0rVuncqu6Zss8;nI~> +T`5#mrrN-"pAfcZqS3"0rVuncqu6Zss8;nI~> +T`5#mrrN-"pAfcZqS3"0rVuncqu6Zss8;nI~> +UAt5nrVuTlJ\V,trW)iqs-`ca! +UAt5nrVuTlJ\V,trW)iqs-`ca! +UAt5nrVuTlJ\V,trW)iqs-`ca! +U]1>ps8;ol!.ho_^B4K9!<;lp!L`udrrE-"r;V<~> +U]1>ps8;ol!.ho_^B4K9!<;lp!L`udrrE-"r;V<~> +U]1>ps8;ol!.ho_^B4K9!<;lp!L`udrrE-"r;V<~> +V#LGqs8;ol!.ho_^B=Q:!1El^rrJPfrr3!!s8;nI~> +V#LGqs8;ol!.ho_^B=Q:!1El^rrJPfrr3!!s8;nI~> +V#LGqs8;ol!.ho_^B=Q:!1El^rrJPfrr3!!s8;nI~> +V>gPrs8;oq!!0h7r;_D`rP&F7rrE'"s-WnUs7uZqRK* +V>gPrs8;oq!!0h7r;_D`rP&F7rrE'"s-WnUs7uZqRK* +V>gPrs8;oq!!0h7r;_D`rP&F7rrE'"s-WnUs7uZqRK* +VZ-Yss8;oq!<0b4!.ho`^]"64s8SM^rrJPfs8N*"s8;nI~> +VZ-Yss8;oq!<0b4!.ho`^]"64s8SM^rrJPfs8N*"s8;nI~> +VZ-Yss8;oq!<0b4!.ho`^]"64s8SM^rrJPfs8N*"s8;nI~> +W;lktqu?Tpr4`74^Oa0!^]+<1rrJPfq>^J_!ri9#r;V:~> +W;lktqu?Tpr4`74^Oa0!^]+<1rrJPfq>^J_!ri9#r;V:~> +W;lktqu?Tpr4`74^Oa0!^]+<1rrJPfq>^J_!ri9#r;V:~> +WW)u!s8;op!.ho[^]"6.s8SM^rrSSgs8;nI~> +WW)u!s8;op!.ho[^]"6.s8SM^rrSSgs8;nI~> +WW)u!s8;op!.ho[^]"6.s8SM^rrSSgs8;nI~> +WrE)"s8;op!.ho[^B=Q:!1El_s8SM^rrSSgs8;nI~> +WrE)"s8;op!.ho[^B=Q:!1El_s8SM^rrSSgs8;nI~> +WrE)"s8;op!.ho[^B=Q:!1El_s8SM^rrSSgs8;nI~> +X8`2#s8;oq!.hoZ^B4K9!<3-#RK*'^!L`u`rrE-"r;V:~> +X8`2#s8;oq!.hoZ^B4K9!<3-#RK*'^!L`u`rrE-"r;V:~> +X8`2#s8;oq!.hoZ^B4K9!<3-#RK*'^!L`u`rrE-"r;V:~> +XT&;$s8;oq!.hoZ^B4K9!<<&u!L`u_rrJPfqYpQrs8;nI~> +XT&;$s8;oq!.hoZ^B4K9!<<&u!L`u_rrJPfqYpQrs8;nI~> +XT&;$s8;oq!.hoZ^B4K9!<<&u!L`u_rrJPfqYpQrs8;nI~> +Y5eM%qu?TpJ\UrorW)iqs-`Z^s-`ca! +Y5eM%qu?TpJ\UrorW)iqs-`Z^s-`ca! +Y5eM%qu?TpJ\UrorW)iqs-`Z^s-`ca! +YQ"V's8;op!:@N)B`MkS!5JNJs':u+rW)cos-`Z^s-`ca! +YQ"V's8;op!:@N)B`MkS!5JNJs':u+rW)cos-`Z^s-`ca! +YQ"V's8;op!:@N)B`MkS!5JNJs':u+rW)cos-`Z^s-`ca! +Yl=_(s8;op!:@N*I/oeE:&r'.^].T,^B4K9!1 +Yl=_(s8;op!:@N*I/oeE:&r'.^].T,^B4K9!1 +Yl=_(s8;op!:@N*I/oeE:&r'.^].T,^B4K9!1 +Z2Xh)s8;oq!:.B$3WQns^RP;=PeR;#rrE*!rrJPfq>UJ`s7lTpRK*9d! +Z2Xh)s8;oq!:.B$3WQns^RP;=PeR;#rrE*!rrJPfq>UJ`s7lTpRK*9d! +Z2Xh)s8;oq!:.B$3WQns^RP;=PeR;#rrE*!rrJPfq>UJ`s7lTpRK*9d! +ZMsq*s8;oq!:%?!!!0IA!l"`Ms1eO5rkJF4",-`?^\tnLI/nu9rP&E@:&t7nrkJF4!f^p/rP&J` +!)B]3rkJF4#+P[YK`ICQe\;1drrE)trrJPfq>^J_q#:A_s8W*"!<;usJ3~> +ZMsq*s8;oq!:%?!!!0IA!l"`Ms1eO5rkJF4",-`?^\tnLI/nu9rP&E@:&t7nrkJF4!f^p/rP&J` +!)B]3rkJF4#+P[YK`ICQe\;1drrE)trrJPfq>^J_q#:A_s8W*"!<;usJ3~> +ZMsq*s8;oq!:%?!!!0IA!l"`Ms1eO5rkJF4",-`?^\tnLI/nu9rP&E@:&t7nrkJF4!f^p/rP&J` +!)B]3rkJF4#+P[YK`ICQe\;1drrE)trrJPfq>^J_q#:A_s8W*"!<;usJ3~> +Zi:%+s8;oq!9q6#B`MGRqnN.2rP/@4"/5cj^](tOS,f8`SA5'<"`j[B!.DW\^]+98S,g>'^BJ\Q +XoM53rP/@4!hoZU"$-EW^Xg1!!;lcsRK**_s-`Z^!L`ufrrE-"r;V<~> +Zi:%+s8;oq!9q6#B`MGRqnN.2rP/@4"/5cj^](tOS,f8`SA5'<"`j[B!.DW\^]+98S,g>'^BJ\Q +XoM53rP/@4!hoZU"$-EW^Xg1!!;lcsRK**_s-`Z^!L`ufrrE-"r;V<~> +Zi:%+s8;oq!9q6#B`MGRqnN.2rP/@4"/5cj^](tOS,f8`SA5'<"`j[B!.DW\^]+98S,g>'^BJ\Q +XoM53rP/@4!hoZU"$-EW^Xg1!!;lcsRK**_s-`Z^!L`ufrrE-"r;V<~> +[K$7,qu?Tpke@;.3WM4D^\tqI!<'\4!!0h7!^J_!ri9#r;V9~> +[K$7,qu?Tpke@;.3WM4D^\tqI!<'\4!!0h7!^J_!ri9#r;V9~> +[K$7,qu?Tpke@;.3WM4D^\tqI!<'\4!!0h7!^J_!ri9#r;V9~> +[f6@.s8;op!9Lru>lZpg^])"J!<'\4!!0h7! +[f6@.s8;op!9Lru>lZpg^])"J!<'\4!!0h7! +[f6@.s8;op!9Lru>lZpg^])"J!<'\4!!0h7! +\,QI/s8;oq!9Lrr!5AZO>l\0FrkJI5rP/@4!P\U8!5JNJrr<)7!!*)7rkAVX!2omG^\tqI!;XA1 +K`D,R^\tqI!!0h7!W]t8! +\,QI/s8;oq!9Lrr!5AZO>l\0FrkJI5rP/@4!P\U8!5JNJrr<)7!!*)7rkAVX!2omG^\tqI!;XA1 +K`D,R^\tqI!!0h7!W]t8! +\,QI/s8;oq!9Lrr!5AZO>l\0FrkJI5rP/@4!P\U8!5JNJrr<)7!!*)7rkAVX!2omG^\tqI!;XA1 +K`D,R^\tqI!!0h7!W]t8! +\GlR0s8;oq!9Clt!3!Z>!!*)7rkJI5rP/@4!P\U8!5JNJrr<)7!!*)7rkAK:!!3.7^\kkH!;jM5 +Xu`'Q! +\GlR0s8;oq!9Clt!3!Z>!!*)7rkJI5rP/@4!P\U8!5JNJrr<)7!!*)7rkAK:!!3.7^\kkH!;jM5 +Xu`'Q! +\GlR0s8;oq!9Clt!3!Z>!!*)7rkJI5rP/@4!P\U8!5JNJrr<)7!!*)7rkAK:!!3.7^\kkH!;jM5 +Xu`'Q! +\c2[1s8;oq!9:fq!/8/i^Aq$DrkJI5rP/@4!P\U8!5JNJ"_dtO!,94I^B0D%^\Y_F!;jM5B`PmJ +! +\c2[1s8;oq!9:fq!/8/i^Aq$DrkJI5rP/@4!P\U8!5JNJ"_dtO!,94I^B0D%^\Y_F!;jM5B`PmJ +! +\c2[1s8;oq!9:fq!/8/i^Aq$DrkJI5rP/@4!P\U8!5JNJ"_dtO!,94I^B0D%^\Y_F!;jM5B`PmJ +! +]Dqm2qu?TpikGZt3j,C]NPGJ-rrE#4rr<)&!!*)7rkAW,!2om_^](tK3WT0[!aVtDrkJI5qnN.2 +!MTPp!5JKIrr<)7!!3/8!!*)7h7rphq#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +]Dqm2qu?TpikGZt3j,C]NPGJ-rrE#4rr<)&!!*)7rkAW,!2om_^](tK3WT0[!aVtDrkJI5qnN.2 +!MTPp!5JKIrr<)7!!3/8!!*)7h7rphq#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +]Dqm2qu?TpikGZt3j,C]NPGJ-rrE#4rr<)&!!*)7rkAW,!2om_^](tK3WT0[!aVtDrkJI5qnN.2 +!MTPp!5JKIrr<)7!!3/8!!*)7h7rphq#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +]`/!4s8;op!9(Zr!3UACBtsY^r;cl4q>gK/"*4H`^\tnJ3WT-Z!F +]`/!4s8;op!9(Zr!3UACBtsY^r;cl4q>gK/"*4H`^\tnJ3WT-Z!F +]`/!4s8;op!9(Zr!3UACBtsY^r;cl4q>gK/"*4H`^\tnJ3WT-Z!F +^&J*5s8;op!5?2KPlUa__7p'PrrE*!rrJPfq>^J_q#:A_s7lTpRK*6c! +^&J*5s8;op!5?2KPlUa__7p'PrrE*!rrJPfq>^J_q#:A_s7lTpRK*6c! +^&J*5s8;op!5?2KPlUa__7p'PrrE*!rrJPfq>^J_q#:A_s7lTpRK*6c! +^Ae36s8;oq!5-&J:9M>6^TKW4_nQ9RrrE)trrJPfq#:A_s7uZqRK*'^!L`uerrE-"r;V:~> +^Ae36s8;oq!5-&J:9M>6^TKW4_nQ9RrrE)trrJPfq#:A_s7uZqRK*'^!L`uerrE-"r;V:~> +^Ae36s8;oq!5-&J:9M>6^TKW4_nQ9RrrE)trrJPfq#:A_s7uZqRK*'^!L`uerrE-"r;V:~> +^]+<7s8;oq!5#uI3iKdq^QjMf`4lBSrrE)rs8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +^]+<7s8;oq!5#uI3iKdq^QjMf`4lBSrrE)rs8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +^]+<7s8;oq!5#uI3iKdq^QjMf`4lBSrrE)rs8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +_>jN8qu?Tp]"\EC>lZp6^Vmnd!;HKoRK**_!L`u_rrJPfq>^J_!ri9#r;V9~> +_>jN8qu?Tp]"\EC>lZp6^Vmnd!;HKoRK**_!L`u_rrJPfq>^J_!ri9#r;V9~> +_>jN8qu?Tp]"\EC>lZp6^Vmnd!;HKoRK**_!L`u_rrJPfq>^J_!ri9#r;V9~> +_Z'W:s8;op!.hoZ^]+<6s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +_Z'W:s8;op!.hoZ^]+<6s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +_Z'W:s8;op!.hoZ^]+<6s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +_uB`;s8;op!.ho[^]"64s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +_uB`;s8;op!.ho[^]"64s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +_uB`;s8;op!.ho[^]"64s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +`;]iUJ`s7lTpRK**_! +`;]iUJ`s7lTpRK**_! +`;]iUJ`s7lTpRK**_! +`W#r=s8;oq!.hoZ^B4K9!<;oq!L`u_rrJPfq>UJ`s7lTpRK*-`! +`W#r=s8;oq!.hoZ^B4K9!<;oq!L`u_rrJPfq>UJ`s7lTpRK*-`! +`W#r=s8;oq!.hoZ^B4K9!<;oq!L`u_rrJPfq>UJ`s7lTpRK*-`! +a8c/>qu?TpJ\Uro"9AH%RK**_s-`Z^!L`u`s8SM^s8SMarrE-"r;V<~> +a8c/>qu?TpJ\Uro"9AH%RK**_s-`Z^!L`u`s8SM^s8SMarrE-"r;V<~> +a8c/>qu?TpJ\Uro"9AH%RK**_s-`Z^!L`u`s8SM^s8SMarrE-"r;V<~> +aSu8@s82ip!.hoZ^]"65RJ?g^RJ?d_RK**_s-`Z^s-`ca! +aSu8@s82ip!.hoZ^]"65RJ?g^RJ?d_RK**_s-`Z^s-`ca! +aSu8@s82ip!.hoZ^]"65RJ?g^RJ?d_RK**_s-`Z^s-`ca! +ao;AAs8;op!.hoZ^]+<4rrJPfq#:A_s7u]pRJ?d_RK*'^!L`udrrE-"r;V9~> +ao;AAs8;op!.hoZ^]+<4rrJPfq#:A_s7u]pRJ?d_RK*'^!L`udrrE-"r;V9~> +ao;AAs8;op!.hoZ^]+<4rrJPfq#:A_s7u]pRJ?d_RK*'^!L`udrrE-"r;V9~> +b5VJBs8;oq!.hoZ^]"61rrJPfq#:A_s7lTpRK**_!L`u_rrJPfrr3!!s8;nI~> +b5VJBs8;oq!.hoZ^]"61rrJPfq#:A_s7lTpRK**_!L`u_rrJPfrr3!!s8;nI~> +b5VJBs8;oq!.hoZ^]"61rrJPfq#:A_s7lTpRK**_!L`u_rrJPfrr3!!s8;nI~> +bPqSCs8;oq!.hoZ^B4K9!<;oqs-`Z^s-`Z^!L`u`s8SM^rrJPfs8N*"s8;nI~> +bPqSCs8;oq!.hoZ^B4K9!<;oqs-`Z^s-`Z^!L`u`s8SM^rrJPfs8N*"s8;nI~> +bPqSCs8;oq!.hoZ^B4K9!<;oqs-`Z^s-`Z^!L`u`s8SM^rrJPfs8N*"s8;nI~> +c2[eDqu?TpJ\Uro!s&?$s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V:~> +c2[eDqu?TpJ\Uro!s&?$s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V:~> +c2[eDqu?TpJ\Uro!s&?$s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V:~> +cMmnFs82ip!.hoZ^]"37s-`o^rrJPfq#:A_s7uZqRK*'^!L`u`s8SJgrrE)ss+(~> +cMmnFs82ip!.hoZ^]"37s-`o^rrJPfq#:A_s7uZqRK*'^!L`u`s8SJgrrE)ss+(~> +cMmnFs82ip!.hoZ^]"37s-`o^rrJPfq#:A_s7uZqRK*'^!L`u`s8SJgrrE)ss+(~> +ci4"Gs8;op!.hoZ^]+<4s8SM^s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +ci4"Gs8;op!.hoZ^]+<4s8SM^s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +ci4"Gs8;op!.hoZ^]+<4s8SM^s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +d/O+Hs8;op!.ho[^]"62s8SM^s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +d/O+Hs8;op!.ho[^]"62s8SM^s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +d/O+Hs8;op!.ho[^]"62s8SM^s8SM^s8SM_s8SM^s8SM^rrSSgs8;nI~> +dJj4Is8;oq!.hoZ^B4K9!<;oq!L`u_rrJPfq#:A_s7uZqRK*'^!L`u`rrE-"r;V<~> +dJj4Is8;oq!.hoZ^B4K9!<;oq!L`u_rrJPfq#:A_s7uZqRK*'^!L`u`rrE-"r;V<~> +dJj4Is8;oq!.hoZ^B4K9!<;oq!L`u_rrJPfq#:A_s7uZqRK*'^!L`u`rrE-"r;V<~> +e,TFJqu?TpJ\Uro"9AH%RK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`uarrE-"r;V<~> +e,TFJqu?TpJ\Uro"9AH%RK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`uarrE-"r;V<~> +e,TFJqu?TpJ\Uro"9AH%RK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`uarrE-"r;V<~> +eGfOLs82ip!.hoZ^B4K9!<3-#RK**_s-`Z^s-`Z^!L`u`s8SM^s8SMarrE-"r;V<~> +eGfOLs82ip!.hoZ^B4K9!<3-#RK**_s-`Z^s-`Z^!L`u`s8SM^s8SMarrE-"r;V<~> +eGfOLs82ip!.hoZ^B4K9!<3-#RK**_s-`Z^s-`Z^!L`u`s8SM^s8SMarrE-"r;V<~> +ec,XMs8;op!.hoZ^]"64rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +ec,XMs8;op!.hoZ^]"64rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +ec,XMs8;op!.hoZ^]"64rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +f)GaNs8;op!0b1t!9_,s!;lfrRJ?d_RK*'^!L`u`s8SM^rrJPfq#:A_s8Dru!<;usJH~> +f)GaNs8;op!0b1t!9_,s!;lfrRJ?d_RK*'^!L`u`s8SM^rrJPfq#:A_s8Dru!<;usJH~> +f)GaNs8;op!0b1t!9_,s!;lfrRJ?d_RK*'^!L`u`s8SM^rrJPfq#:A_s8Dru!<;usJH~> +d/X%EP/$emm_A`$q#:A_s7uZqRK*'^!L`u_rrJPfq>UJ`s7lTpRK*9d! +d/X%EP/$emm_A`$q#:A_s7uZqRK*'^!L`u_rrJPfq>UJ`s7lTpRK*9d! +d/X%EP/$emm_A`$q#:A_s7uZqRK*'^!L`u_rrJPfq>UJ`s7lTpRK*9d! +fDbmPrrDlqOh^MgoY1J.rrAGfRK**_!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbmPrrDlqOh^MgoY1J.rrAGfRK**_!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbmPrrDlqOh^MgoY1J.rrAGfRK**_!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE'"rrE#uOMC8bq7d%4rrE(e!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE'"rrE#uOMC8bq7d%4rrE(e!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE'"rrE#uOMC8bq7d%4rrE(e!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbsRrrE'!JH59A!ri9#rr3"es7uZqRK*'^!L`u_rrJPfq>UJ`s7lTpRK**_s-Wrg!<;usJ,~> +fDbsRrrE'!JH59A!ri9#rr3"es7uZqRK*'^!L`u_rrJPfq>UJ`s7lTpRK**_s-Wrg!<;usJ,~> +fDbsRrrE'!JH59A!ri9#rr3"es7uZqRK*'^!L`u_rrJPfq>UJ`s7lTpRK**_s-Wrg!<;usJ,~> +fDbpQrrE'"rr@TMo)S[fs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE'"rr@TMo)S[fs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE'"rr@TMo)S[fs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE'"rr@TMo)S[fs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE'"rr@TMo)S[fs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE'"rr@TMo)S[fs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE(Ws5sCXrrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7uZq!<;usJ=~> +fDbpQrrE(Ws5sCXrrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7uZq!<;usJ=~> +fDbpQrrE(Ws5sCXrrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7uZq!<;usJ=~> +fDbpQrrE(Ws6'IWrrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8)`r!<;usJ=~> +fDbpQrrE(Ws6'IWrrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8)`r!<;usJ=~> +fDbpQrrE(Ws6'IWrrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8)`r!<;usJ=~> +fDbpQrrE(Ws6B[brrE+f!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +fDbpQrrE(Ws6B[brrE+f!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +fDbpQrrE(Ws6B[brrE+f!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJH~> +fDbpQrrE(Ws6p$errE-"!ri9#!rn\gq>^J_q#:A_s7lTpRK**_s-`Z^!L`u_rrJPfrVllus8;nI +~> +fDbpQrrE(Ws6p$errE-"!ri9#!rn\gq>^J_q#:A_s7lTpRK**_s-`Z^!L`u_rrJPfrVllus8;nI +~> +fDbpQrrE(Ws6p$errE-"!ri9#!rn\gq>^J_q#:A_s7lTpRK**_s-`Z^!L`u_rrJPfrVllus8;nI +~> +fDbpQrrE(Ws7?^J_q#:A_s7lTpRK**_s-`Z^!L`u_rrJPfrVllus8;nI +~> +fDbpQrrE(Ws7?^J_q#:A_s7lTpRK**_s-`Z^!L`u_rrJPfrVllus8;nI +~> +fDbpQrrE(Ws7?^J_q#:A_s7lTpRK**_s-`Z^!L`u_rrJPfrVllus8;nI +~> +fDbpQrrE(Ws7cTerrE-"!ri9#s8N+fs7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`uerrE-" +r;V<~> +fDbpQrrE(Ws7cTerrE-"!ri9#s8N+fs7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`uerrE-" +r;V<~> +fDbpQrrE(Ws7cTerrE-"!ri9#s8N+fs7lTpRK**_!L`u_rrJPfq#:A_s7uZqRK*'^!L`uerrE-" +r;V<~> +fDbpQrrE(Vs8;rfrrE-"!ri9#rr<"dq#:A_s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V<~> +fDbpQrrE(Vs8;rfrrE-"!ri9#rr<"dq#:A_s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V<~> +fDbpQrrE(Vs8;rfrrE-"!ri9#rr<"dq#:A_s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(rrrE-"e,KFKrrW3#R/r`Uq>UJ`s7u]pRJ?g^RJ?d_RK**_s-`Z^s-`ca! +fDbpQrrE(rrrE-"e,KFKrrW3#R/r`Uq>UJ`s7u]pRJ?g^RJ?d_RK**_s-`Z^s-`ca! +fDbpQrrE(rrrE-"e,KFKrrW3#R/r`Uq>UJ`s7u]pRJ?g^RJ?d_RK**_s-`Z^s-`ca! +fDbpQrrE(rrrE-"e,KFKrrW3#rrW4gs7u]pRJ?d_RK*'^!L`u`s8SM^rrJPfq#:A_s8Dru!<;us +JH~> +fDbpQrrE(rrrE-"e,KFKrrW3#rrW4gs7u]pRJ?d_RK*'^!L`u`s8SM^rrJPfq#:A_s8Dru!<;us +JH~> +fDbpQrrE(rrrE-"e,KFKrrW3#rrW4gs7u]pRJ?d_RK*'^!L`u`s8SM^rrJPfq#:A_s8Dru!<;us +JH~> +fDbpQrrE(rs8N)us8E#srrN3#!!**"rVufrrr3!!s8Ds!!<3$"!<;io!UJ`s7lTpRK*9d! +fDbpQrrE(rs8N)us8E#srrN3#!!**"rVufrrr3!!s8Ds!!<3$"!<;io!UJ`s7lTpRK*9d! +fDbpQrrE(rs8N)us8E#srrN3#!!**"rVufrrr3!!s8Ds!!<3$"!<;io!UJ`s7lTpRK*9d! +fDbpQrrE(rrrE-"rr3'#rrE*!s8E!"rrE)urrE-"!ri9#s8N0$rrE*!s8E!"rrE)orrE-"!ri9# +rr<"dq#:A_s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V9~> +fDbpQrrE(rrrE-"rr3'#rrE*!s8E!"rrE)urrE-"!ri9#s8N0$rrE*!s8E!"rrE)orrE-"!ri9# +rr<"dq#:A_s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V9~> +fDbpQrrE(rrrE-"rr3'#rrE*!s8E!"rrE)urrE-"!ri9#s8N0$rrE*!s8E!"rrE)orrE-"!ri9# +rr<"dq#:A_s7u]pRJ?g^RJ?d_RK**_s-`Z^!L`ufrrE-"r;V9~> +fDbpQrrE(rrrE-"rVultrVllurrW3#s8N$!!<3-#!<<*!rW)os! +fDbpQrrE(rrrE-"rVultrVllurrW3#s8N$!!<3-#!<<*!rW)os! +fDbpQrrE(rrrE-"rVultrVllurrW3#s8N$!!<3-#!<<*!rW)os! +fDbpQrrE(rrrE-"rr3'#rrE)urrE-"!ri9#rr3!!rrW3#s8W*"!<;us!UJ`s7lTpRK**_s-Wrg!<;usJH~> +fDbpQrrE(rrrE-"rr3'#rrE)urrE-"!ri9#rr3!!rrW3#s8W*"!<;us!UJ`s7lTpRK**_s-Wrg!<;usJH~> +fDbpQrrE(rrrE-"rr3'#rrE)urrE-"!ri9#rr3!!rrW3#s8W*"!<;us!UJ`s7lTpRK**_s-Wrg!<;usJH~> +fDbpQrrE(rrrE-"rr3'#rrE)urrE-"!ri9#rVultrVllus8;lt!<3-#!<;io! +fDbpQrrE(rrrE-"rr3'#rrE)urrE-"!ri9#rVultrVllus8;lt!<3-#!<;io! +fDbpQrrE(rrrE-"rr3'#rrE)urrE-"!ri9#rVultrVllus8;lt!<3-#!<;io! +fDbpQrrE(rrrW9$!<33%!<3'!rr3!!rrW3#s8N$!!<;us!s&?$s8N$!!<3-#!<;io! +fDbpQrrE(rrrW9$!<33%!<3'!rr3!!rrW3#s8N$!!<;us!s&?$s8N$!!<3-#!<;io! +fDbpQrrE(rrrW9$!<33%!<3'!rr3!!rrW3#s8N$!!<;us!s&?$s8N$!!<3-#!<;io! +fDbpQrrE(rs8N)us8;rts8E!!rr<'"s8W,s!<3#u!<3#t!!3*"!UJ`s7uZq +RK*'^!L`u_rrJPfq>UJ`s7lTpRK**_! +fDbpQrrE(rs8N)us8;rts8E!!rr<'"s8W,s!<3#u!<3#t!!3*"!UJ`s7uZq +RK*'^!L`u_rrJPfq>UJ`s7lTpRK**_! +fDbpQrrE(rs8N)us8;rts8E!!rr<'"s8W,s!<3#u!<3#t!!3*"!UJ`s7uZq +RK*'^!L`u_rrJPfq>UJ`s7lTpRK**_! +fDbpQrrE(^rrE-"s8N*"s6K[c!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQr +s8;nI~> +fDbpQrrE(^rrE-"s8N*"s6K[c!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQr +s8;nI~> +fDbpQrrE(^rrE-"s8N*"s6K[c!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQr +s8;nI~> +fDbpQrrE(^rrE-"s8N*"s6K[c!<3-#!1 +fDbpQrrE(^rrE-"s8N*"s6K[c!<3-#!1 +fDbpQrrE(^rrE-"s8N*"s6K[c!<3-#!1 +fDbpQrrE(]s8E#_rrE-"!ri7g!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJ,~> +fDbpQrrE(]s8E#_rrE-"!ri7g!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJ,~> +fDbpQrrE(]s8E#_rrE-"!ri7g!L`u`rrJPfq>^J_q#CA^q#:A_s7u]pRJ?g^RJ[!b!<;usJ,~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(lrrE-"q#:?ps5a1\!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_ +!ri9#r;V<~> +fDbpQrrE(lrrE-"q#:?ps5a1\!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_ +!ri9#r;V<~> +fDbpQrrE(lrrE-"q#:?ps5a1\!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_ +!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +JH~> +fDbpQrrE)[s8E!#^&PbG!W]q6r;ZeEV#LGqrrW3#s8N&uRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^ +rrJPfs8N*"s8;nI~> +fDbpQrrE)[s8E!#^&PbG!W]q6r;ZeEV#LGqrrW3#s8N&uRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^ +rrJPfs8N*"s8;nI~> +fDbpQrrE)[s8E!#^&PbG!W]q6r;ZeEV#LGqrrW3#s8N&uRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^ +rrJPfs8N*"s8;nI~> +fDbpQrrE)[rr]q7N;rqX!j\a(qu?\DV#LGqrrW3#s8N&uRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^ +rrJPfs8N*"s8;nI~> +fDbpQrrE)[rr]q7N;rqX!j\a(qu?\DV#LGqrrW3#s8N&uRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^ +rrJPfs8N*"s8;nI~> +fDbpQrrE)[rr]q7N;rqX!j\a(qu?\DV#LGqrrW3#s8N&uRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^ +rrJPfs8N*"s8;nI~> +fDbpQrrE)ZrrN0ps8W*"I/f]9!UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7u]p +R0*Bgs8;nI~> +fDbpQrrE)ZrrN0ps8W*"I/f]9!UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7u]p +R0*Bgs8;nI~> +fDbpQrrE)ZrrN0ps8W*"I/f]9!UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7u]p +R0*Bgs8;nI~> +fDbpQrrE)Zrr[WKiVruZB`Iu0rW)rt"0qocs8W*"i;ilX!WN-&!9!p:s8Ds!n7Vh$!<3#t!!9im +s8Ds#VZ:Dps8N&t!!^dMa0G]cs5EtY!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&g +r;V9~> +fDbpQrrE)Zrr[WKiVruZB`Iu0rW)rt"0qocs8W*"i;ilX!WN-&!9!p:s8Ds!n7Vh$!<3#t!!9im +s8Ds#VZ:Dps8N&t!!^dMa0G]cs5EtY!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&g +r;V9~> +fDbpQrrE)Zrr[WKiVruZB`Iu0rW)rt"0qocs8W*"i;ilX!WN-&!9!p:s8Ds!n7Vh$!<3#t!!9im +s8Ds#VZ:Dps8N&t!!^dMa0G]cs5EtY!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&g +r;V9~> +fDbpQrrE)Zrs$.:^&QHWs8)cq!<<'&f`9t2^&S-4$(:k"kl?\BB]9!irrnhki;feUrVult!mgrI +rr3.jg$&KMs8Dut!!:gR9`n)iB`I&k! +fDbpQrrE)Zrs$.:^&QHWs8)cq!<<'&f`9t2^&S-4$(:k"kl?\BB]9!irrnhki;feUrVult!mgrI +rr3.jg$&KMs8Dut!!:gR9`n)iB`I&k! +fDbpQrrE)Zrs$.:^&QHWs8)cq!<<'&f`9t2^&S-4$(:k"kl?\BB]9!irrnhki;feUrVult!mgrI +rr3.jg$&KMs8Dut!!:gR9`n)iB`I&k! +fDbpQrrE)Zrs%E^N;o@"s8)cq!<<'&RK3?fI/j6H#jD>:rr>dn!<;usrr<*"!!**"rVult!pP[D +rr3'#ZMsn*!<<#trr<*"!!3/Z!!**"iVroYrrW3#s7uZqRK**_!L`u_rrJPfq#:A_s7uZqRK*'^ +!L`u`rrE-"r;V9~> +fDbpQrrE)Zrs%E^N;o@"s8)cq!<<'&RK3?fI/j6H#jD>:rr>dn!<;usrr<*"!!**"rVult!pP[D +rr3'#ZMsn*!<<#trr<*"!!3/Z!!**"iVroYrrW3#s7uZqRK**_!L`u_rrJPfq#:A_s7uZqRK*'^ +!L`u`rrE-"r;V9~> +fDbpQrrE)Zrs%E^N;o@"s8)cq!<<'&RK3?fI/j6H#jD>:rr>dn!<;usrr<*"!!**"rVult!pP[D +rr3'#ZMsn*!<<#trr<*"!!3/Z!!**"iVroYrrW3#s7uZqRK**_!L`u_rrJPfq#:A_s7uZqRK*'^ +!L`u`rrE-"r;V9~> +fDbpQrrE)Ys8N'#s%WOhs8N*!s82lqrrYsqi;`r[a,L&rs8N'"rr<'"s8Dut!;lcuI(fO[! +fDbpQrrE)Ys8N'#s%WOhs8N*!s82lqrrYsqi;`r[a,L&rs8N'"rr<'"s8Dut!;lcuI(fO[! +fDbpQrrE)Ys8N'#s%WOhs8N*!s82lqrrYsqi;`r[a,L&rs8N'"rr<'"s8Dut!;lcuI(fO[! +fDbpQrrE)Yrre8\ZAehZs8N*!s8N)qrr\\iRK*EiN2Q^Rrrnhki;feUrVultq>UK$!!**"rVult +!WN-$!<3$"!<;$X!^J_q#CA^qu6Zss8;nI~> +fDbpQrrE)Yrre8\ZAehZs8N*!s8N)qrr\\iRK*EiN2Q^Rrrnhki;feUrVultq>UK$!!**"rVult +!WN-$!<3$"!<;$X!^J_q#CA^qu6Zss8;nI~> +fDbpQrrE)Yrre8\ZAehZs8N*!s8N)qrr\\iRK*EiN2Q^Rrrnhki;feUrVultq>UK$!!**"rVult +!WN-$!<3$"!<;$X!^J_q#CA^qu6Zss8;nI~> +fDbpQrrE)YrrKe5!W^:@q>^Hps8W*!qYpT:!!3.6!!3/6s8;ltkl:bbN;rhUrrDrr"6iP,!!**" +rVult!WN-$!<3$"!<;$X!^J_q#CA^qu6Zss8;nI +~> +fDbpQrrE)YrrKe5!W^:@q>^Hps8W*!qYpT:!!3.6!!3/6s8;ltkl:bbN;rhUrrDrr"6iP,!!**" +rVult!WN-$!<3$"!<;$X!^J_q#CA^qu6Zss8;nI +~> +fDbpQrrE)YrrKe5!W^:@q>^Hps8W*!qYpT:!!3.6!!3/6s8;ltkl:bbN;rhUrrDrr"6iP,!!**" +rVult!WN-$!<3$"!<;$X!^J_q#CA^qu6Zss8;nI +~> +fDbpQrrE)YrrM'Y!W_`iq>^Hps8N1K!9*tUrrM?a!W^7@!W_3Zr;Qi3nGi@brrDrr",m6[!!**" +rVult!WN-$!<3$"!<;$X! +fDbpQrrE)YrrM'Y!W_`iq>^Hps8N1K!9*tUrrM?a!W^7@!W_3Zr;Qi3nGi@brrDrr",m6[!!**" +rVult!WN-$!<3$"!<;$X! +fDbpQrrE)YrrM'Y!W_`iq>^Hps8N1K!9*tUrrM?a!W^7@!W_3Zr;Qi3nGi@brrDrr",m6[!!**" +rVult!WN-$!<3$"!<;$X! +fDbpQrrE)XrrPo.s7lWo!<<'&]`>@sN;rkV"&/dq!!**"qu6[k!<3$#I-L\1s8N)rs8N'"f`2$Q +s8Dut!!3*"!W`6#! +fDbpQrrE)XrrPo.s7lWo!<<'&]`>@sN;rkV"&/dq!!**"qu6[k!<3$#I-L\1s8N)rs8N'"f`2$Q +s8Dut!!3*"!W`6#! +fDbpQrrE)XrrPo.s7lWo!<<'&]`>@sN;rkV"&/dq!!**"qu6[k!<3$#I-L\1s8N)rs8N'"f`2$Q +s8Dut!!3*"!W`6#! +fDbpQrrE)XrrSXps7u]n!<<'%RK/<9s8Ds$RZ.8o:&k+j!DNRn!!.KIs8W#tr;Qti:!e7fVuQes +pAj1P!^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE)XrrSXps7u]n!<<'%RK/<9s8Ds$RZ.8o:&k+j!DNRn!!.KIs8W#tr;Qti:!e7fVuQes +pAj1P!^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE)XrrSXps7u]n!<<'%RK/<9s8Ds$RZ.8o:&k+j!DNRn!!.KIs8W#tr;Qti:!e7fVuQes +pAj1P!^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE)2rrL.?r;a_7!^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE)2rrL.?r;a_7!^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE)2rrL.?r;a_7!^J_q#CA^q#:A_s7u]pRJ?d_RK* +fDbpQrrE)2rrQlurr`;c:&i-2!UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7u]p +R0*Bgs8;nI~> +fDbpQrrE)2rrQlurr`;c:&i-2!UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7u]p +R0*Bgs8;nI~> +fDbpQrrE)2rrQlurr`;c:&i-2!UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s7u]p +R0*Bgs8;nI~> +fDbpQrrE)2rrPpRrr`;AZN%iB! +fDbpQrrE)2rrPpRrr`;AZN%iB! +fDbpQrrE)2rrPpRrr`;AZN%iB! +fDbpQrrE)2rrq)'!)9Bk_Z'W:rrW3#s82irRJHm_RJ?g^RJ?g^RJHm_RJ?g^RJ?d`R/m9bs+(~> +fDbpQrrE)2rrq)'!)9Bk_Z'W:rrW3#s82irRJHm_RJ?g^RJ?g^RJHm_RJ?g^RJ?d`R/m9bs+(~> +fDbpQrrE)2rrq)'!)9Bk_Z'W:rrW3#s82irRJHm_RJ?g^RJ?g^RJHm_RJ?g^RJ?d`R/m9bs+(~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +J-~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +J-~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +J-~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +J-~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +J-~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:A_s8N$!!<;us +J-~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q#:A_s8W*"!<;usJH~> +fDbpQrrE(Ms7ZKk!<)rtRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^rrJPfs8N*"s8;nI~> +fDbpQrrE(Ms7ZKk!<)rtRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^rrJPfs8N*"s8;nI~> +fDbpQrrE(Ms7ZKk!<)rtRJ?d_RK**_s-`Z^s-`Z^!L`u`s8SM^rrJPfs8N*"s8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>^J_!ri9#r;V<~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`Z^!gs&gr;V;~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfq>UHqs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfqYpQrs8;nI~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK* +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK* +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK* +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK!?g!<;lpJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK!?g!<;lpJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:A_s7lTpRK!?g!<;lpJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:D`!<;ioJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:D`!<;ioJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrJPfq#:D`!<;ioJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q>UHqs7cPD~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q>UHqs7cPD~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfq>^J_q>UHqs7cPD~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfrVultp&BR~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfrVultp&BR~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrJPfrVultp&BR~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`oe! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`oe! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-`oe! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<;ZjJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<;ZjJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-`Z^s-Wrg!<;ZjJ:~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrE-"o)F4~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrE-"o)F4~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK**_!L`u_rrE-"o)F4~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`uarrE-"nc++~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`uarrE-"nc++~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK**_!L`uarrE-"nc++~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:GarrE)ds+#~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:GarrE)ds+#~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>^J_q#:GarrE)ds+#~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrE-"m/MS~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrE-"m/MS~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*'^!L`u`rrE-"m/MS~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfqu6Zss6K]8~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfqu6Zss6K]8~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfqu6Zss6K]8~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfr;Qcts6BW7~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfr;Qcts6BW7~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SM^rrJPfr;Qcts6BW7~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`ufs8N)_s+#~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`ufs8N)_s+#~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpRK**_!L`ufs8N)_s+#~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-Wlfs6'E4~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-Wlfs6'E4~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_s-Wlfs6'E4~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_!gs&gk5Ts~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_!gs&gk5Ts~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`Z^s-`]_!gs&gk5Ts~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK*0a! +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK*0a! +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s7lTpRK*0a! +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s7lTpRK*6c! +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>UHqs5 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>UHqs5 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`u_rrJPfq>UHqs5 +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*0a! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*0a! +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s7lTpRK*0a! +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SMcrrE-"hZ&,~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SMcrrE-"hZ&,~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SMcrrE-"hZ&,~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SMdrrE-"h>`#~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SMdrrE-"h>`#~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SM^s8SMdrrE-"h>`#~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpR/d6fs4mX)~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpR/d6fs4mX)~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:A_s7lTpR/d6fs4mX)~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`]_! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`]_! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-`]_! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-```! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-```! +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-`Z^s-```! +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s8Dru!<:^OJD~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s8Dru!<:^OJD~> +fDbpQrrE(Ms7ZHn!<3-#!<;lp!L`u`rrJPfq#:A_s8Dru!<:^OJD~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s8W*"!<:[NJD~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s8W*"!<:[NJD~> +fDbpQrrE(Ms7ZHn!<3-#!<;io!L`u`rrJPfq#:A_s8W*"!<:[NJD~> +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!1 +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`uas8N)Ks+(~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`uas8N)Ks+(~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`uas8N)Ks+(~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`ubrrE-"e,Or~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`ubrrE-"e,Or~> +fDbpQrrE(Ms7ZHn!<3-#!<3-#RK**_s-`Z^!L`ubrrE-"e,Or~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s8Dru!<:LIJD~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s8Dru!<:LIJD~> +fDbpQrrE(Ms7ZHn!<3-#!<<*!!L`u_rrJPfq>UJ`s8Dru!<:LIJD~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SMerrE-"dJna~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SMerrE-"dJna~> +fDbpQrrE(Ms7ZHn!<3-#!<<&us-`Z^!L`u`s8SMerrE-"dJna~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:D`!<:FGJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:D`!<:FGJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;us!L`u`rrJPfq#:D`!<:FGJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-```rrC@EJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-```rrC@EJH~> +fDbpQrrE(Ms7ZHn!<3-#!<;rrs-`]_s-```rrC@EJH~> +ec,XMs+14DrrE-"!ri9#qu?\aq>^J_qu6Zss3:Ro~> +ec,XMs+14DrrE-"!ri9#qu?\aq>^J_qu6Zss3:Ro~> +ec,XMs+14DrrE-"!ri9#qu?\aq>^J_qu6Zss3:Ro~> +ec,XMs+14DrrE-"!ri9#q>UJ`s7uZqRK*9d! +ec,XMs+14DrrE-"!ri9#q>UJ`s7uZqRK*9d! +ec,XMs+14DrrE-"!ri9#q>UJ`s7uZqRK*9d! +ec,XMs+14DrrE-"!ri9#q#:A_s7uZqRK!?g!<:7BJ:~> +ec,XMs+14DrrE-"!ri9#q#:A_s7uZqRK!?g!<:7BJ:~> +ec,XMs+14DrrE-"!ri9#q#:A_s7uZqRK!?g!<:7BJ:~> +gAgaEJcG]K! +gAgaEJcG]K! +gAgaEJcG]K! +gAgaEJcG]K! +gAgaEJcG]K! +gAgaEJcG]K! +gAgaEJcG]K!s+#~> +gAgaEJcG]K!s+#~> +gAgaEJcG]K!s+#~> +g&L[EJcG]K! +g&L[EJcG]K! +g&L[EJcG]K! +g&L^FJcGZJ! +g&L^FJcGZJ! +g&L^FJcGZJ! +nc&Uis7cNo!<;fno`0RCr;QctrrW3#s8N&uRJ?d`R/m9*s+#~> +nc&Uis7cNo!<;fno`0RCr;QctrrW3#s8N&uRJ?d`R/m9*s+#~> +nc&Uis7cNo!<;fno`0RCr;QctrrW3#s8N&uRJ?d`R/m9*s+#~> +k5YG]pAadcJcGZJ! +k5YG]pAadcJcGZJ! +k5YG]pAadcJcGZJ! +jo5>]s7ZKe!.k1IrrE-"!ri9#qu?\ar;Qcts2+ed~> +jo5>]s7ZKe!.k1IrrE-"!ri9#qu?\ar;Qcts2+ed~> +jo5>]s7ZKe!.k1IrrE-"!ri9#qu?\ar;Qcts2+ed~> +jo5>]s7ZKe!.k1IrrE-"!ri9#qu?\arr;uu_#Jq~> +jo5>]s7ZKe!.k1IrrE-"!ri9#qu?\arr;uu_#Jq~> +jo5>]s7ZKe!.k1IrrE-"!ri9#qu?\arr;uu_#Jq~> +rW)osrr<*"!!**"rr3!!rrN-"rrDrr! +rW)osrr<*"!!**"rr3!!rrN-"rrDrr! +rW)osrr<*"!!**"rr3!!rrN-"rrDrr! +!s&?$s8Ds"!<3'!rr;uus8N0$rrE)srrE-"p&FdeJcGWIrr<-#!<;io! +!s&?$s8Ds"!<3'!rr;uus8N0$rrE)srrE-"p&FdeJcGWIrr<-#!<;io! +!s&?$s8Ds"!<3'!rr;uus8N0$rrE)srrE-"p&FdeJcGWIrr<-#!<;io! +!WN-#!<<#trrDrr! +!WN-#!<<#trrDrr! +!WN-#!<<#trrDrr! +!s&?$s8;lt!<;us! +!s&?$s8;lt!<;us! +!s&?$s8;lt!<;us! +!s&?$s8Ds"!<3'!rVllurri?%rrE)srrE-"p&FgfJcGTH! +!s&?$s8Ds"!<3'!rVllurri?%rrE)srrE-"p&FgfJcGTH! +!s&?$s8Ds"!<3'!rVllurri?%rrE)srrE-"p&FgfJcGTH! +!s&?$s8N$!!<3-#!<<#t!UHqrrW3#s8W*$RK!9e\c73~> +!s&?$s8N$!!<3-#!<<#t!UHqrrW3#s8W*$RK!9e\c73~> +!s&?$s8N$!!<3-#!<<#t!UHqrrW3#s8W*$RK!9e\c73~> +r;cisrr<*"!!**"s8W&u!WN0!!<)rs!;- +r;cisrr<*"!!**"s8W&u!WN0!!<)rs!;- +r;cisrr<*"!!**"s8W&u!WN0!!<)rs!;- +f)PUIJcGQG! +f)PUIJcGQG! +f)PUIJcGQG! +ec11#o)Sgj! +ec11#o)Sgj! +ec11#o)Sgj! +ec5RJJcGEC!s&?$s0_lW~> +ec5RJJcGEC!s&?$s0_lW~> +ec5RJJcGEC!s&?$s0_lW~> +ec5RJJcGECrrBD*J@~> +ec5RJJcGECrrBD*J@~> +ec5RJJcGECrrBD*J@~> +ec5RJJcDSHJ,~> +ec5RJJcDSHJ,~> +ec5RJJcDSHJ,~> +eGoOKJcDPGJ,~> +eGoOKJcDPGJ,~> +eGoOKJcDPGJ,~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +^]495"24`J!!3/6s8DutI*2Kg!.k0#~> +^]495"24`J!!3/6s8DutI*2Kg!.k0#~> +^]495"24`J!!3/6s8DutI*2Kg!.k0#~> +^]+DL!0$sXrrTL(s8;osI*)Eg!.k0#~> +^]+DL!0$sXrrTL(s8;osI*)Eg!.k0#~> +^]+DL!0$sXrrTL(s8;osI*)Eg!.k0#~> +^Ae67:&k7n!IXp`s8N(Ms+(~> +^Ae67:&k7n!IXp`s8N(Ms+(~> +^Ae67:&k7n!IXp`s8N(Ms+(~> +^Ae:_!9*qZs(MH1s8E#srr]P,N;itZi;ilX!WN-&!9!p:s7lWn!!^dMa0G]cs82fuVZ=%&r;Qh3 +VZ6_ts8;m!Z2fj`MuS>~> +^Ae:_!9*qZs(MH1s8E#srr]P,N;itZi;ilX!WN-&!9!p:s7lWn!!^dMa0G]cs82fuVZ=%&r;Qh3 +VZ6_ts8;m!Z2fj`MuS>~> +^Ae:_!9*qZs(MH1s8E#srr]P,N;itZi;ilX!WN-&!9!p:s7lWn!!^dMa0G]cs82fuVZ=%&r;Qh3 +VZ6_ts8;m!Z2fj`MuS>~> +^AeDN!58EZVuQYorrE&u"k`n7!58C>s-`qnkl?\BB]9!cs8N'#f`4_K9`Sl,r;QrI!8.A!s8N$# +Z2iPX! +^AeDN!58EZVuQYorrE&u"k`n7!58C>s-`qnkl?\BB]9!cs8N'#f`4_K9`Sl,r;QrI!8.A!s8N$# +Z2iPX! +^AeDN!58EZVuQYorrE&u"k`n7!58C>s-`qnkl?\BB]9!cs8N'#f`4_K9`Sl,r;QrI!8.A!s8N$# +Z2iPX! +^AeDr!0$rHg&LsLrrE&u"e#Gk!.=eQs60N2rr>dn!<;cmrr<*"!!3/Z!!**"r;QqZ!<3%Xs8N$# +HiX0H! +^AeDr!0$rHg&LsLrrE&u"e#Gk!.=eQs60N2rr>dn!<;cmrr<*"!!3/Z!!**"r;QqZ!<3%Xs8N$# +HiX0H! +^AeDr!0$rHg&LsLrrE&u"e#Gk!.=eQs60N2rr>dn!<;cmrr<*"!!3/Z!!**"r;QqZ!<3%Xs8N$# +HiX0H! +^&S*4!rl!pqZ$Qqrr;lrrr3'p!9!n[!6:&upAb-m!WN-$!<3$"!<;usrr<*"!!**"rr;uu!WN-# +!<<#tquDZTJ-~> +^&S*4!rl!pqZ$Qqrr;lrrr3'p!9!n[!6:&upAb-m!WN-$!<3$"!<;usrr<*"!!**"rr;uu!WN-# +!<<#tquDZTJ-~> +^&S*4!rl!pqZ$Qqrr;lrrr3'p!9!n[!6:&upAb-m!WN-$!<3$"!<;usrr<*"!!**"rr;uu!WN-# +!<<#tquDZTJ-~> +^&J4o!4%R`qZ$Qqrr;uuqu6be!1Eli!0!iUpAb-m!WN-$!<3$"!<;usrr<*"!!**"rr;uu!WN-# +!<<#trr@lTJ-~> +^&J4o!4%R`qZ$Qqrr;uuqu6be!1Eli!0!iUpAb-m!WN-$!<3$"!<;usrr<*"!!**"rr;uu!WN-# +!<<#trr@lTJ-~> +^&J4o!4%R`qZ$Qqrr;uuqu6be!1Eli!0!iUpAb-m!WN-$!<3$"!<;usrr<*"!!**"rr;uu!WN-# +!<<#trr@lTJ-~> +^&J,H!!3/@s8)cq!<3#u!;lcs`rH/@BE/)6^&Rg+rr<*"!!30#!!**"r;Zcs!WN-#!<<&urr<*" +!!**"rVultM#Vu~> +^&J,H!!3/@s8)cq!<3#u!;lcs`rH/@BE/)6^&Rg+rr<*"!!30#!!**"r;Zcs!WN-#!<<&urr<*" +!!**"rVultM#Vu~> +^&J,H!!3/@s8)cq!<3#u!;lcs`rH/@BE/)6^&Rg+rr<*"!!30#!!**"r;Zcs!WN-#!<<&urr<*" +!!**"rVultM#Vu~> +^&J,l!!3/is8)cq!<3!#HiW.*rVlo_!!3/@!!3/Zs7ZKm!!3*"!W`6#!]rrA#Xrr3(6 +!<3$"!<<#t"+1+-s,-i,~> +^&J,l!!3/is8)cq!<3!#HiW.*rVlo_!!3/@!!3/Zs7ZKm!!3*"!W`6#!]rrA#Xrr3(6 +!<3$"!<<#t"+1+-s,-i,~> +^&J,l!!3/is8)cq!<3!#HiW.*rVlo_!!3/@!!3/Zs7ZKm!!3*"!W`6#!]rrA#Xrr3(6 +!<3$"!<<#t"+1+-s,-i,~> +]`/%-B`Io.rrE&u"haoAiJdg9rrYsqrr<'"s7QEl!!3*"!W`6#! +!<)p$]`>@sN;nk:J;~> +]`/%-B`Io.rrE&u"haoAiJdg9rrYsqrr<'"s7QEl!!3*"!W`6#! +!<)p$]`>@sN;nk:J;~> +]`/%-B`Io.rrE&u"haoAiJdg9rrYsqrr<'"s7QEl!!3*"!W`6#! +!<)p$]`>@sN;nk:J;~> +]`/&%ZN'e$r;cis"I]=LnGiLf"e(DMHqjY7s7ZNjrr\\iRfE?d#4Q<3BX6n&rVm"h!0$FIN;nG~> +]`/&%ZN'e$r;cis"I]=LnGiLf"e(DMHqjY7s7ZNjrr\\iRfE?d#4Q<3BX6n&rVm"h!0$FIN;nG~> +]`/&%ZN'e$r;cis"I]=LnGiLf"e(DMHqjY7s7ZNjrr\\iRfE?d#4Q<3BX6n&rVm"h!0$FIN;nG~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +JcC<$p&BR~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig4.png b/documentation/graphics/STIR-developers-overviewFig4.png new file mode 100644 index 0000000000..1c80648f75 Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig4.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig7.eps b/documentation/graphics/STIR-developers-overviewFig7.eps new file mode 100644 index 0000000000..02c2464289 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig7.eps @@ -0,0 +1,1041 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (STIR-developers-overviewFig7.eps) +%%CreationDate: (Mon Oct 25 16:23:51 2004) +%%BoundingBox: 0 0 1613 303 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 0 +%%EndComments + +%%BeginDefaults +%%PageOrientation: Portrait +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/buffer 512 string def +/byte 1 string def +/color_packet 3 string def +/pixels 768 string def + +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 gt + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 gt + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-RunlengthEncodedCompression or 1-NoCompression. + % hex color packets. + % + gsave + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Helvetica findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 1614 304 +userdict begin +%%BeginData: +DisplayImage +0 0 +1614 304 +12.000000 +1614 304 +1 +0 +0 +256 +ffffff +000000 +ffffc0 +9f9f60 +900000 +009000 +000090 +c0c0c0 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +000000 +00ff009603ff038b00ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1 +030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1 +030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1 +0300028a010002040100020f0100020d0100020201000202010002010100020101000201 +0100020701030204010102010101020d0100020701060291030000ff00ff00ff00ff00c1 +0300028a010002040100020f0100020d0100020201000202010002040100020101000206 +0100020301000202010002020100020f0100020a01000294030000ff00ff00ff00ff00c1 +0300028b0100020201000203010202030102020101020201010202030100020001000200 +010002020100020201000201010002000102020001000200010102020100020501000200 +010202000102020201010203010202010102020901000294030000ff00ff00ff00ff00c1 +0300028b0100020201000202010002020100020101000202010002010100020101000202 +010002020101020201000201010002010100020201000201010002010101020101000201 +010002050100020101000202010002020100020101000201010002020100020101000204 +01010203010002030101028e030000ff00ff00ff00ff00c10300028b0100020201000202 +010002020100020101000205010002010100020201000202010002030100020001000200 +010002000100020201000201010002010100020201000201010002050100020101000202 +010002020100020401000202010002010100020201010205010002050101028c030000ff +00ff00ff00ff00c10300028c010002000100020301040201010002050100020101000202 +010002020100020301000200010002000100020001000202010002010100020101000202 +010002010100020501000201010002020100020301010202010402010100020001010207 +010002070101028a030000ff00ff00ff00ff00c10300028c010002000100020301000205 +010002050100020101000202010002020100020401000202010002030100020101000201 +010002020100020101000205010002010100020201000205010002010100020501000202 +01010205010002050101028c030000ff00ff00ff00ff00c10300028d0100020401000202 +010002010100020201000201010002010100020201000202010002040100020201000203 +010002010100020101000202010002020100020301000202010002020100020201000201 +0100020101000202010002010100020401010203010002030101028e030000ff00ff00ff +00ff00c10300028d01000205010202030102020201010201010202030100020401000202 +010002030100020101010200010002020100020301030203010002020100020301010203 +010202020101020901000294030000ff00ff00ff00ff00c1030002ff0289030000ff00ff +00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff +00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff +00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff +00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c103ff038b00ff00ff00ff00ff +00ff0087060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004b +060200ff00ff00ff00ff00ff00ff004a060200ff00ff00ff00ff00ff00ff0049060400ff +00ff00ff00ff00ff00ff0048060400ff00ff00ff00ff00ff00ff004a060000ff00ff00ff +00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff +00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c +060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff +00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff +00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff +00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c +060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff +00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff +00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff +00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c +060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff +00ff00ff00ff00ff008603ff038b00ff00ff00ff00ff00c1030002ff0289030000ff00ff +00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff +00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff +00ff00ff00c103000205010002040100021d01000208010002040100020f0100020d0100 +0202010002020100020101000201010002010100020701030204010102010101020d0100 +020b01000245010002010100021e0100021e0100020e0100021001060212010002100106 +020b030000ff00ff00ff00ff00c1030002050101020301000227010002040100020f0100 +020d01000202010002020100020401000201010002060100020301000202010002020100 +020f0100020a01000200010002440100023f0102020e0100021301000215010002130100 +020e030000ff00ff00ff00ff00c103000205010002000100020201000201010002020100 +020101000200010002010100020301020203010002000100020001000202010202030100 +020201000203010202030102020101020201010202030100020001000200010002020100 +020201000201010002000102020001000200010102020100020501000200010202000102 +020201010203010202010102020901000200010002040100020001000201010002000100 +020101020202010002020100020801000200010102020100020201000201010002000100 +02010100020a010102000100020101000201010002000100020101000203010202020100 +02000101020301010202010002020102020201000200010102030101020b010002080102 +020201000202010202020100020001000201010002040100020f01020202010002020102 +02020100020001000201010002040100020e030000ff00ff00ff00ff00c1030002050100 +020001000202010002010100020201000201010102000101020001000201010002020100 +020201010201010002010100020201000202010002020100020201000202010002010100 +020201000201010002010100020201000202010102020100020101000201010002020100 +020101000201010102010100020101000205010002010100020201000202010002010100 +020101000202010002010100020401010202010002020100020301010202010102010100 +020201000201010002020100020401010201010102010100020101000202010002010101 +020001010200010002080100020101010201010002010101020001010200010002010100 +020201000201010102010100020101000201010002010100020101000202010002010101 +020101000201010002010100020a01000207010002020100020101000201010002020100 +020101010200010102000100020301000203010102080100020201000201010002010100 +0202010002010101020001010200010002030100020301010208030000ff00ff00ff00ff +00c103000205010002010100020101000201010002020100020101000201010002010100 +020101000202010002020100020201000201010002060100020201000202010002020100 +020101000205010002010100020201000202010002030100020001000200010002000100 +020201000201010002010100020201000201010002050100020101000202010002020100 +020401000202010002010100020201010204010002020100020301000203010002060100 +020101000202010002020101020301000202010002010100020201000201010002010100 +020101000208010002020100020101000201010002010100020101000201010002020100 +020101000202010002010100020401000201010002020100020101000202010002010100 +020d01000207010002020100020101000201010002020100020101000201010002010100 +020301000205010102060100020201000201010002010100020201000201010002010100 +0201010002030100020501010206030000ff00ff00ff00ff00c103000205010002020100 +020001000201010002020100020101000201010002010100020101040202010002020100 +020101000207010002000100020301040201010002050100020101000202010002020100 +020301000200010002000100020001000202010002010100020101000202010002010100 +020501000201010002020100020301010202010402010100020001010206010402030100 +020301000203010302010100020101000201010102050100020201000201010002020100 +020101000201010002010100020801000202010002010100020101000201010002010100 +020101040201010002020100020201010202010002010100020201000201010002020100 +020201010202010402030100020701040201010002010104020101000201010002010100 +020301000207010102040104020101000201010402010100020101000201010002030100 +020701010204030000ff00ff00ff00ff00c1030002050100020201000200010002010100 +020201000201010002010100020101000201010002060100020201000201010002070100 +020001000203010002050100020501000201010002020100020201000204010002020100 +020301000201010002010100020201000201010002050100020101000202010002050100 +020101000205010002020101020301000204010002020100020301000202010002020100 +020201000200010002030101020301000202010002010100020201000201010002010100 +020101000208010002020100020101000201010002010100020101000201010002050100 +0202010002040100020101000201010002020100020101000202010002040100020a0100 +020701000205010002010100020501000201010002010100020301000205010102060100 +020501000201010002050100020101000201010002030100020501010206030000ff00ff +00ff00ff00c1030002050100020301010201010002010101020101000201010002010100 +020101000202010002020100020201000201010002020100020401000204010002020100 +020101000202010002010100020101000202010002020100020401000202010002030100 +020101000201010002020100020201000203010002020100020201000202010002010100 +020101000202010002010100020401010201010002040100020201000203010002020100 +020201000202010002000100020501010201010002020100020101000201010102010100 +020101000201010002080100020101010201010002010100020101000201010002010100 +020201000201010002020100020101000201010002010100020101000202010002010100 +020201000201010002010100020a01000207010002020100020101000201010002020100 +020101000201010002010100020301000203010102080100020201000201010002010100 +0202010002010100020101000201010002030100020301010208030000ff00ff00ff00ff +00c103000205010002040100020201010200010002010100020101000201010002020102 +020301000202010002020102020501000205010202030102020201010201010202030100 +020401000202010002030100020101010200010002020100020301030203010002020100 +020301010203010202020101020701000204010002020100020301000203010202000100 +02020100020a010002020100020201010200010002010100020101000201010002090101 +020001000201010002010100020101000201010002020102020201000202010002020101 +0202010002020102020201000202010002020101020b0100020401000202010202020100 +0202010202020100020101000201010002030100020b0100020201020202010002020102 +02020100020101000201010002030100020e030000ff00ff00ff00ff00c1030002b70100 +02750100022a0100022d030000ff00ff00ff00ff00c1030002b6010002210106024c0100 +022a0100022e030000ff00ff00ff00ff00c1030002b5010002d2030000ff00ff00ff00ff +00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff +00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff +00c1030002ff0289030000ff00ff00ff00ff00c103ff038b00ff00ff00ff00ff00ff0087 +060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004b060200ff +00ff00ff00ff00ff00ff004a060200ff00ff00ff00ff00ff00ff0049060400ff00ff00ff +00ff00ff00ff0048060400ff00ff00ff00ff00ff00ff004a060000ff00ff00ff00ff00ff +00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c +060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff +00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff +00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff +00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c +060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff +00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff +00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff +00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c +060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff +00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff +00ff00ff008603ff038b00ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff +00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff +00c1030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff +00c10300027001000245010002010100021e010002200100021001060273030000ff00ff +00ff00ff00c10300026f0100020001000244010002430100021301000276030000ff00ff +00ff00ff00c10300026f0100020001000204010002000100020101000200010002010102 +020201000202010002080100020001010202010002020100020101000200010002010100 +020a01010200010002010100020101000200010002010100020301020202010002000101 +020301010202010002020102020201000200010102030101020701020202010002020102 +020201000200010002010100020401000276030000ff00ff00ff00ff00c10300026e0100 +020201000203010102020101020101000202010002010100020201000204010102010101 +020101000201010002020100020101010200010102000100020801000201010102010100 +020101010200010102000100020101000202010002010101020101000201010002010100 +020101000201010002020100020101010201010002010100020101000205010002020100 +020101000201010002020100020101010200010102000100020301000203010102700300 +00ff00ff00ff00ff00c10300026e01000202010002030100020301000206010002010100 +020201000202010102030100020201000201010002020100020101000201010002010100 +020801000202010002010100020101000201010002010100020101000202010002010100 +020201000201010002040100020101000202010002010100020201000201010002080100 +020201000201010002010100020201000201010002010100020101000203010002050101 +026e030000ff00ff00ff00ff00c10300026e010402030100020301000203010302010100 +020101000201010102050100020201000201010002020100020101000201010002010100 +020801000202010002010100020101000201010002010100020101040201010002020100 +020201010202010002010100020201000201010002020100020201010206010402010100 +020101040201010002010100020101000203010002070101026c030000ff00ff00ff00ff +00c10300026d010002040100020201000203010002020100020201000202010002000100 +020301010203010002020100020101000202010002010100020101000201010002080100 +020201000201010002010100020101000201010002010100020501000202010002040100 +020101000201010002020100020101000202010002040100020501000205010002010100 +0205010002010100020101000203010002050101026e030000ff00ff00ff00ff00c10300 +026d01000204010002020100020301000202010002020100020201000200010002050101 +020101000202010002010100020101010201010002010100020101000208010002010101 +020101000201010002010100020101000201010002020100020101000202010002010100 +020101000201010002010100020201000201010002020100020101000201010002050100 +020201000201010002010100020201000201010002010100020101000203010002030101 +0270030000ff00ff00ff00ff00c10300026d010002040100020201000203010002030102 +0200010002020100020a0100020201000202010102000100020101000201010002010100 +020901010200010002010100020101000201010002010100020201020202010002020100 +020201010202010002020102020201000202010002020101020301000202010202020100 +02020102020201000201010002010100020301000276030000ff00ff00ff00ff00c10300 +02890100026701000295030000ff00ff00ff00ff00c103000288010002210106023e0100 +0296030000ff00ff00ff00ff00c103000287010002ff0200030000ff00ff00ff00ff00c1 +030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1 +030002ff0289030000ff00ff00ff00ff00c1030002ff0289030000ff00ff00ff00ff00c1 +030002ff0289030000ff00ff00ff00ff00c103ff038b00ff00ff00ff00ff00ff00870600 +00ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004b060200ff00ff +00ff00ff00ff00ff004a060200ff00ff00ff00ff00ff00ff0049060400ff00ff00ff00ff +00ff00ff0048060400ff00ff00ff00ff00ff00ff004a060000ff00ff00ff00ff00ff00ff +004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c0600 +00ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff +00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff +00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff +004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c0600 +00ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff +00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff +00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff +004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c0600 +00ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff +00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff +00ff008601ff018b00ff00ff00ff00ff00c1010000ff0089010000ff00ff00ff00ff00c1 +010000ff0089010000ff00ff00ff00ff00c1010000ff0089010000ff00ff00ff00ff00c1 +010000ff0089010000ff00ff00ff00ff00c1010000ff0089010000ff00ff00ff00ff00c1 +01000090010400030100001a010000010100001201000001010400170100000101000098 +010000ff00ff00ff00ff00c101000090010000030100001e010000150100000101000003 +0100001901000098010000ff00ff00ff00ff00c101000090010000040100000101000002 +010100030102000301000000010000010102000101020000010000020101000301020003 +010100000100000101000004010000020102000201000000010100030101000201000000 +010200000100000201000091010000ff00ff00ff00ff00c1010000900100000401000001 +010000010100000101000001010000020100000201010001010000020100000101000001 +010000010100000101000001010000020100000101000001010100010100000401000001 +010000020100000101010001010000010100000101000001010000010100000101000002 +01000091010000ff00ff00ff00ff00c10100009001000004010000010100000101000004 +010000060100000201000002010000010100000101000001010000040100000201000001 +010000020100000101000004010000010100000201000001010000020100000101000004 +01000001010000010100000201000091010000ff00ff00ff00ff00c10100009001000004 +010000010100000201010002010000060100000201040001010000010100000201010002 +010400010100000201000001010000040100000101040001010000020100000201010002 +01000001010000010100000101000092010000ff00ff00ff00ff00c10100009001000004 +010000010100000401000001010000060100000201000005010000010100000401000001 +010000050100000201000001010000040100000101000005010000020100000401000001 +01000001010000020100000001000092010000ff00ff00ff00ff00c10100009001000003 +010000020100000101000001010000010100000201000002010000020100000201000001 +010000010100000101000001010000010100000201000001010000010101000101000003 +010000020100000201000001010000020100000101000001010000010100000101000002 +0100000001000092010000ff00ff00ff00ff00c101000090010400030100000201010003 +010200030100000301020002010100000100000201010003010200030101000001000001 +0104000401020002010000020100000201010002010000010101000201000093010000ff +00ff00ff00ff00c1010000f401000093010000ff00ff00ff00ff00c1010000f301000094 +010000ff00ff00ff00ff00c1010000f201000095010000ff00ff00ff00ff00c1010000ff +0089010000ff00ff00ff00ff00c1010000ff0089010000ff00ff00ff00ff00c1010000ff +0089010000ff00ff00ff00ff00c1010000ff0089010000ff00ff00ff00ff00c1010000ff +0089010000ff00ff00ff00ff00c101ff018b00ff00ff00ff00ff00ff0087060000ff00ff +00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004b060200ff00ff00ff00ff +00ff00ff004a060200ff00ff00ff00ff00ff00ff0049060400ff00ff00ff00ff00ff00ff +0048060400ff00ff00ff00ff00ff00ff004a060000ff00ff00ff00ff00ff00ff004c0600 +00ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff +00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff +00ff00ff004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00ff00ff +004c060000ff00ff00ff00ff00ff00ff004c060000ff00ff00ff00ff00b606ff06ff06ff +062c00ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff0020060000ff00ff +00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff00200600 +00ff00ff00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff +0020060000ff00ff00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff +00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff0020060000ff00ff00ff002a +060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff0020060000ff00ff +00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff00200600 +00ff00ff00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff +0020060000ff00ff00ff002a060000ff00ff005a03c5060003c400ff009f03c5060003c4 +00ff0095030002ff0289030000ff009f030002ff0289030000ff0095030002ff02890300 +00ff009f030002ff0289030000ff0095030002ff0289030000ff009f030002ff02890300 +00ff0095030002ff0289030000ff009f030002ff0289030000ff0095030002ff02890300 +00ff009f030002ff0289030000ff00950300025d010402030100021a0100020101000212 +0100020101040217010002010100020a0103020c01030209010002010100020c01000206 +0100020f0100020301030207010002050100025e030000ff009f03000261010402030100 +021a01000201010002120100020101040217010002010100020a0103020c0103020e0100 +020e01000211010302070100020501000261030000ff00950300025d010002030100021e +0100021501000201010002030100021901000209010002030100020a0100020301000208 +0100020f0100021701000202010002030100020d0100025e030000ff009f030002610100 +02030100021e0100021501000201010002030100021901000209010002030100020a0100 +02030100020d01000220010002030100020d01000261030000ff00950300025d01000204 +010002010100020201010203010202030100020001000201010202010102020001000202 +010102030102020301010200010002010100020401000202010202020100020001010203 +010102020100020001020200010002020100020101000205010002010100020001010202 +010002070100020201000201010002010100020101000200010102030101020001000202 +010002000100020001000202010202030102020201000201010002080100020001000200 +01000202010102000100025e030000ff009f030002610100020401000201010002020101 +020301020203010002000100020101020201010202000100020201010203010202030101 +020001000201010002040100020201020202010002000101020301010202010002000102 +020001000202010002010100020501000201010002000101020201000208010202030100 +020001030201010202030101020201000202010202020100020001010202010002080100 +020001000200010002020101020001000261030000ff00950300025d0100020401000201 +010002010100020101000201010002020100020201010201010002020100020101000201 +010002010100020101000201010002020100020101000201010102010100020401000201 +010002020100020101010201010002010100020101000201010002010100020101000202 +010002010100020501000201010102010100020101000207010002020100020101000201 +010002010101020101000201010002010101020201010201010002010100020201000201 +010002020100020101000201010002080101020101000201010002010101025e030000ff +009f03000261010002040100020101000201010002010100020101000202010002020101 +020101000202010002010100020101000201010002010100020101000202010002010100 +020101010201010002040100020101000202010002010101020101000201010002010100 +020101000201010002010100020201000201010002050100020101010201010002010100 +020701000202010002020101020101000201010002020100020101000201010002010100 +020101000202010002010101020101000201010002080101020101000201010002010101 +0261030000ff00950300025d010002040100020101000201010002040100020601000202 +010002020100020101000201010002010100020401000202010002010100020201000201 +010002040100020101000202010002010100020201000201010002040100020101000201 +010002020100020101000205010002010100020201000201010002070100020201000201 +010002010100020101000202010002010100020201000202010002020100020101000209 +010002010100020101000202010202020100020201000201010002020100025e030000ff +009f03000261010002040100020101000201010002040100020601000202010002020100 +020101000201010002010100020401000202010002010100020201000201010002040100 +020101000202010002010100020201000201010002040100020101000201010002020100 +0201010002050100020101000202010002010100020b0100020201000202010002010100 +020201000201010002040100020501000201010002020100020101000202010202020100 +0202010002010100020201000261030000ff00950300025d010002040100020101000202 +010102020100020601000202010402010100020101000202010102020104020101000202 +010002010100020401000201010402010100020201000202010102020100020101000201 +010002010100020201000205010002010100020201000201010002070100020101000202 +010002010100020101000202010002010100020201000202010002020100020101000206 +010302010100020101000204010002020100020201000201010002020100025e030000ff +009f03000261010002040100020101000202010102020100020601000202010402010100 +020101000202010102020104020101000202010002010100020401000201010402010100 +020201000202010102020100020101000201010002010100020201000205010002010100 +020201000201010002080103020201000202010002010104020201010202010002020103 +020101000202010002010100020401000202010002020100020101000202010002610300 +00ff00950300025d01000204010002010100020401000201010002060100020201000205 +010002010100020401000201010002050100020201000201010002040100020101000205 +010002020100020401000201010002010100020201000200010002020100020501000201 +010002020100020101000208010002000100020201000201010002010100020201000201 +010002020100020201000202010002010100020501000202010002010100020101000204 +010002020100020201000201010002020100025e030000ff009f03000261010002040100 +020101000204010002010100020601000202010002050100020101000204010002010100 +020501000202010002010100020401000201010002050100020201000204010002010100 +020101000202010002000100020201000205010002010100020201000201010002070100 +020201000202010002020100020101000208010002010100020101000202010002010100 +020201000201010002040100020201000202010002010100020201000261030000ff0095 +0300025d0100020301000202010002010100020101000201010002020100020201000202 +010002020100020101000201010002010100020101000201010002020100020101000201 +010102010100020301000202010002020100020101000202010002010100020101000201 +010002010100020201000200010002030100020301000202010002020100020201000203 +010002020100020001000202010002010100020101000202010002010100020101010202 +010002020100020101000202010002010100020201000201010002020100020201010202 +0100020201000201010002010101025e030000ff009f0300026101000203010002020100 +020101000201010002010100020201000202010002020100020201000201010002010100 +020101000201010002010100020201000201010002010101020101000203010002020100 +020201000201010002020100020101000201010002010100020101000202010002000100 +020301000203010002020100020201000202010002030100020101000202010002020100 +020201000201010002020100020101000201010002010100020101000202010002010100 +020201000202010002020101020201000202010002010100020101010261030000ff0095 +0300025d0104020301000202010102030102020301000203010202020101020001000202 +010102030102020301010200010002010104020401020202010002020100020201010202 +010002010101020201000205010302030100020201000203010302040100020301000201 +010002010100020201000202010102000100020201000202010002020102020301020200 +010002000100020301020200010002020100020201000202010102000100025e030000ff +009f03000261010402030100020201010203010202030100020301020202010102000100 +020201010203010202030101020001000201010402040102020201000202010002020101 +020201000201010102020100020501030203010002020100020301030203010202000100 +020101000202010102010102020301010202010002020102020001000200010002020100 +0203010202000100020201000202010002020101020001000261030000ff0095030002c1 +0100021f010002a5030000ff009f030002c5010002c2030000ff0095030002c00100021f +010002a6030000ff009f030002c4010002c3030000ff0095030002bf0100021f010002a7 +030000ff009f030002c3010002c4030000ff0095030002ff0289030000ff009f030002ff +0289030000ff0095030002ff0289030000ff009f030002ff0289030000ff0095030002ff +0289030000ff009f030002ff0289030000ff0095030002ff0289030000ff009f030002ff +0289030000ff0095030002ff0289030000ff009f030002ff0289030000ff009503ff038b +00ff009f03ff038b00ff00ff005b060000ff00ff00ff002a060000ff00ff00ff00200600 +00ff00ff00ff002a060000ff00ff00ff001f060200ff00ff00ff0028060200ff00ff00ff +001e060200ff00ff00ff0028060200ff00ff00ff001d060400ff00ff00ff0026060400ff +00ff00ff001c060400ff00ff00ff0026060400ff00ff00ff001e060000ff00ff00ff002a +060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff0020060000ff00ff +00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff00200600 +00ff00ff00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff +0020060000ff00ff00ff002a060000ff00ff00ff0020060000ff00ff00ff002a060000ff +00ff00ff0020060000ff00ff00ff002a060000ff00ff00ff0020060000ff00ff00ff002a +060000ff00ff00ff0020060000ff009406ff06ff06ff062c00ff008a060000ff00940600 +00ff0094060000ff0094060000ff008a060000ff0094060000ff0094060000ff00940600 +00ff008a060000ff0094060000ff0094060000ff0094060000ff008a060000ff00940600 +00ff0094060000ff0094060000ff008a060000ff0094060000ff0094060000ff00940600 +00ff008a060000ff0094060000ff0094060000ff0094060000ff008a060000ff00940600 +00ff0094060000ff0094060000ff008a060000ff0094060000ff0094060000ff00940600 +00ff008a060000ff0094060000ff0094060000ff0094060000ff008a060000ff00940600 +00ff0094060000ff0094060000ff008a060000ff0094060000ff0094060000ff00940600 +00ff008a060000ff0094060000ff0094060000ff0094060000ff008a060000ff00940600 +00ff0094060000ff0094060000ff008a060000ff0094060000ff0094060000ff00940600 +00ff008a060000ff0094060000ff0094060000ff0094060000c403c5060003c4000903c5 +060003c4000903c5060003c4000903c5060003c502ff028903000009030002ff02890300 +0009030002ff028903000009030002ff0289030102ff028903000009030002ff02890300 +0009030002ff028903000009030002ff0289030102ff028903000009030002ff02890300 +0009030002ff028903000009030002ff0289030102ff028903000009030002ff02890300 +0009030002ff028903000009030002ff0289030102ff028903000009030002ff02890300 +0009030002ff028903000009030002ff02890301028201040202010002080100020d0103 +020c01030209010002010100020c010002060100020f0100020301030207010002050100 +028303000009030002820100020401000215010002090103020c0103020e0100020e0100 +02110103020701000205010002830300000903000285010402020100020e010002090103 +020c0103020e0100020e01000211010302070100020501000285030000090300027e0104 +0202010002080100020d0103020b01020202010402050103020e0100020e010002110103 +0207010002050100027e030102820100020301000201010002080100020c010002030100 +020a01000203010002080100020f0100021701000202010002030100020d010002830300 +000903000282010002040100021501000208010002030100020a010002030100020d0100 +0220010002030100020d0100028303000009030002850100020301000211010002080100 +02030100020a010002030100020d01000220010002030100020d01000285030000090300 +027e0100020301000201010002080100020c010002030100020901000202010002010100 +020301000203010002030100020d01000220010002030100020d0100027e030102820100 +020301000201010002020102020201000200010102030101020201000205010002010100 +020001010202010002070100020201000201010002010100020101000200010102030101 +020001000202010002000100020001000202010202030102020201000201010002080100 +020001000200010002020101020001000283030000090300028301000202010002030102 +020101000203010002010102020201000202010102020100020501000201010002000101 +020201000208010202030100020001030201010202030101020201000202010202020100 +020001010202010002080100020001000200010002020101020001000283030000090300 +028501000203010002010100020001000203010002010102020201000202010102020100 +020501000201010002000101020201000208010202030100020001030201010202030101 +020201000202010202020100020001010202010002080100020001000200010002020101 +020001000285030000090300027e01000203010002010100020201020202010002000101 +020301010202010002050100020101000200010102060100020101000204010002010100 +020801020203010002000103020101020203010102020100020201020202010002000101 +020201000208010002000100020001000202010102000100027e03010282010002030100 +020101000201010002020100020101010201010002010100020101000201010002050100 +020101010201010002010100020701000202010002010100020101000201010102010100 +020101000201010102020101020101000201010002020100020101000202010002010100 +020101000208010102010100020101000201010102830300000903000283010002020100 +020201000202010002010100020101000201010002020100020101000201010002010100 +020101000205010002010101020101000201010002070100020201000202010102010100 +020101000202010002010100020101000201010002010100020201000201010102010100 +020101000208010102010100020101000201010102830300000903000285010002030100 +020101000201010002010100020101000202010002010100020101000201010002010100 +020501000201010102010100020101000207010002020100020201010201010002010100 +020201000201010002010100020101000201010002020100020101010201010002010100 +020801010201010002010100020101010285030000090300027e01000203010002010100 +020101000202010002010101020101000201010002010100020101000205010002010101 +020101000203010102020100020401000201010002070100020201000202010102010100 +020101000202010002010100020101000201010002010100020201000201010102010100 +0201010002080101020101000201010002010101027e0301028201040202010002010100 +020201000201010002020100020101000204010002050100020101000202010002010100 +020701000202010002010100020101000201010002020100020101000202010002020100 +020201000201010002090100020101000201010002020102020201000202010002010100 +020201000283030000090300028301000202010002020100020201000202010102020100 +0202010002010100020101000204010002050100020101000202010002010100020b0100 +020201000202010002010100020201000201010002040100020501000201010002020100 +020101000202010202020100020201000201010002020100028303000009030002850104 +020201000202010102020100020201000201010002010100020401000205010002010100 +0202010002010100020b0100020201000202010002010100020201000201010002040100 +020501000201010002020100020101000202010202020100020201000201010002020100 +0285030000090300027e0104020201000201010002020100020101000202010002010100 +0204010002050100020101000202010002050100020101000204010002010100020b0100 +020201000202010002010100020201000201010002040100020501000201010002020100 +020101000202010202020100020201000201010002020100027e03010282010002030100 +020101000201010002020100020101000202010002020101020201000205010002010100 +020201000201010002070100020101000202010002010100020101000202010002010100 +020201000202010002020100020101000206010302010100020101000204010002020100 +020201000201010002020100028303000009030002840100020001000203010002020100 +020201010202010402010100020201010202010002050100020101000202010002010100 +020801030202010002020100020101040202010102020100020201030201010002020100 +020101000204010002020100020201000201010002020100028303000009030002850100 +020601000202010102020104020101000202010102020100020501000201010002020100 +020101000208010302020100020201000201010402020101020201000202010302010100 +020201000201010002040100020201000202010002010100020201000285030000090300 +027e01000203010002010100020101000202010002010100020201000202010102020100 +020501000201010002020100020501000201010002040100020101000208010302020100 +020201000201010402020101020201000202010302010100020201000201010002040100 +02020100020201000201010002020100027e030102820100020301000201010002010100 +020201000201010002020100020401000201010002050100020101000202010002010100 +020801000200010002020100020101000201010002020100020101000202010002020100 +020201000201010002050100020201000201010002010100020401000202010002020100 +020101000202010002830300000903000284010002000100020301000202010002010100 +020101000201010002050100020401000201010002050100020101000202010002010100 +020701000202010002020100020201000201010002080100020101000201010002020100 +020101000202010002010100020401000202010002020100020101000202010002830300 +000903000285010002060100020101000201010002010100020501000204010002010100 +020501000201010002020100020101000207010002020100020201000202010002010100 +020801000201010002010100020201000201010002020100020101000204010002020100 +0202010002010100020201000285030000090300027e0100020301000201010002010100 +020201000201010002020100020401000201010002050100020101000202010002010100 +020201000201010002040100020101000207010002020100020201000202010002010100 +020801000201010002010100020201000201010002020100020101000204010002020100 +020201000201010002020100027e03010282010002030100020101000201010002020100 +020101010201010002010100020101000202010002030100020201000202010002020100 +020301000202010002000100020201000201010002010100020201000201010002010101 +020201000202010002010100020201000201010002020100020101000202010002020101 +020201000202010002010100020101010283030000090300028501000204010002020100 +020001000203010002000100020201000201010002010100020101000202010002030100 +020201000202010002020100020301000201010002020100020201000202010002010100 +020201000201010002010100020101000201010002020100020101000202010002020100 +020201010202010002020100020101000201010102830300000903000285010002060100 +020001000203010002000100020201000201010002010100020101000202010002030100 +020201000202010002020100020301000201010002020100020201000202010002010100 +020201000201010002010100020101000201010002020100020101000202010002020100 +02020101020201000202010002010100020101010285030000090300027e010002030100 +020101000201010002020100020101010201010002010100020101000202010002030100 +020201000202010002010100020201000201010002030100020301000203010002010100 +020201000202010002020100020101000202010002010100020101000201010002010100 +020201000201010002020100020201000202010102020100020201000201010002010101 +027e03010282010402020100020201020202010002000101020301010204010302030100 +020201000203010302040100020301000201010002010100020201000202010102000100 +020201000202010002020102020301020200010002000100020301020200010002020100 +020201000202010102000100028303000009030002850100020501020201010002030100 +020101020202010002020101020401030203010002020100020301030203010202000100 +020101000202010102010102020301010202010002020102020001000200010002020100 +020301020200010002020100020201000202010102000100028303000009030002850100 +020601000200010002030100020101020202010002020101020401030203010002020100 +020301030203010202000100020101000202010102010102020301010202010002020102 +020001000200010002020100020301020200010002020100020201000202010102000100 +0285030000090300027e0104020201000202010202020100020001010203010102040103 +020301000202010002020102020201040205010302030102020001000201010002020101 +020101020203010102020100020201020200010002000100020201000203010202000100 +02020100020201000202010102000100027e030102bd010002ca03000009030002ff0289 +03000009030002ff028903000009030002ff0289030102bc010002cb03000009030002ff +028903000009030002ff028903000009030002ff0289030102bb010002cc030000090300 +02ff028903000009030002ff028903000009030002ff0289030102ff0289030000090300 +02ff028903000009030002ff028903000009030002ff0289030102ff0289030000090300 +02ff028903000009030002ff028903000009030002ff0289030102ff0289030000090300 +02ff028903000009030002ff028903000009030002ff0289030102ff0289030000090300 +02ff028903000009030002ff028903000009030002ff0289030102ff0289030000090300 +02ff028903000009030002ff028903000009030002ff028903ff038c000903ff038b0009 +03ff038b000903ff038a +%%EndData +end +%%PageTrailer +%%Trailer +%%BoundingBox: 0 0 1613 303 +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig7.png b/documentation/graphics/STIR-developers-overviewFig7.png new file mode 100644 index 0000000000..9b0d3e7ded Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig7.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig8.eps b/documentation/graphics/STIR-developers-overviewFig8.eps new file mode 100644 index 0000000000..b5471e5718 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig8.eps @@ -0,0 +1,57554 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: -1 -1 413 159 +%%Creator: Corel PHOTO-PAINT 7 +%%Title: +%%CreationDate: Mon Oct 25 18:21:29 2004 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +/AutoFlatness true def +/AutoSteps 0 def +/CMYKMarks false def +/UseLevel2 false def +%Color profile: Disabled +%%BeginResource: procset wCorel7Dict 7.0 0 +/wCorel7Dict 300 dict def wCorel7Dict begin +% Copyright (c)1992-96 Corel Corporation +% All rights reserved. v7.0 r1.0 +/bd{bind def}bind def/ld{load def}bd/xd{exch def}bd/_ null def/rp{{pop}repeat} +bd/@cp/closepath ld/@gs/gsave ld/@gr/grestore ld/@np/newpath ld/Tl/translate ld +/$sv 0 def/@sv{/$sv save def}bd/@rs{$sv restore}bd/spg/showpage ld/showpage{} +bd currentscreen/@dsp xd/$dsp/@dsp def/$dsa xd/$dsf xd/$sdf false def/$SDF +false def/$Scra 0 def/SetScr/setscreen ld/setscreen{pop pop pop}bd/@ss{2 index +0 eq{$dsf 3 1 roll 4 -1 roll pop}if exch $Scra add exch load SetScr}bd +/SepMode_5 where{pop}{/SepMode_5 0 def}ifelse/CurrentInkName_5 where{pop} +{/CurrentInkName_5(Composite)def}ifelse/$ink_5 where{pop}{/$ink_5 -1 def} +ifelse/$c 0 def/$m 0 def/$y 0 def/$k 0 def/$t 1 def/$n _ def/$o 0 def/$fil 0 +def/$C 0 def/$M 0 def/$Y 0 def/$K 0 def/$T 1 def/$N _ def/$O 0 def/$PF false +def/s1c 0 def/s1m 0 def/s1y 0 def/s1k 0 def/s1t 0 def/s1n _ def/$bkg false def +/SK 0 def/SM 0 def/SY 0 def/SC 0 def/$op false def matrix currentmatrix/$ctm xd +/$ptm matrix def/$ttm matrix def/$stm matrix def/$ffpnt true def +/CorelDrawReencodeVect[16#0/grave 16#5/breve 16#6/dotaccent 16#8/ring +16#A/hungarumlaut 16#B/ogonek 16#C/caron 16#D/dotlessi 16#27/quotesingle +16#60/grave 16#7C/bar +16#82/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl +16#88/circumflex/perthousand/Scaron/guilsinglleft/OE +16#91/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash +16#98/tilde/trademark/scaron/guilsinglright/oe 16#9F/Ydieresis +16#A1/exclamdown/cent/sterling/currency/yen/brokenbar/section +16#a8/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/minus/registered/macron +16#b0/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered +16#b8/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown +16#c0/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +16#c8/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis +16#d0/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply +16#d8/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +16#e0/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla +16#e8/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis +16#f0/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide +16#f8/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +/L2?/languagelevel where{pop languagelevel 2 ge}{false}ifelse def +/@BeginSysCorelDict{systemdict/Corel30Dict known{systemdict/Corel30Dict get +exec}if}bd/@EndSysCorelDict{systemdict/Corel30Dict known{end}if}bd AutoFlatness +{/@ifl{dup currentflat exch sub 10 gt{ +([Error: PathTooComplex; OffendingCommand: AnyPaintingOperator]\n)print flush +@np exit}{currentflat 2 add setflat}ifelse}bd/@fill/fill ld/fill{currentflat{ +{@fill}stopped{@ifl}{exit}ifelse}bind loop setflat}bd/@eofill/eofill ld/eofill +{currentflat{{@eofill}stopped{@ifl}{exit}ifelse}bind loop setflat}bd/@clip +/clip ld/clip{currentflat{{@clip}stopped{@ifl}{exit}ifelse}bind loop setflat} +bd/@eoclip/eoclip ld/eoclip{currentflat{{@eoclip}stopped{@ifl}{exit}ifelse} +bind loop setflat}bd/@stroke/stroke ld/stroke{currentflat{{@stroke}stopped +{@ifl}{exit}ifelse}bind loop setflat}bd}if L2?{/@ssa{true setstrokeadjust}bd}{ +/@ssa{}bd}ifelse/d/setdash ld/j/setlinejoin ld/J/setlinecap ld/M/setmiterlimit +ld/w/setlinewidth ld/O{/$o xd}bd/R{/$O xd}bd/W/eoclip ld/c/curveto ld/C/c ld/l +/lineto ld/L/l ld/rl/rlineto ld/m/moveto ld/n/newpath ld/N/newpath ld/P{11 rp} +bd/u{}bd/U{}bd/A{pop}bd/q/@gs ld/Q/@gr ld/&{}bd/@j{@sv @np}bd/@J{@rs}bd/g{1 +exch sub/$k xd/$c 0 def/$m 0 def/$y 0 def/$t 1 def/$n _ def/$fil 0 def}bd/G{1 +sub neg/$K xd _ 1 0 0 0/$C xd/$M xd/$Y xd/$T xd/$N xd}bd/k{1 index type +/stringtype eq{/$t xd/$n xd}{/$t 0 def/$n _ def}ifelse/$k xd/$y xd/$m xd/$c xd +/$fil 0 def}bd/K{1 index type/stringtype eq{/$T xd/$N xd}{/$T 0 def/$N _ def} +ifelse/$K xd/$Y xd/$M xd/$C xd}bd/x/k ld/X/K ld/sf{1 index type/stringtype eq{ +/s1t xd/s1n xd}{/s1t 0 def/s1n _ def}ifelse/s1k xd/s1y xd/s1m xd/s1c xd}bd/i{ +dup 0 ne{setflat}{pop}ifelse}bd/v{4 -2 roll 2 copy 6 -2 roll c}bd/V/v ld/y{2 +copy c}bd/Y/y ld/@w{matrix rotate/$ptm xd matrix scale $ptm dup concatmatrix +/$ptm xd 1 eq{$ptm exch dup concatmatrix/$ptm xd}if 1 w}bd/@g{1 eq dup/$sdf xd +{/$scp xd/$sca xd/$scf xd}if}bd/@G{1 eq dup/$SDF xd{/$SCP xd/$SCA xd/$SCF xd} +if}bd/@D{2 index 0 eq{$dsf 3 1 roll 4 -1 roll pop}if 3 copy exch $Scra add exch +load SetScr/$dsp xd/$dsa xd/$dsf xd}bd/$ngx{$SDF{$SCF SepMode_5 0 eq{$SCA} +{$dsa}ifelse $SCP @ss}if}bd/p{/$pm xd 7 rp/$pyf xd/$pxf xd/$pn xd/$fil 1 def} +bd/@MN{2 copy le{pop}{exch pop}ifelse}bd/@MX{2 copy ge{pop}{exch pop}ifelse}bd +/InRange{3 -1 roll @MN @MX}bd/@sqr{dup 0 rl dup 0 exch rl neg 0 rl @cp}bd +/currentscale{1 0 dtransform matrix defaultmatrix idtransform dup mul exch dup +mul add sqrt 0 1 dtransform matrix defaultmatrix idtransform dup mul exch dup +mul add sqrt}bd/@unscale{}bd/wDstChck{2 1 roll dup 3 -1 roll eq{1 add}if}bd +/@dot{dup mul exch dup mul add 1 exch sub}bd/@lin{exch pop abs 1 exch sub}bd +/cmyk2rgb{3{dup 5 -1 roll add 1 exch sub dup 0 lt{pop 0}if exch}repeat pop}bd +/rgb2cmyk{3{1 exch sub 3 1 roll}repeat 3 copy @MN @MN 3{dup 5 -1 roll sub neg +exch}repeat}bd/rgb2g{2 index .299 mul 2 index .587 mul add 1 index .114 mul add +4 1 roll pop pop pop}bd/WaldoColor_5 where{pop}{/SetRgb/setrgbcolor ld/GetRgb +/currentrgbcolor ld/SetGry/setgray ld/GetGry/currentgray ld/SetRgb2 systemdict +/setrgbcolor get def/GetRgb2 systemdict/currentrgbcolor get def/SetHsb +systemdict/sethsbcolor get def/GetHsb systemdict/currenthsbcolor get def +/rgb2hsb{SetRgb2 GetHsb}bd/hsb2rgb{3 -1 roll dup floor sub 3 1 roll SetHsb +GetRgb2}bd/setcmykcolor where{pop/SetCmyk_5/setcmykcolor ld}{/SetCmyk_5{ +cmyk2rgb SetRgb}bd}ifelse/currentcmykcolor where{pop/GetCmyk/currentcmykcolor +ld}{/GetCmyk{GetRgb rgb2cmyk}bd}ifelse/setoverprint where{pop}{/setoverprint{ +/$op xd}bd}ifelse/currentoverprint where{pop}{/currentoverprint{$op}bd}ifelse +/@tc_5{5 -1 roll dup 1 ge{pop}{4{dup 6 -1 roll mul exch}repeat pop}ifelse}bd +/@trp{exch pop 5 1 roll @tc_5}bd/setprocesscolor_5{SepMode_5 0 eq{SetCmyk_5}{0 +4 $ink_5 sub index exch pop 5 1 roll pop pop pop pop SepsColor true eq{$ink_5 3 +gt{1 sub neg SetGry}{0 0 0 4 $ink_5 roll SetCmyk_5}ifelse}{1 sub neg SetGry} +ifelse}ifelse}bd/findcmykcustomcolor where{pop}{/findcmykcustomcolor{5 array +astore}bd}ifelse/setcustomcolor where{pop}{/setcustomcolor{exch aload pop +SepMode_5 0 eq{pop @tc_5 setprocesscolor_5}{CurrentInkName_5 eq{4 index}{0} +ifelse 6 1 roll 5 rp 1 sub neg SetGry}ifelse}bd}ifelse/@scc_5{dup type +/booleantype eq{setoverprint}{1 eq setoverprint}ifelse dup _ eq{pop +setprocesscolor_5 pop}{findcmykcustomcolor exch setcustomcolor}ifelse SepMode_5 +0 eq{true}{GetGry 1 eq currentoverprint and not}ifelse}bd/colorimage where{pop +/ColorImage{colorimage}def}{/ColorImage{/ncolors xd pop/dataaq xd{dataaq +ncolors dup 3 eq{/$dat xd 0 1 $dat length 3 div 1 sub{dup 3 mul $dat 1 index +get 255 div $dat 2 index 1 add get 255 div $dat 3 index 2 add get 255 div rgb2g +255 mul cvi exch pop $dat 3 1 roll put}for $dat 0 $dat length 3 idiv +getinterval pop}{4 eq{/$dat xd 0 1 $dat length 4 div 1 sub{dup 4 mul $dat 1 +index get 255 div $dat 2 index 1 add get 255 div $dat 3 index 2 add get 255 div +$dat 4 index 3 add get 255 div cmyk2rgb rgb2g 255 mul cvi exch pop $dat 3 1 +roll put}for $dat 0 $dat length ncolors idiv getinterval}if}ifelse}image}bd +}ifelse/setcmykcolor{1 5 1 roll _ currentoverprint @scc_5/$ffpnt xd}bd +/currentcmykcolor{0 0 0 0}bd/setrgbcolor{rgb2cmyk setcmykcolor}bd +/currentrgbcolor{currentcmykcolor cmyk2rgb}bd/sethsbcolor{hsb2rgb setrgbcolor} +bd/currenthsbcolor{currentrgbcolor rgb2hsb}bd/setgray{dup dup setrgbcolor}bd +/currentgray{currentrgbcolor rgb2g}bd}ifelse/WaldoColor_5 true def/@sft{$tllx +$pxf add dup $tllx gt{$pwid sub}if/$tx xd $tury $pyf sub dup $tury lt{$phei +add}if/$ty xd}bd/@stb{pathbbox/$ury xd/$urx xd/$lly xd/$llx xd}bd/@ep{{cvx exec +}forall}bd/@tp{@sv/$in true def 2 copy dup $lly le{/$in false def}if $phei sub +$ury ge{/$in false def}if dup $urx ge{/$in false def}if $pwid add $llx le{/$in +false def}if $in{@np 2 copy m $pwid 0 rl 0 $phei neg rl $pwid neg 0 rl 0 $phei +rl clip @np $pn cvlit load aload pop 7 -1 roll 5 index sub 7 -1 roll 3 index +sub Tl matrix currentmatrix/$ctm xd @ep pop pop pop pop}{pop pop}ifelse @rs}bd +/@th{@sft 0 1 $tly 1 sub{dup $psx mul $tx add{dup $llx gt{$pwid sub}{exit} +ifelse}loop exch $phei mul $ty exch sub 0 1 $tlx 1 sub{$pwid mul 3 copy 3 -1 +roll add exch @tp pop}for pop pop}for}bd/@tv{@sft 0 1 $tlx 1 sub{dup $pwid mul +$tx add exch $psy mul $ty exch sub{dup $ury lt{$phei add}{exit}ifelse}loop 0 1 +$tly 1 sub{$phei mul 3 copy sub @tp pop}for pop pop}for}bd/$fm 0 def/wfill{1 +$fm eq{fill}{eofill}ifelse}bd/wclip{1 $fm eq{clip}{eoclip}ifelse}bd/@pf{@gs +$ctm setmatrix $pm concat @stb wclip Bburx Bbury $pm itransform/$tury xd/$turx +xd Bbllx Bblly $pm itransform/$tlly xd/$tllx xd/$wid $turx $tllx sub def/$hei +$tury $tlly sub def @gs $vectpat{1 0 0 0 0 _ $o @scc_5{wfill}if}{$t $c $m $y $k +$n $o @scc_5{SepMode_5 0 eq $pfrg or{$tllx $tlly Tl $wid $hei scale <00> 8 1 +false[8 0 0 1 0 0]{}imagemask}{/$bkg true def}ifelse}if}ifelse @gr $wid 0 gt +$hei 0 gt and{$pn cvlit load aload pop/$pd xd 3 -1 roll sub/$phei xd exch sub +/$pwid xd $wid $pwid div ceiling 1 add/$tlx xd $hei $phei div ceiling 1 add +/$tly xd $psx 0 eq{@tv}{@th}ifelse}if @gr @np/$bkg false def}bd/@Pf{@sv +SepMode_5 0 eq $Psc 0 ne or $ink_5 3 eq or{0 J 0 j[]0 d $t $c $m $y $k $n $o +@scc_5 pop $ctm setmatrix 72 1000 div dup matrix scale dup concat dup Bburx +exch Bbury exch itransform ceiling cvi/Bbury xd ceiling cvi/Bburx xd Bbllx exch +Bblly exch itransform floor cvi/Bblly xd floor cvi/Bbllx xd $Prm aload pop $Psn +load exec}{1 SetGry wfill}ifelse @rs @np}bd/F{matrix currentmatrix $sdf{$scf +$sca $scp @ss}if $fil 1 eq{@pf}{$fil 2 eq{@ff}{$fil 3 eq{@Pf}{$t $c $m $y $k $n +$o @scc_5{wfill}{@np}ifelse}ifelse}ifelse}ifelse $sdf{$dsf $dsa $dsp @ss}if +setmatrix}bd/f{@cp F}bd/S{matrix currentmatrix $ctm setmatrix $SDF{$SCF $SCA +$SCP @ss}if $T $C $M $Y $K $N $O @scc_5{matrix currentmatrix $ptm concat stroke +setmatrix}{@np}ifelse $SDF{$dsf $dsa $dsp @ss}if setmatrix}bd/s{@cp S}bd/B{@gs +F @gr S}bd/b{@cp B}bd/_E{5 array astore exch cvlit xd}bd/@cc{currentfile $dat +readhexstring pop}bd/@sm{/$ctm $ctm currentmatrix def}bd/@E{/Bbury xd/Bburx xd +/Bblly xd/Bbllx xd}bd/@c{@cp}bd/@p{/$fil 1 def 1 eq dup/$vectpat xd{/$pfrg true +def}{@gs $t $c $m $y $k $n $o @scc_5/$pfrg xd @gr}ifelse/$pm xd/$psy xd/$psx xd +/$pyf xd/$pxf xd/$pn xd}bd/@P{/$fil 3 def/$Psn xd/$Psc xd array astore/$Prm xd +}bd/@ii{concat 3 index 3 index m 3 index 1 index l 2 copy l 1 index 3 index l 3 +index 3 index l clip pop pop pop pop}bd/tcc{@cc}def/@i{@sm @gs @ii 6 index 1 ne +{/$frg true def pop pop}{1 eq{s1t s1c s1m s1y s1k s1n $O @scc_5/$frg xd}{/$frg +false def}ifelse 1 eq{@gs $ctm setmatrix F @gr}if}ifelse @np/$ury xd/$urx xd +/$lly xd/$llx xd/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul 8 div ceiling cvi +string def $bkg $frg or{$SDF{$SCF $SCA $SCP @ss}if $llx $lly Tl $urx $llx sub +$ury $lly sub scale $bkg{$t $c $m $y $k $n $o @scc_5 pop}if $wid $hei abs $bts +1 eq{$bkg}{$bts}ifelse[$wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse]/tcc load +$bts 1 eq{imagemask}{image}ifelse $SDF{$dsf $dsa $dsp @ss}if}{$hei abs{tcc pop} +repeat}ifelse @gr $ctm setmatrix}bd/@I{@sm @gs @ii @np/$ury xd/$urx xd/$lly xd +/$llx xd/$ncl xd/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul $ncl mul 8 div +ceiling cvi string def $ngx $llx $lly Tl $urx $llx sub $ury $lly sub scale $wid +$hei abs $bts[$wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse]/@cc load false $ncl +ColorImage $SDF{$dsf $dsa $dsp @ss}if @gr $ctm setmatrix}bd/COMP 0 def L2?{ +/@I_2{@sm @gs @ii @np/$ury xd/$urx xd/$lly xd/$llx xd/$ncl xd/$bts xd/$hei xd +/$wid xd/$dat $wid $bts mul $ncl mul 8 div ceiling cvi string def $ngx $ncl 1 +eq{/DeviceGray}{$ncl 3 eq{/DeviceRGB}{/DeviceCMYK}ifelse}ifelse setcolorspace +$llx $lly Tl $urx $llx sub $ury $lly sub scale 8 dict begin/ImageType 1 def +/Width $wid def/Height $hei abs def/BitsPerComponent $bts def/Decode $ncl 1 eq +{[0 1]}{$ncl 3 eq{[0 1 0 1 0 1]}{[0 1 0 1 0 1 0 1]}ifelse}ifelse def +/ImageMatrix[$wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse]def/DataSource +currentfile/ASCII85Decode filter COMP 1 eq{/DCTDecode filter}{COMP 2 eq +{/RunLengthDecode filter}if}ifelse def currentdict end image $SDF{$dsf $dsa +$dsp @ss}if @gr $ctm setmatrix}bd}{/@I_2{}bd}ifelse/@B{@gs S @gr F}bd/@b{@cp @B +}bd/@sep{CurrentInkName_5(Composite)eq{/$ink_5 -1 def}{CurrentInkName_5(Cyan) +eq{/$ink_5 0 def}{CurrentInkName_5(Magenta)eq{/$ink_5 1 def}{CurrentInkName_5 +(Yellow)eq{/$ink_5 2 def}{CurrentInkName_5(Black)eq{/$ink_5 3 def}{/$ink_5 4 +def}ifelse}ifelse}ifelse}ifelse}ifelse}bd/@whi{@gs -72000 dup m -72000 72000 l +72000 dup l 72000 -72000 l @cp 1 SetGry fill @gr}bd/@neg{[{1 exch sub}/exec cvx +currenttransfer/exec cvx]cvx settransfer @whi}bd/deflevel 0 def/@sax{/deflevel +deflevel 1 add def}bd/@eax{/deflevel deflevel dup 0 gt{1 sub}if def deflevel 0 +gt{/eax load}{eax}ifelse}bd/eax{{exec}forall}bd/@rax{deflevel 0 eq{@rs @sv}if} +bd/@daq{dup type/arraytype eq{{}forall}if}bd/@BMP{/@cc xd 12 index 1 gt +UseLevel2 true eq and{7 -2 roll pop pop @I_2}{11 index 1 eq{12 -1 roll pop @i} +{7 -2 roll pop pop @I}ifelse}ifelse}bd systemdict/pdfmark known not{/pdfmark +/cleartomark ld}if +end +%%EndResource +%%EndProlog +%%BeginSetup +wCorel7Dict begin +@BeginSysCorelDict +2.6131 setmiterlimit +1.00 setflat +/$fst 128 def +%%EndSetup + +%%Page: 1 1 +%LogicalPage: 1 +%%BeginPageSetup +@sv +@sm +@sv +%%EndPageSetup +@rax 206.49600 79.05600 619.48800 -79.05600 @E +1721 659 8 3 0 0 1456945 -557785 1 1 0 -557784 1456944 0 [0.00028346 0.00000000 0.00000000 0.00028346 0.00000000 158.11199422] /@cc load @BMP +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0 +f0f0f0f0f0f0f0f0f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7 +010101030303030303010101030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +010101030303030303090909fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7010101030303030303010101030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +0101010303030303030a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000060606090909fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000010101090909f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000101010a0a0af4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c70a0a0a +010101060606060605060605000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000060606010101303030f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbdbdbd070707010101060606060605060605000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000050505010101333333f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +000000000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0be7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbcd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbc +e7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbce7ebbccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f40330000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a7e80667e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066 +7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000 +0000000000000000000000000000000000007e8066fbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffcc3f4033000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffcc +fbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000 +0000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033 +0000000000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033 +0000000000000000000000000000003f4033bdc09afbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000 +0000000000000000000000000000007e8066fbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000003f40337e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033bdc09a +fbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000007e8066fbffcc +fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033bdc09afbffccfbffcc3f40330000000000003f4033fbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000000000000000 +0000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000003f4033bdc09a +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033 +bdc09afbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a3f40330000000000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +0000000000000000000000000000000000000000003f4033fbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000000000000000000000000000003f4033 +fbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +000000000000000000000000000000000000000000bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000000000000000 +0000000000000000000000000000000000003f4033fbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000 +000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000 +0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000 +000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +0000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000 +bdc09abdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000fbffccfbffcc +fbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000bdc09abdc09a0000000000000000007e8066fbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000 +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000 +bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000 +000000bdc09abdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f40330000000000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000000000000000007e80667e80667e8066000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +0000007e80667e80667e80667e80660000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc000000000000000000 +0000007e80667e8066bdc09afbffccfbffccfbffccfbffcc3f40330000000000000000000000007e80667e80667e80667e8066000000000000000000 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e80667e8066 +3f40330000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000 +0000000000007e80667e80667e80667e80660000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +0000003f40337e80667e80663f40330000000000003f40330000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000000000003f40337e80667e80667e80660000000000000000000000003f4033fbffccfbffccfbffcc3f4033000000000000000000000000 +7e80667e80667e80667e80660000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000007e8066 +7e80667e8066000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e8066 +7e80667e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000 +3f40337e80667e80667e80663f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000000000000000007e80667e80667e8066000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000 +3f40337e80667e80663f40330000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000003f40337e80667e80667e80663f4033000000000000 +000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f40337e80667e8066fbffccfbffcc +fbffccbdc09a0000000000000000000000003f40337e80667e80667e80663f4033000000000000000000000000000000000000000000bdc09afbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e80667e80663f40330000000000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000007e80667e80667e80667e8066000000 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000003f40337e80667e80663f4033000000000000 +3f40330000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e80667e8066 +7e80660000000000000000000000003f4033fbffccfbffccfbffccbdc09a0000000000000000000000003f40337e80667e80667e80663f4033000000 +000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc3f4033000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +bdc09afbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000000000003f40337e80667e80667e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000000000000000000000007e80667e80667e80667e80660000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e80667e80663f40330000000000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffcc +fbffccbdc09a3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000003f4033 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000 +bdc09afbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000007e8066fbffccbdc09a0000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09a +fbffccfbffccfbffccfbffccbdc09a3f40330000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a3f4033 +000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000bdc09afbffccfbffccfbffccfbffccbdc09a000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000000000000000007e8066fbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a +3f4033000000000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccbdc09a000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033 +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccbdc09a3f40330000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccbdc09a000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f4033000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f4033000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000003f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09a7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f40330000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000003f4033fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033 +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f40330000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccbdc09a000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000fbffccfbffcc +fbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e80660000000000000000007e80667e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e8066bdc09a7e8066000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000000000003f40330000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000007e8066bdc09afbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000bdc09afbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066 +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000007e8066bdc09afbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccbdc09a000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e8066bdc09afbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f4033000000000000000000fbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +000000000000000000fbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffcc +bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc3f4033 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a000000000000000000 +0000000000000000007e80667e80667e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000007e80667e80667e8066fbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000003f4033fbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000 +0000000000007e80667e80667e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +000000000000bdc09afbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f40337e8066 +7e80667e80667e80667e80667e80667e80667e80667e80667e80667e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000003f4033bdc09afbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc3f40330000000000000000000000000000003f40337e80667e8066bdc09afbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000000000000000000000000000003f40337e80667e8066bdc09afbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f40330000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffcc +fbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000003f40337e80667e8066bdc09a +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +0000000000000000007e80667e80667e80667e80667e80667e80667e80667e80667e80667e80667e80663f4033000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000007e8066fbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000000000000000000000000000000000000000007e80660000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000000000 +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000007e8066fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +0000000000000000000000000000000000000000007e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000003f4033fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000000000000000000000000000 +3f40333f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a3f40330000000000000000000000000000000000000000000000000000003f40333f4033000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000000000000000000000 +0000003f40333f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09afbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066 +0000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000000000000000000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f4033000000000000000000fbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000 +0000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +000000fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000000000000000000000000000 +000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80663f4033000000000000000000000000000000000000000000000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffcc +fbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000000000000000000000 +000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000003f40337e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80667e80667e80660000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a7e80667e80667e80660000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +bdc09afbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +7e80667e80667e80667e80667e80667e80667e80667e80663f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +0000000000000000000000000000000000000000000000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80663f4033000000 +000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80663f4033000000000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffcc +fbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80663f4033 +000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000003f40337e80667e80667e80667e80667e80667e80667e80667e80660000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc3f40330000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033 +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +000000000000fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffcc +fbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccbdc09a000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffcc0000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc7e8066 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000bdc09afbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f4033000000000000000000fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000fbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09a +fbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffcc7e8066000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +3f4033fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000003f4033fbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffcc7e80660000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffccfbffccfbffcc +3f40330000000000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccbdc09a7e80667e8066000000000000000000 +3f40337e80667e8066bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000000000000000000000003f4033bdc09afbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffcc7e80667e8066 +7e80660000000000000000003f40337e80667e80667e8066fbffccfbffccfbffccbdc09a0000000000000000000000003f4033bdc09afbffccfbffcc +bdc09a3f4033000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000000000000000000000003f4033 +bdc09afbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +3f4033bdc09afbffccfbffccbdc09a3f40330000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000000000 +0000007e8066fbffccfbffcc7e80667e8066fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000007e8066bdc09afbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffcc000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000007e8066fbffcc +fbffccfbffcc7e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000000000007e8066 +fbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffccfbffccfbffccbdc09a0000000000000000000000007e8066bdc09afbffcc +fbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffccfbffccfbffcc0000000000000000000000000000007e8066fbffccfbffcc +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffccfbffccfbffccbdc09a0000000000000000000000003f4033 +bdc09afbffccfbffccbdc09a3f4033000000000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffcc7e8066 +0000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e80667e80663f40330000000000000000007e80667e80667e8066fbffccfbffcc +fbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000003f4033bdc09a +fbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffcc7e80667e80667e80660000000000000000003f40337e8066 +7e80667e8066fbffccfbffccfbffccbdc09a0000000000000000000000003f4033bdc09afbffccfbffccbdc09a3f4033000000000000000000000000 +bdc09afbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000000000007e8066fbffccfbffccfbffcc7e8066000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033bdc09afbffccfbffccbdc09a3f4033000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e80660000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066bdc09afbffccfbffcc +bdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffcc +7e80660000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000007e8066bdc09afbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000000000000000003f4033bdc09afbffccfbffccbdc09a3f4033000000000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffcc7e80660000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffccfbffccfbffcc000000000000000000 +0000000000007e8066fbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000003f40330000000000000000000000000000000000007e8066fbffccfbffcc +fbffcc3f40330000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffcc7e8066000000000000000000000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09a0000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc000000000000 +000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000 +000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09a000000000000 +0000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +0000000000000000000000000000000000000000003f40330000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000003f4033 +000000000000000000000000000000000000fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccbdc09a000000000000000000 +0000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000 +0000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e80663f4033000000000000 +000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000003f40330000000000000000000000000000000000007e8066fbffccfbffccfbffccbdc09a000000000000000000000000000000000000 +000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f40330000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000003f40330000000000000000000000000000000000007e8066fbffccfbffcc0000000000000000003f4033000000000000000000000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e80660000000000003f40330000000000000000000000000000000000007e8066fbffccfbffccfbffccbdc09a000000000000000000000000 +000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09a000000000000000000 +0000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +000000000000fbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e80663f4033000000000000000000000000000000000000000000 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000 +3f40330000000000000000007e8066fbffccfbffccfbffccfbffcc7e80660000000000003f40330000000000000000000000000000000000007e8066 +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000 +000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000 +000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000003f40330000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a000000 +000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffcc7e80660000000000003f40330000000000000000000000000000000000007e8066fbffccfbffcc000000000000000000 +3f4033000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000007e8066bdc09a0000000000000000000000000000003f4033fbffccfbffcc +fbffccfbffcc3f40330000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffcc7e8066000000000000000000000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccbdc09a0000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc000000000000 +000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccbdc09a000000 +0000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000 +0000000000000000000000000000000000003f4033fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000fbffcc +3f4033000000000000000000000000000000bdc09afbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000 +0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc3f4033000000 +000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +000000000000bdc09afbffccfbffccfbffcc3f40330000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000007e8066bdc09a0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000 +000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f40330000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000000000007e8066bdc09a0000000000000000000000000000003f4033fbffccfbffcc000000000000000000fbffcc3f4033000000000000000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc7e80660000000000007e8066bdc09a0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000000000 +000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccbdc09a000000000000 +0000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc3f4033000000000000000000000000000000000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000003f4033 +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e80660000000000007e8066bdc09a0000000000000000000000000000003f4033 +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000003f4033fbffccfbffccfbffccbdc09a000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000007e8066bdc09a0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccbdc09a +000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80660000000000007e8066bdc09a0000000000000000000000000000003f4033fbffccfbffcc000000000000000000 +fbffcc3f4033000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccbdc09a7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09afbffccfbffcc +fbffccfbffccfbffccbdc09a7e80660000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e80660000000000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccbdc09a7e80667e8066000000000000000000 +3f40337e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066000000000000000000000000000000000000 +7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a +7e80667e80667e8066fbffccfbffccbdc09a7e80660000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e80660000000000000000003f40337e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000 +0000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000007e8066bdc09afbffccfbffccfbffcc7e80667e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccbdc09a +7e80660000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +3f40330000000000000000003f4033bdc09afbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e80667e80667e8066fbffcc +fbffcc3f40330000000000000000007e8066fbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80667e80660000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +7e80660000000000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc000000000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000 +0000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffcc7e8066 +3f40330000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000007e8066fbffccfbffccfbffcc000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066000000000000 +0000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80660000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09afbffccfbffcc7e80667e80667e8066fbffccfbffcc3f4033000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccbdc09a7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033 +0000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80663f4033000000000000000000000000000000 +3f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80663f40330000000000000000007e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e80663f40330000000000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccbdc09a7e8066 +0000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80660000000000000000003f40337e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f40330000000000000000000000003f40337e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000007e8066bdc09afbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a +7e80667e80667e8066fbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffcc7e80663f40330000000000000000003f4033 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000003f4033bdc09afbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09a +fbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066000000000000000000 +0000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80663f4033000000000000000000000000 +0000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a000000000000000000fbffccfbffccfbffcc7e80660000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80667e80660000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000007e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f40330000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09afbffccfbffcc7e80667e80667e8066 +fbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +000000000000000000fbffccfbffcc7e80660000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f40330000000000007e8066fbffccfbffcc000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000000000bdc09afbffcc3f40330000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80660000000000003f4033fbffccbdc09a000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000003f4033bdc09a000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc000000000000000000bdc09a3f40330000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e8066000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e80660000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a +7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000000000007e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000003f40337e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +0000000000007e80667e80667e80667e80660000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000 +3f40337e80667e80667e80663f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033 +7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000007e80667e80667e80667e8066000000 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f40330000000000000000000000000000007e80667e80667e80667e80660000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a0000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000 +000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000 +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a3f40330000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066 +0000000000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000 +0000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +0000000000000000000000000000000000000000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000003f40337e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000000000000000000000 +0000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80660000000000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a7e80667e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066 +7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0bf8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccd2d5aa000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511fafecbfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcccdd0a6000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +0000000000000000000000000303020e0e0ba8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202 +151511a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89 +a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89a8ab89000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6c6c6 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000060606080808fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000505050a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef272727 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000010101010101666666fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9e9e91f1f1f000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000010101010101696969fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000010101090909fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000101010a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc7c7c7 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101090909fafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb7b7b7010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101000000000000000000000000000000000000010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010a0a0afbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1717170000000000000000000000000000000101011c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1a1a1a0000000000000000000000000000000000001a1a1a1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c +1c1c1c1c1c1c1c1c1cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040b0b0bfbfbfbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffeeeeee000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0000000000000000000000000404040a0a0aefefeff3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3e3e3e3000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd000000000000000000000000000000000000040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404 +040404040404040404040404040404040404040404040404000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd010101050505000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000050505020202edededffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6dedede000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000070707efefeff6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202010101000000000000000000000000000000000000020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202f8f8f8ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8797979000000000000000000000000010101383838e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8 +e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff8585850000000000000000000000000101013e3e3effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc8383830000000000000000000000000101013d3d3dfcfcfcfcfcfcfcfcfcfcfcfc +fcfcfcfcfcfcfcfcfcfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d0d0d0d0d0d0d0d0d0d0d0d0707070000000000000000000000000000000303030d0d0d0d0d0d0d0d0d0c0c0c +0c0c0c0c0c0c0c0c0c0c0c0cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff636363 +010101040404040404040404040404010101010101040404040404020202000000000000000000000000000000010101040404010101040404010101 +040404040404030303030303c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f5 +171717000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000101017c7c7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +b7b7b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000101012c2c2cfbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff515151000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +020202010101bdbdbdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff8f8f81f1f1f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +010101848484ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffc7c7c7030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +3a3a3afdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff7d7d7d000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101080808 +e1e1e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffcfcfc313131000000000000000000000000000000000000000000000000000000000000000000000000000000010101939393 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefed8d8d80606060000000000000000000000000000000000000000000000000000000000000000000101014f4f4ffefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe +fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff161616161616151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +1515151515151515151515151515150b0b0b000000000000000000000000000000000000000000000000000000000000000000010101141414151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515 +151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515161616 +161616ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d010101010101020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202010101020202010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010020202010101020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202010101000000000000000000000000000000000000000000000000000000000000010101020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202 +020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202010101020202 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +838383010101010101010101010101010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +1a1a1ae4e4e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffefefe6d6d6d010101010101010101010101000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +010101171717e1e1e1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591 +b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591b2b591151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f7c7e640000000000000101011d1d18adb08db0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f +b0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38fb0b38f191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc6e705a010101050504d1d4aafbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +0000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000000000000000000000000000003f4033bdc09afbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033bdc09afbffcc +fbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000 +0000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccbdc09a +000000000000000000bdc09afbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000000000000000000000000000000000000000000000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000003f4033bdc09afbffccfbffcc3f4033000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000fbffccfbffccfbffccfbffccbdc09a3f4033 +0000000000000000000000000000000000000000007e8066fbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000007e8066fbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000003f4033bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccbdc09a000000 +000000000000bdc09afbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +000000000000000000000000000000000000000000bdc09abdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000 +000000000000000000000000fbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000bdc09a +bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000000000000000000000000000003f4033fbffcc3f4033 +000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000bdc09abdc09a000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffccbdc09a000000000000 +0000000000000000000000000000000000000000000000003f4033fbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000003f40337e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000000000000000000000000000003f4033fbffcc3f4033000000 +000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f40330000000000000000000000003f40337e80667e80663f40330000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000 +3f40337e80667e80667e80663f4033000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000 +0000003f40337e80667e8066fbffccfbffccfbffccbdc09a0000000000000000000000003f40337e80667e80667e80663f4033000000000000000000 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e80667e8066 +3f40330000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000000000003f40337e80667e80663f40330000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc3f40330000000000000000000000007e80667e80667e80667e8066000000000000000000000000000000 +0000000000003f4033fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000007e80667e80667e8066000000 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000000000003f40337e80667e80667e80663f4033000000000000000000000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e80667e8066bdc09afbffccfbffccfbffcc3f4033000000000000 +0000000000007e80667e80667e80667e80660000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a0000000000000000000000000000007e80667e80667e8066000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f40330000000000000000000000000000003f40337e80667e80667e80663f4033000000000000000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000007e80667e80667e80660000000000000000003f4033000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000007e80667e80667e80663f4033000000000000000000000000 +bdc09afbffccfbffccfbffccfbffcc3f40330000000000000000000000007e80667e80667e80667e8066000000000000000000000000000000000000 +0000003f4033fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccbdc09a3f40330000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80660000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffcc +fbffccbdc09a3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000003f4033bdc09afbffccfbffccfbffccfbffccbdc09a3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80660000000000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffcc7e80660000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +000000fbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000007e8066fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09a +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffcc +fbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000003f4033fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +3f40337e8066fbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000000000003f4033 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffcc3f4033000000000000000000 +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc3f4033000000000000000000 +0000000000003f40337e80667e8066bdc09afbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000003f40337e80667e8066bdc09afbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000007e80667e80667e8066fbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +7e8066fbffccfbffccfbffccfbffcc3f40330000000000000000000000000000003f40337e80667e8066bdc09afbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000000000000000007e80667e80667e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc +fbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffcc7e8066000000000000000000 +bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000007e80667e80667e8066fbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033000000000000 +0000000000000000000000000000000000000000003f40333f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000000000000000003f4033 +3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000007e8066000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000000000000000003f40333f4033000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +0000000000000000000000000000000000000000000000000000007e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000007e8066000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033 +000000000000000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000000000000000000000000000000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000000000000000000000000000000000000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000000000000000000000000000000000000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e80660000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc +bdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc3f4033000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000000000000000000000000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000003f40337e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e80667e80667e80663f4033000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80663f4033000000000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000 +0000000000000000000000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066000000000000000000000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +0000000000000000000000000000003f40337e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80663f4033000000000000000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a7e80667e80667e80660000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000 +000000bdc09afbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066000000000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc000000000000 +0000003f4033fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000 +000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066 +fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e8066000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccbdc09a000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80663f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc000000000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000007e8066fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066 +fbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000007e8066fbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +0000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000003f4033fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09a +fbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +000000fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +0000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffcc7e80660000000000000000000000003f4033bdc09afbffccbdc09a3f4033fbffccfbffccfbffcc +bdc09a0000000000000000000000003f4033bdc09afbffccfbffccbdc09a3f4033000000000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000 +3f4033bdc09afbffccfbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffccfbffcc7e80667e80663f4033000000000000 +0000007e80667e80667e8066fbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffcc7e8066000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffccfbffcc7e80667e8066 +7e80660000000000000000003f40337e80667e80667e8066fbffccfbffccfbffccbdc09a0000000000000000000000003f4033bdc09afbffccfbffcc +bdc09a3f4033000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000000000003f4033bdc09afbffccfbffccbdc09a3f4033000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033000000000000 +000000000000fbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000007e8066fbffccfbffcc7e80667e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc000000000000000000000000 +0000007e8066fbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffcc3f40330000000000000000000000007e8066fbffccfbffccfbffcc7e8066 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +7e8066fbffccfbffccfbffccbdc09a7e80667e80660000000000000000003f40337e80667e8066bdc09afbffccfbffccfbffccfbffcc000000000000 +0000000000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000000000007e8066fbffccfbffccfbffcc7e8066000000 +0000000000000000007e8066fbffccfbffccbdc09a7e80667e80663f40330000000000000000007e80667e80667e8066bdc09afbffccfbffccfbffcc +fbffcc3f40330000000000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000000000003f4033fbffccfbffccfbffccfbffcc +7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000000000003f4033bdc09afbffccfbffccbdc09a3f4033000000000000000000000000fbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000007e8066fbffccfbffcc7e80667e8066fbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f40337e8066fbffccfbffccfbffcc7e8066000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000 +000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000003f40330000000000000000000000000000000000007e8066fbffccfbffcc +fbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc3f4033000000000000 +000000000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffcc000000000000000000000000000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e80663f4033000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffcc000000000000 +000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000 +000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a000000 +000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033000000000000000000000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc0000000000000000003f4033 +000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000 +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000000000000000000000 +fbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a000000 +0000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e80663f4033000000000000000000000000000000000000000000 +000000000000000000fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc3f40330000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000007e8066fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09a0000000000000000000000000000000000000000000000000000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000000000003f4033000000000000000000 +fbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033000000000000000000000000000000000000fbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffcc7e80660000000000007e8066bdc09a0000000000000000000000000000003f4033fbffccfbffcc +fbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc000000000000000000000000000000 +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffcc3f4033000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc000000000000 +000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a +000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000fbffcc3f4033000000000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc000000000000000000fbffcc +3f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000000000000000000000000000bdc09a +fbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffcc3f4033000000000000000000000000000000000000 +000000000000bdc09afbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000003f4033fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000fbffccbdc09a0000000000000000000000000000000000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000bdc09a7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc000000000000000000fbffcc3f4033000000000000000000000000000000bdc09afbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000000000000000000000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccbdc09a7e80667e8066bdc09afbffccbdc09a0000000000000000003f4033bdc09afbffccfbffcc +fbffccfbffccfbffccfbffcc7e80663f40330000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e80663f40330000000000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80663f4033000000000000 +0000007e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80663f40330000000000000000000000000000003f4033 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066 +7e80667e8066bdc09afbffccfbffcc7e80663f40330000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e80660000000000000000003f40337e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000 +0000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80663f40330000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80660000000000000000000000000000000000007e8066bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066fbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e80667e80667e8066fbffcc +fbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000000000 +7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80663f40330000000000000000000000000000003f40337e8066fbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a7e80667e80660000000000000000003f40337e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80667e80660000000000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffcc7e80663f40330000000000000000003f4033 +7e8066fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80663f40330000000000000000007e80667e80667e8066bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a7e80660000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033 +0000003f40337e8066fbffccfbffccfbffccbdc09a7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a7e80667e80667e8066fbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccbdc09a7e80660000000000000000000000007e8066bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066fbffccfbffcc3f40330000000000000000007e8066fbffccfbffccbdc09a7e80667e8066 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80663f40330000000000000000000000007e8066bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80660000000000000000000000000000000000007e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e8066000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e8066 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000003f40337e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e80667e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000003f40337e80667e80667e80663f4033000000000000000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a0000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000000000000000000000000000000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000000000000000000000000000007e8066bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000 +0000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a3f40330000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000 +0000000000000000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +0000000000000000000000000000000000000000000000000000000000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f40330000000000000000000000000000000000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e80667e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101919376fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101c0c39cfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfafecb191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d00000000000000000000000001010185876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c +85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c85876c151511000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd10101000000000000000000000000001010184866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b +84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b84866b191914000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +a0a0a0030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +333333f4f4f4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff848484010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +010101303030f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff2d2d2d010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101000000000000000000000000000000000000010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +b6b6b6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffdfdfd101010010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101afafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3535350000000000000000000000000000000101013a3a3a3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3c3c3c3c3c3c3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a2929290000000000000000000000000000000505053a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a +3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3c3c3c +3c3c3cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505f6f6f6ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffb6b6b6000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000050505eeeeeef7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7b0b0b0000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000000000060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606060606040404000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffe0e0e0010101030303000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000020202151515fefefeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff1010100f0f0f000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000030303101010ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffdfdfdf0f0f0010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101012a2a2afdfdfdffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfc9c9c9000000000000000000000000000000030303d5d5d5dfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdf +dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe6e6e6000000000000000000000000000000040404f4f4f4ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3dbdbdb000000000000000000000000000000040404e9e9e9f3f3f3f3f3f3f3f3f3 +f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe +393939010101040404040404040404010101040404040404040404040404000000000000000000000000000000000000040404040404040404040404 +010101040404040404040404040404010101a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +d5d5d5030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000010101747474ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff767676000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000010101383838fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff7f7f7171717000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000101010e0e0ee8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff454545000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000010101a0a0a0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff4d4d4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000101017f7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffe3e3e3070707000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0101014a4a4afefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff838383000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101 +171717f1f1f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffbfbfb252525000000000000000000000000000000000000000000000000000000000000000000000000010101040404 +c7c7c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9bababa0000000000000000000000000000000000000000000000000000000000000000000000000101018a8a8a +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9 +f9f9f9f9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff080808080808070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707030303000000000000000000000000000000000000000000000000000000000000000000030303070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +080808080808ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535010101010101050505070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707000000000000000000000000000000000000000000000000000000000000010101070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707 +070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707010101 +030303000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff767676010101010101020202020202020202000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000030303a2a2a2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101000000000000000000000000000000000000010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aecfd2a91314100000000101010d0d0ac2c59ed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae +d6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9aed6d9ae464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcca6a987010101020202b2b591fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000003f40337e8066bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffcc +fbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000fbffccfbffccfbffcc +fbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccbdc09a000000000000000000bdc09afbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000 +0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000000000000000000000000000003f4033 +fbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffcc +bdc09a0000000000000000000000000000000000000000000000000000000000003f4033fbffcc3f4033000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e8066 +7e80663f40330000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000007e80667e80667e80667e8066000000000000000000 +0000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e80667e8066bdc09afbffccfbffccfbffcc +3f40330000000000000000000000007e80667e80667e80667e80660000000000000000000000000000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000007e80667e80667e8066000000000000000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffcc +fbffccfbffccbdc09a3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000003f4033fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +3f4033000000000000000000fbffccfbffccfbffccfbffccbdc09a0000000000000000000000000000000000007e80667e80667e8066fbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000000000000000000000007e80667e80667e8066fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000000000 +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000000000000000000000000000000000000000000000000000007e80660000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000000000000000000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80660000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000000000000000000000000000000000000000000000000000007e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80660000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffcc0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80660000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffcc3f4033000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a0000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc +0000000000000000000000000000007e8066fbffccfbffcc7e80667e8066fbffccfbffccbdc09a0000000000000000000000003f4033bdc09afbffcc +fbffccbdc09a3f4033000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033 +000000000000000000000000fbffccfbffccfbffccbdc09a7e80667e80660000000000000000003f40337e80667e8066bdc09afbffccfbffccfbffcc +fbffcc0000000000000000000000007e8066fbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000003f4033bdc09afbffcc +fbffccbdc09a3f4033000000000000000000000000fbffccfbffccfbffccbdc09a7e80667e80663f40330000000000000000007e80667e80667e8066 +bdc09afbffccfbffccfbffcc3f40330000000000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000000000003f4033fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +0000000000000000003f4033000000000000000000000000000000000000fbffccfbffccfbffccbdc09a000000000000000000000000000000000000 +000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000000000 +0000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccbdc09a0000000000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09a000000000000000000000000 +0000000000000000000000000000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000 +7e8066fbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +000000000000000000fbffcc3f4033000000000000000000000000000000bdc09afbffccfbffccfbffccbdc09a000000000000000000000000000000 +000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000000000000000000000000000000000 +0000000000003f4033fbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccbdc09a0000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccbdc09a000000000000000000 +0000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +7e80667e80667e8066fbffccfbffcc3f40330000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000 +0000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066000000000000000000000000000000000000 +7e8066bdc09afbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80660000000000000000003f40337e80667e8066bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80667e80660000000000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccbdc09a7e8066000000 +0000000000000000007e8066bdc09afbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80663f40330000000000000000007e80667e80667e8066 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80660000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80663f4033000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000007e80667e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f4033bdc09a +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f40337e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +0000000000000000000000000000000000000000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc +fbffccfbffcc7e80660000000000000000000000000000000000000000000000000000000000000000000000003f40337e8066bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d71fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff3535350000000000000000000000000101018b8d718f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174 +8f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f91748f9174464739000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff9c9c9c030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000101010d6d6d6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff353535010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101000000808080ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff2f2f2f2f2f2f2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d +2f2f2f2f2f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff +%%PageTrailer +@rs +@rs +%%Trailer +@EndSysCorelDict +end +%%DocumentSuppliedResources: procset wCorel7Dict +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig8.png b/documentation/graphics/STIR-developers-overviewFig8.png new file mode 100644 index 0000000000..4ad11a3dac Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig8.png differ diff --git a/documentation/graphics/STIR-developers-overviewFig9.eps b/documentation/graphics/STIR-developers-overviewFig9.eps new file mode 100644 index 0000000000..1af0e68e59 --- /dev/null +++ b/documentation/graphics/STIR-developers-overviewFig9.eps @@ -0,0 +1,24602 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: -1 -1 298 93 +%%Creator: Corel PHOTO-PAINT 7 +%%Title: +%%CreationDate: Mon Oct 25 18:23:07 2004 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +/AutoFlatness true def +/AutoSteps 0 def +/CMYKMarks false def +/UseLevel2 false def +%Color profile: Disabled +%%BeginResource: procset wCorel7Dict 7.0 0 +/wCorel7Dict 300 dict def wCorel7Dict begin +% Copyright (c)1992-96 Corel Corporation +% All rights reserved. v7.0 r1.0 +/bd{bind def}bind def/ld{load def}bd/xd{exch def}bd/_ null def/rp{{pop}repeat} +bd/@cp/closepath ld/@gs/gsave ld/@gr/grestore ld/@np/newpath ld/Tl/translate ld +/$sv 0 def/@sv{/$sv save def}bd/@rs{$sv restore}bd/spg/showpage ld/showpage{} +bd currentscreen/@dsp xd/$dsp/@dsp def/$dsa xd/$dsf xd/$sdf false def/$SDF +false def/$Scra 0 def/SetScr/setscreen ld/setscreen{pop pop pop}bd/@ss{2 index +0 eq{$dsf 3 1 roll 4 -1 roll pop}if exch $Scra add exch load SetScr}bd +/SepMode_5 where{pop}{/SepMode_5 0 def}ifelse/CurrentInkName_5 where{pop} +{/CurrentInkName_5(Composite)def}ifelse/$ink_5 where{pop}{/$ink_5 -1 def} +ifelse/$c 0 def/$m 0 def/$y 0 def/$k 0 def/$t 1 def/$n _ def/$o 0 def/$fil 0 +def/$C 0 def/$M 0 def/$Y 0 def/$K 0 def/$T 1 def/$N _ def/$O 0 def/$PF false +def/s1c 0 def/s1m 0 def/s1y 0 def/s1k 0 def/s1t 0 def/s1n _ def/$bkg false def +/SK 0 def/SM 0 def/SY 0 def/SC 0 def/$op false def matrix currentmatrix/$ctm xd +/$ptm matrix def/$ttm matrix def/$stm matrix def/$ffpnt true def +/CorelDrawReencodeVect[16#0/grave 16#5/breve 16#6/dotaccent 16#8/ring +16#A/hungarumlaut 16#B/ogonek 16#C/caron 16#D/dotlessi 16#27/quotesingle +16#60/grave 16#7C/bar +16#82/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl +16#88/circumflex/perthousand/Scaron/guilsinglleft/OE +16#91/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash +16#98/tilde/trademark/scaron/guilsinglright/oe 16#9F/Ydieresis +16#A1/exclamdown/cent/sterling/currency/yen/brokenbar/section +16#a8/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/minus/registered/macron +16#b0/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered +16#b8/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown +16#c0/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +16#c8/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis +16#d0/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply +16#d8/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +16#e0/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla +16#e8/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis +16#f0/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide +16#f8/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +/L2?/languagelevel where{pop languagelevel 2 ge}{false}ifelse def +/@BeginSysCorelDict{systemdict/Corel30Dict known{systemdict/Corel30Dict get +exec}if}bd/@EndSysCorelDict{systemdict/Corel30Dict known{end}if}bd AutoFlatness +{/@ifl{dup currentflat exch sub 10 gt{ +([Error: PathTooComplex; OffendingCommand: AnyPaintingOperator]\n)print flush +@np exit}{currentflat 2 add setflat}ifelse}bd/@fill/fill ld/fill{currentflat{ +{@fill}stopped{@ifl}{exit}ifelse}bind loop setflat}bd/@eofill/eofill ld/eofill +{currentflat{{@eofill}stopped{@ifl}{exit}ifelse}bind loop setflat}bd/@clip +/clip ld/clip{currentflat{{@clip}stopped{@ifl}{exit}ifelse}bind loop setflat} +bd/@eoclip/eoclip ld/eoclip{currentflat{{@eoclip}stopped{@ifl}{exit}ifelse} +bind loop setflat}bd/@stroke/stroke ld/stroke{currentflat{{@stroke}stopped +{@ifl}{exit}ifelse}bind loop setflat}bd}if L2?{/@ssa{true setstrokeadjust}bd}{ +/@ssa{}bd}ifelse/d/setdash ld/j/setlinejoin ld/J/setlinecap ld/M/setmiterlimit +ld/w/setlinewidth ld/O{/$o xd}bd/R{/$O xd}bd/W/eoclip ld/c/curveto ld/C/c ld/l +/lineto ld/L/l ld/rl/rlineto ld/m/moveto ld/n/newpath ld/N/newpath ld/P{11 rp} +bd/u{}bd/U{}bd/A{pop}bd/q/@gs ld/Q/@gr ld/&{}bd/@j{@sv @np}bd/@J{@rs}bd/g{1 +exch sub/$k xd/$c 0 def/$m 0 def/$y 0 def/$t 1 def/$n _ def/$fil 0 def}bd/G{1 +sub neg/$K xd _ 1 0 0 0/$C xd/$M xd/$Y xd/$T xd/$N xd}bd/k{1 index type +/stringtype eq{/$t xd/$n xd}{/$t 0 def/$n _ def}ifelse/$k xd/$y xd/$m xd/$c xd +/$fil 0 def}bd/K{1 index type/stringtype eq{/$T xd/$N xd}{/$T 0 def/$N _ def} +ifelse/$K xd/$Y xd/$M xd/$C xd}bd/x/k ld/X/K ld/sf{1 index type/stringtype eq{ +/s1t xd/s1n xd}{/s1t 0 def/s1n _ def}ifelse/s1k xd/s1y xd/s1m xd/s1c xd}bd/i{ +dup 0 ne{setflat}{pop}ifelse}bd/v{4 -2 roll 2 copy 6 -2 roll c}bd/V/v ld/y{2 +copy c}bd/Y/y ld/@w{matrix rotate/$ptm xd matrix scale $ptm dup concatmatrix +/$ptm xd 1 eq{$ptm exch dup concatmatrix/$ptm xd}if 1 w}bd/@g{1 eq dup/$sdf xd +{/$scp xd/$sca xd/$scf xd}if}bd/@G{1 eq dup/$SDF xd{/$SCP xd/$SCA xd/$SCF xd} +if}bd/@D{2 index 0 eq{$dsf 3 1 roll 4 -1 roll pop}if 3 copy exch $Scra add exch +load SetScr/$dsp xd/$dsa xd/$dsf xd}bd/$ngx{$SDF{$SCF SepMode_5 0 eq{$SCA} +{$dsa}ifelse $SCP @ss}if}bd/p{/$pm xd 7 rp/$pyf xd/$pxf xd/$pn xd/$fil 1 def} +bd/@MN{2 copy le{pop}{exch pop}ifelse}bd/@MX{2 copy ge{pop}{exch pop}ifelse}bd +/InRange{3 -1 roll @MN @MX}bd/@sqr{dup 0 rl dup 0 exch rl neg 0 rl @cp}bd +/currentscale{1 0 dtransform matrix defaultmatrix idtransform dup mul exch dup +mul add sqrt 0 1 dtransform matrix defaultmatrix idtransform dup mul exch dup +mul add sqrt}bd/@unscale{}bd/wDstChck{2 1 roll dup 3 -1 roll eq{1 add}if}bd +/@dot{dup mul exch dup mul add 1 exch sub}bd/@lin{exch pop abs 1 exch sub}bd +/cmyk2rgb{3{dup 5 -1 roll add 1 exch sub dup 0 lt{pop 0}if exch}repeat pop}bd +/rgb2cmyk{3{1 exch sub 3 1 roll}repeat 3 copy @MN @MN 3{dup 5 -1 roll sub neg +exch}repeat}bd/rgb2g{2 index .299 mul 2 index .587 mul add 1 index .114 mul add +4 1 roll pop pop pop}bd/WaldoColor_5 where{pop}{/SetRgb/setrgbcolor ld/GetRgb +/currentrgbcolor ld/SetGry/setgray ld/GetGry/currentgray ld/SetRgb2 systemdict +/setrgbcolor get def/GetRgb2 systemdict/currentrgbcolor get def/SetHsb +systemdict/sethsbcolor get def/GetHsb systemdict/currenthsbcolor get def +/rgb2hsb{SetRgb2 GetHsb}bd/hsb2rgb{3 -1 roll dup floor sub 3 1 roll SetHsb +GetRgb2}bd/setcmykcolor where{pop/SetCmyk_5/setcmykcolor ld}{/SetCmyk_5{ +cmyk2rgb SetRgb}bd}ifelse/currentcmykcolor where{pop/GetCmyk/currentcmykcolor +ld}{/GetCmyk{GetRgb rgb2cmyk}bd}ifelse/setoverprint where{pop}{/setoverprint{ +/$op xd}bd}ifelse/currentoverprint where{pop}{/currentoverprint{$op}bd}ifelse +/@tc_5{5 -1 roll dup 1 ge{pop}{4{dup 6 -1 roll mul exch}repeat pop}ifelse}bd +/@trp{exch pop 5 1 roll @tc_5}bd/setprocesscolor_5{SepMode_5 0 eq{SetCmyk_5}{0 +4 $ink_5 sub index exch pop 5 1 roll pop pop pop pop SepsColor true eq{$ink_5 3 +gt{1 sub neg SetGry}{0 0 0 4 $ink_5 roll SetCmyk_5}ifelse}{1 sub neg SetGry} +ifelse}ifelse}bd/findcmykcustomcolor where{pop}{/findcmykcustomcolor{5 array +astore}bd}ifelse/setcustomcolor where{pop}{/setcustomcolor{exch aload pop +SepMode_5 0 eq{pop @tc_5 setprocesscolor_5}{CurrentInkName_5 eq{4 index}{0} +ifelse 6 1 roll 5 rp 1 sub neg SetGry}ifelse}bd}ifelse/@scc_5{dup type +/booleantype eq{setoverprint}{1 eq setoverprint}ifelse dup _ eq{pop +setprocesscolor_5 pop}{findcmykcustomcolor exch setcustomcolor}ifelse SepMode_5 +0 eq{true}{GetGry 1 eq currentoverprint and not}ifelse}bd/colorimage where{pop +/ColorImage{colorimage}def}{/ColorImage{/ncolors xd pop/dataaq xd{dataaq +ncolors dup 3 eq{/$dat xd 0 1 $dat length 3 div 1 sub{dup 3 mul $dat 1 index +get 255 div $dat 2 index 1 add get 255 div $dat 3 index 2 add get 255 div rgb2g +255 mul cvi exch pop $dat 3 1 roll put}for $dat 0 $dat length 3 idiv +getinterval pop}{4 eq{/$dat xd 0 1 $dat length 4 div 1 sub{dup 4 mul $dat 1 +index get 255 div $dat 2 index 1 add get 255 div $dat 3 index 2 add get 255 div +$dat 4 index 3 add get 255 div cmyk2rgb rgb2g 255 mul cvi exch pop $dat 3 1 +roll put}for $dat 0 $dat length ncolors idiv getinterval}if}ifelse}image}bd +}ifelse/setcmykcolor{1 5 1 roll _ currentoverprint @scc_5/$ffpnt xd}bd +/currentcmykcolor{0 0 0 0}bd/setrgbcolor{rgb2cmyk setcmykcolor}bd +/currentrgbcolor{currentcmykcolor cmyk2rgb}bd/sethsbcolor{hsb2rgb setrgbcolor} +bd/currenthsbcolor{currentrgbcolor rgb2hsb}bd/setgray{dup dup setrgbcolor}bd +/currentgray{currentrgbcolor rgb2g}bd}ifelse/WaldoColor_5 true def/@sft{$tllx +$pxf add dup $tllx gt{$pwid sub}if/$tx xd $tury $pyf sub dup $tury lt{$phei +add}if/$ty xd}bd/@stb{pathbbox/$ury xd/$urx xd/$lly xd/$llx xd}bd/@ep{{cvx exec +}forall}bd/@tp{@sv/$in true def 2 copy dup $lly le{/$in false def}if $phei sub +$ury ge{/$in false def}if dup $urx ge{/$in false def}if $pwid add $llx le{/$in +false def}if $in{@np 2 copy m $pwid 0 rl 0 $phei neg rl $pwid neg 0 rl 0 $phei +rl clip @np $pn cvlit load aload pop 7 -1 roll 5 index sub 7 -1 roll 3 index +sub Tl matrix currentmatrix/$ctm xd @ep pop pop pop pop}{pop pop}ifelse @rs}bd +/@th{@sft 0 1 $tly 1 sub{dup $psx mul $tx add{dup $llx gt{$pwid sub}{exit} +ifelse}loop exch $phei mul $ty exch sub 0 1 $tlx 1 sub{$pwid mul 3 copy 3 -1 +roll add exch @tp pop}for pop pop}for}bd/@tv{@sft 0 1 $tlx 1 sub{dup $pwid mul +$tx add exch $psy mul $ty exch sub{dup $ury lt{$phei add}{exit}ifelse}loop 0 1 +$tly 1 sub{$phei mul 3 copy sub @tp pop}for pop pop}for}bd/$fm 0 def/wfill{1 +$fm eq{fill}{eofill}ifelse}bd/wclip{1 $fm eq{clip}{eoclip}ifelse}bd/@pf{@gs +$ctm setmatrix $pm concat @stb wclip Bburx Bbury $pm itransform/$tury xd/$turx +xd Bbllx Bblly $pm itransform/$tlly xd/$tllx xd/$wid $turx $tllx sub def/$hei +$tury $tlly sub def @gs $vectpat{1 0 0 0 0 _ $o @scc_5{wfill}if}{$t $c $m $y $k +$n $o @scc_5{SepMode_5 0 eq $pfrg or{$tllx $tlly Tl $wid $hei scale <00> 8 1 +false[8 0 0 1 0 0]{}imagemask}{/$bkg true def}ifelse}if}ifelse @gr $wid 0 gt +$hei 0 gt and{$pn cvlit load aload pop/$pd xd 3 -1 roll sub/$phei xd exch sub +/$pwid xd $wid $pwid div ceiling 1 add/$tlx xd $hei $phei div ceiling 1 add +/$tly xd $psx 0 eq{@tv}{@th}ifelse}if @gr @np/$bkg false def}bd/@Pf{@sv +SepMode_5 0 eq $Psc 0 ne or $ink_5 3 eq or{0 J 0 j[]0 d $t $c $m $y $k $n $o +@scc_5 pop $ctm setmatrix 72 1000 div dup matrix scale dup concat dup Bburx +exch Bbury exch itransform ceiling cvi/Bbury xd ceiling cvi/Bburx xd Bbllx exch +Bblly exch itransform floor cvi/Bblly xd floor cvi/Bbllx xd $Prm aload pop $Psn +load exec}{1 SetGry wfill}ifelse @rs @np}bd/F{matrix currentmatrix $sdf{$scf +$sca $scp @ss}if $fil 1 eq{@pf}{$fil 2 eq{@ff}{$fil 3 eq{@Pf}{$t $c $m $y $k $n +$o @scc_5{wfill}{@np}ifelse}ifelse}ifelse}ifelse $sdf{$dsf $dsa $dsp @ss}if +setmatrix}bd/f{@cp F}bd/S{matrix currentmatrix $ctm setmatrix $SDF{$SCF $SCA +$SCP @ss}if $T $C $M $Y $K $N $O @scc_5{matrix currentmatrix $ptm concat stroke +setmatrix}{@np}ifelse $SDF{$dsf $dsa $dsp @ss}if setmatrix}bd/s{@cp S}bd/B{@gs +F @gr S}bd/b{@cp B}bd/_E{5 array astore exch cvlit xd}bd/@cc{currentfile $dat +readhexstring pop}bd/@sm{/$ctm $ctm currentmatrix def}bd/@E{/Bbury xd/Bburx xd +/Bblly xd/Bbllx xd}bd/@c{@cp}bd/@p{/$fil 1 def 1 eq dup/$vectpat xd{/$pfrg true +def}{@gs $t $c $m $y $k $n $o @scc_5/$pfrg xd @gr}ifelse/$pm xd/$psy xd/$psx xd +/$pyf xd/$pxf xd/$pn xd}bd/@P{/$fil 3 def/$Psn xd/$Psc xd array astore/$Prm xd +}bd/@ii{concat 3 index 3 index m 3 index 1 index l 2 copy l 1 index 3 index l 3 +index 3 index l clip pop pop pop pop}bd/tcc{@cc}def/@i{@sm @gs @ii 6 index 1 ne +{/$frg true def pop pop}{1 eq{s1t s1c s1m s1y s1k s1n $O @scc_5/$frg xd}{/$frg +false def}ifelse 1 eq{@gs $ctm setmatrix F @gr}if}ifelse @np/$ury xd/$urx xd +/$lly xd/$llx xd/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul 8 div ceiling cvi +string def $bkg $frg or{$SDF{$SCF $SCA $SCP @ss}if $llx $lly Tl $urx $llx sub +$ury $lly sub scale $bkg{$t $c $m $y $k $n $o @scc_5 pop}if $wid $hei abs $bts +1 eq{$bkg}{$bts}ifelse[$wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse]/tcc load +$bts 1 eq{imagemask}{image}ifelse $SDF{$dsf $dsa $dsp @ss}if}{$hei abs{tcc pop} +repeat}ifelse @gr $ctm setmatrix}bd/@I{@sm @gs @ii @np/$ury xd/$urx xd/$lly xd +/$llx xd/$ncl xd/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul $ncl mul 8 div +ceiling cvi string def $ngx $llx $lly Tl $urx $llx sub $ury $lly sub scale $wid +$hei abs $bts[$wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse]/@cc load false $ncl +ColorImage $SDF{$dsf $dsa $dsp @ss}if @gr $ctm setmatrix}bd/COMP 0 def L2?{ +/@I_2{@sm @gs @ii @np/$ury xd/$urx xd/$lly xd/$llx xd/$ncl xd/$bts xd/$hei xd +/$wid xd/$dat $wid $bts mul $ncl mul 8 div ceiling cvi string def $ngx $ncl 1 +eq{/DeviceGray}{$ncl 3 eq{/DeviceRGB}{/DeviceCMYK}ifelse}ifelse setcolorspace +$llx $lly Tl $urx $llx sub $ury $lly sub scale 8 dict begin/ImageType 1 def +/Width $wid def/Height $hei abs def/BitsPerComponent $bts def/Decode $ncl 1 eq +{[0 1]}{$ncl 3 eq{[0 1 0 1 0 1]}{[0 1 0 1 0 1 0 1]}ifelse}ifelse def +/ImageMatrix[$wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse]def/DataSource +currentfile/ASCII85Decode filter COMP 1 eq{/DCTDecode filter}{COMP 2 eq +{/RunLengthDecode filter}if}ifelse def currentdict end image $SDF{$dsf $dsa +$dsp @ss}if @gr $ctm setmatrix}bd}{/@I_2{}bd}ifelse/@B{@gs S @gr F}bd/@b{@cp @B +}bd/@sep{CurrentInkName_5(Composite)eq{/$ink_5 -1 def}{CurrentInkName_5(Cyan) +eq{/$ink_5 0 def}{CurrentInkName_5(Magenta)eq{/$ink_5 1 def}{CurrentInkName_5 +(Yellow)eq{/$ink_5 2 def}{CurrentInkName_5(Black)eq{/$ink_5 3 def}{/$ink_5 4 +def}ifelse}ifelse}ifelse}ifelse}ifelse}bd/@whi{@gs -72000 dup m -72000 72000 l +72000 dup l 72000 -72000 l @cp 1 SetGry fill @gr}bd/@neg{[{1 exch sub}/exec cvx +currenttransfer/exec cvx]cvx settransfer @whi}bd/deflevel 0 def/@sax{/deflevel +deflevel 1 add def}bd/@eax{/deflevel deflevel dup 0 gt{1 sub}if def deflevel 0 +gt{/eax load}{eax}ifelse}bd/eax{{exec}forall}bd/@rax{deflevel 0 eq{@rs @sv}if} +bd/@daq{dup type/arraytype eq{{}forall}if}bd/@BMP{/@cc xd 12 index 1 gt +UseLevel2 true eq and{7 -2 roll pop pop @I_2}{11 index 1 eq{12 -1 roll pop @i} +{7 -2 roll pop pop @I}ifelse}ifelse}bd systemdict/pdfmark known not{/pdfmark +/cleartomark ld}if +end +%%EndResource +%%EndProlog +%%BeginSetup +wCorel7Dict begin +@BeginSysCorelDict +2.6131 setmiterlimit +1.00 setflat +/$fst 128 def +%%EndSetup + +%%Page: 1 1 +%LogicalPage: 1 +%%BeginPageSetup +@sv +@sm +@sv +%%EndPageSetup +@rax 148.75200 46.44000 446.25600 -46.44000 @E +1240 387 8 3 0 0 1049529 -327661 1 1 0 -327660 1049528 0 [0.00028346 0.00000000 0.00000000 0.00028346 0.00000000 92.87999660] /@cc load @BMP +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd +fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdbdbdbdfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0707070f0f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929010101010101030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303010101010101181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777010101010101 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303 +030303030303030303030303030303030303030303030303010101010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939393020202010101010101000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000020202010101858585ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcdcdcd0c0c0c010101010101 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2929290000000000000101014546386e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a6e705a +6e705a6e705a6e705a6e705a6e705a6e705a171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000 +3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e8066bdc09afbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e80667e80667e80667e80667e80667e80667e8066 +7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066bdc09afbffccfbffcc7e80667e8066fbffcc +fbffccfbffcc7e80667e80667e8066fbffccfbffccfbffccbdc09a7e80667e80667e8066bdc09afbffccfbffcc7e80667e8066fbffccfbffccfbffcc +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffcc +7e80667e8066fbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e8066bdc09afbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066fbffcc +fbffccbdc09a7e8066bdc09afbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffcc +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80667e80667e8066bdc09afbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffcc7e80667e80667e8066fbffccfbffcc +fbffccbdc09a7e80667e80667e8066bdc09afbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e80667e80667e80667e80667e8066 +7e80667e8066bdc09afbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffcc +fbffccfbffccbdc09a7e80667e8066fbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccbdc09a7e8066bdc09afbffccfbffcc7e80667e8066fbffccfbffcc +fbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000000000 +0000000000003f4033fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000000000000000000000000000000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffcc3f40330000000000000000000000000000003f40337e80660000003f4033fbffcc +fbffcc3f40330000000000003f4033fbffccfbffcc3f40330000000000000000000000000000003f40337e80660000003f4033fbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000 +000000000000bdc09afbffccfbffccfbffccfbffccbdc09a000000000000000000bdc09afbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000000000000000000000000000bdc09afbffccfbffccfbffccbdc09a000000000000000000000000000000000000 +bdc09a000000000000bdc09afbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffcc3f40330000000000000000000000000000003f40337e80660000003f4033fbffccfbffccfbffcc3f40330000000000003f4033fbffccfbffcc +3f40330000000000000000000000000000003f40337e80660000003f4033fbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000 +0000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000 +0000000000007e8066fbffcc3f40330000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000bdc09afbffcc +fbffcc3f4033000000000000000000000000bdc09a000000000000fbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e8066fbffccfbffcc +fbffccfbffccfbffccbdc09a000000000000000000000000000000000000bdc09a000000000000bdc09afbffccfbffcc000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc3f40330000000000000000000000000000003f4033fbffccfbffccfbffcc +fbffccbdc09a000000000000000000000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a0000000000003f40337e8066 +7e80660000000000003f4033fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc0000000000007e80667e80667e80667e80667e8066 +7e80660000000000000000007e8066fbffccfbffccfbffccbdc09a0000000000003f40337e80667e80663f40330000000000000000007e8066fbffcc +fbffcc0000000000007e8066bdc09afbffccbdc09a0000000000003f40337e80667e80663f40330000000000000000007e8066fbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc3f40330000000000007e80667e80663f4033000000000000bdc09afbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc0000000000000000003f40337e80667e80667e8066 +0000000000000000007e8066fbffccfbffccfbffcc7e80660000003f40337e8066fbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +fbffccbdc09a0000000000003f40337e80667e80663f4033000000000000bdc09afbffccfbffcc3f40330000000000007e80667e80667e8066000000 +000000000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000007e80667e80663f4033000000000000bdc09afbffccfbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000003f40337e80667e80667e80667e80667e80663f4033000000000000000000fbffccfbffccfbffcc +bdc09a0000000000003f40337e80667e80663f40330000000000000000007e8066fbffccfbffccfbffcc0000000000007e8066bdc09afbffccbdc09a +0000000000003f40337e80667e80663f40330000000000000000007e8066fbffccfbffccfbffccfbffcc3f40330000000000000000007e80667e8066 +7e80667e80660000000000000000000000007e8066fbffccfbffccfbffcc7e80660000003f40337e80667e80667e80667e80667e80667e80667e8066 +7e80667e8066bdc09afbffccbdc09a0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000003f4033fbffccfbffcc +3f40330000000000007e80667e8066000000000000000000000000fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000fbffccfbffcc +fbffccfbffccfbffcc3f40330000000000007e80667e80667e8066000000000000000000000000fbffccfbffccfbffcc000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc3f40330000000000007e80667e80667e80660000000000003f4033fbffccfbffcc +bdc09a0000000000003f40337e80667e80663f4033000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000bdc09afbffccfbffcc +fbffccfbffcc3f40330000007e8066fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000bdc09afbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000007e8066fbffcc +fbffcc000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000007e8066fbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +7e80660000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc3f40330000003f4033bdc09afbffccfbffccfbffccfbffcc +fbffccbdc09a000000000000bdc09afbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +fbffcc0000000000007e8066fbffccfbffccfbffccfbffcc3f40330000003f4033fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +3f4033000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000003f4033fbffccfbffcc +7e80660000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffcc7e8066 +0000007e8066fbffccfbffccfbffccfbffccbdc09a0000000000007e8066fbffccfbffccfbffcc7e80660000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a3f4033000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc7e8066 +0000003f4033fbffccfbffccfbffccfbffcc3f4033000000000000fbffccfbffccfbffccfbffccfbffcc3f40330000007e8066000000bdc09afbffcc +fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000000000fbffccfbffccfbffcc000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000bdc09afbffcc +0000000000007e8066fbffccfbffccfbffccfbffcc3f40330000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccbdc09a0000003f4033fbffccfbffccfbffcc +fbffccfbffccbdc09a0000003f4033fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000003f4033fbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc +fbffcc000000000000fbffccfbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000bdc09afbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000007e8066fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +bdc09a0000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066fbffccfbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffcc +fbffcc000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000bdc09afbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000bdc09afbffcc +7e80660000003f4033fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffcc7e8066 +0000003f4033fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffcc3f4033 +000000bdc09afbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffccfbffccbdc09a0000003f4033bdc09a0000003f4033fbffcc +fbffccfbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc7e80663f4033bdc09abdc09a +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc0000000000000000007e80667e80667e8066bdc09a7e80660000007e8066fbffcc +fbffcc000000000000fbffccfbffccfbffccfbffcc0000000000000000007e80667e80667e8066bdc09a7e80660000007e8066fbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e80660000007e8066fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000003f40337e80667e80667e8066 +fbffcc000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc +fbffcc0000000000000000007e80667e80667e8066bdc09a7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +0000000000000000007e80667e80667e8066bdc09a7e80660000007e8066fbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e80667e80667e80667e80667e80667e80663f40330000007e8066fbffccfbffcc000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc000000000000fbffcc +fbffccfbffccfbffcc7e80660000000000003f40337e80667e80667e8066fbffcc000000000000fbffccfbffccfbffcc000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffcc +fbffcc000000000000fbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a000000000000bdc09afbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +7e8066000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffcc7e8066000000000000000000000000000000 +000000000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000fbffcc +fbffccbdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +bdc09a3f40330000000000000000000000000000000000000000007e8066fbffccfbffcc3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc +bdc09a7e80667e80667e80667e8066000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000fbffccfbffccfbffcc000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc000000000000fbffccfbffcc7e80660000007e8066 +fbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000fbffccfbffccfbffcc000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000 +0000003f40337e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80663f40330000000000007e8066fbffcc +fbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80663f40330000000000007e8066fbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +3f40330000000000003f4033fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +7e8066000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066 +000000000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000007e8066bdc09afbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffccfbffccfbffccfbffccbdc09a7e80667e80663f40330000000000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccbdc09a7e80667e80663f40330000000000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +7e8066000000000000000000000000000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000003f40337e80667e80667e80667e80667e80660000003f4033fbffccfbffccfbffcc000000 +000000fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccbdc09a0000003f4033fbffccfbffccfbffcc0000003f4033 +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066000000000000000000fbffccfbffccfbffcc000000000000fbffccfbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +000000000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000 +0000000000000000003f4033fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccbdc09a0000003f4033fbffccfbffccfbffcc +fbffccfbffccbdc09a0000003f4033fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e8066fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc +fbffcc000000000000fbffccfbffccfbffccfbffccfbffcc7e8066fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc +000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000bdc09afbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccbdc09a7e8066000000000000000000000000 +0000000000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc +bdc09a0000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000003f4033fbffccfbffccfbffccbdc09abdc09afbffccfbffccfbffccfbffcc +fbffcc000000000000fbffccfbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffcc3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033000000bdc09afbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffccfbffcc7e8066fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +fbffcc7e8066fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a7e80667e80667e80667e80667e80667e8066fbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffcc3f4033000000fbffccfbffccfbffccfbffcc7e8066000000bdc09afbffccfbffccfbffcc3f4033 +000000bdc09afbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffcc3f4033000000bdc09afbffccfbffccfbffcc3f4033000000 +bdc09afbffccfbffccfbffccbdc09abdc09afbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc000000000000bdc09afbffcc +fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc7e8066fbffccfbffccbdc09a +0000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000000000007e8066fbffccfbffcc7e8066000000000000fbffccfbffccfbffccfbffccfbffcc000000000000bdc09afbffccfbffcc +fbffccfbffcc3f40330000007e8066fbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc0000000000007e8066fbffccfbffccfbffccfbffcc3f40330000007e8066fbffcc +fbffcc000000000000fbffccfbffccfbffccfbffcc0000000000007e8066fbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffccfbffcc +000000000000000000000000000000000000000000000000000000fbffccfbffccfbffccfbffcc0000000000007e8066fbffccfbffccfbffccfbffcc +7e80660000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffcc0000000000003f4033fbffccfbffccfbffccbdc09a +0000000000003f4033fbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffccfbffcc3f40330000000000000000000000003f40337e8066 +bdc09afbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc7e8066000000000000fbffccfbffccfbffccfbffcc +fbffcc000000000000bdc09afbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffcc7e8066000000000000fbffccfbffccfbffccfbffcc +bdc09a000000000000fbffccfbffccfbffcc0000000000003f4033fbffccfbffccfbffccbdc09a0000000000003f4033fbffccfbffccfbffccbdc09a +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000fbffccfbffccfbffcc +0000000000007e8066fbffccfbffccfbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffcc0000000000007e8066fbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +0000000000007e8066fbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000 +0000007e8066fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc7e8066 +0000003f4033fbffccfbffccfbffccfbffcc3f4033000000000000fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc7e8066000000 +7e8066fbffccfbffcc7e8066000000000000fbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffcc0000000000003f4033fbffcc +fbffccfbffccfbffcc3f40330000007e8066fbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffcc7e8066000000000000fbffccfbffcc +000000000000bdc09afbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000fbffccfbffcc7e80660000000000000000007e80663f40337e8066fbffccbdc09a0000000000003f40337e8066 +7e80660000000000003f4033fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc7e80660000000000003f40337e80667e80663f4033000000000000bdc09a7e8066 +0000000000000000000000007e8066fbffccfbffcc7e80660000000000003f40337e80667e80663f4033000000000000bdc09afbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000003f40337e8066000000fbffcc +fbffcc3f40330000000000007e80667e80663f4033000000000000bdc09afbffccfbffccfbffcc0000000000003f40333f40337e80667e8066000000 +0000003f40330000003f40337e80667e80660000000000003f4033fbffccfbffccfbffcc7e80660000000000007e8066bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000fbffccfbffcc7e80660000000000000000007e80663f40337e8066 +fbffccbdc09a0000000000003f40337e80667e80663f40330000003f4033fbffccfbffccfbffccfbffcc0000000000000000007e80667e80667e8066 +0000000000003f4033fbffccfbffccfbffcc0000000000003f40333f40337e80667e80660000000000003f40330000003f40337e80667e8066000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffcc +0000000000000000003f40337e8066000000fbffccfbffcc3f40330000000000007e80667e80663f4033000000000000bdc09afbffccfbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffcc7e80660000000000003f40337e80667e80663f4033000000000000bdc09afbffcc7e80660000000000000000000000007e8066fbffccfbffcc +7e80660000000000003f40337e80667e80663f4033000000000000bdc09afbffccfbffcc3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000003f4033fbffccfbffccbdc09a0000007e8066fbffccfbffccfbffccfbffccfbffcc +0000000000000000007e80667e8066000000000000000000000000fbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffcc000000 +000000fbffccfbffccfbffcc0000000000000000007e80667e80667e80660000000000003f4033fbffccfbffccfbffcc0000000000003f4033000000 +7e80667e80663f4033000000000000fbffccfbffccfbffccfbffcc3f40330000000000007e80667e80663f40330000000000007e8066fbffccfbffcc +bdc09a0000000000003f40337e80667e80663f40330000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000fbffccfbffcc7e8066000000bdc09a000000000000000000000000fbffccfbffccbdc09a000000000000000000 +0000000000003f4033fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000003f4033fbffcc7e8066 +0000000000000000000000007e8066fbffccfbffccfbffcc7e80660000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000007e80663f40330000000000000000007e8066 +fbffccfbffcc3f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc000000000000bdc09a000000000000000000000000 +3f4033fbffccbdc09a000000000000000000000000000000bdc09afbffccfbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc7e80667e8066fbffccfbffcc000000000000000000000000000000fbffccfbffcc7e8066000000bdc09a000000000000000000000000 +fbffccfbffccbdc09a0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000 +000000000000bdc09afbffccfbffccfbffcc000000000000bdc09a0000000000000000000000003f4033fbffccbdc09a000000000000000000000000 +000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +0000007e80663f40330000000000000000007e8066fbffccfbffcc3f4033000000000000000000000000000000bdc09afbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc +fbffccfbffcc7e80660000000000000000000000000000000000003f4033fbffccfbffcc7e80660000000000000000000000007e8066fbffccfbffcc +fbffcc7e80660000000000000000000000000000000000003f4033fbffccfbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccbdc09a7e80667e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000fbffccfbffcc7e8066000000fbffccfbffccfbffccfbffccfbffccfbffcc +bdc09a3f4033000000000000000000000000bdc09a000000000000fbffccfbffcc3f4033000000bdc09afbffccfbffccfbffccfbffccfbffcc3f4033 +000000bdc09afbffccfbffccbdc09a3f4033000000000000000000000000000000000000bdc09afbffccfbffccfbffcc000000000000bdc09a000000 +000000000000000000000000bdc09afbffccfbffccfbffccfbffccbdc09a3f40330000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccbdc09a0000000000000000000000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e8066fbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccfbffccfbffcc +fbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066bdc09afbffcc +fbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066 +fbffccfbffccfbffccfbffcc7e80667e80667e8066fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e8066fbffcc +fbffccfbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066 +bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e8066fbffccfbffccfbffccfbffcc7e80667e80667e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffccfbffccfbffcc7e80667e8066bdc09afbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000bdc09afbffcc +fbffccfbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000bdc09afbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffcc3f40330000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000007e8066fbffcc0000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a7e80667e8066fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e8066fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffcc7e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffcc3f40330000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc +fbffccfbffccbdc09a000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000003f4033fbffccfbffccfbffccfbffccfbffcc +fbffcc3f40330000007e8066fbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000bdc09afbffccfbffccfbffcc +fbffccfbffccfbffcc7e8066000000000000fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000007e8066000000bdc09afbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e80667e80667e80667e80667e8066 +7e80663f4033000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffcc0000000000007e80667e80667e80667e80667e8066 +7e80663f40330000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000007e80667e80667e80667e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000000000007e80667e80667e80667e8066 +0000000000003f4033fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000003f40337e80667e80667e80667e80667e80667e80660000000000003f4033fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e8066fbffccfbffccfbffcc7e80660000003f40337e80667e80667e80667e80667e80667e8066000000000000000000bdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000000000000000007e80667e8066 +7e80667e8066000000000000000000bdc09afbffccfbffccfbffccfbffcc7e80660000003f40337e80667e80667e80667e80667e80667e80667e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000003f4033000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000 +000000000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000000000000000000000000000000000 +0000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccbdc09a3f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +0000000000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000000000000000 +0000003f4033fbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000003f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +000000000000fbffccfbffccfbffcc7e80660000000000000000000000000000000000000000000000000000003f4033bdc09afbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033fbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000000000 +0000000000000000003f4033bdc09afbffccfbffccfbffccfbffccfbffcc7e8066000000000000000000000000000000000000000000000000000000 +000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e80667e80667e80667e80667e80667e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066bdc09afbffccfbffccfbffcc7e80667e80667e80667e80667e80667e80667e8066 +7e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e80667e80667e80667e80667e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +7e80667e8066fbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e80667e80667e80667e8066fbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066 +7e80667e8066bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e80667e80667e80667e80667e80667e80667e80667e80667e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc5e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0af8fccafbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfafecb171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101454638eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c25e5f4c000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +0404030c0c0aeef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2 +eef2c2eef2c2eef2c2eef2c2eef2c2eef2c2171712000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000010101030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302000000000000010101181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302030302 +030302030302030302030302030302030302030302000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000020202181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2292929000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000010101181818ebebebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefe686868000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff292929010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101000000000000000000000000000000010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101181818fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff777777010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000000010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101606060ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292262626000000000000010101191919929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +9292929292929292929292929292929292929292929292929292929292929292924e4e4e0000000000000000000303038d8d8d929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292 +929292929292929292929292929292929292929292929292575757929292ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff4343430000000000000101012b2b2bffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff898989000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff434343000000000000010101232323cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf +cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcf6f6f6f000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff434343000000000000000000000000010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff434343000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050505f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff434343010101000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101f6f6f6ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff434343000000000000010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101000000000000000000000000000000010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010000000000001515157e7e7effffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffc8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8181818000000000000010101434343c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8 +c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1f1f000000000000010101555555ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff7f7f7f7f7f7f7f7f7f7f7f7f7f7f71e1e1e000000000000010101525252f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffefefe3d3d3d010101060606060606010101060606010101000000000000000000020202060606010101060606060606010101 +0e0e0ee8e8e8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffd8d8d8040404000000000000000000000000000000000000000000000000000000000000000000000000000000020202 +b3b3b3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff7878780000000000000000000000000000000000000000000000000000000000000000000000000101017f7f7f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffff8f8f8010101000000000000000000000000000000000000000000000000000000000000010101494949fefefe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffaeaeae000000000000000000000000000000000000000000000000000000010101171717f0f0f0ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffecececffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f5f56a6a6af5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f54e4e4e000000000000000000000000000000000000000000000000040404bebebef5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5 +f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5222222ebebebf5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f030303010101050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505000000000000000000000000000000000000000000000000030303050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505 +050505050505050505050505050505050505010101050505010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f010101010101000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101000000000000000000000000010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705a8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c7038392e0101000101005657458a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c708a8c70 +8a8c708a8c708a8c708a8c708a8c70000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066 +7e80667e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000 +0000000000003f4033fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a +7e8066000000000000bdc09afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc0000000000000000000000000000000000000000000000003f40337e8066fbffccfbffccfbffcc +fbffccfbffccfbffcc7e80660000000000000000000000007e8066fbffcc3f40330000007e8066fbffccfbffccfbffcc3f40330000000000007e8066 +fbffccfbffcc7e80660000000000000000000000007e8066fbffcc3f40330000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000000000000000000000000000000000bdc09afbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000003f4033bdc09afbffcc +fbffccfbffcc7e80660000000000000000000000000000000000003f4033000000000000fbffccfbffccfbffcc7e8066000000000000000000fbffcc +fbffcc7e80660000000000000000000000000000000000003f4033000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffcc3f40330000003f4033bdc09afbffccfbffcc7e8066000000000000bdc09afbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffcc7e80663f40330000003f4033fbffcc +fbffccfbffcc0000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffcc0000000000007e8066fbffccfbffccfbffcc7e8066000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000007e8066 +fbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffcc000000000000fbffccfbffccfbffccfbffccfbffccbdc09a000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +fbffccfbffcc3f40330000003f4033bdc09afbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffcc3f40330000003f4033bdc09afbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000 +bdc09afbffccbdc09a0000000000000000000000000000000000007e8066000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffccbdc09a0000000000000000000000000000000000007e8066000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e80667e80667e80667e80667e80667e8066bdc09afbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +7e8066fbffccfbffccfbffcc7e80667e8066000000000000000000000000000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffccfbffccfbffcc7e80667e8066000000000000000000000000000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000bdc09afbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +7e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000007e80667e80667e80667e80667e80667e8066000000000000000000bdc09afbffcc +fbffcc7e80660000003f4033fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +7e8066fbffccbdc09a3f40333f4033fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffccbdc09a3f40333f4033fbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000003f4033fbffcc +fbffcc7e80660000000000007e8066fbffccbdc09abdc09afbffcc3f40330000003f4033bdc09afbffccfbffcc7e8066000000000000bdc09afbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e8066000000 +7e8066fbffccbdc09a0000000000007e8066fbffccfbffccfbffcc3f4033000000000000fbffccfbffcc7e80663f40330000003f40337e8066fbffcc +fbffccbdc09a0000000000007e8066fbffccfbffccfbffcc3f4033000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffcc7e80660000003f40330000000000000000003f4033fbffccfbffcc3f4033000000000000000000000000000000000000bdc09afbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f4033000000 +bdc09afbffccfbffcc3f40330000000000000000000000000000000000000000007e8066fbffccfbffcc000000000000000000000000000000fbffcc +fbffccfbffcc3f40330000000000000000000000000000000000000000007e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffcc +fbffccbdc09a7e8066fbffcc3f40330000000000007e8066fbffccfbffccfbffcc7e80660000000000000000003f4033bdc09afbffccfbffccfbffcc +fbffccbdc09a7e8066bdc09afbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000 +fbffccfbffccfbffccfbffccbdc09a3f40330000000000000000003f40337e8066fbffccfbffccfbffcc7e80663f40330000003f40337e8066fbffcc +fbffccfbffccfbffccbdc09a3f40330000000000000000003f40337e8066fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc3f40330000007e8066 +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000000000007e8066fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc000000000000fbffccfbffccfbffccfbffccfbffccfbffccbdc09a3f4033000000000000fbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc7e80660000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000000000003f4033fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc000000000000000000000000000000000000000000000000000000000000000000bdc09afbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09a0000007e8066fbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffcc0000000000000000000000000000000000000000000000000000007e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffcc7e80660000007e8066fbffccfbffccfbffcc0000000000000000000000000000000000000000000000003f40337e8066fbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccbdc09afbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +6e705afbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffccfbffcc +fbffccfbffccfbffccfbffccc8cba2000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a48493a +48493a48493a48493a48493a48493a000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f000000000000010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101000000000000000000010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff929292020202000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000010101575757fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfd0f0f0f010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101cdcdcdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + +%%PageTrailer +@rs +@rs +%%Trailer +@EndSysCorelDict +end +%%DocumentSuppliedResources: procset wCorel7Dict +%%EOF diff --git a/documentation/graphics/STIR-developers-overviewFig9.png b/documentation/graphics/STIR-developers-overviewFig9.png new file mode 100644 index 0000000000..fb63d589f5 Binary files /dev/null and b/documentation/graphics/STIR-developers-overviewFig9.png differ diff --git a/documentation/graphics/STIR-general-overviewFig1.eps b/documentation/graphics/STIR-general-overviewFig1.eps new file mode 100644 index 0000000000..562afe11c1 --- /dev/null +++ b/documentation/graphics/STIR-general-overviewFig1.eps @@ -0,0 +1,781 @@ +%!PS-Adobe-3.0 +%%Creator: Advanced Batch Converter +%%Title: +%%CreationDate: Mon Oct 25 21:10:17 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 594 841 +%%EndComments +%%BeginProlog +10 dict begin +%%EndProlog +%%Page: 1 1 +0 842 translate +595 -119 scale +788 158 8 +[ 788 0 0 158 0 0 ] +/rstr 788 string def +/gstr 788 string def +/bstr 788 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 32274 ASCII Bytes +colorimage +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcCE'JHUN,^BB,fXT*e~> +JcCE'JHUN,^BB,fXT*e~> +JcCE'JHUN,^BB,fXT*e~> +JcCE'JHUN,^BB,fXT*e~> +JcCE'JHUN,^BB,fXT*e~> +JcCE'JHUN,^BB,fXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrg.;q?69e! +JcCE'rrg.;q?69e! +JcCE'rrg-]q?692! +JcCE'rrg.;! +JcCE'rrg.;! +JcCE'rrg-]! +JcCE'rrg.;! +JcCE'rrg.;! +JcCE'rrg-]! +JcCE'rrg.;! +JcCE'rrg.;! +JcCE'rrg-]!lf"O-hgrri5C!sHgNbl>lg"O%#K"GG#!"G-TS +s*t~> +JcCE'rrg.;! +JcCE'rrg.;! +JcCE'rrg-]!ukbl5fe"O$qk"O-ni!ukbl>lf"O-kh!F! +JcCE'rrg.;q?6Zp! +JcCE'rrg.;q?6Zp! +JcCE'rrg-]q?6Z=!lf"O-kh! +JcCE'rrg.;! +JcCE'rrg.;! +JcCE'rrg-]! +JcCE'rrg.;!u! +JcCE'rrg.;!u! +JcCE'rrg-]!ukbkoWa"9QdMbl5fe"O-_d!uk +bQ>ukbkoTb"O-be!lf +"O-kh! +JcCE'rrg.;!u! +JcCE'rrg.;!u! +JcCE'rrg-]!lf"O-_d!uk +bQ>ukbkoTb"O-be!lf +"O-kh! +JcCE'rrg.;!u! +JcCE'rrg.;!u! +JcCE'rrg-]!lf"O-_d!ukbQ>ukbl5fe"O$qk"O-kh!lf"O-kh! +JcCE'rrg.;q?6ftrWE<&"TSN%r<3-"! +JcCE'rrg.;q?6ftrWE<&"TSN%r<3-"! +JcCE'rrg-]q?6fArWE;H"O-nir<3,D!o`"TQ[H"O-ni! +JcCE'rre/X!rrdoQXT*h~> +JcCE'rre/X!rrdoQXT*h~> +JcCE'rre/%! +JcCE'rre/X!rrdoQXT*h~> +JcCE'rre/X!rrdoQXT*h~> +JcCE'rre/%! +JcCE'rre5ZrrgaLrrdoQmf3:iJcDhOJH~> +JcCE'rre5ZrrgaLrrdoQmf3:iJcDhOJH~> +JcCE'rre5'rrg`nrrdnsm`b\6JcDhOJH~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdoQJcEXfrrdoQXT*e~> +JcCE'rrdnsJ]u$UrrdoQXT*e~> +JcCE'JHUN,^BB,fXT*h~> +JcCE'JHUN,^BB,fXT*h~> +JcCE'JHUN,^BB,fXT*h~> +JcCE'JHUN,^]]5gX8d_~> +JcCE'JHUN,^]]5gX8d_~> +JcCE'JHUN,^]]5gX8d_~> +JcC<$JcFg2! +JcC<$JcFg2! +JcC<$JcFg2! +JcC<$JcFj3rWIfPJcC]/J:~> +JcC<$JcFj3rWIfPJcC]/J:~> +JcC<$JcFj3rWIfPJcC]/J:~> +JcC<$JcFj3r<.]OJcC`0J:~> +JcC<$JcFj3r<.]OJcC`0J:~> +JcC<$JcFj3r<.]OJcC`0J:~> +JcC<$JcFm4quhTNJcC`0J:~> +JcC<$JcFm4quhTNJcC`0J:~> +JcC<$JcFm4quhTNJcC`0J:~> +JcC<$JcFm4qZMKMJcCc1J:~> +JcC<$JcFm4qZMKMJcCc1J:~> +JcC<$JcFm4qZMKMJcCc1J:~> +JcC<$JcFp5q#l9KJcCf2J:~> +JcC<$JcFp5q#l9KJcCf2J:~> +JcC<$JcFp5q#l9KJcCf2J:~> +JcC<$JcFp5q#l9KJcCf2J:~> +JcC<$JcFp5q#l9KJcCf2J:~> +JcC<$JcFp5q#l9KJcCf2J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcC<$JcFj3rrdoQJcCZ.J:~> +JcD>AJHUN,M?JM1a8^\~> +JcD>AJHUN,M?JM1a8^\~> +JcD>AJHUN,M?JM1a8^\~> +JcDDCJHUN,L]i;/a8^\~> +JcDDCJHUN,L]i;/a8^\~> +JcDDCJHUN,L]i;/a8^\~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +JcDDCrrdoQJcC]/rrdoQa8^Y~> +nGe%BJHUN,p]#dIJHVbOjo9i~> +nGe%BJHUN,p]#dIJHVbOjo9i~> +nGe%BJHUN,p]#dIJHVbOjo9i~> +nGe%BJHUN,p]#dIJHVbOjo9i~> +nGe%BJHUN,p]#dIJHVbOjo9i~> +nGe%BJHUN,p]#dIJHVbOjo9i~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9l~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9l~> +nGiLk!WN<""Rl?k"TSB!q?6?g! +nGiLk!WN<""Rl?k"TSB!q?6?g! +nGiLk!R(]D"RjP8"O-beq?6?4! +nGiLk!riE'r;Qd#s7-*i"TSB!!UHus8;lt"TOM^rri)rrri6!! +nGiLk!riE'r;Qd#s7-*i"TSB!!UHus8;lt"TOM^rri)rrri6!! +nGiLk!mCekr6,0EbjimX"O-be!bQ.jjr6,0EbiHtK"O-P_! +nGiLk!riE'r;Qd#s7-*i"TSB!!UHus8;lt"TOM^rri)rrri6!! +nGiLk!riE'r;Qd#s7-*i"TSB!!UHus8;lt"TOM^rri)rrri6!! +nGiLk!mCekr6,0EbjimX"O-be!bQ.jjr6,0EbiHtK"O-P_! +nGiLk!riE'r;Qd#s8W,t"TAB!"TSK&"TSK$!#pjo9i~> +nGiLk!riE'r;Qd#s8W,t"TAB!"TSK&"TSK$!#pjo9i~> +nGiLk!mCekr6,0Ebl>oc"T?RC"TQ[H"O-kh!ukbl>lg"O%#K"THUG"O-ef +!oc"TQ[H"O-ni!sHgN +bl>lh"O%"mr65*Bs31EE"3^nl"9J_M"9AYLrQG9FbQ>ukbl#Ze"O%"mrQG?HbQQ/fbQ.jj!mCek +s3(NIbQRqKR*>R5p](6rqof'Dbl>oc"T?RC"TQ[H"O-kh! +nGiLk!riE'rVlm$s8W*""TSK$! +nGiLk!riE'rVlm$s8W*""TSK$! +nGiLk!mCekrQG9Fbl>lf"O-kh!ukbl5fe"O$qk"O-ni!lf"O-nirri>F!F!sHgNbl>oe +"TQ[H"O-ef!lh"O%"ms3(QJbQQ/gbQ.jjrlbBGbQ>ukbl>oe +"THUI"O%"ms3(KHbl>lf"O-hg!ukbl#Zc"O-ni!ukbl>oe"9QdMbl>oe +"THUG"O-kh!ukbl>lf"O-kh!sHgN +bl>lf"O-ni! +nGiLk!WN<""Sr&u"TJQ'"TSE"! +nGiLk!WN<""Sr&u"TJQ'"TSE"! +nGiLk!R(]D"Sp7B"O$qk"O-ef!lf"O-niq?6`?!lf"O-kh!sHgNbl5fe"O$nj"T&?$bQ.jjrQG9Fbl5fg"O%"ms3(QJbQQ/ibQA!l +"O-Yb!o`"T6IE"O-ni!X-^MqZQrC!ukbl#Zc +"O-ni!lf"O-kh!ukbkfNc"O%"ms3(KHbl>lf"O-kh! +nGiLk!riE'r;Qd#s8N&s"TSK&"TSE"!sJW,s8Dru"TS;t! +nGiLk!riE'r;Qd#s8N&s"TSK&"TSE"!sJW,s8Dru"TS;t! +nGiLk!mCekr6,0Ebl5ib"TQ[H"O-ef!sHgNbl,`d"O-\c!lf"O-kh!ukbk]H`"O-hg!ukbkoW_"TQ[H"O-ni!ukbl>lf"O-kh!lh"O%"mr6,6G +bQQ/ibQ.jjrlbBGbQ>ukbl#Zc"O-khrri8D!ukbl5fg"O%"ms3(KHbl5fe +"O-kh! +nGiLk!riE'r;Qd#s8W*""TSN%!UHus8Dru"TSK$!sJW,s8W*" +"TSB!!UHus8Dru"TSK$!sJW, +s8W*""TJW)"TJW)!riE'r;Qd#s8W*""TJQ'"TSN%! +nGiLk!riE'r;Qd#s8W*""TSN%!UHus8Dru"TSK$!sJW,s8W*" +"TSB!!UHus8Dru"TSK$!sJW, +s8W*""TJW)"TJW)!riE'r;Qd#s8W*""TJQ'"TSN%! +nGiLk!mCekr6,0Ebl>lf"O-ni!lf +"O-be!ukbl#Zc"O-efrri>F!lf"O%"m"O%"m!mCekr6,0Ebl>lf"O$qk"O-ni!ukbl#]b"9QdM +bl5fe"O-\c!ukbl#Ze"O%"ms3(KHbl5fe"O$qk"O-ef!lf"O-kh!ukbl5fe +"O-ni!sHgNbl>lf"O-ni!]"QfZ6~> +nGiLk!riE'r;Qd#rrW3's8N$!"TJQ'"TSE"!u! +nGiLk!riE'r;Qd#rrW3's8N$!"TJQ'"TSE"!u! +nGiLk!mCekr6,0EbQ>ukbl5fe"O$qk"O-ef!lf"O-kh!ukbk]H`"O-hg!ukbl,`d"O-kh!lh +"O%"ms3(KHbl#Zc"O$qk"O-ni!ukbl5fe"O$qk"O-ef!ukbl5fe"O-kh!ukbl#Zc"O-_d!ukbl5fg"O%"ms3(KHbl5fe"O-kh!lf"O-kh! +nGiLk!riE'r;Qd#rrW3's8W-!"TSK&"TSK$!sJW,s8W*""TSN%!UHus8Dru"TSK$!sJW,s8W*""TSK$! +nGiLk!riE'r;Qd#rrW3's8W-!"TSK&"TSK$!sJW,s8W*""TSN%!UHus8Dru"TSK$!sJW,s8W*""TSK$! +nGiLk!mCekr6,0EbQ>ukbl>oe"TQ[H"O-kh!sHgNbl>lf"O-ni!lf"O-ni!lf"O-ef!lf"O-kh!lf"O-kh!ukbl>lf"O-nirr`DI"O-ni!ukbl5fe"O*UarrhH`JB~> +nGiLk!WN<""TAB""9ST+s8W,t"TSK&"TSK$! +nGiLk!WN<""TAB""9ST+s8W,t"TSK&"TSK$! +nGiLk!R(]D"T?RD"9QdMbl>oc"TQ[H"O-kh!lf"O-kh!lf"O-ni!lf"O-kh!ukbk]H`"O-efr<3/E!o`"T$=C"O-ni +q?6iB!I"O%#K"9QdMbl5ib"THUG"O-kh! +nGiLkaSu8Ds3UcH"TQOB! +nGiLkaSu8Ds3UcH"TQOB! +nGiLkaNOYfbg=Q7"O+p1! +nGiLkaSu8Ds3UcH"TQ^G! +nGiLkaSu8Ds3UcH"TQ^G! +nGiLkaNOYfbg=Q7"O,*6! +nGiLkb5_JEd/X+KaoD;Bl2Ubdb5_JEJc>cN"9AZ*q#C?sbl@\Gd/X+KaT)2Ai;Wf\s+14@s8N5` +s+'~> +nGiLkb5_JEd/X+KaoD;Bl2Ubdb5_JEJc>cN"9AZ*q#C?sbl@\Gd/X+KaT)2Ai;Wf\s+14@s8N5` +s+'~> +nGiLkb09kgd*2Lmais\dl-0/1b09kgJ]n/="9AZ*q#C?sbfp(id*2LmaNXSci623)b^n"/bl7h- +s+'~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJcC<$L&_/Up](6rJcC<$W;ll#jo9k~> +nGiLkJ]r\hL!9Q"p](6rJ]r\hW6G8Ejo9k~> +nGe%BJHUN,p]#dIJHVbOjo9k~> +nGe%BJHUN,p]#dIJHVbOjo9k~> +nGe%BJHUN,p]#dIJHVbOjo9k~> +nGe%BJHUQ-pA][HJHVePjSsb~> +nGe%BJHUQ-pA][HJHVePjSsb~> +nGe%BJHUQ-pA][HJHVePjSsb~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +JcC<$JcC<$JcC<$mJh\~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/documentation/graphics/STIR-general-overviewFig1.png b/documentation/graphics/STIR-general-overviewFig1.png new file mode 100644 index 0000000000..c8155d43f4 Binary files /dev/null and b/documentation/graphics/STIR-general-overviewFig1.png differ diff --git a/documentation/graphics/STIR-general-overviewFig2.eps b/documentation/graphics/STIR-general-overviewFig2.eps new file mode 100644 index 0000000000..a0f4f8bd86 --- /dev/null +++ b/documentation/graphics/STIR-general-overviewFig2.eps @@ -0,0 +1,1831 @@ +%!PS-Adobe-3.0 +%%Creator: Advanced Batch Converter +%%Title: +%%CreationDate: Mon Oct 25 21:10:50 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 594 841 +%%EndComments +%%BeginProlog +10 dict begin +%%EndProlog +%%Page: 1 1 +0 842 translate +595 -432 scale +597 434 8 +[ 597 0 0 434 0 0 ] +/rstr 597 string def +/gstr 597 string def +/bstr 597 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 67326 ASCII Bytes +colorimage +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`J]r\hJ]r\hlHK82j8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`J]r\hJ]r\hlHK82j8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`J]r\hJ]r\hlHK82j8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`J]r\hJ]r\hlHK82j8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`J]r\hJ]r\hlHK82j8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`J]r\hJ]r\hlHK82j8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`JcC<$JcC<$lMpkej8XW~> +jo>>`J]r\hJ]r\hlHK82j8XW~> +jo>>`JcEpn! +jo>>`JcEpn! +jo>>`J]u<]! +jo>>`JcEpn! +jo>>`JcEpn! +jo>>`J]u<]! +jo>>`JcEmm! +jo>>`JcEmm! +jo>>`J]u9\! +jo>>`JcEmm! +jo>>`JcEmm! +jo>>`J]u9\!lf"O$qk"O-be!lh"O%"mrlbBG +bQ>ukbl#]b"T-CD"O-hgrrdnsT$73;j8XW~> +jo>>`JcEjl! +jo>>`JcEjl! +jo>>`J]u6[!ukbkoTb"O-ni! +jo>>`JcEjl!UHurrW3's8N$!"TJQ'"TSH#!sJW,s8W*$"TJW)s8N*&rrW3' +rrW3's8N$!"TJQ'"TSB!! +jo>>`JcEjl!UHurrW3's8N$!"TJQ'"TSH#!sJW,s8W*$"TJW)s8N*&rrW3' +rrW3's8N$!"TJQ'"TSB!! +jo>>`J]u6[!ukbl5fe"O$qk"O-hg!sHgNbl>lh"O%"ms3(KHbQ>uk +bQ>ukbl5fe"O$qk"O-be!lf"O-Yb! +jo>>`JcEgk!sJW,s8Dru"TSH#! +jo>>`JcEgk!sJW,s8Dru"TSH#! +jo>>`J]u3Z!sHgNbl,`d"O-hg!ukbl,`f"O%"ms3(QJbQQ/ibQ.jj +!mCek!mCekrlbBGbQ>ukbkoTb"O-ni! +jo>>`JcEgk!sJW,s8Dru"TSH#!A +rrhB^JH~> +jo>>`JcEgk!sJW,s8Dru"TSH#!A +rrhB^JH~> +jo>>`J]u3Z!sHgNbl,`d"O-hg!ukbl,`f"O%"ms3(QJbQQ/ibQ.jj +!mCek!mCekrlbBGbQ>ukbkoTb"O-ni! +jo>>`JcEdj! +jo>>`JcEdj! +jo>>`J]u0Y! +jo>>`JcEdj! +jo>>`JcEdj! +jo>>`J]u0Y! +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +JcC<$g].6UJcC<$ec1.~> +JcC<$g].6UJcC<$ec1.~> +JcC<$g].6UJcC<$ec1.~> +JcC<$h#I +JcC<$h#I +JcC<$h#I +JcC<$h#I9TJcC<$f)L7~> +JcC<$h#I9TJcC<$f)L7~> +JcC<$h#I9TJcC<$f)L7~> +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>;_r;Qd#s5$qs0hq."TJQ'"TR?Y! +jo>;_r;Qd#s5$qs0hq."TJQ'"TR?Y! +jo>;_r6,0Ebi$\G"O-\c!bdP^r"O$qk"O,`H! +jo>8^rVlm$s472N"TSB!!u! +jo>8^rVlm$s472N"TSB!!u! +jo>8^rQG9Fbgsu="O-be! +jo>;_!riE's8N*&s8W*""TSK$! +jo>;_!riE's8N*&s8W*""TSK$! +jo>;_!mCeks3(KHbl>lf"O-kh!FrWN2D!F! +jo>;_!riE's8N*&s8W*""TSK$! +jo>;_!riE's8N*&s8W*""TSK$! +jo>;_!mCeks3(KHbl>lf"O-kh!lf"O-khrri>F!lf"O$qk"O-kh +!ukbl>lf"O-kh +!lf"O$qk"O-ni!sHgNbl>lf"O-kh!lf"O$qk"O-ni! +jo>;_s8N*&rrW3's8W*""TSK$!$qs82fs"TSK$! +jo>;_s8N*&rrW3's8W*""TSK$!$qs82fs"TSK$! +jo>;_s3(KHbQ>ukbl>lf"O-kh!ukbl5fe"O$qk"O-ni!ukbl>lf"O-ni!sHgNbl>lf"O$qk"O-ni +!lf"O-kh!lf +"O-kh!bkoTb"O-kh!lf"O-hg +!ukbQ>ukbl5id"THUG"O-ni! +jo>;_s8N*&rrW3's8W*""TSK$! +jo>;_s8N*&rrW3's8W*""TSK$! +jo>;_s3(KHbQ>ukbl>lf"O-kh!lf"O-khq?6Z=!ukbl5fg"O%"ms3(QJbQQ/ibQ.jjs3(KHbQ>ukbl5fe +"O$qk"O-be!sHgNbl5fe"O-khrWN5EqZQrC!oa"TQ[H"O-kh! +bQ.jjqonp?s3(KHbl>o`"THUG"O-ni! +jo>;_rr3''rriB%rrE9&rr3!%rrW3's8W*""TSN%!^HtqYpR!s82fs"TJQ'"TSH#!urreD_rrhB^JH~> +jo>;_rr3''rriB%rrE9&rr3!%rrW3's8W*""TSN%!^HtqYpR!s82fs"TJQ'"TSH#!urreD_rrhB^JH~> +jo>;_rlbHIbQQ/ibQ.jjrlbBGbQ>ukbl>lf"O-ni!ukbk]Hb"O%"m +rQG9Fbl,`d"O-be!ukbl5fg"O%"ms3(QJbQQ/ibQ.jjs3(KHbQ>ukbl5fe +"O$qk"O-be!sHgNbl5fe"O-be!ukbl,`d"O-ni!ukbl>lf"O-ni!ukbQ>uk +bl>lf"O-ni!lf"O-kh!lf"O-ni! +jo>;_rr3''rriB%rrE9&rr3!%rrW3's8W*""TSN%! +jo>;_rr3''rriB%rrE9&rr3!%rrW3's8W*""TSN%! +jo>;_rlbHIbQQ/ibQ.jjrlbBGbQ>ukbl>lf"O-ni!ukbk]Hb"O%"m +rQG9Fbl,`d"O-be!ukbl5fg"O%"ms3(QJbQQ/ibQ.jjs3(KHbQ>ukbl5fe +"O$qk"O-be!sHgNbl5fe"O-be!lh"O%"mr650DrlbBGbl5fe"O$qk"O-kh!lf"O-be!ukbl5fe"O-ef +!lf"O-hg!uk +bl,`d"O-ni! +jo>;_rVum#rr3!%s8W-!"TSK&"TSN%! +jo>;_rVum#rr3!%s8W-!"TSK&"TSN%! +jo>;_rQP9ErlbBGbl>oe"TQ[H"O-ni!ukbl>lf"O$qk"O-ni!ukbl,`d"O-hg!uk +bl5fe"O-ni!lf"O-ni!oe"THUI"O%"mqTJsCbQ>ukbl5fe"O$qk"O-nirriAG!lf"O-kh!ukbl5fe"O$qk"O-ni!ukbQ>ukbl5id"THUG"O-ni! +jo>;_r;Qd#s8N&t"9ST+rrW3's8W*""TSN%! +jo>;_r;Qd#s8N&t"9ST+rrW3's8W*""TSN%! +jo>;_r6,0Ebl5ic"9QdMbQ>ukbl>lf"O-ni!od"T$=C"O-ber<3/E +rWN2DrWN8Fr<3,D!lf"O-khr<3,D!bQ.jjrlbBGbl>oc"THUG"O-khr<*2G"O-ni! +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!ukbgFW8"O)G@ilqE*j8XZ~> +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!ukbgFW8"O)G@ilqE*j8XZ~> +jo>>`JcEUerrh$Tq#l9KJcFL)rrhB^JB~> +jo>>`JcEUerrh$Tq#l9KJcFL)rrhB^JB~> +jo>>`J]u!Trrh$!q#l8mJ]ulmrrhB^JB~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +JcC<$g].6UJcC<$ec1.~> +JcC<$g].6UJcC<$ec1.~> +JcC<$g].6UJcC<$ec1.~> +JcC<$h#I +JcC<$h#I +JcC<$h#I +JcC<$h#I9TJcC<$f)L7~> +JcC<$h#I9TJcC<$f)L7~> +JcC<$h#I9TJcC<$f)L7~> +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcG9?! +jo>>`JcG9?! +jo>>`J^!Z.! +jo>>`JcG<@!sJW,s0r"/"TPq1! +jo>>`JcG<@!sJW,s0r"/"TPq1! +jo>>`J^!]/!sHgNbdYds"O+ +jo>>`JcG<@!sJW,s8Ds!"TJT+"TJT*"TJN&"TAQ(rrE9&rVlm$s8Dru"TSN%!X/N+rri?$! +jo>>`JcG<@!sJW,s8Ds!"TJT+"TJT*"TJN&"TAQ(rrE9&rVlm$s8Dru"TSN%!X/N+rri?$! +jo>>`J^!]/!sHgNbl,`e"O$uM"O$uL"O$nj"TAQ(bQ.jjrQG9Fbl,`d"O-ni!X-^Mrri>F! +jo>>`JcG<@!sJW,s8Dut"9JN*! +jo>>`JcG<@!sJW,s8Dut"9JN*! +jo>>`J^!]/!sHgNbl,cc"9H^L!ukbl5fe +"O$nj"9AYL!R(ZI"O$qk"O-\c!ukbQ>ukbl5fe"O$nj"9AYLs3(KHbQ>ukbl>lf"O-hg!ukbl#Zc"O-hgrrdns[`naSj8XY~> +jo>>`JcG?A! +jo>>`JcG?A! +jo>>`J^!`0!ukbk]H`"O$qk"O-ni!lf"O-\c!lf"O$qk"O-kh!ukbl5fe"O$qk"O-kh!ukbQ>ukbl5fe"O$qk +"O-ni! +jo>>`JcG?A! +jo>>`JcG?A! +jo>>`J^!`0!ukbl#]`"TQ[H"O-ni!sHgNbkfNa"O-kh!lf"O-\c!lf"O$nj"T/E&bQ.jjrlbBGbl>od +"THUG"O$qk"O-kh! +jo>>`JcGBBq?6ft! +jo>>`JcGBBq?6ft! +jo>>`J^!c1q?6fA!lh"O%"ms31KGqof'Dbl5fe"O$qk"O-kh!ukbkoTb"O-kh!ukbl5fe"O-ef!ukbkoTb"O-ni! +jo>>`JcGBB! +jo>>`JcGBB! +jo>>`J^!c1!ukbl5fe"O-kh!ukbl>lf"O-ni!ukbQ>ukbl>lf"O-ni!lf +"O-ef! +jo>>`JcGEC! +jo>>`JcGEC! +jo>>`J^!f2!oe"THUI"O%"mqof'Dbl>lf"O-kh!lf"O-\c!lf"O$qk"O-kh!ukbQ>ukbl5fe"O$qk"O-kh! +jo>>`JcGEC! +jo>>`JcGEC! +jo>>`J^!f2!ukbQ>ukbl>lf"O-ni!od"THUG"O-ni +r<3,D!lf"O-ef! +jo>>`JcFC&! +jo>>`JcFC&! +jo>>`J]ucj! +jo>>`JcFC&! +jo>>`JcFC&! +jo>>`J]ucj! +jo>>`JcFI(rrh'Uq#l9KJcEUerrhB^JB~> +jo>>`JcFI(rrh'Uq#l9KJcEUerrhB^JB~> +jo>>`J]uilrrh'"q#l8mJ]u!TrrhB^JB~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +JcC<$g].6UJcC<$ec1.~> +JcC<$g].6UJcC<$ec1.~> +JcC<$g].6UJcC<$ec1.~> +JcC<$h#I +JcC<$h#I +JcC<$h#I +JcC<$h#I9TJcC<$f)L7~> +JcC<$h#I9TJcC<$f)L7~> +JcC<$h#I9TJcC<$f)L7~> +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +JcC<$g].9VJcC<$eGk%~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`JcC<$JcC<$lMpkej8XY~> +jo>>`J]r\hJ]r\hlHK82j8XY~> +jo>>`JcEOcqZQlt! +jo>>`JcEOcqZQlt! +jo>>`J]tpRqZQlA! +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR! +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR! +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!uk +bl>lh"O%"mrlbBGbQ>ukbl>oe"9QdMbl#Zc"O-ni!ukbl>lh"O%"m +s3(KHbQ>ukbl,`d"O)G@T$73;j8XW~> +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!ukbl5fg"O%"mr6,0Ebl>lf"O-kh!sHgNbl5fe"O$qk"O-hg!lf +"O)G@S]q*:j8XW~> +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!od"TQ[H"O-ni! +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!lf"O-kh!sHgNb^n!.bl7h+s*t~> +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!lf"O-kh!sHgNb^n!.bl7h+s*t~> +jo>>`JcEOc! +jo>>`JcEOc! +jo>>`J]tpR!ukbl>lh"O%"ms3(KHbl>lf"O-kh!ukbl>lh"O%"m +s3(KHbl5fg"O%"mJ]sY.rrhB^JH~> +jo>>`JcEOcqZQlt!rrhB^JB~> +jo>>`JcEOcqZQlt!rrhB^JB~> +jo>>`J]tpRqZQlA!od"THXD"T?RD"9ZjNbQRhH +qoo!As3(KHbl5fe"O-nirWN8F! +jo>>`JcC<$df0=Ns+13>s8N5^s*t~> +jo>>`JcC<$df0=Ns+13>s8N5^s*t~> +jo>>`J]r\hd`_^pb^n!-bl7h+s*t~> +jo>>`JcC<$df0=Ns+13>s8N5^s*t~> +jo>>`JcC<$df0=Ns+13>s8N5^s*t~> +jo>>`J]r\hd`_^pb^n!-bl7h+s*t~> +jo>>`JcC<$eGoOOJcD/ +jo>>`JcC<$eGoOOJcD/ +jo>>`J]r\heBIpqJ]sP+rrhB^J:~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$q#:?ts+13$s7QEl"QTN4~> +jo>>`JcC<$q#:?ts+13$s7QEl"QTN4~> +jo>>`J]r\hpriaAb^muhbk93["QTN4~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +JcC<$h#I9TJcC<$f)L8~> +JcC<$h#I9TJcC<$f)L8~> +JcC<$h#I9TJcC<$f)L8~> +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcGcMqZQou!UHus82fs"TO&Q`W,r@j8XZ~> +jo>>`JcGcMqZQou!UHus82fs"TO&Q`W,r@j8XZ~> +jo>>`J^"/bj8XZ~> +jo>>`JcGcM! +jo>>`JcGcM! +jo>>`J^"/bj8XZ~> +jo>>`JcGcM! +jo>>`JcGcM! +jo>>`J^"/bj8XW~> +jo>>`JcGcM!u!^Htrr3!%rrW3's8W-!"G-Tks8N5^ +s+&~> +jo>>`JcGcM!u!^Htrr3!%rrW3's8W-!"G-Tks8N5^ +s+&~> +jo>>`J^"/lh"O%"mrlbBGbQ>ukbl>oe"9QdMbl#Zc"O-ni!ukbl>lh"O%"m +!mCeks3(KHbl,`f"O%"mqoo$BrlbBGbl>lf"O-_d!ukbl>lh"O%"m!mCekrlbBGbQ5oj!ukbl>oe"G+e8bl7h+ +s+&~> +jo>>`JcGcM! +jo>>`JcGcM! +jo>>`J^"/lf"O-ni!ukbl5fg"O%"mr6,0Ebl>lf"O-kh!sHgNbl5fe"O$qk"O-hg!ukbkoWa"T?OF"O-ni!bQ.jj!mCekrlbBGbl>lf"O-kh!uk +bl5fe"O$qk"O-\c! +jo>>`JcGcM! +jo>>`JcGcM! +jo>>`J^"/lf"O$qk"O-berri;E!s3(KHbl5fe"O-niqZQoBrWN8F!ukbl5ib"9QdMbl5fe +"O$qk"O-kh! +jo>>`JcGcM! +jo>>`JcGcM! +jo>>`J^"/lf"O-ef!lf"O$qk"O-kh! +jo>>`JcGcM! +jo>>`JcGcM! +jo>>`J^"/lf"O-ef!ukbl5fe"O-ni! +jo>>`JcGcM! +jo>>`JcGcM! +jo>>`J^"/lh"O%"ms3(KHbl>lf"O-kh!ukbl,`f"O%"mrlbBGbl,`f"O%"mrlbBGbl5fe"O-kh!lf +"O-kh! +jo>>`JcGcMqZQou! +jo>>`JcGcMqZQou! +jo>>`J^"/od"TQ[H"O$nj"TJW'bQ.jjr65'As3(KHbl5fe"O-hgr<3)CrWE;H"O$qk +"O-khrWN8Fr<3)CrWN8F!bj8XW~> +jo>>`JcCl4! +jo>>`JcCl4! +jo>>`J]s8#! +jo>>`JcCl4! +jo>>`JcCl4! +jo>>`J]s8#! +jo>>`JcCr6rrdoQJcFI(rrhB^J:~> +jo>>`JcCr6rrdoQJcFI(rrhB^J:~> +jo>>`J]s>%rrdnsJ]uilrrhB^J:~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`JcC<$JcC<$lMpkej8XZ~> +jo>>`J]r\hJ]r\hlHK82j8XZ~> +jo>>`JcC<$q#:?ts+13$s7QEl"QTN4~> +jo>>`JcC<$q#:?ts+13$s7QEl"QTN4~> +jo>>`J]r\hpriaAb^muhbk93["QTN4~> +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +jo9l7JHUN,JHY* +JcC<$h#I9TJcC<$f)L8~> +JcC<$h#I9TJcC<$f)L8~> +JcC<$h#I9TJcC<$f)L8~> +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$h>d +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +JcC<$g].9VJcC<$eGk&~> +MuS>2JHVJGL];o~> +MuS>2JHVJGL];o~> +MuS>2JHVJGL];o~> +NW4P4JHVDEL];o~> +NW4P4JHVDEL];o~> +NW4P4JHVDEL];o~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +NW9"]JcC<$T)\fnL];m~> +p]#dIT*0`FJHVPIqu;1~> +p]#dIT*0`FJHVPIqu;1~> +p]#dIT*0`FJHVPIqu;1~> +p]#dIT*0`FJHVPIqu;1~> +p]#dIT*0`FJHVPIqu;1~> +p]#dIT*0`FJHVPIqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;1~> +p](6rJ]sn5rrdoQrrdnsU +p](6roD\gos82fs"TRce!u! +p](6roD\gos82fs"TRce!u! +p](6ro?74bQ.jjqof'DbeMC%"T/4L~> +p](6roD\gos82fs"TRce![KYs8Dru"TS)n! +p](6roD\gos82fs"TRce![KYs8Dru"TS)n! +p](6ro?74 +p](6ro)A^ns8Dru"TSK$quluu!s8N6!s+&~> +p](6ro)A^ns8Dru"TSK$quluu!s8N6!s+&~> +p](6ro#q+;bl,`d"O-khquluB!oc"THUH"O%#H"9H^LrWN2DrWN8F!od"TQ[H"O-be!oc"THUH"O%#K"THUG"O-be +"9cpObQJ"NbQQ/ibl._HbQQ/ibl.a`bl7hCs+&~> +p](6ro)A^ns8Dru"TSN%!UHus8N$!"TJN&"9AZ*s8N*&rrW3's8N$!"TJQ'"TSN%!sJW,s8W*""TSK$ +! +p](6ro)A^ns8Dru"TSN%!UHus8N$!"TJN&"9AZ*s8N*&rrW3's8N$!"TJQ'"TSN%!sJW,s8W*""TSK$ +! +p](6ro#q+;bl,`d"O-ni!ukbl5fe"O$qk"O-ni!sHgNbl>lf"O-kh +!lf"O$qk"O-\crriAG!lf"O,$4rrdoQrrhi8!ukbQ>ukbl>lf"O-kh!bQ.jj +rlk?ErlbBGbQ>ukbl5fe"O$qk"O-ni!lf"O+m0rri6!JG~> +p](6rnc&Ums8W*""TSK$! +p](6rnc&Ums8W*""TSK$! +p](6rn]V":bl>lf"O-kh!ukbl5fe"O$qk"O-kh!ukbl5fe"O$qk"O-\c +!ukbQ>ukbl>lf"O-kh +!lf"O-khrrhl9rri;E!ukbl5fe"O$qk"O+a,rri6!JB~> +p](6rnc&Ums8W*""TSK$!s8N6!s*t~> +p](6rnc&Ums8W*""TSK$!s8N6!s*t~> +p](6rn]V":bl>lf"O-kh!lf"O-kh!od"TQ[H"O-be!ukbl5ib"9QdMbl5fe +"O$qk"O-kh! +p](6rnG`RnrriB#rrE9&rr3$&rr`?*s8Dru"TSB!! +p](6rnG`RnrriB#rrE9&rr3$&rr`?*s8Dru"TSB!! +p](6rnB:t;bQQ/gbQ.jjrlbEHbQIqLbl,`d"O-be!ukbkK<`"O%"mrlbBGbl>lf"O$qk"O-kh!ukbkK<^"O$qk"O-ni!uk +bkoTd"O%"mrlbBGbQ>ukbl5fe"O-ef! +p](6rnG`RnrriB#rrE9&rr +p](6rnG`RnrriB#rrE9&rr +p](6rnB:t;bQQ/gbQ.jjrlkBFs3(KHbl5fe"O-be!ukbkK<`"O%"ms3(KHbl5fe"O$qk"O-kh!ukbkoTd"O%"mrlbBGbQ>ukbl5fe"O-ef! +p](6rn,ECks8;lt"TSK$rriB%!UHurrW3'rrW3's8W*""TSK$!UHurrW3'rrW3's8W*""TSK$!ukbl>lf"O-ni!lf"O-kh!lf"O-hg!oe"TQ[H"O-ni!ukbQ>ukbl>lf"O-kh!ukbl>lf"O$qk"O$qk"O-nirriAG! +p](6rn,ECks82io"TA?$"TSK$r<3-"!rri6!J,~> +p](6rn,ECks82io"TA?$"TSK$r<3-"!rri6!J,~> +p](6rn&te8bkoW^"T?OF"O-khr<3,D!uk +bl5ic"9H^LrWN2DrWN8F!lf"O-khrWE;H"O-ni +rWL +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJcDMFrrdoQrrdoQUAt5rqu;2~> +p](6rJ]sn5rrdoQrrdnsU +p]#dIT*0`FJHVPIqu;2~> +p]#dIT*0`FJHVPIqu;2~> +p]#dIT*0`FJHVPIqu;2~> +p]#dIT*0`FJHVPIqu;2~> +p]#dIT*0`FJHVPIqu;2~> +p]#dIT*0`FJHVPIqu;2~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +JcC<$JcC<$XT*e~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/documentation/graphics/STIR-general-overviewFig2.png b/documentation/graphics/STIR-general-overviewFig2.png new file mode 100644 index 0000000000..4094c3516d Binary files /dev/null and b/documentation/graphics/STIR-general-overviewFig2.png differ diff --git a/documentation/graphics/STIR-glossaryFig1.eps b/documentation/graphics/STIR-glossaryFig1.eps new file mode 100644 index 0000000000..4828ad847e --- /dev/null +++ b/documentation/graphics/STIR-glossaryFig1.eps @@ -0,0 +1,6031 @@ +%!PS-Adobe-3.0 +%%Creator: Advanced Batch Converter +%%Title: +%%CreationDate: Mon Oct 25 21:32:52 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 594 841 +%%EndComments +%%BeginProlog +10 dict begin +%%EndProlog +%%Page: 1 1 +0 842 translate +595 -592 scale +615 612 8 +[ 615 0 0 612 0 0 ] +/rstr 615 string def +/gstr 615 string def +/bstr 615 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 379371 ASCII Bytes +colorimage +JcC<$JcC<$Rf@m~> +JcC<$JcC<$Rf@m~> +JcC<$JcC<$Rf@m~> +JcC<$JcC<$Rf@m~> +JcC<$JcC<$Rf@m~> +JcC<$JcC<$Rf@m~> +JcFF'rWE<&"TR`drrhNbrrdoQJcC<$rr7K~> +JcFF'rWE<&"TR`drrhNbrrdoQJcC<$rr7K~> +JcFF'rWE<&"TR`drrhNbrrdoQJcC<$rr7K~> +JcFI(! +JcFI(! +JcFI(! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFL)! +JcFI(! +JcFI(! +JcFI(! +JcFF'rWN3"rWN3"!X/N+rri?$rriB%q?6csrWE9%"9AZ*!WN<%"9JN*rr`B&"9J`+"9J`+"TJW( +s8N6%s8E.Ps+13.s*t~> +JcFF'rWN3"rWN3"!X/N+rri?$rriB%q?6csrWE9%"9AZ*!WN<%"9JN*rr`B&"9J`+"9J`+"TJW( +s8N6%s8E.Ps+13.s*t~> +JcFF'rWN3"rWN3"!X/N+rri?$rriB%q?6csrWE9%"9AZ*!WN<%"9JN*rr`B&"9J`+"9J`+"TJW( +s8N6%s8E.Ps+13.s*t~> +JcEpn! +JcEpn! +JcEpn! +JcEso! +JcEso! +JcEso! +JcF$qrrdoQJcC<$ci8N~> +JcF$qrrdoQJcC<$ci8N~> +JcF$qrrdoQJcC<$ci8N~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$h#@BXs2"_c~> +JcC<$JcC<$h#@BXs2"_c~> +JcC<$JcC<$h#@BXs2"_c~> +JcC<$JcC<$h>[KYs1nYb~> +JcC<$JcC<$h>[KYs1nYb~> +JcC<$JcC<$h>[KYs1nYb~> +JcC<$JcFa0! +JcC<$JcFa0! +JcC<$JcFa0! +JcC<$JcFd1! +JcC<$JcFd1! +JcC<$JcFd1! +JcC<$JcFg2! +JcC<$JcFg2! +JcC<$JcFg2! +JcC<$JcFj3! +JcC<$JcFj3! +JcC<$JcFj3! +JcC<$JcFm4! +JcC<$JcFm4! +JcC<$JcFm4! +JcC<$JcFp5! +JcC<$JcFp5! +JcC<$JcFp5! +JcC<$li-tgs+11Orri@Qs8W*""TQ%4J-~> +JcC<$li-tgs+11Orri@Qs8W*""TQ%4J-~> +JcC<$li-tgs+11Orri@Qs8W*""TQ%4J-~> +JcC<$m/I(hs+11Orri@Qs8W*""TQ"3J-~> +JcC<$m/I(hs+11Orri@Qs8W*""TQ"3J-~> +JcC<$m/I(hs+11Orri@Qs8W*""TQ"3J-~> +JcC<$mJd1is+11Orri@Qs8W*""TPt2J-~> +JcC<$mJd1is+11Orri@Qs8W*""TPt2J-~> +JcC<$mJd1is+11Orri@Qs8W*""TPt2J-~> +JcC<$mf*:js+11Orri@Qs8W*""TPq1J-~> +JcC<$mf*:js+11Orri@Qs8W*""TPq1J-~> +JcC<$mf*:js+11Orri@Qs8W*""TPq1J-~> +JcC<$n,ECks+11Orri@Qs8W*""TPn0J-~> +JcC<$n,ECks+11Orri@Qs8W*""TPn0J-~> +JcC<$n,ECks+11Orri@Qs8W*""TPn0J-~> +JcFp5JHUN,JHWakp&BP~> +JcFp5JHUN,JHWakp&BP~> +JcFp5JHUN,JHWakp&BP~> +JcFp5! +JcFp5! +JcFp5! +\GuF/rVum#nGi@ge,KFOs6osg"TS#l! +\GuF/rVum#nGi@ge,KFOs6osg"TS#l! +\GuF/rVum#nGi@ge,KFOs6osg"TS#l! +\,ZI2s8W*%rr +\,ZI2s8W*%rr +\,ZI2s8W*%rr +\,ZI2s8W*%lMpkes8W*%kPtMarr;s#p\t6ss6osg"TS#l!$qs7--h"RuHk"RuEl"TS2qJA~> +\,ZI2s8W*%lMpkes8W*%kPtMarr;s#p\t6ss6osg"TS#l!$qs7--h"RuHk"RuEl"TS2qJA~> +\,ZI2s8W*%lMpkes8W*%kPtMarr;s#p\t6ss6osg"TS#l!$qs7--h"RuHk"RuEl"TS2qJA~> +\,ZI2s8W*%s8W'$!WN<$"TJH!"TAB#"TSN%"R,jd"TSN%!sJW,s8W*""TS;t! +\,ZI2s8W*%s8W'$!WN<$"TJH!"TAB#"TSN%"R,jd"TSN%!sJW,s8W*""TS;t! +\,ZI2s8W*%s8W'$!WN<$"TJH!"TAB#"TSN%"R,jd"TSN%!sJW,s8W*""TS;t! +\,ZC0r;Zd"s8W*%!WN9("TJT+"TJT*"TSH#qul'[!UHus6osg"TS#l! +\,ZC0r;Zd"s8W*%!WN9("TJT+"TJT*"TSH#qul'[!UHus6osg"TS#l! +\,ZC0r;Zd"s8W*%!WN9("TJT+"TJT*"TSH#qul'[!UHus6osg"TS#l! +\,ZI2!WN9'"TSK$rriB%rr`B&"9J`+"9J`+"9AZ*rVum#s8W*%jSo5`s8N$!"TS8s!u +rri/t!UHus82ir"Shut"TSB!rri/t!urri2urri2urri/trWN0!rri,s! +\,ZI2!WN9'"TSK$rriB%rr`B&"9J`+"9J`+"9AZ*rVum#s8W*%jSo5`s8N$!"TS8s!u +rri/t!UHus82ir"Shut"TSB!rri/t!urri2urri2urri/trWN0!rri,s! +\,ZI2!WN9'"TSK$rriB%rr`B&"9J`+"9J`+"9AZ*rVum#s8W*%jSo5`s8N$!"TS8s!u +rri/t!UHus82ir"Shut"TSB!rri/t!urri2urri2urri/trWN0!rri,s! +\,ZI2!WN9'"TSK$rriB%rr`B&"9AZ*!WN<&"T/6!"TSN%"Q]R`"TSN%rri)r!UHus8;oq"T&/u"T/5t"T&/u"T8;u"Sr&u"TS2q +JH~> +\,ZI2!WN9'"TSK$rriB%rr`B&"9AZ*!WN<&"T/6!"TSN%"Q]R`"TSN%rri)r!UHus8;oq"T&/u"T/5t"T&/u"T8;u"Sr&u"TS2q +JH~> +\,ZI2!WN9'"TSK$rriB%rr`B&"9AZ*!WN<&"T/6!"TSN%"Q]R`"TSN%rri)r!UHus8;oq"T&/u"T/5t"T&/u"T8;u"Sr&u"TS2q +JH~> +\,ZI2s8W*%rr^Hts8W*%jo5>as8;lt"TS;t!UHus8;oq"T&-!"TSB!r<2us! +\,ZI2s8W*%rr^Hts8W*%jo5>as8;lt"TS;t!UHus8;oq"T&-!"TSB!r<2us! +\,ZI2s8W*%rr^Hts8W*%jo5>as8;lt"TS;t!UHus8;oq"T&-!"TSB!r<2us! +\GuL1!WN<&"9JN*qZHs""Sr9"s8)r\rrE9&qu6["s7uZq"TRrj!UHus82ir"Shut"TSB!rWN)t!UHus8)cq"T89#"TJQ'"TSB!rr`E'"TSB!!UHus82ir"Sr)t"T&/u"Sr)t +"T/6!"Shut"TS2qJB~> +\GuL1!WN<&"9JN*qZHs""Sr9"s8)r\rrE9&qu6["s7uZq"TRrj!UHus82ir"Shut"TSB!rWN)t!UHus8)cq"T89#"TJQ'"TSB!rr`E'"TSB!!UHus82ir"Sr)t"T&/u"Sr)t +"T/6!"Shut"TS2qJB~> +\GuL1!WN<&"9JN*qZHs""Sr9"s8)r\rrE9&qu6["s7uZq"TRrj!UHus82ir"Shut"TSB!rWN)t!UHus8)cq"T89#"TJQ'"TSB!rr`E'"TSB!!UHus82ir"Sr)t"T&/u"Sr)t +"T/6!"Shut"TS2qJB~> +V#U;ph>[KYrrW3's8Dru"TS;t!UHus82fs"TS;t! +V#U;ph>[KYrrW3's8Dru"TS;t!UHus82fs"TS;t! +V#U;ph>[KYrrW3's8Dru"TS;t!UHus82fs"TS;t! +V#LGus8N$!"TRBZqud'#"TAPurrE9&n,ECks7-*i"TRuk!$qs8N$!"TS5r +!$qs8N$! +"TS2q! +V#LGus8N$!"TRBZqud'#"TAPurrE9&n,ECks7-*i"TRuk!$qs8N$!"TS5r +!$qs8N$! +"TS2q! +V#LGus8N$!"TRBZqud'#"TAPurrE9&n,ECks7-*i"TRuk!$qs8N$!"TS5r +!$qs8N$! +"TS2q! +U]:8qao;AEs6osg"TS#l!$qs8N$! +"TS/p!$qs8N$!"TS2q! +U]:8qao;AEs6osg"TS#l!$qs8N$! +"TS/p!$qs8N$!"TS2q! +U]:8qao;AEs6osg"TS#l!$qs8N$! +"TS/p!$qs8N$!"TS2q! +JcFp5!$qs8N$!"TS#l!$qs8N$!"TS2q! +JcFp5!$qs8N$!"TS#l!$qs8N$!"TS2q! +JcFp5!$qs8N$!"TS#l!$qs8N$!"TS2q! +JcFp5!$qs8N$!"TS#l! +JcFp5!$qs8N$!"TS#l! +JcFp5!$qs8N$!"TS#l! +JcFp5! +JcFp5! +JcFp5! +JcFp5!UHus763h"S)Nl"RuHk"S2Qp"TJW) +oD\gorrW3's7-*i"TS;t! +JcFp5!UHus763h"S)Nl"RuHk"S2Qp"TJW) +oD\gorrW3's7-*i"TS;t! +JcFp5!UHus763h"S)Nl"RuHk"S2Qp"TJW) +oD\gorrW3's7-*i"TS;t! +JcFp5!UHus7$$h"TS#lrrhik!sJW,s7?9j"RuEl"TS#lrri/t! +JcFp5!UHus7$$h"TS#lrrhik!sJW,s7?9j"RuEl"TS#lrri/t! +JcFp5!UHus7$$h"TS#lrrhik!sJW,s7?9j"RuEl"TS#lrri/t! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7--h"9ST+s7?6m"TJW)o)A^n +rrW3's7H +JcFp5!$qs7--h"9ST+s7?6m"TJW)o)A^n +rrW3's7H +JcFp5!$qs7--h"9ST+s7?6m"TJW)o)A^n +rrW3's7H +JcFp5! +JcFp5! +JcFp5! +JcGTHrWN6#rWMuq! +JcGTHrWN6#rWMuq! +JcGTHrWN6#rWMuq! +JcGWI!$qs8N$!"TS/p!$qrrW3's7?6k"TRuk +! +JcGWI!$qs8N$!"TS/p!$qrrW3's7?6k"TRuk +! +JcGWI!$qs8N$!"TS/p!$qrrW3's7?6k"TRuk +! +JcGKE!UHus6osg"TS#l!$qs8W*""TS/p!sJW,s760j"TRuk!$qs7ZJC~> +JcGKE!UHus6osg"TS#l!$qs8W*""TS/p!sJW,s760j"TRuk!$qs7ZJC~> +JcGKE!UHus6osg"TS#l!$qs8W*""TS/p!sJW,s760j"TRuk!$qs7ZJC~> +JcGKE!UHus6osg"TS#l!UHus82ir"Shut"TSE"rWN&s! +JcGKE!UHus6osg"TS#l!UHus82ir"Shut"TSE"rWN&s! +JcGKE!UHus6osg"TS#l!UHus82ir"Shut"TSE"rWN&s! +JcGKE!UHus6osg"TS#l!UHus8;oq"T&/u"T/5t +"T&-!"TSE"r<2rr!UHu +s8;oq"T&/u"T8;t"T&/u"T8;u"Sr&u"TS2qJG~> +JcGKE!UHus6osg"TS#l!UHus8;oq"T&/u"T/5t +"T&-!"TSE"r<2rr!UHu +s8;oq"T&/u"T8;t"T&/u"T8;u"Sr&u"TS2qJG~> +JcGKE!UHus6osg"TS#l!UHus8;oq"T&/u"T/5t +"T&-!"TSE"r<2rr!UHu +s8;oq"T&/u"T8;t"T&/u"T8;u"Sr&u"TS2qJG~> +JcGNF! +JcGNF! +JcGNF! +JcGQG!UHus82iq"T&-!"TS>urri/t!urriB% +!urWN)t!urri6!rWN)trWN)trri6!rri,s! +JcGQG!UHus82iq"T&-!"TS>urri/t!urriB% +!urWN)t!urri6!rWN)trWN)trri6!rri,s! +JcGQG!UHus82iq"T&-!"TS>urri/t!urriB% +!urWN)t!urri6!rWN)trWN)trri6!rri,s! +JcGTH!$q +s8N$!"TS5r!u!UHus8)cq"RuEl"TS2qJH~> +JcGTH!$q +s8N$!"TS5r!u!UHus8)cq"RuEl"TS2qJH~> +JcGTH!$q +s8N$!"TS5r!u!UHus8)cq"RuEl"TS2qJH~> +JcGWIqud'#"T8JurrE9&n,ECks7-*i"TRuk! +JcGWIqud'#"T8JurrE9&n,ECks7-*i"TRuk! +JcGWIqud'#"T8JurrE9&n,ECks7-*i"TRuk! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs8N$!"TS/p!$q +s8W*""TS,o! +JcFp5!$qs8N$!"TS/p!$q +s8W*""TS,o! +JcFp5!$qs8N$!"TS/p!$q +s8W*""TS,o! +JcFp5!$qs8N&u"RuEl"TS2qJH~> +JcFp5!$qs8N&u"RuEl"TS2qJH~> +JcFp5!$qs8N&u"RuEl"TS2qJH~> +JcFp5! +JcFp5! +JcFp5! +JcFp5!u! +JcFp5!u! +JcFp5!u! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcGTHrWN3"!$qs8W*""TS,o! +JcGTHrWN3"!$qs8W*""TS,o! +JcGTHrWN3"!$qs8W*""TS,o! +JcGWI! +JcGWI! +JcGWI! +JcGKE!$qs8N$!"TS/p!$qs8Dru"TS2q!sJW,s7?6k"TRuk! +JcGKE!$qs8N$!"TS/p!$qs8Dru"TS2q!sJW,s7?6k"TRuk! +JcGKE!$qs8N$!"TS/p!$qs8Dru"TS2q!sJW,s7?6k"TRuk! +JcGKE! +JcGKE! +JcGKE! +JcGKE!UHus82ir"Shut"TSB!rri/t +rri9"!X/N+!u!UHus8)cq +"Sr&u"TSB!rri,s!UHus8;or"Shut"TSB!rri/trri2urri2urri2u +rri/trri9"rWN#r!UHus7ZJC +~> +JcGKE!UHus82ir"Shut"TSB!rri/t +rri9"!X/N+!u!UHus8)cq +"Sr&u"TSB!rri,s!UHus8;or"Shut"TSB!rri/trri2urri2urri2u +rri/trri9"rWN#r!UHus7ZJC +~> +JcGKE!UHus82ir"Shut"TSB!rri/t +rri9"!X/N+!u!UHus8)cq +"Sr&u"TSB!rri,s!UHus8;or"Shut"TSB!rri/trri2urri2urri2u +rri/trri9"rWN#r!UHus7ZJC +~> +JcGNF!UHus8;oq"T&/u"T/5t"T&/u"T8;u"Sr&u"TS2qJG~> +JcGNF!UHus8;oq"T&/u"T/5t"T&/u"T8;u"Sr&u"TS2qJG~> +JcGNF!UHus8;oq"T&/u"T/5t"T&/u"T8;u"Sr&u"TS2qJG~> +JcGQG!UHus7ZJC~> +JcGQG!UHus7ZJC~> +JcGQG!UHus7ZJC~> +JcGTH!UHus82iq"Sr&u"TSB!rri/t!urWN)t!^HtqZ$Qu +q>^Htqu?[!q#:?ts7ZJC~> +JcGTH!UHus82iq"Sr&u"TSB!rri/t!urWN)t!^HtqZ$Qu +q>^Htqu?[!q#:?ts7ZJC~> +JcGTH!UHus82iq"Sr&u"TSB!rri/t!urWN)t!^HtqZ$Qu +q>^Htqu?[!q#:?ts7ZJC~> +JcGWIqum'"rWMuq!u! +JcGWIqum'"rWMuq!u! +JcGWIqum'"rWMuq!u! +JcFp5!$qs8N$! +"TS5r! +JcFp5!$qs8N$! +"TS5r! +JcFp5!$qs8N$! +"TS5r! +JcFp5!UHurrE(L~> +JcFp5!UHurrE(L~> +JcFp5!UHurrE(L~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!u!UHu +s82fs"TS)n!X/N+! +JcFp5!u!UHu +s82fs"TS)n!X/N+! +JcFp5!u!UHu +s82fs"TS)n!X/N+! +JcFp5!u!u!u +! +JcFp5!u!u!u +! +JcFp5!u!u!u +! +JcFp5JHUN,JHWakrVlm$s82hH~> +JcFp5JHUN,JHWakrVlm$s82hH~> +JcFp5JHUN,JHWakrVlm$s82hH~> +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qrrW3's7HYs~> +JcFp5!$qrrW3's7HYs~> +JcFp5!$qrrW3's7HYs~> +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7--h"TSK&"TS,orriB%! +JcFp5!$qs7--h"TSK&"TS,orriB%! +JcFp5!$qs7--h"TSK&"TS,orriB%! +JcGTHrWN6#rWMuq! +JcGTHrWN6#rWMuq! +JcGTHrWN6#rWMuq! +JcGWI! +JcGWI! +JcGWI! +JcGKE!sJW,s8W*""TS;t!^Htqu?Wuq>UHus8W*""TSN%rri,s!urri2urri/t!UHus82iq"Sr&u"TSB!rri/t!urri9"rWN#r! +JcGKE!sJW,s8W*""TS;t!^Htqu?Wuq>UHus8W*""TSN%rri,s!urri2urri/t!UHus82iq"Sr&u"TSB!rri/t!urri9"rWN#r! +JcGKE!sJW,s8W*""TS;t!^Htqu?Wuq>UHus8W*""TSN%rri,s!urri2urri/t!UHus82iq"Sr&u"TSB!rri/t!urri9"rWN#r! +JcGKE!sJW,s8W*""TS;t! +JcGKE!sJW,s8W*""TS;t! +JcGKE!sJW,s8W*""TS;t! +JcGKE!sJW,s8W*""TS;t!UHus8;oq"T/6!"T&/s"T&-!"TSE"r<2us!UHus8;oq"T&/u"T/5t"T&/u"T8;u"TA?$"TSN%! +JcGKE!sJW,s8W*""TS;t!UHus8;oq"T/6!"T&/s"T&-!"TSE"r<2us!UHus8;oq"T&/u"T/5t"T&/u"T8;u"TA?$"TSN%! +JcGKE!sJW,s8W*""TS;t!UHus8;oq"T/6!"T&/s"T&-!"TSE"r<2us!UHus8;oq"T&/u"T/5t"T&/u"T8;u"TA?$"TSN%! +JcGNF!UHus6osg"TS#l!^Htqu?[!q#:?ts82ir"Sr)t"T&/u"Sr)t"T/6!"TA?$"TSK$! +JcGNF!UHus6osg"TS#l!^Htqu?[!q#:?ts82ir"Sr)t"T&/u"Sr)t"T/6!"TA?$"TSK$! +JcGNF!UHus6osg"TS#l!^Htqu?[!q#:?ts82ir"Sr)t"T&/u"Sr)t"T/6!"TA?$"TSK$! +JcGQG! +JcGQG! +JcGQG! +JcGTH!$qs8W*""TS2q!$qs8N$!"TS2q! +JcGTH!$qs8W*""TS2q!$qs8N$!"TS2q! +JcGTH!$qs8W*""TS2q!$qs8N$!"TS2q! +JcGWIqum'"rWMuq! +JcGWIqum'"rWMuq! +JcGWIqum'"rWMuq! +JcFp5!$qs8N$!"TS5r!$q +s8W-!"SD]p"TSN%!$qs8W*""TS,o!u! +JcFp5!$qs8N$!"TS5r!$q +s8W-!"SD]p"TSN%!$qs8W*""TS,o!u! +JcFp5!$qs8N$!"TS5r!$q +s8W-!"SD]p"TSN%!$qs8W*""TS,o!u! +JcFp5!$qs8W-!"SMcq"TSK$rri#p +! +JcFp5!$qs8W-!"SMcq"TSK$rri#p +! +JcFp5!$qs8W-!"SMcq"TSK$rri#p +! +JcFp5!$q +s8W-!"RuHk"T/3""TS8s! +JcFp5!$q +s8W-!"RuHk"T/3""TS8s! +JcFp5!$q +s8W-!"RuHk"T/3""TS8s! +JcFp5!u!u! +JcFp5!u!u! +JcFp5!u!u! +JcFp5!u! +JcFp5!u! +JcFp5!u! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qrrW3's7?6m"TJW)oDegns8N*& +s7H$qs8W*""TS,o! +JcFp5!$qrrW3's7?6m"TJW)oDegns8N*& +s7H$qs8W*""TS,o! +JcFp5!$qrrW3's7?6m"TJW)oDegns8N*& +s7H$qs8W*""TS,o! +JcGQG!$qs8N$!"TS/p!$q +s8N$!"TS/p! +JcGQG!$qs8N$!"TS/p!$q +s8N$!"TS/p! +JcGQG!$qs8N$!"TS/p!$q +s8N$!"TS/p! +JcGTHrri?$!UHus6osg"TS#l! +JcGTHrri?$!UHus6osg"TS#l! +JcGTHrri?$!UHus6osg"TS#l! +JcGQG!urri/t!^Ht +qu?[!q#:?ts82ir"Sr&u"TSE"!X/N+! +JcGQG!urri/t!^Ht +qu?[!q#:?ts82ir"Sr&u"TSE"!X/N+! +JcGQG!urri/t!^Ht +qu?[!q#:?ts82ir"Sr&u"TSE"!X/N+! +JcGQG!UHus8;oq"T&-!"TSB!r<2us! +JcGQG!UHus8;oq"T&-!"TSB!r<2us! +JcGQG!UHus8;oq"T&-!"TSB!r<2us! +JcGQG!UHus8;oq"T&-!"TSB!r<3#trri6!r<2rr!UHus8;oq"T&/u"T/5t"TA?$"TJN&"9AZ*rVug!q>UHus7ZJC~> +JcGQG!UHus8;oq"T&-!"TSB!r<3#trri6!r<2rr!UHus8;oq"T&/u"T/5t"TA?$"TJN&"9AZ*rVug!q>UHus7ZJC~> +JcGQG!UHus8;oq"T&-!"TSB!r<3#trri6!r<2rr!UHus8;oq"T&/u"T/5t"TA?$"TJN&"9AZ*rVug!q>UHus7ZJC~> +JcGQG!^HtqZ$Quq>UHus82ir"T&-#"TJW)qu?WuqYpR!s8)cq"Sr&u"TSB!rr`E'"TSE"!UHus82ir"Sr&u"TS>urri6!!sJW,s82ir"Shut"TSB!rri/t!^HtqZ$QurVlm$s8W-!"T/6!"Shut"TS2qJG~> +JcGQG!^HtqZ$Quq>UHus82ir"T&-#"TJW)qu?WuqYpR!s8)cq"Sr&u"TSB!rr`E'"TSE"!UHus82ir"Sr&u"TS>urri6!!sJW,s82ir"Shut"TSB!rri/t!^HtqZ$QurVlm$s8W-!"T/6!"Shut"TS2qJG~> +JcGQG!^HtqZ$Quq>UHus82ir"T&-#"TJW)qu?WuqYpR!s8)cq"Sr&u"TSB!rr`E'"TSE"!UHus82ir"Sr&u"TS>urri6!!sJW,s82ir"Shut"TSB!rri/t!^HtqZ$QurVlm$s8W-!"T/6!"Shut"TS2qJG~> +JcGQG!u!UHus8)`r"TS>u!UHus8)cq"Sr&u"TS>u! +JcGQG!u!UHus8)`r"TS>u!UHus8)cq"Sr&u"TS>u! +JcGQG!u!UHus8)`r"TS>u!UHus8)cq"Sr&u"TS>u! +JcGQG! +JcGQG! +JcGQG! +JcGTHrWN9$rri#p!$qs8W*""TS5r!$qs8N$!"TS8s! +JcGTHrWN9$rri#p!$qs8W*""TS5r!$qs8N$!"TS8s! +JcGTHrWN9$rri#p!$qs8W*""TS5r!$qs8N$!"TS8s! +JcFp5!$qs8N$!"TS#l! +JcFp5!$qs8N$!"TS#l! +JcFp5!$qs8N$!"TS#l! +JcFp5!$qs8W-!"S;Wo"TJQ'"TS/p! +JcFp5!$qs8W-!"S;Wo"TJQ'"TS/p! +JcFp5!$qs8W-!"S;Wo"TJQ'"TS/p! +JcFp5!$qs8W-!"RuEl"TS8s! +JcFp5!$qs8W-!"RuEl"TS8s! +JcFp5!$qs8W-!"RuEl"TS8s! +JcFp5!UHus82fs"TS)n!$qs8W*""TS#lrri6!! +JcFp5!UHus82fs"TS)n!$qs8W*""TS#lrri6!! +JcFp5!UHus82fs"TS)n!$qs8W*""TS#lrri6!! +JcFp5!UHus8)`r"TS)n! +JcFp5!UHus8)`r"TS)n! +JcFp5!UHus8)`r"TS)n! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs8N$!"TS/p! +JcFp5!$qs8N$!"TS/p! +JcFp5!$qs8N$!"TS/p! +JcGQG! +JcGQG! +JcGQG! +JcGTHrri?$!UHus6osi"TJW)oD\gos7$$h"TSK$!$qs8;lt +"TS5r! +JcGTHrri?$!UHus6osi"TJW)oD\gos7$$h"TSK$!$qs8;lt +"TS5r! +JcGTHrri?$!UHus6osi"TJW)oD\gos7$$h"TSK$!$qs8;lt +"TS5r! +JcGQG!UHus8;or"Sr&u"TS>urri/t!UHus8;or"Sr'""TJW) +r;Zd"q>UHus82ir"Shut"TSK$! +JcGQG!UHus8;or"Sr&u"TS>urri/t!UHus8;or"Sr'""TJW) +r;Zd"q>UHus82ir"Shut"TSK$! +JcGQG!UHus8;or"Sr&u"TS>urri/t!UHus8;or"Sr'""TJW) +r;Zd"q>UHus82ir"Shut"TSK$! +JcGQG!UHus8Duq"T&-!"TSE" +qulosrri6!r<2usrri9"r<2rr!UHus7ZJC~> +JcGQG!UHus8Duq"T&-!"TSE" +qulosrri6!r<2usrri9"r<2rr!UHus7ZJC~> +JcGQG!UHus8Duq"T&-!"TSE" +qulosrri6!r<2usrri9"r<2rr!UHus7ZJC~> +JcGQG!UHus8;oq"T&/u"T8;t"T/6!"T/5s"T&-!"TSE"r<2us! +JcGQG!UHus8;oq"T&/u"T8;t"T/6!"T/5s"T&-!"TSE"r<2us! +JcGQG!UHus8;oq"T&/u"T8;t"T/6!"T/5s"T&-!"TSE"r<2us! +JcGQG!^HtqZ$Qu +q>UHus82ir"9ST+s82fs"TSB!rri/trri6!rWN,u!sJW,s82ir"TSK&"TSE"!urr`E'"TSE"!^EsqYpR! +s82ir"Shut"TSB!rri/t! +JcGQG!^HtqZ$Qu +q>UHus82ir"9ST+s82fs"TSB!rri/trri6!rWN,u!sJW,s82ir"TSK&"TSE"!urr`E'"TSE"!^EsqYpR! +s82ir"Shut"TSB!rri/t! +JcGQG!^HtqZ$Qu +q>UHus82ir"9ST+s82fs"TSB!rri/trri6!rWN,u!sJW,s82ir"TSK&"TSE"!urr`E'"TSE"!^EsqYpR! +s82ir"Shut"TSB!rri/t! +JcGQG!UHus8)`r"TS5r!UHus82fs"TS2q!u! +JcGQG!UHus8)`r"TS5r!UHus82fs"TS2q!u! +JcGQG!UHus8)`r"TS5r!UHus82fs"TS2q!u! +JcGQG! +JcGQG! +JcGQG! +JcGTHrWN6#rWMuq!$qs8N$!"TS#lrri#p!$qs8N$!"TS5r +!$qs8N&u"RuEl"TS8s! +JcGTHrWN6#rWMuq!$qs8N$!"TS#lrri#p!$qs8N$!"TS5r +!$qs8N&u"RuEl"TS8s! +JcGTHrWN6#rWMuq!$qs8N$!"TS#lrri#p!$qs8N$!"TS5r +!$qs8N&u"RuEl"TS8s! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs8W-!"S2Qo"TJT*"TS#l!^HtoD\gorrN-& +! +JcFp5!$qs8W-!"S2Qo"TJT*"TS#l!^HtoD\gorrN-& +! +JcFp5!$qs8W-!"S2Qo"TJT*"TS#l!^HtoD\gorrN-& +! +JcFp5!UHus8)`r +"TRuk! +JcFp5!UHus8)`r +"TRuk! +JcFp5!UHus8)`r +"TRuk! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5!UHus7$'g"S2Qp"TJW)oD\mqrriAms8E/j +s8N5krrE9&rr3!%s7ZKm"RuHk"RuEl"TS2qJH~> +JcFp5!UHus7$'g"S2Qp"TJW)oD\mqrriAms8E/j +s8N5krrE9&rr3!%s7ZKm"RuHk"RuEl"TS2qJH~> +JcFp5!UHus7$'g"S2Qp"TJW)oD\mqrriAms8E/j +s8N5krrE9&rr3!%s7ZKm"RuHk"RuEl"TS2qJH~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7$$h"TSN%! +JcFp5!$qs7$$h"TSN%! +JcFp5!$qs7$$h"TSN%! +JcFp5!$qs7-*i"TSK$!*srriAnrrWE("TS)nrr`E'"TS)nrri?$ +! +JcFp5!$qs7-*i"TSK$!*srriAnrrWE("TS)nrr`E'"TS)nrri?$ +! +JcFp5!$qs7-*i"TSK$!*srriAnrrWE("TS)nrr`E'"TS)nrri?$ +! +JcGQG! +JcGQG! +JcGQG! +JcGTHrri?$!UHus8W*""TS)n!$qs7ZJC~> +JcGTHrri?$!UHus8W*""TS)n!$qs7ZJC~> +JcGTHrri?$!UHus8W*""TS)n!$qs7ZJC~> +JcGQG!UHurrW3's8;os"Sr&u"TSB!rri/t!^Htqu?Wu +q>UHus8N$!"TJN&"9AZ*q>UHus82ir"Sr)t"T&/u"Sr&u"TSB!rri,s!UHus8;or"Sr&u"TSE"!X/N+!UHus8)cq"Sr&u"TSB!rri,s +!u! +JcGQG!UHurrW3's8;os"Sr&u"TSB!rri/t!^Htqu?Wu +q>UHus8N$!"TJN&"9AZ*q>UHus82ir"Sr)t"T&/u"Sr&u"TSB!rri,s!UHus8;or"Sr&u"TSE"!X/N+!UHus8)cq"Sr&u"TSB!rri,s +!u! +JcGQG!UHurrW3's8;os"Sr&u"TSB!rri/t!^Htqu?Wu +q>UHus8N$!"TJN&"9AZ*q>UHus82ir"Sr)t"T&/u"Sr&u"TSB!rri,s!UHus8;or"Sr&u"TSE"!X/N+!UHus8)cq"Sr&u"TSB!rri,s +!u! +JcGQG!UHus7ZJC +~> +JcGQG!UHus7ZJC +~> +JcGQG!UHus7ZJC +~> +JcGQG!UHus8;oq"T/5u"T/5s"T/3""TSE"qullr! +JcGQG!UHus8;oq"T/5u"T/5s"T/3""TSE"qullr! +JcGQG!UHus8;oq"T/5u"T/5s"T/3""TSE"qullr! +JcGQG!UHus82ir"9ST+s82fs"TSB!rri/t! +JcGQG!UHus82ir"9ST+s82fs"TSB!rri/t! +JcGQG!UHus82ir"9ST+s82fs"TSB!rri/t! +JcGQG!^HtpAY-rs82fs"TS2q!urrhikrri&q! +JcGQG!^HtpAY-rs82fs"TS2q!urrhikrri&q! +JcGQG!^HtpAY-rs82fs"TS2q!urrhikrri&q! +JcGQG!UO"rriAqrrE9&r;Qd#s7QBm"TSN%!$qs8N$!"TS2q! +JcGQG!UO"rriAqrrE9&r;Qd#s7QBm"TSN%!$qs8N$!"TS2q! +JcGQG!UO"rriAqrrE9&r;Qd#s7QBm"TSN%!$qs8N$!"TS2q! +JcGTHrWN3"!$qs8Dru"TS,o!$qs8N$!"TS5r! +JcGTHrWN3"!$qs8Dru"TS,o!$qs8N$!"TS5r! +JcGTHrWN3"!$qs8Dru"TS,o!$qs8N$!"TS5r! +JcG'9!u! +JcG'9!u! +JcG'9!u! +JcG*:!$qs8W*""TS,o! +JcG*:!$qs8W*""TS,o! +JcG*:!$qs8W*""TS,o! +JcG-;! +JcG-;! +JcG-;! +JcG0u! +JcG0u! +JcG0u! +JcG3=! +JcG3=! +JcG3=! +JcG6>! +JcG6>! +JcG6>! +JcG9?! +JcG9?! +JcG9?! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcGQG!$qs7ZJC~> +JcGQG!$qs7ZJC~> +JcGQG!$qs7ZJC~> +JcGTHrri9"!$qs8N$!"TS/p! +JcGTHrri9"!$qs8N$!"TS/p! +JcGTHrri9"!$qs8N$!"TS/p! +JcGQG!UHus8Ds!"TJT*"TS>u +rri<#!UHus8Ds!"TJT*"TS>u!UHu +s8Dru"TJN&"9AZ*qYpR!s8Ds!"TJT*"TS;t!^Htr;Qg$rr`?*s8)cq"T8 +JcGQG!UHus8Ds!"TJT*"TS>u +rri<#!UHus8Ds!"TJT*"TS>u!UHu +s8Dru"TJN&"9AZ*qYpR!s8Ds!"TJT*"TS;t!^Htr;Qg$rr`?*s8)cq"T8 +JcGQG!UHus8Ds!"TJT*"TS>u +rri<#!UHus8Ds!"TJT*"TS>u!UHu +s8Dru"TJN&"9AZ*qYpR!s8Ds!"TJT*"TS;t!^Htr;Qg$rr`?*s8)cq"T8 +JcGQG! +JcGQG! +JcGQG! +JcGQG!UHus8)co"T&-!"TSE"r<2us!UHus8;oq"T&-!"TSB!r<2us! +JcGQG!UHus8)co"T&-!"TSE"r<2us!UHus8;oq"T&-!"TSB!r<2us! +JcGQG!UHus8)co"T&-!"TSE"r<2us!UHus8;oq"T&-!"TSB!r<2us! +JcGQG!UHus82ir"Sr)t"T&/u +"Sr&u"TSB!rri/trri2urriB%!urWN)t!UHus82ir"Sr&u"TS>urri/t!UHus8)cq"T&/u"T&/u"T89#"TJN&"9AZ*r;Zd"q#:?ts82ir"Sr)t"T&/u"Sr)t +"T/6!"Shut"TS2qJH~> +JcGQG!UHus82ir"Sr)t"T&/u +"Sr&u"TSB!rri/trri2urriB%!urWN)t!UHus82ir"Sr&u"TS>urri/t!UHus8)cq"T&/u"T&/u"T89#"TJN&"9AZ*r;Zd"q#:?ts82ir"Sr)t"T&/u"Sr)t +"T/6!"Shut"TS2qJH~> +JcGQG!UHus82ir"Sr)t"T&/u +"Sr&u"TSB!rri/trri2urriB%!urWN)t!UHus82ir"Sr&u"TS>urri/t!UHus8)cq"T&/u"T&/u"T89#"TJN&"9AZ*r;Zd"q#:?ts82ir"Sr)t"T&/u"Sr)t +"T/6!"Shut"TS2qJH~> +JcGQG!UHus82fs"TS8s!UHus82ir +"RuEl"TS&m!sJW,s7ZHn"TSK$rri&q! +JcGQG!UHus82fs"TS8s!UHus82ir +"RuEl"TS&m!sJW,s7ZHn"TSK$rri&q! +JcGQG!UHus82fs"TS8s!UHus82ir +"RuEl"TS&m!sJW,s7ZHn"TSK$rri&q! +JcGQG!$qs8N$!"TS2q!UHus82fs"TS8s!UHus8)`r"TS8s +!$qs8N&u"S_os"TSE"! +JcGQG!$qs8N$!"TS2q!UHus82fs"TS8s!UHus8)`r"TS8s +!$qs8N&u"S_os"TSE"! +JcGQG!$qs8N$!"TS2q!UHus82fs"TS8s!UHus8)`r"TS8s +!$qs8N&u"S_os"TSE"! +JcGTHrWN6#rWMuq!$qs8W*""TS/p! +JcGTHrWN6#rWMuq!$qs8W*""TS/p! +JcGTHrWN6#rWMuq!$qs8W*""TS/p! +JcFp5!$qs8N$!"TS5r! +JcFp5!$qs8N$!"TS5r! +JcFp5!$qs8N$!"TS5r! +JcFp5!$qs8W-!"SD]p"TSN%rrhik! +JcFp5!$qs8W-!"SD]p"TSN%rrhik! +JcFp5!$qs8W-!"SD]p"TSN%rrhik! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!UHus8)`r"TS#lrrhom!sJW,s760l"TJW)oD\gorrW3's763i"RuHk"T/3""TS8s +rrhllrrhom!X/N+! +JcFp5!UHus8)`r"TS#lrrhom!sJW,s760l"TJW)oD\gorrW3's763i"RuHk"T/3""TS8s +rrhllrrhom!X/N+! +JcFp5!UHus8)`r"TS#lrrhom!sJW,s760l"TJW)oD\gorrW3's763i"RuHk"T/3""TS8s +rrhllrrhom!X/N+! +JcFp5JHUN,JHWakp&BR~> +JcFp5JHUN,JHWakp&BR~> +JcFp5JHUN,JHWakp&BR~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qrrW3's7?6m"TJW)o)AdprriAnrrE9&s8N*&s7QEl"9ST+s7?9j"RuEl +"TSN%! +JcFp5!$qrrW3's7?6m"TJW)o)AdprriAnrrE9&s8N*&s7QEl"9ST+s7?9j"RuEl +"TSN%! +JcFp5!$qrrW3's7?6m"TJW)o)AdprriAnrrE9&s8N*&s7QEl"9ST+s7?9j"RuEl +"TSN%! +s8W'$!riE'dJs1K[/U.0s8Dus"Shut"TRrj!$qs8N$!"TS/p! +s8W'$!riE'dJs1K[/U.0s8Dus"Shut"TRrj!$qs8N$!"TS/p! +s8W'$!riE'dJs1K[/U.0s8Dus"Shut"TRrj!$qs8N$!"TS/p! +!WN9'"TJN&"9AZ*hZ!TZs7ZKk"Le@1"TA?$"TS2q! +!WN9'"TJN&"9AZ*hZ!TZs7ZKk"Le@1"TA?$"TS2q! +!WN9'"TJN&"9AZ*hZ!TZs7ZKk"Le@1"TA?$"TS2q! +!WN9'"TSN%!u!sJW,s8Dut"Shut"TSB! +rri/trri2urri/t!UHus82iq"Sr&u"TSE"rWN&s!sJW,s8;os"Sr&u +"TSB!rri,s! +!WN9'"TSN%!u!sJW,s8Dut"Shut"TSB! +rri/trri2urri/t!UHus82iq"Sr&u"TSE"rWN&s!sJW,s8;os"Sr&u +"TSB!rri,s! +!WN9'"TSN%!u!sJW,s8Dut"Shut"TSB! +rri/trri2urri/t!UHus82iq"Sr&u"TSE"rWN&s!sJW,s8;os"Sr&u +"TSB!rri,s! +!WN<&"TAB""TJGq"9JN*!UHus8;oq"T&-!"TSB!r<2us!UHus8;oq"T&-! +"TSE"qullr! +!WN<&"TAB""TJGq"9JN*!UHus8;oq"T&-!"TSB!r<2us!UHus8;oq"T&-! +"TSE"qullr! +!WN<&"TAB""TJGq"9JN*!UHus8;oq"T&-!"TSB!r<2us!UHus8;oq"T&-! +"TSE"qullr! +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS,o +!uqulos!UHus8;oq"T&-!"TSB!r<2us!UHus8;oq"T&-! +"TSB!r<3*!!X/N+!UHus7ZJC +~> +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS,o +!uqulos!UHus8;oq"T&-!"TSB!r<2us!UHus8;oq"T&-! +"TSB!r<3*!!X/N+!UHus7ZJC +~> +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS,o +!uqulos!UHus8;oq"T&-!"TSB!r<2us!UHus8;oq"T&-! +"TSB!r<3*!!X/N+!UHus7ZJC +~> +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&!urri/t!UHus8)cq"TA?$"TJN&"9AZ*qu?[!q>^Htqu?[!q#:?ts82iq"T&/u"T&/u"Sr)t"T/6! +"Shut"TS2qJH~> +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&!urri/t!UHus8)cq"TA?$"TJN&"9AZ*qu?[!q>^Htqu?[!q#:?ts82iq"T&/u"T&/u"Sr)t"T/6! +"Shut"TS2qJH~> +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&!urri/t!UHus8)cq"TA?$"TJN&"9AZ*qu?[!q>^Htqu?[!q#:?ts82iq"T&/u"T&/u"Sr)t"T/6! +"Shut"TS2qJH~> +!riE's8W$#r;Za!rru! +!riE's8W$#r;Za!rru! +!riE's8W$#r;Za!rru! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS2qr<0P. +!u!urrhik! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS2qr<0P. +!u!urrhik! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS2qr<0P. +!u!urrhik! +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S_ro"Le@0"TSN$ +"SVir"TS)n! +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S_ro"Le@0"TSN$ +"SVir"TS)n! +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S_ro"Le@0"TSN$ +"SVir"TS)n! +o`+dkJcGTH!$qs8N$!"TS,o!$qs8W-!"S_os"TSE"rrhik! +o`+dkJcGTH!$qs8N$!"TS,o!$qs8W-!"S_os"TSE"rrhik! +o`+dkJcGTH!$qs8N$!"TS,o!$qs8W-!"S_os"TSE"rrhik! +o`"pps8N$!"TO&Qqu6["s7-*k"TJW)pAY-rs8N$!"TS,o! +o`"pps8N$!"TO&Qqu6["s7-*k"TJW)pAY-rs8N$!"TS,o! +o`"pps8N$!"TO&Qqu6["s7-*k"TJW)pAY-rs8N$!"TS,o! +oDealJcGQG!$q +s8N$!"TS/p!urrhuo! +oDealJcGQG!$q +s8N$!"TS/p!urrhuo! +oDealJcGQG!$q +s8N$!"TS/p!urrhuo! +JcFp5! +JcFp5! +JcFp5! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +qZ$QupAY-rs5X+["TSH#! +qZ$QupAY-rs5X+["TSH#! +qZ$QupAY-rs5X+["TSH#! +q>UHus4IAO"TAB#"O$iB"Q'.Z"TRrj! +q>UHus4IAO"TAB#"O$iB"Q'.Z"TRrj! +q>UHus4IAO"TAB#"O$iB"Q'.Z"TRrj! +q>UHus4@8O"TSH#!$qs7$$h"TSK$!$qs8W*""TS,o!$qs7$$h"TSN%! +q>UHus4@8O"TSH#!$qs7$$h"TSK$!$qs8W*""TS,o!$qs7$$h"TSN%! +q>UHus4@8O"TSH#!$qs7$$h"TSK$!$qs8W*""TS,o!$qs7$$h"TSN%! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`toD\gos8Dru"TQpMo`Xda!UHus6osg"TSH#! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`toD\gos8Dru"TQpMo`Xda!UHus6osg"TSH#! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`toD\gos8Dru"TQpMo`Xda!UHus6osg"TSH#! +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRce! +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRce! +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRce! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQNj!UHus7u]p"Sr&u"TSB!rri/t!UHus8;or"Sr)s"T/6!"Sr&u +"TSB!rri,s!UHus8Ds!"TJT*"TS;t!UHus8Ds! +"TJT*"TS>urri9"!X/N+! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQNj!UHus7u]p"Sr&u"TSB!rri/t!UHus8;or"Sr)s"T/6!"Sr&u +"TSB!rri,s!UHus8Ds!"TJT*"TS;t!UHus8Ds! +"TJT*"TS>urri9"!X/N+! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQNj!UHus7u]p"Sr&u"TSB!rri/t!UHus8;or"Sr)s"T/6!"Sr&u +"TSB!rri,s!UHus8Ds!"TJT*"TS;t!UHus8Ds! +"TJT*"TS>urri9"!X/N+! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS#lrWN3"!UHus8)co"T&-!"TSE"r<2us!UHus8;oq"T&-!"TSB!r<2us!UHus7ZJC +~> +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS#lrWN3"!UHus8)co"T&-!"TSE"r<2us!UHus8;oq"T&-!"TSB!r<2us!UHus7ZJC +~> +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS#lrWN3"!UHus8)co"T&-!"TSE"r<2us!UHus8;oq"T&-!"TSB!r<2us!UHus7ZJC +~> +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRce!UHus7ZJC~> +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRce!UHus7ZJC~> +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRce!UHus7ZJC~> +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRigrWN6#rWLOHq#p3e!UHus82ir"T&/t"T&/t"T&-!"TSB!rri<#!^HtqZ$Quq>^Htr;Za!q#:?t +s7ZJC~> +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRigrWN6#rWLOHq#p3e!UHus82ir"T&/t"T&/t"T&-!"TSB!rri<#!^HtqZ$Quq>^Htr;Za!q#:?t +s7ZJC~> +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRigrWN6#rWLOHq#p3e!UHus82ir"T&/t"T&/t"T&-!"TSB!rri<#!^HtqZ$Quq>^Htr;Za!q#:?t +s7ZJC~> +O8o+\nG`Lls8W,r"Sr&u"TS2q! +O8o+\nG`Lls8W,r"Sr&u"TS2q! +O8o+\nG`Lls8W,r"Sr&u"TS2q! +N;rn\nG`Lls82fs"TS;t!$qs8N$!"TS8s!u! +N;rn\nG`Lls82fs"TS;t!$qs8N$!"TS8s!u! +N;rn\nG`Lls82fs"TS;t!$qs8N$!"TS8s!u! +JcGTHrWN,u!$qs8Dru"TS2q! +JcGTHrWN,u!$qs8Dru"TS2q! +JcGTHrWN,u!$qs8Dru"TS2q! +JcFp5!$qs8W-!"SD]p"TSN%!$qs8W*""TS/p!$qs8N&u"RuEl"TS2qJG~> +JcFp5!$qs8W-!"SD]p"TSN%!$qs8W*""TS/p!$qs8N&u"RuEl"TS2qJG~> +JcFp5!$qs8W-!"SD]p"TSN%!$qs8W*""TS/p!$qs8N&u"RuEl"TS2qJG~> +JcFp5!$qs8W*""TS&m!sJW,s7QBm"TSK$! +JcFp5!$qs8W*""TS&m!sJW,s7QBm"TSK$! +JcFp5!$qs8W*""TS&m!sJW,s7QBm"TSK$! +JcFp5!UHus7?6l"TJT*"TS#lrri#p!$qs8W-!"S;Wo"TJN&"9AZ*nc&Ums7ZJC +~> +JcFp5!UHus7?6l"TJT*"TS#lrri#p!$qs8W-!"S;Wo"TJN&"9AZ*nc&Ums7ZJC +~> +JcFp5!UHus7?6l"TJT*"TS#lrri#p!$qs8W-!"S;Wo"TJN&"9AZ*nc&Ums7ZJC +~> +JcFp5! +JcFp5! +JcFp5! +JcFp5JHUN,JHWakr;Qd#s8;nI~> +JcFp5JHUN,JHWakr;Qd#s8;nI~> +JcFp5JHUN,JHWakr;Qd#s8;nI~> +qZ$Quf`(sTs8N&s"JYns"TRrj! +qZ$Quf`(sTs8N&s"JYns"TRrj! +qZ$Quf`(sTs8N&s"JYns"TRrj! +q>UHus4[MQ"TJE%"TSN%! +q>UHus4[MQ"TJE%"TSN%! +q>UHus4[MQ"TJE%"TSN%! +q>UHus4RDQ"TSB!!$qs8Dru"TS2q! +q>UHus4RDQ"TSB!!$qs8Dru"TS2q! +q>UHus4RDQ"TSB!!$qs8Dru"TS2q! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iup\t6ss8;lt"TP4r! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iup\t6ss8;lt"TP4r! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iup\t6ss8;lt"TP4r! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAhrrE9&r;Qd#s0Ve,"TSK$rWMuq +! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAhrrE9&r;Qd#s0Ve,"TSK$rWMuq +! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAhrrE9&r;Qd#s0Ve,"TSK$rWMuq +! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#!$qs8W*""TS/prrhik! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#!$qs8W*""TS/prrhik! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#!$qs8W*""TS/prrhik! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&o)J[lrr3!%s8;lt"TPk/!UHus7u]p"Sr&u"TSK$!^Htr;Qg$rr`?*s8)`r"TSE"rWN#r!urri2urri/t! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&o)J[lrr3!%s8;lt"TPk/!UHus7u]p"Sr&u"TSK$!^Htr;Qg$rr`?*s8)`r"TSE"rWN#r!urri2urri/t! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&o)J[lrr3!%s8;lt"TPk/!UHus7u]p"Sr&u"TSK$!^Htr;Qg$rr`?*s8)`r"TSE"rWN#r!urri2urri/t! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRlh! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRlh! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRlh! +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6p!e"TA?$"TPh.! +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6p!e"TA?$"TPh.! +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6p!e"TA?$"TPh.! +JcGQG!UHus7u]o"T&-!"TSB!rri/t!UHus82ir"Shut"TSB!rri2urri/t +rri/t!UHus82iq"Sr&u"TSB!rri/t!urri2urri2urri/trri6!rr`E'"TSB!! +JcGQG!UHus7u]o"T&-!"TSB!rri/t!UHus82ir"Shut"TSB!rri2urri/t +rri/t!UHus82iq"Sr&u"TSB!rri/t!urri2urri2urri/trri6!rr`E'"TSB!! +JcGQG!UHus7u]o"T&-!"TSB!rri/t!UHus82ir"Shut"TSB!rri2urri/t +rri/t!UHus82iq"Sr&u"TSB!rri/t!urri2urri2urri/trri6!rr`E'"TSB!! +JcGQG!UHus7ZHn"TSE"!$qs8N&u"SVir"TSH#!UHu +s8)`r"TS8s! +JcGQG!UHus7ZHn"TSE"!$qs8N&u"SVir"TSH#!UHu +s8)`r"TS8s! +JcGQG!UHus7ZHn"TSE"!$qs8N&u"SVir"TSH#!UHu +s8)`r"TS8s! +JcGQG!UHus7QBm"TSH#!$qs8N$!"TS5r +!$qs8W-!"S_os"TSE"!$qs8N$!"TS#l! +JcGQG!UHus7QBm"TSH#!$qs8N$!"TS5r +!$qs8W-!"S_os"TSE"!$qs8N$!"TS#l! +JcGQG!UHus7QBm"TSH#!$qs8N$!"TS5r +!$qs8W-!"S_os"TSE"!$qs8N$!"TS#l! +JcGTHrWN9$r<2lp!$qs8W*""TS2q!$q +s8W-!"SVir"TSH#rri#p!UHus82ir"RuHk"S_os"TSE"! +JcGTHrWN9$r<2lp!$qs8W*""TS2q!$q +s8W-!"SVir"TSH#rri#p!UHus82ir"RuHk"S_os"TSE"! +JcGTHrWN9$r<2lp!$qs8W*""TS2q!$q +s8W-!"SVir"TSH#rri#p!UHus82ir"RuHk"S_os"TSE"! +JcFp5!$qs8W*""TS2q!$qs8N$!"TS5r! +JcFp5!$qs8W*""TS2q!$qs8N$!"TS5r! +JcFp5!$qs8W*""TS2q!$qs8N$!"TS5r! +JcFp5!UHus8)`r"TS2qJH~> +JcFp5!UHus8)`r"TS2qJH~> +JcFp5!UHus8)`r"TS2qJH~> +JcFp5! +JcFp5! +JcFp5! +e,TFNqu?[!ir9#^s82fs"TQRC! +e,TFNqu?[!ir9#^s82fs"TQRC! +e,TFNqu?[!ir9#^s82fs"TQRC! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +!WN9("TJW)"TSN%"9JN*! +!WN9("TJW)"TSN%"9JN*! +!WN9("TJW)"TSN%"9JN*! +!u! +!u! +!u! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$! +!$qs7$$h"TSN% +! +!$qs7$$h"TSN% +! +!$qs7$$h"TSN% +! +!u!$qs8N$!"TS/p! +!u!$qs8N$!"TS/p! +!u!$qs8N$!"TS/p! +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri)rqud'#"9AZ*!WN<&"TSN%"TSN#"Rc$q +s8Dru"TS5rrr`E'"TS)nrrhik! +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri)rqud'#"9AZ*!WN<&"TSN%"TSN#"Rc$q +s8Dru"TS5rrr`E'"TS)nrrhik! +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri)rqud'#"9AZ*!WN<&"TSN%"TSN#"Rc$q +s8Dru"TS5rrr`E'"TS)nrrhik! +kPkPcs8W*""TOni!UHus8)`r +"TS>u! +kPkPcs8W*""TOni!UHus8)`r +"TS>u! +kPkPcs8W*""TOni!UHus8)`r +"TS>u! +kPkPcs8W*""TOqjrri?$!UHus7u]p"Sr&u"TSH#!X/N+!UHus8;or"Sr)t"T&/u"Sr&u"TSB!rri,s!UHus82ir"Sr&u"TSB!rWN&s!UHus82ir"Sr&u"TSH#!^Htr;Za!q#:?ts82ir +"Sr)t"TJE%"TSN%rri2urWN,urri,s! +kPkPcs8W*""TOqjrri?$!UHus7u]p"Sr&u"TSH#!X/N+!UHus8;or"Sr)t"T&/u"Sr&u"TSB!rri,s!UHus82ir"Sr&u"TSB!rWN&s!UHus82ir"Sr&u"TSH#!^Htr;Za!q#:?ts82ir +"Sr)t"TJE%"TSN%rri2urWN,urri,s! +kPkPcs8W*""TOqjrri?$!UHus7u]p"Sr&u"TSH#!X/N+!UHus8;or"Sr)t"T&/u"Sr&u"TSB!rri,s!UHus82ir"Sr&u"TSB!rWN&s!UHus82ir"Sr&u"TSH#!^Htr;Za!q#:?ts82ir +"Sr)t"TJE%"TSN%rri2urWN,urri,s! +k5YD`qZ$EqV#LGus82fs"TS;t!UHus8;oq"T&-!"TSE"qulrt!sJW,s8;oq"Sr&u"TSE"r<2us +! +k5YD`qZ$EqV#LGus82fs"TS;t!UHus8;oq"T&-!"TSE"qulrt!sJW,s8;oq"Sr&u"TSE"r<2us +! +k5YD`qZ$EqV#LGus82fs"TS;t!UHus8;oq"T&-!"TSE"qulrt!sJW,s8;oq"Sr&u"TSE"r<2us +! +JcGQG!UHus8)co"T&-!"TSE"r<2us! +JcGQG!UHus8)co"T&-!"TSE"r<2us! +JcGQG!UHus8)co"T&-!"TSE"r<2us! +JcGQG!UHus7u]p"Sr&u"TSB!rri2urri/trriB%!UHus82ir"9ST+s8N$!"TJQ' +"TSB!rri/t! +JcGQG!UHus7u]p"Sr&u"TSB!rri2urri/trriB%!UHus82ir"9ST+s8N$!"TJQ' +"TSB!rri/t! +JcGQG!UHus7u]p"Sr&u"TSB!rri2urri/trriB%!UHus82ir"9ST+s8N$!"TJQ' +"TSB!rri/t! +JcGQG!UHus82fs"TS;t!UHus8)`r"TS#l!^HtpAY-r +s8Dut"Shut"TSB!! +JcGQG!UHus82fs"TS;t!UHus8)`r"TS#l!^HtpAY-r +s8Dut"Shut"TSB!! +JcGQG!UHus82fs"TS;t!UHus8)`r"TS#l!^HtpAY-r +s8Dut"Shut"TSB!! +JcGQG!UHus82fs"TS>u +! +JcGQG!UHus82fs"TS>u +! +JcGQG!UHus82fs"TS>u +! +JcGQG!UHus6osg"TS/p!UHus82ir"SD]p"TSN%rri&q! +JcGQG!UHus6osg"TS/p!UHus82ir"SD]p"TSN%rri&q! +JcGQG!UHus6osg"TS/p!UHus82ir"SD]p"TSN%rri&q! +JcGTHrWN9$qulfp! +JcGTHrWN9$qulfp! +JcGTHrWN9$qulfp! +JcFp5!UHus8)`r"TS,o!$qs8W*" +"TS#lrri/t! +JcFp5!UHus8)`r"TS,o!$qs8W*" +"TS#lrri/t! +JcFp5!UHus8)`r"TS,o!$qs8W*" +"TS#lrri/t! +JcFp5!u +!^HtnG`Lls7ZJC +~> +JcFp5!u +!^HtnG`Lls7ZJC +~> +JcFp5!u +!^HtnG`Lls7ZJC +~> +JcFp5!UHus82fs"TRukrrhllrrhik!sJW,s760j"TS&mrWM`j!UHu +s7?6m"TJW)oD\gorrW3's763i"S)Ko"TJW)oD\gorrW3's7-*i"TSB!!$qs8W-!"RuHk"S2Qp"TJW)nc/Ulqu6["s7lWo"RuEl"TS2qJH~> +JcFp5!UHus82fs"TRukrrhllrrhik!sJW,s760j"TS&mrWM`j!UHu +s7?6m"TJW)oD\gorrW3's763i"S)Ko"TJW)oD\gorrW3's7-*i"TSB!!$qs8W-!"RuHk"S2Qp"TJW)nc/Ulqu6["s7lWo"RuEl"TS2qJH~> +JcFp5!UHus82fs"TRukrrhllrrhik!sJW,s760j"TS&mrWM`j!UHu +s7?6m"TJW)oD\gorrW3's763i"S)Ko"TJW)oD\gorrW3's7-*i"TSB!!$qs8W-!"RuHk"S2Qp"TJW)nc/Ulqu6["s7lWo"RuEl"TS2qJH~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7$'g"S)Km +"TS&mrWM`jrWMckrrhllrri?$! +JcFp5!$qs7$'g"S)Km +"TS&mrWM`jrWMckrrhllrri?$! +JcFp5!$qs7$'g"S)Km +"TS&mrWM`jrWMckrrhllrri?$! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qrrW3's7H?k"9ST+s7?9j"TJE%"TS/p +! +JcFp5!$qrrW3's7H?k"9ST+s7?9j"TJE%"TS/p +! +JcFp5!$qrrW3's7H?k"9ST+s7?9j"TJE%"TS/p +! +JcGQG!UHus8;lt"TS8srri<#! +JcGQG!UHus8;lt"TS8srri<#! +JcGQG!UHus8;lt"TS8srri<#! +JcGTHrri<#rri&q!^Htr;Qg$rr`?* +s8)`r"TSB!rWN&s!UHus82ir"Shut"TSH#!X/N+!^Htqu?[!q#:?ts7ZJC~> +JcGTHrri<#rri&q!^Htr;Qg$rr`?* +s8)`r"TSB!rWN&s!UHus82ir"Shut"TSH#!X/N+!^Htqu?[!q#:?ts7ZJC~> +JcGTHrri<#rri&q!^Htr;Qg$rr`?* +s8)`r"TSB!rWN&s!UHus82ir"Shut"TSH#!X/N+!^Htqu?[!q#:?ts7ZJC~> +JcGQG!UHus7ZJC +~> +JcGQG!UHus7ZJC +~> +JcGQG!UHus7ZJC +~> +JcGQG!UHus8;oq"T&-! +"TSE"qulosrri9"qullrrri9"r<2rr!UHus7ZJC +~> +JcGQG!UHus8;oq"T&-! +"TSE"qulosrri9"qullrrri9"r<2rr!UHus7ZJC +~> +JcGQG!UHus8;oq"T&-! +"TSE"qulosrri9"qullrrri9"r<2rr!UHus7ZJC +~> +JcGQG!^HtqZ$Ququ6a$rriB!s8N3'rriB!rrE9&r;Za! +q>UHus8)cq"Sr&u"TSE"rWN&s!urri/t +!UHus82iq"T&/u"T/5u"Sr)t"T/5u"Sr&u"TSB!rri9"! +JcGQG!^HtqZ$Ququ6a$rriB!s8N3'rriB!rrE9&r;Za! +q>UHus8)cq"Sr&u"TSE"rWN&s!urri/t +!UHus82iq"T&/u"T/5u"Sr)t"T/5u"Sr&u"TSB!rri9"! +JcGQG!^HtqZ$Ququ6a$rriB!s8N3'rriB!rrE9&r;Za! +q>UHus8)cq"Sr&u"TSE"rWN&s!urri/t +!UHus82iq"T&/u"T/5u"Sr)t"T/5u"Sr&u"TSB!rri9"! +JcGQG! +JcGQG! +JcGQG! +JcGQG!UHus8)cq"RuEl"TS2q! +JcGQG!UHus8)cq"RuEl"TS2q! +JcGQG!UHus8)cq"RuEl"TS2q! +JcGQG!$qs8N&u"RuEl"TS2qJ-~> +JcGQG!$qs8N&u"RuEl"TS2qJ-~> +JcGQG!$qs8N&u"RuEl"TS2qJ-~> +JcGTHrWN6#rWMuq!$qs8N$!"TS)n!X/N+! +JcGTHrWN6#rWMuq!$qs8N$!"TS)n!X/N+! +JcGTHrWN6#rWMuq!$qs8N$!"TS)n!X/N+! +JcFp5!UHus82ir"SD]p"TSN%rrhik! +JcFp5!UHus82ir"SD]p"TSN%rrhik! +JcFp5!UHus82ir"SD]p"TSN%rrhik! +JcFp5!u!$qs8W-!"SMcq"TSK$rrhik! +JcFp5!u!$qs8W-!"SMcq"TSK$rrhik! +JcFp5!u!$qs8W-!"SMcq"TSK$rrhik! +JcFp5!$qs8W*""TS&m!sJW,s7$$h"TSB!! +JcFp5!$qs8W*""TS&m!sJW,s7$$h"TSB!! +JcFp5!$qs8W*""TS&m!sJW,s7$$h"TSB!! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5!UHus7-*i"TJQ'"TS)nrrhllrr`E'"TS)n! +JcFp5!UHus7-*i"TJQ'"TS)nrrhllrr`E'"TS)n! +JcFp5!UHus7-*i"TJQ'"TS)nrrhllrr`E'"TS)n! +JcFp5!$qs7$'g"RuEl +"TS#lrrhllrrhikrrhik! +JcFp5!$qs7$'g"RuEl +"TS#lrrhllrrhikrrhik! +JcFp5!$qs7$'g"RuEl +"TS#lrrhllrrhikrrhik! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7-*i"TSE"!*srriAmrrE9& +rr3!%s7QEl"S)Km"TRuk! +JcFp5!$qs7-*i"TSE"!*srriAmrrE9& +rr3!%s7QEl"S)Km"TRuk! +JcFp5!$qs7-*i"TSE"!*srriAmrrE9& +rr3!%s7QEl"S)Km"TRuk! +JcGQG!u! +JcGQG!u! +JcGQG!u! +JcGTHrri?$!UHus8W*""TSH#rri/t!UHus8;or"Sr)t +"T&/u"Sr&u"TSH#!X/N+!^HtqZ$Quq>UHus82ir"Shut"TSE"rWN&s!UHus8Ds!"TJT*"TS>u!UHus82ir"Sr)t"T&/u"Sr&u"TS>u +rri/t!UHus8N$!"TJN&"9AZ*qYpR!s8Dru"TJN&"9AZ*qu?[!rVlm$rrN-& +!urri2urri/trri2urri/trri<#!X/N+! +JcGTHrri?$!UHus8W*""TSH#rri/t!UHus8;or"Sr)t +"T&/u"Sr&u"TSH#!X/N+!^HtqZ$Quq>UHus82ir"Shut"TSE"rWN&s!UHus8Ds!"TJT*"TS>u!UHus82ir"Sr)t"T&/u"Sr&u"TS>u +rri/t!UHus8N$!"TJN&"9AZ*qYpR!s8Dru"TJN&"9AZ*qu?[!rVlm$rrN-& +!urri2urri/trri2urri/trri<#!X/N+! +JcGTHrri?$!UHus8W*""TSH#rri/t!UHus8;or"Sr)t +"T&/u"Sr&u"TSH#!X/N+!^HtqZ$Quq>UHus82ir"Shut"TSE"rWN&s!UHus8Ds!"TJT*"TS>u!UHus82ir"Sr)t"T&/u"Sr&u"TS>u +rri/t!UHus8N$!"TJN&"9AZ*qYpR!s8Dru"TJN&"9AZ*qu?[!rVlm$rrN-& +!urri2urri/trri2urri/trri<#!X/N+! +JcGQG!UHus8;oq"T&-!"TSH#!X/N+ +rWN)t! +JcGQG!UHus8;oq"T&-!"TSH#!X/N+ +rWN)t! +JcGQG!UHus8;oq"T&-!"TSH#!X/N+ +rWN)t! +JcGQG!UHus8;oq"T/5u"T/5t"T&-!"TSE"r<2rr! +JcGQG!UHus8;oq"T/5u"T/5t"T&-!"TSE"r<2rr! +JcGQG!UHus8;oq"T/5u"T/5t"T&-!"TSE"r<2rr! +JcGQG!UHus82ir"9ST+s82fs +"TSB!rWN)t!urri/t!urri/t!UHus8)cq"T&/u"T&/u"Sr)t"T/6!"T89#"TSN% +! +JcGQG!UHus82ir"9ST+s82fs +"TSB!rWN)t!urri/t!urri/t!UHus8)cq"T&/u"T&/u"Sr)t"T/6!"T89#"TSN% +! +JcGQG!UHus82ir"9ST+s82fs +"TSB!rWN)t!urri/t!urri/t!UHus8)cq"T&/u"T&/u"Sr)t"T/6!"T89#"TSN% +! +JcGQG!UHus82ir +"SVir"TSH#! +JcGQG!UHus82ir +"SVir"TSH#! +JcGQG!UHus82ir +"SVir"TSH#! +JcGQG!$qs8N$!"TRuk!u!u! +JcGQG!$qs8N$!"TRuk!u!u! +JcGQG!$qs8N$!"TRuk!u!u! +JcGQG!$qs8N$!"TS2q!UHu +s8)`r"TS5r! +JcGQG!$qs8N$!"TS2q!UHu +s8)`r"TS5r! +JcGQG!$qs8N$!"TS2q!UHu +s8)`r"TS5r! +JcGTHrWN6#rWN)t! +JcGTHrWN6#rWN)t! +JcGTHrWN6#rWN)t! +JcG'9!$qs8W-!"S2Qp"TJW)nG`Lls7lTp"TSE" +rrhuo!$qs8W*""TRuk!$qs8W-!"SD]p"TSN%rrhik! +JcG'9!$qs8W-!"S2Qp"TJW)nG`Lls7lTp"TSE" +rrhuo!$qs8W*""TRuk!$qs8W-!"SD]p"TSN%rrhik! +JcG'9!$qs8W-!"S2Qp"TJW)nG`Lls7lTp"TSE" +rrhuo!$qs8W*""TRuk!$qs8W-!"SD]p"TSN%rrhik! +JcG*:!UHus82ir"S;Wo +"TJQ'"TS&m!sJW,s7?6m"TJW)pAY-rs8Dru"TS,o!UHus8)`r"TS5r!u! +JcG*:!UHus82ir"S;Wo +"TJQ'"TS&m!sJW,s7?6m"TJW)pAY-rs8Dru"TS,o!UHus8)`r"TS5r!u! +JcG*:!UHus82ir"S;Wo +"TJQ'"TS&m!sJW,s7?6m"TJW)pAY-rs8Dru"TS,o!UHus8)`r"TS5r!u! +JcG-;!u!$qs8W*""TS)n!X/N+!UHus7?6l"TJT*"TS)n!X/N+! +JcG-;!u!$qs8W*""TS)n!X/N+!UHus7?6l"TJT*"TS)n!X/N+! +JcG-;!u!$qs8W*""TS)n!X/N+!UHus7?6l"TJT*"TS)n!X/N+! +JcG0 +JcG0 +JcG0 +JcG3=! +JcG3=! +JcG3=! +JcG6>! +JcG6>! +JcG6>! +JcG9?! +JcG9?! +JcG9?! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcGHDrWMoo! +JcGHDrWMoo! +JcGHDrWMoo! +JcGKE!$qs8Dru"TS5r! +JcGKE!$qs8Dru"TS5r! +JcGKE!$qs8Dru"TS5r! +JcGKE!^Htr;Qg$rr`?* +s8)`r"TSB!rri,s!UHus8N$!"TJN&"9AZ*q>UHus8N$!"TJN&"9AZ*qYpR!s8N$!"TSN%rri2urri9"!X/N+ +!^Htr;Qg$rr`?*s8)cq"TA?%"TJT*"TS;t! +JcGKE!^Htr;Qg$rr`?* +s8)`r"TSB!rri,s!UHus8N$!"TJN&"9AZ*q>UHus8N$!"TJN&"9AZ*qYpR!s8N$!"TSN%rri2urri9"!X/N+ +!^Htr;Qg$rr`?*s8)cq"TA?%"TJT*"TS;t! +JcGKE!^Htr;Qg$rr`?* +s8)`r"TSB!rri,s!UHus8N$!"TJN&"9AZ*q>UHus8N$!"TJN&"9AZ*qYpR!s8N$!"TSN%rri2urri9"!X/N+ +!^Htr;Qg$rr`?*s8)cq"TA?%"TJT*"TS;t! +JcGKE! +JcGKE! +JcGKE! +JcGKE!UHus8;oq"T&-!"TSH#!X/N+rWN)t! +JcGKE!UHus8;oq"T&-!"TSH#!X/N+rWN)t! +JcGKE!UHus8;oq"T&-!"TSH#!X/N+rWN)t! +JcGHDr<2io!UHus8)cq"T89#"TJQ'"TSB!rri,s!^Ht +qZ$Quq>^Htqu?[!q#:?ts7ZJC~> +JcGHDr<2io!UHus8)cq"T89#"TJQ'"TSB!rri,s!^Ht +qZ$Quq>^Htqu?[!q#:?ts7ZJC~> +JcGHDr<2io!UHus8)cq"T89#"TJQ'"TSB!rri,s!^Ht +qZ$Quq>^Htqu?[!q#:?ts7ZJC~> +JcGBB!$qs8Dru"TS8s!u!u!UHus8)cq"T&-!"TS;t! +JcGBB!$qs8Dru"TS8s!u!u!UHus8)cq"T&-!"TS;t! +JcGBB!$qs8Dru"TS8s!u!u!UHus8)cq"T&-!"TS;t! +JcGEC!$qs8N$!"TS2q!$q +s8N$!"TS5r!$qs8N$!"TS8s!u!UHus8)`r"TS;t!$qs8N&u"SVir"TSH#!u! +JcGEC!$qs8N$!"TS2q!$q +s8N$!"TS5r!$qs8N$!"TS8s!u!UHus8)`r"TS;t!$qs8N&u"SVir"TSH#!u! +JcGEC!$qs8N$!"TS2q!$q +s8N$!"TS5r!$qs8N$!"TS8s!u!UHus8)`r"TS;t!$qs8N&u"SVir"TSH#!u! +JcGKErrhrn!u!$qs8N$!"TS/p! +JcGKErrhrn!u!$qs8N$!"TS/p! +JcGKErrhrn!u!$qs8N$!"TS/p! +JcFp5!$qs8W*""TS)n!$qs8N$!"TS#l! +JcFp5!$qs8W*""TS)n!$qs8N$!"TS#l! +JcFp5!$qs8W*""TS)n!$qs8N$!"TS#l! +JcFp5! +JcFp5! +JcFp5! +JcFp5!UHus8)`r"TS,o!$qs8Dru +"TS/p!$qs8W*""TS#lrri/t! +JcFp5!UHus8)`r"TS,o!$qs8Dru +"TS/p!$qs8W*""TS#lrri/t! +JcFp5!UHus8)`r"TS,o!$qs8Dru +"TS/p!$qs8W*""TS#lrri/t! +JcFp5!u! +JcFp5!u! +JcFp5!u! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7$'g"S)Km"TJQ'"TS)n +! +JcFp5!$qs7$'g"S)Km"TJQ'"TS)n +! +JcFp5!$qs7$'g"S)Km"TJQ'"TS)n +! +JcFp5! +JcFp5! +JcFp5! +JcFp5!*srriAms8N5lrrWE("TS)nrr`E'"TS)nrrhik! +JcFp5!*srriAms8N5lrrWE("TS)nrr`E'"TS)nrrhik! +JcFp5!*srriAms8N5lrrWE("TS)nrr`E'"TS)nrrhik! +JcFp5! +JcFp5! +JcFp5! +JcGHDrWMoo!UHus8;lu"TJT*"TS>u!u! +JcGHDrWMoo!UHus8;lu"TJT*"TS>u!u! +JcGHDrWMoo!UHus8;lu"TJT*"TS>u!u! +JcGKE!UHus8N$""TJW("T&-!"TSB!r<2us! +JcGKE!UHus8N$""TJW("T&-!"TSB!r<2us! +JcGKE!UHus8N$""TJW("T&-!"TSB!r<2us! +JcGKE!UHus8;oq"T&/u"T/5t"T&-!"TSE"r<2rr!UHus7ZJC~> +JcGKE!UHus8;oq"T&/u"T/5t"T&-!"TSE"r<2rr!UHus7ZJC~> +JcGKE!UHus8;oq"T&/u"T/5t"T&-!"TSE"r<2rr!UHus7ZJC~> +JcGHD!sJW,s7ZHn"TS;trWN)t!UHus82ir"Sr)t"T&/u"T/3$"TJW) +qu?Wuq>UHus82iq"T&/u"T&/u"Sr&u"TSB!rri,s!UHus82ir"T/3$ +"TJW)qZ$Quq>UHus82ir"Shut"TSE"rWN&s!u +!^Htqu?[!q#:?ts82ir"Sr)t"T&/u"Sr)t"T/6!"Shut"TS2q +J-~> +JcGHD!sJW,s7ZHn"TS;trWN)t!UHus82ir"Sr)t"T&/u"T/3$"TJW) +qu?Wuq>UHus82iq"T&/u"T&/u"Sr&u"TSB!rri,s!UHus82ir"T/3$ +"TJW)qZ$Quq>UHus82ir"Shut"TSE"rWN&s!u +!^Htqu?[!q#:?ts82ir"Sr)t"T&/u"Sr)t"T/6!"Shut"TS2q +J-~> +JcGHD!sJW,s7ZHn"TS;trWN)t!UHus82ir"Sr)t"T&/u"T/3$"TJW) +qu?Wuq>UHus82iq"T&/u"T&/u"Sr&u"TSB!rri,s!UHus82ir"T/3$ +"TJW)qZ$Quq>UHus82ir"Shut"TSE"rWN&s!u +!^Htqu?[!q#:?ts82ir"Sr)t"T&/u"Sr)t"T/6!"Shut"TS2q +J-~> +JcGEC!UHus8)`r"TS>u!UHus82ir"Shut"TSB!rri2u! +JcGEC!UHus8)`r"TS>u!UHus82ir"Shut"TSB!rri2u! +JcGEC!UHus8)`r"TS>u!UHus82ir"Shut"TSB!rri2u! +JcGHD!sJW,s7ZHn"TS/p!$qs8W*" +"TS8s!u!u! +JcGHD!sJW,s7ZHn"TS/p!$qs8W*" +"TS8s!u!u! +JcGHD!sJW,s7ZHn"TS/p!$qs8W*" +"TS8s!u!u! +JcGKE!u! +JcGKE!u! +JcGKE!u! +JcGKE!$qs8N$!"TS2q! +JcGKE!$qs8N$!"TS2q! +JcGKE!$qs8N$!"TS2q! +JcGHDrWMoo! +JcGHDrWMoo! +JcGHDrWMoo! +JcFp5! +JcFp5! +JcFp5! +s8W'$!riE'dJs1KUAk5ss7-*k"TJW)o)J^mo)A^nrrW3's7--h"Shut"TSB!!u!$qs8W*""TS)n!u! +s8W'$!riE'dJs1KUAk5ss7-*k"TJW)o)J^mo)A^nrrW3's7--h"Shut"TSB!!u!$qs8W*""TS)n!u! +s8W'$!riE'dJs1KUAk5ss7-*k"TJW)o)J^mo)A^nrrW3's7--h"Shut"TSB!!u!$qs8W*""TS)n!u! +!WN9'"TJN&"9AZ*hZ!TZs7QEl"JYns"TRukrrhik! +!WN9'"TJN&"9AZ*hZ!TZs7QEl"JYns"TRukrrhik! +!WN9'"TJN&"9AZ*hZ!TZs7QEl"JYns"TRukrrhik! +!WN9'"TSN%! +!WN9'"TSN%! +!WN9'"TSN%! +!WN<&"TAB""TJGq"9JN*! +!WN<&"TAB""TJGq"9JN*! +!WN<&"TAB""TJGq"9JN*! +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS/p +rrf(r! +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS/p +rrf(r! +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS/p +rrf(r! +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&! +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&! +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&! +!riE's8W$#r;Za!rr +!riE's8W$#r;Za!rr +!riE's8W$#r;Za!rr +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS/prrf(r +! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS/prrf(r +! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS/prrf(r +! +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"SVlo"Jbtt"TRrj +!$qs8N$!"TS/p!$qs8Dru"TS5r +rri<#!$qs7ZJC~> +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"SVlo"Jbtt"TRrj +!$qs8N$!"TS/p!$qs8Dru"TS5r +rri<#!$qs7ZJC~> +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"SVlo"Jbtt"TRrj +!$qs8N$!"TS/p!$qs8Dru"TS5r +rri<#!$qs7ZJC~> +o`+dkM?!MWpAY-rs7u]p"Sr&u"TSE"rWN&s!UHus8;or"Sr)t"T89$"TJT*"TS>urri<#!X/N+! +o`+dkM?!MWpAY-rs7u]p"Sr&u"TSE"rWN&s!UHus8;or"Sr)t"T89$"TJT*"TS>urri<#!X/N+! +o`+dkM?!MWpAY-rs7u]p"Sr&u"TSE"rWN&s!UHus8;or"Sr)t"T89$"TJT*"TS>urri<#!X/N+! +o`"pps8N$!"TOD[!UHus8;oq"T&/u"T/5t"T&/u"T8;u +"Sr&u"TS2qJH~> +o`"pps8N$!"TOD[!UHus8;oq"T&/u"T/5t"T&/u"T8;u +"Sr&u"TS2qJH~> +o`"pps8N$!"TOD[!UHus8;oq"T&/u"T/5t"T&/u"T8;u +"Sr&u"TS2qJH~> +oDealL&V/Vs7cNo"TS>ur<2us!UHus8;oq"T&-!"TSE"qulrt!sJW,s8;oq"T&-! +"TSB!r<2us!UHus7ZJC~> +oDealL&V/Vs7cNo"TS>ur<2us!UHus8;oq"T&-!"TSE"qulrt!sJW,s8;oq"T&-! +"TSB!r<2us!UHus7ZJC~> +oDealL&V/Vs7cNo"TS>ur<2us!UHus8;oq"T&-!"TSE"qulrt!sJW,s8;oq"T&-! +"TSB!r<2us!UHus7ZJC~> +JcGBB!^Htq>UHus82ir"Sr&u"TS>urri/t!urri/t!UHus82iq"Sr&u"TSB!rri,s!u +rri2urri2urri/trri6!rri,s! +JcGBB!^Htq>UHus82ir"Sr&u"TS>urri/t!urri/t!UHus82iq"Sr&u"TSB!rri,s!u +rri2urri2urri/trri6!rri,s! +JcGBB!^Htq>UHus82ir"Sr&u"TS>urri/t!urri/t!UHus82iq"Sr&u"TSB!rri,s!u +rri2urri2urri/trri6!rri,s! +JcGBB!UHu +s8)`r"TS;t!UHus7uZq"TS>u!UHus7uZq"TSB!rri,s! +JcGBB!UHu +s8)`r"TS;t!UHus7uZq"TS>u!UHus7uZq"TSB!rri,s! +JcGBB!UHu +s8)`r"TS;t!UHus7uZq"TS>u!UHus7uZq"TSB!rri,s! +JcGBB!u!UHus8)`r"TS;t!UHus8)`r"TRuk! +JcGBB!u!UHus8)`r"TS;t!UHus8)`r"TRuk! +JcGBB!u!UHus8)`r"TS;t!UHus8)`r"TRuk! +JcGBB!$qs8Dru"TS5r! +JcGBB!$qs8Dru"TS5r! +JcGBB!$qs8Dru"TS5r! +qZ$QupAY-rs5j7]"TPJ$! +qZ$QupAY-rs5j7]"TPJ$! +qZ$QupAY-rs5j7]"TPJ$! +q>UHus4[MQ"Mb!:"RQ-h"TS/p!$qs8N$!"TS#l!$qs8N&u"RuEl"TS2q +JH~> +q>UHus4[MQ"Mb!:"RQ-h"TS/p!$qs8N$!"TS#l!$qs8N&u"RuEl"TS2q +JH~> +q>UHus4[MQ"Mb!:"RQ-h"TS/p!$qs8N$!"TS#l!$qs8N&u"RuEl"TS2q +JH~> +q>UHus4dPU"TJW)`;f];hZ!TZs760j"TJQ'"TS,o! +q>UHus4dPU"TJW)`;f];hZ!TZs760j"TJQ'"TS,o! +q>UHus4dPU"TJW)`;f];hZ!TZs760j"TJQ'"TS,o! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`tp\tu!u! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`tp\tu!u! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`tp\tu!u! +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRrj!urrhllrrhll!sJW,s763h"SD]p"TSN%!UHus7-*i"TS&m!sJW,s7?6k"TJQ'"TS)n!sJW,s7H +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRrj!urrhllrrhll!sJW,s763h"SD]p"TSN%!UHus7-*i"TS&m!sJW,s7?6k"TJQ'"TS)n!sJW,s7H +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRrj!urrhllrrhll!sJW,s763h"SD]p"TSN%!UHus7-*i"TS&m!sJW,s7?6k"TJQ'"TS)n!sJW,s7H +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQ`p! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQ`p! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQ`p! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS)np]StDmf_MI! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS)np]StDmf_MI! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS)np]StDmf_MI! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRig!Z!~> +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRig!Z!~> +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRig!Z!~> +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRlh! +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRlh! +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRlh! +P5k=\hZ!TZs6osg"TJQ'"TS,o!*srriAns8N3'rriAn +s8N3'rriAns8N5qs+'~> +P5k=\hZ!TZs6osg"TJQ'"TS,o!*srriAns8N3'rriAn +s8N3'rriAns8N5qs+'~> +P5k=\hZ!TZs6osg"TJQ'"TS,o!*srriAns8N3'rriAn +s8N3'rriAns8N5qs+'~> +O8o+\hZ!TZs6osg"TSN%!$qrrW3' +s7H?k"TJE%"TS/p!sJW,s760j"TSN%! +O8o+\hZ!TZs6osg"TSN%!$qrrW3' +s7H?k"TJE%"TS/p!sJW,s760j"TSN%! +O8o+\hZ!TZs6osg"TSN%!$qrrW3' +s7H?k"TJE%"TS/p!sJW,s760j"TSN%! +N;rn\li6tfpAY-rs6osg"TSK$!$qs8W*""TS/p! +N;rn\li6tfpAY-rs6osg"TSK$!$qs8W*""TS/p! +N;rn\li6tfpAY-rs6osg"TSK$!$qs8W*""TS/p! +JcGEC!^Htq>UHus8Ds!"TJT*"TS>u!urri6!rri/trri2u +rri/t!UHus8;lu"TJT*"TS>u!UHus8N$! +"TJN&"9AZ*qYpR!s8N$!"TSN%rri/t!urri2urri6! +rWN&srri6!rri,s!urri<#! +JcGEC!^Htq>UHus8Ds!"TJT*"TS>u!urri6!rri/trri2u +rri/t!UHus8;lu"TJT*"TS>u!UHus8N$! +"TJN&"9AZ*qYpR!s8N$!"TSN%rri/t!urri2urri6! +rWN&srri6!rri,s!urri<#! +JcGEC!^Htq>UHus8Ds!"TJT*"TS>u!urri6!rri/trri2u +rri/t!UHus8;lu"TJT*"TS>u!UHus8N$! +"TJN&"9AZ*qYpR!s8N$!"TSN%rri/t!urri2urri6! +rWN&srri6!rri,s!urri<#! +JcGHD!UHus8Duq"T&/u"T/5t"T&-!"TSN%!UHus8;oq"T&-!"TSB!r<2us! +JcGHD!UHus8Duq"T&/u"T/5t"T&-!"TSN%!UHus8;oq"T&-!"TSB!r<2us! +JcGHD!UHus8Duq"T&/u"T/5t"T&-!"TSN%!UHus8;oq"T&-!"TSB!r<2us! +JcGKE!X/N+!UHus8;oq"T&/u"T/5t"T&/u"T8;u"TA?$"TSN%! +JcGKE!X/N+!UHus8;oq"T&/u"T/5t"T&/u"T8;u"TA?$"TSN%! +JcGKE!X/N+!UHus8;oq"T&/u"T/5t"T&/u"T8;u"TA?$"TSN%! +JcGKErriB%!^Ht!riE'r;Qd#s82ir"Sr&u"TS>urri6!!sJW,s82iq"T&/u"T&/u +"Sr&u"TSB!rWN&s!UHu +s82ir"Sr&u"TS>urri/t!UHus82iq"Sr&u"TSE"rWN,u! +JcGKErriB%!^Ht!riE'r;Qd#s82ir"Sr&u"TS>urri6!!sJW,s82iq"T&/u"T&/u +"Sr&u"TSB!rWN&s!UHu +s82ir"Sr&u"TS>urri/t!UHus82iq"Sr&u"TSE"rWN,u! +JcGKErriB%!^Ht!riE'r;Qd#s82ir"Sr&u"TS>urri6!!sJW,s82iq"T&/u"T&/u +"Sr&u"TSB!rWN&s!UHu +s82ir"Sr&u"TS>urri/t!UHus82iq"Sr&u"TSE"rWN,u! +qZ$Quf`(sTs8N&t"L7t-"TSN%!$qs8Dru"TS#l!urri,s!u!u!u! +qZ$Quf`(sTs8N&t"L7t-"TSN%!$qs8Dru"TS#l!urri,s!u!u!u! +qZ$Quf`(sTs8N&t"L7t-"TSN%!$qs8Dru"TS#l!urri,s!u!u!u! +q>UHus4[MQ"TJE%"TSN%!UHus82ir"S_os"TSE"!$qs8W*" +"TS;t!UHus8)`r"TS;t! +q>UHus4[MQ"TJE%"TSN%!UHus82ir"S_os"TSE"!$qs8W*" +"TS;t!UHus8)`r"TS;t! +q>UHus4[MQ"TJE%"TSN%!UHus82ir"S_os"TSE"!$qs8W*" +"TS;t!UHus8)`r"TS;t! +q>UHus4RDQ"TSN%!$qs8N$!"TS8s! +q>UHus4RDQ"TSN%!$qs8N$!"TS8s! +q>UHus4RDQ"TSN%!$qs8N$!"TS8s! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iup\t6ss8W*""TSN%!$qs8N$!"TS5r +!$qs8N$! +"TS5r! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iup\t6ss8W*""TSN%!$qs8N$!"TS5r +!$qs8N$! +"TS5r! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iup\t6ss8W*""TSN%!$qs8N$!"TS5r +!$qs8N$! +"TS5r! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAhrrE9&s8N*&s8W*""TP7s! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAhrrE9&s8N*&s8W*""TP7s! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAhrrE9&s8N*&s8W*""TP7s! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#!$qs8W-!"SD]p +"TSN%!UHus82fs"TS/p!$qs8N$!"TS2q +!u! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#!$qs8W-!"SD]p +"TSN%!UHus82fs"TS/p!$qs8N$!"TS2q +!u! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#!$qs8W-!"SD]p +"TSN%!UHus82fs"TS/p!$qs8N$!"TS2q +!u! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&o)J[lrr3!%s8W*""TSN%!u!u!u +! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&o)J[lrr3!%s8W*""TSN%!u!u!u +! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&o)J[lrr3!%s8W*""TSN%!u!u!u +! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRlh! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRlh! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRlh! +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6p!e"TJH#"JPjH"G$],"Mb05s*t~> +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6p!e"TJH#"JPjH"G$],"Mb05s*t~> +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6p!e"TJH#"JPjH"G$],"Mb05s*t~> +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7--h +"S)Nl"9ST+s7?9i"S)Ko"TJW)oDegnnGiLk!riE'oD\gos7ZJC~> +JcFp5!$qs7--h +"S)Nl"9ST+s7?9i"S)Ko"TJW)oDegnnGiLk!riE'oD\gos7ZJC~> +JcFp5!$qs7--h +"S)Nl"9ST+s7?9i"S)Ko"TJW)oDegnnGiLk!riE'oD\gos7ZJC~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$q +s8N$!"TS2qrr`E'"TS)nrrhik! +JcFp5!$q +s8N$!"TS2qrr`E'"TS)nrrhik! +JcFp5!$q +s8N$!"TS2qrr`E'"TS)nrrhik! +JcGECrWMrp!$qs8Dru +"TS5rrriB%!$qs8Dru"TS2q! +JcGECrWMrp!$qs8Dru +"TS5rrriB%!$qs8Dru"TS2q! +JcGECrWMrp!$qs8Dru +"TS5rrriB%!$qs8Dru"TS2q! +JcGHD!^Htq>UHus8;or"Sr)t"T&/u"Sr&u"TSB!rri/trri6!rWN&s!UHus8;or"Sr)t"TJE%"TSN%rri/t!UHus82ir"Sr&u"TS>urri/t +!u!^Htrr3!%s8W-!"T&/t"RuEl"TS2qJG~> +JcGHD!^Htq>UHus8;or"Sr)t"T&/u"Sr&u"TSB!rri/trri6!rWN&s!UHus8;or"Sr)t"TJE%"TSN%rri/t!UHus82ir"Sr&u"TS>urri/t +!u!^Htrr3!%s8W-!"T&/t"RuEl"TS2qJG~> +JcGHD!^Htq>UHus8;or"Sr)t"T&/u"Sr&u"TSB!rri/trri6!rWN&s!UHus8;or"Sr)t"TJE%"TSN%rri/t!UHus82ir"Sr&u"TS>urri/t +!u!^Htrr3!%s8W-!"T&/t"RuEl"TS2qJG~> +g&M'Tp](6rqZ$QujT#/]f)PaQo`"pps8)co"T&-!"TSE"r<2us! +g&M'Tp](6rqZ$QujT#/]f)PaQo`"pps8)co"T&-!"TSE"r<2us! +g&M'Tp](6rqZ$QujT#/]f)PaQo`"pps8)co"T&-!"TSE"r<2us! +f`(sTs7cNo"TS>u!UHus8;oq"T&-!"TSE"qulosrri6!r<2usrri9"r<2rr! +f`(sTs7cNo"TS>u!UHus8;oq"T&-!"TSE"qulosrri6!r<2usrri9"r<2rr! +f`(sTs7cNo"TS>u!UHus8;oq"T&-!"TSE"qulosrri6!r<2usrri9"r<2rr! +f`(sTs7cNo"TS>u!urri?$ +!urri/t!UHus82iq"Sr&u"TSB!rri/t +!UHus82ir +"Sr)t"T/5u"TA?$"TSN%rrhik! +f`(sTs7cNo"TS>u!urri?$ +!urri/t!UHus82iq"Sr&u"TSB!rri/t +!UHus82ir +"Sr)t"T/5u"TA?$"TSN%rrhik! +f`(sTs7cNo"TS>u!urri?$ +!urri/t!UHus82iq"Sr&u"TSB!rri/t +!UHus82ir +"Sr)t"T/5u"TA?$"TSN%rrhik! +!WN9("TJW)"TSN%"9JN*!u!u!u! +!WN9("TJW)"TSN%"9JN*!u!u!u! +!WN9("TJW)"TSN%"9JN*!u!u!u! +!$qs8N$! +"TS5r! +!$qs8N$! +"TS5r! +!$qs8N$! +"TS5r! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$!$qs8N&u"SVir"TSH#! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$!$qs8N&u"SVir"TSH#! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$!$qs8N&u"SVir"TSH#! +!$qs8N$!"TS5r!$qs8N$!"TS2q!$qs8N$!"TS#lrri,s! +!$qs8N$!"TS5r!$qs8N$!"TS2q!$qs8N$!"TS#lrri,s! +!$qs8N$!"TS5r!$qs8N$!"TS2q!$qs8N$!"TS#lrri,s! +!"TRrj!$qs8N$!"TS,o! +!"TRrj!$qs8N$!"TS,o! +!"TRrj!$qs8N$!"TS,o! +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri<#qullrqud'#"9AZ*s8W'$!WN9'"TJN&"TAPk +rrE9&`r?&Bs6osg"TS;t! +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri<#qullrqud'#"9AZ*s8W'$!WN9'"TJN&"TAPk +rrE9&`r?&Bs6osg"TS;t! +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri<#qullrqud'#"9AZ*s8W'$!WN9'"TJN&"TAPk +rrE9&`r?&Bs6osg"TS;t! +kPkPcs8W*""TO8W!UHus763i"S)Ko"TJW)o`"pprrW3's760l"TJW)oD\gorrW3's7-*i"TS;t! +kPkPcs8W*""TO8W!UHus763i"S)Ko"TJW)o`"pprrW3's760l"TJW)oD\gorrW3's7-*i"TS;t! +kPkPcs8W*""TO8W!UHus763i"S)Ko"TJW)o`"pprrW3's760l"TJW)oD\gorrW3's7-*i"TS;t! +kPkPcs8W*""TO8WJHUN,JHWakp&BO~> +kPkPcs8W*""TO8WJHUN,JHWakp&BO~> +kPkPcs8W*""TO8WJHUN,JHWakp&BO~> +k5YD`o`+dkR/[0is6osg"TSE"! +k5YD`o`+dkR/[0is6osg"TSE"! +k5YD`o`+dkR/[0is6osg"TSE"! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!*srriAmrrE9&!riE'oD\go +rrW3's7H +JcFp5!*srriAmrrE9&!riE'oD\go +rrW3's7H +JcFp5!*srriAmrrE9&!riE'oD\go +rrW3's7H +JcFp5!$qrrW3's7H?k +"TA?$"TS2q!sJW,s760j"TS#l! +JcFp5!$qrrW3's7H?k +"TA?$"TS2q!sJW,s760j"TS#l! +JcFp5!$qrrW3's7H?k +"TA?$"TS2q!sJW,s760j"TS#l! +JcFp5!urri6!! +JcFp5!urri6!! +JcFp5!urri6!! +JcG?A!^Htq>UHus82ir"Sr&u"TS>urri/t!UHus82ir"Shut"TSB!rri/t!UHus8N$!"TSN%rri/t!UHus8Ds!"TJT*"TS>urri2urri/t!UHus82iq"T&/u"TA?$"TJN&"9AZ*qZ$Qur;Za!q#:?ts8;or"T&/t"RuHk"RuEl +"TS2qJ-~> +JcG?A!^Htq>UHus82ir"Sr&u"TS>urri/t!UHus82ir"Shut"TSB!rri/t!UHus8N$!"TSN%rri/t!UHus8Ds!"TJT*"TS>urri2urri/t!UHus82iq"T&/u"TA?$"TJN&"9AZ*qZ$Qur;Za!q#:?ts8;or"T&/t"RuHk"RuEl +"TS2qJ-~> +JcG?A!^Htq>UHus82ir"Sr&u"TS>urri/t!UHus82ir"Shut"TSB!rri/t!UHus8N$!"TSN%rri/t!UHus8Ds!"TJT*"TS>urri2urri/t!UHus82iq"T&/u"TA?$"TJN&"9AZ*qZ$Qur;Za!q#:?ts8;or"T&/t"RuHk"RuEl +"TS2qJ-~> +JcGBBrri&q!UHus8;oq"T&-!"TSB!r<2us! +JcGBBrri&q!UHus8;oq"T&-!"TSB!r<2us! +JcGBBrri&q!UHus8;oq"T&-!"TSB!r<2us! +JcGEC!sJW,s7cNo"TS>ur<3&u!sJW,s8;oq"T&-!"TSB!r<2us!UHus8;oq"T&/u"T/5t"T89%"TJW)r;Z]uq>UHus8;oq"T&-!"TSB!r<2us! +JcGEC!sJW,s7cNo"TS>ur<3&u!sJW,s8;oq"T&-!"TSB!r<2us!UHus8;oq"T&/u"T/5t"T89%"TJW)r;Z]uq>UHus8;oq"T&-!"TSB!r<2us! +JcGEC!sJW,s7cNo"TS>ur<3&u!sJW,s8;oq"T&-!"TSB!r<2us!UHus8;oq"T&/u"T/5t"T89%"TJW)r;Z]uq>UHus8;oq"T&-!"TSB!r<2us! +JcGEC!sJW,s7cNo"TS;trri9"!^HtqZ$Qur;Qd#rrW3's82ir"Shut"TSB!rri/t +!UHus82iq"Sr&u"TSB!rri,s!urri/t! +JcGEC!sJW,s7cNo"TS;trri9"!^HtqZ$Qur;Qd#rrW3's82ir"Shut"TSB!rri/t +!UHus82iq"Sr&u"TSB!rri,s!urri/t! +JcGEC!sJW,s7cNo"TS;trri9"!^HtqZ$Qur;Qd#rrW3's82ir"Shut"TSB!rri/t +!UHus82iq"Sr&u"TSB!rri,s!urri/t! +JcGHD!u!UHus8)cq"RuEl"TS2q! +JcGHD!u!UHus8)cq"RuEl"TS2q! +JcGHD!u!UHus8)cq"RuEl"TS2q! +JcGKE!UHus8)`r"TRuk! +JcGKE!UHus8)`r"TRuk! +JcGKE!UHus8)`r"TRuk! +JcGKEqZQZn!$qs8N$!"TS5r! +JcGKEqZQZn!$qs8N$!"TS5r! +JcGKEqZQZn!$qs8N$!"TS5r! +JcG?A!$qs8W*""TS,o!UHus82ir"RuHk"RuEl"TS2qJ,~> +JcG?A!$qs8W*""TS,o!UHus82ir"RuHk"RuEl"TS2qJ,~> +JcG?A!$qs8W*""TS,o!UHus82ir"RuHk"RuEl"TS2qJ,~> +JcG?A! +JcG?A! +JcG?A! +JcFp5!^HtnGiLk +nG`Lls7ZJC~> +JcFp5!^HtnGiLk +nG`Lls7ZJC~> +JcFp5!^HtnGiLk +nG`Lls7ZJC~> +JcFp5!UHus7-*i"TRuk!u! +JcFp5!UHus7-*i"TRuk!u! +JcFp5!UHus7-*i"TRuk!u! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7-*i"TSN%! +JcFp5!$qs7-*i"TSN%! +JcFp5!$qs7-*i"TSN%! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs8W*""TS/p! +JcFp5!$qs8W*""TS/p! +JcFp5!$qs8W*""TS/p! +JcFp5!sJW,s82ir"Sr&u"TSB!rri/t!^HtqZ$Quq>UHus82ir"Shut +"TSH#!X/N+!UHu +s8Ds!"TJT*"TS>u!u!UHus8)cq"Sr&u +"TSH#!X/N+!u +rriB%! +JcFp5!sJW,s82ir"Sr&u"TSB!rri/t!^HtqZ$Quq>UHus82ir"Shut +"TSH#!X/N+!UHu +s8Ds!"TJT*"TS>u!u!UHus8)cq"Sr&u +"TSH#!X/N+!u +rriB%! +JcFp5!sJW,s82ir"Sr&u"TSB!rri/t!^HtqZ$Quq>UHus82ir"Shut +"TSH#!X/N+!UHu +s8Ds!"TJT*"TS>u!u!UHus8)cq"Sr&u +"TSH#!X/N+!u +rriB%! +JcGHDrWMoorri2ur<2us!UHus8N$""TJW("T&-!"TSH#!X/N+rWN)t!UHus8Duq"T&-! +"TSE"qulosrri9"qullrrri?$!X/N+rWN,u!sJW,s7--h"RuHk"RuEl"TS2qJ,~> +JcGHDrWMoorri2ur<2us!UHus8N$""TJW("T&-!"TSH#!X/N+rWN)t!UHus8Duq"T&-! +"TSE"qulosrri9"qullrrri?$!X/N+rWN,u!sJW,s7--h"RuHk"RuEl"TS2qJ,~> +JcGHDrWMoorri2ur<2us!UHus8N$""TJW("T&-!"TSH#!X/N+rWN)t!UHus8Duq"T&-! +"TSE"qulosrri9"qullrrri?$!X/N+rWN,u!sJW,s7--h"RuHk"RuEl"TS2qJ,~> +JcGKE! +JcGKE! +JcGKE! +JcG?A!UHus8)cp"T&-!"TSB!rWN)trri2urriB%!UHus82ir"Sr&u +"TS>urri/t!u +rri2urri2urri/trri9"rWN0!! +JcG?A!UHus8)cp"T&-!"TSB!rWN)trri2urriB%!UHus82ir"Sr&u +"TS>urri/t!u +rri2urri2urri/trri9"rWN0!! +JcG?A!UHus8)cp"T&-!"TSB!rWN)trri2urriB%!UHus82ir"Sr&u +"TS>urri/t!u +rri2urri2urri/trri9"rWN0!! +JcGBB!UHus8)`r"TS;t! +JcGBB!UHus8)`r"TS;t! +JcGBB!UHus8)`r"TS;t! +JcGECrri,s!UHus82fs"TS5r! +JcGECrri,s!UHus82fs"TS5r! +JcGECrri,s!UHus82fs"TS5r! +JcG?A!UHus82fs"TS8s! +JcG?A!UHus82fs"TS8s! +JcG?A!UHus82fs"TS8s! +JcG?A! +JcG?A! +JcG?A! +JcG?A! +JcG?A! +JcG?A! +JcGKEr<3&u!UHus8)`r"TS#lrrhikrrhik! +JcGKEr<3&u!UHus8)`r"TS#lrrhikrrhik! +JcGKEr<3&u!UHus8)`r"TS#lrrhikrrhik! +JcG3=!UHus82ir"S;Wo +"TJQ'"TS&m!sJW,s7QBm"TSN%!u! +JcG3=!UHus82ir"S;Wo +"TJQ'"TS&m!sJW,s7QBm"TSN%!u! +JcG3=!UHus82ir"S;Wo +"TJQ'"TS&m!sJW,s7QBm"TSN%!u! +JcG6>! +JcG6>! +JcG6>! +JcG9?! +JcG9?! +JcG9?! +JcG<@! +JcG<@! +JcG<@! +JcG?A!$qs7--h"RuHk"RuEl"TS2qJH~> +JcG?A!$qs7--h"RuHk"RuEl"TS2qJH~> +JcG?A!$qs7--h"RuHk"RuEl"TS2qJH~> +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs8Dru"TS2q! +JcFp5!$qs8Dru"TS2q! +JcFp5!$qs8Dru"TS2q! +JcFp5!$qs8W*""TS/p!sJW,s7?9j"TJE%"TS/prWMck +! +JcFp5!$qs8W*""TS/p!sJW,s7?9j"TJE%"TS/prWMck +! +JcFp5!$qs8W*""TS/p!sJW,s7?9j"TJE%"TS/prWMck +! +JcFp5! +JcFp5! +JcFp5! +JcGHDrWMoo!UHurrW3's8N&u"Sr&u"TSE"!X/N+! +JcGHDrWMoo!UHurrW3's8N&u"Sr&u"TSE"!X/N+! +JcGHDrWMoo!UHurrW3's8N&u"Sr&u"TSE"!X/N+! +JcGKE! +JcGKE! +JcGKE! +JcG?A! +JcG?A! +JcG?A! +JcG?A!^Htq>UHus82ir"Sr&u"TSB!rWN&s!urri2urri2urri,s!UHus82iq"Sr&u"TSB!rri/t +! +JcG?A!^Htq>UHus82ir"Sr&u"TSB!rWN&s!urri2urri2urri,s!UHus82iq"Sr&u"TSB!rri/t +! +JcG?A!^Htq>UHus82ir"Sr&u"TSB!rWN&s!urri2urri2urri,s!UHus82iq"Sr&u"TSB!rri/t +! +JcG?A!UHus82fs"TSB!!UHus82fs"TSB!! +JcG?A!UHus82fs"TSB!!UHus82fs"TSB!! +JcG?A!UHus82fs"TSB!!UHus82fs"TSB!! +JcGBB!UHus8)`r"TS5r! +JcGBB!UHus8)`r"TS5r! +JcGBB!UHus8)`r"TS5r! +JcGEC!$q +s8N$!"TS8s!u! +JcGEC!$q +s8N$!"TS8s!u! +JcGEC!$q +s8N$!"TS8s!u! +JcGHD!$qs8Dru"TS2q!$qs8N$!"TS/p!$qs8W*""TS/p!$qs8N$!"TS2q! +JcGHD!$qs8Dru"TS2q!$qs8N$!"TS/p!$qs8W*""TS/p!$qs8N$!"TS2q! +JcGHD!$qs8Dru"TS2q!$qs8N$!"TS/p!$qs8W*""TS/p!$qs8N$!"TS2q! +JcGKEqul`n!$qs8N$!"TS/p!$qs8W*""TS5r! +JcGKEqul`n!$qs8N$!"TS/p!$qs8W*""TS5r! +JcGKEqul`n!$qs8N$!"TS/p!$qs8W*""TS5r! +JcFp5!$qs8W-!"SD]p"TSN%! +JcFp5!$qs8W-!"SD]p"TSN%! +JcFp5!$qs8W-!"SD]p"TSN%! +JcFp5!$qs8N$!"TS#l! +JcFp5!$qs8N$!"TS#l! +JcFp5!$qs8N$!"TS#l! +JcFp5JHUN,JHWakp&BR~> +JcFp5JHUN,JHWakp&BR~> +JcFp5JHUN,JHWakp&BR~> +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs7--h"RuEn"TJW) +o)J^mnc&UmrrW3's7H?k"RuEl"TSH#! +JcFp5!$qs7--h"RuEn"TJW) +o)J^mnc&UmrrW3's7H?k"RuEl"TSH#! +JcFp5!$qs7--h"RuEn"TJW) +o)J^mnc&UmrrW3's7H?k"RuEl"TSH#! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!$qs8N$!"TS2q! +JcFp5!$qs8N$!"TS2q! +JcFp5!$qs8N$!"TS2q! +JcGEC!^Htq>UHus8Ds!"TJT*"TS>u!u!urri6!rWN&srri6!rri,s!UHus8Ds!"TJT*"TS;t!u!UHus82ir"Shut +"TSH#!X/N+! +JcGEC!^Htq>UHus8Ds!"TJT*"TS>u!u!urri6!rWN&srri6!rri,s!UHus8Ds!"TJT*"TS;t!u!UHus82ir"Shut +"TSH#!X/N+! +JcGEC!^Htq>UHus8Ds!"TJT*"TS>u!u!urri6!rWN&srri6!rri,s!UHus8Ds!"TJT*"TS;t!u!UHus82ir"Shut +"TSH#!X/N+! +JcGHDrrhuo! +JcGHDrrhuo! +JcGHDrrhuo! +JcGEC! +JcGEC! +JcGEC! +JcGEC!^Htq>UHus82ir"Sr&u"TS>urri/t!urri/t!^Htq>UHus82ir"Shut"TSB!rri/t!u +rri<#! +JcGEC!^Htq>UHus82ir"Sr&u"TS>urri/t!urri/t!^Htq>UHus82ir"Shut"TSB!rri/t!u +rri<#! +JcGEC!^Htq>UHus82ir"Sr&u"TS>urri/t!urri/t!^Htq>UHus82ir"Shut"TSB!rri/t!u +rri<#! +JcGEC!u!UHus8)`r"TS#lrrhrn!u!u!$qs8W-!"RuHk"RuEl"TS#lrrhik +rrhik! +JcGEC!u!UHus8)`r"TS#lrrhrn!u!u!$qs8W-!"RuHk"RuEl"TS#lrrhik +rrhik! +JcGEC!u!UHus8)`r"TS#lrrhrn!u!u!$qs8W-!"RuHk"RuEl"TS#lrrhik +rrhik! +JcGEC!u! +JcGEC!u! +JcGEC!u! +JcGEC!$qs8Dru"TS8s! +JcGEC!$qs8Dru"TS8s! +JcGEC!$qs8Dru"TS8s! +JcGEC!$qs8N$!"TS/p! +JcGEC!$qs8N$!"TS/p! +JcGEC!$qs8N$!"TS/p! +JcGHDrWMoo! +JcGHDrWMoo! +JcGHDrWMoo! +JcFp5!$qs8W*""TRuk!u! +JcFp5!$qs8W*""TRuk!u! +JcFp5!$qs8W*""TRuk!u! +JcFp5!UHus82fs"TS)n! +JcFp5!UHus82fs"TS)n! +JcFp5!UHus82fs"TS)n! +JcFp5JHUN,JHWakp&BR~> +JcFp5JHUN,JHWakp&BR~> +JcFp5JHUN,JHWakp&BR~> +JcFp5!UHus7--h"RuHk"S;Wo"TJQ'"TS&m!sJW,s763i +"Rl?k"TSB!! +JcFp5!UHus7--h"RuHk"S;Wo"TJQ'"TS&m!sJW,s763i +"Rl?k"TSB!! +JcFp5!UHus7--h"RuHk"S;Wo"TJQ'"TS&m!sJW,s763i +"Rl?k"TSB!! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5!UHus8N$!"TSN%rri/t!urr`E'"TSH# +rri/t!UHurrW3's8N&u"Shut"TSN% +!UHus8)cq"Sr&u"TSN%! +JcFp5!UHus8N$!"TSN%rri/t!urr`E'"TSH# +rri/t!UHurrW3's8N&u"Shut"TSN% +!UHus8)cq"Sr&u"TSN%! +JcFp5!UHus8N$!"TSN%rri/t!urr`E'"TSH# +rri/t!UHurrW3's8N&u"Shut"TSN% +!UHus8)cq"Sr&u"TSN%! +JcGHDrWMoo! +JcGHDrWMoo! +JcGHDrWMoo! +JcGKE! +JcGKE! +JcGKE! +JcGKE!^HtqZ$Quq>UHu +s82ir"Shut"TSB!rri/trri6!rWN&s!UHus8;or"Sr&u"TSB!rWN&s!UHus8;or"Shut"TSE"rWN&s! +JcGKE!^HtqZ$Quq>UHu +s82ir"Shut"TSB!rri/trri6!rWN&s!UHus8;or"Sr&u"TSB!rWN&s!UHus8;or"Shut"TSE"rWN&s! +JcGKE!^HtqZ$Quq>UHu +s82ir"Shut"TSB!rri/trri6!rWN&s!UHus8;or"Sr&u"TSB!rWN&s!UHus8;or"Shut"TSE"rWN&s! +JcGKE!u!UHus7$$h"TS#l! +JcGKE!u!UHus7$$h"TS#l! +JcGKE!u!UHus7$$h"TS#l! +JcGKE! +JcGKE! +JcGKE! +JcGKE! +JcGKE! +JcGKE! +JcGKE!$qs8W-!"RuEl"TRuk! +JcGKE!$qs8W-!"RuEl"TRuk! +JcGKE!$qs8W-!"RuEl"TRuk! +JcGKE! +JcGKE! +JcGKE! +JcGHDrWMoo!UHus82fs"TS#lrrhik +rrhik! +JcGHDrWMoo!UHus82fs"TS#lrrhik +rrhik! +JcGHDrWMoo!UHus82fs"TS#lrrhik +rrhik! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5! +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcFp5JHUN,JHWakp&BO~> +JcDVI! +JcDVI! +JcDVI! +JcG?A!fO"TO,S! +JcG?A!fO"TO,S! +JcG?A!fO"TO,S! +JcGBB!fO"TO,S! +JcGBB!fO"TO,S! +JcGBB!fO"TO,S! +JcGEC!fO"TO,S! +JcGEC!fO"TO,S! +JcGEC!fO"TO,S! +JcGHD!fO"TO,S! +JcGHD!fO"TO,S! +JcGHD!fO"TO,S! +JcGKE!fO"TO,S! +JcGKE!fO"TO,S! +JcGKE!fO"TO,S! +JcGNF!fO"TO,S!A~> +JcGNF!fO"TO,S!A~> +JcGNF!fO"TO,S!A~> +JcGQG!fO"TO&QJcG?AJF~> +JcGQG!fO"TO&QJcG?AJF~> +JcGQG!fO"TO&QJcG?AJF~> +JcGTH!fO"TO&QJcG<@JF~> +JcGTH!fO"TO&QJcG<@JF~> +JcGTH!fO"TO&QJcG<@JF~> +JcGWI!fO"TO&QJcG9?JF~> +JcGWI!fO"TO&QJcG9?JF~> +JcGWI!fO"TO&QJcG9?JF~> +JcGZJ!fO"TO&QJcG6>JF~> +JcGZJ!fO"TO&QJcG6>JF~> +JcGZJ!fO"TO&QJcG6>JF~> +JcG]K! +JcG]K! +JcG]K! +JcG`L! +JcG`L! +JcG`L! +JcGcM!u! +JcGcM!u! +JcGcM!u! +Jc>fO"TRT`! +Jc>fO"TRT`! +Jc>fO"TRT`! +Jc>`Rs5a1\"TSN%!UHus8N$!"TSN%! +Jc>`Rs5a1\"TSN%!UHus8N$!"TSN%! +Jc>`Rs5a1\"TSN%!UHus8N$!"TSN%! +K)YiSs5X+["TSN%!UHus82fs"TS8s! +K)YiSs5X+["TSN%!UHus82fs"TS8s! +K)YiSs5X+["TSN%!UHus82fs"TS8s! +KDtrTs5O%Z"TSN%!UHus82fs"TS8s!$qs8Dru"TS5r! +KDtrTs5O%Z"TSN%!UHus82fs"TS8s!$qs8Dru"TS5r! +KDtrTs5O%Z"TSN%!UHus82fs"TS8s!$qs8Dru"TS5r! +K`;&Us5EtY"TSN%! +K`;&Us5EtY"TSN%! +K`;&Us5EtY"TSN%! +LB%8VhZ*QXo)J[lo)JUjo)JXkmf*:js7QEk"RlBi"RuEl"TS#lrWMflrri&qrWN3"rWMuqrWN6# +rWMuqrWN9$qulfprWN9$r<2lprWN)t!^?qs8W'$p](-o!WN<$"T&/r"9JN*rWMflJ,~> +LB%8VhZ*QXo)J[lo)JUjo)JXkmf*:js7QEk"RlBi"RuEl"TS#lrWMflrri&qrWN3"rWMuqrWN6# +rWMuqrWN9$qulfprWN9$r<2lprWN)t!^?qs8W'$p](-o!WN<$"T&/r"9JN*rWMflJ,~> +LB%8VhZ*QXo)J[lo)JUjo)JXkmf*:js7QEk"RlBi"RuEl"TS#lrWMflrri&qrWN3"rWMuqrWN6# +rWMuqrWN9$qulfprWN9$r<2lprWN)t!^?qs8W'$p](-o!WN<$"T&/r"9JN*rWMflJ,~> +L]7AXs+13$s+139s+(~> +L]7AXs+13$s+139s+(~> +L]7AXs+13$s+139s+(~> +M#RJYs+13$s+138s+(~> +M#RJYs+13$s+138s+(~> +M#RJYs+13$s+138s+(~> +M>mSZs+13$s+137s+(~> +M>mSZs+13$s+137s+(~> +M>mSZs+13$s+137s+(~> +MZ3\[s+13$s+136s+(~> +MZ3\[s+13$s+136s+(~> +MZ3\[s+13$s+136s+(~> +MuNe\s+13$s+135s+(~> +MuNe\s+13$s+135s+(~> +MuNe\s+13$s+135s+(~> +N;in]s+149rrE9&JcGHD! +N;in]s+149rrE9&JcGHD! +N;in]s+149rrE9&JcGHD! +NW0"^s+148rrE9&JcGHD! +NW0"^s+148rrE9&JcGHD! +NW0"^s+148rrE9&JcGHD! +NrK+_s+147rrE9&JcGHD! +NrK+_s+147rrE9&JcGHD! +NrK+_s+147rrE9&JcGHD! +O8f4`s+146rrE9&JcGHD! +O8f4`s+146rrE9&JcGHD! +O8f4`s+146rrE9&JcGHD! +OT,=as+145rrE9&JcGHD! +OT,=as+145rrE9&JcGHD! +OT,=as+145rrE9&JcGHD! +OoGFbs+144rrE9&JcGHD! +OoGFbs+144rrE9&JcGHD! +OoGFbs+144rrE9&JcGHD! +P5bOcs+13$s+13.s+'~> +P5bOcs+13$s+13.s+'~> +P5bOcs+13$s+13.s+'~> +PQ(Xds+13$s+13-s+'~> +PQ(Xds+13$s+13-s+'~> +PQ(Xds+13$s+13-s+'~> +PlCaes+13$s+13,s+'~> +PlCaes+13$s+13,s+'~> +PlCaes+13$s+13,s+'~> +Q2^jfs+142s7QSHrrN-&pB6'I]`3M~> +Q2^jfs+142s7QSHrrN-&pB6'I]`3M~> +Q2^jfs+142s7QSHrrN-&pB6'I]`3M~> +QN$sgs+141s7QSHrrN-&pB6'I]`3M~> +QN$sgs+141s7QSHrrN-&pB6'I]`3M~> +QN$sgs+141s7QSHrrN-&pB6'I]`3M~> +Qi@'hs+140s7ZYIs8N&n"G-Tbs+#~> +Qi@'hs+140s7ZYIs8N&n"G-Tbs+#~> +Qi@'hs+140s7ZYIs8N&n"G-Tbs+#~> +R/[0is+14.s7c_Js8N&n"G-UNs8)rts8N5grrE9&j8XW~> +R/[0is+14.s7c_Js8N&n"G-UNs8)rts8N5grrE9&j8XW~> +R/[0is+14.s7c_Js8N&n"G-UNs8)rts8N5grrE9&j8XW~> +RK*6hJcF[.p]Q0Jrr;`rJcGWIrriB%rri?$rrh`hrrh?]JH~> +RK*6hJcF[.p]Q0Jrr;`rJcGWIrriB%rri?$rrh`hrrh?]JH~> +RK*6hJcF[.p]Q0Jrr;`rJcGWIrriB%rri?$rrh`hrrh?]JH~> +RK*3gJcF^/q#l9KrVuZrJcGTHrriB%rrhQcrrh?]J-~> +RK*3gJcF^/q#l9KrVuZrJcGTHrriB%rrhQcrrh?]J-~> +RK*3gJcF^/q#l9KrVuZrJcGTHrriB%rrhQcrrh?]J-~> +RfE6fJcFa0q#l9Kr;ZTrJcGTHrriB%rriB%q#p]squlos!X/N+! +RfE6fJcFa0q#l9Kr;ZTrJcGTHrriB%rriB%q#p]squlos!X/N+! +RfE6fJcFa0q#l9Kr;ZTrJcGTHrriB%rriB%q#p]squlos!X/N+! +RfE3eJcFa0q?2BLr;ZTrJcGTHr<3&urr`B&"9J`+"9J`+"9J`+"9AZ*qu6^#rr`?*s5a31~> +RfE3eJcFa0q?2BLr;ZTrJcGTHr<3&urr`B&"9J`+"9J`+"9J`+"9AZ*qu6^#rr`?*s5a31~> +RfE3eJcFa0q?2BLr;ZTrJcGTHr<3&urr`B&"9J`+"9J`+"9J`+"9AZ*qu6^#rr`?*s5a31~> +S,`6dJcFd1qZMKMqu?NrJcGQGrr`B&"9AZ*rr +S,`6dJcFd1qZMKMqu?NrJcGQGrr`B&"9AZ*rr +S,`6dJcFd1qZMKMqu?NrJcGQGrr`B&"9AZ*rr +S,`3cJcFg2qZMKMqZ$HrJcGQGrr`B&"9AZ*rr +S,`3cJcFg2qZMKMqZ$HrJcGQGrr`B&"9AZ*rr +S,`3cJcFg2qZMKMqZ$HrJcGQGrr`B&"9AZ*rr +SH&6bJcFj3quhTNq>^?qJcGQGrriB%rri?$rr`B&"9J`+"9Sf,"TS8s! +SH&6bJcFj3quhTNq>^?qJcGQGrriB%rri?$rr`B&"9J`+"9Sf,"TS8s! +SH&6bJcFj3quhTNq>^?qJcGQGrriB%rri?$rr`B&"9J`+"9Sf,"TS8s! +ScABdJcFa0r<.]Oq>^BrJcGQGr<*0$"TJT*rri6&!WN +ScABdJcFa0r<.]Oq>^BrJcGQGr<*0$"TJT*rri6&!WN +ScABdJcFa0r<.]Oq>^BrJcGQGr<*0$"TJT*rri6&!WN +ScAKgJcFX-rWIfPp](3qJcFm4qZPUPJH~> +ScAKgJcFX-rWIfPp](3qJcFm4qZPUPJH~> +ScAKgJcFX-rWIfPp](3qJcFm4qZPUPJH~> +T)\ZjJcFO*rWIfPp](6rJcFj3! +T)\ZjJcFO*rWIfPp](6rJcFj3! +T)\ZjJcFO*rWIfPp](6rJcFj3! +T)\cmJcFF'rrdoQpAb-qJcFg2r<1dQJ,~> +T)\cmJcFF'rrdoQpAb-qJcFg2r<1dQJ,~> +T)\cmJcFF'rrdoQpAb-qJcFg2r<1dQJ,~> +TE"ooJcF=$! +TE"ooJcF=$! +TE"ooJcF=$! +T`>#pJcF:#! +T`>#pJcF:#! +T`>#pJcF:#! +T`5#qs+14#rrE9&JcGHD! +T`5#qs+14#rrE9&JcGHD! +T`5#qs+14#rrE9&JcGHD! +U&Y,qJcC<$JcC<$r;V<~> +U&Y,qJcC<$JcC<$r;V<~> +U&Y,qJcC<$JcC<$r;V<~> +U&P,rs+13$s+13$s8;nI~> +U&P,rs+13$s+13$s8;nI~> +U&P,rs+13$s+13$s8;nI~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +JcC<$JcC<$Rf@n~> +s8W'$!riE'df9:LJcF-trWE<&"TQaHrWK2"rWE<&"TQaHrWIfPfDg@~> +s8W'$!riE'df9:LJcF-trWE<&"TQaHrWK2"rWE<&"TQaHrWIfPfDg@~> +s8W'$!riE'df9:LJcF-trWE<&"TQaHrWK2"rWE<&"TQaHrWIfPfDg@~> +!WN9'"TJN&"9AZ*hZ!TZs7lWo"9JN*! +!WN9'"TJN&"9AZ*hZ!TZs7lWo"9JN*! +!WN9'"TJN&"9AZ*hZ!TZs7lWo"9JN*! +!WN9'"TSN%! +!WN9'"TSN%! +!WN9'"TSN%! +!WN<&"TAB""TJGq"9JN*! +!WN<&"TAB""TJGq"9JN*! +!WN<&"TAB""TJGq"9JN*! +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS8s +rr`B&"9AZ*JcF4!r<*0$"9J`+"9J`+"9J`+"9AZ*!WN9("TJT+"TJT+"TJT+"TJT+"TJT+"TJT* +"TJN&"9AZ*qZ$Bps8W*%W;lf!!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+ +"9J`+"9AZ*!WN9'"TS>uq?6ft! +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS8s +rr`B&"9AZ*JcF4!r<*0$"9J`+"9J`+"9J`+"9AZ*!WN9("TJT+"TJT+"TJT+"TJT+"TJT+"TJT* +"TJN&"9AZ*qZ$Bps8W*%W;lf!!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+ +"9J`+"9AZ*!WN9'"TS>uq?6ft! +s8W$#!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+"9J`+"9AZ*!WN9'"TS8s +rr`B&"9AZ*JcF4!r<*0$"9J`+"9J`+"9J`+"9AZ*!WN9("TJT+"TJT+"TJT+"TJT+"TJT+"TJT* +"TJN&"9AZ*qZ$Bps8W*%W;lf!!WN9("TJT+"TJT+"TJT*"TJN&"9J`+"9J`+"9J`+"9J`+"9J`+ +"9J`+"9AZ*!WN9'"TS>uq?6ft! +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&! +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&! +rVuZr!WN9("TJT*"TJN&"9J`+"9J`+"9J`+"T8H(rr`B+rr`?*rrN-&! +!riE's8W$#r;Za!rr$! +!riE's8W$#r;Za!rr$! +!riE's8W$#r;Za!rr$! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS8srr`B& +"9AZ*JcF7"rriB%r<30#!sJW,s8;os"9JN*!X/N+!X/N+!$rriB%r<30#!sJW,s8;os"9JN*!X/N+!X/N+! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS8srr`B& +"9AZ*JcF7"rriB%r<30#!sJW,s8;os"9JN*!X/N+!X/N+!$rriB%r<30#!sJW,s8;os"9JN*!X/N+!X/N+! +!WN9'"TJN&"TAQ(rrWE("TSE"rr`B&"9J`+"9J`+"9AZ*"9/N("9J`+"9AZ*!WN9'"TS8srr`B& +"9AZ*JcF7"rriB%r<30#!sJW,s8;os"9JN*!X/N+!X/N+!$rriB%r<30#!sJW,s8;os"9JN*!X/N+!X/N+! +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S_rq"G-U$rrN?' +"TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S2Tk"KMJ'"TJW)"TSN$ +"TSN""9JN*rr`B&"9J`+"TJT*rri?)!WN<&"9JN*rr`B&"TJVrs83"Ns4I@%~> +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S_rq"G-U$rrN?' +"TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S2Tk"KMJ'"TJW)"TSN$ +"TSN""9JN*rr`B&"9J`+"TJT*rri?)!WN<&"9JN*rr`B&"TJVrs83"Ns4I@%~> +"9/N("TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S_rq"G-U$rrN?' +"TJW)s8E0$s83!#rri?)!WN9("TJW)"9JN*rr`B&"TJT*rri?)!WN<&"S2Tk"KMJ'"TJW)"TSN$ +"TSN""9JN*rr`B&"9J`+"TJT*rri?)!WN<&"9JN*rr`B&"TJVrs83"Ns4I@%~> +o`+dkJcDABqZMKMnc/IhJcDeNJH~> +o`+dkJcDABqZMKMnc/IhJcDeNJH~> +o`+dkJcDABqZMKMnc/IhJcDeNJH~> +o`"pps8N$!"TO&QT`5#qs8N$!"TO&Qo)A^ns8N$!"TO&QXT*e~> +o`"pps8N$!"TO&QT`5#qs8N$!"TO&Qo)A^ns8N$!"TO&QXT*e~> +o`"pps8N$!"TO&QT`5#qs8N$!"TO&Qo)A^ns8N$!"TO&QXT*e~> +oDealJcD;@r<.]On,N=hJcDbMJH~> +oDealJcD;@r<.]On,N=hJcDbMJH~> +oDealJcD;@r<.]On,N=hJcDbMJH~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +qZ$QupAY-rs5j7]"TO&Q`rH&Ap&>$qs69Oa"TOberri#p! +qZ$QupAY-rs5j7]"TO&Q`rH&Ap&>$qs69Oa"TOberri#p! +qZ$QupAY-rs5j7]"TO&Q`rH&Ap&>$qs69Oa"TOberri#p! +q>UHus4[MQ"G-TkrrE9&h>dKXPQ(Xds4mYS"TAB#"G-U!s+(~> +q>UHus4[MQ"G-TkrrE9&h>dKXPQ(Xds4mYS"TAB#"G-U!s+(~> +q>UHus4[MQ"G-TkrrE9&h>dKXPQ(Xds4mYS"TAB#"G-U!s+(~> +q>UHus4dPU"TJW)JcE^h! +q>UHus4dPU"TJW)JcE^h! +q>UHus4dPU"TJW)JcE^h! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`tp\t +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`tp\t +rr`H("TJT-"TJW)"9Sf,"TJQ'"TJN&"9AZ*!WN9)"TJW)rVu`tp\t +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRrj! +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRrj! +!WN9)"TJW)!WN9'"TJN&"9J`+"9Sf,"TJQ'"TSN%rr`E'"TRrj! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQ`p! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQ`p! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TSK$qZQ`p! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS)np]Q0Jbl7\HrrW3's8W*""TSN% +! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS)np]Q0Jbl7\HrrW3's8W*""TSN% +! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TS)np]Q0Jbl7\HrrW3's8W*""TSN% +! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRig! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRig! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrW3's8W*""TJQ'"TRig! +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRlh! +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRlh! +rWN9$q#g`u"9J`+"T8H(rri?)!WN9'"TRlh! +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +qZ$QufDbjSs+13js8N5VrrE9&rr;s#S,`Kkg]%9Ws8N&s"G-U"s+(~> +qZ$QufDbjSs+13js8N5VrrE9&rr;s#S,`Kkg]%9Ws8N&s"G-U"s+(~> +qZ$QufDbjSs+13js8N5VrrE9&rr;s#S,`Kkg]%9Ws8N&s"G-U"s+(~> +q>UHus4RGP"G-TlrrE9&h>dKXrr3!%s8W*""TP"l! +q>UHus4RGP"G-TlrrE9&h>dKXrr3!%s8W*""TP"l! +q>UHus4RGP"G-TlrrE9&h>dKXrr3!%s8W*""TP"l! +q>UHus4[JT"TJW)JcEai! +q>UHus4[JT"TJW)JcEai! +q>UHus4[JT"TJW)JcEai! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iuq#:F!rri@Qs3CZE"9\Z,rr`E, +rri?&rr`E,rri?'rriB%s8N6%s8N3&rr`?*s8N&q"T&-!"TSN%! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iuq#:F!rri@Qs3CZE"9\Z,rr`E, +rri?&rr`E,rri?'rriB%s8N6%s8N3&rr`?*s8N&q"T&-!"TSN%! +rr`H("TJT-"TJW)"9Sf,"TJQ'"TSN%rri?$rr`B&"9AZ*rr;iuq#:F!rri@Qs3CZE"9\Z,rr`E, +rri?&rr`E,rri?'rriB%s8N6%s8N3&rr`?*s8N&q"T&-!"TSN%! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAjrrE9&!riE'JcF!prr`E'"TJN& +"9AZ*s8W*%!WN9+"TJW)"TJQ'"TJW)"TJW)nG`Lls8W*""TSN%! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAjrrE9&!riE'JcF!prr`E'"TJN& +"9AZ*s8W*%!WN9+"TJW)"TJQ'"TJW)"TJW)nG`Lls8W*""TSN%! +!WN9)"TJW)!WN9'"TJN&"9J`+"9er."TJW)!riE's8N0(rriAjrrE9&!riE'JcF!prr`E'"TJN& +"9AZ*s8W*%!WN9+"TJW)"TJQ'"TJW)"TJW)nG`Lls8W*""TSN%! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#! +!riE'!riE's8N*&rrW3'rrW3'rrW3'rrN-&rri<#! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&n,N7fJcF!p! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&n,N7fJcF!p! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB$rrE9&n,N7fJcF!p! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRig! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRig! +!riE'!riE's8N*&rrW3'rrW3'rri?)rri?'rriB%rrWE("TRig! +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6]ge"TO&QcN!kHs8W!"!WN<&"9JN*!X/N+!X/N+ +qud'#"9AZ*o)J[lrr;s#UAt2qs8W!"!WN<&"9JN*!X/N+!X/N+qud'#"9AZ*o)J[lrVlm$s+13r +s*t~> +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6]ge"TO&QcN!kHs8W!"!WN<&"9JN*!X/N+!X/N+ +qud'#"9AZ*o)J[lrr;s#UAt2qs8W!"!WN<&"9JN*!X/N+!X/N+qud'#"9AZ*o)J[lrVlm$s+13r +s*t~> +rWN9$q#g`u"9J`+"9J`+"TAN)rr`B+rr`?*s6]ge"TO&QcN!kHs8W!"!WN<&"9JN*!X/N+!X/N+ +qud'#"9AZ*o)J[lrr;s#UAt2qs8W!"!WN<&"9JN*!X/N+!X/N+qud'#"9AZ*o)J[lrVlm$s+13r +s*t~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +e,TFNqu?[!kl:VbJcELbrri2urrhQcrarri2urrhNb! +e,TFNqu?[!kl:VbJcELbrri2urrhQcrarri2urrhNb! +e,TFNqu?[!kl:VbJcELbrri2urrhQcrarri2urrhNb! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +df0=Ns82fs"TSN%! +!WN9("TJW)"TSN%"9JN*!UHus1n[7"TSN$"TSN#"TSN%"9\Z, +rr`?*s8N&s"9JN*! +!WN9("TJW)"TSN%"9JN*!UHus1n[7"TSN$"TSN#"TSN%"9\Z, +rr`?*s8N&s"9JN*! +!WN9("TJW)"TSN%"9JN*!UHus1n[7"TSN$"TSN#"TSN%"9\Z, +rr`?*s8N&s"9JN*! +!u! +!u! +!u! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$!UHus1n[6"TJE("TJW)"TAQ(rrE9&s8W'$s8N*& +rr`9(rri<(q>UHus8W*#"TJW("TJE%"TJQ'"TSN%rWN3"qZQcq! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$!UHus1n[6"TJE("TJW)"TAQ(rrE9&s8W'$s8N*& +rr`9(rri<(q>UHus8W*#"TJW("TJE%"TJQ'"TSN%rWN3"qZQcq! +!WN<&"TSK("TJW)!WN<%"TSK&"TSN%rWN9$!UHus1n[6"TJE("TJW)"TAQ(rrE9&s8W'$s8N*& +rr`9(rri<(q>UHus8W*#"TJW("TJE%"TJQ'"TSN%rWN3"qZQcq! +!aN=rrW3's8W*&"TJW)"TSH#! +!aN=rrW3's8W*&"TJW)"TSH#! +!aN=rrW3's8W*&"TJW)"TSH#! +!u! +!u! +!u! +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri)rqud'#"9AZ*!WN<&"TSN%"TSN#"S;Zm"G-U> +s8<*#rrE9&rr +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri)rqud'#"9AZ*!WN<&"TSN%"TSN#"S;Zm"G-U> +s8<*#rrE9&rr +!WN<%"TSK&"TSK$rriB%rWN9$r<30#rWN9$rri)rqud'#"9AZ*!WN<&"TSN%"TSN#"S;Zm"G-U> +s8<*#rrE9&rr +kPkPcs8W*""TO&QTDnops8W*""TO&Qnc&Ums8W*""TO&Q\Gq*~> +kPkPcs8W*""TO&QTDnops8W*""TO&Qnc&Ums8W*""TO&Q\Gq*~> +kPkPcs8W*""TO&QTDnops8W*""TO&Qnc&Ums8W*""TO&Q\Gq*~> +kPkPcs8W*""TO&QTDnops8W*""TO&Qnc&Ums8W*""TO&Q\Gq*~> +kPkPcs8W*""TO&QTDnops8W*""TO&Qnc&Ums8W*""TO&Q\Gq*~> +kPkPcs8W*""TO&QTDnops8W*""TO&Qnc&Ums8W*""TO&Q\Gq*~> +k5YD`qZ$EqJcD_LrWN)tqZMKMqu?WuqZ$EqJcEXfJH~> +k5YD`qZ$EqJcD_LrWN)tqZMKMqu?WuqZ$EqJcEXfJH~> +k5YD`qZ$EqJcD_LrWN)tqZMKMqu?WuqZ$EqJcEXfJH~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +JcC<$JcC<$Rf@p~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/documentation/graphics/STIR-glossaryFig1.png b/documentation/graphics/STIR-glossaryFig1.png new file mode 100644 index 0000000000..f1f8825a71 Binary files /dev/null and b/documentation/graphics/STIR-glossaryFig1.png differ diff --git a/documentation/history.htm b/documentation/history.htm new file mode 100644 index 0000000000..93f331ceec --- /dev/null +++ b/documentation/history.htm @@ -0,0 +1,42 @@ + + + + History of public releases of the STIR software + + + + +

Click here for a complete ChangeLog file

+

History of public releases of the STIR software

+The following links give you a summary what has changed. However, +the ChangeLog is the definite (but tedious) information. + + + +

History of public releases of the PARAPET software

+ + + +
+ + + +Last modified: Mon Jun 24 23:31:58 BST 2013 + + + diff --git a/documentation/release_1.2.htm b/documentation/release_1.2.htm new file mode 100644 index 0000000000..3b250e21e3 --- /dev/null +++ b/documentation/release_1.2.htm @@ -0,0 +1,165 @@ + + + + Summary of changes in STIR release 1.2 (dated 01/04/2004) + + + +

Summary of changes in STIR release 1.2 (dated 01/04/2004)

+ +

Version 1.2 is really a maintenance/bug fix release, but includes some new +functionality that is still a bit experimental. +

+

Nearly all work on this update was by Kris Thielemans and +Sanida Mustafovic.
+Thanks to Frédéric +Schoenahl and Oliver Nix for helping to fix some bugs, and to +Pablo Aguiar, Frédéric Lamare, Frédéric +Schoenahl and Χαραλαμπος +Τσουμπας (Charalampos Tsoumpas) +for testing.
+Also many thanks to Mérence Sibomana for updating the LLN ecat matrix library to +iron out some problems with STIR. +

+

Summary for endusers (also to be read by developers)

+ + +

Bugs removed that affect users

+
    +
  • converting to ECAT6 sinograms: subheader.sampling_distance was set in mm instead of cm +
  • +
  • converting to ECAT7 sinograms: mhead.bin_size was written in + mm but should have been cm. As a consequence, the recon_zoom + factor for images was set 10 times too large. +
  • +
  • GE Advance parameters are sligthly adjusted to be the same as the VOLPET info [Roman Krais] +
  • +
  • ifheaders_for_ecat7 wrote filenames as f#g#b#d#, but it should have been f#g#d#b#. This has now +been corrected. Note that the data was alright, only that the filename didn't follow the usual +ECAT matrix order. Also, we found a bug that caused a crash when writing out a warning that the file +is not ok :-/ +
  • +
+ +

Code changes that influence your results

+
    +
  • the forward projector using Ray Tracing has changed to be more numerically +stable, and gives now the same results as the projection matrix using Ray +Tracing. It is also faster on non-brain dead compilers. However, all this +means it gives marginally different results from the previous version +(mainly for non-zero pixels at the edge of the FOV). +
  • +
+ +

New functionality of existing utilities

+
    +
  • stir_math: - added option of thresholding the data, and adding scalars +
  • +
  • SSRB: added trimming option +
  • +
  • "Ray Tracing" projection matrix: added facilities for disabling symmetries in + segment, s and z +
  • +
+ + +

New utilities

+ (but beware for some of these, as their syntax/interface +might change in the next release): +
    +
  • utilities zoom_image, create_projdata_template, generate_image, +list_ROI_values +
  • +
  • list mode (re)binner: go from list mode data to projection data (aka +sinograms). +
  • +
+ +

Installation procedure changes

+
    +
  • completely revised the makefiles. Please read the User's guide (or the mailing list). +Some important changes: +
      +
    • the optional file STIR/local/Makefile_common should now be called +STIR/local/config.mk. You can probably just rename your existing file (if you have one).
    • +
    • the variable INSTALL_DIR is now renamed INSTALL_EXE_DIR (or +you might prefer to use INSTALL_PREFIX
    • +
    • make install-all will put executables, libstir.a, include files, and +some associated files in various locations.
    • +
    • make uninstall and make uninstall-all remove the installed files. +
    • +
    • The optional files local/Makefile_bblibs and local/Makefile are +now ignored. Please read the developers guide for more info on how to add your own files +to your local version of STIR.
    • +
    +
  • +
+ + +

Documentation changes

+
    +
  • doxygen documentation has improved +
  • +
  • STIR_UsersGuide has been updated +
  • +
  • STIR_developers_overview has been marginally updated (and some typos +removed) +
  • +
+ +

recon_test_pack changes

+
    +
  • more checks (please please download it and run!) +
  • +
+ +

What's new for developers (aside from what should be obvious +from the above):

+ +

New libraries

+
    +
  • listmode: preliminary version of library for reading and processing list +mode data. Support included for ECAT 966 and 962 (but this might be broken +at this point due to moving files around etc). Note that this library is +still somewhat unstable. Please feel free to discuss it on the developers +list. +
  • +
  • Shape: geometric shapes +
  • +
  • evaluation: ROIs +
  • +
+ +

Code changes

+
    +
  • a bit more tests +
  • +
  • put in fixes for new compilers such as gcc 3.3 and VC 7.0 +
  • +
  • doxygen documentation looks better because of more grouping, corrections +and of course a new version of doxygen +
  • +
  • some bug-fixes (mainly those mentioned on the mailing lists, but a few +more) +
  • +
  • merged Reconstruction*Parameters classes into Reconstruction* classes +
  • +
  • added convenience functions to ForwardProjectorByBin and BackProjectorByBin that handle +all projdata at once. +
  • +
  • BinNormalisation functions now include time-info to allow for dead-time corrections (but we +don't have any implemented in the distribution). +
  • +
  • ProjDataInfoCylindrical*.cxx: added more functions such as + get_all_ring_pairs_for_segment_axial_pos_num, and make sure that + the set_* functions also reset the internal lookup tables [bug fix]. +
  • +
  • updated to boost 1.31 +
  • +
+ + + + + + diff --git a/documentation/release_1.3.htm b/documentation/release_1.3.htm new file mode 100644 index 0000000000..22f18ae161 --- /dev/null +++ b/documentation/release_1.3.htm @@ -0,0 +1,190 @@ + + + + Summary of changes in STIR release 1.3 (dated 25/11/2004) + + + +

Summary of changes in STIR release 1.3 (dated 25/11/2004)

+ +

+Release of 2D FBP and 3DRP.
+Aside from that, this is mostly an optimisation and bug-fix release, together +with some code changes for gcc 3.4. + +

+

Nearly all work on this update was by Kris Thielemans (but FBP2D and +FBP3DRP originate in PARAPET days).
+Thanks to Frédéric Schoenahl and Hagen Moelle for contributing +patches for gcc 3.4, and Frédéric +Schoenahl, Hagen Moelle, Katie Dinelle and Oliver Nix for testing. +
+Also many thanks to Mérence Sibomana for updating the LLN ecat matrix library to +iron out some problems with STIR. +

+

Summary for endusers (also to be read by developers)

+ +

New utilities

+
    +
  • FBP2D, our implementation of the Filtered Back Projection algorithm.
  • +
  • FBP3DRP, our implementation of the 3D Reprojection algorithm.
  • +
+ + +

Bugs removed that affect users

+
    +
  • poisson_noise did not work properly in STIR 1.2 +
  • +
  • filled in patient_orientation in ECAT headers. Without it, some display +programs reorient the image. +
  • +
  • on some systems there were problems with synchronising input and output +when asking questions to the user via a terminal. +
  • fixed bug in ECAT6 IO causing wrong reading/writing of float values in the headers on some systems with recent compilers. In addition, ECAT6 IO +should now work on 64-bit systems. Warning: bugs existed since PARAPET days +(or indeed before that) but would have appeared when doing 'make run_tests'. +
  • +
+ +

Code changes that influence your results

+
    +
  • Updated bin-size and scanner radius for the Advance as suggested by Roman Krais +quite a while ago...
  • +
  • +Interfile parsing of sinogram headers now has a different guessing routine +if "originating system" is not recognised. However, as long as all scanner parameters +are specified, nothing should change. +
  • +
  • when reading ECAT7 sinograms, and the bin_size from the header and the + STIR info do not match, the header info is now used (in previous + version, it was the STIR info). This should have little impact, + as for normal scanners, they are the same. +
  • +
  • lm_to_projdata: changed naming convention from + fgbd to fgdb according to standard CTI rules
  • +
+ +

New functionality of existing utilities

+
    +
  • added support for Discovery LS and ST
  • +
  • stir_math: added option --output-format to specify output file format for images +
  • +
  • list_ROI_values: can now have more than 1 ROI (with names) in the .par file, can output CV +
  • +
  • generate_image: added keys "X number of samples + to take per voxel" etc +
  • +
  • get_time_frame_info.cxx: added --mid-time option, + added possibility to list more than 1 frame (while keeping + command line compatible), added --num-time-frames option +
  • +
  • recon_test/bcktest.cxx: added more command line arguments, + including parsing the projector from a file, changing the + output filename etc. WARNING: the command line parameters are + INCOMPATIBLE with before. +
  • +
+ + +

Code changes that do not influence your results

+
    +
  • interactive asking of parameters by OSMAPOSL (and FBP2D) no +longer crashes. +
  • When directly reading ECAT7 files, STIR no longer generates +a corresponding Interfile header for it. This avoids problems with +read-only directories and potential race-conditions for multiple STIR +utilities reading the same file. +
  • +
  • conv_to_ecat7 now produces ECAT7 sinograms with 2-byte ints as data-type +(except when writing attenuation files). This is slower +but allows a larger number of frames. +
  • +
  • scanner name matching now ignores case and white space +
  • +
+ +

Installation procedure changes

+
    +
  • +Makefiles slightly changed to allow compiling with Visual Studio's +command line compilers (set CXX=cl). Changed the EXTRA_OPT Makefile option to EXTRA_CFLAGS, +and similar changes to make things more logical (see User's Guide). +
  • +
+ + +

Documentation changes

+
    +
  • doxygen documentation has expanded and improved, +also because we are now using +doxygen 1.3.9. In particular, the include statements in the +documentation generated by doxygen are now correct. +
  • +
  • Nearly all 'overview' documentation is now written in LaTeX format, as +opposed to RTF. Aside from some nice features in the PDF files, this should +allow easier integration with doxygen at a later stage.
+ +

recon_test_pack changes

+
    +
+ +

What's new for developers (aside from what should be obvious +from the above):

+ +

New functionality

+
    +
  • added code for FFT, see include/stir/numerics/fourier. +This code is tested indirectly in test_ArrayFilter (by comparing withordinary convolution). +Another test program is not yet included +in the distribution as it relies on comparing results with the Numerical +Recipes FFT code, which we cannot redistribute. +
  • +
  • some more functions for coordinates and array indexing. see the ChangeLog + +
+

Other code changes

+
    +
  • more tests: ProjDataInfo, symmetries (used for +forward and back projection), ArrayFilter, ROIs, VAX float conversions... +
  • +
  • major changes in the VectorWithOffset class (and a bit in Array). The big +difference is now that you can resize (also make it smaller, we had only +grow() before) and reserve capacity, similar to std::vector. (tested for +memory leaks on Linux using http://valgrind.kde.org/) +
  • +
  • changed full array iterators a little bit to allow for more compiler +optimisations. +
  • +
  • sorted out most (but I guess not all) bugs in the LOR classes. +
  • +
  • bug fixes in Shape3D (see ChangeLog). However, 2 bugs compensated +eachother such that results were correct anyway. +
  • +
  • changes to symmetries and the ray tracing projection matrix to work in +more general cases. +
  • +
  • new Array IO being introduced, allowing for more flexibility and uses less +temporary memory. Replace all usage of Array:write_data with IO/write_data +(and similar for read_data). +
  • +
  • more functionality and/or new utilities round(), modulo(), norm() etc +
  • +
  • add preliminary code for having projectors by 'densel' (i.e. voxel +but for general DiscretisedDensity) as opposed to by Bin. +
  • +
  • major changes in Scanner.cxx. Most of interest is that block/bucket info is +added for many scanners. This will be at present only be used when using +an ECAT7 normalisation file. +
  • +
  • sorted out problem in Makefile with auto-generation of dependencies (on include files) if +you are not using gcc 3.*. +
  • +
  • changed test.mk mechanism to make it far easier to add test programs. Also, +tests are now performed as different targets, so "make -k run_tests" will +run all tests, regardless of any failures. +
  • +
+ + + + diff --git a/documentation/release_1.4.htm b/documentation/release_1.4.htm new file mode 100644 index 0000000000..7dcbe44f8b --- /dev/null +++ b/documentation/release_1.4.htm @@ -0,0 +1,253 @@ + + + + Summary of changes in STIR release 1.4 (dated 25/01/2006) + + + +

Summary of changes in STIR release 1.4 (dated 25/01/2006)

+ +

+

Nearly all work on this update was by Kris Thielemans.
+Timothy Borgeaud helped with the updates for Scanner and SinglesRates. +Thanks to Oliver Nix for fixes for (and testing with) Visual Studio Express 2005. +Thanks to Frédéric Schoenahl for testing with +valgrind. +

+

Summary for endusers (also to be read by developers)

+ +

Known problems

+
    +
  • Currently the implementation if the incremental interpolating +backprojector has problems on certain processors due to floating point +rounding errors. Intel *86 and PowerPC give correct results, SunSparc and Opteron +has a problem at tangential_pos_num==0 (also HP Risc stations give +problems). (You would notice problems in the central voxel, which +will influence neighboring voxels in the iterative algorithms.) + +See the User's Guide for details on how to choose another backprojector. +
  • +
  • Currently the implementation if the incremental interpolating +backprojector fails when the number of views in not even. Images +are wrong, even though the programs might run till the end. +
  • +
  • Images have to have the default number of planes. Trying to +forward project images with smaller or larger number of planes +will show up some problems, which we thought to have removed already :-/ . +
  • +
  • When specifying shapes (e.g. for generate_image or list_ROI_values), +the code to specify Euler angles is buggy +(get after set is not consistent). +Also, the direction vectors are ignored during parsing. +
  • +
  • OSMAPOSL by default uses a truncation to a cylindrical FOV. +However, for even-sized images, this FOV is half a pixel +displaced w.r.t. to the origin used in the rest of STIR. +The same routine is used in manip_image and compare_image. +
  • +
  • CPU times reported are invalid on Windows 9?, maybe ME as well. They are +fine on NT and presumably 2000 and XP. There doesn't seem to be a way to get +CPU times in the older Windows versions. +
  • +
+ + +

New utilities

+
    +
  • Some utilities (located in listmode_utilities) for viewing info in the +.sgl file produced by ECAT HR+ or ECAT EXACT 3D scanners. +
  • +
+ +

Bugs removed that might affect users

+
    +
  • corrected bug in CListModeData::save_get_position/set_get_position +if they were called +for the last chunk of the listmode file (where chunk size was determined by +buf_size_in_bytes = 8683520). In that case, the repositioning failed and called +error() and aborted the program. In normal use, this bug would +normally only have appeared if the last frame was very short. +
  • +
  • corrected bug in buildblock/overlap_interpolate.cxx that caused wrong + value in the first non-zero output bin if the left edge of the first + in_data is to the left of the left edge of the first out_data. + This routine is used by zoom_image. +
  • +
  • buildblock/Scanner.cxx: corrected value written for "distance between + rings (cm)" in parameter_info(). This solves a problem in + list_projdata_info and others. +
  • +
  • recon_buildblock/ProjMatrixByBinUsingRayTracing.cxx: + corrected a BUG in add_adjacent_z. This function is used for segment 0 in case voxel_size.z() + is less than axial_sampling_in_m (e.g. the 'span=1' case). If you were unlucky, a sensitivity to + rounding errors could mean that the last plane of voxels contributing to a sinogram was +ignored. +
  • +
  • corrected behaviour of the SSRB routines for +max_in_segment_num_to_process=-1. Now uses the maximum present in the +input data. This fixes a minor problem with FBP2D noticed by Hagen Moelle. +
  • +
  • utilities/SSRB.cxx had wrong command line processing. The last + argument (max_in_segment_num_to_process) had to be present, but was then + ignored (as it was initialised from the previous argument). +
  • +
+ +

Code changes that influence your results

+
    +
  • The Interfile header for projection data now uses a different + convention for the specifying the ring diameter etc. Current keywords are +
    +   inner ring diameter (cm) := ...
    +   average depth of interaction (cm) := ...
    +   default bin size (cm) :=
    +   effective central bin size (cm) :=
    +   
    + For arc-corrected data, it is the last keyword that is used to + set the tangential sampling.
    + The previous keywords ring diameter (cm) + and bin size are now ignored. + This is done to prevent reading the wrong ring radius etc from old files (see next item). +
    + If you want to get the same reconstructions as before, set + inner_ring_diameter + 2*average_depth_of_interaction/10 equal to + the old ring_diameter. +
  • +
  • The ring diameter for most CTI/Siemens scanners is changed. + Values now match to what is used by CTI. In particular, an average + depth-of-interaction is + added to give an effective ring radius. As this changes the + scanner dimensions slightly (about 1.5% larger) you will get slightly + different values in the reconstructed images. This change will be tiny + for arc-corrected data, but somewhat larger for non-arccorrected data + (tests indicate again less than 1% difference). + Note however that changes in the sensitivity image as used by OSMAPOSL + are larger. So, do not re-use existing sensitivity images. +
  • +
  • Sizes such as ring-spacing and bin-size for the GE Discovery ST +have changed according to info from Ravindra Manjeshwar (GE Research). The Advance +data were ok. +
  • +
  • Reconstruction programs now get the pixel size from + default_bin_size*zoom (default bin size either specified in the Interfile header +or in Scanner.cxx). (It used to be get_sampling_in_s(Bin(0,0,0,1)) + before). This will + make a difference in the voxel size when using non-arccorrected data + (and with arc-corrected data if the bin size is different from the default value). + However, it makes the voxel size consistent between using arc-corrected and non-arccorrected +data as input. +
  • +
  • Handling of 3 header fields when writing ECAT7 data has changed somewhat. +
      +
    • The bin_size field in the main header is now always set to the +default_bin_size of the scanner. For sinogram data, the x_resolution +in the subheader is normally also set to the default bin size. +Only for arc-corrected data, the x_resolution is always set to the sampling_in_s. +
    • +
    • The corrected correspondence between zoom and voxel size in the ECAT7 +header to follow the CTI convention, so recon_zoom will now have a slightly +different value.
    • +
    +
  • WARNING: changed format of command line parameters of fwdtestto +an incompatible format. +fwdtest can now take a parameter file with the forward projector parameters +(similar to bcktest). +This makes it possible to run complete forward projections without user input (should work by +redirecting stdin to /dev/null such that all questions are answered with their +default values). +
  • +
  • WARNING: changed order of command line parameters of bcktest. +
  • +
+ +

New functionality of existing utilities

+
    +
  • added arc-correction to FBP, 3DRP and correct_projdata +
  • +
  • added classes to use ECAT7 normalisation files. You can now +normalise and dead-time correct your ECAT7 sinograms. +
  • +
  • changes in the interpolating backprojector allow handling data where the +number of views is not a multiple of 4 (such as the Discovery ST).
  • +
  • added a quadratic prior to be used by OSMAPOSL
  • +
  • Added data for the GE Discovery STE, GE Discovery RX +and Philips Allegro. +
  • +
  • a new option --max_segment_num_to_process to stir_math +
  • +
  • a new option --verbose to postfilter +
  • +
  • a new option -n to conv_to_ecat7 that attempts to fix the scale factor used to 1
  • +
  • interfile (and in general Array) IO can now use 1-byte integers.
  • +
+ + +

Code changes that do not influence your results

+
    +
  • removed a bug in listmode classes for ECAT 966 and 962 (function get_detectors), +which would have caused your program to crash. +
  • +
  • removed a few bugs in LORCoordinates.inl
  • +
  • recon_buildblock/RayTraceVoxelsOnCartesianGrid.cxx has changed behaviour + when LOR is in a plane between 2 voxels. Previous version had ill-defined + behaviour (it would put all results in one or the other, depending on + round-errors). Now it stores half of the results in each plane.
  • +
  • the 'ray tracing' type of 'matrix' for projection uses the above +routine and is now more flexible with respect to zooms etc. The previous +version aborted when it detected that a line would be in a plane between 2 voxels.
  • +
  • removed some small memory leaks.
  • +
  • removed problem in FBP2D, making sure that all variables are initialised +(bug spotted by Carole Lartizien)
  • +
  • code changes to iterators in VectorWithOffset (and hence Arrays etc). +They now use some boost classes to have more functionality (e.g. reverse iterators).
  • +
  • BasicCoordinate objects now take less memory as they no longer allocate +an extra element.
  • +
  • updated boost include files to 1.32.0 and added more boost libraries.
  • +
+ +

Installation procedure changes

+
    +
  • Projects for Visual Studio 6 have been updated. Some windows libraries +that were never used have been removed. This might make transfer to +Visual Studio Express 2005 easier. However, these projects have not been tested for +a while. Search the mailing list for more info if you want to try this. +
  • +
+ + +

Documentation changes

+
    +
  • updated doxygen and User's Guide
  • +
+ +

recon_test_pack changes

+
    +
  • Added tests for the quadratic prior
  • +
  • Added tests for conv_to_ecat7 (disabled by default, use --ecat7 to enable)
  • +
+ +

What's new for developers (aside from what should be obvious +from the above):

+ +

New functionality

+
    +
  • a new hierarchy SinglesRates in data_buildblock. This encodes singles rates +during a PET scan.
  • +
  • some extra files for manipulating matrices in include/stir/numerics +
  • +
+

Other code changes

+
    +
  • a few small changes to the CListRecord hierarchy. You +will have to adapt your code (implement set/get_time_in_millisecs and remove set/get_time_in_secs (as + now in CListRecord)
  • +
  • Scanner has more members for singles. It also differentiates between the inner ring radius +and an effective ring radius (using some average depth of interaction as supplied by the +scanner manufacturer). Multiple detector-layer scanners are not really supported though. +
  • +
  • Many files now have explicit copyright statements, but still not all.
  • +
+ + + + diff --git a/documentation/release_2.0.htm b/documentation/release_2.0.htm new file mode 100644 index 0000000000..a0677d4bca --- /dev/null +++ b/documentation/release_2.0.htm @@ -0,0 +1,36 @@ + + + + Summary of changes in STIR release 2.0 (dated 21 June 2009) + + + +

Summary of changes in STIR release 2.0 (dated 21 June 2009)

+ +

+Major reworking of the reconstruction hierarchy. +See STIR-version2-vs-version1.pdf for +more info. +

+

Nearly all work on this update was by Kris Thielemans (Hammersmith Imanet Ltd) +and Sanida Mustafovic (Imperial College and Hammersmith Imanet Ltd). +Some updates and new utilities by Charalampos Tsoumpas (Imperial College and Hammersmith Imanet Ltd) +have been included as well. In addition, +the following has been added: +

+
    +
  • Basic support for SimSET
    +contributors: Pablo Aguiar (Univ of Barcelona, Spain), +Charalampos Tsoumpas, Nikolaos Dikaios (NTUA, Greece) and Kris Thielemans
  • +
  • Initial version for parallelisation of OSMAPOSL using MPI
    +contributors: Tobias Beisel and Stefan Lietsch (Univ of Paderborn, Germany)
    +This work is based on software and documentation from the PARAPET project, +but is different in implementation.
  • +
  • A contribution by C. Ross Schmidtlein and Assen S. Kirov. Allows +to specify 3D boxes as shapes (and hence generate\_image). +
+

See also the new contrib sub-directory available in the documentation zip file.

+ + + + diff --git a/documentation/release_2.1.htm b/documentation/release_2.1.htm new file mode 100644 index 0000000000..ff071f626a --- /dev/null +++ b/documentation/release_2.1.htm @@ -0,0 +1,221 @@ + + + + Summary of changes in STIR release 2.1 (dated June 2011) + + + +

Summary of changes in STIR release 2.1 (dated June 2011)

+ +

Most of the work in this update was by Kris Thielemans (Hammersmith Imanet Ltd) +and Charalampos Tsoumpas (Imperial College and Hammersmith Imanet Ltd, now King's College London). +Some older code by Sanida Mustafovic (Imperial College and Hammersmith Imanet Ltd) +has now finally been incorporated into STIR as well. +Careful testing and investigation by Charalampos Tsoumpas and Irene Polycarpou (both King's +College London) uncovered some old bugs, which were corrected after discussions with +Matthew Jacobson (Xoran Technologies). +Other contributions are mentioned explicitly below.
+See also the new contrib sub-directory available in the documentation zip file. +

+
    +
  • Single scatter estimation routines
    +Contributors: Charalampos Tsoumpas, Pablo Aguiar (Univ of Barcelona, when working on this topic), +Nikolaos Dikaios (National Technical University of Athens, when working on this topic) +and Kris Thielemans. +
  • +
  • Parametric image estimation routines.
    +Contributors: Charalampos Tsoumpas and Kris Thielemans +
  • + +
  • B-spline interpolation functions and a few numerical algorithms.
    +Contributors: Charalampos Tsoumpas, +Nikolaos Dikaios (National Technical University of Athens, when working on this topic) +and Kris Thielemans. +
  • +
+ +

Summary for end users (also to be read by developers)

+ +

Important bug fixes

+
    +
  • fixed a problem in the computation for the gradient of the Poisson log-likelihood that occured +if a viewgram of the measured data was zero (which should occur only a dramatically noisy situations).
  • +
  • fixed a problem in the computation of the Poisson log-likelihood that the multiplicative term of the +model was ignored. Objective function values prior to this fix were therefore incorrect (except for the +case where there was no multiplicative term). However, this bug did not affect actual reconstructed images.
    +(In addition, the computation of the objective function now has increased numerical accuracy.)
  • +
  • the MPI support for OSMAPOSL introduced in STIR 2.0 was broken (it did not compile, and needed some +fixes before obtaining the correct result).
  • +
+

Known problems

+
    +
  • ECAT6 routines seem to have problems since STIR 2.0. ECAT6 is therefore no longer supported
  • +
  • The interpolating back-projector can still give problems in the centre of the images +on some architectures/compiler/optimisation settings. We recommend to use the ray-tracing +matrix (with additional rays) instead.
  • +
  • When using Visual Studio (Express) with the provided solution files, there is a linking problem for some +utilities. It is recommended to use the new CMake files for building instead.
  • +
  • Some of the new list mode files might not compile with Visual Studio (Express).
  • +
+ +

New utilities

+
    +
  • abs_image, convert_to_binary_image, find_fwhm_in_image, +list_detector_and_bin_info.
  • +
  • Utilities in modelling_utilities.
  • +
  • Parametric image reconstruction algorithms POSMAPOSL and POSSPS. +Currently we have only an objective function for Patlak, but extension +to other linear models is easy.
  • +
  • New utilities in listmode_utilities: lm_to_projdata_bootstrap +(useful to generate multiple realisations from a single list mode file to study variance), +list_lm_events and lm_fansums (useful for developing normalization code).
  • +
  • A few scripts are now also copied with make install, including the +new stir_print_voxel_sizes.sh.
  • +
+ + +

New functionality of existing utilities

+
    +
  • Added data for the GE Discovery 600.
  • +
  • Added data for the Biograph 16 (by Robert Barnett, Westmead Hospital, Sydney).
  • +
  • stir_math has 2 new options --parametric or --dynamic.
  • +
  • OSMAPOSL and OSSPS have a new "subset sensitivity filenames" which can be set to +e.g. subsens_%d.hv. This is useful when use_subset_sensitivities is set (which is now +recommended).
  • +
  • OSMAPOSL now accepts a prior even if use_subset_sensitivities is set.
  • +
  • In addition to OSMAPOSL, OSSPS is now also parallelised when using MPI. +
+ +

Functionality changes

+
    +
  • The ray tracing projection matrix can be enabled (at compile time) to use a circular FOV +that goes to the edge of the image (i.e. approx one pixel larger than what it used to be). +However, enabling this gave a change in the recon_test_pack results (probably mostly because +that data contains scatter, while the recon_test_pack code does not model scatter). Therefore, +this change is disabled by default. You can add -DSTIR_PMRT_LARGER_FOV to EXTRA_CFLAGS +if you want this anyway. +
  • +
  • Most utilities will now display a somewhat involved message when an error occured. Exact format +will be system/compiler dependent, but could be something like +
    +ERROR: Error opening file test.hv
    +
    +terminate called after throwing an instance of 'std::string'
    +Aborted (core dumped)
    +
    +The useful bit is after the ERROR string. Ignore the rest (see +here why this happens). +
  • +
+ +

Documentation changes

+
    +
  • updated doxygen and User's Guide
  • +
+ +

recon_test_pack changes

+
    +
  • Moved the tests for the ecat routines to a separate file run_ecat_tests.sh
  • +
  • Created a new script run_test_simulate_and_recon.sh that performs a +simple analytic simulation of a uniform cylinder, +reconstructs it with all STIR reconstruction algorithms and checks ROI values.
  • +
  • Updated Windows batch files. They were broken in STIR 2.0
  • +
+ +

Other changes to tests

+
    +
  • A new test in recon_test checks the gradient computation vs +a numerical gradient by computing the objective function. This is currently +only enabled for PoissonLogLikelihoodWithLinearModelForMeanAndProjData. +
  • +
+ +

What's new for developers (aside from what should be obvious +from the above):

+ +

Major bugs fixed

+
    +
  • ProjData::set_segment was always writing the same data +(namely the one where view_num=segment_num). This bug existed since the +very first version of STIR. Nobody seems to have been using +this function, as the result was obviously wrong.
  • +
  • The objective function values were computed ignoring multiplicative corrections +and background terms.
  • +
  • The ECAT962 and 966 list mode event functions get_detection_coordinates() +and get_LOR() returned coordinates in a different coordinate system as expected +(z=0 was in the first ring of the scanner as opposed to the centre of the scanner). These functions +were not used by the rest of STIR however.
  • +
+ +

Major revision of the listmode classes

+

These are now ready for data from non-CTI scanners.

+
    +
  • CListEvent::get_detection_coordinates() no longer exists (use get_LOR instead).
  • +
  • CListTime::get/set_gating have been moved to new CListGatingInput class +as not all scanners have gating related info in the timing event.
  • +
  • CListRecordUsingUnion and CListModeDataFromStream no longer exist. +The IO functionality of the latter is now in the new (more generic) class InputStreamWithRecords.
  • +
+ +

New functionality

+
    +
  • ArrayFilter2DUsingConvolution and ArrayFilter3DUsingConvolution.
  • +
  • Preliminary classes for dynamic and gated data
  • +
  • New member fill_nonidentifiable_target_parameters of the +GeneralisedObjectiveFunction hierarchy. This used by OSSPS to avoid problems +when initialising with images that have for instance been reconstructed on a square grid.
  • +
  • B-spline interpolation functions and a few numerical algorithms (IIR and FIR filters, +1d numerical integration).
  • +
+ +

Other code changes

+
    +
  • error() now throws an exception as opposed to calling exit, +such that we can catch +the exception in a calling routine. This would be essential for building GUIs etc. Unfortunately, +for the user this has the potential to generate some confusion as the error message +when a STIR program calls error() now talks about unhandled exception. +The best way to solve this would be to catch all exceptions in each main(), but +that is a lot of work...
  • +
  • ProjDataInfoCylindrical::set_num_views() now makes sure that we cover the + same range of angles as before (usually, but not necessarily, 180 degrees). +
  • +
  • PoissonLogLikelihoodWithLinearModelForMean has been changed to be more consistent +in the subset sensitivity interface: +
      +
    • The parser has a new keyword subset sensitivity filenames which can be set to e.g. subsens_%d.hv
    • +
    • Derived classes have to define a virtual function set_up_before_sensitivity() (essentially +replacing what they used to have in setup() before, except for the call to base_type::setup()).
    • +
    • setup() now class set_up_before_sensitivity(), computes (subset)sensitivities, and if required, +writes them to disk.
    • +
    • get_sensitivity(subset_num) is replaced by get_sensitivity() and get_subset_sensitivity(subset_num)
    • +
    • set_sensitivity_sptr is now called set_subset_sensitivity_sptr
    • +
    • fill_nonidentifiable_target_parameters uses get_sensitivity() and hence no longer only checks the first subset.
    • +
    +
  • Most of the .cxx files in the recon_buildblock had to be updated to +add instantiations for parametric images. This is unfortunate and another +mechanism would be nicer. +
  • +
  • moved code that finds subset-num in terms of subiteration-num to +IterativeReconstruction::get_subset_num(). If you have your own +reconstruction classes, you should use this member. +IterativeReconstruction::randomly_permute_subset_order() is now private.
  • +
  • read_stream_in_memory (in utilities.h) now takes a file_size +argument of type std::streamsize as opposed to unsigned long. As +this parameter is passed as a reference, this change is not backwards compatible +(at least on systems where these 2 types are not equal).
  • +
  • FullArrayIterator and NestedIterator now have extra constructors to be able to convert +compatible iterators (e.g. full_iterator to const_full_iterator).
  • +
  • NestedIterator has more help classes for cases where the top-level iterator refers to +a pointer to the 2nd level iterator.
  • +
  • Various small fixes for more recent compilers such as gcc 4.3 and Visual Studio Express 2010.
  • +
  • Initial release of files for an alternative cross-platform build system +CMake, based on example files provided by +Robert Barnett (Westmead Hospital, Sydney). This is much better for configuration and finding system dependencies. +However, tests are not yet included in the CMakeFiles.
  • +
+ + + + + diff --git a/documentation/release_2.2.htm b/documentation/release_2.2.htm new file mode 100644 index 0000000000..1a54464adf --- /dev/null +++ b/documentation/release_2.2.htm @@ -0,0 +1,156 @@ + + + + Summary of changes in STIR release 2.2 (dated 20 February 2012) + + + +

Summary of changes in STIR release 2.2 (dated 20 February 2012)

+ +

This update was prepared by Kris Thielemans (Algorithms and Software Consulting Ltd). +SimSET scripts were updated with help from Robert Harrison (Univ Washington).

+ +
    + +

    Summary for end users (also to be read by developers)

    + +

    Important bug fixes

    +
      +
    • The routines to handle SimSET data did not really work in previous releases, +but should work now. This is all still preliminary. Check SimSET/README.txt for +some information. +
    • +
    + +

    New build system

    +
      +
    • release of files for an alternative cross-platform build system +CMake, based on example files provided by +Robert Barnett (Westmead Hospital, Sydney) for STIR 2.1. The files distributed +with version 2.2 are now complete and also include the tests.
      +CMake is much better than the previous STIR make files for configuration and finding system dependencies. +It also works on Windows for Visual Studio. Using CMake is recommended when using Visual Studio. +
    • +
    + +

    Known problems

    +
      +
    • This release is known to fail when both MPI and shared libraries are enabled. You will see linking errors in all non_MPI executables.
    • +
    • The recon_test_pack routines fail with the MPI version. See the mailing list for a work-around.
    • +
    • ECAT6 routines seem to have problems since STIR 2.0. ECAT6 is therefore no longer supported
    • +
    • The interpolating back-projector can still give problems in the centre of the images +on some architectures/compiler/optimisation settings. We recommend to use the ray-tracing +matrix (with additional rays) instead.
    • +
    • When using Visual Studio (Express) with the provided solution files, there is a linking problem for some +utilities. It is recommended to use the new CMake files for building instead.
    • +
    • When using GRAPHICS=X (i.e. on Unix/Linux/MacOSX) there window displaying +the bitmaps is sometimes empty. This might depend on your X server settings. +This affects manip_image, manip_projdata and display_projdata. +
    • +
    + +

    New functionality

    +
      +
    • stir_math has two additional switches --parametric and --dynamic +to handle parametric or dynamic images (no sinograms yet. sorry). Note however that output data +will not incomplete headers. In particular, timing information will be lost.
    • +
    • list_image_info now also prints information about the edge of the voxels and the total +sum in the image.
    • +
    • stir_write_pgm is a new utility to make a PGM image for a single slice of an image.
    • +
    • list_projdata_info now also optionally prints information about min, max and the total +sum in the data (run without arguments to see a usage message).
    • +
    + +

    Functionality changes

    +
      +
    • ECAT list-mode routines are now no longer included in the library when +ECAT support is not enabled. (In STIR 2.1 they defaulted to use the ECAT 962 file format.)
    • +
    • On Unix/Linux systems, manip_image and manip_projdata used to +display a list of files in the current directory when asking for new input data. +This is no longer implemented.
    • + +
    + +

    Minor bug fixes

    +
      +
    • This update contains updates for more recent compilers +(Clang++ 2.9, gcc 4.6.1 and Visual C++ 2010 are now supported).
    • +
    • No longer write confusing warnings about ring + difference does not belong in a segment after calling + SSRB, in FBP3DRP etc. +
    • +
    • Empty lines in .par files could create problems in previous versions. This +should be fixed now. +
    • +
    • The command line processing of create_tail_mask_from_ACFs only worked if all options were given (i.e. if +you attempted to use the defaults, the program crashed). +
    • +
    + +

    Documentation changes

    +
      +
    • The User's guide has been improved. Major changes are related to +the scatter estimation, the use of a stored projection matrix, and the CMake +build process. +
    • +
    • minor changes to doxygen documentation
    • +
    + +

    recon_test_pack changes

    +
      +
    • minor changes to some scripts for Bourne shell compatibility (as opposed to bash only)
    • +
    + +

    Other changes to tests

    +

    None

    + +

    What's new for developers (aside from what should be obvious +from the above):

    + +

    Major bugs fixed

    +

    None

    + +

    New functionality

    +
      +
    • Pre-release of some very very preliminary code to use SWIG to make +a Python interface to STIR. It isn't complete by far, nor documented. +If you know SWIG, feel free to chip-in! (Let's discuss that on the stir-devel list). +
    • +
    + +

    Other code changes

    +
      +
    • stir::shared_ptr is now an alias for boost::shared_ptr from the Boost C++ library. This makes it much more robust and +standard compliant. This means that you might have to change your code in a few +places. For example: +
      + // no longer works
      + shared_ptr<MyType> sptr = new MyType;
      + sptr = new MyType;
      + sptr = 0;
      +
      + // replace with 
      + shared_ptr<MyType> sptr(new MyType);
      + sptr.reset(new MyType);
      + sptr.reset();
      +
      +
    • + +
    • Introduced new input file format registries for +stir::DynamicDiscretisedDensity and +ParametricDiscretisedDensity, moving the relevant code +from the class definition. See the IO group. +
    • +
    • Replaced most occurences of ClassName::read_from_file +with read_from_file<ClassName>, for those classes +which have an input file format registry (i.e. all except ProjData). These two versions +are currently functionally identical (as the first version will call the +second), but the first version is deprecated as it prevents us to separate +the IO and buildblock libraries. +
    • +
    • Minor fixes to some utilities (bugs spotted by David Volgyes by using cppcheck.
    • +
    + + + + diff --git a/documentation/release_2.3.htm b/documentation/release_2.3.htm new file mode 100644 index 0000000000..ae019a2713 --- /dev/null +++ b/documentation/release_2.3.htm @@ -0,0 +1,137 @@ + + + + Summary of changes in STIR release 2.3 (dated 4/05/2013) + + + +

    Summary of changes in STIR release 2.3 (dated 04/05/2013)

    + +

    This update was mostly prepared by Kris Thielemans (Algorithms and Software Consulting Ltd). The FORE implementation was developed over many years with main authors +Matthias Egger, Claire Labbé, Oliver Nix, Kris Thielemans. +The SimSET updates were checked by Robert Harrison.

    + + +
      + +

      Summary for end users (also to be read by developers)

      +

      Important bug fixes

      +
        +
      • The routines to handle SimSET data did have some problems in the previous release, +but should work now. Check SimSET/README.txt for some information. +
          +
        • run_SimSET.sh had a few crucial lines commented out.
        • +
        • corrected the case where scatter_parameter is 4|5|9|10 in conv_SimSET_projdata_to_STIR.sh
        • +
        +
      • +
      + +

      New functionality

      +
        +
      • Addition of the FORE algorithm.
      • +
      • Dynamic projection data can now be read from Interfile data. This means that the parametric +image estimation routines need less ECAT7 support (still required for images at present). +
      • +
      • Expanded the interface for using STIR from Python. This works now but +needs documentation. There's functions +to copy STIR arrays to numpy arrays, indexing STIR arrays with tuples, etc. To use this, you will need to get a recent version of SWIG and enable +the BUILD_SWIG_PYTHON option when using CMake.
      • +
      • Preliminary support for using STIR from Octave. However, this is +partially broken due to problems in SWIG for octave.
      • +
      + +

      Changed functionality

      +
        +
      • ProjMatrixByBinFromFile now assumes that if an LOR isn't found in the file, it's empty (in previous STIR versions, we called error())
      • +
      + +

      Build system

      +
        +
      • +Using CMake is now recommended (see the wiki). Some options +such as shared libraries and SWIG support can only be enabled when using CMake. +
      • +
      • For the normal Makefiles, we now use the -Ofast option for gcc +if it supports it. +
      • +
      + +

      Known problems

      +
        +
      • This release has a memory allocation problem when processing list mode data. Depending on your system, compiler, +bad luck, you might get wrong results. If you use list mode, please upgrade to STIR 2.4.
      • +
      • This release is known to fail when both MPI and shared libraries are enabled. You will see linking errors in all non_MPI executables.
      • +
      • On Windows, using shared libraries fails. We need to sort out dependencies between libraries to fix this.
      • +
      • The recon_test_pack routines fail with the MPI version. See the mailing list for a work-around.
      • +
      • ECAT6 is no longer supported
      • +
      • The interpolating back-projector still gives problems in the centre of the images +on some architectures/compiler/optimisation settings. We recommend to use the ray-tracing +matrix (with additional rays) instead.
      • +
      • When using Visual Studio (Express) with the provided solution files, there is a linking problem for some +utilities. It is recommended to use the new CMake files for building instead (see the wiki).
      • +
      • When using GRAPHICS=X (i.e. on Unix/Linux/MacOSX) the window displaying +the bitmaps is sometimes empty. This might depend on your X server settings. +This affects manip_image, manip_projdata and display_projdata. +We have currently no work-around (aside from using GRAPHICS=PGM or +stir_write_pgm). +
      • +
      + + +

      Minor bug fixes

      +
        +
      • This update contains a few fixes for Visual C++ 2010 and 2012, e.g. in Debug mode and on 64bit systems, Intel C++ (adapt the makefile to use xiar when using -fast).
      • +
      • a few changes to the CMakeLists.txt files for cmake clarifying dependencies +between libraries. This makes shared libraries better suppported, but there are still circular dependencies. This doesn't seem to create trouble on most systems, +but makes shared libraries fail on some (e.g. msys on windows).
      • +
      • test_Scanner.cxx: +declare ecat_model function in case it isn't in ecat_model.h +
      • +
      + +

      Documentation changes

      +
        +
      • The Wiki expands more and more, so use it in addition to the provided PDFs. +
      • +
      + +

      recon_test_pack changes

      +
        +
      • updated version number and added some clarification to the README.txt
      • +
      • removed the ECAT6 tests
      • +
      + +

      Other changes to tests

      +

      None

      + +

      What's new for developers (aside from what should be obvious +from the above):

      + +

      Major bugs fixed

      +

      None

      + +

      New functionality

      +
        +
      • BasicCoordinate, VectorWithOffset and Array now have new members at() (checking for out-of-range index access) and empty() (like std::vector). +
      • +
      • error() and warning() now support using boost::format. The old (unsafe) printf-like syntax will be removed in +a future version. +
      + +

      Other code changes

      +
        +
      • removed _scanner_sptr member of MultipleProjData, +added a few set_*() functions.
      • +
      • error and warning have now an additional version using only 1 argument that writes to stream, i.e. like info()
      • +
      • PoissonLogLikelihoodWithLinearModelForMean: + added get/set pair for (sub)sensitivity_filename(s)
      • +
      • OSMAPOSLReconstruction: + overloading IterativeReconstruction::get_objective_function() + with a return-type specifying it'll always be a Poisson log likelihood.
      • +
      • no longer have using std::vector and/or using std::ios etc in some .h files
      • +
      • A few minor changes for SWIG compatibility
      • +
      + + + + diff --git a/documentation/release_2.4.htm b/documentation/release_2.4.htm new file mode 100644 index 0000000000..16f6617b2a --- /dev/null +++ b/documentation/release_2.4.htm @@ -0,0 +1,155 @@ + + + + Summary of changes in STIR release 2.4 (dated 31/07/2013) + + + +

      Summary of changes in STIR release 2.4 (dated 31/07/2013)

      + +

      This release was mostly prepared by Charalampos Tsoumpas (King's College London). +Special thanks to Irene Polycarpou for her rigorous validation and the +invaluable help while debugging the code. Minor changes and bug fixes by Kris Thielemans +(Algorithms and Software Consulting Ltd, University College London).

      + + +
        + +

        Summary for end users (also to be read by developers)

        +

        Important bug fixes

        +
          +
        • corrected BUG in memory allocation in InputStreamWithRecords (introduced in STIR 2.3). +This potentially affected all list mode handling. +
        • +
        + +

        New functionality

        +
          +
        • Addition of motion utilities and an objective function for reconstructing a single motion corrected +image from gated projection data.
        • +
        • Conversion routines for reading/writing GIPL images.
        • +
        • A conversion routine to create Interfile data from raw GATE projection data output.
        • +
        • 4 new scanners: Siemens mMR, nanoPET (Mediso), HYPER (HyperImage FP7 project), PANDA (KCL internal).
        • +
        • Added "-t tolerance" option to compare_projdata.
        • +
        • Python support: +
            +
          • Added input files for python examples.
          • +
          • Added test scripts using py.test (these need to be run manually at present)
          • +
          • Added ByteOrder, NumericType, Segment, TimedObject, + InterfileOutputFileFormat, ECAT7OutputFileFormat (applicable to all swig interfaces)
          • +
          • Added get_num_dimensions() and shape() to Array
          • +
          +
        • +
        + +

        Changed functionality

        +
          +
        • PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData now defaults to using all segments (to be consistent with other +objective functions)
        • +
        + +

        Build system

        +
          +
        • +Using CMake is now recommended (see the wiki). Some options +such as shared libraries and SWIG support can only be enabled when using CMake. Hand-crafted project files +for Visual Studio are no longer distributed. +
        • +
        • use CMake FOLDER properties to group projects in + Visual Studio (and XCode etc?), needs CMake 2.8.3
        • +
        • disable export of cmake settings as it's no longer supported by CMake
        • +
        + + +

        Known problems

        +
          +
        • On Windows, using shared libraries fails. We need to sort out dependencies between libraries to fix this.
        • +
        • This release is known to fail when both MPI and shared libraries are enabled. You will see linking errors in all non_MPI executables.
        • +
        • The recon_test_pack routines fail with the MPI version. A work-around is to prefix the reconstruction executables with mpirun -np 4 or so).
        • +
        • The MPI version of OSMAPOSL and OSSPS cannot compute the value of the objective function. Therefore, setting the +report objective function values interval keyword to 1 will cause a crash.
        • +
        • ECAT6 is no longer supported
        • +
        • The interpolating back-projector still gives problems in the centre of the images +on some architectures/compiler/optimisation settings. We recommend to use the ray-tracing +matrix (with additional rays) instead.
        • +
        • When using GRAPHICS=X (i.e. on Unix/Linux/MacOSX) the window displaying +the bitmaps is sometimes empty. This might depend on your X server settings. +This affects manip_image, manip_projdata and display_projdata. +We have currently no work-around (aside from using GRAPHICS=PGM or +stir_write_pgm). +
        • +
        + + +

        Minor bug fixes

        +
          +
        • fixed possible race-condition in OPENMP version of FBP2D (but it's still too slow to be practical)
        • +
        • list_lm_events: reset output-format to decimal after printing a gating event (previously all + remaining output was in hex); also added newline after printing an unknown event.
        • +
        • fix a (nearly irrelevant) bug in reading a file signature that lead to uninitialised memory being + returned if the file size was shorter than 1024 bytes (but that doesn't really happen for normal files).
        • +
        • A few error messages in ECAT IO would actually crash as opposed to writing a decent message.
        • +
        • A few changes to the CMakeLists.txt files for cmake clarifying dependencies +between libraries. This makes shared libraries better suppported, but there are still circular dependencies. This doesn't seem to create trouble on most systems, +but makes shared libraries fail on some (e.g. msys on windows).
        • + +
        + +

        Documentation changes

        +
          +
        • Added documentation on new features, more on using CMake, etc
        • +
        • The Wiki expands more and more, so use it in addition to the provided PDFs. +
        • +
        + +

        recon_test_pack changes

        +
          +
        • updated version number and added some clarification to the README.txt
        • +
        • added a test script for the motion version
        • +
        • added a test script for the scatter simulation
        • +
        • relaxed test for OSSPS in run_tests.sh to avoid problem of outer rim voxels on cygwin (and others?)
        • +
        • small updates to test scrips, giving early exit if a STIR executable not found and feedback which STIR executable is being used
        • +
        + +

        Other changes to tests

        +
          +
        • added a test for warping images
        • +
        • changed IO tests in test_Array to accomodate for gcc 4.8.1 numerical precision (flagged and tested by Justin Mikell)
        • +
        + +

        What's new for developers (aside from what should be obvious +from the above):

        + +

        Major bugs fixed

        +
          +
        • corrected BUG in memory allocation in InputStreamWithRecords (introduced in STIR 2.3). +This potentially affected all list mode handling. +
        • +
        + +

        New functionality

        +
          +
        • Lots of warping/motion stuff!
        • +
        + +

        Other code changes

        +
          +
        • modifications to the scatter estimation code changes to be able to run multiple scatter + simulation from the same ScatterEstimation object (possibly re-using the + cache). Results are identical.
        • +
        • removed a few using std::cout (and other items in the std namespace) from some include files +as this created problems on some compilers. This might affect your code if it relied on these using statements. +
        • +
        • replaced a few output lines to std::cerr with calls to stir::info (still many more to do).
        • +
        + +

        Build system

        +
          +
        • changes to test-macros for CMake to allow linking without the registries (such as + IO_registries), speeding up the linking process of some tests.
        • +
        • fixes for MPI. The CMake files might now work on more MPI platforms.
        • +
        + + + + diff --git a/documentation/release_2000_07_19.htm b/documentation/release_2000_07_19.htm new file mode 100644 index 0000000000..59c3bc895b --- /dev/null +++ b/documentation/release_2000_07_19.htm @@ -0,0 +1,45 @@ + + + + Summary of changes in PARAPET release 0.91 (dated 19/07/2000) + + + +

        Summary of changes in PARAPET release 0.91 (dated 19/07/2000)

        + +

        General changes:

        + +
          +
        • added conversion to ecat6 and handle ecat7 +
        • software is now tested on Linux (on Pentium) with gcc 2.95.2 (this only needed some changes to PPhead/Makefile_common) +
        • Interfile parser follows now the 3.3 standard, and some of the proposed extensions there-in on vectored keys (Note: this is the parser only, NOT the keywords). +
        • corrected some problems with Makefiles +
        • added the extract_segments utility +
        + +

        OSEM related changes:

        + +
          +
        • corrected a bug that caused problems with parsing .par files (for instance, the interiteration filtering setting was ignored on some architectures) +
        • thresholding after filter operations (to obtain positive image values) is changed to make it insensitive to spurious peaks in the image +
        + +

        Other:

        + +
          +
        • fixed a bug that made the truncate_end_planes in manip_image do nothing. +
        • the Absolute Difference operation in manip_image (MATH MODE option +2) is now applied to all voxels. +
        • compare_image uses a slightly higher threshold now +
        • made utilities/do_linear_regression compile +
        • added PPhead/test/input/test_linear_regression.in to the archives. (Needed for make run_tests) +
        + + +
        + + +Last modified: Wed Jul 19 15:54:43 BST 2000 + + + diff --git a/documentation/release_2001_01_12.htm b/documentation/release_2001_01_12.htm new file mode 100644 index 0000000000..f9f6e20f50 --- /dev/null +++ b/documentation/release_2001_01_12.htm @@ -0,0 +1,266 @@ + + + + Summary of changes in PARAPET release 0.92 (dated 12/01/2001) + + + +

        Summary of changes in PARAPET release 0.92 (dated 12/01/2001)

        + +

        Summary for endusers (also to be read by developers)

        + + +in/output of any program is NOT affected, except the ECAT* utilities. If you +don't use ECAT data, and you are only an enduser, there is no reason to +upgrade (if you installed the patches to 0.91). +

        +You do NOT have to change the recon_test_pack. + + +

        Changes to files that affect the user

        + +

        utilities/convecat6_if

        +
          +
        • added support for attenuation sinograms +
        • added support for data types different from 16 bit ints. +
        • added a bit more diagnostics for file IO errors +
        + +

        utilities/ifheaders_for_ecat7

        +
          +
        • corrected BUG by swapping segment order +
        • added support for attenuation sinograms +
        • check all 'matrices' in file instead of stopping at the first +missing 'matrix' (useful if you have only frame 13 in the file). +
        • changed output filenames to include the original extension to prevent +conflicts with .S and .A files. +e.g. "ifheaders_for_ecat7 bla.S" will result in files bla_S_f1g1b0d0.hs +etc. +
        + +

        utilities/manip_image.cxx

        +
          +
        • added option for maximum on colour scale for display() +
        + +

        Summary for developers

        + +
          +
        • various bug fixes in the buildblock files +
        • some more functionality for the basic projection data classes +
        • addition of *ProjMatrixByBin* stuff. This allows to compute, manipulate, +use projection matrices, such that you have access to individual elements. +You would need this for ART or similar algorithms. The 'ByBin' suffix says +that this stores the matrix elements 'row-wise' (i.e. all non-zero voxels +for one bin). Basic caching is provided. At the moment, there is only 1 +non-abstract derived class: ProjMatrixByBinUsingRayTracing, which computes +Length of +Intersection for voxels (on a Cartesian grid). The results of using this +class to forward project data are nearly identical to what you get using the +already existing ForwardProjectorByBinUsingRayTracing. (Some rounding error +is unavoidable). Currently, timing between these 2 forward projectors is +very similar, but I'm afraid this is because while finalising +ProjMatrixByBinUsingRayTracing, I noticed an extra optimisation which +didn't make its way yet into ForwardProjectorByBinUsingRayTracing. +
        + + +

        Details

        +

        Changed files

        + +(changed files are all in buildblock/, recon_buildblock/, display/, +utilities/, include/ or include/recon_buildblock/) +
        +buildblock/Scanner.cxx:
        +- BUG corrected: ordered parameters correctly for Advance
        +
        +include/SegmentBySinogram.inl:
        +- corrected BUG in get_max_tangential_pos_num()
        +
        +buildblock/SegmentBySinogram.cxx:
        +- corrected BUG in grow()
        +- enabled growing of axial_pos_num as well
        +
        +buildblock/SegmentByView.cxx:
        +- enabled growing of axial_pos_num as well
        +
        +buildblock/Viewgram.cxx
        +- enabled growing of axial_pos_num as well
        +
        +include/RelatedViewgrams.*, buildblock/RelatedViewgrams.cxx:
        +- added operator*=(float) and /=, +=, -=
        +- added grow()
        +- added find_min(), find_max(), fill()
        +- removed #if 0 #endif stuff
        +
        +include/Bin.*
        +- added operator==
        +
        +include/ProjDataInfo*, buildblock/ProjDataInfo*.cxx:
        +- in get_tantheta() et al, replaced 4 args segment_num,view_num,ax_pos_num,
        +tang_pos_num with single argument of type const Bin&
        +- new functions ProjDataInfo::get_sampling_in_s(Bin&),
        +get_sampling_in_t(Bin&).
        +- new functions set_max_axial_pos_num() and set_min_axial_pos_num()
        +- more documentation
        +- moved some stuff from ProjDataInfo.inl to .cxx
        +- moved get_tantheta from ProjDataInfoCylindricalArcCorr to
        +ProjDataInfoCylindrical, and corrected BUG (was only ok
        +for non-spanned data)
        +- moved ProjDataInfoCylindrical constructors to new file
        +ProjDataInfoCylindrical.cxx
        +
        +
        +include/DataSymmetriesForViewSegmentNumbers.*
        +- removed proj_data_info arg from constructor, and the private member
        +- removed SymmetryOperation stuff
        +- BUG corrected in default implementation for
        +DataSymmetriesForViewSegmentNumbers::find_basic_view_segment_numbers
        +
        +include/display.h, display/display_array.cxx:
        +- added display(RelatedViewgrams...);
        +
        +include/stream.h:
        +- BUG correction: handle case of 0 length appropriately now
        +
        +buildblock/VoxelsOnCartesianGrid.cxx:
        +- use new conventions for get_s()
        +
        +buildblock/Makefile:
        +- removed   DataSymmetriesForViewSegmentNumbers_PET_CartesianGrid.cxx
        +- added   ProjDataInfoCylindrical.cxx
        +
        +
        +include/DiscretisedDensity.h, buildblock/DiscretisedDensity.cxx:
        +- changed the return type of DiscretisedDensity::read_from_file from a
        +shared_ptr to an ordinary pointer.
        +The reason for this change is that you cannot get rid of the shared_ptr
        +otherwise (without the data actually being deleted). Ideally, it should
        +return an auto_ptr though.
        +
        +include/recon_buildblock/BackProjectorByBinUsingInterpolation.h and
        +recon_buildblock/BackProjectorByBinUsingInterpolation.cxx:
        +- use less include files in .h (decreases dependency)
        +- moved implementation of JacobianForIntBP constructor to .cxx
        +- changed type of symmetries_ptr private member
        +
        +include/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h and
        +recon_buildblock/ForwardProjectorByBinUsingRayTracing.cxx
        +- use less include files in .h (decreases dependency)
        +- changed type of symmetries_ptr private member
        +
        +include/recon_buildblock/SymmetryOperation.h
        +- moved from buildblock
        +- added ProjMatrixElemsForOneBin stuff
        +- more doc
        +
        +include/recon_buildblock/SymmetryOperations_PET_CartesianGrid.h, .inl
        +- moved from buildblock
        +- added ProjMatrixElemsForOneBin stuff
        +- more doc
        +
        +recon_buildblock/Makefile:
        +added
        +DataSymmetriesForBins.cxx \
        +DataSymmetriesForBins_PET_CartesianGrid.cxx \
        +SymmetryOperation.cxx \
        +SymmetryOperations_PET_CartesianGrid.cxx \
        +ProjMatrixElemsForOneBin.cxx \
        +ProjMatrixByBin.cxx \
        +ProjMatrixByBinUsingRayTracing.cxx \
        +ForwardProjectorByBinUsingProjMatrixByBin.cxx \
        +BackProjectorByBinUsingProjMatrixByBin.cxx \
        +RayTraceVoxelsOnCartesianGrid.cxx
        +
        +
        +test/test_proj_data_info.cxx:
        +- used new convention for ProjDataInfo::get_s() et al
        +
        +utilities/manip_image.cxx:
        +- added option for maximum on colour scale for display()
        +
        +utilities/extract_segments.cxx:
        +- adjusted comments and include files
        +
        +utilities/convecat6_if.cxx:
        +- added support for attenuation files
        +
        +utilities/cti_utils.cxx:
        +- added support for attenuation files
        +- added support for data types different from 16 bit ints.
        +- added a bit more diagonistics for file IO errors
        +
        +include/CTI/cti_utils.h:
        +- added cti_read_attn_subheader, get_attnheaders
        +- changed behaviour of get_scandata to allow different data types
        +- added file_data_to_host()
        +
        +utilities/Tomo_cti.cxx:
        +- corrected 'fall through' bug in a switch statement
        +(find_scanner_from_mainheader)
        +- corrected BUG in allocation for cti data
        +- in ECAT6_to_VoxelsOnCartesianGrid( use cti_lookup to avoid mainheader.dmp)
        +- added support for attenuation files
        +- added support for data types different from 16 bit ints.
        +
        +include/Tomo_cti.h:
        +- removed read_sinogram   (made static in .cxx file)
        +
        +utilities/ifheaders_for_ecat7.cxx:
        +- corrected BUG by swapping segment order
        +- added support for attenuation sinograms
        +- check all 'matrices' in file instead of stopping at the first
        +missing 'matrix' (useful if you have only frame 13 in the file).
        +- changed output filenames to include the original extension to prevent
        +conflicts with .S and .A files.
        +e.g. "ifheaders_for_ecat7 bla.S" will result in files bla_S_f1g1b0d0.hs
        +etc.
        +
        +
        + +

        moved files

        + +moved include/SymmetryOperation* to include/recon_buildblock
        +moved buildblock/SymmetryOperation* to recon_buildblock
        +removed DataSymmetriesForViewSegmentNumbers_PET_CartesianGrid.* + (made obsolete by +recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h) + +

        new files

        + +

        include/recon_buildblock/

        +DataSymmetriesForBins.h, .inl
        +DataSymmetriesForBins_PET_CartesianGrid.h, .inl
        +BackProjectorByBinUsingProjMatrixByBin.h
        +ForwardProjectorByBinUsingProjMatrixByBin.h
        +ProjMatrixByBin.h, .inl
        +ProjMatrixByBinUsingRayTracing.h
        +ProjMatrixElemsForOneBin..h, .inl
        +ProjMatrixElemsForOneBinValue.h, .inl
        +RayTraceVoxelsOnCartesianGrid.h
        +RelatedBins.h,.inl
        + +

        buildblock

        +buildblock/ProjDataInfoCylindrical.cxx + +

        recon_buildblock/

        +DataSymmetriesForBins.cxx
        +DataSymmetriesForBins_PET_CartesianGrid.cxx
        +BackProjectorByBinUsingProjMatrixByBin.cxx
        +ForwardProjectorByBinUsingProjMatrixByBin.cxx
        +ProjMatrixByBin.cxx
        +ProjMatrixByBinUsingRayTracing.cxx
        +ProjMatrixElemsForOneBin.cxx
        +RayTraceVoxelsOnCartesianGrid.cxx
        +SymmetryOperation.cxx
        +SymmetryOperations_PET_CartesianGrid.cxx + + + +
        + + +Last modified: Fri Jan 12 12:10:02 GMT 2001 + + + diff --git a/documentation/release_2001_12_20.htm b/documentation/release_2001_12_20.htm new file mode 100644 index 0000000000..a2a5a36d24 --- /dev/null +++ b/documentation/release_2001_12_20.htm @@ -0,0 +1,349 @@ + + + + Summary of changes in STIR release 1.0 (dated 20/12/2001) + + + +

        Summary of changes in STIR release 1.0 (dated 20/12/2001)

        + +

        Summary for endusers (also to be read by developers)

        + +

        More functionality

        +
          +
        • allow arbitrary x,y sizes of reconstructed images
        • +
        • allow zooming (changing x,y voxel size)
        • +
        • sensitivity allows input of normalisation factors (as a projection data + file), also it now assumes that attenuation images are given in units cm^-1 + (and writes out a message accordingly). (Units used to be pixel_units^-1). +
        • filtering is now based on the ImageProcessor hierarchy. At the moment, + there are 2 filters supplied: Metz and Median. This changed the format of + the .par file as you can select at run time which filter you want.
        • +
        • You can now select at run time which projectors, filters, priors etc you want. + (default choice is to use the same projectors as the previous release).
        • +
        • take arc-correction into account. Some projectors (the ray racing ones) + can handle non-arccorrected data as well.
        • +
        • OSEMMain is renamed to OSMAPOSL as it now can now do priors, based on the + GeneralisedPrior hierarchy. At the moment, only 1 prior is supplied: + FilterRootPrior. This prior takes a ImageProcessor object as input, + and uses it in the same way as the Median Root Prior (from + Alenius S. et al).
        • +
        • compare_image has now an option to ignore the(radial) rim of the images
        • +
        • conv_to_ecat6 can now write multiples files a single ECAT 6 file. + The data will be assigned a frame number in the + order that they occur on the command line.
        • +
        • new utility correct_projdata.cxx to normalise/attenuation (un)correct + projection data.
        • +
        + +

        Incompatibilities

        +
          +
        • change of .par file format to account for user selectable filters etc.
        • +
        • change of reconstructions when there are non-zero projection data at + the edge of the FOV. This is because we changed our strategy of + handling the rim. We used to set edge of FOV to 0 (both in + projection data and image). However, this was really only necessary + when dual-projector EM is used. Now we do not truncate anymore + (except that the interpolating backprojector). + + When not correcting (or precorrecting) scatter and/or randoms, + you can expect changes of upto 1% in the middle of the FOV for + very noisy data. Note that the reason + that the reconstruction is sensitive to edge stuff is because scatter + (or random) tails are not properly taken into account.
        • +
        + +

        Changes in the build process

        +
          +
        • usage of WORKSPACE (while doing make) is essentially obsolete, + you can now put the distribution anywhere, and a simple 'make' will + compile everything properly.
        • +
        • moved PPhead/Makefile_common.local to PPhead/local/Makefile_common
        • +
        + +

        Bug fixes

        +
          +
        • some fixes mostly in the IO routines. Nothing that would have + influenced your results we think.
        • +
        +

        Summary for developers

        +
          +
        • registry functionality to allow easy why to write your classes + such that user's can select appropriate version at run-time. +
        • introduced new hierarchies: ImageProcessor, GeneralisedPrior and + BinNormalisation
        • +
        • moved all include files to include/stir. This is for added protection + against filename conflicts when using libraries outside of STIR.
        • +
        • enabled easier extension by the user by having links to local/Makefile*
        • +
        • updated boost/* to boost 1.21.1
        • +
        • various small fixes to files such that gcc 3.0 compiles (and links) this + without problems
        • +
        • based ReconstructionParameters hierarchy on ParsingObject, instead of +KeyParser
        • +
        • some bug fixes and extended functionality
        • +
        + +

        Details

        +There are more changes than listed here. For example all the projector files +have changed as well according to the summary above. + +

        Changed files

        + +
        +include/Tomography_common.h:
        +- moved stir/common.h (after moving the definition of Succeeded to stir/Succeeded.h).
        +
        +
        +include/stir/common.h:
        +- this was Tomography_common.h, but it doesn't declare class Succeeded anymore
        +- updated comments
        +- do not define std::min,max here anymore for VC, is it is now done in boost/config.hpp
        +
        +
        +include/stir/Array.h:
        +- enabled ARRAY_FULL for full iterators
        +
        +include/stir/ArrayFunction.h:
        +- added  in_place_apply_array_functions_on_each_index,
        +  in_place_apply_array_function_on_1st_index,
        +  apply_array_functions_on_each_index and
        +  apply_array_function_on_1st_index
        +- added some documentation
        +
        +buildblock/InterfileHeader.cxx:
        +- BUG removed: corrected default bin size
        +
        +buildblock/interfile.cxx:
        +- in write_basic_interfile_PDFS_header, use data from proj_data_info instead 
        +  of scanner for the following 3 keywords:
        +  ring_diameter, distance between rings, bin size
        +- write arc-correction information for projection data
        +- write*interfile* with a single filename now handles filenames ending on 
        +  .hs or .hv. They also attempt tohandle paths gracefully
        +- write_basic_interfile_PDFS_header now also writes the scale factor
        +
        +buildblock/InterfileHeader.cxx:
        +- read arc-correction information for projection data
        +
        +
        +include/stir/interfile.h, include/stir/ProjData.h,
        +buildblock/interfile.cxx, buildblock/ProjData.cxx:
        +added openmode parameter to the read_ functions to allow opening it in read-write
        +
        +include/stir/utilities.h,.inl, buildblock/utilities.cxx:
        +- in ask* functions, got rid of template in CHAR_PTR, and replaced it by 
        +  a const string&. This works always, and removed the needs for templates.
        +- moved ask() to .cxx
        +- added ask_string()
        +- in .cxx, removed some obsolete junk (which was between #if 0... #endif)
        +
        +
        +include/stir/RelatedViewgrams.h, buildblock/RelatedViewgrams.cxx:
        +- added numerical 4 operators *=, /=, +=, -= with another RelatedViewgrams object
        +- added get_symmetries_ptr
        +- added get_basic_view_segment_num
        +
        +
        +include/stir/recon_array_functions.h, buildblock/recon_array_functions.cxx:
        +- renamed truncate_min_to_small_positive_value to 
        +threshold_min_to_small_positive_value
        +
        +include/stir/zoom.h, buildblock/zoom.cxx:
        +- enable zooming of (Related)Viewgram(s)
        +
        +
        +include/stir/KeyParser.h, buildblock/KeyParser.cxx:
        +- added PARSINGOBJECT and SHARED_PARSINGOBJECT type to enable recursive parsing
        +- added BOOL,FLOAT types
        +- added public member add_*key() which are much easier to use than 
        +the protected add_key, and allow KeyParser to be used as a member instead
        +of a parent of a class.
        +- added ask_parameters() and parameter_info() members. These get info from the 
        +keymap to return the relevant results.  TODO doesn't work yet with vectored keys.
        +- changed type of keymap from std::map to std::list, such that above new 
        +functions use the order in which keys are defined
        +- added private functions add_in_keymap() and  find_in_keymap() to make use of 
        +map or list transparent.
        +
        +buildblock/recon_array_functions.cxx:
        +- changed handling of singularities in divide_and_truncate for viewgrams. 
        +We now put them to a maximum quotient, while they used to be put to 0
        +- adjusted accumulate_loglikelihood to gave same result as divide_and_truncate
        +
        +
        +VoxelsOnCartesianGrid.cxx:
        +- only a single constructor with ProjDataInfo which allows arbitrary x,y,z sizes (with appropriate default. It also works with arbitrary ProjDataInfo (not only ArcCorr)
        +
        +VoxelsOnCartesianGrid.h:
        +- changed constructors
        +- adjusted doxygen
        +
        +
        +recon_buildblock/Reconstruction.cxx:
        +- removed obsolete keyword 'output prefix', use 'output filename prefix' instead
        +- disabled offset keywords as the projectors can't do it yet
        +- changed 'output image size' keyword to 'xy output image size (in pixels)'
        +
        +recon_buildblock/IterativeReconstruction.cxx:
        +- removed warning on zoom et al, they are now in the projectors (if necessary)
        +- moved stuff from LogLikBasedReconstruction::end_of_iteration_processing here
        +- use ImageProcessor
        +
        +
        +include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h, .inl
        +- added inline implementations for get_num_planes_per_axial_pos
        +  and get_axial_pos_to_z_offset
        +
        +include/stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h,
        +recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.cxx:
        +- made constructor argument into a reference
        +- changed asserts to run-time check to allow arbitrary min-max tang_pos ranges
        +
        +include/stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h,
        +recon_buildblock/BackProjectorByBinUsingInterpolation.cxx,
        +recon_buildblock/BackProjectorByBinUsingInterpolation_3DCho.cxx:
        +- can now handle odd-sized images or projection data
        +- can now handle arbitrary min,max_tangential_pos_num
        +- hopefully can handle z_offset and z_size, but needs testing
        +- can now handle zoom (which it does by calling zoom_viewgrams first)
        +- changed type of symmetries_ptr to enable use of more methods
        +- has now built-in rim-truncation
        +- adjusted doxygen to new functionality
        +
        +recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.cxx:
        +- added registry stuff
        +- changed mechanism that checked if a lor was in the cache. Instead of a list
        +	use a vector. Speeds it up quite a lot.
        +
        +include/stir/LogLikBased/common.h:
        +- set rim_truncations to 0
        +
        +iterative/LogLik_buildblock/common.cxx:
        +- in distributable_compute_sensitivity, divide with the multiplicative_correction 
        +  argument instead of multiplying. This makes it more suitable for passing
        +  normalisation factors
        +- some clean-up
        +
        +iterative/LogLik_buildblock/LogLikelihoodBasedReconstruction.cxx:
        +- added check that sensitivity and target_image are the same size etc.
        +
        +iterative/LogLik_buildblock/LogLik*.cxx:
        +include/stir/LogLikBased/LogLikelihoodBasedAlgorithmParameters.h:
        +- user-selectable projection operators
        +- moved LogLikBasedReconstruction::end_of_iteration_processing to IterativeReconstruction
        +
        +
        +
        +iterative/OSMAPOSL/OSMAPOSLParameters.cxx, include/stir/OSMAPOSL/OSMAPOSLParameters.h
        +- added min/max relative change parameters
        +- added  write_update_image parameter
        +- added GeneralisedPrior stuff
        +- use ImageProcessor
        +
        +iterative/OSMAPOSL/OSMAPOSLReconstruction.cxx
        +- added min/max relative change functionality
        +- added  write_update_image  functionality
        +- added GeneralisedPrior stuff
        +- use ImageProcessor
        +
        +iterative/sensitivity/sensitivity.cxx:
        +- parse OSMAPOSL type .par file to get lots of info. This makes sure that
        +  the info used when running sensitivity and OSMAPOSL is consistent.
        +- added functionality to input normalisation factors
        +- check user input "0" and "1" with full strings instead of first character only
        +- rescale attenuation image from cm^-1 to something suitable for the projectors
        +
        +
        +utilities/postfilter.cxx:
        +- use ImageProcessor
        +
        +
        +utilities/cti_utils.cxx:
        +- added a (char *) in a call to swab() with a long * (otherwise crashes on HPUX)
        +
        +utilities/conv_to_ecat6.cxx:
        +- conv_to_ecat6 can now write multiples files  a single ECAT 6 file.
        +  The data will be assigned a frame number in the 
        +  order that they occur on the command line.
        +
        +include/stir/CTI/Tomo_cti.h, utilities/Tomo_cti.cxx:
        +- renamed into stir_cti.*
        +- new functions for writing multiples files  a single ECAT 6 file.
        +include/stir/recon_buildblock/ReconstructionParameters:
        +- based on ParsingObject, instead of KeyParser
        +- added members of z_offset and z_size, rename x_y_size member
        +
        +
        +display_projdata.cxx:
        +- allow changing of maximum in colour scale
        +
        +compare_image:
        +- added option for rim_truncation
        +
        +
        + + + +

        new files

        +(probably incomplete) list of new files. + +

        include files

        + +
          +
        • stir/ArrayFilter1DUsingConvolutionSymmetricKernel.h
        • +
        • stir/ArrayFunctionObject.h
        • +
        • stir/ArrayFunctionObject_1ArgumentImplementation.h
        • +
        • stir/ArrayFunctionObject_2ArgumentImplementation.h
        • +
        • stir/ChainedImageProcessor.h
        • +
        • stir/FactoryRegistry.h
        • +
        • stir/FactoryRegistry.inl
        • +
        • stir/ImageProcessor.h
        • +
        • stir/ImageProcessor.inl
        • +
        • stir/MedianArrayFilter3D.h
        • +
        • stir/MedianImageFilter3D.h
        • +
        • stir/Object.h
        • +
        • stir/ParsingObject.h
        • +
        • stir/ProjDataInfoCylindricalNoArcCorr.h
        • +
        • stir/ProjDataInfoCylindricalNoArcCorr.inl
        • +
        • stir/RegisteredObject.h
        • +
        • stir/RegisteredObject.inl
        • +
        • stir/RegisteredParsingObject.h
        • +
        • stir/RegisteredParsingObject.inl
        • +
        • stir/SeparableArrayFunctionObject.h
        • +
        • stir/SeparableCartesianMetzImageFilter.h
        • +
        • stir/SeparableMetzArrayFilter.h
        • +
        • stir/Succeeded.h
        • +
        • stir/ThresholdMinToSmallPositiveValueImageProcessor.h
        • +
        • stir/common.h (replaces Tomography_common.h)
        • +
        • stir/doxygengroups.h
        • +
        • stir/doxygenmain.h
        • +
        • stir/interfile_keyword_functions.h
        • +
        • stir/is_null_ptr.h
        • +
        • stir/round.h
        • +
        • stir/round.inl
        • +
        • stir/thresholding.h
        • +
        • stir/recon_buildblock/BinNormalisation.h
        • +
        • stir/recon_buildblock/GeneralisedPrior.h
        • +
        • stir/recon_buildblock/BinNormalisationFromProjData.h
        • +
        • stir/recon_buildblock/GeneralisedPrior.inl
        • +
        • stir/recon_buildblock/FilterRootPrior.h
        • +
        • stir/recon_buildblock/TrivialBinNormalisation.h
        • +
        • stir/recon_buildblock/ProjectorByBinPair.h
        • +
        • stir/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.h
        • +
        • stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h
        • +
        + +

        *.cxx

        +.cxx files corresponding to the new .h files above are not listed (yet?). + +
          +
        • utilities/correct_projdata.cxx
        • +
        • recon_buildblock/Reconstruction.cxx
        • +
        +
        + + +Last modified: Thu Dec 20 22:19:47 GMT 2001 + + + diff --git a/documentation/release_2003_06_26.htm b/documentation/release_2003_06_26.htm new file mode 100644 index 0000000000..22f5f6a4ad --- /dev/null +++ b/documentation/release_2003_06_26.htm @@ -0,0 +1,146 @@ + + + + Summary of changes in STIR release 1.1 (dated 26/06/2003) + + + +

        Summary of changes in STIR release 1.1 (dated 26/06/2003)

        + +

        Nearly all work on this update was by Kris Thielemans and +Sanida Mustafovic. Thanks to Sakari Alenius, Dylan Togane and Frédéric +Schoenahl, for helping to fix some bugs. + +

        Summary for endusers (also to be read by developers)

        + + +

        Bugs removed that affect users

        +
          +
        • Errors in parameters for some scanners such as the ECAT ART +and HR+ have been corrected (HRRT has been added provisionally).
        • + +
        • Removed some errors in +ifheaders_for_ecat7
        • + +
        • FilterRootPrior (i.e. the +generalisation of MRP) now has explicit checking for division by 0. This solves +a problem with NaNs occurring on Suns (and apparently very occasionally on +Intel processors as well).
        • + +
        • inter-iteration and inter-update filters are no longer +constructed twice by OSMAPOSL.
        • + +
        • Corrected a bug when parsing parameters from stdin. In +certain cases the default values were not taken into account when just pressing +Return.
        • + +
        • Changed max in the header of PGM files (output by +display) from 256 to 255 for GIMP compatibility [S Alenius]
        • +
        + +

        What’s new for users:

        +
          +
        • IO
        • +
            +
          • user-selectable output +formats for images (Interfile with floats or shorts, ECAT6 and ECAT7, but all +with only basic header info)
          • + +
          • better support for reading +ECAT6 and ECAT7 data, although still only single frame/gate/bed data. +
          • + +
          • more extensive support for +converting to ECAT6 data, and new conversion utility to ECAT7.
          • + +
          • a new utility to perform +‘corner-swapping’ of ECAT6 or ECAT7 sinogram data.
          • + +
          • Interfile reading of .hv file +now interprets the 'quantification units' keyword. Interfile writing of .ahv +now uses 'short float' for 4 byte floats, which is according to the Interfile +3.3 standard.
          • +
          + +
        • Extra/changed features relating to reconstructions
        • +
            +
          • a new filter class that takes an arbitrary separable +kernel in its parameter file
          • + +
          • the median filter should now filter edges as well
          • + +
          • the projection matrix ‘ray tracing’ has more options, +for example to use more than 1 LOR. It also has a slightly different treatment +of the voxels at the edge of the FOV. There will be slightly more voxels at the +edge now. The determination of the edge is now much less prone to numerical +errors.
            +WARNING This means that your reconstructions will not be +identical to the previous release if you use this projection matrix (although +of course any differences observed just show the need for regularisation).
          • + +
          • a new BinNormalisation class (keyword ‘chained’) that +allows passing both normalisation factors and attenuation correction factors.
          • +
          +
        • utilities
        • +
            +
          • new utilities: SSRB, poisson_noise, list_projdata_info, +stir_math (a command line utility for performing arithmetic on images or +sinograms).
          • + +
          • compare_projdata now has a check if data sizes and +other characteristics are identical
          • + +
          • manip_image can now display images in coronal and +sagital views as well
          • +
          +
        • other
        • +
            +
          • support for 24-bit display on X windows (and other X +visuals), although some work is needed there (see User’s Guide)
          • + +
          • documentation is updated and expanded. A glossary is +added.
          • +
          +
        +

        What’s new for developers (aside from what should be obvious +from the above):

        +
          +
        • documentation is updated and considerably expanded. The doxygen +documentation is much more structured. The developer’s overview has new +sections to make it easier to start using STIR as a library for your own work.
        • + +
        • a new hierarchy OutputFileFormat, and a new sub-library IO +(which includes now all Interfile, ECAT6 and ECAT7 routines). ECAT6 and ECAT7 +have now their own nested namespaces.
        • + +
        • ImageProcessor and ProjMatrixByBin hierarchies have been +slightly changed such that there is a ParsingObject at the start of the +hierarchy. This means that derived classes need to use the 3 parameter version +of RegisteredParsingObject, and that they have to call the set_defaults() et al +functions from the root of the hierarchy.
        • + +
        • a new include file stir/ByteOrderDefine.h that defines +preprocessor symbols when you need to know native byte order at compile time.
        • + +
        • modifications to ProjDataInfoCylindricalNoArccorr to speed up +some functions by caching. Added functions that to convert between Bins and a +new class DetectionPositionPair which in the future will replace explicit +ring,det_num pairs.
        • + +
        • more automatic tests
        • + +
        • changes to a lot of files to avoid warnings by gcc 3.1 or +later about the use of 'typename'. We should be conforming to ANSI C++ in that +respect now.
        • + +
        • Makefiles have been improved to sort out dependencies on .h +and .inl files.
        • + +
        • Upgraded boost files to version 1.30.0
        • +
        + + + + + + diff --git a/documentation/release_3.0.htm b/documentation/release_3.0.htm new file mode 100644 index 0000000000..586ba891a8 --- /dev/null +++ b/documentation/release_3.0.htm @@ -0,0 +1,288 @@ + + + + Summary of changes in STIR release 3.0 beta (dated 17/03/2014) + + + +

        Summary of changes in STIR release 3.0 beta (dated 17/03/2014)

        + +

        This version is almost backwards compatible with STIR 2.4 for the user (see below), but not for +developers. Required code changes are minor however and detailed below. +

        +

        This release is the first to handle SPECT data properly. +It contains code by Carlés Falcón (Biomedical Image Group (GIB), Universitat de Barcelona) +to create the system matrix for SPECT, integrated into STIR by Bertá Martí Fuster +(Institute for Bioengineering of Catalonia) and Kris Thielemans +(University College London, Algorithms and Software Consulting Ltd), together with some +additions and minor bug fixes by the same authors. +Additional testing by Charalampos Tsoumpas (KCL), Lefteris Livieratos (KCL) and +Kjell Erlandsson (UCL). This work was the result of a collaboration between University of Barcelona, +King's College London and University College London, and is reported in

        +
          +
        • + Berta Marti Fuster, Carles Falcon, Charalampos Tsoumpas, Lefteris Livieratos, Pablo Aguiar, Albert Cot, Domenec Ros and Kris Thielemans,
          + Integration of advanced 3D SPECT modeling into the open-source STIR framework,
          + Med. Phys. 40, 092502 (2013); + DOI 10.1118/1.4816676. +
        • +
        • + Berta Marti Fuster, Kjell Erlandsson, Carles Falcon, Charalampos Tsoumpas, Lefteris Livieratos, Domenec Ros, Kris Thielemans,
          + Evaluation of the novel 3D SPECT Modelling Algorithm in the STIR Reconstruction Framework: Simple vs. full attenuation correction,
          + proc. IEEE MIC 2013, Seoul, Korea +
        • +
        + + +

        In addition, this version contains updates by Kris Thielemans, UCL: changes to the IO code (currently enabled for projection data only) mean that +more information such as modality, patient position and timing is available and kept; improvements to the MPI code and tests, +some code-cleanup and improvements to the documentation. +

        + + + +

        Summary for end users (also to be read by developers)

        +

        Important bug fixes

        +
          +
        • fix PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin: it was processing all events up-to end-time as opposed ignoring +the events before start-time. +
        • +
        + +

        Changes that break backwards compatibility

        +
          +
        • The default projectors for the iterative reconstructions and correct_projdata have changed to +use the ray tracing projection matrix. This means that the forward and back projector (used for instance for the Poisson +log-likelihood) are now matched by default. If you did specify the projectors in your .par file, results will be identical +to STIR 2.x, but if you did not, you could add the following to the parameters of the log-likelihood +(if you want to get the same results as with STIR 2.x): +
          +projector pair type := Separate Projectors
          + projector pair using separate projectors parameters :=
          + forward projector type := Ray Tracing
          + forward projector using ray tracing parameters :=
          + end forward projector using ray tracing parameters := 
          + back projector type := Interpolation
          + back projector using interpolation parameters :=
          + end back projector using interpolation parameters := 
          +end projector pair using separate projectors parameters := 
          +
          +Alternatively, when building STIR, you could enable set the (advanced) CMake option +STIR_DEFAULT_PROJECTOR_AS_V2 to true (not recommended). +
        • +
        • For the Poisson log-likelihood, the default is now to use subset sensitivities (as opposed +to computing them as a fraction of the total sensitivity). This new default is more stable +for most algorithms and in particular for OSEM (or OS-OSL) where you see less of a subset-cycle +when using the correct subset sensitivity.
          +If you need to reproduce the default of STIR 2.x, you +can use the following setting +
          +use subset sensitivities:=0
          +
          +inside the parameters of the log likelihood. +
        • +
        + +

        New directory structure

        +
          +
        • Top-level directories are now src, scripts, examples, documentation, doximages. The samples directory is now a +sub-directory of examples, and the old examples is now +examples/src.
        • +
        • recon_test_pack and documentation are now distributed in +zip files that unpack as STIR/recon_test_pack and STIR/documentation.
        • +
        + +

        New functionality

        +
          +
        • new projection matrix for SPECT (called SPECT UB) supporting parallel hole collimators +with non-circular orbits, including attenuation modelling and 3D PSF
        • +
        • modifications to ProjMatrixByBin to allow larger matrices (currently needing uint64 support by the compiler) and clearing the cache
        • +
        • Interfile 3.3 IO for SPECT projection data.
        • +
        • reading and writing of images via ITK. As ITK has its own registry of +file formats, this extends STIR to support DICOM, Nifti (.nii), MetaIO (.mhdr), NRRD (.nhdr) etc. +To enable this, you need to have ITK installed when building STIR with CMake. +To write images in any of these file formats (DICOM not supported), you need +to set an explicit file format type and set it to ITK .
          +Warning: The translation of the geometry between STIR and ITK +is currently incomplete as STIR ignores patient orientation and direction information for images. +
        • +
        • New utilities forward_project and back_project for easier scripting of STIR +(fwdtest and bcktest now really only should be used for testing.) +
        • +
        • The list_projdata_info utilities has an extra option --exam to +list some exam information (patient position and timing). +
        • +
        • The distribution now includes sample scripts (in the examples/PET_simulation folder) +for simulating PET data, adding Poisson noise +and reconstructing the data.
        • +
        + +

        Changed functionality

        +
          +
        • Interfile reading/writing has changed to accomodate SPECT.
        • +
        • Projection data IO (both static and dynamic) now keeps more information such as modality, patient position and timing. This should mean for instance that convertions between different file +formats (e.g. conv_to_ecat7, stir_math -s) preserve more information. +
        • +
        • Interfile reading now exits with an error if a vectored key (such as matrix size) +is used before its size is given with the appropriate keyword (such as number of dimensions). In prior versions of STIR, a warning was issued, but a crash could happen afterwards. +
        • +
        • extract_segments now handles filenames with more than one dot. It also writes images with +voxel-size equal to the central-bin size of the sinogram (the view dimension is set to 1mm). +
        • +
        + +

        Build system

        +
          +
        • +Using CMake is now recommended (see the wiki). Some options +such as shared libraries and SWIG support can only be enabled when using CMake. Hand-crafted project files +for Visual Studio are no longer distributed. Hand-crafted Unix Makefiles are still there but +getting out-of date (no ITK for instance). +
        • +
        • Compilation when using CMake is speeded-up a bit as dependencies of the tests on STIR libraries are reduced.
        • +
        • You should now point cmake to the STIR main directory, not STIR/src. +
        + + +

        Known problems

        +
          +
        • SPECT related +
            +
          • Do NOT use current PET projectors on SPECT Data. You will have to choose the "SPECT UB" projector + in all cases (see the sample .par files).
          • +
          • The quantitative scale of reconstructed SPECT images is generally different than for PET reconstructions. + It probably also behaves differently than the PET projectors when using different voxel sizes.
          • +
          • Images are still written as PET Interfile (but this is ignored when reading).
          • +
          • At present, the collimator model varies the width of the PSF linearly with distance. This was + experimentally verified with some collimators (for normal distances to the collimator). + However, we need to add the possibility to use different models. +
          • +
          • list_projdata_info still reports SPECT data as if it's a PET scanner, but you can see + all necessary geometric info from it anyway.
          • +
          • create_projdata_template only works for PET scanners. For SPECT, you could take the + sample Interfile header, modify it to your needs (and create an empty file for the binary data pointed to + by the Interfile header). +
          • +
          +
        • +
        • Building with shared libraries is currently broken on many (all?) systems due to inter-dependencies between libraries.
        • +
        • This release is known to fail when both MPI and shared libraries are enabled. You will see linking errors in all non_MPI executables.
        • +
        • ECAT6 is no longer supported
        • +
        • The incremental interpolating back-projector still gives problems in the centre of the images +on some architectures/compiler/optimisation settings. We recommend to use the ray-tracing +matrix (with additional rays) instead.
        • +
        • When using GRAPHICS=X (i.e. on Unix/Linux/MacOSX) the window displaying +the bitmaps is sometimes empty. This might depend on your X server settings. +This affects manip_image, manip_projdata and display_projdata. +We have currently no work-around (aside from using GRAPHICS=PGM or +stir_write_pgm). +
        • +
        + +

        Major bug fixes

        +
          +
        • The MPI version of OSMAPOSL and OSSPS can now compute the value of the objective function. The corresponding test +now works.
        • +
        • The recon_test_pack routines now have an additional option such that they work with the MPI version.
        • +
        + +

        Minor bug fixes

        +
          +
        • small changes to allow compilation with the CLang compiler version 5.0 and with Visual Studio 2013.
        • +
        • removed an error when writing a usage message when converting SimSET projection data.
        • +
        • when ECAT6 image IO is enabled, now first check if it's an ECAT6 file (this avoids strange +crashes when the file turns out not be ECAT6 after all).
        • +
        + +

        Documentation changes

        +
          +
        • Added documentation on new features
        • +
        • Added documentation on the Interpolation matrix. Somehow +we had forgotten to include that before.
        • +
        • Added more examples of shapes to samples/generate_image.par. Also corrected doxygen of +EllipsoidalCylinder for initial/final angle parameters.
        • +
        • The Wiki expands more and more, so use it in addition to the provided PDFs. +
        • +
        + +

        recon_test_pack changes

        +
          +
        • updated version number and added some clarification to the README.txt
        • +
        • added a test script for the SPECT reconstructions
        • +
        + +

        Other changes to tests

        +
          +
        • added tests for the ITK IO routines
        • +
        + +

        What's new for developers (aside from what should be obvious +from the above):

        + +

        Major bugs fixed

        +
          +
        • see above
        • +
        + +

        New functionality

        +
          +
        • SPECT matrix modelling etc (see above)
        • +
        • expanded the class PatientPosition to allow left/right positioning, +unknown positioning, and using DICOM-style abbreviations such as HFS.
          +WARNING:The default constructor used to set the position to HFS +but now sets it to unknown. +
        • +
        • new classes ImagingModality and ExamInfo. The latter +contains the modality, PatientPosition and TimeFrameDefinitions. +
        • +
        • projection data (ProjData, DynamicProjData etc) +now have an ExamInfo member such that time frames etc can be passed along. +Their constructors have been modified accordingly (NOT backwards-compatible). +
        • +
        • list mode data (CListModeData) changes (NOT backwards-compatible): +
            +
          • also has an ExamInfo. This member needs to be set by every derived class.
          • +
          • removed CListModeData::read_from_file. Use read_from_file<CListModeData> instead.
          • +
          • removed CListModeData::get_scan_start_time_in_secs_since_1970(). Get it via its ExamInfo.
          • +
          +
        • +
        • using the above changes, LmToProjData properly writes time frame information to the projection data.
        • + +
        • changes to ProjDataInfoCylindrical to allow different radii for different views, useful for SPECT (or an elliptical PET scanner?)
        • +
        + +

        Other code changes

        +
          +
        • removed a few instances of using std::string etc from the include files +to avoid conflicts with global or non-std classes. This might mean you need to put these +statements in your .cxx files (or add std:: in various places of course).
        • +
        • add 3rd argument to BSplines templates to specify type of internal constants (with a good default). +This gets rid of a lot of conversion warnings with MSVC but could also potentially speed up calculations. +
        • +
        • Many minor changes to avoid conversion warnings with MSVC.
        • +
        • modified get_directory_name in utilities.cxx to return "." if the directory info was not given.
        • +
        + +

        Build system

        +
          +
        • We no longer add the STIR_LOCAL subdirectory in the main CMakeLists.txt +(if STIR_LOCAL is enabled). +We now leave that to STIR_LOCAL/stir_extra_dirs.cmake. This effectively means +that if you extended STIR by having a CMakeLists.txt in your local directory, +it will no longer be picked-up and you will have to edit your local +stir_extra_dirs.cmake with something like + + add_subdirectory(${STIR_LOCAL}) + +
        • +
        • All CMake help-fules have been moved to a spearate sub-directory src/cmake which is +added to the CMazke module path. That means that you should use them for instance as +
          +include(stir_lib_target)
          +
          +
        • +
        + + + + diff --git a/documentation/support.htm b/documentation/support.htm new file mode 100644 index 0000000000..0d89fe8069 --- /dev/null +++ b/documentation/support.htm @@ -0,0 +1,31 @@ + + + + STIR Support + + + + +

        Support

        + +

        While support for STIR is on a voluntary basis, users of the +software are encouraged to subscribe to relevant STIR mailing lists +(see the 'Mailing Lists' section where they can follow developments of the +software and obtain helpful information from other users. Questions +will ONLY be answered (if at all) when directed to the mailing list. +

        + +

        If you want guaranteed or more extensive support, +Algorithms and Software Consulting Ltd might be +able to provide this for a charge. +Alternatively, writing a grant proposal together with some of the STIR +developers would also help. +

        + +
        + + +Last modified: Mon Jan 13 21:49:31 GMT 2014 + + + diff --git a/doximages/FTMetz.eps b/doximages/FTMetz.eps new file mode 100644 index 0000000000..52b40ffdcb --- /dev/null +++ b/doximages/FTMetz.eps @@ -0,0 +1,1949 @@ +%!PS-Adobe-2.0 EPSF-1.2 +%%BoundingBox: 88 4 376 182 +%%HiResBoundingBox: 88 4 376 181.938 +%%Creator: (Mathematica 4.1 for Microsoft Windows) +%%CreationDate: (Wednesday, May 30, 2001) (23:47:08) +%%Title: Clipboard +%%DocumentNeededResources: font Courier +%%DocumentSuppliedResources: +%%DocumentNeededFonts: Courier +%%DocumentSuppliedFonts: +%%DocumentFonts: Courier +%%EndComments +0 185.938 translate 1 -1 scale +gsave +150 dict begin +/Mfixwid true def +/Mrot 0 def +/Mpstart { + MathPictureStart +} bind def +/Mpend { + MathPictureEnd +} bind def +/Mscale { + 0 1 0 1 + 5 -1 roll + MathScale +} bind def +/Plain /Courier findfont def +/Bold /Courier-Bold findfont def +/Italic /Courier-Oblique findfont def +/MathPictureStart { + /Mimatrix + matrix currentmatrix + def + gsave + newpath + Mleft + Mbottom + translate + /Mtmatrix + matrix currentmatrix + def + Plain + Mfontsize scalefont + setfont + 0 setgray + 0 setlinewidth +} bind def +/MathPictureEnd { + grestore +} bind def +/MathSubStart { + Momatrix + Mgmatrix Mtmatrix + Mleft Mbottom + Mwidth Mheight + 9 -2 roll + moveto + Mtmatrix setmatrix + currentpoint + Mgmatrix setmatrix + 11 -2 roll + moveto + Mtmatrix setmatrix + currentpoint + 2 copy translate + /Mtmatrix matrix currentmatrix def + /Mleft 0 def + /Mbottom 0 def + 3 -1 roll + exch sub + /Mheight exch def + sub + /Mwidth exch def +} bind def +/MathSubEnd { + /Mheight exch def + /Mwidth exch def + /Mbottom exch def + /Mleft exch def + /Mtmatrix exch def + dup setmatrix + /Mgmatrix exch def + /Momatrix exch def +} bind def +/Mdot { + moveto + 0 0 rlineto + stroke +} bind def +/Mtetra { + moveto + lineto + lineto + lineto + fill +} bind def +/Metetra { + moveto + lineto + lineto + lineto + closepath + gsave + fill + grestore + 0 setgray + stroke +} bind def +/Mistroke { + flattenpath + 0 0 0 + { + 4 2 roll + pop pop + } + { + 4 -1 roll + 2 index + sub dup mul + 4 -1 roll + 2 index + sub dup mul + add sqrt + 4 -1 roll + add + 3 1 roll + } + { + stop + } + { + stop + } + pathforall + pop pop + currentpoint + stroke + moveto + currentdash + 3 -1 roll + add + setdash +} bind def +/Mfstroke { + stroke + currentdash + pop 0 + setdash +} bind def +/Mrotsboxa { + gsave + dup + /Mrot + exch def + Mrotcheck + Mtmatrix + dup + setmatrix + 7 1 roll + 4 index + 4 index + translate + rotate + 3 index + -1 mul + 3 index + -1 mul + translate + /Mtmatrix + matrix + currentmatrix + def + grestore + Msboxa + 3 -1 roll + /Mtmatrix + exch def + /Mrot + 0 def +} bind def +/Msboxa { + newpath + 5 -1 roll + Mvboxa + pop + Mboxout + 6 -1 roll + 5 -1 roll + 4 -1 roll + Msboxa1 + 5 -3 roll + Msboxa1 + Mboxrot + [ + 7 -2 roll + 2 copy + [ + 3 1 roll + 10 -1 roll + 9 -1 roll + ] + 6 1 roll + 5 -2 roll + ] +} bind def +/Msboxa1 { + sub + 2 div + dup + 2 index + 1 add + mul + 3 -1 roll + -1 add + 3 -1 roll + mul +} bind def +/Mvboxa { + Mfixwid + { + Mvboxa1 + } + { + dup + Mwidthcal + 0 exch + { + add + } + forall + exch + Mvboxa1 + 4 index + 7 -1 roll + add + 4 -1 roll + pop + 3 1 roll + } + ifelse +} bind def +/Mvboxa1 { + gsave + newpath + [ true + 3 -1 roll + { + Mbbox + 5 -1 roll + { + 0 + 5 1 roll + } + { + 7 -1 roll + exch sub + (m) stringwidth pop + .3 mul + sub + 7 1 roll + 6 -1 roll + 4 -1 roll + Mmin + 3 -1 roll + 5 index + add + 5 -1 roll + 4 -1 roll + Mmax + 4 -1 roll + } + ifelse + false + } + forall + { stop } if + counttomark + 1 add + 4 roll + ] + grestore +} bind def +/Mbbox { + 0 0 moveto + false charpath + flattenpath + pathbbox + newpath +} bind def +/Mmin { + 2 copy + gt + { exch } if + pop +} bind def +/Mmax { + 2 copy + lt + { exch } if + pop +} bind def +/Mrotshowa { + dup + /Mrot + exch def + Mrotcheck + Mtmatrix + dup + setmatrix + 7 1 roll + 4 index + 4 index + translate + rotate + 3 index + -1 mul + 3 index + -1 mul + translate + /Mtmatrix + matrix + currentmatrix + def + Mgmatrix setmatrix + Mshowa + /Mtmatrix + exch def + /Mrot 0 def +} bind def +/Mshowa { + 4 -2 roll + moveto + 2 index + Mtmatrix setmatrix + Mvboxa + 7 1 roll + Mboxout + 6 -1 roll + 5 -1 roll + 4 -1 roll + Mshowa1 + 4 1 roll + Mshowa1 + rmoveto + currentpoint + Mfixwid + { + Mshowax + } + { + Mshoway + } + ifelse + pop pop pop pop + Mgmatrix setmatrix +} bind def +/Mshowax { + 0 1 + 4 index length + -1 add + { + 2 index + 4 index + 2 index + get + 3 index + add + moveto + 4 index + exch get + show + } for +} bind def +/Mshoway { + 3 index + Mwidthcal + 5 1 roll + 0 1 + 4 index length + -1 add + { + 2 index + 4 index + 2 index + get + 3 index + add + moveto + 4 index + exch get + [ + 6 index + aload + length + 2 add + -1 roll + { + pop + Strform + stringwidth + pop + neg + exch + add + 0 rmoveto + } + exch + kshow + cleartomark + } for + pop +} bind def +/Mwidthcal { + [ + exch + { + Mwidthcal1 + } + forall + ] + [ + exch + dup + Maxlen + -1 add + 0 1 + 3 -1 roll + { + [ + exch + 2 index + { + 1 index + Mget + exch + } + forall + pop + Maxget + exch + } + for + pop + ] + Mreva +} bind def +/Mreva { + [ + exch + aload + length + -1 1 + {1 roll} + for + ] +} bind def +/Mget { + 1 index + length + -1 add + 1 index + ge + { + get + } + { + pop pop + 0 + } + ifelse +} bind def +/Maxlen { + [ + exch + { + length + } + forall + Maxget +} bind def +/Maxget { + counttomark + -1 add + 1 1 + 3 -1 roll + { + pop + Mmax + } + for + exch + pop +} bind def +/Mwidthcal1 { + [ + exch + { + Strform + stringwidth + pop + } + forall + ] +} bind def +/Strform { + /tem (x) def + tem 0 + 3 -1 roll + put + tem +} bind def +/Mshowa1 { + 2 copy + add + 4 1 roll + sub + mul + sub + -2 div +} bind def +/MathScale { + Mwidth + Mheight + Mlp + translate + scale + /yscale exch def + /ybias exch def + /xscale exch def + /xbias exch def + /Momatrix + xscale yscale matrix scale + xbias ybias matrix translate + matrix concatmatrix def + /Mgmatrix + matrix currentmatrix + def +} bind def +/Mlp { + 3 copy + Mlpfirst + { + Mnodistort + { + Mmin + dup + } if + 4 index + 2 index + 2 index + Mlprun + 11 index + 11 -1 roll + 10 -4 roll + Mlp1 + 8 index + 9 -5 roll + Mlp1 + 4 -1 roll + and + { exit } if + 3 -1 roll + pop pop + } loop + exch + 3 1 roll + 7 -3 roll + pop pop pop +} bind def +/Mlpfirst { + 3 -1 roll + dup length + 2 copy + -2 add + get + aload + pop pop pop + 4 -2 roll + -1 add + get + aload + pop pop pop + 6 -1 roll + 3 -1 roll + 5 -1 roll + sub + dup /MsaveAx exch def + div + 4 1 roll + exch sub + dup /MsaveAy exch def + div +} bind def +/Mlprun { + 2 copy + 4 index + 0 get + dup + 4 1 roll + Mlprun1 + 3 copy + 8 -2 roll + 9 -1 roll + { + 3 copy + Mlprun1 + 3 copy + 11 -3 roll + /gt Mlpminmax + 8 3 roll + 11 -3 roll + /lt Mlpminmax + 8 3 roll + } forall + pop pop pop pop + 3 1 roll + pop pop + aload pop + 5 -1 roll + aload pop + exch + 6 -1 roll + Mlprun2 + 8 2 roll + 4 -1 roll + Mlprun2 + 6 2 roll + 3 -1 roll + Mlprun2 + 4 2 roll + exch + Mlprun2 + 6 2 roll +} bind def +/Mlprun1 { + aload pop + exch + 6 -1 roll + 5 -1 roll + mul add + 4 -2 roll + mul + 3 -1 roll + add +} bind def +/Mlprun2 { + 2 copy + add 2 div + 3 1 roll + exch sub +} bind def +/Mlpminmax { + cvx + 2 index + 6 index + 2 index + exec + { + 7 -3 roll + 4 -1 roll + } if + 1 index + 5 index + 3 -1 roll + exec + { + 4 1 roll + pop + 5 -1 roll + aload + pop pop + 4 -1 roll + aload pop + [ + 8 -2 roll + pop + 5 -2 roll + pop + 6 -2 roll + pop + 5 -1 roll + ] + 4 1 roll + pop + } + { + pop pop pop + } ifelse +} bind def +/Mlp1 { + 5 index + 3 index sub + 5 index + 2 index mul + 1 index + le + 1 index + 0 le + or + dup + not + { + 1 index + 3 index div + .99999 mul + 8 -1 roll + pop + 7 1 roll + } + if + 8 -1 roll + 2 div + 7 -2 roll + pop sub + 5 index + 6 -3 roll + pop pop + mul sub + exch +} bind def +/intop 0 def +/inrht 0 def +/inflag 0 def +/outflag 0 def +/xadrht 0 def +/xadlft 0 def +/yadtop 0 def +/yadbot 0 def +/Minner { + outflag + 1 + eq + { + /outflag 0 def + /intop 0 def + /inrht 0 def + } if + 5 index + gsave + Mtmatrix setmatrix + Mvboxa pop + grestore + 3 -1 roll + pop + dup + intop + gt + { + /intop + exch def + } + { pop } + ifelse + dup + inrht + gt + { + /inrht + exch def + } + { pop } + ifelse + pop + /inflag + 1 def +} bind def +/Mouter { + /xadrht 0 def + /xadlft 0 def + /yadtop 0 def + /yadbot 0 def + inflag + 1 eq + { + dup + 0 lt + { + dup + intop + mul + neg + /yadtop + exch def + } if + dup + 0 gt + { + dup + intop + mul + /yadbot + exch def + } + if + pop + dup + 0 lt + { + dup + inrht + mul + neg + /xadrht + exch def + } if + dup + 0 gt + { + dup + inrht + mul + /xadlft + exch def + } if + pop + /outflag 1 def + } + { pop pop} + ifelse + /inflag 0 def + /inrht 0 def + /intop 0 def +} bind def +/Mboxout { + outflag + 1 + eq + { + 4 -1 + roll + xadlft + leadjust + add + sub + 4 1 roll + 3 -1 + roll + yadbot + leadjust + add + sub + 3 1 + roll + exch + xadrht + leadjust + add + add + exch + yadtop + leadjust + add + add + /outflag 0 def + /xadlft 0 def + /yadbot 0 def + /xadrht 0 def + /yadtop 0 def + } if +} bind def +/leadjust { + (m) stringwidth pop + .5 mul +} bind def +/Mrotcheck { + dup + 90 + eq + { + yadbot + /yadbot + xadrht + def + /xadrht + yadtop + def + /yadtop + xadlft + def + /xadlft + exch + def + } + if + dup + cos + 1 index + sin + Checkaux + dup + cos + 1 index + sin neg + exch + Checkaux + 3 1 roll + pop pop +} bind def +/Checkaux { + 4 index + exch + 4 index + mul + 3 1 roll + mul add + 4 1 roll +} bind def +/Mboxrot { + Mrot + 90 eq + { + brotaux + 4 2 + roll + } + if + Mrot + 180 eq + { + 4 2 + roll + brotaux + 4 2 + roll + brotaux + } + if + Mrot + 270 eq + { + 4 2 + roll + brotaux + } + if +} bind def +/brotaux { + neg + exch + neg +} bind def +/Mabsproc { + 0 + matrix defaultmatrix + dtransform idtransform + dup mul exch + dup mul + add sqrt +} bind def +/Mabswid { + Mabsproc + setlinewidth +} bind def +/Mabsdash { + exch + [ + exch + { + Mabsproc + } + forall + ] + exch + setdash +} bind def +/MBeginOrig { Momatrix concat} bind def +/MEndOrig { Mgmatrix setmatrix} bind def +/sampledsound where +{ pop} +{ /sampledsound { +exch +pop +exch +5 1 roll +mul +4 idiv +mul +2 idiv +exch pop +exch +/Mtempproc exch def +{ Mtempproc pop } +repeat +} bind def +} ifelse +% Here are the short operators +/g { setgray} bind def +/k { setcmykcolor} bind def +/m { moveto} bind def +/p { gsave} bind def +/r { setrgbcolor} bind def +/w { setlinewidth} bind def +/C { curveto} bind def +/F { fill} bind def +/L { lineto} bind def +/P { grestore} bind def +/s { stroke} bind def + +/MFill { + 0 0 moveto + Mwidth 0 lineto + Mwidth Mheight lineto + 0 Mheight lineto + fill +} bind def + +/MPlotRegion { + 3 index + Mwidth mul + 2 index + Mheight mul + translate + exch sub + Mheight mul + /Mheight + exch def + exch sub + Mwidth mul + /Mwidth + exch def +} bind def + +/Mcharproc +{ + currentfile + (x) + readhexstring + pop + 0 get + exch + div +} bind def + +/Mshadeproc +{ + dup + 3 1 + roll + { + dup + Mcharproc + 3 1 + roll + } repeat + 1 eq + { + setgray + } + { + 3 eq + { + setrgbcolor + } + { + setcmykcolor + } ifelse + } ifelse +} bind def + +/Mrectproc +{ + 3 index + 2 index + moveto + 2 index + 3 -1 + roll + lineto + dup + 3 1 + roll + lineto + lineto + fill +} bind def + +/_Mcolorimage +{ + 7 1 + roll + pop + pop + matrix + invertmatrix + concat + 2 exch exp + 1 sub + 3 1 roll + 1 1 + 2 index + { + 1 1 + 4 index + { + dup + 1 sub + exch + 2 index + dup + 1 sub + exch + 7 index + 9 index + Mshadeproc + Mrectproc + } for + pop + } for + pop pop pop pop +} bind def + +/_Mimage +{ + pop + matrix + invertmatrix + concat + 2 exch exp + 1 sub + 3 1 roll + 1 1 + 2 index + { + 1 1 + 4 index + { + dup + 1 sub + exch + 2 index + dup + 1 sub + exch + 7 index + Mcharproc + setgray + Mrectproc + } for + pop + } for + pop pop pop +} bind def + +/Mimage { + 4 index + 4 index + mul 1600 gt + { image } + { _Mimage } + ifelse +} def + +/Mcolorimage { + 6 index + 6 index + mul 1600 gt + { colorimage } + { _Mcolorimage } + ifelse +} def +/MacintoshRomanEncoding [ + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /grave/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute + /agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave + /ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute + /ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis + /dagger/degree/cent/sterling/section/bullet/paragraph/germandbls + /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash + /.notdef/plusminus/.notdef/.notdef/yen/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/ordfeminine/ring/.notdef/ae/oslash + /questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef/guillemotleft + /guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe + /endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/.notdef + /ydieresis/Ydieresis/.notdef/currency/guilsinglleft/guilsinglright/.notdef/.notdef + /daggerdbl/dotaccent/quotesinglbase/quotedblbase/perthousand/Acircumflex/Ecircumflex/Aacute + /Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex + /.notdef/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde + /macron/.notdef/.notdef/.notdef/ogonek/.notdef/.notdef/.notdef +] def +/WindowsANSIEncoding [ + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /grave/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef/Zcaron/.notdef + /.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/.notdef/zcaron/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/.notdef/paragraph/dotaccent + /ogonek/onesuperior/ring/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis +] def +/Mnodistort true def +1.000000 1.000000 scale +88.000000 181.937500 translate +1.000000 -1.000000 scale +0.000000 0.000000 translate +/Mleft 0.000000 def +/Mbottom 0.000000 def +/Mwidth 288.000000 def +/Mheight 177.937500 def +0 setgray +0 setlinewidth +/Courier findfont 12 scalefont setfont +/Mfontsize 12 def +/Plain /Courier findfont def + +%! +%%Creator: Mathematica +%%AspectRatio: .61803 +MathPictureStart +/Mabs { +Mgmatrix idtransform +Mtmatrix dtransform +} bind def +/Mabsadd { Mabs +3 -1 roll add +3 1 roll add +exch } bind def +%% Graphics +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10 scalefont setfont +% Scaling calculations +0.0238095 0.238095 0.0147151 0.423455 [ +[.2619 .00222 -3 -9 ] +[.2619 .00222 3 0 ] +[.5 .00222 -3 -9 ] +[.5 .00222 3 0 ] +[.7381 .00222 -3 -9 ] +[.7381 .00222 3 0 ] +[.97619 .00222 -3 -9 ] +[.97619 .00222 3 0 ] +[.01131 .09941 -18 -4.5 ] +[.01131 .09941 0 4.5 ] +[.01131 .1841 -18 -4.5 ] +[.01131 .1841 0 4.5 ] +[.01131 .26879 -18 -4.5 ] +[.01131 .26879 0 4.5 ] +[.01131 .35348 -18 -4.5 ] +[.01131 .35348 0 4.5 ] +[.01131 .43817 -6 -4.5 ] +[.01131 .43817 0 4.5 ] +[.01131 .52286 -18 -4.5 ] +[.01131 .52286 0 4.5 ] +[.01131 .60755 -18 -4.5 ] +[.01131 .60755 0 4.5 ] +[ 0 0 0 0 ] +[ 1 .61803 0 0 ] +] MathScale +% Start of Graphics +1 setlinecap +1 setlinejoin +newpath +0 g +.25 Mabswid +[ ] 0 setdash +.2619 .01472 m +.2619 .02097 L +s +[(1)] .2619 .00222 0 1 Mshowa +.5 .01472 m +.5 .02097 L +s +[(2)] .5 .00222 0 1 Mshowa +.7381 .01472 m +.7381 .02097 L +s +[(3)] .7381 .00222 0 1 Mshowa +.97619 .01472 m +.97619 .02097 L +s +[(4)] .97619 .00222 0 1 Mshowa +.125 Mabswid +.07143 .01472 m +.07143 .01847 L +s +.11905 .01472 m +.11905 .01847 L +s +.16667 .01472 m +.16667 .01847 L +s +.21429 .01472 m +.21429 .01847 L +s +.30952 .01472 m +.30952 .01847 L +s +.35714 .01472 m +.35714 .01847 L +s +.40476 .01472 m +.40476 .01847 L +s +.45238 .01472 m +.45238 .01847 L +s +.54762 .01472 m +.54762 .01847 L +s +.59524 .01472 m +.59524 .01847 L +s +.64286 .01472 m +.64286 .01847 L +s +.69048 .01472 m +.69048 .01847 L +s +.78571 .01472 m +.78571 .01847 L +s +.83333 .01472 m +.83333 .01847 L +s +.88095 .01472 m +.88095 .01847 L +s +.92857 .01472 m +.92857 .01847 L +s +.25 Mabswid +0 .01472 m +1 .01472 L +s +.02381 .09941 m +.03006 .09941 L +s +[(0.2)] .01131 .09941 1 0 Mshowa +.02381 .1841 m +.03006 .1841 L +s +[(0.4)] .01131 .1841 1 0 Mshowa +.02381 .26879 m +.03006 .26879 L +s +[(0.6)] .01131 .26879 1 0 Mshowa +.02381 .35348 m +.03006 .35348 L +s +[(0.8)] .01131 .35348 1 0 Mshowa +.02381 .43817 m +.03006 .43817 L +s +[(1)] .01131 .43817 1 0 Mshowa +.02381 .52286 m +.03006 .52286 L +s +[(1.2)] .01131 .52286 1 0 Mshowa +.02381 .60755 m +.03006 .60755 L +s +[(1.4)] .01131 .60755 1 0 Mshowa +.125 Mabswid +.02381 .03589 m +.02756 .03589 L +s +.02381 .05706 m +.02756 .05706 L +s +.02381 .07823 m +.02756 .07823 L +s +.02381 .12058 m +.02756 .12058 L +s +.02381 .14175 m +.02756 .14175 L +s +.02381 .16292 m +.02756 .16292 L +s +.02381 .20527 m +.02756 .20527 L +s +.02381 .22644 m +.02756 .22644 L +s +.02381 .24762 m +.02756 .24762 L +s +.02381 .28996 m +.02756 .28996 L +s +.02381 .31113 m +.02756 .31113 L +s +.02381 .33231 m +.02756 .33231 L +s +.02381 .37465 m +.02756 .37465 L +s +.02381 .39582 m +.02756 .39582 L +s +.02381 .417 m +.02756 .417 L +s +.02381 .45934 m +.02756 .45934 L +s +.02381 .48052 m +.02756 .48052 L +s +.02381 .50169 m +.02756 .50169 L +s +.02381 .54403 m +.02756 .54403 L +s +.02381 .56521 m +.02756 .56521 L +s +.02381 .58638 m +.02756 .58638 L +s +.25 Mabswid +.02381 0 m +.02381 .61803 L +s +0 0 m +1 0 L +1 .61803 L +0 .61803 L +closepath +clip +newpath +.5 Mabswid +.02381 .43817 m +.02499 .43817 L +.02605 .43815 L +.02729 .43813 L +.02846 .43809 L +.03053 .438 L +.03279 .43787 L +.03527 .43768 L +.0379 .43743 L +.04262 .43685 L +.04749 .43608 L +.05205 .4352 L +.06244 .43263 L +.07305 .42921 L +.08274 .4254 L +.10458 .41449 L +.14429 .38728 L +.18248 .35385 L +.22313 .313 L +.26226 .27117 L +.30384 .22676 L +.34391 .18624 L +.38246 .15089 L +.42346 .11823 L +.46295 .09201 L +.50092 .07158 L +.54134 .0546 L +.58025 .04231 L +.60006 .03735 L +.62161 .03283 L +.66146 .02645 L +.68123 .02407 L +.70224 .02202 L +.73999 .01931 L +.75934 .0183 L +.78019 .01744 L +.80023 .01679 L +.82133 .01627 L +.84107 .01589 L +.85944 .01561 L +.8799 .01538 L +.89849 .01521 L +.91767 .01508 L +.93847 .01498 L +.95679 .01491 L +.97619 .01486 L +s +.02381 .43817 m +.06244 .44198 L +.08255 .44499 L +.08806 .4457 L +.09396 .44635 L +.09952 .44685 L +.10458 .44718 L +.10704 .44729 L +.10839 .44734 L +.10965 .44738 L +.11073 .4474 L +.11188 .44742 L +.11316 .44743 L +.11433 .44743 L +.11499 .44743 L +.11568 .44743 L +.11693 .44741 L +.11769 .44739 L +.11842 .44738 L +.11976 .44734 L +.12224 .44723 L +.12492 .44706 L +.12724 .44688 L +.12979 .44664 L +.13494 .44601 L +.1397 .44524 L +.14415 .44436 L +.1546 .44167 L +.1645 .43827 L +.18306 .4296 L +.20297 .41698 L +.22139 .4024 L +.26066 .36339 L +.29841 .3187 L +.33861 .26785 L +.3773 .21978 L +.41844 .17294 L +.45806 .13401 L +.49617 .10304 L +.53673 .07696 L +.57578 .0579 L +.59569 .05018 L +.61727 .04313 L +.65726 .03316 L +.67713 .02943 L +.69817 .02622 L +.73606 .02195 L +.75551 .02037 L +.7764 .01901 L +.79758 .01795 L +Mistroke +.81768 .01716 L +.83752 .01656 L +.85592 .01613 L +.87649 .01576 L +.89511 .0155 L +.91439 .0153 L +.93522 .01513 L +.95516 .01502 L +.97619 .01493 L +Mfstroke +.02381 .43817 m +.02499 .43818 L +.02605 .43819 L +.02729 .43822 L +.02846 .43825 L +.03053 .43834 L +.03279 .43847 L +.03527 .43866 L +.0379 .43891 L +.04262 .43948 L +.05205 .44108 L +.06244 .44349 L +.0842 .45032 L +.10458 .45795 L +.12312 .46488 L +.14335 .4712 L +.14866 .4725 L +.15431 .47367 L +.15965 .47455 L +.16449 .47514 L +.16707 .47538 L +.16946 .47554 L +.1707 .47561 L +.17207 .47566 L +.17276 .47568 L +.1735 .4757 L +.17419 .47571 L +.17483 .47571 L +.17608 .47571 L +.17723 .4757 L +.17849 .47567 L +.17913 .47565 L +.17984 .47562 L +.18101 .47556 L +.18228 .47548 L +.18458 .47529 L +.18697 .47503 L +.18953 .47469 L +.19415 .47389 L +.19963 .47263 L +.20462 .47119 L +.21547 .46704 L +.22572 .46185 L +.24573 .44819 L +.26418 .43168 L +.30359 .38597 L +.34147 .33317 L +.38181 .27392 L +.42064 .21933 L +.46191 .1679 L +Mistroke +.50167 .12672 L +.53992 .09517 L +.58062 .06959 L +.6198 .0516 L +.64125 .04404 L +.66143 .03818 L +.70004 .02972 L +.72001 .0265 L +.74109 .02377 L +.77912 .02024 L +.79866 .01896 L +.81959 .01789 L +.84087 .01706 L +.861 .01647 L +.88095 .01601 L +.89939 .0157 L +.91809 .01545 L +.93871 .01524 L +.95676 .01511 L +.97619 .015 L +Mfstroke +.02381 .43817 m +.02499 .43818 L +.02605 .43819 L +.02729 .43822 L +.02846 .43825 L +.03053 .43834 L +.03279 .43847 L +.03527 .43866 L +.0379 .43891 L +.04262 .43949 L +.04749 .44027 L +.05205 .44115 L +.06244 .44374 L +.07305 .44717 L +.08274 .45097 L +.10458 .4615 L +.14429 .48433 L +.16432 .49508 L +.18248 .50274 L +.18735 .50432 L +.19261 .50575 L +.19758 .50683 L +.20215 .50757 L +.20467 .50787 L +.20702 .50808 L +.20836 .50817 L +.20959 .50823 L +.21027 .50825 L +.21101 .50827 L +.21171 .50829 L +.21235 .50829 L +.21363 .50829 L +.21484 .50826 L +.21615 .50821 L +.2169 .50818 L +.21758 .50814 L +.22028 .50791 L +.22164 .50776 L +.22313 .50756 L +.22841 .50661 L +.2334 .50534 L +.24274 .50199 L +.25279 .49694 L +.26369 .48979 L +.28356 .47241 L +.30461 .44848 L +.34249 .39445 L +.38283 .32858 L +.42166 .26488 L +.46293 .20316 L +Mistroke +.5027 .15294 L +.54094 .11413 L +.58164 .08255 L +.62082 .06031 L +.64227 .05096 L +.66245 .0437 L +.70106 .03324 L +.72103 .02926 L +.74211 .02589 L +.78014 .02153 L +.79968 .01995 L +.82061 .01863 L +.84189 .01761 L +.86203 .01687 L +.88198 .01631 L +.90041 .01592 L +.91911 .01562 L +.93973 .01536 L +.95729 .0152 L +.97619 .01507 L +Mfstroke +.02381 .43817 m +.02499 .43818 L +.02605 .43819 L +.02729 .43822 L +.02846 .43825 L +.03053 .43834 L +.03279 .43847 L +.03527 .43866 L +.0379 .43891 L +.04262 .43949 L +.04749 .44027 L +.05205 .44116 L +.06244 .44377 L +.07305 .44729 L +.08274 .45125 L +.10458 .46267 L +.14429 .49046 L +.18248 .51908 L +.20215 .53092 L +.20782 .53363 L +.21315 .53585 L +.21791 .53751 L +.22313 .53899 L +.22556 .53955 L +.22818 .54005 L +.23043 .5404 L +.23289 .54069 L +.23433 .54081 L +.23496 .54086 L +.23566 .5409 L +.23693 .54095 L +.23763 .54097 L +.23829 .54099 L +.23952 .54099 L +.24065 .54097 L +.2419 .54092 L +.2432 .54085 L +.24436 .54075 L +.24541 .54065 L +.24778 .54035 L +.24996 .53999 L +.25203 .53957 L +.25666 .53836 L +.26168 .53662 L +.27114 .53213 L +.28155 .52536 L +.3026 .50604 L +.32204 .4821 L +.34294 .45103 L +.38421 .37924 L +Mistroke +.42397 .30614 L +.46222 .24013 L +.50292 .17956 L +.5421 .13252 L +.58373 .09439 L +.62385 .06768 L +.66245 .04949 L +.68243 .04239 L +.70351 .0363 L +.74153 .02823 L +.76108 .02523 L +.78201 .02269 L +.80329 .02069 L +.82342 .01923 L +.84337 .01811 L +.86181 .01731 L +.88051 .01668 L +.90112 .01615 L +.92051 .01577 L +.94138 .01547 L +.95835 .01529 L +.97619 .01514 L +Mfstroke +.02381 .43817 m +.02499 .43818 L +.02605 .43819 L +.02729 .43822 L +.02846 .43825 L +.03053 .43834 L +.03279 .43847 L +.03527 .43866 L +.0379 .43891 L +.04262 .43949 L +.04749 .44027 L +.05205 .44116 L +.06244 .44378 L +.07305 .44732 L +.08274 .45132 L +.10458 .46306 L +.14429 .49337 L +.18248 .52886 L +.2038 .54756 L +.22313 .5613 L +.23281 .56645 L +.2379 .5686 L +.24328 .57041 L +.24799 .57158 L +.25066 .57208 L +.25195 .57226 L +.25316 .57242 L +.25426 .57253 L +.25546 .57263 L +.25654 .57269 L +.25755 .57273 L +.25864 .57275 L +.25983 .57275 L +.26108 .57271 L +.26226 .57265 L +.26343 .57257 L +.26469 .57244 L +.26695 .57214 L +.26964 .57165 L +.27209 .57107 L +.27741 .5694 L +.28244 .56728 L +.29132 .56227 L +.30094 .55502 L +.32082 .53436 L +.34186 .50502 L +.37975 .43811 L +.42009 .35754 L +.45891 .28163 L +.50019 .21045 L +Mistroke +.53995 .15451 L +.5782 .11271 L +.61889 .07978 L +.65808 .05732 L +.67953 .04811 L +.69971 .04107 L +.73831 .03113 L +.75829 .02743 L +.77937 .02436 L +.79905 .02211 L +.81739 .02045 L +.83778 .01901 L +.85635 .01799 L +.87548 .01718 L +.89625 .01652 L +.91606 .01604 L +.93709 .01566 L +.9566 .0154 L +.97489 .01522 L +.97619 .01521 L +Mfstroke +.02381 .43817 m +.02499 .43818 L +.02605 .43819 L +.02729 .43822 L +.02846 .43825 L +.03053 .43834 L +.03279 .43847 L +.03527 .43866 L +.0379 .43891 L +.04262 .43949 L +.04749 .44027 L +.05205 .44116 L +.06244 .44378 L +.07305 .44732 L +.08274 .45134 L +.10458 .46319 L +.12357 .47671 L +.14429 .49475 L +.18493 .53743 L +.22406 .57798 L +.23435 .58654 L +.24548 .59412 L +.25058 .59692 L +.25598 .59937 L +.26059 .60101 L +.26322 .60176 L +.26565 .60233 L +.26816 .60278 L +.26948 .60296 L +.27089 .60312 L +.2721 .60322 L +.27325 .60328 L +.2745 .60331 L +.2752 .60332 L +.27585 .60331 L +.27697 .60328 L +.27802 .60323 L +.27916 .60314 L +.28038 .60301 L +.28288 .60265 L +.28516 .60219 L +.28784 .60149 L +.29032 .6007 L +.29591 .59839 L +.30085 .59574 L +.30607 .59232 L +.31551 .58456 L +.32564 .57401 L +.34396 .5496 L +.38523 .47496 L +Mistroke +.42499 .38976 L +.46324 .30817 L +.50394 .23082 L +.54312 .16969 L +.58475 .11968 L +.62487 .08452 L +.66348 .06054 L +.68345 .05117 L +.70453 .04314 L +.74255 .0325 L +.7621 .02855 L +.78303 .02521 L +.80431 .02257 L +.82444 .02065 L +.84439 .01918 L +.86283 .01812 L +.88153 .01729 L +.90214 .01659 L +.92153 .0161 L +.9424 .01571 L +.95887 .01547 L +.97619 .01528 L +Mfstroke +% End of Graphics +MathPictureEnd + +%%PSTrailer +end +grestore + +%%Trailer +%%EOF diff --git a/doximages/FTMetz.jpg b/doximages/FTMetz.jpg new file mode 100644 index 0000000000..a1dd4a2d2b Binary files /dev/null and b/doximages/FTMetz.jpg differ diff --git a/doximages/Metz.eps b/doximages/Metz.eps new file mode 100644 index 0000000000..dffcc0d5a2 --- /dev/null +++ b/doximages/Metz.eps @@ -0,0 +1,2057 @@ +%!PS-Adobe-2.0 EPSF-1.2 +%%BoundingBox: 88 4 376 182 +%%HiResBoundingBox: 88 4 376 181.938 +%%Creator: (Mathematica 4.1 for Microsoft Windows) +%%CreationDate: (Wednesday, May 30, 2001) (23:47:30) +%%Title: Clipboard +%%DocumentNeededResources: font Courier +%%DocumentSuppliedResources: +%%DocumentNeededFonts: Courier +%%DocumentSuppliedFonts: +%%DocumentFonts: Courier +%%EndComments +0 185.938 translate 1 -1 scale +gsave +150 dict begin +/Mfixwid true def +/Mrot 0 def +/Mpstart { + MathPictureStart +} bind def +/Mpend { + MathPictureEnd +} bind def +/Mscale { + 0 1 0 1 + 5 -1 roll + MathScale +} bind def +/Plain /Courier findfont def +/Bold /Courier-Bold findfont def +/Italic /Courier-Oblique findfont def +/MathPictureStart { + /Mimatrix + matrix currentmatrix + def + gsave + newpath + Mleft + Mbottom + translate + /Mtmatrix + matrix currentmatrix + def + Plain + Mfontsize scalefont + setfont + 0 setgray + 0 setlinewidth +} bind def +/MathPictureEnd { + grestore +} bind def +/MathSubStart { + Momatrix + Mgmatrix Mtmatrix + Mleft Mbottom + Mwidth Mheight + 9 -2 roll + moveto + Mtmatrix setmatrix + currentpoint + Mgmatrix setmatrix + 11 -2 roll + moveto + Mtmatrix setmatrix + currentpoint + 2 copy translate + /Mtmatrix matrix currentmatrix def + /Mleft 0 def + /Mbottom 0 def + 3 -1 roll + exch sub + /Mheight exch def + sub + /Mwidth exch def +} bind def +/MathSubEnd { + /Mheight exch def + /Mwidth exch def + /Mbottom exch def + /Mleft exch def + /Mtmatrix exch def + dup setmatrix + /Mgmatrix exch def + /Momatrix exch def +} bind def +/Mdot { + moveto + 0 0 rlineto + stroke +} bind def +/Mtetra { + moveto + lineto + lineto + lineto + fill +} bind def +/Metetra { + moveto + lineto + lineto + lineto + closepath + gsave + fill + grestore + 0 setgray + stroke +} bind def +/Mistroke { + flattenpath + 0 0 0 + { + 4 2 roll + pop pop + } + { + 4 -1 roll + 2 index + sub dup mul + 4 -1 roll + 2 index + sub dup mul + add sqrt + 4 -1 roll + add + 3 1 roll + } + { + stop + } + { + stop + } + pathforall + pop pop + currentpoint + stroke + moveto + currentdash + 3 -1 roll + add + setdash +} bind def +/Mfstroke { + stroke + currentdash + pop 0 + setdash +} bind def +/Mrotsboxa { + gsave + dup + /Mrot + exch def + Mrotcheck + Mtmatrix + dup + setmatrix + 7 1 roll + 4 index + 4 index + translate + rotate + 3 index + -1 mul + 3 index + -1 mul + translate + /Mtmatrix + matrix + currentmatrix + def + grestore + Msboxa + 3 -1 roll + /Mtmatrix + exch def + /Mrot + 0 def +} bind def +/Msboxa { + newpath + 5 -1 roll + Mvboxa + pop + Mboxout + 6 -1 roll + 5 -1 roll + 4 -1 roll + Msboxa1 + 5 -3 roll + Msboxa1 + Mboxrot + [ + 7 -2 roll + 2 copy + [ + 3 1 roll + 10 -1 roll + 9 -1 roll + ] + 6 1 roll + 5 -2 roll + ] +} bind def +/Msboxa1 { + sub + 2 div + dup + 2 index + 1 add + mul + 3 -1 roll + -1 add + 3 -1 roll + mul +} bind def +/Mvboxa { + Mfixwid + { + Mvboxa1 + } + { + dup + Mwidthcal + 0 exch + { + add + } + forall + exch + Mvboxa1 + 4 index + 7 -1 roll + add + 4 -1 roll + pop + 3 1 roll + } + ifelse +} bind def +/Mvboxa1 { + gsave + newpath + [ true + 3 -1 roll + { + Mbbox + 5 -1 roll + { + 0 + 5 1 roll + } + { + 7 -1 roll + exch sub + (m) stringwidth pop + .3 mul + sub + 7 1 roll + 6 -1 roll + 4 -1 roll + Mmin + 3 -1 roll + 5 index + add + 5 -1 roll + 4 -1 roll + Mmax + 4 -1 roll + } + ifelse + false + } + forall + { stop } if + counttomark + 1 add + 4 roll + ] + grestore +} bind def +/Mbbox { + 0 0 moveto + false charpath + flattenpath + pathbbox + newpath +} bind def +/Mmin { + 2 copy + gt + { exch } if + pop +} bind def +/Mmax { + 2 copy + lt + { exch } if + pop +} bind def +/Mrotshowa { + dup + /Mrot + exch def + Mrotcheck + Mtmatrix + dup + setmatrix + 7 1 roll + 4 index + 4 index + translate + rotate + 3 index + -1 mul + 3 index + -1 mul + translate + /Mtmatrix + matrix + currentmatrix + def + Mgmatrix setmatrix + Mshowa + /Mtmatrix + exch def + /Mrot 0 def +} bind def +/Mshowa { + 4 -2 roll + moveto + 2 index + Mtmatrix setmatrix + Mvboxa + 7 1 roll + Mboxout + 6 -1 roll + 5 -1 roll + 4 -1 roll + Mshowa1 + 4 1 roll + Mshowa1 + rmoveto + currentpoint + Mfixwid + { + Mshowax + } + { + Mshoway + } + ifelse + pop pop pop pop + Mgmatrix setmatrix +} bind def +/Mshowax { + 0 1 + 4 index length + -1 add + { + 2 index + 4 index + 2 index + get + 3 index + add + moveto + 4 index + exch get + show + } for +} bind def +/Mshoway { + 3 index + Mwidthcal + 5 1 roll + 0 1 + 4 index length + -1 add + { + 2 index + 4 index + 2 index + get + 3 index + add + moveto + 4 index + exch get + [ + 6 index + aload + length + 2 add + -1 roll + { + pop + Strform + stringwidth + pop + neg + exch + add + 0 rmoveto + } + exch + kshow + cleartomark + } for + pop +} bind def +/Mwidthcal { + [ + exch + { + Mwidthcal1 + } + forall + ] + [ + exch + dup + Maxlen + -1 add + 0 1 + 3 -1 roll + { + [ + exch + 2 index + { + 1 index + Mget + exch + } + forall + pop + Maxget + exch + } + for + pop + ] + Mreva +} bind def +/Mreva { + [ + exch + aload + length + -1 1 + {1 roll} + for + ] +} bind def +/Mget { + 1 index + length + -1 add + 1 index + ge + { + get + } + { + pop pop + 0 + } + ifelse +} bind def +/Maxlen { + [ + exch + { + length + } + forall + Maxget +} bind def +/Maxget { + counttomark + -1 add + 1 1 + 3 -1 roll + { + pop + Mmax + } + for + exch + pop +} bind def +/Mwidthcal1 { + [ + exch + { + Strform + stringwidth + pop + } + forall + ] +} bind def +/Strform { + /tem (x) def + tem 0 + 3 -1 roll + put + tem +} bind def +/Mshowa1 { + 2 copy + add + 4 1 roll + sub + mul + sub + -2 div +} bind def +/MathScale { + Mwidth + Mheight + Mlp + translate + scale + /yscale exch def + /ybias exch def + /xscale exch def + /xbias exch def + /Momatrix + xscale yscale matrix scale + xbias ybias matrix translate + matrix concatmatrix def + /Mgmatrix + matrix currentmatrix + def +} bind def +/Mlp { + 3 copy + Mlpfirst + { + Mnodistort + { + Mmin + dup + } if + 4 index + 2 index + 2 index + Mlprun + 11 index + 11 -1 roll + 10 -4 roll + Mlp1 + 8 index + 9 -5 roll + Mlp1 + 4 -1 roll + and + { exit } if + 3 -1 roll + pop pop + } loop + exch + 3 1 roll + 7 -3 roll + pop pop pop +} bind def +/Mlpfirst { + 3 -1 roll + dup length + 2 copy + -2 add + get + aload + pop pop pop + 4 -2 roll + -1 add + get + aload + pop pop pop + 6 -1 roll + 3 -1 roll + 5 -1 roll + sub + dup /MsaveAx exch def + div + 4 1 roll + exch sub + dup /MsaveAy exch def + div +} bind def +/Mlprun { + 2 copy + 4 index + 0 get + dup + 4 1 roll + Mlprun1 + 3 copy + 8 -2 roll + 9 -1 roll + { + 3 copy + Mlprun1 + 3 copy + 11 -3 roll + /gt Mlpminmax + 8 3 roll + 11 -3 roll + /lt Mlpminmax + 8 3 roll + } forall + pop pop pop pop + 3 1 roll + pop pop + aload pop + 5 -1 roll + aload pop + exch + 6 -1 roll + Mlprun2 + 8 2 roll + 4 -1 roll + Mlprun2 + 6 2 roll + 3 -1 roll + Mlprun2 + 4 2 roll + exch + Mlprun2 + 6 2 roll +} bind def +/Mlprun1 { + aload pop + exch + 6 -1 roll + 5 -1 roll + mul add + 4 -2 roll + mul + 3 -1 roll + add +} bind def +/Mlprun2 { + 2 copy + add 2 div + 3 1 roll + exch sub +} bind def +/Mlpminmax { + cvx + 2 index + 6 index + 2 index + exec + { + 7 -3 roll + 4 -1 roll + } if + 1 index + 5 index + 3 -1 roll + exec + { + 4 1 roll + pop + 5 -1 roll + aload + pop pop + 4 -1 roll + aload pop + [ + 8 -2 roll + pop + 5 -2 roll + pop + 6 -2 roll + pop + 5 -1 roll + ] + 4 1 roll + pop + } + { + pop pop pop + } ifelse +} bind def +/Mlp1 { + 5 index + 3 index sub + 5 index + 2 index mul + 1 index + le + 1 index + 0 le + or + dup + not + { + 1 index + 3 index div + .99999 mul + 8 -1 roll + pop + 7 1 roll + } + if + 8 -1 roll + 2 div + 7 -2 roll + pop sub + 5 index + 6 -3 roll + pop pop + mul sub + exch +} bind def +/intop 0 def +/inrht 0 def +/inflag 0 def +/outflag 0 def +/xadrht 0 def +/xadlft 0 def +/yadtop 0 def +/yadbot 0 def +/Minner { + outflag + 1 + eq + { + /outflag 0 def + /intop 0 def + /inrht 0 def + } if + 5 index + gsave + Mtmatrix setmatrix + Mvboxa pop + grestore + 3 -1 roll + pop + dup + intop + gt + { + /intop + exch def + } + { pop } + ifelse + dup + inrht + gt + { + /inrht + exch def + } + { pop } + ifelse + pop + /inflag + 1 def +} bind def +/Mouter { + /xadrht 0 def + /xadlft 0 def + /yadtop 0 def + /yadbot 0 def + inflag + 1 eq + { + dup + 0 lt + { + dup + intop + mul + neg + /yadtop + exch def + } if + dup + 0 gt + { + dup + intop + mul + /yadbot + exch def + } + if + pop + dup + 0 lt + { + dup + inrht + mul + neg + /xadrht + exch def + } if + dup + 0 gt + { + dup + inrht + mul + /xadlft + exch def + } if + pop + /outflag 1 def + } + { pop pop} + ifelse + /inflag 0 def + /inrht 0 def + /intop 0 def +} bind def +/Mboxout { + outflag + 1 + eq + { + 4 -1 + roll + xadlft + leadjust + add + sub + 4 1 roll + 3 -1 + roll + yadbot + leadjust + add + sub + 3 1 + roll + exch + xadrht + leadjust + add + add + exch + yadtop + leadjust + add + add + /outflag 0 def + /xadlft 0 def + /yadbot 0 def + /xadrht 0 def + /yadtop 0 def + } if +} bind def +/leadjust { + (m) stringwidth pop + .5 mul +} bind def +/Mrotcheck { + dup + 90 + eq + { + yadbot + /yadbot + xadrht + def + /xadrht + yadtop + def + /yadtop + xadlft + def + /xadlft + exch + def + } + if + dup + cos + 1 index + sin + Checkaux + dup + cos + 1 index + sin neg + exch + Checkaux + 3 1 roll + pop pop +} bind def +/Checkaux { + 4 index + exch + 4 index + mul + 3 1 roll + mul add + 4 1 roll +} bind def +/Mboxrot { + Mrot + 90 eq + { + brotaux + 4 2 + roll + } + if + Mrot + 180 eq + { + 4 2 + roll + brotaux + 4 2 + roll + brotaux + } + if + Mrot + 270 eq + { + 4 2 + roll + brotaux + } + if +} bind def +/brotaux { + neg + exch + neg +} bind def +/Mabsproc { + 0 + matrix defaultmatrix + dtransform idtransform + dup mul exch + dup mul + add sqrt +} bind def +/Mabswid { + Mabsproc + setlinewidth +} bind def +/Mabsdash { + exch + [ + exch + { + Mabsproc + } + forall + ] + exch + setdash +} bind def +/MBeginOrig { Momatrix concat} bind def +/MEndOrig { Mgmatrix setmatrix} bind def +/sampledsound where +{ pop} +{ /sampledsound { +exch +pop +exch +5 1 roll +mul +4 idiv +mul +2 idiv +exch pop +exch +/Mtempproc exch def +{ Mtempproc pop } +repeat +} bind def +} ifelse +% Here are the short operators +/g { setgray} bind def +/k { setcmykcolor} bind def +/m { moveto} bind def +/p { gsave} bind def +/r { setrgbcolor} bind def +/w { setlinewidth} bind def +/C { curveto} bind def +/F { fill} bind def +/L { lineto} bind def +/P { grestore} bind def +/s { stroke} bind def + +/MFill { + 0 0 moveto + Mwidth 0 lineto + Mwidth Mheight lineto + 0 Mheight lineto + fill +} bind def + +/MPlotRegion { + 3 index + Mwidth mul + 2 index + Mheight mul + translate + exch sub + Mheight mul + /Mheight + exch def + exch sub + Mwidth mul + /Mwidth + exch def +} bind def + +/Mcharproc +{ + currentfile + (x) + readhexstring + pop + 0 get + exch + div +} bind def + +/Mshadeproc +{ + dup + 3 1 + roll + { + dup + Mcharproc + 3 1 + roll + } repeat + 1 eq + { + setgray + } + { + 3 eq + { + setrgbcolor + } + { + setcmykcolor + } ifelse + } ifelse +} bind def + +/Mrectproc +{ + 3 index + 2 index + moveto + 2 index + 3 -1 + roll + lineto + dup + 3 1 + roll + lineto + lineto + fill +} bind def + +/_Mcolorimage +{ + 7 1 + roll + pop + pop + matrix + invertmatrix + concat + 2 exch exp + 1 sub + 3 1 roll + 1 1 + 2 index + { + 1 1 + 4 index + { + dup + 1 sub + exch + 2 index + dup + 1 sub + exch + 7 index + 9 index + Mshadeproc + Mrectproc + } for + pop + } for + pop pop pop pop +} bind def + +/_Mimage +{ + pop + matrix + invertmatrix + concat + 2 exch exp + 1 sub + 3 1 roll + 1 1 + 2 index + { + 1 1 + 4 index + { + dup + 1 sub + exch + 2 index + dup + 1 sub + exch + 7 index + Mcharproc + setgray + Mrectproc + } for + pop + } for + pop pop pop +} bind def + +/Mimage { + 4 index + 4 index + mul 1600 gt + { image } + { _Mimage } + ifelse +} def + +/Mcolorimage { + 6 index + 6 index + mul 1600 gt + { colorimage } + { _Mcolorimage } + ifelse +} def +/MacintoshRomanEncoding [ + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /grave/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute + /agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave + /ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute + /ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis + /dagger/degree/cent/sterling/section/bullet/paragraph/germandbls + /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash + /.notdef/plusminus/.notdef/.notdef/yen/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/ordfeminine/ring/.notdef/ae/oslash + /questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef/guillemotleft + /guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe + /endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/.notdef + /ydieresis/Ydieresis/.notdef/currency/guilsinglleft/guilsinglright/.notdef/.notdef + /daggerdbl/dotaccent/quotesinglbase/quotedblbase/perthousand/Acircumflex/Ecircumflex/Aacute + /Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex + /.notdef/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde + /macron/.notdef/.notdef/.notdef/ogonek/.notdef/.notdef/.notdef +] def +/WindowsANSIEncoding [ + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /grave/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef/Zcaron/.notdef + /.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/.notdef/zcaron/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/.notdef/paragraph/dotaccent + /ogonek/onesuperior/ring/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis +] def +/Mnodistort true def +1.000000 1.000000 scale +88.000000 181.937500 translate +1.000000 -1.000000 scale +0.000000 0.000000 translate +/Mleft 0.000000 def +/Mbottom 0.000000 def +/Mwidth 288.000000 def +/Mheight 177.937500 def +0 setgray +0 setlinewidth +/Courier findfont 12 scalefont setfont +/Mfontsize 12 def +/Plain /Courier findfont def + +%! +%%Creator: Mathematica +%%AspectRatio: .61803 +MathPictureStart +/Mabs { +Mgmatrix idtransform +Mtmatrix dtransform +} bind def +/Mabsadd { Mabs +3 -1 roll add +3 1 roll add +exch } bind def +%% Graphics +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10 scalefont setfont +% Scaling calculations +0.5 0.0793651 0.105859 0.640516 [ +[.02381 .09336 -6 -9 ] +[.02381 .09336 6 0 ] +[.18254 .09336 -6 -9 ] +[.18254 .09336 6 0 ] +[.34127 .09336 -6 -9 ] +[.34127 .09336 6 0 ] +[.65873 .09336 -3 -9 ] +[.65873 .09336 3 0 ] +[.81746 .09336 -3 -9 ] +[.81746 .09336 3 0 ] +[.97619 .09336 -3 -9 ] +[.97619 .09336 3 0 ] +[.4875 .23396 -18 -4.5 ] +[.4875 .23396 0 4.5 ] +[.4875 .36207 -18 -4.5 ] +[.4875 .36207 0 4.5 ] +[.4875 .49017 -18 -4.5 ] +[.4875 .49017 0 4.5 ] +[ 0 0 0 0 ] +[ 1 .61803 0 0 ] +] MathScale +% Start of Graphics +1 setlinecap +1 setlinejoin +newpath +0 g +.25 Mabswid +[ ] 0 setdash +.02381 .10586 m +.02381 .11211 L +s +[(-6)] .02381 .09336 0 1 Mshowa +.18254 .10586 m +.18254 .11211 L +s +[(-4)] .18254 .09336 0 1 Mshowa +.34127 .10586 m +.34127 .11211 L +s +[(-2)] .34127 .09336 0 1 Mshowa +.65873 .10586 m +.65873 .11211 L +s +[(2)] .65873 .09336 0 1 Mshowa +.81746 .10586 m +.81746 .11211 L +s +[(4)] .81746 .09336 0 1 Mshowa +.97619 .10586 m +.97619 .11211 L +s +[(6)] .97619 .09336 0 1 Mshowa +.125 Mabswid +.06349 .10586 m +.06349 .10961 L +s +.10317 .10586 m +.10317 .10961 L +s +.14286 .10586 m +.14286 .10961 L +s +.22222 .10586 m +.22222 .10961 L +s +.2619 .10586 m +.2619 .10961 L +s +.30159 .10586 m +.30159 .10961 L +s +.38095 .10586 m +.38095 .10961 L +s +.42063 .10586 m +.42063 .10961 L +s +.46032 .10586 m +.46032 .10961 L +s +.53968 .10586 m +.53968 .10961 L +s +.57937 .10586 m +.57937 .10961 L +s +.61905 .10586 m +.61905 .10961 L +s +.69841 .10586 m +.69841 .10961 L +s +.7381 .10586 m +.7381 .10961 L +s +.77778 .10586 m +.77778 .10961 L +s +.85714 .10586 m +.85714 .10961 L +s +.89683 .10586 m +.89683 .10961 L +s +.93651 .10586 m +.93651 .10961 L +s +.25 Mabswid +0 .10586 m +1 .10586 L +s +.5 .23396 m +.50625 .23396 L +s +[(0.2)] .4875 .23396 1 0 Mshowa +.5 .36207 m +.50625 .36207 L +s +[(0.4)] .4875 .36207 1 0 Mshowa +.5 .49017 m +.50625 .49017 L +s +[(0.6)] .4875 .49017 1 0 Mshowa +.125 Mabswid +.5 .13788 m +.50375 .13788 L +s +.5 .16991 m +.50375 .16991 L +s +.5 .20194 m +.50375 .20194 L +s +.5 .26599 m +.50375 .26599 L +s +.5 .29801 m +.50375 .29801 L +s +.5 .33004 m +.50375 .33004 L +s +.5 .39409 m +.50375 .39409 L +s +.5 .42612 m +.50375 .42612 L +s +.5 .45814 m +.50375 .45814 L +s +.5 .52219 m +.50375 .52219 L +s +.5 .55422 m +.50375 .55422 L +s +.5 .58625 m +.50375 .58625 L +s +.5 .07383 m +.50375 .07383 L +s +.5 .04181 m +.50375 .04181 L +s +.5 .00978 m +.50375 .00978 L +s +.25 Mabswid +.5 0 m +.5 .61803 L +s +.5 Mabswid +[ .04 ] 0 setdash +.02381 .10586 m +.02846 .10586 L +.03279 .10586 L +.03754 .10586 L +.04262 .10586 L +.04518 .10586 L +.04795 .10586 L +.053 .10586 L +.05791 .10586 L +.06244 .10586 L +.06747 .10586 L +.07218 .10586 L +.07734 .10586 L +.0829 .10586 L +.08567 .10586 L +.0887 .10586 L +.09422 .10586 L +.09959 .10586 L +.10458 .10586 L +.10966 .10586 L +.11515 .10586 L +.12033 .10586 L +.1251 .10586 L +.12942 .10586 L +.13415 .10586 L +.13909 .10587 L +.14371 .10587 L +.14872 .10587 L +.15416 .10588 L +.1593 .10588 L +.16406 .10589 L +.17306 .10591 L +.1776 .10593 L +.18262 .10594 L +.18753 .10597 L +.19271 .106 L +.20196 .10608 L +.20712 .10614 L +.21193 .10621 L +.21715 .1063 L +.22282 .10643 L +.2283 .10659 L +.23334 .10676 L +.24328 .10722 L +.25231 .10782 L +.26187 .10869 L +.2713 .10988 L +.28144 .11162 L +.29101 .11383 L +.29975 .11645 L +Mistroke +.30962 .12025 L +.31878 .12471 L +.32946 .13126 L +.33951 .13894 L +.36008 .15987 L +.3787 .18532 L +.4173 .25433 L +.43688 .29212 L +.44725 .31075 L +.45835 .32852 L +.46906 .34269 L +.47882 .35245 L +.48352 .35593 L +.48599 .35744 L +.48862 .35877 L +.49091 .35972 L +.49213 .36013 L +.49344 .36052 L +.49464 .36081 L +.49574 .36102 L +.49679 .36118 L +.49789 .3613 L +.49913 .36137 L +.49983 .36139 L +.50048 .36138 L +.50166 .36133 L +.50291 .36122 L +.50403 .36106 L +.50508 .36086 L +.50746 .36026 L +.51004 .35935 L +.51239 .35829 L +.51768 .35513 L +.52219 .35159 L +.52711 .34691 L +.53606 .33633 L +.55581 .30542 L +.5768 .26584 L +.61452 .19608 L +.63385 .16749 L +.6438 .15536 L +.65469 .14409 L +.67471 .12851 L +.68563 .12243 L +.6958 .11804 L +.70631 .11457 L +.71623 .1121 L +.72515 .11043 L +.73481 .10907 L +.74426 .1081 L +Mistroke +.75467 .10734 L +.7599 .10706 L +.76553 .10681 L +.77081 .10662 L +.7757 .10647 L +.78582 .10625 L +.79116 .10616 L +.79685 .10609 L +.80228 .10604 L +.80739 .106 L +.81695 .10595 L +.82161 .10593 L +.82672 .10591 L +.83206 .1059 L +.83704 .10589 L +.84162 .10588 L +.84596 .10588 L +.85096 .10587 L +.85552 .10587 L +.86011 .10587 L +.86518 .10587 L +.87047 .10586 L +.87544 .10586 L +.88007 .10586 L +.88431 .10586 L +.88897 .10586 L +.89387 .10586 L +.89887 .10586 L +.90342 .10586 L +.90867 .10586 L +.91362 .10586 L +.91821 .10586 L +.92244 .10586 L +.92708 .10586 L +.93199 .10586 L +.93693 .10586 L +.94144 .10586 L +.94664 .10586 L +.95158 .10586 L +.95613 .10586 L +.96035 .10586 L +.96498 .10586 L +.9699 .10586 L +.97314 .10586 L +.97619 .10586 L +Mfstroke +[ .01 ] 0 setdash +.02381 .10549 m +.03279 .1054 L +.04262 .10528 L +.06244 .10493 L +.07298 .10467 L +.08426 .10434 L +.10458 .10351 L +.1148 .10295 L +.12589 .10223 L +.14603 .10052 L +.16586 .09824 L +.18689 .09505 L +.22473 .08724 L +.24577 .0822 L +.26501 .07801 L +.27452 .07646 L +.27712 .07613 L +.2799 .07584 L +.28252 .07562 L +.28489 .07547 L +.28608 .07542 L +.28733 .07538 L +.28839 .07536 L +.28957 .07535 L +.29083 .07536 L +.29153 .07537 L +.29218 .07539 L +.29343 .07543 L +.29462 .0755 L +.29573 .07557 L +.2969 .07567 L +.29901 .07589 L +.30128 .07621 L +.30379 .07665 L +.3087 .07782 L +.31388 .07954 L +.3183 .08145 L +.32313 .08404 L +.33394 .09199 L +.34399 .10241 L +.35451 .11682 L +.36445 .13399 L +.38303 .17565 L +.4215 .29388 L +.44099 .35894 L +.45132 .39072 L +.46242 .4206 L +.47306 .44358 L +.4781 .45216 L +.48278 .45865 L +Mistroke +.48745 .46365 L +.48992 .46568 L +.49255 .46736 L +.49375 .46796 L +.49506 .46849 L +.49629 .46888 L +.49742 .46914 L +.49844 .4693 L +.49956 .46938 L +.50073 .46937 L +.50182 .46927 L +.50309 .46904 L +.50373 .46888 L +.50443 .46867 L +.50685 .46767 L +.5082 .46693 L +.50966 .46598 L +.5123 .46387 L +.51748 .45833 L +.52222 .45167 L +.53127 .435 L +.54078 .41253 L +.57894 .29237 L +.60024 .22296 L +.61956 .16911 L +.62922 .14679 L +.63968 .12642 L +.64949 .11089 L +.65865 .09936 L +.66814 .09021 L +.6736 .08612 L +.67857 .08307 L +.68343 .08065 L +.68873 .07861 L +.69163 .07773 L +.69432 .07705 L +.69709 .07648 L +.69963 .07607 L +.70188 .07579 L +.70425 .07557 L +.70548 .07549 L +.70663 .07543 L +.70789 .07538 L +.7086 .07537 L +.70924 .07536 L +.71039 .07535 L +.71146 .07536 L +.71264 .07538 L +.71388 .07542 L +.71496 .07547 L +Mistroke +.71597 .07552 L +.71827 .07568 L +.72092 .07592 L +.72345 .0762 L +.72819 .07685 L +.73886 .07877 L +.77707 .08766 L +.79841 .09231 L +.81774 .09582 L +.8379 .09873 L +.85689 .10081 L +.87698 .10243 L +.89546 .10351 L +.9143 .10429 L +.92499 .10462 L +.93497 .10487 L +.94543 .10508 L +.95533 .10525 L +.97389 .10547 L +.97619 .10549 L +Mfstroke +.02381 .10788 m +.04262 .10824 L +.0522 .1084 L +.06244 .10854 L +.0679 .10859 L +.07047 .10861 L +.07286 .10863 L +.07525 .10864 L +.07651 .10864 L +.07715 .10864 L +.07784 .10864 L +.079 .10865 L +.08008 .10865 L +.08137 .10865 L +.08255 .10864 L +.08326 .10864 L +.08391 .10864 L +.08535 .10864 L +.08669 .10863 L +.08795 .10862 L +.09078 .1086 L +.09385 .10856 L +.09656 .10852 L +.09944 .10847 L +.10458 .10834 L +.10954 .10819 L +.11406 .10801 L +.12422 .10746 L +.13363 .10675 L +.14255 .10586 L +.15221 .10463 L +.16246 .10296 L +.18088 .09888 L +.20035 .09281 L +.21863 .08532 L +.25732 .06471 L +.27697 .05384 L +.28736 .04899 L +.29307 .04683 L +.29587 .04594 L +.29846 .04523 L +.30092 .04467 L +.30362 .04418 L +.30502 .04399 L +.30634 .04385 L +.30705 .04379 L +.30772 .04374 L +.3085 .0437 L +.30921 .04367 L +.31039 .04366 L +Mistroke +.31164 .04368 L +.31282 .04374 L +.31389 .04383 L +.31515 .04397 L +.31652 .04418 L +.31899 .04468 L +.3213 .04533 L +.32383 .04624 L +.32894 .04874 L +.33367 .05193 L +.33808 .05572 L +.34856 .06816 L +.35848 .08483 L +.36738 .10415 L +.37704 .12995 L +.39686 .19784 L +.41788 .28709 L +.45568 .45237 L +.46513 .48543 L +.47507 .51332 L +.48027 .52464 L +.48302 .52964 L +.48596 .53418 L +.48867 .53763 L +.49113 .54014 L +.49232 .54113 L +.4936 .54205 L +.4948 .54276 L +.49594 .54329 L +.49717 .54373 L +.4983 .54399 L +.49952 .54412 L +.50021 .54413 L +.50084 .5441 L +.5019 .54395 L +.50306 .54365 L +.50428 .5432 L +.50543 .54263 L +.50804 .54085 L +.51044 .5386 L +.51585 .53147 L +.52075 .52262 L +.5261 .51045 L +.53691 .47879 L +.55649 .40276 L +.57744 .30836 L +.59732 .22113 L +.6189 .14226 L +.62899 .11326 L +.63968 .08849 L +Mistroke +.6488 .07211 L +.65885 .05884 L +.66405 .05378 L +.669 .05003 L +.67343 .04746 L +.67593 .04634 L +.67828 .04547 L +.68103 .04468 L +.68352 .04417 L +.68492 .04396 L +.6862 .04382 L +.68688 .04376 L +.68762 .04372 L +.68839 .04368 L +.68911 .04366 L +.69041 .04366 L +.69165 .0437 L +.69275 .04377 L +.69396 .04387 L +.69527 .04402 L +.69666 .04422 L +.69916 .04468 L +.70405 .04592 L +.70854 .0474 L +.71864 .05167 L +.73693 .06142 L +.75747 .07313 L +.77657 .08308 L +.79619 .09153 L +.8147 .09767 L +.82453 .10023 L +.83517 .10252 L +.84478 .10418 L +.85377 .10543 L +.86324 .10647 L +.87366 .10732 L +.88381 .10791 L +.8895 .10815 L +.89471 .10832 L +.89949 .10844 L +.90212 .1085 L +.90459 .10854 L +.9069 .10857 L +.90939 .1086 L +.91166 .10862 L +.91374 .10863 L +.91495 .10864 L +.91624 .10864 L +.91745 .10864 L +.91856 .10865 L +Mistroke +.91986 .10865 L +.9206 .10865 L +.92127 .10865 L +.92252 .10864 L +.92384 .10864 L +.9251 .10864 L +.92645 .10863 L +.92891 .10861 L +.93449 .10857 L +.93972 .10851 L +.94459 .10845 L +.95561 .10827 L +.9757 .10789 L +.97619 .10788 L +Mfstroke +[ ] 0 setdash +.02381 .10877 m +.06244 .11114 L +.08255 .11241 L +.0932 .11301 L +.09905 .11329 L +.10458 .11352 L +.10972 .11369 L +.11263 .11376 L +.11531 .11381 L +.11756 .11385 L +.11884 .11386 L +.12004 .11387 L +.12131 .11387 L +.12246 .11387 L +.1231 .11387 L +.1238 .11387 L +.12507 .11386 L +.12636 .11385 L +.12758 .11384 L +.12986 .11379 L +.13231 .11373 L +.13496 .11364 L +.13975 .11341 L +.14415 .11312 L +.14885 .11271 L +.15389 .11216 L +.16298 .11083 L +.17378 .10859 L +.18364 .10584 L +.20272 .0983 L +.21351 .0926 L +.22348 .08636 L +.26275 .05398 L +.28244 .03587 L +.29107 .02866 L +.3005 .02195 L +.30506 .01933 L +.30993 .0171 L +.31262 .01615 L +.31507 .01548 L +.31625 .01523 L +.31753 .01501 L +.31873 .01486 L +.31985 .01477 L +.32105 .01472 L +.32234 .01473 L +.32356 .0148 L +.32467 .01492 L +.32598 .01512 L +.32739 .01543 L +Mistroke +.32998 .01622 L +.33267 .01738 L +.33554 .019 L +.3407 .02302 L +.34608 .02879 L +.35102 .03563 L +.36216 .05685 L +.37198 .08261 L +.38234 .11713 L +.40202 .20212 L +.42036 .29869 L +.43904 .40289 L +.45932 .50538 L +.47038 .54952 L +.47525 .56527 L +.4806 .5797 L +.48565 .59028 L +.48795 .59411 L +.49037 .59742 L +.49162 .59885 L +.49298 .60018 L +.49423 .6012 L +.49536 .60195 L +.49671 .60263 L +.49745 .6029 L +.49815 .6031 L +.49939 .6033 L +.50009 .60332 L +.50074 .60328 L +.502 .60307 L +.50319 .60267 L +.50426 .60216 L +.50543 .60144 L +.50804 .5992 L +.51046 .59637 L +.51486 .58936 L +.51954 .57936 L +.52935 .55044 L +.54019 .50752 L +.58036 .29467 L +.59882 .19807 L +.60928 .15043 L +.61902 .11219 L +.6295 .07829 L +.63903 .05418 L +.64923 .03525 L +.65483 .0277 L +.66013 .02228 L +.66475 .01882 L +.66737 .01735 L +Mistroke +.66983 .01629 L +.67116 .01583 L +.67242 .01547 L +.67357 .01521 L +.67479 .01499 L +.67611 .01483 L +.67733 .01474 L +.67809 .01472 L +.67879 .01472 L +.68011 .01476 L +.68119 .01485 L +.68236 .015 L +.68359 .0152 L +.68473 .01544 L +.68678 .01597 L +.68898 .01669 L +.69399 .01885 L +.69856 .02137 L +.71766 .03596 L +.73843 .05507 L +.75782 .07228 L +.77923 .08815 L +.78898 .09401 L +.7995 .09934 L +.80935 .10343 L +.81851 .1065 L +.82809 .10903 L +.83358 .1102 L +.83857 .11109 L +.84347 .11182 L +.84878 .11247 L +.85438 .113 L +.85967 .11337 L +.86203 .1135 L +.86457 .11362 L +.86676 .1137 L +.86915 .11377 L +.8706 .1138 L +.87194 .11383 L +.87323 .11385 L +.87388 .11385 L +.87459 .11386 L +.87529 .11387 L +.87594 .11387 L +.8772 .11387 L +.87835 .11387 L +.87956 .11387 L +.88088 .11386 L +.88208 .11385 L +.88346 .11383 L +Mistroke +.88476 .11381 L +.88961 .11371 L +.89235 .11362 L +.89488 .11354 L +.90061 .11331 L +.91933 .1123 L +.93995 .11098 L +.97619 .10877 L +Mfstroke +0 0 m +1 0 L +1 .61803 L +0 .61803 L +closepath +clip +newpath +% End of Graphics +MathPictureEnd + +%%PSTrailer +end +grestore + +%%Trailer +%%EOF diff --git a/doximages/Metz.jpg b/doximages/Metz.jpg new file mode 100644 index 0000000000..f58004054b Binary files /dev/null and b/doximages/Metz.jpg differ diff --git a/doximages/MetzFWHM.eps b/doximages/MetzFWHM.eps new file mode 100644 index 0000000000..6739469095 --- /dev/null +++ b/doximages/MetzFWHM.eps @@ -0,0 +1,1589 @@ +%!PS-Adobe-2.0 EPSF-1.2 +%%BoundingBox: 88 4 376 182 +%%HiResBoundingBox: 88 4 376 181.938 +%%Creator: (Mathematica 4.1 for Microsoft Windows) +%%CreationDate: (Thursday, May 31, 2001) (0:50:16) +%%Title: Clipboard +%%DocumentNeededResources: font Courier +%%DocumentSuppliedResources: +%%DocumentNeededFonts: Courier +%%DocumentSuppliedFonts: +%%DocumentFonts: Courier +%%EndComments +0 185.938 translate 1 -1 scale +gsave +150 dict begin +/Mfixwid true def +/Mrot 0 def +/Mpstart { + MathPictureStart +} bind def +/Mpend { + MathPictureEnd +} bind def +/Mscale { + 0 1 0 1 + 5 -1 roll + MathScale +} bind def +/Plain /Courier findfont def +/Bold /Courier-Bold findfont def +/Italic /Courier-Oblique findfont def +/MathPictureStart { + /Mimatrix + matrix currentmatrix + def + gsave + newpath + Mleft + Mbottom + translate + /Mtmatrix + matrix currentmatrix + def + Plain + Mfontsize scalefont + setfont + 0 setgray + 0 setlinewidth +} bind def +/MathPictureEnd { + grestore +} bind def +/MathSubStart { + Momatrix + Mgmatrix Mtmatrix + Mleft Mbottom + Mwidth Mheight + 9 -2 roll + moveto + Mtmatrix setmatrix + currentpoint + Mgmatrix setmatrix + 11 -2 roll + moveto + Mtmatrix setmatrix + currentpoint + 2 copy translate + /Mtmatrix matrix currentmatrix def + /Mleft 0 def + /Mbottom 0 def + 3 -1 roll + exch sub + /Mheight exch def + sub + /Mwidth exch def +} bind def +/MathSubEnd { + /Mheight exch def + /Mwidth exch def + /Mbottom exch def + /Mleft exch def + /Mtmatrix exch def + dup setmatrix + /Mgmatrix exch def + /Momatrix exch def +} bind def +/Mdot { + moveto + 0 0 rlineto + stroke +} bind def +/Mtetra { + moveto + lineto + lineto + lineto + fill +} bind def +/Metetra { + moveto + lineto + lineto + lineto + closepath + gsave + fill + grestore + 0 setgray + stroke +} bind def +/Mistroke { + flattenpath + 0 0 0 + { + 4 2 roll + pop pop + } + { + 4 -1 roll + 2 index + sub dup mul + 4 -1 roll + 2 index + sub dup mul + add sqrt + 4 -1 roll + add + 3 1 roll + } + { + stop + } + { + stop + } + pathforall + pop pop + currentpoint + stroke + moveto + currentdash + 3 -1 roll + add + setdash +} bind def +/Mfstroke { + stroke + currentdash + pop 0 + setdash +} bind def +/Mrotsboxa { + gsave + dup + /Mrot + exch def + Mrotcheck + Mtmatrix + dup + setmatrix + 7 1 roll + 4 index + 4 index + translate + rotate + 3 index + -1 mul + 3 index + -1 mul + translate + /Mtmatrix + matrix + currentmatrix + def + grestore + Msboxa + 3 -1 roll + /Mtmatrix + exch def + /Mrot + 0 def +} bind def +/Msboxa { + newpath + 5 -1 roll + Mvboxa + pop + Mboxout + 6 -1 roll + 5 -1 roll + 4 -1 roll + Msboxa1 + 5 -3 roll + Msboxa1 + Mboxrot + [ + 7 -2 roll + 2 copy + [ + 3 1 roll + 10 -1 roll + 9 -1 roll + ] + 6 1 roll + 5 -2 roll + ] +} bind def +/Msboxa1 { + sub + 2 div + dup + 2 index + 1 add + mul + 3 -1 roll + -1 add + 3 -1 roll + mul +} bind def +/Mvboxa { + Mfixwid + { + Mvboxa1 + } + { + dup + Mwidthcal + 0 exch + { + add + } + forall + exch + Mvboxa1 + 4 index + 7 -1 roll + add + 4 -1 roll + pop + 3 1 roll + } + ifelse +} bind def +/Mvboxa1 { + gsave + newpath + [ true + 3 -1 roll + { + Mbbox + 5 -1 roll + { + 0 + 5 1 roll + } + { + 7 -1 roll + exch sub + (m) stringwidth pop + .3 mul + sub + 7 1 roll + 6 -1 roll + 4 -1 roll + Mmin + 3 -1 roll + 5 index + add + 5 -1 roll + 4 -1 roll + Mmax + 4 -1 roll + } + ifelse + false + } + forall + { stop } if + counttomark + 1 add + 4 roll + ] + grestore +} bind def +/Mbbox { + 0 0 moveto + false charpath + flattenpath + pathbbox + newpath +} bind def +/Mmin { + 2 copy + gt + { exch } if + pop +} bind def +/Mmax { + 2 copy + lt + { exch } if + pop +} bind def +/Mrotshowa { + dup + /Mrot + exch def + Mrotcheck + Mtmatrix + dup + setmatrix + 7 1 roll + 4 index + 4 index + translate + rotate + 3 index + -1 mul + 3 index + -1 mul + translate + /Mtmatrix + matrix + currentmatrix + def + Mgmatrix setmatrix + Mshowa + /Mtmatrix + exch def + /Mrot 0 def +} bind def +/Mshowa { + 4 -2 roll + moveto + 2 index + Mtmatrix setmatrix + Mvboxa + 7 1 roll + Mboxout + 6 -1 roll + 5 -1 roll + 4 -1 roll + Mshowa1 + 4 1 roll + Mshowa1 + rmoveto + currentpoint + Mfixwid + { + Mshowax + } + { + Mshoway + } + ifelse + pop pop pop pop + Mgmatrix setmatrix +} bind def +/Mshowax { + 0 1 + 4 index length + -1 add + { + 2 index + 4 index + 2 index + get + 3 index + add + moveto + 4 index + exch get + show + } for +} bind def +/Mshoway { + 3 index + Mwidthcal + 5 1 roll + 0 1 + 4 index length + -1 add + { + 2 index + 4 index + 2 index + get + 3 index + add + moveto + 4 index + exch get + [ + 6 index + aload + length + 2 add + -1 roll + { + pop + Strform + stringwidth + pop + neg + exch + add + 0 rmoveto + } + exch + kshow + cleartomark + } for + pop +} bind def +/Mwidthcal { + [ + exch + { + Mwidthcal1 + } + forall + ] + [ + exch + dup + Maxlen + -1 add + 0 1 + 3 -1 roll + { + [ + exch + 2 index + { + 1 index + Mget + exch + } + forall + pop + Maxget + exch + } + for + pop + ] + Mreva +} bind def +/Mreva { + [ + exch + aload + length + -1 1 + {1 roll} + for + ] +} bind def +/Mget { + 1 index + length + -1 add + 1 index + ge + { + get + } + { + pop pop + 0 + } + ifelse +} bind def +/Maxlen { + [ + exch + { + length + } + forall + Maxget +} bind def +/Maxget { + counttomark + -1 add + 1 1 + 3 -1 roll + { + pop + Mmax + } + for + exch + pop +} bind def +/Mwidthcal1 { + [ + exch + { + Strform + stringwidth + pop + } + forall + ] +} bind def +/Strform { + /tem (x) def + tem 0 + 3 -1 roll + put + tem +} bind def +/Mshowa1 { + 2 copy + add + 4 1 roll + sub + mul + sub + -2 div +} bind def +/MathScale { + Mwidth + Mheight + Mlp + translate + scale + /yscale exch def + /ybias exch def + /xscale exch def + /xbias exch def + /Momatrix + xscale yscale matrix scale + xbias ybias matrix translate + matrix concatmatrix def + /Mgmatrix + matrix currentmatrix + def +} bind def +/Mlp { + 3 copy + Mlpfirst + { + Mnodistort + { + Mmin + dup + } if + 4 index + 2 index + 2 index + Mlprun + 11 index + 11 -1 roll + 10 -4 roll + Mlp1 + 8 index + 9 -5 roll + Mlp1 + 4 -1 roll + and + { exit } if + 3 -1 roll + pop pop + } loop + exch + 3 1 roll + 7 -3 roll + pop pop pop +} bind def +/Mlpfirst { + 3 -1 roll + dup length + 2 copy + -2 add + get + aload + pop pop pop + 4 -2 roll + -1 add + get + aload + pop pop pop + 6 -1 roll + 3 -1 roll + 5 -1 roll + sub + dup /MsaveAx exch def + div + 4 1 roll + exch sub + dup /MsaveAy exch def + div +} bind def +/Mlprun { + 2 copy + 4 index + 0 get + dup + 4 1 roll + Mlprun1 + 3 copy + 8 -2 roll + 9 -1 roll + { + 3 copy + Mlprun1 + 3 copy + 11 -3 roll + /gt Mlpminmax + 8 3 roll + 11 -3 roll + /lt Mlpminmax + 8 3 roll + } forall + pop pop pop pop + 3 1 roll + pop pop + aload pop + 5 -1 roll + aload pop + exch + 6 -1 roll + Mlprun2 + 8 2 roll + 4 -1 roll + Mlprun2 + 6 2 roll + 3 -1 roll + Mlprun2 + 4 2 roll + exch + Mlprun2 + 6 2 roll +} bind def +/Mlprun1 { + aload pop + exch + 6 -1 roll + 5 -1 roll + mul add + 4 -2 roll + mul + 3 -1 roll + add +} bind def +/Mlprun2 { + 2 copy + add 2 div + 3 1 roll + exch sub +} bind def +/Mlpminmax { + cvx + 2 index + 6 index + 2 index + exec + { + 7 -3 roll + 4 -1 roll + } if + 1 index + 5 index + 3 -1 roll + exec + { + 4 1 roll + pop + 5 -1 roll + aload + pop pop + 4 -1 roll + aload pop + [ + 8 -2 roll + pop + 5 -2 roll + pop + 6 -2 roll + pop + 5 -1 roll + ] + 4 1 roll + pop + } + { + pop pop pop + } ifelse +} bind def +/Mlp1 { + 5 index + 3 index sub + 5 index + 2 index mul + 1 index + le + 1 index + 0 le + or + dup + not + { + 1 index + 3 index div + .99999 mul + 8 -1 roll + pop + 7 1 roll + } + if + 8 -1 roll + 2 div + 7 -2 roll + pop sub + 5 index + 6 -3 roll + pop pop + mul sub + exch +} bind def +/intop 0 def +/inrht 0 def +/inflag 0 def +/outflag 0 def +/xadrht 0 def +/xadlft 0 def +/yadtop 0 def +/yadbot 0 def +/Minner { + outflag + 1 + eq + { + /outflag 0 def + /intop 0 def + /inrht 0 def + } if + 5 index + gsave + Mtmatrix setmatrix + Mvboxa pop + grestore + 3 -1 roll + pop + dup + intop + gt + { + /intop + exch def + } + { pop } + ifelse + dup + inrht + gt + { + /inrht + exch def + } + { pop } + ifelse + pop + /inflag + 1 def +} bind def +/Mouter { + /xadrht 0 def + /xadlft 0 def + /yadtop 0 def + /yadbot 0 def + inflag + 1 eq + { + dup + 0 lt + { + dup + intop + mul + neg + /yadtop + exch def + } if + dup + 0 gt + { + dup + intop + mul + /yadbot + exch def + } + if + pop + dup + 0 lt + { + dup + inrht + mul + neg + /xadrht + exch def + } if + dup + 0 gt + { + dup + inrht + mul + /xadlft + exch def + } if + pop + /outflag 1 def + } + { pop pop} + ifelse + /inflag 0 def + /inrht 0 def + /intop 0 def +} bind def +/Mboxout { + outflag + 1 + eq + { + 4 -1 + roll + xadlft + leadjust + add + sub + 4 1 roll + 3 -1 + roll + yadbot + leadjust + add + sub + 3 1 + roll + exch + xadrht + leadjust + add + add + exch + yadtop + leadjust + add + add + /outflag 0 def + /xadlft 0 def + /yadbot 0 def + /xadrht 0 def + /yadtop 0 def + } if +} bind def +/leadjust { + (m) stringwidth pop + .5 mul +} bind def +/Mrotcheck { + dup + 90 + eq + { + yadbot + /yadbot + xadrht + def + /xadrht + yadtop + def + /yadtop + xadlft + def + /xadlft + exch + def + } + if + dup + cos + 1 index + sin + Checkaux + dup + cos + 1 index + sin neg + exch + Checkaux + 3 1 roll + pop pop +} bind def +/Checkaux { + 4 index + exch + 4 index + mul + 3 1 roll + mul add + 4 1 roll +} bind def +/Mboxrot { + Mrot + 90 eq + { + brotaux + 4 2 + roll + } + if + Mrot + 180 eq + { + 4 2 + roll + brotaux + 4 2 + roll + brotaux + } + if + Mrot + 270 eq + { + 4 2 + roll + brotaux + } + if +} bind def +/brotaux { + neg + exch + neg +} bind def +/Mabsproc { + 0 + matrix defaultmatrix + dtransform idtransform + dup mul exch + dup mul + add sqrt +} bind def +/Mabswid { + Mabsproc + setlinewidth +} bind def +/Mabsdash { + exch + [ + exch + { + Mabsproc + } + forall + ] + exch + setdash +} bind def +/MBeginOrig { Momatrix concat} bind def +/MEndOrig { Mgmatrix setmatrix} bind def +/sampledsound where +{ pop} +{ /sampledsound { +exch +pop +exch +5 1 roll +mul +4 idiv +mul +2 idiv +exch pop +exch +/Mtempproc exch def +{ Mtempproc pop } +repeat +} bind def +} ifelse +% Here are the short operators +/g { setgray} bind def +/k { setcmykcolor} bind def +/m { moveto} bind def +/p { gsave} bind def +/r { setrgbcolor} bind def +/w { setlinewidth} bind def +/C { curveto} bind def +/F { fill} bind def +/L { lineto} bind def +/P { grestore} bind def +/s { stroke} bind def + +/MFill { + 0 0 moveto + Mwidth 0 lineto + Mwidth Mheight lineto + 0 Mheight lineto + fill +} bind def + +/MPlotRegion { + 3 index + Mwidth mul + 2 index + Mheight mul + translate + exch sub + Mheight mul + /Mheight + exch def + exch sub + Mwidth mul + /Mwidth + exch def +} bind def + +/Mcharproc +{ + currentfile + (x) + readhexstring + pop + 0 get + exch + div +} bind def + +/Mshadeproc +{ + dup + 3 1 + roll + { + dup + Mcharproc + 3 1 + roll + } repeat + 1 eq + { + setgray + } + { + 3 eq + { + setrgbcolor + } + { + setcmykcolor + } ifelse + } ifelse +} bind def + +/Mrectproc +{ + 3 index + 2 index + moveto + 2 index + 3 -1 + roll + lineto + dup + 3 1 + roll + lineto + lineto + fill +} bind def + +/_Mcolorimage +{ + 7 1 + roll + pop + pop + matrix + invertmatrix + concat + 2 exch exp + 1 sub + 3 1 roll + 1 1 + 2 index + { + 1 1 + 4 index + { + dup + 1 sub + exch + 2 index + dup + 1 sub + exch + 7 index + 9 index + Mshadeproc + Mrectproc + } for + pop + } for + pop pop pop pop +} bind def + +/_Mimage +{ + pop + matrix + invertmatrix + concat + 2 exch exp + 1 sub + 3 1 roll + 1 1 + 2 index + { + 1 1 + 4 index + { + dup + 1 sub + exch + 2 index + dup + 1 sub + exch + 7 index + Mcharproc + setgray + Mrectproc + } for + pop + } for + pop pop pop +} bind def + +/Mimage { + 4 index + 4 index + mul 1600 gt + { image } + { _Mimage } + ifelse +} def + +/Mcolorimage { + 6 index + 6 index + mul 1600 gt + { colorimage } + { _Mcolorimage } + ifelse +} def +/MacintoshRomanEncoding [ + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /grave/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute + /agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave + /ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute + /ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis + /dagger/degree/cent/sterling/section/bullet/paragraph/germandbls + /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash + /.notdef/plusminus/.notdef/.notdef/yen/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/ordfeminine/ring/.notdef/ae/oslash + /questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef/guillemotleft + /guillemotright/ellipsis/.notdef/Agrave/Atilde/Otilde/OE/oe + /endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/.notdef + /ydieresis/Ydieresis/.notdef/currency/guilsinglleft/guilsinglright/.notdef/.notdef + /daggerdbl/dotaccent/quotesinglbase/quotedblbase/perthousand/Acircumflex/Ecircumflex/Aacute + /Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex + /.notdef/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde + /macron/.notdef/.notdef/.notdef/ogonek/.notdef/.notdef/.notdef +] def +/WindowsANSIEncoding [ + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /grave/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl + /circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef/Zcaron/.notdef + /.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/.notdef/zcaron/Ydieresis + /.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section + /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron + /degree/plusminus/twosuperior/threesuperior/acute/.notdef/paragraph/dotaccent + /ogonek/onesuperior/ring/guillemotright/onequarter/onehalf/threequarters/questiondown + /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis + /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply + /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls + /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla + /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide + /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis +] def +/Mnodistort true def +1.000000 1.000000 scale +88.000000 181.937500 translate +1.000000 -1.000000 scale +0.000000 0.000000 translate +/Mleft 0.000000 def +/Mbottom 0.000000 def +/Mwidth 288.000000 def +/Mheight 177.937500 def +0 setgray +0 setlinewidth +/Courier findfont 12 scalefont setfont +/Mfontsize 12 def +/Plain /Courier findfont def + +%! +%%Creator: Mathematica +%%AspectRatio: .61803 +MathPictureStart +/Mabs { +Mgmatrix idtransform +Mtmatrix dtransform +} bind def +/Mabsadd { Mabs +3 -1 roll add +3 1 roll add +exch } bind def +%% Graphics +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10 scalefont setfont +% Scaling calculations +0.0238095 0.0952381 -0.942996 1.54632 [ +[.21429 .59082 -3 -9 ] +[.21429 .59082 3 0 ] +[.40476 .59082 -3 -9 ] +[.40476 .59082 3 0 ] +[.59524 .59082 -3 -9 ] +[.59524 .59082 3 0 ] +[.78571 .59082 -3 -9 ] +[.78571 .59082 3 0 ] +[.97619 .59082 -6 -9 ] +[.97619 .59082 6 0 ] +[1.025 .60332 0 -6.25 ] +[1.025 .60332 34 6.25 ] +[.01131 .06211 -24 -4.5 ] +[.01131 .06211 0 4.5 ] +[.01131 .13943 -18 -4.5 ] +[.01131 .13943 0 4.5 ] +[.01131 .21674 -24 -4.5 ] +[.01131 .21674 0 4.5 ] +[.01131 .29406 -18 -4.5 ] +[.01131 .29406 0 4.5 ] +[.01131 .37137 -24 -4.5 ] +[.01131 .37137 0 4.5 ] +[.01131 .44869 -18 -4.5 ] +[.01131 .44869 0 4.5 ] +[.01131 .526 -24 -4.5 ] +[.01131 .526 0 4.5 ] +[.02381 .64303 -38.0938 0 ] +[.02381 .64303 38.0938 12.5 ] +[ 0 0 0 0 ] +[ 1 .61803 0 0 ] +] MathScale +% Start of Graphics +1 setlinecap +1 setlinejoin +newpath +0 g +.25 Mabswid +[ ] 0 setdash +.21429 .60332 m +.21429 .60957 L +s +[(2)] .21429 .59082 0 1 Mshowa +.40476 .60332 m +.40476 .60957 L +s +[(4)] .40476 .59082 0 1 Mshowa +.59524 .60332 m +.59524 .60957 L +s +[(6)] .59524 .59082 0 1 Mshowa +.78571 .60332 m +.78571 .60957 L +s +[(8)] .78571 .59082 0 1 Mshowa +.97619 .60332 m +.97619 .60957 L +s +[(10)] .97619 .59082 0 1 Mshowa +.125 Mabswid +.07143 .60332 m +.07143 .60707 L +s +.11905 .60332 m +.11905 .60707 L +s +.16667 .60332 m +.16667 .60707 L +s +.2619 .60332 m +.2619 .60707 L +s +.30952 .60332 m +.30952 .60707 L +s +.35714 .60332 m +.35714 .60707 L +s +.45238 .60332 m +.45238 .60707 L +s +.5 .60332 m +.5 .60707 L +s +.54762 .60332 m +.54762 .60707 L +s +.64286 .60332 m +.64286 .60707 L +s +.69048 .60332 m +.69048 .60707 L +s +.7381 .60332 m +.7381 .60707 L +s +.83333 .60332 m +.83333 .60707 L +s +.88095 .60332 m +.88095 .60707 L +s +.92857 .60332 m +.92857 .60707 L +s +.25 Mabswid +0 .60332 m +1 .60332 L +s +gsave +1.025 .60332 -61 -10.25 Mabsadd m +1 1 Mabs scale +currentpoint translate +0 20.5 translate 1 -1 scale +63.000 12.750 moveto +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10.000 scalefont +[1 0 0 -1 0 0 ] makefont setfont +0.000 0.000 0.000 setrgbcolor +0.000 0.000 rmoveto +63.000 12.750 moveto +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10.000 scalefont +[1 0 0 -1 0 0 ] makefont setfont +0.000 0.000 0.000 setrgbcolor +(Power) show +93.000 12.750 moveto +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10.000 scalefont +[1 0 0 -1 0 0 ] makefont setfont +0.000 0.000 0.000 setrgbcolor +0.000 0.000 rmoveto +1.000 setlinewidth +grestore +.02381 .06211 m +.03006 .06211 L +s +[(0.65)] .01131 .06211 1 0 Mshowa +.02381 .13943 m +.03006 .13943 L +s +[(0.7)] .01131 .13943 1 0 Mshowa +.02381 .21674 m +.03006 .21674 L +s +[(0.75)] .01131 .21674 1 0 Mshowa +.02381 .29406 m +.03006 .29406 L +s +[(0.8)] .01131 .29406 1 0 Mshowa +.02381 .37137 m +.03006 .37137 L +s +[(0.85)] .01131 .37137 1 0 Mshowa +.02381 .44869 m +.03006 .44869 L +s +[(0.9)] .01131 .44869 1 0 Mshowa +.02381 .526 m +.03006 .526 L +s +[(0.95)] .01131 .526 1 0 Mshowa +.125 Mabswid +.02381 .07757 m +.02756 .07757 L +s +.02381 .09304 m +.02756 .09304 L +s +.02381 .1085 m +.02756 .1085 L +s +.02381 .12396 m +.02756 .12396 L +s +.02381 .15489 m +.02756 .15489 L +s +.02381 .17035 m +.02756 .17035 L +s +.02381 .18581 m +.02756 .18581 L +s +.02381 .20128 m +.02756 .20128 L +s +.02381 .2322 m +.02756 .2322 L +s +.02381 .24767 m +.02756 .24767 L +s +.02381 .26313 m +.02756 .26313 L +s +.02381 .27859 m +.02756 .27859 L +s +.02381 .30952 m +.02756 .30952 L +s +.02381 .32498 m +.02756 .32498 L +s +.02381 .34045 m +.02756 .34045 L +s +.02381 .35591 m +.02756 .35591 L +s +.02381 .38684 m +.02756 .38684 L +s +.02381 .4023 m +.02756 .4023 L +s +.02381 .41776 m +.02756 .41776 L +s +.02381 .43322 m +.02756 .43322 L +s +.02381 .46415 m +.02756 .46415 L +s +.02381 .47961 m +.02756 .47961 L +s +.02381 .49508 m +.02756 .49508 L +s +.02381 .51054 m +.02756 .51054 L +s +.02381 .54147 m +.02756 .54147 L +s +.02381 .55693 m +.02756 .55693 L +s +.02381 .57239 m +.02756 .57239 L +s +.02381 .58786 m +.02756 .58786 L +s +.02381 .04665 m +.02756 .04665 L +s +.02381 .03118 m +.02756 .03118 L +s +.02381 .01572 m +.02756 .01572 L +s +.02381 .00026 m +.02756 .00026 L +s +.25 Mabswid +.02381 0 m +.02381 .61803 L +s +gsave +.02381 .64303 -99.0938 -4 Mabsadd m +1 1 Mabs scale +currentpoint translate +0 20.5 translate 1 -1 scale +63.000 12.750 moveto +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10.000 scalefont +[1 0 0 -1 0 0 ] makefont setfont +0.000 0.000 0.000 setrgbcolor +0.000 0.000 rmoveto +63.000 12.750 moveto +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10.000 scalefont +[1 0 0 -1 0 0 ] makefont setfont +0.000 0.000 0.000 setrgbcolor +(FWHM) show +93.000 12.750 moveto +(of) show +111.188 12.750 moveto +(Metz) show +135.188 12.750 moveto +%%IncludeResource: font Courier +%%IncludeFont: Courier +/Courier findfont 10.000 scalefont +[1 0 0 -1 0 0 ] makefont setfont +0.000 0.000 0.000 setrgbcolor +0.000 0.000 rmoveto +1.000 setlinewidth +grestore +0 0 m +1 0 L +1 .61803 L +0 .61803 L +closepath +clip +newpath +.5 Mabswid +.02381 .60332 m +.11905 .38662 L +.21429 .2782 L +.30952 .20949 L +.40476 .16059 L +.5 .12331 L +.59524 .09354 L +.69048 .06899 L +.78571 .04824 L +.88095 .03036 L +.97619 .01472 L +s +% End of Graphics +MathPictureEnd + +%%PSTrailer +end +grestore + +%%Trailer +%%EOF diff --git a/doximages/MetzFWHM.jpg b/doximages/MetzFWHM.jpg new file mode 100644 index 0000000000..fe321a37d2 Binary files /dev/null and b/doximages/MetzFWHM.jpg differ diff --git a/examples/PET_simulation/FBP2D.par b/examples/PET_simulation/FBP2D.par new file mode 100644 index 0000000000..e1f897a207 --- /dev/null +++ b/examples/PET_simulation/FBP2D.par @@ -0,0 +1,7 @@ +FBP2DParameters := +input file := ${INPUT} +xy output image size (in pixels) := 91 +zoom := .5 + +output filename prefix := ${OUTPUT} +END := diff --git a/examples/PET_simulation/OSMAPOSL_QP.par b/examples/PET_simulation/OSMAPOSL_QP.par new file mode 100644 index 0000000000..93432d34c2 --- /dev/null +++ b/examples/PET_simulation/OSMAPOSL_QP.par @@ -0,0 +1,50 @@ +OSMAPOSLParameters := +; test file for OSMAPOSL with a quadratic prior (and ray tracing projection matrix) +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := ${INPUT} +zero end planes of segment 0:= 0 ; segment 0 is has direct and indirect planes +; if disabled, defaults to maximum segment number in the file +;maximum absolute segment number to process := 3 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 10 +; do symmetry 90degrees min phi := 0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= ${MULTFACTORS} + End Bin Normalisation From ProjData:= + +additive sinogram := ${ADDSINO} + +xy output image size (in pixels) := 91 +zoom := .5 + +use subset sensitivities:=1 +;subset sensitivity filenames:= my_DSTE_sens_2D_PM_s14_%d.hv +recompute_sensitivity:=1 + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 0 + ;weights:={{{0,1,0},{1,0,1},{0,1,0}}} + END Quadratic Prior Parameters:= + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := ${OUTPUT} +number of subsets:= 14 +start at subset:= 0 +number of subiterations:= 28 +save estimates at subiteration intervals:= 14 + +;report objective function values interval := 1 + +END := diff --git a/examples/PET_simulation/OSSPS_QP.par b/examples/PET_simulation/OSSPS_QP.par new file mode 100644 index 0000000000..489699060a --- /dev/null +++ b/examples/PET_simulation/OSSPS_QP.par @@ -0,0 +1,66 @@ +OSSPSParameters := +; test file for OSSPS with a quadratic prior (and ray tracing projection matrix) +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := ${INPUT} +zero end planes of segment 0:= 1 +; if disabled, defaults to maximum segment number in the file +;maximum absolute segment number to process := 3 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 + do symmetry 90degrees min phi := 0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= ${MULTFACTORS} + End Bin Normalisation From ProjData:= + +additive sinogram := my_additive_sinogram.hs + +use subset sensitivities:=1 +;subset sensitivity filenames:= my_DSTE_sens_2D_PM_s28_%d.hv +recompute_sensitivity:=1 + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 1 + weights:={{{0,1,0},{1,0,1},{0,1,0}}} + END Quadratic Prior Parameters:= + + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := ${OUTPUT} + +number of subsets:= 28 +start at subset:= 0 +number of subiterations:= 56 +save estimates at subiteration intervals:= 56 + +;report objective function values interval := 1 +; if next is disabled, defaults to image full of 1s (but that's not good for OSSPS) +; in particular, make sure it has the correct scale +initial estimate:= ${INIT} +;enforce initial positivity condition := 1 + +; here start OSSPS specific values + +; values to use for the 'precomputed denominator' +; specify either procomputed denomiator or normalisation type + ; use the following if you have it already (e.g. from previous run) + ; precomputed denominator := my_precomputed_denominator.hv + +; specify relaxation scheme +; lambda = relaxation_parameter/ (1+relaxation_gamma*(subiteration_num/num_subsets) +relaxation parameter := 2 +relaxation gamma:=.1 + + +END := diff --git a/examples/PET_simulation/README.txt b/examples/PET_simulation/README.txt new file mode 100644 index 0000000000..08d51a9f53 --- /dev/null +++ b/examples/PET_simulation/README.txt @@ -0,0 +1,75 @@ +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans + +This directory contains sample scripts and parameter files for +performing analytic simulation of PET data using STIR. +These files serve as illustration and a starting-point for your own work. +Do not use just "as-is". + +These files should be compatible with STIR 2.4 and 3.0. + +Requirements: +- STIR utilities installed in your PATH +- bourne shell (present under Linux/Unix/MacOS, use cygwin or msys on Windows) + + +Brief summary: +- run_simulation.sh runs all the steps in one go, so start there, i.e. type + in your command prompt + + ./run_simulation.sh + +- generate_input_data.sh creates input images and a template sinogram + +- simulate_data.sh performs the actual analytic simulation (calling simulate_scatter.sh to help) + +- recon_FBP2D.sh and recon_OSL.sh run reconstructions with example settings (set via the .par files) + + +Various steps in the current simulation are too simple: +- norm and randoms are just using constants for now +- The scatter simulation uses only single scatter as this is the only thing that +STIR can do (we could use a small scale factor to pretend that multiples are a scaled version +of the singles, as done in SSS). Note that the scatter simulation could easily include out-of-FOV +scatter by making the input images larger than the scanner axial FOV. + +You can modify .par files at will to experiment. However, don't change names of files and variables +(unless you want to modify the scripts as well). There are a few things hard-wired in the scripts, among them: +- down-sampling factors in simulate_scatter.sh. +- a single noise simulation (in run_simulation.sh). + +If you change the scanner, adjust +- both template sinograms (i.e. also for scatter) and scatter.par (for energy windows) +- plane-separation in generate*image.par has to be half of the ring-distance of the PET scanner you are using +- The number of subsets used for the iterative reconstructions might have to be modified when you use +another scanner (because of subset balancing) + +Final notes: + +- What if it fails? The scripts do very basic error checking only. log files are created in +some stages. If necessary, you could add some options to the /bin/sh first line in the scripts +(e.g. "/bin/sh -vex" would print what it's doing and exit at first error) + +- Reconstructed images are scaled w.r.t. the input image. The scaling factor is equal to + reconstructed_x_voxel_size / original_x_voxel_size. + +- It would be relatively easy to run multiple noise realisations. +Just change the seed when calling poisson_noise and rename your output files (e.g. using the seed) +(no need to rerun simulate_data.sh of course). + +Enjoy! + diff --git a/examples/PET_simulation/Shell-scripting-primer.txt b/examples/PET_simulation/Shell-scripting-primer.txt new file mode 100644 index 0000000000..fdadc79b91 --- /dev/null +++ b/examples/PET_simulation/Shell-scripting-primer.txt @@ -0,0 +1,79 @@ +# Copyright (C) 2014 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans + + +The scripts to run this example simulation use the Bourne shell (a subset of +ksh, bash, zsh etc, but different from csh). + +If you want to modify these scripts, you probably will have to read a +tutorial on shell scripting. Below are a few pointers to give you a basic +understanding of what is in the current scripts. + + +Basically, a shell script is a step-by-step execution of commands, but with +some if/for/etc statements thrown in. We use this here to call STIR +executables, but allow for some basic flexibility. Unfortunately, this +flexibility makes the scripts more complicated. + +* what do $1, $2 etc mean? + +These are variables that correspond to the arguments of the script (i.e. the +first argument etc) + +$0 is the name of the script (and `basename $0` is just + the filename of the script without path info) +$# is the number of arguments +$? is the return value of the last command executed. By convention, if + a program works fine, it should "return" 0. + +* what does "if [ $? -ne 0 ];" mean? + +It checks if the return value of the previous command is not equal to zero, i.e. +if it failed. If so, we'll write an error message and exit. + +* and what about "${output}.log" etc? + +somewhere above in the script "output" will have been set to a value. ${output} +now does a (string) substitution of that value. So, if you would do + output=hello + echo ${output}.log +would write + hello.log + +Note: shell scripts do not normally treat the value of as a variable as a number +(unless you do something special, but here we didn't). + +* This appears at then end of the "list_ROI_values line: > /dev/null 2>&1" + +This magic incantation says: pipe everything that goes to stderr to stdout and +then pipe stdout to /dev/null. /dev/null is the garbage can, so overall it means +"do not show any output". + + +* Before calling create_projdata_template in generate_input_data.sh, I see something like +cat > my_input.txt < my_input.txt < my_create_${template_sino}.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running create_projdata_template. Check my_create_${template_sino}.log"; exit 1; +fi + +# compute ROI values (as illustration) +input_image=my_uniform_cylinder.hv +#input_voxel_size_x=`stir_print_voxel_sizes.sh ${input_image}|awk '{print $3}'` +ROI=../ROI_uniform_cylinder.par +list_ROI_values ${input_image}.roistats ${input_image} ${ROI} 0 > /dev/null 2>&1 +input_ROI_mean=`awk 'NR>2 {print $2}' ${input_image}.roistats` + +cd .. + diff --git a/examples/PET_simulation/generate_uniform_cylinder.par b/examples/PET_simulation/generate_uniform_cylinder.par new file mode 100644 index 0000000000..ce310e39d9 --- /dev/null +++ b/examples/PET_simulation/generate_uniform_cylinder.par @@ -0,0 +1,23 @@ +generate_image Parameters := +output filename:=my_uniform_cylinder +X output image size (in pixels):=111 +Y output image size (in pixels):=111 +Z output image size (in pixels):=47 +X voxel size (in mm):= 3 +Y voxel size (in mm):= 3 +Z voxel size (in mm) :=3.27 + + Z number of samples to take per voxel := 1 + Y number of samples to take per voxel := 1 + X number of samples to take per voxel := 1 + +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=100 + radius-y (in mm):=100 + length-z (in mm):=110 + origin (in mm):={70,10,20} + END:= +value :=1 + +END:= diff --git a/examples/PET_simulation/recon_FBP2D.sh b/examples/PET_simulation/recon_FBP2D.sh new file mode 100755 index 0000000000..c2843e7a9d --- /dev/null +++ b/examples/PET_simulation/recon_FBP2D.sh @@ -0,0 +1,59 @@ +#! /bin/sh +# A simple script to run FBP2D with precorrections. +# This script is part of the PET simulation example and assumes that FBP .par file +# uses INPUT and OUTPUT variables. + +# Copyright (C) 2013-2014 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans + +if [ $# -ne 3 -a $# -ne 5 ]; then + echo "Usage: `basename $0` output_prefix prompts FBPparfile [ multfactors additive_sinogram ]" + exit 1 +fi + +output=$1 +prompts=$2 +parfile=$3 +multfactors=$4 +addsino=$5 + +if [ $# -eq 3 ]; then + # no corrections + INPUT=${prompts} OUTPUT=${output} FBP2D ${parfile} > ${output}.log 2>&1 + if [ $? -ne 0 ]; then + echo "ERROR running FBP2D. Check ${output}.log"; exit 1; + fi +else + # do precorrections + # normalise (and correct for attenuation if its in multfactors) + stir_math -s --mult ${output}_precorrected.hs ${prompts} ${multfactors} + if [ $? -ne 0 ]; then + echo "ERROR running stir_math for norm"; exit 1; + fi + #remove background + stir_subtract -s --accumulate ${output}_precorrected.hs ${addsino} + if [ $? -ne 0 ]; then + echo "ERROR running stir_math for background subtraction"; exit 1; + fi + # reconstruct + INPUT=${output}_precorrected.hs OUTPUT=${output} FBP2D ${parfile} > ${output}.log 2>&1 + if [ $? -ne 0 ]; then + echo "ERROR running FBP2D. Check ${output}.log"; exit 1; + fi + +fi +echo "FBP2D done" diff --git a/examples/PET_simulation/recon_iterative.sh b/examples/PET_simulation/recon_iterative.sh new file mode 100755 index 0000000000..ded2bdc578 --- /dev/null +++ b/examples/PET_simulation/recon_iterative.sh @@ -0,0 +1,47 @@ +#! /bin/sh + +# A simple script to run OSMAPOSL or OSSPS with "corrections" as input. +# This script is part of the PET simulation example and assumes that the reconstruction .par file +# uses INPUT, OUTPUT, MULTFACTORS and ADDSINO variables. + +# Copyright (C) 2013-2014 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans + +if [ $# -ne 6 ]; then + echo "Usage: `basename $0` output_prefix prompts reconProg reconParfile multfactors additive_sinogram " + exit 1 +fi + +output=$1 +prompts=$2 +reconProg=$3 +parfile=$4 +multfactors=$5 +addsino=$6 + + +if [ $# -eq 4 ]; then + # no background + INPUT=${prompts} OUTPUT=${output} MULTFACTORS=my_norm.hs ADDSINO=my_zeros.hs ${reconProg} ${parfile} +else + INPUT=${prompts} OUTPUT=${output} MULTFACTORS=${multfactors} ADDSINO=${addsino} ${reconProg} ${parfile} +fi +if [ $? -ne 0 ]; then + echo "ERROR running iterative recon"; exit 1; +fi +echo "${reconProg} done" + diff --git a/examples/PET_simulation/run_simulation.sh b/examples/PET_simulation/run_simulation.sh new file mode 100755 index 0000000000..5bbcc86d62 --- /dev/null +++ b/examples/PET_simulation/run_simulation.sh @@ -0,0 +1,48 @@ +#! /bin/sh +# This script runs the whole simulation and 2 example reconstructions +# +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +# add current directory to the path +# (necessary to find simulate_scatter.sh for instance) +PATH=`pwd`:$PATH +generate_input_data.sh + +# create sinograms +# note: names and directory are hard-wired in the script above (but not in the simulate_data.sh script) +cd output +template_sino=my_DSTE_3D_rd1_template.hs +simulate_data.sh my_uniform_cylinder.hv my_atten_image.hv ${template_sino} ../scatter.par ../scatter_template.hs +if [ $? -ne 0 ]; then + echo "Error running simulation" + exit 1 +fi + +# add Poisson noise +poisson_noise my_noise my_prompts.hs 1 2 + +# run 2 reconstructions +echo "=== running OSMAPOSL" +recon_iterative.sh my_OSEM my_noise.hs OSMAPOSL ../OSMAPOSL_QP.par my_multfactors.hs my_additive_sinogram.hs +echo "=== running FBP2D" +recon_FBP2D.sh my_fbp my_noise.hs ../FBP2D.par my_multfactors.hs my_additive_sinogram.hs +# amide my_OSEM_14.hv my_OSEM_28.hv my_fbp.hv + +echo "All done!" +echo "All files are in the 'output' directory" diff --git a/examples/PET_simulation/scatter.par b/examples/PET_simulation/scatter.par new file mode 100644 index 0000000000..80a5de70ef --- /dev/null +++ b/examples/PET_simulation/scatter.par @@ -0,0 +1,25 @@ +Scatter Estimation Parameters:= + +attenuation_threshold :=.01 +random :=1 +use_cache :=1 +; parameters appropriate for DSTE +energy_resolution :=.16 +lower_energy_threshold :=425 +upper_energy_threshold :=650 +; parameters for ECAT HR+ +;energy_resolution :=.22 +;lower_energy_threshold :=350 +;upper_energy_threshold :=650 + +activity_image_filename := ${ACTIVITY_IMAGE} +density_image_filename := ${ATTEN_IMAGE} +density_image_for_scatter_points_filename := ${ATTEN_IMAGE} +template_proj_data_filename := ${TEMPLATE} + +; output filename without extension +; files will be called "out".hs and "out".log +output_filename_prefix :=${OUTPUT_PREFIX} + + +End Scatter Estimation Parameters:= diff --git a/examples/PET_simulation/scatter_template.hs b/examples/PET_simulation/scatter_template.hs new file mode 100644 index 0000000000..7243e9f5bf --- /dev/null +++ b/examples/PET_simulation/scatter_template.hs @@ -0,0 +1,47 @@ +!INTERFILE := +name of data file := scatter_template.hs +originating system := unknown +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Emission +applied corrections := {None} +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 4 +matrix axis label [4] := segment +!matrix size [4] := 1 +matrix axis label [3] := view +!matrix size [3] := 32 +matrix axis label [2] := axial coordinate +!matrix size [2] := { 8} +matrix axis label [1] := tangential coordinate +!matrix size [1] := 35 +minimum ring difference per segment := { 0} +maximum ring difference per segment := { 0} +Scanner parameters:= +Scanner type := unknown +Number of rings := 8 +Number of detectors per ring := 64 +Inner ring diameter (cm) := 88.62 +Average depth of interaction (cm) := 0.84 +Distance between rings (cm) := 1.962 +Default bin size (cm) := -1 +View offset (degrees) := 0 +Maximum number of non-arc-corrected bins := 0 +Default number of arc-corrected bins := 0 +Number of blocks per bucket in transaxial direction := 0 +Number of blocks per bucket in axial direction := 0 +Number of crystals per block in axial direction := 0 +Number of crystals per block in transaxial direction := 0 +Number of detector layers := 1 +Number of crystals per singles unit in axial direction := -1 +Number of crystals per singles unit in transaxial direction := -1 +end scanner parameters:= +effective central bin size (cm) := 2.21541 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +number of time frames := 1 +!END OF INTERFILE := diff --git a/examples/PET_simulation/simulate_data.sh b/examples/PET_simulation/simulate_data.sh new file mode 100755 index 0000000000..a68c8990d2 --- /dev/null +++ b/examples/PET_simulation/simulate_data.sh @@ -0,0 +1,118 @@ +#! /bin/sh +# An example script to do a simplistic analytic simulation +# It will call simulate_scatter.sh and various STIR utilities, so all this needs to be in your path +# +# Copyright (C) 2011 - 2011-01-14, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2011-08-23, Kris Thielemans +# Copyright (C) 2013-2014 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +if [ $# -ne 5 ]; then + echo "Usage: `basename $0` emission_image attenuation_image template_sino scatter.par scatter_template.hs" + echo "Creates my_prompts.hs my_multfactors.hs my_additive_sinogram.hs " + echo "and some other intermediate files" + exit 1 +fi + +emission_image=$1 +atten_image=$2 +template_sino=$3 +scatter_params="$4 $5" + +echo "=== create line integrals" +# Call forward_project to compute line integrals +# If you have a STIR version prior to 3.0, you can uncomment the following line (and comment the one +# after that) to use fwdtest +#fwdtest my_line_integrals.hs ${template_sino} ${emission_image} ../forward_projector_proj_matrix_ray_tracing.par my_create_line_integrals.log 2>&1 +forward_project my_line_integrals.hs ${emission_image} ${template_sino} ../forward_projector_proj_matrix_ray_tracing.par > my_create_line_integrals.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running forward_project. Check my_create_line_integrals.log"; exit 1; +fi + +echo "=== create ACFs" +calculate_attenuation_coefficients --ACF my_acfs.hs ${atten_image} ${template_sino} > my_create_acfs.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running calculate_attenuation_coefficients. Check my_create_acfs.log"; exit 1; +fi + +echo "=== create normalisation factors" +# right now, just use a constant sinogram +# (all bins set to 3.4 here, just to check if it's handled properly in the script) +stir_math -s --including-first \ + --times-scalar 0 --add-scalar 3.4 \ + my_norm.hs my_acfs.hs +if [ $? -ne 0 ]; then + echo "ERROR running stir_math for norm"; exit 1; +fi + +echo "=== multiply ACF and norm" +stir_math -s --mult my_multfactors.hs my_norm.hs my_acfs.hs +if [ $? -ne 0 ]; then + echo "ERROR running stir_math for multiplying norm and ACFs"; exit 1; +fi + + + +echo "=== create constant randoms background" +# TODO compute sensible randoms-to-true background here +stir_math -s --including-first \ + --times-scalar 0 --add-scalar 10 \ + my_randoms.hs my_line_integrals.hs +# we divide by the norm here to put some efficiency pattern on the data. +# this isn't entirely accurate as a "proper" norm contains geometric effects +# which shouldn't be in the randoms, but this is supposed to be a "simple" simulation :-; +stir_divide -s --accumulate \ + my_randoms.hs my_norm.hs +if [ $? -ne 0 ]; then + echo "ERROR running stir_math"; exit 1; +fi + + +echo "=== create scatter" +# we could just use zero scatter +#stir_math -s --including-first \ +# --times-scalar 0 --add-scalar 0 \ +# my_scatter.hs my_line_integrals.hs + +simulate_scatter.sh my_scatter ${emission_image} ${atten_image} my_norm.hs ${scatter_params} +if [ $? -ne 0 ]; then + echo "ERROR running simulate_scatter"; exit 1; +fi + +echo "=== create additive sinogram for reconstruction" +# model is +# data = ACF*norm* ( fwd(image) + additive_sinogram) +# +# Therefore, we need (randoms+scatter) multiplied by ACF and norm +stir_math -s my_additive_sinogram.hs my_randoms.hs my_scatter.hs +stir_math -s --mult --accumulate my_additive_sinogram.hs my_multfactors.hs +if [ $? -ne 0 ]; then + echo "ERROR running stir_math for additive sinogram"; exit 1; +fi + +echo "=== create prompts" +stir_math -s my_prompts.hs my_line_integrals.hs my_additive_sinogram.hs +stir_divide -s --accumulate my_prompts.hs my_multfactors.hs + +echo "=== create zero sinogram" +# for convenience of the scripts +stir_math -s --including-first \ + --times-scalar 0 \ + my_zeros.hs my_line_integrals.hs + +echo "Done creating simulated data" diff --git a/examples/PET_simulation/simulate_scatter.sh b/examples/PET_simulation/simulate_scatter.sh new file mode 100755 index 0000000000..eaccd99d15 --- /dev/null +++ b/examples/PET_simulation/simulate_scatter.sh @@ -0,0 +1,85 @@ +#! /bin/sh +# a script to simulate scatter for PET +# This will use the single-scatter estimation routine. +# WARNING: it relies on a scatter.par file using the following variables: +# ${ACTIVITY_IMAGE}, ${ATTEN_IMAGE}, ${TEMPLATE}, ${OUTPUT_PREFIX} +# WARNING: image downsampling factors and final size are currently hard-wired in this script. +# +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +if [ $# -ne 6 ]; then + echo "Usage: `basename $0` output_prefix emission_image attenuation_image normalisation_sino scatterparfile scatter_low_res_template_sino " + exit 1 +fi + +output=$1 +ACTIVITY_IMAGE=$2 +org_atten_image=$3 +norm=$4 +scatterparfile=$5 +TEMPLATE=$6 + +#### Downsample the attenuation image +# This will be used to "select" scatter points in the simulation. +# Note: the more downsampling, the faster, but less accurate of course. +# Downsampling factors and final size are currently hard-wired in this script. +# You'd have to adjust these for your data. +ATTEN_IMAGE=my_zoomed_${org_atten_image} +zoom_z=.16666667 +zoom_xy=0.25 +new_voxels_z=8 +new_voxels_xy=33 +zoom_image ${ATTEN_IMAGE} ${org_atten_image} ${new_voxels_xy} ${zoom_xy} 0 0 ${new_voxels_z} ${zoom_z} 0 +if [ $? -ne 0 ]; then + echo "Error running zoom_image" + exit 1 +fi +# scale image back to appropriate units (cm^-1) +stir_math --accumulate --times-scalar ${zoom_xy} --times-scalar ${zoom_xy} --times-scalar ${zoom_z} --including-first ${ATTEN_IMAGE} +if [ $? -ne 0 ]; then + echo "Error running stir_math" + exit 1 +fi + +#### compute low resolution scatter +OUTPUT_PREFIX=${output}_low_res +export OUTPUT_PREFIX ACTIVITY_IMAGE ATTEN_IMAGE TEMPLATE +estimate_scatter ${scatterparfile} 2> ${OUTPUT_PREFIX}_stderr.log +if [ $? -ne 0 ]; then + echo "Error running estimate_scatter" + exit 1 +fi + +#### upsample the low-resolution estimate +# We will use a trick here and use the upsample_and_fit_single_scatter executable. +# This is normally designed to do "tail-fitting" of the scatter estimate to the measured data +# Here we force the scale factor to be 1 (as estimate_scatter uses correct units for single scatter) +# That means that "weights" and "data-to-fit" are actually ignored (but we have to specify them anyway) +upsample_and_fit_single_scatter --min-scale-factor 1 --max-scale-factor 1 \ + --output-filename ${output}_pre_norm.hs --data-to-fit ${norm} --data-to-scale ${OUTPUT_PREFIX}.hs --weights ${norm} 2> ${output}_stderr.log +if [ $? -ne 0 ]; then + echo "Error upsampling scatter" + exit 1 +fi + +#### divide by norm to be consistent with measured data +# STIR scatter simulation produces "normalised" data, so we undo that here +stir_divide -s ${output}.hs ${output}_pre_norm.hs ${norm} + +echo "Done creating simulated scatter data" diff --git a/examples/samples/FBP2D.par b/examples/samples/FBP2D.par new file mode 100644 index 0000000000..c4758927c2 --- /dev/null +++ b/examples/samples/FBP2D.par @@ -0,0 +1,30 @@ +fbp2dparameters := + +input file := input.hs +output filename prefix := output + +; output image parameters +; zoom defaults to 1 +zoom := 1 +; image size defaults to whole FOV +xy output image size (in pixels) := 180 + +; can be used to call SSRB first +; default means: call SSRB only if no axial compression is already present +;num segments to combine with ssrb := -1 + +; filter parameters, default to pure ramp +alpha parameter for ramp filter := 1 +cut-off for ramp filter (in cycles) := 0.5 + +; allow less padding. DO NOT USE +; (unless you're sure that the object occupies only half the FOV) +;Transaxial extension for FFT:=1 + +; back projector that could be used (defaults to interpolating backprojector) +; Back projector type:= some type + +; display data during processing for debugging purposes +; Display level := 0 +end := + diff --git a/examples/samples/FBP2D_SPECT.par b/examples/samples/FBP2D_SPECT.par new file mode 100644 index 0000000000..c55b2946a7 --- /dev/null +++ b/examples/samples/FBP2D_SPECT.par @@ -0,0 +1,47 @@ +FBP2DParameters := +; Example file to run FBP on SPECT data + +input file := input.hs + +output filename prefix := fbp_recon + +; output image parameters +; zoom defaults to 1 +zoom := 1 +; image size defaults to whole FOV +xy output image size (in pixels) := 180 + +; you NEED to set this to the number of z-position in your data. +; otherwise, things will currently go wrong +Z output image size (in pixels):=64 + +; filter parameters, default to pure ramp +; choose alpha < 1 for a Hamming window +alpha parameter for ramp filter := 1 +; cut-off (max 0.5 for no cut-off (i.e. at Nyquist) +cut-off for ramp filter (in cycles) := 0.5 + +; you need to use the SPECT UB projection matrix for back projection +Back Projector type:= matrix + Back Projector Using Matrix Parameters := + Matrix type := SPECT UB + Projection Matrix By Bin SPECT UB Parameters:= + + ; has to be Geometrical for FBP + psf type:= Geometrical + + ;Attenuation correction has to be off for FBP + attenuation type := No + + ; you could use a mask to backproject only to a part of the image + ; this will save time and memory + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := No + mask file := mask.hv + + ; no point in keeping things in memory as FBP runs the projector only once + keep all views in cache := 0 + + End Projection Matrix By Bin SPECT UB Parameters:= + End Back Projector Using Matrix Parameters := +end:= diff --git a/examples/samples/FBP2D_using_ITK_to_write_image.par b/examples/samples/FBP2D_using_ITK_to_write_image.par new file mode 100644 index 0000000000..7cbf9272cb --- /dev/null +++ b/examples/samples/FBP2D_using_ITK_to_write_image.par @@ -0,0 +1,15 @@ +fbp2dparameters := + +input file := input.hs +output filename prefix := output + +; choose the output file format +; note that these keywords are supported by all reconstruction programs +; here we use ITK (so this will only work if you linked STIR with ITK) +output file format type := ITK +ITK Output File Format Parameters:= + ; use Nifti as output (could also use .mhdr, .nhdr etc) + default extension:=.nii +End ITK Output File Format Parameters:= +end := + diff --git a/examples/samples/FBP3DRP.par b/examples/samples/FBP3DRP.par new file mode 100644 index 0000000000..66409f0b0f --- /dev/null +++ b/examples/samples/FBP3DRP.par @@ -0,0 +1,48 @@ +fbp3drpparameters := +input file := input.hs +output filename prefix := output + +; all following parameters are optional + +;;;;;;; output image parameters + +zoom := 1 +; defaults to cover whole FOV +xy output image size (in pixels) := 180 + +maximum absolute segment number to process := 2 + +;;;;;;; parameters for initial image + +; you can use an existing image (but be careful about the scale!) +; image to be used for reprojection := some_image + +; or you can use FBP on 2D data. following are reconstruction parameters for 2D + +; default means: call SSRB only if no axial compression is already present +num segments to combine with ssrb := -1 +; filter parameters, default to pure ramp +alpha parameter for ramp filter := 1 +cut-off for ramp filter (in cycles) := 0.5 + +;;;;;;;; parameters for Colsher filter + +alpha parameter for colsher filter in axial direction := 1 +cut-off for colsher filter in axial direction (in cycles) := 0.5 +alpha parameter for colsher filter in planar direction := 1 +cut-off for colsher filter in planar direction (in cycles) := 0.5 + +; define colsher on finer grid. The higher the number, the better (but slower) +stretch factor for colsher filter definition in axial direction := 2 +stretch factor for colsher filter definition in planar direction := 2 + +; allow less padding. DO NOT USE +transaxial extension for fft := 1 +axial extension for fft := 1 + +;;;;;;;;; other parameters +save intermediate images := 0 +display level := 0 + +end := + diff --git a/examples/samples/MCIR.par b/examples/samples/MCIR.par new file mode 100644 index 0000000000..f4cf4d1e65 --- /dev/null +++ b/examples/samples/MCIR.par @@ -0,0 +1,56 @@ +OSMAPOSLParameters := +; example file for running OSEM with motion modelling +; input data is supposed to be gated, output is a single image (motion corrected) + +objective function type:=PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion Parameters:= + +input filename := SOME_GATED_PROJDATA + +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := -1 +; see User's Guide to see when you need this +zero end planes of segment 0:= 0 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + number of rays in tangential direction to trace for each bin := 10 +End Ray Tracing Matrix Parameters:= +End Projector Pair Using Matrix Parameters := + +recompute sensitivity := 1 +use subset sensitivities := 1 +; optional. if not set, the subset sensitities won't be saved +subset sensitivity filenames:= SENS_%d.hv + +; specify gated multiplicative projection data for norm and attenuation correction, +; and additive projection data to handle randoms or so +; see User's Guide for more info +normalisation sinograms:= NORMxACF +additive sinograms := ATTCORRECTED_SCATTER_AND_RANDOMS + +; motion field related files +Gate Frame definition filename := TIMEGATES.gdef +Motion Vectors filename prefix := FORWARD_MOTION_VECTORS +Reverse Motion Vectors filename prefix := BACKWARD_MOTION_VECTORS + +;xy image sizes as well as z image size are expected to match the given motion vectors sizes + +end PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion Parameters := + +; Number of subsets should be a divisor of num_views/4 +number of subsets:=NUM_SUBSETS +; Use for starting the numbering from something else than 1 +start at subiteration number:=1 +; Use if you want to start from another subset than 0 (but why?) +start at subset:= 0 +number of subiterations:= NUM_SUBITERATIONS +save estimates at subiteration intervals:= NUM_SUBITERATIONS_INTERVALS +initial estimate := AN_IMAGE +; enable this when you read an initial estimate with negative data +enforce initial positivity condition:=1 + +output filename prefix:= MOTION_CORRECTED_RECONSTRUCTED_IMAGE + +END := diff --git a/examples/samples/OSEM_SPECT.par b/examples/samples/OSEM_SPECT.par new file mode 100644 index 0000000000..bcd904d32e --- /dev/null +++ b/examples/samples/OSEM_SPECT.par @@ -0,0 +1,56 @@ +OSMAPOSLParameters := + + objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + input file := input.hs + + projector pair type := Matrix + + Projector Pair Using Matrix Parameters := + Matrix type := SPECT UB + + Projection Matrix By Bin SPECT UB Parameters:= + ; elements below this weight will be truncate + minimum weight:= 0.001 + ; width of PSF + maximum number of sigmas:= 2.0 + ; resolution used to computed Gaussian (leave as-is) + spatial resolution PSF:= 0.00001 + + ;PSF type of correction { 2D // 3D // Geometrical } + psf type:= 2D + ; next 2 parameters define the PSF. They are ignored if psf_type is "Geometrical" + ; These values are mostly dependent on your collimator. + ; the PSF is modelled as a Gaussian with sigma dependent on the distance from the collimator + ; sigma_at_depth = collimator_slope * depth_in_cm + collimator sigma 0(cm) + collimator slope := 0.0163 + collimator sigma 0(cm) := 0.1466 + + ;Attenuation correction { Simple // Full // No } + attenuation type := Simple + ;Values in attenuation map in cm-1 + attenuation map := attMapRec.hv + + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := Explicit Mask + mask file := mask.hv + + ; if next variable is set to 0, only a single view is kept in memory + keep all views in cache:=1 + + End Projection Matrix By Bin SPECT UB Parameters:= + + End Projector Pair Using Matrix Parameters := + + end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + initial estimate:= init.hv + output filename prefix := out + + number of subsets:= 8 + number of subiterations:= 16 + Save estimates at subiteration intervals:= 16 + +END := diff --git a/examples/samples/OSMAPOSL_MRP.par b/examples/samples/OSMAPOSL_MRP.par new file mode 100644 index 0000000000..9361be3bcf --- /dev/null +++ b/examples/samples/OSMAPOSL_MRP.par @@ -0,0 +1,67 @@ +OSMAPOSLParameters := +; example file for running MRP (in its One Step Late flavour) +; with subsets +; see OSMAPOSL_osem_with_interfiltering.par for other parameters + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := test.hs +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 4 +; see User's Guide to see when you need this +zero end planes of segment 0:= 1 + +; if the next parameter is disabled, +; the sensitivity will be computed +sensitivity filename:= sens.hv +; specify additive projection data to handle randoms or so +; see User's Guide for more info +additive sinogram := 0 + + +; here comes the MRP stuff +prior type := FilterRootPrior +FilterRootPrior Parameters := + penalisation factor := 1 + ; you can use any image processor here + ; the next parameters specify a 3x3x3 median + Filter type := Median + Median Filter Parameters := + mask radius x := 1 + mask radius y := 1 + mask radius z := 1 + End Median Filter Parameters:= + +END FilterRootPrior Parameters := + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +initial estimate:= some_image +; enable this when you read an initial estimate with negative data +enforce initial positivity condition:=0 + +output filename prefix := test_MRP + +; Number of subsets should usually be a divisor of num_views/4 +number of subsets:= 12 +; Use for starting the numbering from something else than 1 +;start at subiteration number:=1 +; Use if you want to start from another subset than 0 (but why?) +;start at subset:= 0 +number of subiterations:= 24 +save estimates at subiteration intervals:= 12 + + +; following are defaults, so are not necessary +inter-update filter subiteration interval:= 0 +inter-update filter type := None +inter-iteration filter subiteration interval:= 0 +inter-iteration filter type := None +post-filter type := None + + +; enable this for multiplicative form of OSMAPOSL-MRP (see User's Guide) +;MAP model := multiplicative + +END := diff --git a/examples/samples/OSMAPOSL_QuadraticPrior.par b/examples/samples/OSMAPOSL_QuadraticPrior.par new file mode 100644 index 0000000000..8a1fec8167 --- /dev/null +++ b/examples/samples/OSMAPOSL_QuadraticPrior.par @@ -0,0 +1,55 @@ +OSMAPOSLParameters := +; example file for using a quadratic prior (with One Step Late and subsets) +; this is a minimal file. check other sample files and doc for more options + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := test.hs +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 4 +; see User's Guide to see when you need this +zero end planes of segment 0:= 1 + +; if the next parameter is disabled, +; the sensitivity will be computed +sensitivity filename:= sens.hv +; specify additive projection data to handle randoms or so +; see User's Guide for more info +additive sinogram := 0 + + +; here comes the prior stuff + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 1 + ; next defaults to 0, set to 1 for 2D inverse Euclidean weights, 0 for 3D + only 2D:= 0 + ; next can be used to set weights explicitly. Needs to be a 3D array (of floats). + ' value of only_2D is ignored + ; following example uses 2D 'nearest neighbour' penalty + ; weights:={{{0,1,0},{1,0,1},{0,1,0}}} + ; use next parameter to specify an image with penalisation factors (a la Fessler) + ; see class documentation for more info + ; kappa filename:= + ; use next parameter to get gradient images at every subiteration + ; see class documentation + gradient filename prefix:= + END Quadratic Prior Parameters:= + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +initial estimate:= some_image +; enable this when you read an initial estimate with negative data +enforce initial positivity condition:=0 + +output filename prefix := test_QP +number of subsets:= 12 +number of subiterations:= 24 +save estimates at subiteration intervals:= 12 + +; enable this for multiplicative form of OSMAPOSL (see User's Guide) +;MAP model := multiplicative + +END := diff --git a/examples/samples/OSMAPOSL_emml_with_projector_pair.par b/examples/samples/OSMAPOSL_emml_with_projector_pair.par new file mode 100644 index 0000000000..ebf9c8a7a9 --- /dev/null +++ b/examples/samples/OSMAPOSL_emml_with_projector_pair.par @@ -0,0 +1,38 @@ +OSMAPOSLParameters := + +; minimal .par file to illustrate running OSMAPOSL as EMML with +; 2 separate projectors +; see OSMAPOSL_osem_with_interfiltering.par for other parameters + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := test.hs + +; specify additive projection data to handle randoms or so +; see User's Guide for more info +additive sinogram := 0 + + +; here comes the projector stuff +projector pair type := Separate Projectors + Projector Pair Using Separate Projectors Parameters:= + Forward projector type := Ray Tracing + Forward Projector Using Ray Tracing Parameters:= + End Forward Projector Using Ray Tracing Parameters:= + Back projector type := Interpolation + Back Projector Using Interpolation Parameters:= + End Back Projector Using Interpolation Parameters:= + End Projector Pair Using Separate Projectors Parameters:= + + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +initial estimate:= some_image +output filename prefix := output + +number of subsets:= 1 +number of subiterations:= 24 +Save estimates at subiteration intervals:= 3 + +END := \ No newline at end of file diff --git a/examples/samples/OSMAPOSL_emml_with_projmatrix.par b/examples/samples/OSMAPOSL_emml_with_projmatrix.par new file mode 100644 index 0000000000..ef64ade9a9 --- /dev/null +++ b/examples/samples/OSMAPOSL_emml_with_projmatrix.par @@ -0,0 +1,33 @@ +OSMAPOSLParameters := +; minimal .par file to illustrate running OSMAPOSL as EMML with +; projectors derived from a single projection matrix +; see OSMAPOSL_osem_with_interfiltering.par for other parameters + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= +input file := input.hs + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + ; use multiple (almost) parallel LORs for every bin in the sinogram + ; to avoid discretisation artefacts + number of rays in tangential direction to trace for each bin:= 5 + ; you could disable some symmetries if you have enough memory + ; this would for instance allow you to increase the number of subsets + ; do_symmetry_90degrees_min_phi:=0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +initial estimate:= some_image +output filename prefix := output + +number of subsets:= 1 +number of subiterations:= 24 +Save estimates at subiteration intervals:= 3 + + +END := \ No newline at end of file diff --git a/examples/samples/OSMAPOSL_osem_SPECT.par b/examples/samples/OSMAPOSL_osem_SPECT.par new file mode 100644 index 0000000000..2d6dd90ab0 --- /dev/null +++ b/examples/samples/OSMAPOSL_osem_SPECT.par @@ -0,0 +1,59 @@ +OSMAPOSLParameters := + ; sample .par file to use OSEM on SPECT data. + ; Any of the algorithm parameters illustrated for PET (such as filtering, prior etc) + ; will work for SPECT as well, as would OSSPS. + ; The only thing different here is the projector. + + objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + input file := input.hs + + projector pair type := Matrix + + Projector Pair Using Matrix Parameters := + Matrix type := SPECT UB + + Projection Matrix By Bin SPECT UB Parameters:= + ; width of PSF + maximum number of sigmas:= 2.0 + + ;PSF type of correction { 2D // 3D // Geometrical } + psf type:= 2D + ; next 2 parameters define the PSF. They are ignored if psf_type is "Geometrical" + ; These values are mostly dependent on your collimator. + ; the PSF is modelled as a Gaussian with sigma dependent on the distance from the collimator + ; sigma_at_depth = collimator_slope * depth_in_cm + collimator sigma 0(cm) + collimator slope := 0.0163 + collimator sigma 0(cm) := 0.1466 + + ;Attenuation correction { Simple // Full // No } + attenuation type := Simple + ;Values in attenuation map in cm-1 + attenuation map := attMapRec.hv + + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := Explicit Mask + mask file := mask.hv + + ; if next variable is set to 0, only a single view is kept in memory + keep all views in cache:=1 + + End Projection Matrix By Bin SPECT UB Parameters:= + + End Projector Pair Using Matrix Parameters := + + end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + ; best to specifiy an initial image (e.g. filled with 1) for sizes + ; or see OSMAPOSL_osem_with_interfiltering.par and FBP2D_SPECT.par for some keywords + initial estimate:= init.hv + output filename prefix := out + + ; needs to be a divisor of the number of views + number of subsets:= 8 + number of subiterations:= 16 + Save estimates at subiteration intervals:= 16 + +END := diff --git a/examples/samples/OSMAPOSL_osem_with_interfiltering.par b/examples/samples/OSMAPOSL_osem_with_interfiltering.par new file mode 100644 index 0000000000..853b99d495 --- /dev/null +++ b/examples/samples/OSMAPOSL_osem_with_interfiltering.par @@ -0,0 +1,112 @@ +OSMAPOSLParameters := +; example file for running OSEM with interfiltering +; filter specific things are at the end +; WARNING: At least up to STIR 2.4 this will use the default projectors +; which are unmatched (ray tracing forward projector, interpolating backprojector). +; This is NOT recommended. +; From STIR 3.0 onwards, a matching projector is used, but it is based on +; ray tracing a single line, which leads to some discretisation artefacts. +; See OSMAPOSL_emml_with_projmatrix.par how to specify a different projection matrix. + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := test.hs + +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 4 +; see User's Guide to see when you need this +zero end planes of segment 0:= 1 + + +; normalisation (and attenuation correction) + + ; time info can be used for dead-time correction + ; (currently only used when using ECAT7 .n files) + ; see TimeFrameDefinitions + time frame definition filename := + ; starts from 1 + time frame number := + ; see BinNormalisation hierarchy for possible values + Bin Normalisation type := Chained + Chained Bin Normalisation Parameters:= + Bin Normalisation to apply first:= From ECAT7 + Bin Normalisation From ECAT7:= + normalisation_ECAT7_filename:= STUDY.n + singles rates := Singles From ECAT7 File + Singles Rates From ECAT7 File:= + ECAT7_filename := ecat7_sinogram.S + End Singles Rates From ECAT7:= + End Bin Normalisation From ECAT7:= + ; or if normalisation factors are in a file + ; Bin Normalisation to apply first:= From ProjData + ; Bin Normalisation From ProjData := + ; normalisation projdata filename:= norm.hs + ; End Bin Normalisation From ProjData:= + + Bin Normalisation to apply second:= From Attenuation Image + Bin Normalisation From Attenuation Image:= + attenuation_image_filename := + ;forward projector type := + End Bin Normalisation From Attenuation Image := + END Chained Bin Normalisation Parameters:= + +; if next is set to 1, sensitivity will be recomputed +; and also written to file (if "sensitivity filename" or "subset sensitivity filenames" is set) +; if it is zero, the sensitivity will be read from file + recompute sensitivity := 0 + use subset sensitivities:=1 ; recommended + ; optional filename to store/read the sensitivity image + ; (if "use subset sensitivity" is off) + ;sensitivity filename:= + ; optional filename to store/read the subsensitivities + ; use %d where you want the subset-number (a la printf) + subset sensitivity filenames:= sens_%d.hv + + +; specify additive projection data to handle randoms or so +; see User's Guide for more info +additive sinogram := 0 + +; output image sizes +; warning: will likely disappear. Use "initial estimate" instead + +; choose size of pixels +; x,y pixel size = bin_size/zoom +zoom := 1 +; number of x,y pixels (-1 takes default value to cover the FOV) +xy output image size (in pixels) := -1 + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +; Number of subsets should be a divisor of num_views/4 +number of subsets:= 12 +; Use for starting the numbering from something else than 1 +;start at subiteration number:=1 +; Use if you want to start from another subset than 0 (but why?) +;start at subset:= 0 +number of subiterations:= 24 +save estimates at subiteration intervals:= 12 + +; initial estimate := some_image +; enable this when you read an initial estimate with negative data +enforce initial positivity condition:=0 + + +inter-update filter subiteration interval:= 0 +inter-update filter type := None + +inter-iteration filter subiteration interval:= 4 +inter-iteration filter type := Separable Cartesian Metz + Separable Cartesian Metz Filter Parameters := + x-dir filter FWHM (in mm):= 6.0 + y-dir filter FWHM (in mm):= 6.0 + z-dir filter FWHM (in mm):= 6.0 + x-dir filter Metz power:= 0.0 + y-dir filter Metz power:= 0.0 + z-dir filter Metz power:= 0.0 +END Separable Cartesian Metz Filter Parameters := + +post-filter type := None + +END := diff --git a/examples/samples/OSSPS_QuadraticPrior.par b/examples/samples/OSSPS_QuadraticPrior.par new file mode 100644 index 0000000000..13da86fd08 --- /dev/null +++ b/examples/samples/OSSPS_QuadraticPrior.par @@ -0,0 +1,83 @@ +OSSPSParameters := +; example file for OSSPS using a quadratic prior +; this is a minimal file. check other sample files and doc for more options + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := test.hs +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 4 +; see User's Guide to see when you need this +zero end planes of segment 0:= 0 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +; put normalisation (and attenuation) here +; Bin Normalisation type := From ProjData + ; Bin Normalisation From ProjData := + ; normalisation projdata filename:= norm.hs + ; End Bin Normalisation From ProjData:= + +; specify additive projection data to handle randoms or so +; see User's Guide for more info +additive sinogram := 0 + + +; if the next parameter is disabled, +; the sensitivity will be computed +;sensitivity filename:= sens.hv + + +; here comes the prior stuff + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 1 + ; next can be used to set weights explicitly. Needs to be a 3D array (of floats). + ' value of only_2D is ignored + ; following example uses 2D 'nearest neighbour' penalty + weights:={{{0,1,0},{1,0,1},{0,1,0}}} + ; use next parameter to specify an image with penalisation factors (a la Fessler) + ; see class documentation for more info + ; kappa filename:= + ; use next parameter to get gradient images at every subiteration + ; see class documentation + ; gradient filename prefix:= + END Quadratic Prior Parameters:= + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +initial estimate:= some_image +; you could enable this when you read an initial estimate with negative data, +; although OSSPS does not need it +; enforce initial positivity condition:=0 + +output filename prefix := test_QP +number of subsets:= 12 +number of subiterations:= 24 +save estimates at subiteration intervals:= 12 + +; here start OSSPS specific values + +; values to use for the 'precomputed denominator' + ; if you do not specify the following keyword, the 'precomputed denominator' + ; will be computed automatically (and saved) + ; use the following if you have it already (e.g. from previous run) + ; note: setting the value to 1 will use an images full of ones (which is not a good idea!) + ; precomputed denominator := my_precomputed_denominator.hv + +; specify relaxation scheme +; lambda = relaxation_parameter/ (1+relaxation_gamma*(subiteration_num/num_subsets) +relaxation parameter := 1 +relaxation gamma:=.1 + +; you can give an upper bound on the image values. +; lower bound is always zero. +;upper bound:= 1 +END := diff --git a/examples/samples/POSMAPOSL.par b/examples/samples/POSMAPOSL.par new file mode 100644 index 0000000000..1148ef6af5 --- /dev/null +++ b/examples/samples/POSMAPOSL.par @@ -0,0 +1,90 @@ +OSMAPOSLParameters := +; example file for running OSEM with interfiltering +; filter specific things are at the end + +objective function type:=PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + +input file := SOME_DYNAMIC_PROJDATA.S + +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := -1 +; see User's Guide to see when you need this +zero end planes of segment 0:= 0 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +; normalisation (and attenuation correction) + Bin Normalisation type := Chained + Chained Bin Normalisation Parameters:= + Bin Normalisation to apply first:= From ECAT7 + Bin Normalisation From ECAT7:= + normalisation_ECAT7_filename:= NORMFILE.n + singles rates := Singles From ECAT7 + Singles Rates From ECAT7:= + ECAT7_filename := SOME_DYNAMIC_PROJDATA.S + End Singles Rates From ECAT7:= + End Bin Normalisation From ECAT7:= + Bin Normalisation to apply second:= From ProjData + Bin Normalisation From ProjData := + normalisation projdata filename:= AN_ATTENUATION_SINOGRAM_tr1_meas_zoom1_a_f1g1d0b0.hs + End Bin Normalisation From ProjData:= + END Chained Bin Normalisation Parameters:= + +; if the next parameter is disabled, +; the sensitivity will be computed using the normalisation object +sensitivity filename:= sens.img +; if next is set to 1, sensitivity will be recomputed +; and written to file (if "sensitivity filename" is set) +recompute sensitivity := 1 + +; specify additive projection data to handle randoms or so +; see User's Guide for more info +additive sinograms := SCATTER_AND_RANDOMS_ADDED_ECAT7.S + +; patlak related files +Kinetic Model type := Patlak Plot +Patlak Plot Parameters := +time frame definition filename := TIMEFRAMES.fdef +starting frame := FRAME_NUM +calibration factor := 1 +blood data filename := TEXTFILE-TIME-PLASMA-BLOOD.if +; Time Shift in seconds +Time Shift := 0 +; boolean - direct reconstructions and STIR, 0: CTI scale +In total counts := 0 +; 0 (default), if 1 it automatically scale with xy_voxel_size/bin_size +;In correct scale := 1 +end Patlak Plot Parameters := + +end PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:= + +; Number of subsets should be a divisor of num_views/4 +number of subsets:=NUM_SUBSETS +; Use for starting the numbering from something else than 1 +start at subiteration number:=1 +; Use if you want to start from another subset than 0 (but why?) +start at subset:= 0 +number of subiterations:= NUM_SUBITERATIONS +save estimates at subiteration intervals:= NUM_SUBITERATIONS_INTERVALS + +initial estimate := PARAMETRIC_IMAGE_OF_TWO_PARAMETERS.img +; enable this when you read an initial estimate with negative data +enforce initial positivity condition:=1 +write update image := 0 + +inter-update filter subiteration interval:= 0 +inter-update filter type := None + +inter-iteration filter subiteration interval:= 0 + +post-filter type := None + +output filename prefix:= OUTPUT_PARAMETRIC_IMAGE.img + +END := diff --git a/examples/samples/POSSPS.par b/examples/samples/POSSPS.par new file mode 100644 index 0000000000..fb7aeeda9e --- /dev/null +++ b/examples/samples/POSSPS.par @@ -0,0 +1,106 @@ +OSSPSParameters := +; sample file for OSSPS +; parameters used here are for illustrative purposes only +; i.e. they are not recommended values +; +; Note: +; some variables here are indicated with ${VAR} +; These can be initialised as environment variables before +; running POSSPS. E.g. in bash you could do +; MAXSEG=2 NUMSUBS=6 other_variables_here POSSPS POSSPS.par +; Alternatively, copy this file and edit it obviously. + +objective function type:=PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + +input file := fwd_dyn_from_p0005-p5.S + +; if next disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := ${MAXSEG} + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := +End Projector Pair Using Matrix Parameters := + +; if the next parameter is disabled, +; the sensitivity will be computed using the normalisation object +sensitivity filename:= sens_POSSPS.img +; if next is set to 1, sensitivity will be recomputed +; and written to file (if "sensitivity filename" is set) +recompute sensitivity := 1 +; background term (i.e. randoms and scatter) +additive sinograms := 0 + +; see STIR doc: use 1 if segment 0 has only ring difference 0 +; zero_segment 0_end_planes:= 0 + zero end planes of segment 0:= 0 + +;prior type:= Quadratic +;quadratic prior parameters := +;penalisation factor := .5 +;only 2D:=1 +;;kappa filename := kappas_a_la_fessler.hv +;end quadratic prior parameters:= + +; patlak related files +Kinetic Model type := Patlak Plot +Patlak Plot Parameters := +time frame definition filename := time.fdef +starting frame := 23 +calibration factor := 9432.31 +blood data filename := plasma.if +Time Shift := 0 +In total counts := 1 +;In correct scale := 0 +end Patlak Plot Parameters := + +end PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + + +output filename prefix:=POSSPS +; iteration scheme +; Number of subsets should be a divisor of num_views/4 +number of subsets:=${NUMSUBS} +; Use for starting the numbering from something else than 1 +start at subiteration number:=1 +; Use if you want to start from another subset than 0 (but why?) +start at subset:= 0 +number of subiterations:= ${ITER} +save estimates at subiteration intervals:= ${SAVITER} +;write update estimate := 0 + +; if next is disabled, defaults to image full of 1s (but that's not good for OSSPS) +; in particular, make sure it has the correct scale +initial estimate := indirect_Patlak.img +enforce initial positivity condition := 1 + +; additional regularisation + +;inter-iteration filter subiteration interval:= 0 +;inter-iteration filter type := none + +; here start OSSPS specific values + +; values to use for the 'precomputed denominator' + ; if you do not specify the following keyword, the 'precomputed denominator' + ; will be computed automatically (and saved) + ; use the following if you have it already (e.g. from previous run) + ; note: setting the value to 1 will use an images full of ones (which is not a good idea!) + ; precomputed denominator := my_precomputed_denominator.hv + +; specify relaxation scheme +; lambda = relaxation_parameter/ (1+relaxation_gamma*(subiteration_num/num_subsets) +relaxation parameter := 1 +relaxation gamma:=.1 + + +END := + + + + + + diff --git a/examples/samples/PatlakPlot.par b/examples/samples/PatlakPlot.par new file mode 100644 index 0000000000..f8135b7477 --- /dev/null +++ b/examples/samples/PatlakPlot.par @@ -0,0 +1,13 @@ +Patlak Plot Parameters:= + +time frame definition filename := +starting frame := UNSIGNEDINT +calibration factor := FLOAT +scale factor := FLOAT +blood data filename := +; In seconds +Time Shift := 0 +In total counts := 1 +In correct scale := 1 + +end Patlak Plot Parameters:= diff --git a/examples/samples/SPECT_Interfile_header.hs b/examples/samples/SPECT_Interfile_header.hs new file mode 100644 index 0000000000..14777a3126 --- /dev/null +++ b/examples/samples/SPECT_Interfile_header.hs @@ -0,0 +1,58 @@ +!INTERFILE := +; This is a sample minimal header for SPECT tomographic data +; The format is as per the 3.3 Interfile standard (aside from time frame info) + +!imaging modality := nucmed + +; name of file with binary data +name of data file := somefile.s + +!version of keys := 3.3 +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := Tomographic + +; optional keywords specifying patient position (currently ignored) +; patient rotation := prone +; patient orientation := feet_in + +imagedata byte order := LITTLEENDIAN + +!SPECT STUDY (General) := +; specify how the data are stored on disk +; here given as "single-precision float" (you could have "unsigned integer" data instead) +!number format := float +!number of bytes per pixel := 4 +!number of projections := 120 +; total rotation (or coverage) angle (in degrees) +!extent of rotation := 360 +process status := acquired +!SPECT STUDY (acquired data):= +; rotation info (e.g. clock-wise or counter-clock wise) +!direction of rotation := CW +start angle := 180 + +; Orbit definition +orbit := Circular +; radius in mm +Radius := 150 +; or +; orbit := Non-circular +; give a list of "radii", one for every position +; Radius := {150, 151, 153, ....} + +; pixel sizes in the acquired data, first in "transverse" direction, then in "axial" direction +!matrix size [1] := 128 +!scaling factor (mm/pixel) [1] := 3.32 +!matrix size [2] := 64 +!scaling factor (mm/pixel) [2] := 6.64 + +; optional keywords specifying frame duration etc +; These are not according to the Interfile 3.3 specification +; Currently only useful in STIR for dynamic applications +; (but a "time frame" is considered to be all projections acquired at the same time) +;number of time frames := 1 +;image duration (sec)[1] := 0 +;image relative start time (sec)[1] := 0 + +!END OF INTERFILE := diff --git a/examples/samples/correct_projdata.par b/examples/samples/correct_projdata.par new file mode 100644 index 0000000000..0c8d3ae495 --- /dev/null +++ b/examples/samples/correct_projdata.par @@ -0,0 +1,60 @@ +correct_projdata Parameters := + + input file := trues.hs + + ; Current way of specifying time frames, pending modifications to + ; STIR to read time info from the headers + ; see class documentation for TimeFrameDefinitions for the format of this file + ; time frame definition filename := frames.fdef + + ; if a frame definition file is specified, you can say that the input data + ; corresponds to a specific time frame + ; the number should be between 1 and num_frames and defaults to 1 + ; this is currently only used to pass the relevant time to the normalisation + ; time frame number := 1 + + ; output file + ; for future compatibility, do not use an extension in the name of the + ; output file. It will be added automatically + output filename := precorrected + + ; default value for next is -1, meaning 'all segments' + ; maximum absolute segment number to process := + + + ; use data in the input file, or substitute data with all 1's + ; (useful to get correction factors only) + ; default is '1' + ; use data (1) or set to one (0) := + + ; precorrect data, or undo precorrection + ; default is '1' + ; apply (1) or undo (0) correction := + + ; parameters specifying correction factors + ; if no value is given, the corresponding correction will not be performed + + ; random coincidences estimate, subtracted before anything else is done + ;randoms projdata filename := random.hs + ; normalisation (or binwise multiplication, so can contain attenuation factors as well) + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= norm.hs + End Bin Normalisation From ProjData:= + + ; attenuation image, will be forward projected to get attenuation factors + ; OBSOLETE + ;attenuation image filename := attenuation_image.hv + + ; forward projector used to estimate attenuation factors, defaults to Ray Tracing + ; OBSOLETE + ;forward_projector type := Ray Tracing + + ; scatter term to be subtracted AFTER norm+atten correction + ; defaults to 0 + ;scatter projdata filename := scatter.hs + + ; to interpolate to uniform sampling in 's', set value to 1 + ; arc correction := 0 + +END:= diff --git a/examples/samples/fore.par b/examples/samples/fore.par new file mode 100644 index 0000000000..6149faaffc --- /dev/null +++ b/examples/samples/fore.par @@ -0,0 +1,13 @@ +Rebin projdata Parameters := + rebinning type := FORE + FORE Parameters := + input file := Your_Input_File_Name.hs + output filename prefix := Your_Output_File_Name + Smallest angular frequency := 20 + Smallest transaxial frequency := 20 + Index for consistency := 20 + Delta max for small omega := 10 + maximum absolute segment number to process := 2 + FORE debug level := 0 + End FORE Parameters:= + END:= diff --git a/examples/samples/forward_project_SPECT.par b/examples/samples/forward_project_SPECT.par new file mode 100644 index 0000000000..4976e090f7 --- /dev/null +++ b/examples/samples/forward_project_SPECT.par @@ -0,0 +1,28 @@ +Forward Projector parameters:= +; example par file for specifying the forward projector for e.g. fwdtest +type:=Matrix + Forward Projector Using Matrix Parameters := + + Matrix type := SPECT UB + Projection Matrix By Bin SPECT UB Parameters:= + ; same parameters as used in the OSMAPOSL_osem_SPECT.par file + + maximum number of sigmas:= 2.0 + + psf type:= 2D + ; sigma_at_depth = collimator_slope * depth_in_cm + collimator sigma 0(cm) + collimator slope := 0.0163 + collimator sigma 0(cm) := 0.1466 + + ;Attenuation correction { Simple // Full // No } + attenuation type := Simple + ;Values in attenuation map in cm-1 (float file) + attenuation map := attMapRec.hv + + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := Attenuation Map + + End Projection Matrix By Bin SPECT UB Parameters:= + + End Forward Projector Using Matrix Parameters := +end:= diff --git a/examples/samples/forward_projector_proj_matrix_ray_tracing.par b/examples/samples/forward_projector_proj_matrix_ray_tracing.par new file mode 100644 index 0000000000..5b357b6845 --- /dev/null +++ b/examples/samples/forward_projector_proj_matrix_ray_tracing.par @@ -0,0 +1,9 @@ +Forward Projector parameters:= +; example par file for specifying the forward projector for e.g. fwdtest +type:=Matrix + Forward Projector Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := + End Forward Projector Using Matrix Parameters := +end:= diff --git a/examples/samples/forward_projector_ray_tracing.par b/examples/samples/forward_projector_ray_tracing.par new file mode 100644 index 0000000000..10512c7a57 --- /dev/null +++ b/examples/samples/forward_projector_ray_tracing.par @@ -0,0 +1,6 @@ +Forward Projector parameters:= +; example par file for specifying the forward projector for e.g. fwdtest +type:=Ray Tracing + Forward Projector Using Ray Tracing Parameters:= + End Forward Projector Using Ray Tracing Parameters:= +end:= \ No newline at end of file diff --git a/examples/samples/generate_image.par b/examples/samples/generate_image.par new file mode 100644 index 0000000000..fd72d771bc --- /dev/null +++ b/examples/samples/generate_image.par @@ -0,0 +1,79 @@ +generate_image Parameters := +; a sample file on how to use generate_image + +output filename:=image +; optional keywords to specify the output file format +; example below uses Interfile with 16-bit unsigned integers +output file format type:= Interfile + interfile Output File Format Parameters:= + number format := unsigned integer + number_of_bytes_per_pixel:=2 + ; fix the scale factor to 1 + ; comment out next line to let STIR use the full dynamic + ; range of the output type + scale_to_write_data:= 1 + End Interfile Output File Format Parameters:= + +X output image size (in pixels) := 128 +Y output image size (in pixels) := 128 +Z output image size (in pixels) := 95 +X voxel size (in mm) := 2.05941 +Y voxel size (in mm) := 2.05941 +Z voxel size (in mm) := 2.425 + +; parameters that determine subsampling of border voxels +; to obtain smooth edges +; setting these to 1 will just check if the centre of the voxel is in or out +; default to 5 +; Z number of samples to take per voxel := 5 +; Y number of samples to take per voxel := 5 +; X number of samples to take per voxel := 5 + +; now follows a list of shapes and their values +; each will be added to the image (so values accumulate) +; see Shape3D hierarchy for possibly shapes + +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm) := 100 + radius-y (in mm) := 100 + length-z (in mm) := 400 + ; optional start-end angles to define a wedge as opposed to a full cylinder + initial angle (in deg) :=10 + final angle (in deg) :=90 + + ; next keyword can be used for non-default axes + ; values below are give a rotation around y for 90 degrees (swapping x and z) + ; Warning: this uses the STIR convention {z,y,x} + ; direction vectors (in mm):= { {0,0,1}, {0,1,0}, {-1,0,0}} + ; origin w.r.t. to standard STIR coordinate system (middle of first plane) + origin (in mm):={230.375, 3.0192, -0.590588} + END:= +value := 1 + +next shape := + +shape type:= ellipsoid +Ellipsoid Parameters:= + radius-x (in mm):= 60 + radius-y (in mm):= 40 + radius-z (in mm):= 30 + direction vectors (in mm) := { {0,0,1}, {0,1,0}, {-1,0,0}} + origin (in mm):={130.375, 3.0192, -0.590588} +End:= +value:=5 + +next shape := + +; now cut lower activity in a box +shape type:= Box3D +box parameters:= +origin (in mm):={130.375, 3.0192, -0.590588} +length-x (in mm):=30 +length-y (in mm):=40 +length-z (in mm):=50 +END:= +value:=-1 + + +END:= diff --git a/examples/samples/list_ROI_values.par b/examples/samples/list_ROI_values.par new file mode 100644 index 0000000000..e2661dfe33 --- /dev/null +++ b/examples/samples/list_ROI_values.par @@ -0,0 +1,31 @@ +ROIValues Parameters := + ; give the ROI an (optional) name. Defaults to the empty string. + ROI name := some name + ; see Shape3D hierarchy for possible values of shapes + ROI Shape type:=ellipsoidal cylinder + Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=90 + radius-y (in mm):=90 + length-z (in mm):=1000 + ; next keyword can be used for non-default axes + ; values below are give a rotation around y for 90 degrees (swapping x and z) + ; Warning: this uses the STIR convention {z,y,x} + ; direction vectors (in mm):= { {0,0,1}, {0,1,0}, {-1,0,0}} + + ; origin w.r.t. to standard STIR coordinate system (middle of first plane) + origin (in mm):={152.775,-41.2201, 2.48019} + END:= + + ; if more than 1 ROI is desired, you can uncomment this + ; next shape := + ; ROI Shape type:=ellipsoid + ; etc + + ; the next parameters are used to determine if you want + ; to subsample the ROI template to get smoother edges + ; defaults to no subsampling + number of samples to take for ROI template-z:=1 + number of samples to take for ROI template-y:=1 + number of samples to take for ROI template-x:=1 +End:= + diff --git a/examples/samples/lm_to_projdata.par b/examples/samples/lm_to_projdata.par new file mode 100644 index 0000000000..70937a3d32 --- /dev/null +++ b/examples/samples/lm_to_projdata.par @@ -0,0 +1,41 @@ +lm_to_projdata Parameters:= + + input file := some_lm_file + output filename prefix := my_favorite_name_for_the_projdata + + ; parameters that determine the sizes etc of the output + + template_projdata := some_projdata_file + ; the next can be used to use a smaller number of segments than given + ; in the template + maximum absolute segment number to process := + + ; parameters for saying which events will be stored + + ; time frames (see TimeFrameDefinitions doc for format) + frame_definition file := frames.fdef + ; or a total number of events (if larger than 0, frame definitions will be ignored) + ; note that this normally counts the total of prompts-delayeds (see below) + num_events_to_store := -1 + + ; parameters relating to prompts and delayeds + + ; with the default values, prompts will be added and delayed subtracted + ; to give the usual estimate of the trues. + + ; store the prompts (value should be 1 or 0) + store prompts := 1 ;default + ; what to do if it's a delayed event + store delayeds := 1 ;default + + ; miscellaneous parameters + + ; list each event on stdout and do not store any files (use only for testing!) + ; has to be 0 or 1 + List event coordinates := 0 + + ; if you're short of RAM (i.e. a single projdata does not fit into memory), + ; you can use this to process the list mode data in multiple passes. + num_segments_in_memory := -1 + +End := diff --git a/examples/samples/postfilter_Metz.par b/examples/samples/postfilter_Metz.par new file mode 100644 index 0000000000..df746aa2f6 --- /dev/null +++ b/examples/samples/postfilter_Metz.par @@ -0,0 +1,15 @@ +PostFilteringParameters := + Postfilter type := Separable Cartesian Metz +Separable Cartesian Metz Filter Parameters := +x-dir filter FWHM (in mm):= 5 +y-dir filter FWHM (in mm):= 5 +z-dir filter FWHM (in mm):= 8 +x-dir filter Metz power:= 1.0 +y-dir filter Metz power:= 1.0 +z-dir filter Metz power:=1.0 +; optionally restrict kernel sizes +; x-dir maximum kernel size := 129 +; y-dir maximum kernel size := 129 +; z-dir maximum kernel size := 31 +END Separable Cartesian Metz Filter Parameters := +End PostFiltering Parameters:= diff --git a/examples/samples/postfilter_median3x3x3.par b/examples/samples/postfilter_median3x3x3.par new file mode 100644 index 0000000000..22bb8d9e4a --- /dev/null +++ b/examples/samples/postfilter_median3x3x3.par @@ -0,0 +1,8 @@ +PostFilteringParameters := + Postfilter type :=Median + Median Filter Parameters := + mask radius x := 1 + mask radius y := 1 + mask radius z := 1 + End Median Filter Parameters:= +End PostFiltering Parameters:= diff --git a/examples/samples/scatter.par b/examples/samples/scatter.par new file mode 100644 index 0000000000..5763783dcc --- /dev/null +++ b/examples/samples/scatter.par @@ -0,0 +1,20 @@ +Scatter Estimation Parameters:= + +attenuation_threshold :=.01 +random :=0 +use_cache :=1 +energy_resolution :=.22 +lower_energy_threshold :=350 +upper_energy_threshold :=650 + +activity_image_filename := ${ACTIVITY_IMAGE} +density_image_filename := ${DENSITY_IMAGE} +density_image_for_scatter_points_filename := ${LOW_DENSITY_IMAGE} +template_proj_data_filename := ${TEMPLATE} + +; output filename without extension +; files will be calle "out".hs and "out".log +output_filename_prefix :=${OUTPUT_PREFIX} + + +End Scatter Estimation Parameters:= diff --git a/examples/samples/stir_math_output_file_format.par b/examples/samples/stir_math_output_file_format.par new file mode 100644 index 0000000000..c1954a6ba6 --- /dev/null +++ b/examples/samples/stir_math_output_file_format.par @@ -0,0 +1,22 @@ +output file format parameters:= +; sample .par file that can be used with stir_math to specify the +; output file format +; +; See the stir::OutputFileFormat hierarchy for possible values. +; in this example, we write the data as Interfile with 2-byte signed integers + +output file format type:=Interfile +Interfile Output File Format Parameters:= + ; optional to specify non-native byte-order + ; byte order := littleendian + ; type specification as in Interfile + number format:=unsigned integer + number of bytes per pixel:=1 + ; optional to fix the scale factor used when writing the data + ; otherwise the maximum range of the output type will be used + ; if it's an integer type. + ; warning: the scale factor might be ignored by many programs that read + ; interfile as it is not part of the standard + ;scale_to_write_data:=1 +End Interfile Output File Format Parameters:= +END:= diff --git a/examples/samples/write_proj_matrix_by_bin.par b/examples/samples/write_proj_matrix_by_bin.par new file mode 100644 index 0000000000..0a4c850085 --- /dev/null +++ b/examples/samples/write_proj_matrix_by_bin.par @@ -0,0 +1,7 @@ +ProjMatrixByBin parameters:= +; example par file for specifying the projection matrix for e.g. write_proj_matrix_by_bin +type:= Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 + End Ray tracing matrix parameters := +end:= diff --git a/examples/src/CMakeLists.txt b/examples/src/CMakeLists.txt new file mode 100644 index 0000000000..6fe1bfc5f7 --- /dev/null +++ b/examples/src/CMakeLists.txt @@ -0,0 +1,12 @@ +# +# +set(dir examples) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + demo1 demo2 demo3 +) + + +include(stir_exe_targets) diff --git a/examples/src/README.txt b/examples/src/README.txt new file mode 100644 index 0000000000..53dfc8555a --- /dev/null +++ b/examples/src/README.txt @@ -0,0 +1,132 @@ + +This directory contains some files that are intended for beginning STIR +developers. The first version of these files was constructed for +(and presented at) the STIR workshop at IEEE MIC 2004. + +Source code files +----------------- + +demo1.cxx + A simple program that backprojects some projection data. + It illustrates + - basic interaction with the user, + - reading of images and projection data + - construction of a specified type of back-projector, + - how to use back-project all projection data + - output of an image + +demo2.cxx + A small modification of demo1.cxx to ask the user for the + back projector she wants to use. + It illustrates + - how to ask the user for objects for which different types + exist (e.g. back-projector, forward-projectors, image processors + etc), anything based on the RegisteredObject hierarchy. + - that STIR is able to select basic processing units at run-time + - how to use the (very) basic display facilities in STIR + +demo3.cxx + A modification of demo2.cxx that parses all parameters from a parameter file. + It illustrates + - basic class derivation principles + - how to use ParsingObject to have automatic capabilities of parsing + parameters files (and interactive questions to the user) + - how most STIR programs parse the parameter files. + + Note that the same functionality could be provided without deriving + a new class from ParsingObject. One could have a KeyParser object + in main() and fill it in directly. + +exe.mk + A sub-makefile that allows building the demonstration programs + +Supporting files +---------------- +extra_dirs.mk + A sub-makefile that needs to be moved to STIR/src/local. This way, it + will be picked up by the Makefile. Its contents simply say + that there is an exe.mk sub-makefile in examples/. + +extra_stir_dirs.cmake + As extra_dirs.mk, but when using CMake + +demo.par + An example parameter file for demo3.cxx, using the + interpolating backprojector (i.e. the default one set-up by + demo3.cxx) + +demoPM.par + An example parameter file for demo3.cxx, using the + backprojector that uses a projection matrix (using the ray tracing + model) + +generate_image.par + An example parameter file for generate_image that allows it + to construct a simple image that can be used for constructing + projection data, and it used as the template image in demo*.par. + +small.*s + An example (empty) projection data file (created using + create_projdata_template) that can be used as a template for + constructing projection data + + +How to compile using the "hand-made" Makefiles +----------------------------------------------- +mkdir -p ../src/local +cp extra_dirs.mk ../src/local/ +cd .. +make examples + +How to compile using CMake (on Unix-type systems) +----------------------------------------------- +mkdir -p ../src/local +cp extra_stir_dirs.cmake ../src/local/ +cd your-build-dir +# reconfigure your project +ccmake . +# make the examples +make examples +# optionally install everything, including the demos +make install + +How to run +---------- +First you need to create some data. + +#Generate an image + generate_image generate_image.par + +#Generate projection data + forward_project sino.hs image.hv small.hs + +# Run the demos. +DEST=../opt +# Note: Using ../opt/ above which is appropriate when using the hand-made Makefiles +# for CMake, it'd have to be your-build-dir + + $DEST/examples/demo1 +# you can display the output using for instance + manip_image output.hv + + + $DEST/examples/demo2 +# demo2 contains a call stir::display, so you'll see the display immediately +( at least when on Unix) + + + $DEST/examples/demo3 demo.par + $DEST/examples/demo3 demoPM.par +# the next one will ask the questions interactively + $DEST/examples/demo3 + + +What now ? +---------- +Play around, modify the .par files, the templates, the source, and have fun. + +Good luck + +Kris Thielemans +12 November 2004 +(with minor updates until 2014) diff --git a/examples/src/demo.par b/examples/src/demo.par new file mode 100644 index 0000000000..70bd7cb3ac --- /dev/null +++ b/examples/src/demo.par @@ -0,0 +1,6 @@ +MyStuff parameters := +input file := sino.hs +template image file := image.hv +;back projector type := +;output file format := +End := diff --git a/examples/src/demo1.cxx b/examples/src/demo1.cxx new file mode 100644 index 0000000000..5364ae6ac0 --- /dev/null +++ b/examples/src/demo1.cxx @@ -0,0 +1,70 @@ +// +// +/*! + \file + \ingroup examples + \brief A simple program that backprojects some projection data. + + It illustrates + - basic interaction with the user, + - reading of images and projection data + - construction of a specified type of back-projector, + - how to use back-project all projection data + - output of images + + See examples/README.txt + + \author Kris Thielemans +*/ +/* + Copyright (C) 2004- 2011, Hammersmith Imanet Ltd + + This software is distributed under the terms + of the GNU General Public Licence (GPL) + See STIR/LICENSE.txt for details +*/ +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/ProjData.h" +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/utilities.h" +#include "stir/Succeeded.h" + +int main() +{ + using namespace stir; + + /////////////// input sinogram + const std::string input_filename = + ask_filename_with_extension("Input file",".hs"); + + shared_ptr + proj_data_sptr(ProjData::read_from_file(input_filename)); + shared_ptr + proj_data_info_sptr(proj_data_sptr->get_proj_data_info_ptr()->clone()); + + /////////////// template image (for sizes etc) + const std::string template_filename = + ask_filename_with_extension("Template image file",".hv"); + + shared_ptr > + density_sptr(read_from_file >(template_filename)); + + density_sptr->fill(0); + + /////////////// back project + BackProjectorByBinUsingInterpolation back_projector; + + back_projector.set_up(proj_data_info_sptr, density_sptr); + + back_projector.back_project(*density_sptr, *proj_data_sptr); + + /////////////// output + OutputFileFormat >::default_sptr()-> + write_to_file("output", *density_sptr); + + return EXIT_SUCCESS; +} diff --git a/examples/src/demo2.cxx b/examples/src/demo2.cxx new file mode 100644 index 0000000000..5d8fb2920f --- /dev/null +++ b/examples/src/demo2.cxx @@ -0,0 +1,72 @@ +// +// +/*! + \file + \ingroup examples + \brief A small modification of demo1.cxx to ask the user for the + back projector she wants to use. + + It illustrates + - how to ask the user for objects for which different types + exist (e.g. back-projector, forward-projectors, image processors + etc), anything based on the RegisteredObject hierarchy. + - that STIR is able to select basic processing units at run-time + - how to use the (very) basic display facilities in STIR + + See examples/README.txt + + \author Kris Thielemans +*/ +/* + Copyright (C) 2004- 2012, Hammersmith Imanet Ltd + + This software is distributed under the terms + of the GNU General Public Licence (GPL) + See STIR/LICENSE.txt for details +*/ +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/ProjData.h" +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/utilities.h" +#include "stir/Succeeded.h" +#include "stir/display.h" + +int main() +{ + using namespace stir; + + /////////////// input sinogram + const std::string input_filename = + ask_filename_with_extension("Input file",".hs"); + + shared_ptr + proj_data_sptr(ProjData::read_from_file(input_filename)); + shared_ptr + proj_data_info_sptr(proj_data_sptr->get_proj_data_info_ptr()->clone()); + + /////////////// template image (for sizes etc) + const std::string template_filename = + ask_filename_with_extension("Template image file",".hv"); + + shared_ptr > + density_sptr(read_from_file >(template_filename)); + + density_sptr->fill(0); + + /////////////// back project + shared_ptr back_projector_sptr + (BackProjectorByBin::ask_type_and_parameters()); + + back_projector_sptr->set_up(proj_data_info_sptr, density_sptr); + + back_projector_sptr->back_project(*density_sptr, *proj_data_sptr); + + /////////////// output + OutputFileFormat >::default_sptr()-> + write_to_file("output", *density_sptr); + + return EXIT_SUCCESS; +} diff --git a/examples/src/demo3.cxx b/examples/src/demo3.cxx new file mode 100644 index 0000000000..044d10f006 --- /dev/null +++ b/examples/src/demo3.cxx @@ -0,0 +1,116 @@ +// +// +/*! + \file + \ingroup examples + \brief A modification of demo2.cxx that parses all parameters from a parameter file. + + It illustrates + - basic class derivation principles + - how to use ParsingObject to have automatic capabilities of parsing + parameters files (and interactive questions to the user) + - how most STIR programs parse the parameter files. + + Note that the same functionality could be provided without deriving + a new class from ParsingObject. One could have a KeyParser object + in main() and fill it in directly. + + See examples/README.txt + + \author Kris Thielemans +*/ +/* + Copyright (C) 2004- 2012, Hammersmith Imanet Ltd + + This software is distributed under the terms + of the GNU General Public Licence (GPL) + See STIR/LICENSE.txt for details +*/ +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/ProjData.h" +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/ParsingObject.h" +#include "stir/Succeeded.h" +#include "stir/display.h" + +namespace stir { + +class MyStuff: public ParsingObject +{ +public: + void set_defaults(); + void initialise_keymap(); + void run(); +private: + std::string input_filename; + std::string template_filename; + shared_ptr back_projector_sptr; + shared_ptr > > output_file_format_sptr; +}; + +void +MyStuff::set_defaults() +{ + back_projector_sptr.reset(new BackProjectorByBinUsingInterpolation); + output_file_format_sptr = OutputFileFormat >::default_sptr(); +} + +void +MyStuff::initialise_keymap() +{ + parser.add_start_key("MyStuff parameters"); + parser.add_key("input file", &input_filename); + parser.add_key("template image file", &template_filename); + parser.add_parsing_key("back projector type", &back_projector_sptr); + parser.add_parsing_key("output file format type", &output_file_format_sptr); + parser.add_stop_key("End"); +} + +void +MyStuff::run() +{ + + shared_ptr + proj_data_sptr(ProjData::read_from_file(input_filename)); + shared_ptr + proj_data_info_sptr(proj_data_sptr->get_proj_data_info_ptr()->clone()); + + shared_ptr > + density_sptr(read_from_file >(template_filename)); + + density_sptr->fill(0); + + /////////////// back project + back_projector_sptr->set_up(proj_data_info_sptr, density_sptr); + + back_projector_sptr->back_project(*density_sptr, *proj_data_sptr); + + /////////////// output + output_file_format_sptr->write_to_file("output", *density_sptr); + + display(*density_sptr, density_sptr->find_max(), "Output"); +} + +}// end of namespace stir + +int main(int argc, char **argv) +{ + using namespace stir; + + if (argc!=2) + { + std::cerr << "Normal usage: " << argv[0] << " parameter-file\n"; + std::cerr << "I will now ask you the questions interactively\n"; + } + MyStuff my_stuff; + my_stuff.set_defaults(); + if (argc!=2) + my_stuff.ask_parameters(); + else + my_stuff.parse(argv[1]); + my_stuff.run(); + return EXIT_SUCCESS; +} diff --git a/examples/src/demoPM.par b/examples/src/demoPM.par new file mode 100644 index 0000000000..20978caceb --- /dev/null +++ b/examples/src/demoPM.par @@ -0,0 +1,12 @@ +MyStuff parameters := +input file := sino.hs +template image file := image.hv +back projector type := matrix + Back Projector Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin :=5 + End Ray tracing matrix parameters := + End Back Projector Using Matrix Parameters := +;output file format := +End := diff --git a/examples/src/exe.mk b/examples/src/exe.mk new file mode 100644 index 0000000000..a02df0bd8e --- /dev/null +++ b/examples/src/exe.mk @@ -0,0 +1,9 @@ +# +# + +dir:=examples + +$(dir)_SOURCES = \ + demo1.cxx demo2.cxx demo3.cxx + +include $(WORKSPACE)/exe.mk diff --git a/examples/src/extra_dirs.mk b/examples/src/extra_dirs.mk new file mode 100644 index 0000000000..94e915800d --- /dev/null +++ b/examples/src/extra_dirs.mk @@ -0,0 +1,10 @@ +# +# +# sample file that includes the examples directory into the STIR build. +# You should copy this file to STIR/local (unless you have one there already, in +# which case you need to edit that file instead of course). +# See also examples/README.txt and the section on how to extend STIR with your own +# files in the STIR developer's Guide. + + +EXEDIRS += examples diff --git a/examples/src/extra_stir_dirs.cmake b/examples/src/extra_stir_dirs.cmake new file mode 100644 index 0000000000..d778b73f5f --- /dev/null +++ b/examples/src/extra_stir_dirs.cmake @@ -0,0 +1,10 @@ +# +# +# sample file that includes the examples directory into the STIR build. +# You should copy this file to STIR/local (unless you have one there already, in +# which case you need to edit that file instead of course). +# See also examples/README.txt and the section on how to extend STIR with your own +# files in the STIR developer's Guide. + + +list(APPEND STIR_DIRS examples) \ No newline at end of file diff --git a/examples/src/generate_image.par b/examples/src/generate_image.par new file mode 100644 index 0000000000..2508435dd6 --- /dev/null +++ b/examples/src/generate_image.par @@ -0,0 +1,27 @@ +generate_image Parameters := +output filename:=image +X output image size (in pixels):=56 +Y output image size (in pixels):=56 +Z output image size (in pixels):=15 +X voxel size (in mm):= 2.05941 +Y voxel size (in mm):= 2.05941 +Z voxel size (in mm) :=3.125 +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=40 + radius-y (in mm):=20 + length-z (in mm):=50 + origin (in mm):={30,6,-0.5} + END:= +value :=1 + + next shape := +shape type:= ellipsoid +Ellipsoid Parameters:= + radius-x (in mm):=10 + radius-y (in mm):=10 + radius-z (in mm):=20 + origin (in mm):={20,-8,10} + END:= +value:=2 +END:= diff --git a/examples/src/small.hs b/examples/src/small.hs new file mode 100644 index 0000000000..033db92899 --- /dev/null +++ b/examples/src/small.hs @@ -0,0 +1,36 @@ +!INTERFILE := +name of data file := small.s +originating system := RATPET +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Emission +applied corrections := {arc correction} +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 4 +matrix axis label [4] := segment +!matrix size [4] := 3 +matrix axis label [3] := view +!matrix size [3] := 28 +matrix axis label [2] := axial coordinate +!matrix size [2] := { 11,15,11} +matrix axis label [1] := tangential coordinate +!matrix size [1] := 56 +minimum ring difference per segment := { -4,-1,2} +maximum ring difference per segment := { -2,1,4} +number of rings := 8 +number of detectors per ring := 112 +inner ring diameter (cm) := 11.5 +distance between rings (cm) := 0.625 +default bin size (cm) := 0.165 +number of blocks_per_bucket in axial direction := 1 +number of crystals_per_block in axial direction := 8 +number of crystals_per_block in transaxial direction := 7 +number of detector layers := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +number of time frames := 1 +!END OF INTERFILE := diff --git a/examples/src/small.s b/examples/src/small.s new file mode 100644 index 0000000000..e69de29bb2 diff --git a/recon_test_pack/.gitignore b/recon_test_pack/.gitignore new file mode 100644 index 0000000000..b600cec9f3 --- /dev/null +++ b/recon_test_pack/.gitignore @@ -0,0 +1,3 @@ +# Output files +my_* +*.log diff --git a/recon_test_pack/FBP2D_test_sim.par b/recon_test_pack/FBP2D_test_sim.par new file mode 100644 index 0000000000..588e764f23 --- /dev/null +++ b/recon_test_pack/FBP2D_test_sim.par @@ -0,0 +1,8 @@ +FBP2DParameters := +; test file for FBP2D +input file := my_precorrected_sino.hs +xy output image size (in pixels) := 91 +zoom := .5 + +output filename prefix := my_test_sim_image_FBP2D +END := diff --git a/recon_test_pack/FBP3DRP_test_sim.par b/recon_test_pack/FBP3DRP_test_sim.par new file mode 100644 index 0000000000..61a5a04408 --- /dev/null +++ b/recon_test_pack/FBP3DRP_test_sim.par @@ -0,0 +1,8 @@ +FBP3DRPParameters := +; test file for FBP2D +input file := my_precorrected_sino.hs +xy output image size (in pixels) := 91 +zoom := .5 + +output filename prefix := my_test_sim_image_FBP3DRP +END := diff --git a/recon_test_pack/OSMAPOSL_test.par b/recon_test_pack/OSMAPOSL_test.par new file mode 100644 index 0000000000..2c6f716ef5 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test.par @@ -0,0 +1,75 @@ +OSMAPOSLParameters := + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 4 +zero end planes of segment 0:= 1 + +projector pair type := Separate Projectors + projector pair using separate projectors parameters := + forward projector type := Ray Tracing + forward projector using ray tracing parameters := + end forward projector using ray tracing parameters := + back projector type := Interpolation + back projector using interpolation parameters := + end back projector using interpolation parameters := +end projector pair using separate projectors parameters := + +;Bin Normalisation type:=None +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +; if the next parameter is disabled, +; it default to an image full of 1s. +; this will be wrong however +sensitivity filename:= RPTsens_seg4.hv + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image +; if the next parameter is disabled, +; it default to an image full of 1s. +; this funny value is just for testing if you can read an initial image +initial estimate:= RPTsens_seg4.hv +enforce initial positivity condition:=0 + +number of subsets:= 12 +start at subset:= 1 +number of subiterations:= 5 +start at subiteration number:=2 +save estimates at subiteration intervals:= 3 + + +inter-update filter subiteration interval:= 4 +inter-update filter type := Separable Cartesian Metz +Separable Cartesian Metz Filter Parameters := +x-dir filter FWHM (in mm):= 5 +y-dir filter FWHM (in mm):= 5 +z-dir filter FWHM (in mm):= 8 +x-dir filter Metz power:= 1.0 +y-dir filter Metz power:= 1.0 +z-dir filter Metz power:=1.0 +x-dir maximum kernel size := 129 +y-dir maximum kernel size := 129 +z-dir maximum kernel size := 31 +END Separable Cartesian Metz Filter Parameters := + +inter-iteration filter subiteration interval:= 4 +inter-iteration filter type := Separable Cartesian Metz +Separable Cartesian Metz Filter Parameters := +x-dir filter FWHM (in mm):= 6.0 +y-dir filter FWHM (in mm):= 6.0 +z-dir filter FWHM (in mm):= 6.0 +x-dir filter Metz power:= 2.0 +y-dir filter Metz power:= 2.0 +z-dir filter Metz power:= 2.0 +x-dir maximum kernel size := 129 +y-dir maximum kernel size := 129 +z-dir maximum kernel size := 31 +END Separable Cartesian Metz Filter Parameters := + + + +END := diff --git a/recon_test_pack/OSMAPOSL_test_PMFromFile_QPweights.par b/recon_test_pack/OSMAPOSL_test_PMFromFile_QPweights.par new file mode 100644 index 0000000000..e27ff75bc5 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_PMFromFile_QPweights.par @@ -0,0 +1,60 @@ +OSMAPOSLParameters := +; test file for OSMAPOSL with a quadratic prior (and ray tracing projection matrix) +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs +zero end planes of segment 0:= 1 +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 3 + +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +sensitivity filename:= RPTsens_seg3_PM.hv + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := From File +Projection Matrix By Bin From File Parameters:= +Version := 1.0 +symmetries type := PET_CartesianGrid + PET_CartesianGrid symmetries parameters:= + do_symmetry_90degrees_min_phi:= 1 + do_symmetry_180degrees_min_phi:= 1 + do_symmetry_swap_segment:= 1 + do_symmetry_swap_s:= 1 + do_symmetry_shift_z:= 1 + End PET_CartesianGrid symmetries parameters:= +template proj data filename:=my_PMRT_template_proj_data.hs +template density filename:=my_PMRT_template_density.hv +data_filename:=my_PMRT.pm +End Projection Matrix By Bin From File Parameters:= + End Projector Pair Using Matrix Parameters := + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := .9 + weights:={{{0,1,0},{1,0,1},{0,1,0}}} + END Quadratic Prior Parameters:= + + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image_PMFromFile_QPweights + +number of subsets:= 12 +start at subset:= 0 +number of subiterations:= 6 +save estimates at subiteration intervals:= 6 + +initial estimate := my_uniform_image_circular.hv + +map model := multiplicative + +; for compatibility with STIR 1.x +inter-iteration filter subiteration interval:= 1 +inter-iteration filter type := Truncate To Cylindrical FOV +Truncate To Cylindrical FOV Parameters:= +End Truncate To Cylindrical FOV Parameters:= + +END := diff --git a/recon_test_pack/OSMAPOSL_test_PM_MRP.par b/recon_test_pack/OSMAPOSL_test_PM_MRP.par new file mode 100644 index 0000000000..74387a0193 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_PM_MRP.par @@ -0,0 +1,84 @@ +OSMAPOSLParameters := + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs + +zero end planes of segment 0:= 1 +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 3 + +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +sensitivity filename:= RPTsens_seg3_PM.hv + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +prior type := FilterRootPrior +FilterRootPrior Parameters:= + penalisation factor := .2 + Filter type:= median + Median Filter Parameters := + mask radius x := 1 + mask radius y := 1 + mask radius z := 0 + End Median Filter Parameters:= +END FilterRootPrior Parameters:= + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image_PM_MRP + +number of subsets:= 12 +start at subset:= 0 +number of subiterations:= 6 +save estimates at subiteration intervals:= 6 + + +; you normally wouldn't use a filter and a prior, but this is just for testing +inter-iteration filter subiteration interval:= 2 +inter-iteration filter type := Chained Data Processor +Chained Data Processor Parameters:= +Data Processor to apply first:= Chained Data Processor +Chained Data Processor Parameters:= +Data Processor to apply first:= Truncate To Cylindrical FOV +Truncate To Cylindrical FOV Parameters:= +strictly_less_than_radius:=1 +End Truncate To Cylindrical FOV Parameters:= + + +Data Processor to apply second:=Separable Cartesian Metz +Separable Cartesian Metz Filter Parameters := +x-dir filter FWHM (in mm):= 6.0 +y-dir filter FWHM (in mm):= 5.0 +z-dir filter FWHM (in mm):= 4.0 +x-dir filter Metz power:= 2.0 +y-dir filter Metz power:= 1.0 +z-dir filter Metz power:= 0.0 +x-dir maximum kernel size := 13 +y-dir maximum kernel size := 13 +z-dir maximum kernel size := 31 +END Separable Cartesian Metz Filter Parameters := + +END Chained Data Processor Parameters:= + +Data Processor to apply second:=Truncate To Cylindrical FOV +Truncate To Cylindrical FOV Parameters:= +strictly_less_than_radius:=0 +End Truncate To Cylindrical FOV Parameters:= + +END Chained Data Processor Parameters:= + +start at subiteration number:=2 +enforce initial positivity condition:=0 +initial estimate := my_uniform_image.hv + +map model := multiplicative +END := diff --git a/recon_test_pack/OSMAPOSL_test_PM_QP.par b/recon_test_pack/OSMAPOSL_test_PM_QP.par new file mode 100644 index 0000000000..d78b7a4ab9 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_PM_QP.par @@ -0,0 +1,49 @@ +OSMAPOSLParameters := +; test file for OSMAPOSL with a quadratic prior (and ray tracing projection matrix) + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs +zero end planes of segment 0:= 1 +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 3 + +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +sensitivity filename:= RPTsens_seg3_PM.hv + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 +; restrict to cylindrical fov := 0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 0.5 + ; next defaults to 0, set to 1 for 2D inverse Euclidean weights, 0 for 3D + only 2D:= 0 + END Quadratic Prior Parameters:= + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image_PM_QP +number of subsets:= 12 +start at subset:= 0 +number of subiterations:= 6 +save estimates at subiteration intervals:= 6 +enforce initial positivity condition:=1 +initial estimate := my_uniform_image_circular.hv + +map model := multiplicative + +; for compatibility with STIR 1.x +inter-iteration filter subiteration interval:= 1 +inter-iteration filter type := Truncate To Cylindrical FOV +Truncate To Cylindrical FOV Parameters:= +End Truncate To Cylindrical FOV Parameters:= +END := diff --git a/recon_test_pack/OSMAPOSL_test_PM_QPweights.par b/recon_test_pack/OSMAPOSL_test_PM_QPweights.par new file mode 100644 index 0000000000..72a7f965e2 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_PM_QPweights.par @@ -0,0 +1,49 @@ +OSMAPOSLParameters := +; test file for OSMAPOSL with a quadratic prior (and ray tracing projection matrix) +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs +zero end planes of segment 0:= 1 +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 3 + +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +sensitivity filename:= RPTsens_seg3_PM.hv + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := .9 + weights:={{{0,1,0},{1,0,1},{0,1,0}}} + END Quadratic Prior Parameters:= + + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image_PM_QPweights + +number of subsets:= 12 +start at subset:= 0 +number of subiterations:= 6 +save estimates at subiteration intervals:= 6 + +initial estimate := my_uniform_image_circular.hv + +map model := multiplicative + +; for compatibility with STIR 1.x +inter-iteration filter subiteration interval:= 1 +inter-iteration filter type := Truncate To Cylindrical FOV +Truncate To Cylindrical FOV Parameters:= +End Truncate To Cylindrical FOV Parameters:= + +END := diff --git a/recon_test_pack/OSMAPOSL_test_PM_for_sensitivity.par b/recon_test_pack/OSMAPOSL_test_PM_for_sensitivity.par new file mode 100644 index 0000000000..55ed0eacf9 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_PM_for_sensitivity.par @@ -0,0 +1,42 @@ +OSMAPOSLParameters := + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs + +zero end planes of segment 0:= 1 + +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 3 + +; choose size of pixels +; x,y pixel size = zoom * bin_size +zoom := .7 +; number of x,y pixels (-1 takes default value to cover the FOV) +xy output image size (in pixels) := 60 + +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +sensitivity filename:= my_RPTsens_seg3_PM.hv +recompute sensitivity := 1 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image_PM_MRP + +number of subsets:= 12 +start at subset:= 0 +number of subiterations:= 1 +save estimates at subiteration intervals:= 1 +start at subiteration number:=2 + +END := diff --git a/recon_test_pack/OSMAPOSL_test_for_sensitivity.par b/recon_test_pack/OSMAPOSL_test_for_sensitivity.par new file mode 100644 index 0000000000..f1b13443b0 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_for_sensitivity.par @@ -0,0 +1,45 @@ +OSMAPOSLParameters := + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 4 +zero end planes of segment 0:= 1 + +projector pair type := Separate Projectors + projector pair using separate projectors parameters := + forward projector type := Ray Tracing + forward projector using ray tracing parameters := + end forward projector using ray tracing parameters := + back projector type := Interpolation + back projector using interpolation parameters := + end back projector using interpolation parameters := +end projector pair using separate projectors parameters := + +;Bin Normalisation type:=None +; if the next parameter is disabled, +; it default to an image full of 1s. +; this will be wrong however +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +sensitivity filename:= my_RPTsens_seg4.hv +recompute sensitivity:=1 + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image +; if the next parameter is disabled, +; it default to an image full of 1s. +; this funny value is just for testing if you can read an initial image +initial estimate:= RPTsens_seg4.hv +enforce initial positivity condition:=0 + +number of subsets:= 12 +start at subset:= 1 +number of subiterations:= 1 +start at subiteration number:=2 +save estimates at subiteration intervals:= 1 + +END := diff --git a/recon_test_pack/OSMAPOSL_test_sim_PM.par b/recon_test_pack/OSMAPOSL_test_sim_PM.par new file mode 100644 index 0000000000..a8fde10bff --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_sim_PM.par @@ -0,0 +1,44 @@ +OSMAPOSLParameters := +; test file for OSMAPOSL with a quadratic prior (and ray tracing projection matrix) +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := my_prompts.hs +zero end planes of segment 0:= 0 ; segment 0 is has direct and indirect planes +; if disabled, defaults to maximum segment number in the file +;maximum absolute segment number to process := 3 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 10 +; do symmetry 90degrees min phi := 0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= my_acfs.hs + End Bin Normalisation From ProjData:= + +additive sinogram := my_additive_sinogram.hs + +xy output image size (in pixels) := 91 +zoom := .5 + +use subset sensitivities:=1 +subset sensitivity filenames:= my_DSTE_sens_2D_PM_s14_%d.hv +recompute_sensitivity:=1 + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_sim_image_OSMAPOSL_PM +number of subsets:= 14 +start at subset:= 0 +number of subiterations:= 28 +save estimates at subiteration intervals:= 7 + +;report objective function values interval := 1 + +END := diff --git a/recon_test_pack/OSMAPOSL_test_sim_PM_QP.par b/recon_test_pack/OSMAPOSL_test_sim_PM_QP.par new file mode 100644 index 0000000000..a42e5a6362 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_test_sim_PM_QP.par @@ -0,0 +1,50 @@ +OSMAPOSLParameters := +; test file for OSMAPOSL with a quadratic prior (and ray tracing projection matrix) +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := my_prompts.hs +zero end planes of segment 0:= 0 ; segment 0 is has direct and indirect planes +; if disabled, defaults to maximum segment number in the file +;maximum absolute segment number to process := 3 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 10 +; do symmetry 90degrees min phi := 0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= my_acfs.hs + End Bin Normalisation From ProjData:= + +additive sinogram := my_additive_sinogram.hs + +xy output image size (in pixels) := 91 +zoom := .5 + +use subset sensitivities:=1 +subset sensitivity filenames:= my_DSTE_sens_2D_PM_s14_%d.hv +recompute_sensitivity:=1 + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 1 + ;weights:={{{0,1,0},{1,0,1},{0,1,0}}} + END Quadratic Prior Parameters:= + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_sim_image_OSMAPOSL_PM_QP +number of subsets:= 14 +start at subset:= 0 +number of subiterations:= 28 +save estimates at subiteration intervals:= 14 + +;report objective function values interval := 1 + +END := diff --git a/recon_test_pack/OSMAPOSL_with_motion_test.par b/recon_test_pack/OSMAPOSL_with_motion_test.par new file mode 100644 index 0000000000..253af4f452 --- /dev/null +++ b/recon_test_pack/OSMAPOSL_with_motion_test.par @@ -0,0 +1,48 @@ +OSMAPOSLParameters := +; test file used for OSEM with motion modelling + +objective function type:=PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion Parameters:= + +input filename := my_att_fwd_test_object + +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := -1 +; see User's Guide to see when you need this +zero end planes of segment 0 := 0 + +projector pair type := Matrix +Projector Pair Using Matrix Parameters := +Matrix type := Ray Tracing +Ray Tracing Matrix Parameters:= + restrict to cylindrical fov := 1 + ; use a slightly better approximation than simple ray tracing + number of rays in tangential direction to trace for each bin := 10 + ; remove one symmetry such that we can use more subsets + do symmetry 90degrees min phi := 0 +End Ray Tracing Matrix Parameters:= +End Projector Pair Using Matrix Parameters := + +recompute sensitivity := 1 +use subset sensitivities := 1 + +normalisation sinograms := my_ACF_test_object +;additive sinograms := my_test_object_additive_sinogram + +Gate Definitions filename := my_translation.gdef +Motion Vectors filename prefix := my_translation +Reverse Motion Vectors filename prefix := my_reverse_translation + +zoom:= 1 +xy output image size (in pixels) := 101 +end PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion Parameters:= + +; Number of subsets should be a divisor of num_views/4 +;initial estimate := my_test_object_g1.hv +number of subsets:= 28 +number of subiterations:= 46 +save estimates at subiteration intervals:= 28 +output filename prefix := my_rec_test_object + +END := + diff --git a/recon_test_pack/OSSPS_test_PM_QP.par b/recon_test_pack/OSSPS_test_PM_QP.par new file mode 100644 index 0000000000..507cc58bd0 --- /dev/null +++ b/recon_test_pack/OSSPS_test_PM_QP.par @@ -0,0 +1,73 @@ +OSSPSParameters := +; sample file for OSSPS +; parameters used here are for illustrative purposes only +; i.e. they are not recommended values + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := Utahscat600k_ca_seg4.hs +zero end planes of segment 0:= 1 +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := 3 + +; change to STIR 2.x default for compatibility +use subset sensitivities:=0 +sensitivity filename:= RPTsens_seg3_PM.hv + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 +; restrict to cylindrical fov := 0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +; additive sinogram:=my_fake_randoms.hs +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 0.5 + ; next defaults to 0, set to 1 for 2D inverse Euclidean weights, 0 for 3D + only 2D:= 0 + END Quadratic Prior Parameters:= + +End PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_image_OSSPS_PM_QP +; iteration scheme + +number of subsets:= 4 +;start at subset:= 0 +;start at subiteration number := 1 +number of subiterations:= 8 +Save estimates at subiteration intervals:= 8 +;write update image := 0 +;report objective function values interval := 1 + +; if next is disabled, defaults to image full of 1s (but that's not good for OSSPS) +; in particular, make sure it has the correct scale +initial estimate:= test_image_PM_QP_6.hv +enforce initial positivity condition := 1 + +; here start OSSPS specific values + +; values to use for the 'precomputed denominator' +; specify either procomputed denomiator or normalisation type + ; use the following if you have it already (e.g. from previous run) + ; note: setting the value to 1 will use an images full of ones. + ; precomputed denominator := my_precomputed_denominator.hv + +; specify relaxation scheme +; lambda = relaxation_parameter/ (1+relaxation_gamma*(subiteration_num/num_subsets) +relaxation parameter := 2 +relaxation gamma:=.1 + + +END := + + + + + + diff --git a/recon_test_pack/OSSPS_test_sim_PM_QPweights.par b/recon_test_pack/OSSPS_test_sim_PM_QPweights.par new file mode 100644 index 0000000000..2b8bc4737e --- /dev/null +++ b/recon_test_pack/OSSPS_test_sim_PM_QPweights.par @@ -0,0 +1,66 @@ +OSSPSParameters := +; test file for OSSPS with a quadratic prior (and ray tracing projection matrix) +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := my_prompts.hs +zero end planes of segment 0:= 1 +; if disabled, defaults to maximum segment number in the file +;maximum absolute segment number to process := 3 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 + do symmetry 90degrees min phi := 0 + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= my_acfs.hs + End Bin Normalisation From ProjData:= + +additive sinogram := my_additive_sinogram.hs + +use subset sensitivities:=1 +subset sensitivity filenames:= my_DSTE_sens_2D_PM_s28_%d.hv +recompute_sensitivity:=1 + +prior type := quadratic + Quadratic Prior Parameters:= + penalisation factor := 1 + weights:={{{0,1,0},{1,0,1},{0,1,0}}} + END Quadratic Prior Parameters:= + + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +output filename prefix := my_test_sim_image_OSSPS_PM_QPweights + +number of subsets:= 28 +start at subset:= 0 +number of subiterations:= 56 +save estimates at subiteration intervals:= 56 + +;report objective function values interval := 1 +; if next is disabled, defaults to image full of 1s (but that's not good for OSSPS) +; in particular, make sure it has the correct scale +initial estimate:= my_test_sim_image_OSMAPOSL_PM_14.hv +;enforce initial positivity condition := 1 + +; here start OSSPS specific values + +; values to use for the 'precomputed denominator' +; specify either procomputed denomiator or normalisation type + ; use the following if you have it already (e.g. from previous run) + ; precomputed denominator := my_precomputed_denominator.hv + +; specify relaxation scheme +; lambda = relaxation_parameter/ (1+relaxation_gamma*(subiteration_num/num_subsets) +relaxation parameter := 2 +relaxation gamma:=.1 + + +END := diff --git a/recon_test_pack/README.txt b/recon_test_pack/README.txt new file mode 100644 index 0000000000..4aa88084a1 --- /dev/null +++ b/recon_test_pack/README.txt @@ -0,0 +1,134 @@ + +README file for STIR recon_test_pack version 3.0 (and later versions?) +---------------------------------------------------------------------- + +This test pack runs some simple tests to check if various STIR reconstruction +algorithms, correct_projdata, generate_image and stir_math (and optionally some ECAT utilities) +work as expected. This works mostly by checking +their output with output generated by the STIR team itself. + +Running the test pack is automatic, but takes a few minutes (depending +on your hardware of course). + +Tests are independent of each other, as each test uses the 'good' files +as input. + +The run_*test*.sh files are (Bourne) shell scripts that run all tests +automatically. run_*tests.bat is the corresponding DOS/Windows batch file +(currently not available for all tests). + +The scripts write some diagnostic output to stdout. Output of +all programs is redirected to log files. In case anything is wrong, these +might contain something useful. Please check the FAQ on the STIR Wiki if +you have test failures. If you cannot solve the problems, email to +the user's mailing list (see http://stir.sourceforge.net for info), with all log +files attached to the email. + +Warning: +Any existing files called my_*s or my_*v will be deleted before the actual +tests start. This is because all tests generate such files and we do not +want to have any confusion with files that remained from a previous run. + + +Run the tests as follows. + +Note: in the command line description the notation [] is used to +denote an optional argument. + +Prerequisites: +--------------- +You need to have installed STIR into a target directory first, +i.e. "make install", or build the INSTALL target when using +Visual Studio, XCode or another IDE. You then need to either add the +directory where the STIR executables are copied to your path, or +pass it to the scripts as indicated below. + +On Unix/Linux/MacOSX: +-------------------- +(this also work on Windows if you installed CYGWIN or MSYS) + +Important: if you compiled STIR with the MPI option, you will need to use a special +option to most scripts to tell them how to run the STIR executables. On most +systems, something like the following would work: + +sh run_tests.sh --mpicmd "mpirun -np 4" any_other_arguments_as_below + +indicating that MPI is going to use your default configuration with 4 processes. + + +Testing STIR utilities by comparing output with the output of the STIR team +........................................................................... +sh run_tests.sh [ --mpicmd cmd] [ --nointbp ] + (if all executables are in your path) + +sh run_tests.sh [ --mpicmd cmd] [ --nointbp ] my_install_dir/ + (if you copied the executables to one directory, + but it isn't in your path) + +Use the --nointbp option (case is important, don't include the []) if you want to skip +reconstructions that use the interpolating backprojector. You +probably want to do this on modern systems using 64bit compilation, as that +backprojector is known to have a problem on many of those processors +in the centre of the image. + +sh run_scatter_tests.sh optional_install_path + +Testing self-consistency of STIR simulation and reconstruction +.............................................................. +This test does a simplistic analytic simulation (no noise) of +a uniform cylinder and reconstructs the data in various ways. +The test checks the ROI mean of the reconstructed image. + +sh run_test_simulate_and_recon.sh [ --mpicmd cmd] [optional_install_path] + +Similarly, a test for motion corrected reconstruction of gated data is run as + +sh run_test_simulate_and_recon_with_motion.sh [ --mpicmd cmd] [optional_install_path] + + + +Testing SPECT reconstructions +............................. +cd SPECT +sh run_SPECT_tests.sh [ --mpicmd cmd] [--usecache] [optional_install_path] + +The "--usecache" option will tell OSMAPOSL to keep the SPECT projection matrix in memory +which means that the reconstruction will be faster IF you have enough RAM memory in your system. + + +Testing ECAT7 utilities +.............................. +If you have compiled STIR to use the LNN matrix library for ECAT7 support. +(ECAT6 support is no longer tested as it usually fails due to bugs in the +LLN matrix library). + +sh run_ecat_tests.sh [optional_install_path] + + + +On Windows: +---------- +Note: currently MPI support is not in these batch files. Install CYGWIN or MSYS and use the +above scripts (which will work executables compiled with Visual Studio).. + +Open a command prompt window +cd to where you extracted the test pack. +type + +run_tests [ --nointbp ] + (if all executables are in your path) + +run_tests [ --nointbp ] g:\my_install_dir\ + (if you copied the executables to one directory (on drive g), + but it isn't in your path) + +See above for the --nointbp option. + +Similarly, to execute tests for ECAT7 routines, do + +run_ecat_tests [ install_dir ] + + +Kris Thielemans +Matthew Jacobson + diff --git a/recon_test_pack/ROI_small_uniform_cylinder.par b/recon_test_pack/ROI_small_uniform_cylinder.par new file mode 100644 index 0000000000..09f7dd9b58 --- /dev/null +++ b/recon_test_pack/ROI_small_uniform_cylinder.par @@ -0,0 +1,13 @@ +ROIValues Parameters := + ; give the ROI an (optional) name. Defaults to the empty string. + ROI name := cylinder + +ROI shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=60 + radius-y (in mm):=50 + length-z (in mm):=12 + origin (in mm):={80,40,-30} + END:= + +END:= diff --git a/recon_test_pack/ROI_uniform_cylinder.par b/recon_test_pack/ROI_uniform_cylinder.par new file mode 100644 index 0000000000..96f3458ac4 --- /dev/null +++ b/recon_test_pack/ROI_uniform_cylinder.par @@ -0,0 +1,13 @@ +ROIValues Parameters := + ; give the ROI an (optional) name. Defaults to the empty string. + ROI name := cylinder + +ROI shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=90 + radius-y (in mm):=90 + length-z (in mm):=100 + origin (in mm):={70,10,20} + END:= + +END:= diff --git a/recon_test_pack/RPTsens_seg3_PM.ahv b/recon_test_pack/RPTsens_seg3_PM.ahv new file mode 100644 index 0000000000..5e56e67da0 --- /dev/null +++ b/recon_test_pack/RPTsens_seg3_PM.ahv @@ -0,0 +1,18 @@ +!INTERFILE := +!name of data file := RPTsens_seg3_PM.v +!total number of images := 31 +!data offset in bytes := 0 +!imagedata byte order := LITTLEENDIAN +!number format := short float +!number of bytes per pixel := 4 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +;Correct value is of keyword (commented out) +;!slice thickness (pixels) := 0.759939 +;Value for Analyze +!slice thickness (pixels) := 3.375 +!END OF INTERFILE := diff --git a/recon_test_pack/RPTsens_seg3_PM.hv b/recon_test_pack/RPTsens_seg3_PM.hv new file mode 100644 index 0000000000..3c3d8e6a0e --- /dev/null +++ b/recon_test_pack/RPTsens_seg3_PM.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := RPTsens_seg3_PM.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/RPTsens_seg3_PM.v b/recon_test_pack/RPTsens_seg3_PM.v new file mode 100644 index 0000000000..8c59369899 Binary files /dev/null and b/recon_test_pack/RPTsens_seg3_PM.v differ diff --git a/recon_test_pack/RPTsens_seg4.ahv b/recon_test_pack/RPTsens_seg4.ahv new file mode 100644 index 0000000000..28ff3cb02f --- /dev/null +++ b/recon_test_pack/RPTsens_seg4.ahv @@ -0,0 +1,15 @@ +!INTERFILE := +!name of data file := RPTsens_seg4.v +!total number of images := 31 +!data offset in bytes := 0 +!imagedata byte order := LITTLEENDIAN +!number format := float +!number of bytes per pixel := 4 +matrix axis label [1] := x +!matrix size [1] := 97 +scaling factor (mm/pixel) [1] := 3.1088 +matrix axis label [2] := y +!matrix size [2] := 97 +scaling factor (mm/pixel) [2] := 3.1088 +!slice thickness (pixels) := 3.375 +!END OF INTERFILE := diff --git a/recon_test_pack/RPTsens_seg4.hv b/recon_test_pack/RPTsens_seg4.hv new file mode 100644 index 0000000000..0a5924a36b --- /dev/null +++ b/recon_test_pack/RPTsens_seg4.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := RPTsens_seg4.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 97 +scaling factor (mm/pixel) [1] := 3.1088 +matrix axis label [2] := y +!matrix size [2] := 97 +scaling factor (mm/pixel) [2] := 3.1088 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/RPTsens_seg4.v b/recon_test_pack/RPTsens_seg4.v new file mode 100644 index 0000000000..3c920e498e Binary files /dev/null and b/recon_test_pack/RPTsens_seg4.v differ diff --git a/recon_test_pack/SPECT/FBP2D.par b/recon_test_pack/SPECT/FBP2D.par new file mode 100644 index 0000000000..18505d632c --- /dev/null +++ b/recon_test_pack/SPECT/FBP2D.par @@ -0,0 +1,19 @@ +FBP2DParameters := +output filename prefix := out/FBP +input file := input.hs +Z output image size (in pixels):=64 +Back Projector type:= matrix + Back Projector Using Matrix Parameters := + Matrix type := SPECT UB + Projection Matrix By Bin SPECT UB Parameters:= + psf type:= Geometrical + attenuation type := No + mask type := No + ;mask file := mask.hv + + ; no point in keeping things in memory as FBP runs the projector only once + keep all views in cache := 0 + + End Projection Matrix By Bin SPECT UB Parameters:= + End Back Projector Using Matrix Parameters := +end:= diff --git a/recon_test_pack/SPECT/OSEM_2DPSF.par b/recon_test_pack/SPECT/OSEM_2DPSF.par new file mode 100644 index 0000000000..a5f61d4fa5 --- /dev/null +++ b/recon_test_pack/SPECT/OSEM_2DPSF.par @@ -0,0 +1,50 @@ +OSMAPOSLParameters := + + objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + input file := input.hs + + projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := SPECT UB + + Projection Matrix By Bin SPECT UB Parameters:= + + maximum number of sigmas:= 2.0 + + ;PSF type of correction { 2D // 3D // Geometrical } + psf type:= 2D + ; next 2 parameters define the PSF. They are ignored if psf_type is "Geometrical" + ; the PSF is modelled as a Gaussian with sigma dependent on the distance from the collimator + ; sigma_at_depth = collimator_slope * depth_in_cm + collimator sigma 0(cm) + collimator slope := 0.0163 + collimator sigma 0(cm) := 0.1466 + + ;Attenuation correction { Simple // Full // No } + attenuation type := Simple + ;Values in attenuation map in cm-1 + attenuation map := attMapRec.hv + + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := Explicit Mask + mask file := mask.hv + + keep all views in cache := ${CACHEALLVIEWS2D} + + End Projection Matrix By Bin SPECT UB Parameters:= + + End Projector Pair Using Matrix Parameters := + + end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + initial estimate:= init.hv + output filename prefix := out/OSEM_2DPSF + + number of subsets:= 8 + number of subiterations:= 16 + Save estimates at subiteration intervals:= 16 + + +END := diff --git a/recon_test_pack/SPECT/OSEM_3DPSF.par b/recon_test_pack/SPECT/OSEM_3DPSF.par new file mode 100644 index 0000000000..a18fce9629 --- /dev/null +++ b/recon_test_pack/SPECT/OSEM_3DPSF.par @@ -0,0 +1,50 @@ +OSMAPOSLParameters := + + objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + input file := input.hs + + projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := SPECT UB + + Projection Matrix By Bin SPECT UB Parameters:= + + maximum number of sigmas:= 2.0 + + ;PSF type of correction { 2D // 3D // Geometrical } + psf type:= 2D + ; next 2 parameters define the PSF. They are ignored if psf_type is "Geometrical" + ; the PSF is modelled as a Gaussian with sigma dependent on the distance from the collimator + ; sigma_at_depth = collimator_slope * depth_in_cm + collimator sigma 0(cm) + collimator slope := 0.0163 + collimator sigma 0(cm) := 0.1466 + + ;Attenuation correction { Simple // Full // No } + attenuation type := Simple + ;Values in attenuation map in cm-1 + attenuation map := attMapRec.hv + + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := Explicit Mask + mask file := mask.hv + + keep all views in cache := ${CACHEALLVIEWS3D} + + End Projection Matrix By Bin SPECT UB Parameters:= + + End Projector Pair Using Matrix Parameters := + + end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + initial estimate:= init.hv + output filename prefix := out/OSEM_3DPSF + + number of subsets:= 12 + number of subiterations:= 4 + Save estimates at subiteration intervals:= 4 + + +END := diff --git a/recon_test_pack/SPECT/attMapRec.hv b/recon_test_pack/SPECT/attMapRec.hv new file mode 100644 index 0000000000..03e8b28de9 --- /dev/null +++ b/recon_test_pack/SPECT/attMapRec.hv @@ -0,0 +1,29 @@ +!INTERFILE := +name of data file := attMapRec.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 128 +scaling factor (mm/pixel) [1] := 3.31995 +matrix axis label [2] := y +!matrix size [2] := 128 +scaling factor (mm/pixel) [2] := 3.31995 +matrix axis label [3] := z +!matrix size [3] := 64 +scaling factor (mm/pixel) [3] := 3.32 +first pixel offset (mm) [1] := -212.477 +first pixel offset (mm) [2] := -212.477 +first pixel offset (mm) [3] := 0 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/SPECT/attMapRec.v b/recon_test_pack/SPECT/attMapRec.v new file mode 100644 index 0000000000..a641f176bb Binary files /dev/null and b/recon_test_pack/SPECT/attMapRec.v differ diff --git a/recon_test_pack/SPECT/init.hv b/recon_test_pack/SPECT/init.hv new file mode 100644 index 0000000000..375042604f --- /dev/null +++ b/recon_test_pack/SPECT/init.hv @@ -0,0 +1,22 @@ +!INTERFILE := +name of data file := init.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 128 +scaling factor (mm/pixel) [1] := 3.31995 +matrix axis label [2] := y +!matrix size [2] := 128 +scaling factor (mm/pixel) [2] := 3.31995 +matrix axis label [3] := z +!matrix size [3] := 64 +scaling factor (mm/pixel) [3] := 3.32 +!END OF INTERFILE := diff --git a/recon_test_pack/SPECT/init.v b/recon_test_pack/SPECT/init.v new file mode 100644 index 0000000000..50db865141 Binary files /dev/null and b/recon_test_pack/SPECT/init.v differ diff --git a/recon_test_pack/SPECT/input.hs b/recon_test_pack/SPECT/input.hs new file mode 100644 index 0000000000..d3738e6faa --- /dev/null +++ b/recon_test_pack/SPECT/input.hs @@ -0,0 +1,31 @@ +!INTERFILE := +!imaging modality := nucmed +!version of keys := 3.3 +name of data file := input.s +;data offset in bytes := 0 + +!GENERAL IMAGE DATA := +!type of data := Tomographic +imagedata byte order := LITTLEENDIAN +!number format := float +!number of bytes per pixel := 4 + +!SPECT STUDY (General) := +;number of dimensions := 2 +;matrix axis label [2] := axial coordinate +!matrix size [2] := 64 +!scaling factor (mm/pixel) [2] := 3.32 +;matrix axis label [1] := bin coordinate +!matrix size [1] := 128 +!scaling factor (mm/pixel) [1] := 3.32 +!number of projections := 120 +!extent of rotation := 360 +!process status := acquired + +!SPECT STUDY (acquired data) := +!direction of rotation := CW +start angle := 180 +orbit := circular +radius := 150 + +!END OF INTERFILE := diff --git a/recon_test_pack/SPECT/input.s b/recon_test_pack/SPECT/input.s new file mode 100644 index 0000000000..4ac30cc990 Binary files /dev/null and b/recon_test_pack/SPECT/input.s differ diff --git a/recon_test_pack/SPECT/mask.hv b/recon_test_pack/SPECT/mask.hv new file mode 100644 index 0000000000..11b5ed7f37 --- /dev/null +++ b/recon_test_pack/SPECT/mask.hv @@ -0,0 +1,22 @@ +!INTERFILE := +name of data file := mask.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := signed integer +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 128 +scaling factor (mm/pixel) [1] := 3.31995 +matrix axis label [2] := y +!matrix size [2] := 128 +scaling factor (mm/pixel) [2] := 3.31995 +matrix axis label [3] := z +!matrix size [3] := 64 +scaling factor (mm/pixel) [3] := 3.32 +!END OF INTERFILE := diff --git a/recon_test_pack/SPECT/mask.v b/recon_test_pack/SPECT/mask.v new file mode 100644 index 0000000000..bcf17caf5a Binary files /dev/null and b/recon_test_pack/SPECT/mask.v differ diff --git a/recon_test_pack/SPECT/org/FBP.hv b/recon_test_pack/SPECT/org/FBP.hv new file mode 100644 index 0000000000..c7ca4d4a45 --- /dev/null +++ b/recon_test_pack/SPECT/org/FBP.hv @@ -0,0 +1,29 @@ +!INTERFILE := +name of data file := FBP.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 129 +scaling factor (mm/pixel) [1] := 3.32 +matrix axis label [2] := y +!matrix size [2] := 129 +scaling factor (mm/pixel) [2] := 3.32 +matrix axis label [3] := z +!matrix size [3] := 64 +scaling factor (mm/pixel) [3] := 3.32 +first pixel offset (mm) [1] := -212.48 +first pixel offset (mm) [2] := -212.48 +first pixel offset (mm) [3] := 0 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/SPECT/org/FBP.v b/recon_test_pack/SPECT/org/FBP.v new file mode 100644 index 0000000000..20f93802d1 Binary files /dev/null and b/recon_test_pack/SPECT/org/FBP.v differ diff --git a/recon_test_pack/SPECT/org/OSEM_2DPSF_16.hv b/recon_test_pack/SPECT/org/OSEM_2DPSF_16.hv new file mode 100644 index 0000000000..c8b8acb6fd --- /dev/null +++ b/recon_test_pack/SPECT/org/OSEM_2DPSF_16.hv @@ -0,0 +1,29 @@ +!INTERFILE := +name of data file := OSEM_2DPSF_16.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 128 +scaling factor (mm/pixel) [1] := 3.31995 +matrix axis label [2] := y +!matrix size [2] := 128 +scaling factor (mm/pixel) [2] := 3.31995 +matrix axis label [3] := z +!matrix size [3] := 64 +scaling factor (mm/pixel) [3] := 3.32 +first pixel offset (mm) [1] := -212.477 +first pixel offset (mm) [2] := -212.477 +first pixel offset (mm) [3] := 0 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/SPECT/org/OSEM_2DPSF_16.v b/recon_test_pack/SPECT/org/OSEM_2DPSF_16.v new file mode 100644 index 0000000000..8530a2d295 Binary files /dev/null and b/recon_test_pack/SPECT/org/OSEM_2DPSF_16.v differ diff --git a/recon_test_pack/SPECT/org/OSEM_3DPSF_4.hv b/recon_test_pack/SPECT/org/OSEM_3DPSF_4.hv new file mode 100644 index 0000000000..e24c837e36 --- /dev/null +++ b/recon_test_pack/SPECT/org/OSEM_3DPSF_4.hv @@ -0,0 +1,29 @@ +!INTERFILE := +name of data file := OSEM_3DPSF_4.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 128 +scaling factor (mm/pixel) [1] := 3.31995 +matrix axis label [2] := y +!matrix size [2] := 128 +scaling factor (mm/pixel) [2] := 3.31995 +matrix axis label [3] := z +!matrix size [3] := 64 +scaling factor (mm/pixel) [3] := 3.32 +first pixel offset (mm) [1] := -212.477 +first pixel offset (mm) [2] := -212.477 +first pixel offset (mm) [3] := 0 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/SPECT/org/OSEM_3DPSF_4.v b/recon_test_pack/SPECT/org/OSEM_3DPSF_4.v new file mode 100644 index 0000000000..8ba116fafc Binary files /dev/null and b/recon_test_pack/SPECT/org/OSEM_3DPSF_4.v differ diff --git a/recon_test_pack/SPECT/run_SPECT_tests.sh b/recon_test_pack/SPECT/run_SPECT_tests.sh new file mode 100755 index 0000000000..7c13e39c26 --- /dev/null +++ b/recon_test_pack/SPECT/run_SPECT_tests.sh @@ -0,0 +1,149 @@ +#! /bin/sh +# A script to check to see if reconstruction of simulated data gives the expected result. +# +# Copyright (C) 2011, Hammersmith Imanet Ltd +# Copyright (C) 2014, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +echo This script should work with STIR version 3.0. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo + +# +# Options +# +MPIRUN="" +CACHEALLVIEWS2D=0 +# always disable the cache for 3D PSF as we run less than 1 iteration +CACHEALLVIEWS3D=0 +export CACHEALLVIEWS2D +export CACHEALLVIEWS3D + +# +# Parse option arguments (--) +# Note that the -- is required to suppress interpretation of $1 as options +# to expr +# +while test `expr -- "$1" : "--.*"` -gt 0 +do + + if test "$1" = "--mpicmd" + then + MPIRUN="$2" + shift 1 + elif test "$1" = "--usecache" + then + CACHEALLVIEWS2D=1 + elif test "$1" = "--help" + then + echo "Usage: `basename $0` [--mpicmd somecmd] [--usecache] [install_dir]" + echo "(where [] means that an argument is optional)" + echo "See README.txt for more info." + exit 1 + else + echo Warning: Unknown option "$1" + echo rerun with --help for more info. + exit 1 + fi + + shift 1 + +done + +if [ $# -eq 1 ]; then + echo "Prepending $1 to your PATH for the duration of this script." + PATH=$1:$PATH +fi + +if [ ${CACHEALLVIEWS2D} -eq 1 ]; then + echo "Keeping all views in memory for the iterative reconstruction." +else + echo "Recomputing the matrix in every iteration for the iterative reconstruction." + echo "If you have plenty of memory, relaunch with the option \"--usecache\"" +fi + +command -v OSMAPOSL >/dev/null 2>&1 || { echo "OSMAPOSL not found or not executable. Aborting." >&2; exit 1; } +echo "Using `command -v FBP2D`" +echo "Using `command -v OSMAPOSL`" + +# first need to set this to the C locale, as this is what the STIR utilities use +# otherwise, awk might interpret floating point numbers incorrectly +LC_ALL=C +export LC_ALL + +rm -rf out +mkdir out + +# loop over reconstruction algorithms +error_log_files="" + +for reconpar in FBP2D OSEM_2DPSF OSEM_3DPSF; do + # test first if analytic reconstruction and if so, run pre-correction + isFBP=0 + if expr ${reconpar} : FBP > /dev/null; then + isFBP=1 + recon=FBP2D + else + isFBP=0 + recon=OSMAPOSL + fi + + echo "=============================================" + #echo "Using `command -v ${recon}`" + + parfile=${reconpar}.par + # run actual reconstruction + echo "Running ${recon} ${parfile}" + logfile=out/${parfile}.log + ${MPIRUN} ${recon} ${parfile} > ${logfile} 2>&1 + if [ $? -ne 0 ]; then + echo "Error running reconstruction. CHECK RECONSTRUCTION LOG ${logfile}" + error_log_files="${error_log_files} ${logfile}" + break + fi + + # find filename of (last) image from ${parfile} + output_filename=`awk -F':=' '/output[ _]*filename[ _]*prefix/ { value=$2;gsub(/[ \t]/, "", value); printf("%s", value) }' ${parfile}` + if [ ${isFBP} -eq 0 ]; then + # iterative algorithm, so we need to append the num_subiterations + num_subiterations=`awk -F':=' '/number[ _]*of[ _]*subiterations/ { value=$2;gsub(/[ \t]/, "", value); printf("%s", value) }' ${parfile}` + output_filename=${output_filename}_${num_subiterations} + fi + output_image=${output_filename}.hv + + # horrible way to replace "out" with "org" (as we don't want to rely on bash) + org_output_image=out`expr substr ${output_image} 4 100` + + if compare_image ${org_output_image} ${output_image} + then + echo ---- This test seems to be ok !; + else + echo There were problems here!; + error_log_files="${error_log_files} my_${parfile}.log" + fi +done + +echo "=============================================" +if [ -z "${error_log_files}" ]; then + echo "All tests OK!" + echo "You can remove all output using \"rm -rf out\"" +else + echo "There were errors. Check ${error_log_files}" +fi + diff --git a/recon_test_pack/Utahscat600k_ca.scn b/recon_test_pack/Utahscat600k_ca.scn new file mode 100644 index 0000000000..9815bf36ca Binary files /dev/null and b/recon_test_pack/Utahscat600k_ca.scn differ diff --git a/recon_test_pack/Utahscat600k_ca_seg4.hs b/recon_test_pack/Utahscat600k_ca_seg4.hs new file mode 100644 index 0000000000..097cca0c0f --- /dev/null +++ b/recon_test_pack/Utahscat600k_ca_seg4.hs @@ -0,0 +1,29 @@ +!INTERFILE := +name of data file := Utahscat600k_ca_seg4.s +originating system := PRT-1 +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Emission +applied corrections:={arc correction} +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 4 +matrix axis label [4] := segment +!matrix size [4] := 9 +matrix axis label [2] := view +!matrix size [2] := 96 +matrix axis label [3] := axial coordinate +!matrix size [3] := { 12,13,14,15,16,15,14,13,12} +matrix axis label [1] := tangential coordinate +!matrix size [1] := 128 +minimum ring difference per segment := { -4,-3,-2,-1,0,1,2,3,4} +maximum ring difference per segment := { -4,-3,-2,-1,0,1,2,3,4} +number of rings := 16 +number of detectors per ring := 384 +distance between rings (cm) := 0.675 +data offset in bytes[1] := 0 +number of time frames := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/Utahscat600k_ca_seg4.s b/recon_test_pack/Utahscat600k_ca_seg4.s new file mode 100644 index 0000000000..3d4c718bb1 Binary files /dev/null and b/recon_test_pack/Utahscat600k_ca_seg4.s differ diff --git a/recon_test_pack/convecat6_if.inp b/recon_test_pack/convecat6_if.inp new file mode 100644 index 0000000000..687a5f01ad --- /dev/null +++ b/recon_test_pack/convecat6_if.inp @@ -0,0 +1,7 @@ +n +1 +0 +1 +0 +4 +Y diff --git a/recon_test_pack/correct_projdata.par b/recon_test_pack/correct_projdata.par new file mode 100644 index 0000000000..73c25547cc --- /dev/null +++ b/recon_test_pack/correct_projdata.par @@ -0,0 +1,21 @@ +correct_projdata Parameters := + + input file := Utahscat600k_ca_seg4.hs + + output filename := my_correct_projdata_test_CR + ; use data (1) or set to one (0) := + + ; apply (1) or undo (0) correction := + + randoms projdata filename := my_fake_randoms.hs + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= my_fake_norm.hs + End Bin Normalisation From ProjData:= + + ; scatter term to be subtracted AFTER norm+atten correction + ; defaults to 0 + ;scatter projdata filename := scatter.hs + +END:= diff --git a/recon_test_pack/correct_projdata_simulation.par b/recon_test_pack/correct_projdata_simulation.par new file mode 100644 index 0000000000..84031b50cd --- /dev/null +++ b/recon_test_pack/correct_projdata_simulation.par @@ -0,0 +1,19 @@ +correct_projdata Parameters := + + input file := my_prompts.hs + output filename := my_precorrected_sino.hs + ; use data (1) or set to one (0) := + apply (1) or undo (0) correction := 1 + randoms projdata filename := my_randoms.hs + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + ; only attenuation here for this simulation + normalisation projdata filename:= my_acfs.hs + End Bin Normalisation From ProjData:= + + ; scatter term to be subtracted AFTER norm+atten correction + ; defaults to 0 + ;scatter projdata filename := scatter.hs + +END:= diff --git a/recon_test_pack/forward_projector_proj_matrix_ray_tracing.par b/recon_test_pack/forward_projector_proj_matrix_ray_tracing.par new file mode 100644 index 0000000000..84c7c2d5d6 --- /dev/null +++ b/recon_test_pack/forward_projector_proj_matrix_ray_tracing.par @@ -0,0 +1,10 @@ +Forward Projector parameters:= +; example par file for specifying the forward projector for e.g. fwdtest +type:=Matrix + Forward Projector Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 10 + End Ray tracing matrix parameters := + End Forward Projector Using Matrix Parameters := +end:= diff --git a/recon_test_pack/generate_test_object.par b/recon_test_pack/generate_test_object.par new file mode 100644 index 0000000000..ddd1353fa9 --- /dev/null +++ b/recon_test_pack/generate_test_object.par @@ -0,0 +1,33 @@ +generate_image Parameters := +output filename:=my_test_object_g1 +X output image size (in pixels):=101 +Y output image size (in pixels):=101 +Z output image size (in pixels):=47 +X voxel size (in mm):= 2.397 +Y voxel size (in mm):= 2.397 +Z voxel size (in mm):= 3.27 + + Z number of samples to take per voxel := 1 + Y number of samples to take per voxel := 1 + X number of samples to take per voxel := 1 + +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=2.3 + radius-y (in mm):=2.3 + length-z (in mm):=2.3 + origin (in mm):={50,0,0} + END:= +value :=1 + +next shape:= +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=60 + radius-y (in mm):=50 + length-z (in mm):=12 + origin (in mm):={80,40,-30} + END:= +value :=.5 + +END:= diff --git a/recon_test_pack/generate_uniform_cylinder.par b/recon_test_pack/generate_uniform_cylinder.par new file mode 100644 index 0000000000..ce310e39d9 --- /dev/null +++ b/recon_test_pack/generate_uniform_cylinder.par @@ -0,0 +1,23 @@ +generate_image Parameters := +output filename:=my_uniform_cylinder +X output image size (in pixels):=111 +Y output image size (in pixels):=111 +Z output image size (in pixels):=47 +X voxel size (in mm):= 3 +Y voxel size (in mm):= 3 +Z voxel size (in mm) :=3.27 + + Z number of samples to take per voxel := 1 + Y number of samples to take per voxel := 1 + X number of samples to take per voxel := 1 + +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=100 + radius-y (in mm):=100 + length-z (in mm):=110 + origin (in mm):={70,10,20} + END:= +value :=1 + +END:= diff --git a/recon_test_pack/generate_uniform_image.par b/recon_test_pack/generate_uniform_image.par new file mode 100644 index 0000000000..5b3bc85703 --- /dev/null +++ b/recon_test_pack/generate_uniform_image.par @@ -0,0 +1,23 @@ +generate_image Parameters := +output filename:=my_uniform_image +X output image size (in pixels):=60 +Y output image size (in pixels):=60 +Z output image size (in pixels):=31 +X voxel size (in mm):= 4.44114 +Y voxel size (in mm):= 4.44114 +Z voxel size (in mm) :=3.375 + + Z number of samples to take per voxel := 1 + Y number of samples to take per voxel := 1 + X number of samples to take per voxel := 1 + +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=400 + radius-y (in mm):=400 + length-z (in mm):=400 + origin (in mm):={150,0,0} + END:= +value :=1 + +END:= diff --git a/recon_test_pack/postfilter_truncate_circular_FOV.par b/recon_test_pack/postfilter_truncate_circular_FOV.par new file mode 100644 index 0000000000..a3fc564f63 --- /dev/null +++ b/recon_test_pack/postfilter_truncate_circular_FOV.par @@ -0,0 +1,6 @@ +PostFilteringParameters := +postfilter type := Truncate To Cylindrical FOV +Truncate To Cylindrical FOV Parameters:= +strictly_less_than_radius:=0 +End Truncate To Cylindrical FOV Parameters:= +END PostFiltering Parameters:= \ No newline at end of file diff --git a/recon_test_pack/run_ecat_tests.bat b/recon_test_pack/run_ecat_tests.bat new file mode 100755 index 0000000000..8fcaaafa9d --- /dev/null +++ b/recon_test_pack/run_ecat_tests.bat @@ -0,0 +1,79 @@ +@echo off +rem Batch file for automatic running of the tests +rem see README.txt +rem Author: Kris Thielemans + + +echo This script should work with STIR version 2.3. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo. + +rem first delete any files remaining from a previous run +del my_*v 2> nul +del my_*s 2> nul + +echo. + +set INSTALL_DIR=%1 + +set ThereWereErrors=0 + +:run_conv_to_ecat7 + +echo ------------- Converting Interfile to ECAT7 file ------------- +echo Running %INSTALL_DIR%conv_to_ecat7 +%INSTALL_DIR%conv_to_ecat7 -s my_Utahscat600k_ca_seg4_ecat7.S Utahscat600k_ca_seg4.hs 1> conv_to_ecat7.log 2> conv_to_ecat7_stderr.log +echo ---- Comparing output of conv_to_ecat7 (error should be 0) +echo Running %INSTALL_DIR%compare_projdata +%INSTALL_DIR%compare_projdata my_Utahscat600k_ca_seg4_ecat7.S Utahscat600k_ca_seg4.hs 2>compare_projdata_conv_to_ecat7_stderr.log +if ERRORLEVEL 1 goto conv_to_ecat7_problem +echo ---- This test seems to be ok ! +goto run_ifheaders_for_ecat7 +:conv_to_ecat7_problem +echo There were problems here! +set ThereWereErrors=1 + + +:run_ifheaders_for_ecat7 + +echo ------------- Making Interfile headers for ECAT7 ------------- +echo Running %INSTALL_DIR%ifheaders_for_ecat7 +%INSTALL_DIR%ifheaders_for_ecat7 my_Utahscat600k_ca_seg4_ecat7.S < NUL: 1> ifheaders_for_ecat7.log 2> ifheaders_for_ecat7_stderr.log +echo ---- Comparing output of ifheaders_for_ecat7 (error should be 0) +echo Running %INSTALL_DIR%compare_projdata +%INSTALL_DIR%compare_projdata my_Utahscat600k_ca_seg4_ecat7_S_f1g1d0b0.hs Utahscat600k_ca_seg4.hs 2>compare_projdata_ifheaders_for_ecat7_stderr.log +if ERRORLEVEL 1 goto ifheaders_for_ecat7_problem +echo ---- This test seems to be ok ! +goto run_native_ecat7_projdata +:ifheaders_for_ecat7_problem +echo There were problems here! +set ThereWereErrors=1 + +:run_native_ecat7_projdata + +echo ------------- Testing native reading of ECAT7 projdata ------------- +echo ---- Comparing compare_projdata directly on ECAT7 sinograms to test STIR IO (error should be 0) +echo Running %INSTALL_DIR%compare_projdata +%INSTALL_DIR%compare_projdata my_Utahscat600k_ca_seg4_ecat7.S Utahscat600k_ca_seg4.hs 2>compare_projdata__ecat7_stderr.log +if ERRORLEVEL 1 goto the_end +echo ---- This test seems to be ok ! +goto the_end +echo There were problems here! +set ThereWereErrors=1 + + + +:the_end + + +echo. +echo --------------- End of tests ------------- +echo. +if %ThereWereErrors%==1 echo Check what went wrong. The *.log files might help you. + +if %ThereWereErrors%==0 echo Everything seems to be fine ! + + + + diff --git a/recon_test_pack/run_ecat_tests.sh b/recon_test_pack/run_ecat_tests.sh new file mode 100755 index 0000000000..44a4d91684 --- /dev/null +++ b/recon_test_pack/run_ecat_tests.sh @@ -0,0 +1,129 @@ +#! /bin/sh +# Shell script for automatic running of the tests +# see README.txt +# +# Copyright (C) 2001 PARAPET partners +# Copyright (C) 2005- 2009-10-11, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2013, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans + +echo This script should work with STIR version 2.3, 2.4 and 3.0. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo + +# +# Parse option arguments (--) +# Note that the -- is required to suppress interpretation of $1 as options +# to expr +# +while test `expr -- "$1" : "--.*"` -gt 0 +do + +if test "$1" = "--help" + then + echo "Usage: run_ecat_tests.sh [install_dir]" + echo "See README.txt for more info." + exit 1 + else + echo Warning: Unknown option "$1" + echo rerun with --help for more info. + exit 1 + fi + + shift 1 + +done + + + +echo Executing tests on ecat file format conversion for projection data + + + + + +# first delete any files remaining from a previous run +rm -f my_*v my_*s my_*S + +INSTALL_DIR=$1 + +command -v ${INSTALL_DIR}conv_to_ecat7 >/dev/null 2>&1 || { echo "${INSTALL_DIR}conv_to_ecat7 not found or not executable. Aborting." >&2; exit 1; } + +ThereWereErrors=0 + +run_ECAT6_tests=0 +if [ $run_ECAT6_tests = 0 ]; then +echo ----------------- ECAT6 tests -------------------------------- +echo No longer running ECAT6 tests as this file format is no longer supported. +else + +echo ------------- Converting ECAT6 file to Interfile ------------- +echo Running ${INSTALL_DIR}convecat6_if +${INSTALL_DIR}convecat6_if my_Utahscat600k_ca_seg4 Utahscat600k_ca.scn 1> convecat6_if.log 2> convecat6_if_stderr.log < convecat6_if.inp +echo '---- Comparing output of convecat6_if (error should be 0)' +echo Running ${INSTALL_DIR}compare_projdata +if ${INSTALL_DIR}compare_projdata my_Utahscat600k_ca_seg4.hs Utahscat600k_ca_seg4.hs 2>compare_projdata_convecat6_if_stderr.log; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi +fi + +echo ------------- Converting Interfile to ECAT7 file ------------- +echo Running ${INSTALL_DIR}conv_to_ecat7 +${INSTALL_DIR}conv_to_ecat7 -s my_Utahscat600k_ca_seg4_ecat7.S Utahscat600k_ca_seg4.hs 1> conv_to_ecat7.log 2> conv_to_ecat7_stderr.log +echo '---- Comparing output of conv_to_ecat7 reading directly from ECAT7 (error should be 0)' +echo Running ${INSTALL_DIR}compare_projdata +if ${INSTALL_DIR}compare_projdata my_Utahscat600k_ca_seg4_ecat7.S Utahscat600k_ca_seg4.hs 2>compare_projdata_conv_to_ecat7_stderr.log; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + + +echo ----- Making Interfile headers for ECAT7 +echo Running ${INSTALL_DIR}ifheaders_for_ecat7 +${INSTALL_DIR}ifheaders_for_ecat7 my_Utahscat600k_ca_seg4_ecat7.S < /dev/null 1> ifheaders_for_ecat7.log 2> ifheaders_for_ecat7_stderr.log +echo '---- Comparing output of ifheaders_for_ecat7 on conv_to_ecat7 (error should be 0)' +echo Running ${INSTALL_DIR}compare_projdata +if ${INSTALL_DIR}compare_projdata my_Utahscat600k_ca_seg4_ecat7_S_f1g1d0b0.hs Utahscat600k_ca_seg4.hs 2>compare_projdata_ifheaders_for_ecat7_stderr.log; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + + +echo +echo '--------------- End of tests -------------' +echo +if test ${ThereWereErrors} = 1 ; +then +echo "Check what went wrong. The *.log files might help you." +else +echo "Everything seems to be fine !" +echo 'You could remove all generated files using "rm -f my_* *.log"' +fi + + + diff --git a/recon_test_pack/run_scatter_tests.sh b/recon_test_pack/run_scatter_tests.sh new file mode 100755 index 0000000000..a37e73b15f --- /dev/null +++ b/recon_test_pack/run_scatter_tests.sh @@ -0,0 +1,72 @@ +#! /bin/sh +# A script to check to see if scatter simulation gives the expected result. +# +# Copyright (C) 2011, Kris Thielemans +# Copyright (C) 2013, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +echo This script should work with STIR version 2.3, 2.4 and 3.0. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo + +if [ $# -eq 1 ]; then + echo "Prepending $1 to your PATH for the duration of this script." + PATH=$1:$PATH +fi + +command -v generate_image >/dev/null 2>&1 || { echo "generate_image not found or not executable. Aborting." >&2; exit 1; } +echo "Using `command -v generate_image`" +echo "Using `command -v estimate_scatter`" + +# first need to set this to the C locale, as this is what the STIR utilities use +# otherwise, awk might interpret floating point numbers incorrectly +LC_ALL=C +export LC_ALL + +error_log_files="" + +echo "=== make emission image" +generate_image generate_uniform_cylinder.par +echo "=== use that as template for attenuation" +stir_math --including-first --times-scalar .096 my_atten_image.hv my_uniform_cylinder.hv + +echo "=== run scatter simulation" +./simulate_scatter.sh my_scatter_cylinder my_uniform_cylinder.hv my_atten_image.hv scatter_cylinder.hs > my_simulate_scatter.log +if [ $? -ne 0 ]; then + echo "Error running scatter simulation" + error_log_files="${error_log_files} my_simulate_scatter.log my_scatter_cylinder*.log" + echo "Check ${error_log_files}" + exit 1 +fi + +echo "=== compare result" +# we need a fairly large threshold (4%) as scatter points are chosen randomly +compare_projdata -t .04 my_scatter_cylinder.hs scatter_cylinder.hs > my_scatter_compare_projdata.log 2>&1 +if [ $? -ne 0 ]; then + echo "Error comparing scatter output." + error_log_files="${error_log_files} my_scatter_compare_projdata.log" +fi + +if [ -z "${error_log_files}" ]; then + echo "All tests OK!" + echo "You can remove all output using \"rm -f my_*\"" +else + echo "There were errors. Check ${error_log_files}" +fi + diff --git a/recon_test_pack/run_test_simulate_and_recon.sh b/recon_test_pack/run_test_simulate_and_recon.sh new file mode 100755 index 0000000000..e3c08ffb3e --- /dev/null +++ b/recon_test_pack/run_test_simulate_and_recon.sh @@ -0,0 +1,180 @@ +#! /bin/sh +# A script to check to see if reconstruction of simulated data gives the expected result. +# +# Copyright (C) 2011 - 2011-01-14, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2011, Kris Thielemans +# Copyright (C) 2014, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +echo This script should work with STIR version 2.2, 2.3, 2.4 and 3.0. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo + +# +# Options +# +MPIRUN="" + +# +# Parse option arguments (--) +# Note that the -- is required to suppress interpretation of $1 as options +# to expr +# +while test `expr -- "$1" : "--.*"` -gt 0 +do + + if test "$1" = "--mpicmd" + then + MPIRUN="$2" + shift 1 + elif test "$1" = "--help" + then + echo "Usage: `basename $0` [--mpicmd somecmd] [install_dir]" + echo "(where [] means that an argument is optional)" + echo "See README.txt for more info." + exit 1 + else + echo Warning: Unknown option "$1" + echo rerun with --help for more info. + exit 1 + fi + + shift 1 + +done + +if [ $# -eq 1 ]; then + echo "Prepending $1 to your PATH for the duration of this script." + PATH=$1:$PATH +fi + +command -v generate_image >/dev/null 2>&1 || { echo "generate_image not found or not executable. Aborting." >&2; exit 1; } +echo "Using `command -v generate_image`" +echo "Using `command -v OSMAPOSL`" + +# first need to set this to the C locale, as this is what the STIR utilities use +# otherwise, awk might interpret floating point numbers incorrectly +LC_ALL=C +export LC_ALL + +echo "=== make emission image" +generate_image generate_uniform_cylinder.par +echo "=== use that as template for attenuation" +stir_math --including-first --times-scalar .096 my_atten_image.hv my_uniform_cylinder.hv +echo "=== create template sinogram (DSTE in 3D with max ring diff 2 to save time)" +template_sino=my_DSTE_3D_rd2_template.hs +cat > my_input.txt < my_create_${template_sino}.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running create_projdata_template. Check my_create_${template_sino}.log"; exit 1; +fi + +# create sinograms +./simulate_data.sh my_uniform_cylinder.hv my_atten_image.hv ${template_sino} +if [ $? -ne 0 ]; then + echo "Error running simulation" + exit 1 +fi + +error_log_files="" + +input_image=my_uniform_cylinder.hv +input_voxel_size_x=`stir_print_voxel_sizes.sh ${input_image}|awk '{print $3}'` +ROI=ROI_uniform_cylinder.par +list_ROI_values ${input_image}.roistats ${input_image} ${ROI} 0 > /dev/null 2>&1 +input_ROI_mean=`awk 'NR>2 {print $2}' ${input_image}.roistats` + +# loop over reconstruction algorithms +# warning: currently OSMAPOSL needs to be run before OSSPS as +# the OSSPS par file uses an OSMAPOSL result as initial image +# and reuses its subset sensitivities +for recon in FBP2D FBP3DRP OSMAPOSL OSSPS; do + echo "Using `command -v ${recon}`" + for parfile in ${recon}_test_sim*.par; do + echo "=============================================" + # test first if analytic reconstruction and if so, run pre-correction + isFBP=0 + if expr ${recon} : FBP > /dev/null; then + isFBP=1 + echo "Running precorrection" + correct_projdata correct_projdata_simulation.par > my_correct_projdata_simulation.log 2>&1 + if [ $? -ne 0 ]; then + echo "Error running precorrection. CHECK my_correct_projdata_simulation.log" + error_log_files="${error_log_files} my_correct_projdata_simulation.log" + break + fi + fi + + # run actual reconstruction + echo "Running ${recon} ${parfile}" + ${MPIRUN} ${recon} ${parfile} > my_${parfile}.log 2>&1 + if [ $? -ne 0 ]; then + echo "Error running reconstruction. CHECK RECONSTRUCTION LOG my_${parfile}.log" + error_log_files="${error_log_files} my_${parfile}.log" + break + fi + + # find filename of (last) image from ${parfile} + output_filename=`awk -F':=' '/output[ _]*filename[ _]*prefix/ { value=$2;gsub(/[ \t]/, "", value); printf("%s", value) }' ${parfile}` + if [ ${isFBP} -eq 0 ]; then + # iterative algorithm, so we need to append the num_subiterations + num_subiterations=`awk -F':=' '/number[ _]*of[ _]*subiterations/ { value=$2;gsub(/[ \t]/, "", value); printf("%s", value) }' ${parfile}` + output_filename=${output_filename}_${num_subiterations} + fi + output_image=${output_filename}.hv + + # compute ROI value + list_ROI_values ${output_image}.roistats ${output_image} ${ROI} 0 > ${output_image}.roistats.log 2>&1 + if [ $? -ne 0 ]; then + echo "Error running list_ROI_values. CHECK LOG ${output_image}.roistats.log" + error_log_files="${error_log_files} ${output_image}.roistats.log" + break + fi + + # compare ROI value + output_voxel_size_x=`stir_print_voxel_sizes.sh ${output_image}|awk '{print $3}'` + output_ROI_mean=`awk "NR>2 {print \\$2*${input_voxel_size_x}/${output_voxel_size_x}}" ${output_image}.roistats` + echo "Input ROI mean: $input_ROI_mean" + echo "Output ROI mean: $output_ROI_mean" + error_bigger_than_1percent=`echo $input_ROI_mean $output_ROI_mean| awk '{ print(($2/$1 - 1)*($2/$1 - 1)>0.0001) }'` + if [ ${error_bigger_than_1percent} -eq 1 ]; then + echo "DIFFERENCE IN ROI VALUES IS TOO LARGE. CHECK RECONSTRUCTION LOG my_${parfile}.log" + error_log_files="${error_log_files} my_${parfile}.log" + else + echo "This seems fine." + fi + + echo "=============================================" + done +done + +if [ -z "${error_log_files}" ]; then + echo "All tests OK!" + echo "You can remove all output using \"rm -f my_*\"" +else + echo "There were errors. Check ${error_log_files}" +fi + diff --git a/recon_test_pack/run_test_simulate_and_recon_with_motion.sh b/recon_test_pack/run_test_simulate_and_recon_with_motion.sh new file mode 100755 index 0000000000..6f2f2e4176 --- /dev/null +++ b/recon_test_pack/run_test_simulate_and_recon_with_motion.sh @@ -0,0 +1,187 @@ +#! /bin/sh +# A script to check to see if warping and motion incorporated reconstruction of simulated data gives the expected result. +# +# Copyright (C) 2011 - 2011-01-14, Hammersmith Imanet Ltd +# Copyright (C) 2011 Kris Thielemans +# Copyright (C) 2013 King's College London +# Copyright (C) 2013 - 2014, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Charalampos Tsoumpas +# Author Kris Thielemans +# + +echo This script should work with STIR version 2.4 and 3.0. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo + +# +# Options +# +MPIRUN="" + +# +# Parse option arguments (--) +# Note that the -- is required to suppress interpretation of $1 as options +# to expr +# +while test `expr -- "$1" : "--.*"` -gt 0 +do + + if test "$1" = "--mpicmd" + then + MPIRUN="$2" + shift 1 + elif test "$1" = "--help" + then + echo "Usage: `basename $0` [--mpicmd somecmd] [install_dir]" + echo "(where [] means that an argument is optional)" + echo "See README.txt for more info." + exit 1 + else + echo Warning: Unknown option "$1" + echo rerun with --help for more info. + exit 1 + fi + + shift 1 + +done + +if [ $# -eq 1 ]; then + echo "Prepending $1 to your PATH for the duration of this script." + PATH=$1:$PATH +fi + +command -v generate_image >/dev/null 2>&1 || { echo "generate_image not found or not executable. Aborting." >&2; exit 1; } +command -v warp_and_accumulate_gated_images >/dev/null 2>&1 || { echo "warp_and_accumulate_gated_images not found or not executable. Aborting." >&2; exit 1; } +echo "Using `command -v warp_and_accumulate_gated_images`" +echo "Using `command -v OSMAPOSL`" + +# first need to set this to the C locale, as this is what the STIR utilities use +# otherwise, awk might interpret floating point numbers incorrectly +LC_ALL=C +export LC_ALL + +echo "=== make emission image" +generate_image generate_test_object.par +input_image=my_test_object_g1.hv +input_voxel_size_x=`stir_print_voxel_sizes.sh ${input_image}|awk '{print $3}'` +ROI=ROI_uniform_cylinder.par +list_ROI_values ${input_image}.roistats ${input_image} ${ROI} 0 > /dev/null 2>&1 +input_ROI_mean=`awk 'NR>2 {print $2}' ${input_image}.roistats` + +echo "=== use that as template for attenuation" +stir_math --including-first --times-scalar .096 my_att_test_object_g1 my_test_object_g1.hv +convert_to_binary_image my_uniform_image_all1 my_test_object_g1.hv -1 +stir_math --including-first --times-scalar 3.27 my_translation_g2d1.hv my_uniform_image_all1.hv #z axis shift: 1*z_axis_voxel_size +stir_math --including-first --times-scalar 4.794 my_translation_g2d2.hv my_uniform_image_all1.hv #y axis shift: 2*y_axis_voxel_size +stir_math --including-first --times-scalar 7.191 my_translation_g2d3.hv my_uniform_image_all1.hv #x axis shift: 3*x_axis_voxel_size +stir_math --including-first --times-scalar -3.27 my_reverse_translation_g2d1.hv my_uniform_image_all1.hv #z axis reverse shift: -1*z_axis_voxel_size +stir_math --including-first --times-scalar -4.794 my_reverse_translation_g2d2.hv my_uniform_image_all1.hv #y axis reverse shift: -2*y_axis_voxel_size +stir_math --including-first --times-scalar -7.191 my_reverse_translation_g2d3.hv my_uniform_image_all1.hv #x axis reverse shift: -3*x_axis_voxel_size +echo "=== warp image" +warp_image my_test_object_g2 my_test_object_g1.hv my_translation_g2d3.hv my_translation_g2d2.hv my_translation_g2d1.hv 1 0 +stir_math --including-first --times-scalar .096 my_att_test_object_g2 my_test_object_g2.hv +for d in 1 2 3 ; do +convert_to_binary_image my_reverse_translation_g1d${d}.hv my_test_object_g1.hv 2 +convert_to_binary_image my_translation_g1d${d}.hv my_test_object_g1.hv 2 +done +cat > my_template.gdef < my_input.txt < my_create_${template_sino}.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running create_projdata_template. Check my_create_${template_sino}.log"; exit 1; +fi + +for g in 1 2 ; do +echo "=== creating ACF for gate $g" +calculate_attenuation_coefficients --ACF my_ACF_test_object_g$g my_att_test_object_g$g.hv ${template_sino} > my_create_ACF_g$g.log 2>&1 +echo "=== creating sinogram for gate $g" +fwdtest my_fwd_test_object_g$g ${template_sino} my_test_object_g$g.hv forward_projector_proj_matrix_ray_tracing.par my_fwd_test_object_g$g.log 2>&1 +stir_math -s --mult --power -1 my_att_fwd_test_object_g$g my_fwd_test_object_g$g.hs my_ACF_test_object_g$g.hs +done + +if [ $? -ne 0 ]; then + echo "Error running simulation" + exit 1 +fi + +error_log_files="" +cp my_template.gdef my_att_fwd_test_object.gdef +cp my_template.gdef my_ACF_test_object.gdef + + echo "Running OSMAPOSL OSMAPOSL_with_motion_test.par for 1 iteration (28 subsets)" + ${MPIRUN} OSMAPOSL OSMAPOSL_with_motion_test.par > my_rec_test_object.log 2>&1 + if [ $? -ne 0 ]; then + echo "Error running reconstruction. CHECK RECONSTRUCTION LOG my_rec_test_object.log" + error_log_files="${error_log_files} my_rec_test_object.log" + exit 1 + fi + compare_image -t 0.25 my_rec_test_object_46.hv my_test_object_g1.hv +if [ $? -ne 0 ]; then + echo "ERROR comparison of reconstructed image fails"; exit 1; +fi + output_image=my_rec_test_object_46.hv + # compute ROI value + list_ROI_values ${output_image}.roistats ${output_image} ${ROI} 0 > ${output_image}.roistats.log 2>&1 + if [ $? -ne 0 ]; then + echo "Error running list_ROI_values. CHECK LOG ${output_image}.roistats.log" + error_log_files="${error_log_files} ${output_image}.roistats.log" + break + fi + # compare ROI value + output_voxel_size_x=`stir_print_voxel_sizes.sh ${output_image}|awk '{print $3}'` + output_ROI_mean=`awk "NR>2 {print \\$2*${input_voxel_size_x}/${output_voxel_size_x}}" ${output_image}.roistats` + echo "Input ROI mean: $input_ROI_mean" + echo "Output ROI mean: $output_ROI_mean" + error_bigger_than_1percent=`echo $input_ROI_mean $output_ROI_mean| awk '{ print(($2/$1 - 1)*($2/$1 - 1)>0.0001) }'` + if [ ${error_bigger_than_1percent} -eq 1 ]; then + echo "DIFFERENCE IN ROI VALUES IS TOO LARGE. CHECK RECONSTRUCTION LOG ${parfile}.log" + error_log_files="${error_log_files} ${parfile}.log" + else + echo "This seems fine." + fi + +if [ -z "${error_log_files}" ]; then + echo "All tests OK!" + echo "You can remove all output using \"rm -f my_*\"" +else + echo "There were errors. Check ${error_log_files}" +fi diff --git a/recon_test_pack/run_tests.bat b/recon_test_pack/run_tests.bat new file mode 100755 index 0000000000..e9f37d25e0 --- /dev/null +++ b/recon_test_pack/run_tests.bat @@ -0,0 +1,219 @@ +@echo off +rem Batch file for automatic running of the tests +rem see README.txt +rem Author: Kris Thielemans + + +echo This script should work with STIR version 2.1, 2.2 and 2.3. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo. + +if NOT tmp%1==tmp--nointbp set NOINTBP=0 +if NOT tmp%1==tmp--nointbp echo Executing tests that use the interpolating backprojector +if NOT tmp%1==tmp--nointbp echo If this is not what you want, rerun this script with the option --nointbp + + +if tmp%1==tmp--nointbp set NOINTBP=1 +if tmp%1==tmp--nointbp echo Not executing tests that use the interpolating backprojector +if tmp%1==tmp--nointbp shift + +rem first delete any files remaining from a previous run +del my_*v 2> nul +del my_*s 2> nul + +echo. + +set INSTALL_DIR=%1 + +set ThereWereErrors=0 + +:run_INTBP + +if %NOINTBP%==1 goto run_PM + +echo. +echo --------- TESTS THAT USE INTERPOLATING BACKPROJECTOR -------- +echo. +echo ------------- Running sensitivity ------------- +echo Running %INSTALL_DIR%OSMAPOSL for sensitivity +%INSTALL_DIR%OSMAPOSL OSMAPOSL_test_for_sensitivity.par 1> sensitivity.log 2> sensitivity_stderr.log + + +echo ---- Comparing output of sensitivity (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image RPTsens_seg4.hv my_RPTsens_seg4.hv +if ERRORLEVEL 1 goto sens_problem +echo ---- This test seems to be ok ! +goto run_OSEM +:sens_problem +echo There were problems here! +set ThereWereErrors=1 + +:run_OSEM + +echo. +echo ------------- Running OSMAPOSL ------------- + +echo Running %INSTALL_DIR%OSMAPOSL +%INSTALL_DIR%OSMAPOSL OSMAPOSL_test.par 1> OSMAPOSL.log 2> OSMAPOSL_stderr.log + +echo ---- Comparing output of OSMAPOSL subiter 3 (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image test_image_3.hv my_test_image_3.hv +if ERRORLEVEL 1 goto OSEM3_problem +echo ---- This test seems to be ok ! +goto OSEM5 +:OSEM3_problem +echo There were problems here! +set ThereWereErrors=1 + +:OSEM5 + +echo ---- Comparing output of OSMAPOSL subiter 5 (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image test_image_5.hv my_test_image_5.hv +if ERRORLEVEL 1 goto OSEM5_problem +echo ---- This test seems to be ok ! +goto run_PM +:OSEM5_problem +echo There were problems here! +set ThereWereErrors=1 + + + +:run_PM +echo. +echo --------- TESTS THAT USE PROJECTION MATRIX -------- +echo Generating initial image +rem TODO check results +%INSTALL_DIR%generate_image generate_uniform_image.par +%INSTALL_DIR%postfilter my_uniform_image_circular.hv my_uniform_image.hv postfilter_truncate_circular_FOV.par + +echo. +echo ------------- Running sensitivity ------------- +echo Running %INSTALL_DIR%OSMAPOSL for sensitivity +%INSTALL_DIR%OSMAPOSL OSMAPOSL_test_PM_for_sensitivity.par 1> sensitivity_PM.log 2> sensitivity_PM_stderr.log + +echo ---- Comparing output of sensitivity (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image RPTsens_seg3_PM.hv my_RPTsens_seg3_PM.hv +if ERRORLEVEL 1 goto sensPM_problem +echo ---- This test seems to be ok ! +goto run_OSEMPMMRP +:sensPM_problem +echo There were problems here! +set ThereWereErrors=1 + +:run_OSEMPMMRP + +echo. +echo ----------- Running OSMAPOSL with MRP prior ------------- + +echo Running %INSTALL_DIR%OSMAPOSL +%INSTALL_DIR%OSMAPOSL OSMAPOSL_test_PM_MRP.par 1> OSMAPOSL_PM_MRP.log 2> OSMAPOSL_PM_MRP_stderr.log + + +echo ---- Comparing output of OSMAPOSL subiter 6 (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image test_image_PM_MRP_6.hv my_test_image_PM_MRP_6.hv +if ERRORLEVEL 1 goto OSEMPM_problem +echo ---- This test seems to be ok ! +goto run_OSEMPMQP +:OSEMPM_problem +echo There were problems here! +set ThereWereErrors=1 + +:run_OSEMPMQP + +echo. +echo ----------- Running OSMAPOSL with Quadratic prior ------------- + +echo Running %INSTALL_DIR%OSMAPOSL +%INSTALL_DIR%OSMAPOSL OSMAPOSL_test_PM_QP.par 1> OSMAPOSL_PM_QP.log 2> OSMAPOSL_PM_QP_stderr.log + + +echo ---- Comparing output of OSMAPOSL subiter 6 (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image test_image_PM_QP_6.hv my_test_image_PM_QP_6.hv +if ERRORLEVEL 1 goto OSEMQP_problem +echo ---- This test seems to be ok ! +goto run_OSEMPMQPweights +:OSEMQP_problem +echo There were problems here! +set ThereWereErrors=1 + +:run_OSEMPMQPweights + +echo. +echo ----------- Running OSMAPOSL with Quadratic prior ------------- + +echo Running %INSTALL_DIR%OSMAPOSL +%INSTALL_DIR%OSMAPOSL OSMAPOSL_test_PM_QPweights.par 1> OSMAPOSL_PM_QPweights.log 2> OSMAPOSL_PM_QPweights_stderr.log + + +echo ---- Comparing output of OSMAPOSL subiter 6 (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image test_image_PM_QPweights_6.hv my_test_image_PM_QPweights_6.hv +if ERRORLEVEL 1 goto OSEMQPweights_problem +echo ---- This test seems to be ok ! +goto run_OSSPS_PM_QP +:OSEMQPweights_problem +echo There were problems here! +set ThereWereErrors=1 + + +:run_OSSPS_PM_QP + +echo. +echo ----------- Running OSSPS with Quadratic prior ------------- + +echo Running %INSTALL_DIR%OSSPS +%INSTALL_DIR%OSSPS OSSPS_test_PM_QP.par 1> OSSPS_PM_QP.log 2> OSSPS_PM_QP_stderr.log + + +echo ---- Comparing output of OSSPS subiter 8 (should be identical up to tolerance) +echo Running %INSTALL_DIR%compare_image +%INSTALL_DIR%compare_image test_image_OSSPS_PM_QP_8.hv my_test_image_OSSPS_PM_QP_8.hv +if ERRORLEVEL 1 goto OSSPSQP_problem +echo ---- This test seems to be ok ! +goto run_CORRECT_PROJDATA +:OSSPSQP_problem +echo There were problems here! +set ThereWereErrors=1 + +:run_CORRECT_PROJDATA +echo. +echo ------------- tests on stir_math and correct_projdata --------- + echo first make up some randoms (just a projdata full of 1) + %INSTALL_DIR%stir_math -s --including-first --times-scalar 0 --add-scalar 1 my_fake_randoms Utahscat600k_ca_seg4.hs 1>stir_math_fake_randoms_stdout.log 2>stir_math_fake_randoms_stderr.log + echo now make up a normalisation file (just projdata full of 2) + %INSTALL_DIR%stir_math -s --including-first --times-scalar 0 --add-scalar 2 my_fake_norm Utahscat600k_ca_seg4.hs 1>stir_math_fake_norm_stdout.log 2>stir_math_fake_norm_stderr.log + echo now run correct_projdata that will subtract randoms and then normalise + %INSTALL_DIR%correct_projdata correct_projdata.par 1>correct_projdata_stdout.log 2>correct_projdata_stderr.log + echo now do the same using stir_math + %INSTALL_DIR%stir_math -s --times-scalar -1 my_correct_projdata_test_rand Utahscat600k_ca_seg4.hs my_fake_randoms.hs 1>stir_math_do_randoms_stdout.log 2>stir_math_do_randoms_stderr.log + %INSTALL_DIR%stir_math -s --mult my_correct_projdata_test_check my_correct_projdata_test_rand.hs my_fake_norm.hs 1>stir_math_do_norm_stdout.log 2>stir_math_do_norm_stderr.log + echo finally, compare the 2 results. should be identical: + %INSTALL_DIR%compare_projdata my_correct_projdata_test_CR.hs my_correct_projdata_test_check.hs + if ERRORLEVEL 1 goto CORRECT_PROJDATA_problem + echo ---- This test seems to be ok ! + goto the_end +:CORRECT_PROJDATA_problem +echo There were problems here! +set ThereWereErrors=1 + + +:the_end + + +echo. +echo --------------- End of tests ------------- +echo. +if %ThereWereErrors%==1 echo Check what went wrong. The *.log files might help you. + +if %ThereWereErrors%==0 echo Everything seems to be fine ! + + + + diff --git a/recon_test_pack/run_tests.sh b/recon_test_pack/run_tests.sh new file mode 100755 index 0000000000..b4416ef80b --- /dev/null +++ b/recon_test_pack/run_tests.sh @@ -0,0 +1,302 @@ +#! /bin/sh +# Shell script for automatic running of the tests +# see README.txt +# Copyright (C) 2000 - 2001 PARAPET partners +# Copyright (C) 2001 - 2009-10-11, Hammersmith Imanet Ltd +# Copyright (C) 2011, Kris Thielemans +# Copyright (C) 2013 - 2014, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans + +echo This script should work with STIR version 2.1, 2.2, 2.3, 2.4 and 3.0. If you have +echo a later version, you might have to update your test pack. +echo Please check the web site. +echo + +# +# Options +# +NOINTBP=0 + +MPIRUN="" + +# +# Parse option arguments (--) +# Note that the -- is required to suppress interpretation of $1 as options +# to expr +# +while test `expr -- "$1" : "--.*"` -gt 0 +do + + if test "$1" = "--nointbp" + then + NOINTBP=1 + elif test "$1" = "--mpicmd" + then + MPIRUN="$2" + shift 1 + elif test "$1" = "--help" + then + echo "Usage: run_tests.sh [--mpicmd somecmd] [--nointbp] [install_dir]" + echo "(where [] means that an argument is optional)" + echo "See README.txt for more info." + exit 1 + else + echo Warning: Unknown option "$1" + echo rerun with --help for more info. + exit 1 + fi + + shift 1 + +done + + + +if test $NOINTBP -eq 1; then + echo Not executing tests that use the interpolating backprojector + echo +else + echo Executing tests that use the interpolating backprojector + echo If this is not what you want, rerun this script with the option --nointbp + echo +fi + +echo Not testing ecat file format conversion. +echo Run run_ecat_tests.sh separately for these tests. +echo + + + + + +# first delete any files remaining from a previous run +rm -f my_*v my_*s + +INSTALL_DIR=$1 + +command -v ${INSTALL_DIR}compare_image >/dev/null 2>&1 || { echo "${INSTALL_DIR}compare_image not found or not executable. Aborting." >&2; exit 1; } + +ThereWereErrors=0 + +if test $NOINTBP = 0; then +echo +echo --------- TESTS THAT USE INTERPOLATING BACKPROJECTOR -------- +echo +echo ------------- Running OSMAPOSL for sensitivity ------------- +echo Running ${INSTALL_DIR}OSMAPOSL for sensitivity +${MPIRUN} ${INSTALL_DIR}OSMAPOSL OSMAPOSL_test_for_sensitivity.par 1> OSMAPOSL_test_for_sensitivity.log 2> OSMAPOSL_test_for_sensitivity_stderr.log + +echo '---- Comparing output of sensitivity (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image RPTsens_seg4.hv my_RPTsens_seg4.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo ------------- Running OSMAPOSL ------------- +echo Running ${INSTALL_DIR}OSMAPOSL +${MPIRUN} ${INSTALL_DIR}OSMAPOSL OSMAPOSL_test.par 1> OSMAPOSL_test.log 2> OSMAPOSL_test_stderr.log + +echo '---- Comparing output of OSMAPOSL subiter 3 (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image test_image_3.hv my_test_image_3.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi +echo '---- Comparing output of OSMAPOSL subiter 5 (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image test_image_5.hv my_test_image_5.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +fi # end of NOINTBP = 0 + +echo +echo --------- TESTS THAT USE PROJECTION MATRIX -------- +echo +echo Generating initial image +# echo TODO check results +${INSTALL_DIR}generate_image generate_uniform_image.par +${INSTALL_DIR}postfilter my_uniform_image_circular.hv my_uniform_image.hv postfilter_truncate_circular_FOV.par +echo ------------- Running OSMAPOSL for sensitivity ------------- +echo Running ${INSTALL_DIR}OSMAPOSL for sensitivity +${MPIRUN} ${INSTALL_DIR}OSMAPOSL OSMAPOSL_test_PM_for_sensitivity.par 1> sensitivity_PM.log 2> sensitivity_PM_stderr.log + +echo '---- Comparing output of sensitivity (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image RPTsens_seg3_PM.hv my_RPTsens_seg3_PM.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo -------- Running OSMAPOSL with the MRP prior -------- +echo Running ${INSTALL_DIR}OSMAPOSL +${MPIRUN} ${INSTALL_DIR}OSMAPOSL OSMAPOSL_test_PM_MRP.par 1> OSMAPOSL_PM_MRP.log 2> OSMAPOSL_PM_MRP_stderr.log + +echo '---- Comparing output of OSMAPOSL subiter 6 (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image test_image_PM_MRP_6.hv my_test_image_PM_MRP_6.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo -------- Running OSMAPOSL with a quadratic prior -------- +echo Running ${INSTALL_DIR}OSMAPOSL +${MPIRUN} ${INSTALL_DIR}OSMAPOSL OSMAPOSL_test_PM_QP.par 1> OSMAPOSL_PM_QP.log 2> OSMAPOSL_PM_QP_stderr.log + +echo '---- Comparing output of OSMAPOSL subiter 6 (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image test_image_PM_QP_6.hv my_test_image_PM_QP_6.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo -------- Running OSMAPOSL with a quadratic prior with given weights -------- +echo Running ${INSTALL_DIR}OSMAPOSL +${MPIRUN} ${INSTALL_DIR}OSMAPOSL OSMAPOSL_test_PM_QPweights.par 1> OSMAPOSL_PM_QPweights.log 2> OSMAPOSL_PM_QPweights_stderr.log + +echo '---- Comparing output of OSMAPOSL subiter 6 (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image test_image_PM_QPweights_6.hv my_test_image_PM_QPweights_6.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo -------- Writing ray tracing projection matrix to file for further checks ------- +echo +if ${INSTALL_DIR}write_proj_matrix_by_bin my_PMRT Utahscat600k_ca_seg4.hs write_proj_matrix_by_bin.par my_uniform_image_circular.hv 1> write_proj_matrix_by_bin.log 2> write_proj_matrix_by_bin_stderr.log; +then +echo ---- Projection matrix probably written ok!; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo -------- Running OSMAPOSL stored projection matrix with a quadratic prior with given weights -------- +echo Running ${INSTALL_DIR}OSMAPOSL +# Note: for this test, it is important that the projection matrix parameters in +# write_proj_matrix_by_bin.par and OSMAPOSL_test_PM_QPweights.par are the same. +${MPIRUN} ${INSTALL_DIR}OSMAPOSL OSMAPOSL_test_PMFromFile_QPweights.par 1> OSMAPOSL_PMFromFile_QPweights.log 2> OSMAPOSL_PMFromFile_QPweights_stderr.log + +echo '---- Comparing output of OSMAPOSL subiter 6 (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +if ${INSTALL_DIR}compare_image test_image_PM_QPweights_6.hv my_test_image_PMFromFile_QPweights_6.hv; +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo -------- Running OSSPS with a quadratic prior -------- +echo Running ${INSTALL_DIR}OSSPS +${MPIRUN} ${INSTALL_DIR}OSSPS OSSPS_test_PM_QP.par 1> OSSPS_PM_QP.log 2> OSSPS_PM_QP_stderr.log + +echo '---- Comparing output of OSSPS subiter 8 (should be identical up to tolerance)' +echo Running ${INSTALL_DIR}compare_image +# relax test for the outer-rim voxels as these turn out to be more unstable than the internal ones +if ${INSTALL_DIR}compare_image -t 0.002 test_image_OSSPS_PM_QP_8.hv my_test_image_OSSPS_PM_QP_8.hv -a + ${INSTALL_DIR}compare_image -r 1 test_image_OSSPS_PM_QP_8.hv my_test_image_OSSPS_PM_QP_8.hv +then +echo ---- This test seems to be ok !; +else +echo There were problems here!; +ThereWereErrors=1; +fi + +echo +echo ------------- tests on stir_math and correct_projdata --------- + echo "first make up some randoms (just a projdata full of 1)" + ${INSTALL_DIR}stir_math -s --including-first \ + --times-scalar 0 --add-scalar 1 \ + my_fake_randoms Utahscat600k_ca_seg4.hs \ + 1>stir_math_fake_randoms_stdout.log \ + 2>stir_math_fake_randoms_stderr.log + echo "now make up a normalisation file (just projdata full of 2)" + ${INSTALL_DIR}stir_math -s --including-first \ + --times-scalar 0 --add-scalar 2 \ + my_fake_norm Utahscat600k_ca_seg4.hs \ + 1>stir_math_fake_norm_stdout.log \ + 2>stir_math_fake_norm_stderr.log + echo "now run correct_projdata that will subtract randoms and then normalise" + ${INSTALL_DIR}correct_projdata correct_projdata.par \ + 1>correct_projdata_stdout.log \ + 2>correct_projdata_stderr.log + echo "now do the same using stir_math" + ${INSTALL_DIR}stir_math -s --times-scalar -1 \ + my_correct_projdata_test_rand \ + Utahscat600k_ca_seg4.hs my_fake_randoms.hs \ + 1>stir_math_do_randoms_stdout.log \ + 2>stir_math_do_randoms_stderr.log + ${INSTALL_DIR}stir_math -s --mult \ + my_correct_projdata_test_check \ + my_correct_projdata_test_rand.hs my_fake_norm.hs \ + 1>stir_math_do_norm_stdout.log \ + 2>stir_math_do_norm_stderr.log + echo "finally, compare the 2 results. should be identical:" + if ${INSTALL_DIR}compare_projdata \ + my_correct_projdata_test_CR.hs \ + my_correct_projdata_test_check.hs; + then + echo ---- This test seems to be ok !; + else + echo There were problems here!; + ThereWereErrors=1; + fi + +echo +echo '--------------- End of tests -------------' +echo +if test ${ThereWereErrors} = 1 ; +then +echo "Check what went wrong. The *.log files might help you." +else +echo "Everything seems to be fine !" +echo 'You could remove all generated files using "rm -f my_* *.log"' +fi + + + diff --git a/recon_test_pack/scatter.par b/recon_test_pack/scatter.par new file mode 100644 index 0000000000..408957fcbd --- /dev/null +++ b/recon_test_pack/scatter.par @@ -0,0 +1,20 @@ +Scatter Estimation Parameters:= + +attenuation_threshold :=.01 +random :=1 +use_cache :=1 +energy_resolution :=.22 +lower_energy_threshold :=350 +upper_energy_threshold :=650 + +activity_image_filename := ${ACTIVITY_IMAGE} +density_image_filename := ${ATTEN_IMAGE} +density_image_for_scatter_points_filename := ${ATTEN_IMAGE} +template_proj_data_filename := ${TEMPLATE} + +; output filename without extension +; files will be calle "out".hs and "out".log +output_filename_prefix :=${OUTPUT_PREFIX} + + +End Scatter Estimation Parameters:= diff --git a/recon_test_pack/scatter_cylinder.hs b/recon_test_pack/scatter_cylinder.hs new file mode 100644 index 0000000000..5847a2de9e --- /dev/null +++ b/recon_test_pack/scatter_cylinder.hs @@ -0,0 +1,47 @@ +!INTERFILE := +name of data file := scatter_cylinder.s +originating system := unknown +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Emission +applied corrections := {None} +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 4 +matrix axis label [4] := segment +!matrix size [4] := 1 +matrix axis label [3] := view +!matrix size [3] := 32 +matrix axis label [2] := axial coordinate +!matrix size [2] := { 8} +matrix axis label [1] := tangential coordinate +!matrix size [1] := 35 +minimum ring difference per segment := { 0} +maximum ring difference per segment := { 0} +Scanner parameters:= +Scanner type := unknown +Number of rings := 8 +Number of detectors per ring := 64 +Inner ring diameter (cm) := 88.62 +Average depth of interaction (cm) := 0.84 +Distance between rings (cm) := 1.962 +Default bin size (cm) := -1 +View offset (degrees) := 0 +Maximum number of non-arc-corrected bins := 0 +Default number of arc-corrected bins := 0 +Number of blocks per bucket in transaxial direction := 0 +Number of blocks per bucket in axial direction := 0 +Number of crystals per block in axial direction := 0 +Number of crystals per block in transaxial direction := 0 +Number of detector layers := 1 +Number of crystals per singles unit in axial direction := -1 +Number of crystals per singles unit in transaxial direction := -1 +end scanner parameters:= +effective central bin size (cm) := 2.21541 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +number of time frames := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/scatter_cylinder.s b/recon_test_pack/scatter_cylinder.s new file mode 100644 index 0000000000..ba9db7f4b5 Binary files /dev/null and b/recon_test_pack/scatter_cylinder.s differ diff --git a/recon_test_pack/simulate_data.sh b/recon_test_pack/simulate_data.sh new file mode 100755 index 0000000000..e218b08f2e --- /dev/null +++ b/recon_test_pack/simulate_data.sh @@ -0,0 +1,69 @@ +#! /bin/sh +# A script to do a simplistic analytic simulation, as used by test_simulate_and_recon.sh +# +# Copyright (C) 2011 - 2011-01-14, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2011, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +if [ $# -ne 3 ]; then + echo "Usage: `basename $0` emission_image attenuation_image template_sino" + echo "Creates my_prompts.hs my_randoms.hs my_acfs.hs my_additive_sinogram.hs " + exit 1 +fi + +emission_image=$1 +atten_image=$2 +template_sino=$3 + +echo "=== create ACFs" +calculate_attenuation_coefficients --ACF my_acfs.hs ${atten_image} ${template_sino} > my_create_acfs.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running calculate_attenuation_coefficients. Check my_create_acfs.log"; exit 1; +fi + +echo "=== create line integrals" +fwdtest my_line_integrals.hs ${template_sino} ${emission_image} forward_projector_proj_matrix_ray_tracing.par my_create_line_integrals.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running fwdtest Check my_create_line_integrals.log"; exit 1; +fi + + +echo "=== create constant randoms background" +${INSTALL_DIR}stir_math -s --including-first \ + --times-scalar 0 --add-scalar 10 \ + my_randoms my_line_integrals.hs +if [ $? -ne 0 ]; then + echo "ERROR running stir_math"; exit 1; +fi + +echo "=== create prompts" +correct_projdata uncorrect_projdata_simulation.par > my_create_prompts.log 2>&1 +if [ $? -ne 0 ]; then + echo "ERROR running correct_projdata. Check my_create_prompts.log"; exit 1; +fi + +# could call poisson_noise here + +echo "=== create additive sinogram for reconstruction" +# need randoms (and scatter) multiplied by ACF and norm (but we don't have a norm here) +stir_math -s --mult my_additive_sinogram.hs my_randoms.hs my_acfs.hs +if [ $? -ne 0 ]; then + echo "ERROR running stir_math"; exit 1; +fi + +echo "Done creating simulated data" diff --git a/recon_test_pack/simulate_scatter.sh b/recon_test_pack/simulate_scatter.sh new file mode 100755 index 0000000000..14f41a65ac --- /dev/null +++ b/recon_test_pack/simulate_scatter.sh @@ -0,0 +1,56 @@ +#! /bin/sh +# A script to do a simplistic analytic simulation of scatter as used by the recon_test_pack +# +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# + +if [ $# -ne 4 ]; then + echo "Usage: `basename $0` output_prefix emission_image attenuation_image template_sino" + exit 1 +fi + +OUTPUT_PREFIX=$1 +ACTIVITY_IMAGE=$2 +org_atten_image=$3 +TEMPLATE=$4 +ATTEN_IMAGE=my_zoomed_${org_atten_image} + +zoom_z=.16666667 +zoom_xy=0.25 +new_voxels_z=8 +new_voxels_xy=33 +zoom_image ${ATTEN_IMAGE} ${org_atten_image} ${new_voxels_xy} ${zoom_xy} 0 0 ${new_voxels_z} ${zoom_z} 0 +if [ $? -ne 0 ]; then + echo "Error running zoom_image" + exit 1 +fi +stir_math --accumulate --times-scalar ${zoom_xy} --times-scalar ${zoom_xy} --times-scalar ${zoom_z} --including-first ${ATTEN_IMAGE} +if [ $? -ne 0 ]; then + echo "Error running stir_math" + exit 1 +fi + +export OUTPUT_PREFIX ACTIVITY_IMAGE ATTEN_IMAGE TEMPLATE + +estimate_scatter scatter.par 2> ${OUTPUT_PREFIX}_stderr.log +if [ $? -ne 0 ]; then + echo "Error running estimate_scatter" + exit 1 +fi + +echo "Done creating simulated data" diff --git a/recon_test_pack/test_image_3.ahv b/recon_test_pack/test_image_3.ahv new file mode 100644 index 0000000000..50167a1d35 --- /dev/null +++ b/recon_test_pack/test_image_3.ahv @@ -0,0 +1,18 @@ +!INTERFILE := +!name of data file := test_image_3.v +!total number of images := 31 +!data offset in bytes := 0 +!imagedata byte order := LITTLEENDIAN +!number format := short float +!number of bytes per pixel := 4 +matrix axis label [1] := x +!matrix size [1] := 97 +scaling factor (mm/pixel) [1] := 3.1088 +matrix axis label [2] := y +!matrix size [2] := 97 +scaling factor (mm/pixel) [2] := 3.1088 +;Correct value is of keyword (commented out) +;!slice thickness (pixels) := 1.08563 +;Value for Analyze +!slice thickness (pixels) := 3.375 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_3.hv b/recon_test_pack/test_image_3.hv new file mode 100644 index 0000000000..0ec1ad6781 --- /dev/null +++ b/recon_test_pack/test_image_3.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := test_image_3.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 97 +scaling factor (mm/pixel) [1] := 3.1088 +matrix axis label [2] := y +!matrix size [2] := 97 +scaling factor (mm/pixel) [2] := 3.1088 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_3.v b/recon_test_pack/test_image_3.v new file mode 100644 index 0000000000..a111cb1a9e Binary files /dev/null and b/recon_test_pack/test_image_3.v differ diff --git a/recon_test_pack/test_image_5.ahv b/recon_test_pack/test_image_5.ahv new file mode 100644 index 0000000000..d2c3313b8b --- /dev/null +++ b/recon_test_pack/test_image_5.ahv @@ -0,0 +1,18 @@ +!INTERFILE := +!name of data file := test_image_5.v +!total number of images := 31 +!data offset in bytes := 0 +!imagedata byte order := LITTLEENDIAN +!number format := short float +!number of bytes per pixel := 4 +matrix axis label [1] := x +!matrix size [1] := 97 +scaling factor (mm/pixel) [1] := 3.1088 +matrix axis label [2] := y +!matrix size [2] := 97 +scaling factor (mm/pixel) [2] := 3.1088 +;Correct value is of keyword (commented out) +;!slice thickness (pixels) := 1.08563 +;Value for Analyze +!slice thickness (pixels) := 3.375 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_5.hv b/recon_test_pack/test_image_5.hv new file mode 100644 index 0000000000..24b4c183b0 --- /dev/null +++ b/recon_test_pack/test_image_5.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := test_image_5.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 97 +scaling factor (mm/pixel) [1] := 3.1088 +matrix axis label [2] := y +!matrix size [2] := 97 +scaling factor (mm/pixel) [2] := 3.1088 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_5.v b/recon_test_pack/test_image_5.v new file mode 100644 index 0000000000..67c47d7586 Binary files /dev/null and b/recon_test_pack/test_image_5.v differ diff --git a/recon_test_pack/test_image_OSSPS_PM_QP_8.hv b/recon_test_pack/test_image_OSSPS_PM_QP_8.hv new file mode 100644 index 0000000000..2b050fbdac --- /dev/null +++ b/recon_test_pack/test_image_OSSPS_PM_QP_8.hv @@ -0,0 +1,29 @@ +!INTERFILE := +name of data file := test_image_OSSPS_PM_QP_8.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +first pixel offset (mm) [1] := -133.234 +first pixel offset (mm) [2] := -133.234 +first pixel offset (mm) [3] := 0 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_OSSPS_PM_QP_8.v b/recon_test_pack/test_image_OSSPS_PM_QP_8.v new file mode 100644 index 0000000000..1380e0d12d Binary files /dev/null and b/recon_test_pack/test_image_OSSPS_PM_QP_8.v differ diff --git a/recon_test_pack/test_image_PM_MRP_6.ahv b/recon_test_pack/test_image_PM_MRP_6.ahv new file mode 100644 index 0000000000..6b123ade3d --- /dev/null +++ b/recon_test_pack/test_image_PM_MRP_6.ahv @@ -0,0 +1,18 @@ +!INTERFILE := +!name of data file := test_image_PM_MRP_6.v +!total number of images := 31 +!data offset in bytes := 0 +!imagedata byte order := LITTLEENDIAN +!number format := short float +!number of bytes per pixel := 4 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +;Correct value is of keyword (commented out) +;!slice thickness (pixels) := 0.759939 +;Value for Analyze +!slice thickness (pixels) := 3.375 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_PM_MRP_6.hv b/recon_test_pack/test_image_PM_MRP_6.hv new file mode 100644 index 0000000000..3e3b6068f3 --- /dev/null +++ b/recon_test_pack/test_image_PM_MRP_6.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := test_image_PM_MRP_6.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_PM_MRP_6.v b/recon_test_pack/test_image_PM_MRP_6.v new file mode 100644 index 0000000000..abe5d8e6ea Binary files /dev/null and b/recon_test_pack/test_image_PM_MRP_6.v differ diff --git a/recon_test_pack/test_image_PM_QP_6.ahv b/recon_test_pack/test_image_PM_QP_6.ahv new file mode 100644 index 0000000000..c8d9fe46c2 --- /dev/null +++ b/recon_test_pack/test_image_PM_QP_6.ahv @@ -0,0 +1,18 @@ +!INTERFILE := +!name of data file := test_image_PM_QP_6.v +!total number of images := 31 +!data offset in bytes := 0 +!imagedata byte order := LITTLEENDIAN +!number format := short float +!number of bytes per pixel := 4 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +;Correct value is of keyword (commented out) +;!slice thickness (pixels) := 0.75994 +;Value for Analyze +!slice thickness (pixels) := 3.375 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_PM_QP_6.hv b/recon_test_pack/test_image_PM_QP_6.hv new file mode 100644 index 0000000000..aaea35c644 --- /dev/null +++ b/recon_test_pack/test_image_PM_QP_6.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := test_image_PM_QP_6.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_PM_QP_6.v b/recon_test_pack/test_image_PM_QP_6.v new file mode 100644 index 0000000000..fcf097eb1b Binary files /dev/null and b/recon_test_pack/test_image_PM_QP_6.v differ diff --git a/recon_test_pack/test_image_PM_QPweights_6.ahv b/recon_test_pack/test_image_PM_QPweights_6.ahv new file mode 100644 index 0000000000..1cb2f34393 --- /dev/null +++ b/recon_test_pack/test_image_PM_QPweights_6.ahv @@ -0,0 +1,18 @@ +!INTERFILE := +!name of data file := test_image_PM_QPweights_6.v +!total number of images := 31 +!data offset in bytes := 0 +!imagedata byte order := LITTLEENDIAN +!number format := short float +!number of bytes per pixel := 4 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +;Correct value is of keyword (commented out) +;!slice thickness (pixels) := 0.75994 +;Value for Analyze +!slice thickness (pixels) := 3.375 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_PM_QPweights_6.hv b/recon_test_pack/test_image_PM_QPweights_6.hv new file mode 100644 index 0000000000..8268e3d402 --- /dev/null +++ b/recon_test_pack/test_image_PM_QPweights_6.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := test_image_PM_QPweights_6.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.375 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/recon_test_pack/test_image_PM_QPweights_6.v b/recon_test_pack/test_image_PM_QPweights_6.v new file mode 100644 index 0000000000..464288c716 Binary files /dev/null and b/recon_test_pack/test_image_PM_QPweights_6.v differ diff --git a/recon_test_pack/uncorrect_projdata_simulation.par b/recon_test_pack/uncorrect_projdata_simulation.par new file mode 100644 index 0000000000..71b8a061e9 --- /dev/null +++ b/recon_test_pack/uncorrect_projdata_simulation.par @@ -0,0 +1,19 @@ +correct_projdata Parameters := + + input file := my_line_integrals.hs + output filename := my_prompts.hs + ; use data (1) or set to one (0) := + apply (1) or undo (0) correction := 0 + randoms projdata filename := my_randoms.hs + + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + ; only attenuation here for this simulation + normalisation projdata filename:= my_acfs.hs + End Bin Normalisation From ProjData:= + + ; scatter term to be subtracted AFTER norm+atten correction + ; defaults to 0 + ;scatter projdata filename := scatter.hs + +END:= diff --git a/recon_test_pack/write_proj_matrix_by_bin.par b/recon_test_pack/write_proj_matrix_by_bin.par new file mode 100644 index 0000000000..7665b01502 --- /dev/null +++ b/recon_test_pack/write_proj_matrix_by_bin.par @@ -0,0 +1,6 @@ +ProjMatrixByBin parameters:= +type:= Ray Tracing + Ray tracing matrix parameters := + number of rays in tangential direction to trace for each bin := 2 + End Ray tracing matrix parameters := +end:= diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt new file mode 100644 index 0000000000..3bffdbad9d --- /dev/null +++ b/scripts/CMakeLists.txt @@ -0,0 +1,36 @@ +# +# +# Copyright 2011-07-01 - 2011 Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file declaring all tests in this subdirectory + +set(dir scripts) + +set(dir_scripts ${dir}_SCRIPTS) + +set(${dir_scripts} + stir_subtract + stir_divide + count + stir_print_voxel_sizes.sh +) + + + +#include(stir_test_exe_targets) + +install(PROGRAMS ${${dir_scripts}} DESTINATION bin) + diff --git a/scripts/count b/scripts/count new file mode 100755 index 0000000000..9472dde512 --- /dev/null +++ b/scripts/count @@ -0,0 +1,71 @@ +#! /bin/csh -fe +# A script to write a sequence of numbered strings to stdout +# +# Copyright (C) 2005- 2008, Hammersmith Imanet Ltd +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# Examples: +# count 3 5 +# => 3 4 5 +# count 3 9 2 +# => 3 5 7 9 +# count -pre A --post B 3 5 +# => A3B A4B A5B + +# option processing +set prefix= +set postfix= +# check if more than 2 args and first arg starts with a - +while ( $#argv > 2 && "$1" =~ -* ) + +switch ("$1") +case --pre: + set prefix = "$2" + shift + shift + breaksw + +case --post: + set postfix = "$2" + shift + shift + breaksw + +default: + echo count: Unrecognised option "$1" + exit 1 + +endsw +end + +if ($#argv != 2 && $#argv != 3) then + echo "usage: count [--pre prefixtext] [--post postfixtest] minimum maximum [increment]" + exit 1 +endif + +if ($#argv == 3) then + set increment = $3 +else + set increment = 1 +endif + +set all = +set frame = $1 +while ($frame <= $2 ) + set all = "$all $prefix$frame$postfix" + @ frame+= $increment +end +echo $all diff --git a/scripts/exe.mk b/scripts/exe.mk new file mode 100644 index 0000000000..f7ec5e05ea --- /dev/null +++ b/scripts/exe.mk @@ -0,0 +1,8 @@ +# +# + +dir:=scripts + +$(dir)_SCRIPTS:=stir_subtract stir_divide count stir_print_voxel_sizes.sh + +include $(WORKSPACE)/exe.mk diff --git a/scripts/stir_divide b/scripts/stir_divide new file mode 100755 index 0000000000..ca623bf33d --- /dev/null +++ b/scripts/stir_divide @@ -0,0 +1,27 @@ +#! /bin/sh +# A simple script that call stir_math for division +# +# Copyright (C) 2005- 2008, Hammersmith Imanet Ltd +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# +# Example: +# stir_divide output file1 file2 +# => will set output to file1/file2 +# Usual stir_math options can be used to change all this + +echo "stir_math --mult --power -1 $*" +stir_math --mult --power -1 $* diff --git a/scripts/stir_print_voxel_sizes.sh b/scripts/stir_print_voxel_sizes.sh new file mode 100755 index 0000000000..e781af4015 --- /dev/null +++ b/scripts/stir_print_voxel_sizes.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# A simple script to print voxel sizes of an image +# Example: +# print_voxel_sizes.sh img.hv +# => will print voxel sizes (in mm) as 3 numbers separated by spaces, in order z y x +# +# Copyright (C) 2011- 2011, Hammersmith Imanet Ltd +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# +if [ $# -ne 1 ]; then + echo "Usage: `basename $0` filename" + echo "Prints voxel-sizes in order z y x" + exit 1 +fi + +filename=$1 + +list_image_info "${filename}" |awk -F: '/[Vv]oxel-size/ {value=$2; gsub("[{},]"," ",value);print value}' diff --git a/scripts/stir_subtract b/scripts/stir_subtract new file mode 100755 index 0000000000..20f40d00fb --- /dev/null +++ b/scripts/stir_subtract @@ -0,0 +1,26 @@ +#! /bin/sh +# A simple script that call stir_math for subtraction +# +# Copyright (C) 2005- 2008, Hammersmith Imanet Ltd +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# +# Example: +# stir_subtract output file1 file2 +# => will set output to file1-file2 +# Usual stir_math options can be used to change all this +echo "stir_math --add --times-scalar -1 $*" +stir_math --add --times-scalar -1 $* diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000000..620f618878 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,184 @@ +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2012 Kris Thielemans +# Copyright 2013 University College London + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. + +INCLUDE(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake) + +option(STIR_MPI + "Compile with MPI" OFF) +option(STIR_OPENMP + "Compile with OpenMP" OFF) + +option(BUILD_SHARED_LIBS + "Use shared libraries" OFF) + +#### we need the boost library from boost.org +set(BOOST_ROOT CACHE PATH "root of Boost") +find_package( Boost 1.36.0 REQUIRED ) +include_directories(${Boost_INCLUDE_DIRS}) + +#### optional external libraries. +# Listed here such that we know if we should compile extra utilities +option(DISABLE_LLN_MATRIX "disable use of LLN library" OFF) +option(DISABLE_AVW "disable use of AVW library" OFF) +option(DISABLE_RDF "disable use of GE RDF library" OFF) +option(DISABLE_STIR_LOCAL "disable use of LOCAL extensions to STIR" OFF) + +if(NOT DISABLE_LLN_MATRIX) + find_package(LLN) +endif() + +if(NOT DISABLE_AVW) + find_package(AVW) +endif() + +if(NOT DISABLE_RDF) + find_package(RDF) +endif() + +if (LLN_FOUND) + set(HAVE_ECAT ON) + message(STATUS "ECAT support enabled.") + add_definitions(-D HAVE_LLN_MATRIX) + include_directories(${LLN_INCLUDE_DIRS}) + +else() + message(STATUS "ECAT support disabled.") +endif() + +if (AVW_FOUND) + message(STATUS "AVW library IO added.") + add_definitions(-D HAVE_AVW) + include_directories(${AVW_INCLUDE_DIRS}) +else() + message(STATUS "AVW IO library not used.") +endif() + +if (RDF_FOUND) + set(HAVE_RDF ON) + message(STATUS "GE RDF support enabled.") + add_definitions(-D HAVE_RDF -D STIR_USE_GE_IO) + include_directories(${RDF_INCLUDE_DIRS}) + +else() + message(STATUS "RDF support disabled.") +endif() + + +# See if we can find a compiled version of ITK (http://www.itk.org/) +find_package(ITK QUIET) +if (ITK_FOUND) + message(STATUS "ITK libraries added.") + set(HAVE_ITK ON) + add_definitions(-DHAVE_ITK) + include(${ITK_USE_FILE}) +else() + message(STATUS "ITK support disabled.") +endif() + +#### Flags for defaults +option(STIR_DEFAULT_PROJECTOR_AS_V2 + "Use same default projectors as STIR 1.x and 2.x (not recommended)" OFF) +#mark_as_advanced(STIR_DEFAULT_PROJECTOR_AS_VERSION_2) + +if (STIR_DEFAULT_PROJECTOR_AS_V2) + # nothing +else() + add_definitions(-D USE_PMRT) +endif() + +#### Flags for compatibility between different systems + +check_function_exists(getopt HAVE_SYSTEM_GETOPT) +if (HAVE_SYSTEM_GETOPT) + add_definitions(-D HAVE_SYSTEM_GETOPT) + # buildblock will have a replacement for it as long as you include stir/getopt.h +endif() + +#### Compiler specific flags for fastest execution etc + +# gcc specific stuff +if (CMAKE_COMPILER_IS_GNUCC) + add_definitions(-Wall -Wno-deprecated) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffast-math") +endif () + +# enable Intel compiler specific flags +if ($(CMAKE_C_COMPILER) STREQUAL "icc") + list(APPEND CMAKE_CXX_FLAGS_RELEASE -fast) +endif() + +#### Flags for parallel execution of certain STIR modules + +if (STIR_MPI) + find_package(MPI REQUIRED) + include_directories(${MPI_CXX_INCLUDE_PATH}) + # we add MPI_CXX_COMPILE_FLAGS for all files + add_definitions(${MPI_CXX_COMPILE_FLAGS} -DMPICH_IGNORE_CXX_SEEK -DSTIR_MPI) + # However, currently we decide to add MPI_CXX_LINK_FLAGS only to those programs that need it, + # just in case these flags would make normal executables unexecutable without mpi-specific things + option(STIR_MPI_TIMINGS "Enable timings for MPI code" OFF) + if (STIR_MPI_TIMINGS) + add_definitions(-DSTIR_MPI_TIMINGS) + endif() +endif() + +if(STIR_OPENMP) + find_package(OpenMP REQUIRED) + add_definitions(${OpenMP_CXX_FLAGS} -DSTIR_OPENMP) + if ("${OpenMP_C_FLAGS}" STREQUAL "-fopenmp") + # work-around cmake bug for gcc + set (OpenMP_EXE_LINKER_FLAGS ${OpenMP_C_FLAGS}) + endif () + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") + +endif() + +#### STIR library +include(stir_dirs) + +# see if there's a local subdirectory. +if(NOT DISABLE_STIR_LOCAL) + find_path(STIR_LOCAL NAME "extra_stir_dirs.cmake" PATHS "${PROJECT_SOURCE_DIR}/src/local/" NO_DEFAULT_PATH) + if (STIR_LOCAL) + include(${STIR_LOCAL}/extra_stir_dirs.cmake) + endif() +endif() + + + +# go and look for CMakeLists.txt files in all those directories +foreach(STIR_DIR ${STIR_DIRS} ${STIR_TEST_DIRS}) + ADD_SUBDIRECTORY(${STIR_DIR}) +# INCLUDE(${STIR_DIR}/lib.cmake) +endforeach(STIR_DIR) + + +#### SWIG settings +ADD_SUBDIRECTORY(swig) + +#### Export settings such that another project can import them. +# Disabled as no longer deemed safe +# Save the compiler settings +#INCLUDE(${CMAKE_ROOT}/Modules/CMakeExportBuildSettings.cmake) +#CMAKE_EXPORT_BUILD_SETTINGS(${STIR_BINARY_DIR}/STIRBuildSettings.cmake) + +# Save library dependencies. +#EXPORT_LIBRARY_DEPENDENCIES(${STIR_BINARY_DIR}/STIRLibraryDepends.cmake) + diff --git a/src/Doxyfile b/src/Doxyfile new file mode 100644 index 0000000000..fbaee383cf --- /dev/null +++ b/src/Doxyfile @@ -0,0 +1,1932 @@ +# Doxyfile 1.8.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed +# in front of the TAG it is preceding . +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = STIR + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = Version_3.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ../documentation/doxy + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian, +# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, +# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = include + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = obsolete=\deprecated \ + preliminary=
        Preliminary
        + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields or simple typedef fields will be shown +# inline in the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO (the default), structs, classes, and unions are shown on a separate +# page (for HTML and Man pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can +# be an expensive process and often the same symbol appear multiple times in +# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too +# small doxygen will become slower. If the cache is too large, memory is wasted. +# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid +# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536 +# symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = NO + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if section-label ... \endif +# and \cond section-label ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. Do not use +# file names with spaces, bibtex cannot handle them. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = dox.log + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.cxx \ + *.c \ + *.h \ + *.txx + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = local \ + include/local \ + include/CVS \ + include/recon_buildblock/CVS \ + include/listmode/CVS \ + include/OSMAPOSL/CVS \ + include/LogLikBased/CVS \ + STIR_mods + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = ../doximages + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be ignored. +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +# If CLANG_ASSISTED_PARSING is set to YES, then doxygen will use the clang parser +# for more acurate parsing at the cost of reduced performance. This can be +# particularly helpful with template rich C++ code for which doxygen's built-in +# parser lacks the necessairy type information. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified at INPUT and INCLUDE_PATH. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 2 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and +# SVG. The default value is HTML-CSS, which is slower, but has the best +# compatibility. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript +# pieces of code that will be used on startup of the MathJax code. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. +# There are two flavours of web server based search depending on the +# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for +# searching and an index file used by the script. When EXTERNAL_SEARCH is +# enabled the indexing and searching needs to be provided by external tools. +# See the manual for details. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain +# the search results. Doxygen ships with an example indexer (doxyindexer) and +# search engine (doxysearch.cgi) which are based on the open source search +# engine library Xapian. See the manual for configuration details. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will returned the search results when EXTERNAL_SEARCH is enabled. +# Doxygen ships with an example search engine (doxysearch) which is based on +# the open source search engine library Xapian. See the manual for configuration +# details. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id +# of to a relative location where the documentation can be found. +# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = YES + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4 will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images +# or other source files which should be copied to the LaTeX output directory. +# Note that the files will be copied as-is; there are no commands or markers +# available. + +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = YES + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- + +# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files +# that can be used to generate PDF. + +GENERATE_DOCBOOK = NO + +# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. If left blank docbook will be used as the default path. + +DOCBOOK_OUTPUT = docbook + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = __GNUC__=4 \ + __GNUC_MINOR__=6 \ + DOXYGEN_SKIP \ + HAVE_LLN_MATRIX \ + HAVE_AVW \ + USE_PMRT \ + "USING_NAMESPACE_STIR=using namespace stir;" \ + "START_NAMESPACE_STIR=namespace stir {" \ + "END_NAMESPACE_STIR= }" \ + "START_NAMESPACE_ECAT=namespace ecat {" \ + "END_NAMESPACE_ECAT= }" \ + "USING_NAMESPACE_ECAT= using namespace ecat;" \ + "START_NAMESPACE_ECAT6= namespace ecat6 { " \ + "END_NAMESPACE_ECAT6= }" \ + "USING_NAMESPACE_ECAT6= using namespace ecat6;" \ + "START_NAMESPACE_ECAT7= namespace ecat7 {" \ + "END_NAMESPACE_ECAT7= }" \ + "USING_NAMESPACE_ECAT7= using namespace ecat7;" + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = NO + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed +# in the related pages index. If set to NO, only the current project's +# pages will be listed. + +EXTERNAL_PAGES = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = NO + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# manageable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = NO + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 3 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/src/IO/CMakeLists.txt b/src/IO/CMakeLists.txt new file mode 100644 index 0000000000..9570c56200 --- /dev/null +++ b/src/IO/CMakeLists.txt @@ -0,0 +1,80 @@ +# +# Copyright (C) 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# Copyright (C) 2013, University College London + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. + +set(dir IO) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + OutputFileFormat + OutputFileFormat_default + InterfileOutputFileFormat + interfile InterfileHeader InterfilePDFSHeaderSPECT + InputFileFormatRegistry + InterfileDynamicDiscretisedDensityOutputFileFormat + InterfileDynamicDiscretisedDensityInputFileFormat + InterfileParametricDensityOutputFileFormat + GIPL_ImageFormat +) + +# we can use IO from the itk library +if (ITK_FOUND) + list(APPEND ${dir_LIB_SOURCES} + ITKOutputFileFormat + ITKImageInputFileFormat + ) +endif() + +if (LLN_FOUND) + list(APPEND ${dir_LIB_SOURCES} + ECAT7OutputFileFormat stir_ecat7 + ECAT6OutputFileFormat + stir_ecat_common + ECAT7ParametricDensityOutputFileFormat + ECAT7DynamicDiscretisedDensityOutputFileFormat + ECAT7DynamicDiscretisedDensityInputFileFormat + stir_ecat6 ecat6_utils + ) +endif() + +if(AVW_FOUND) + list(APPEND ${dir_LIB_SOURCES} + stir_AVW + ) +endif() + +include(stir_lib_target) + +if (LLN_FOUND) + target_link_libraries(IO ${LLN_LIBRARIES}) +endif() + +if (AVW_FOUND) + target_link_libraries(IO ${AVW_LIBRARIES}) +endif() + +if (ITK_FOUND) + target_link_libraries(IO ITKCommon ${ITK_LIBRARIES}) +endif() + +# currently needed for ParametricDensity (TODO get rid of this somehow?) +target_link_libraries(IO modelling_buildblock ) + diff --git a/src/IO/ECAT6OutputFileFormat.cxx b/src/IO/ECAT6OutputFileFormat.cxx new file mode 100644 index 0000000000..6004fc72fd --- /dev/null +++ b/src/IO/ECAT6OutputFileFormat.cxx @@ -0,0 +1,162 @@ +// +// +/* + Copyright (C) 2002-2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Implementation of class stir::ECAT6OutputFileFormat + + \author Kris Thielemans + +*/ + +#include "stir/IO/ECAT6OutputFileFormat.h" +#include "stir/NumericType.h" +#include "stir/IO/ecat6_utils.h" +#include "stir/IO/stir_ecat6.h" +#include "stir/Scanner.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 + + +const char * const +ECAT6OutputFileFormat::registered_name = "ECAT6"; + +ECAT6OutputFileFormat:: +ECAT6OutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + base_type::set_defaults(); + set_type_of_numbers(type); + set_byte_order(byte_order); +} + +void +ECAT6OutputFileFormat:: +initialise_keymap() +{ + parser.add_start_key("ECAT6 Output File Format Parameters"); + parser.add_stop_key("End ECAT6 Output File Format Parameters"); + parser.add_key("default scanner name", &default_scanner_name); + base_type::initialise_keymap(); +} + +void +ECAT6OutputFileFormat:: +set_defaults() +{ + default_scanner_name = "ECAT 953"; + base_type::set_defaults(); + file_byte_order = ByteOrder::little_endian; + type_of_numbers = NumericType::SHORT; + +} + +bool +ECAT6OutputFileFormat:: +post_processing() +{ + if (base_type::post_processing()) + return true; + + shared_ptr scanner_ptr ( + Scanner::get_scanner_from_name(default_scanner_name)); + + if (find_ECAT_system_type(*scanner_ptr)==0) + { + warning("ECAT6OutputFileFormat: default_scanner_name %s is not supported\n", + default_scanner_name.c_str()); + return true; + } + + return false; +} + +NumericType +ECAT6OutputFileFormat:: +set_type_of_numbers(const NumericType& new_type, const bool warn) +{ + const NumericType supported_type_of_numbers = + NumericType("signed integer", 2); + if (new_type != supported_type_of_numbers) + { + if (warn) + warning("ECAT6OutputFileFormat: output type of numbers is currently fixed to short (2 byte signed integers)\n"); + type_of_numbers = supported_type_of_numbers; + } + else + type_of_numbers = new_type; + return type_of_numbers; + +} + +ByteOrder +ECAT6OutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool warn) +{ + if (new_byte_order != ByteOrder::little_endian) + { + if (warn) + warning("ECAT6OutputFileFormat: byte_order is currently fixed to little-endian\n"); + file_byte_order = ByteOrder::little_endian; + } + else + file_byte_order = new_byte_order; + return file_byte_order; +} + +Succeeded +ECAT6OutputFileFormat:: + actual_write_to_file(string& filename, + const DiscretisedDensity<3,float>& density) const +{ + shared_ptr scanner_ptr( + Scanner::get_scanner_from_name(default_scanner_name)); + + add_extension(filename, ".img"); + + ECAT6_Main_header mhead; + make_ECAT6_Main_header(mhead, *scanner_ptr, "", density); + mhead.num_frames = 1; + + FILE *fptr= cti_create (filename.c_str(), &mhead); + if (fptr == NULL) + { + warning("ECAT6OutputFileFormat::write_to_file: error opening output file %s\n", + filename.c_str()); + return Succeeded::no; + } + + Succeeded success = + DiscretisedDensity_to_ECAT6(fptr, + density, + mhead, + 1 /*frame_num*/); + fclose(fptr); + + return success; +} +END_NAMESPACE_ECAT6 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + + diff --git a/src/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.cxx b/src/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.cxx new file mode 100644 index 0000000000..51f48160d7 --- /dev/null +++ b/src/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.cxx @@ -0,0 +1,133 @@ +// +// +/* + Copyright (C) 2006 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup ECAT + \brief Implementation of class stir::ecat::ecat7::ECAT7DynamicDiscretisedDensityInputFileFormat + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ +#include "stir/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.h" +#include "stir/Succeeded.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/VoxelsOnCartesianGrid.h" // necessary as stir_ecat7 reading routine returns a VoxelsOnCartesianGrid +#include "stir/is_null_ptr.h" +#include +#include + + +#ifndef HAVE_LLN_MATRIX +#error HAVE_LLN_MATRIX not defined: you need the lln ecat library. +#endif + +#include "stir/IO/stir_ecat7.h" +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +//! Class for reading images in ECAT7 file-format. +/*! \ingroup ECAT + \preliminary + +*/ +bool +ECAT7DynamicDiscretisedDensityInputFileFormat:: +actual_can_read(const FileSignature& signature, + std::istream& input) const +{ + if (strncmp(signature.get_signature(), "MATRIX", 6) != 0) + return false; + + // TODO + // return (is_ECAT7_image_file(filename)) + return true; +} + +std::auto_ptr +ECAT7DynamicDiscretisedDensityInputFileFormat:: +read_from_file(std::istream& input) const +{ + //TODO + error("read_from_file for ECAT7 with istream not implemented %s:%s. Sorry", + __FILE__, __LINE__); + return + std::auto_ptr + (0); +} + +std::auto_ptr +ECAT7DynamicDiscretisedDensityInputFileFormat:: +read_from_file(const std::string& filename) const +{ + if (is_ECAT7_image_file(filename)) + { + Main_header mhead; + if (read_ECAT7_main_header(mhead, filename) == Succeeded::no) + { + warning("ECAT7DynamicDiscretisedDensityInputFileFormat::read_from_file cannot read %s as ECAT7 (failed to read main header)", filename.c_str()); + return std::auto_ptr(0); + } + + TimeFrameDefinitions time_frame_definitions(filename); + shared_ptr scanner_sptr(find_scanner_from_ECAT_system_type(mhead.system_type)); + + std::auto_ptr + dynamic_image_ptr + (new DynamicDiscretisedDensity(time_frame_definitions, + static_cast(mhead.scan_start_time), + scanner_sptr) + ); + + dynamic_image_ptr->set_calibration_factor(mhead.calibration_factor); + + dynamic_image_ptr->set_isotope_halflife(mhead.isotope_halflife); + + // TODO get this from the subheader fields or so + // dynamic_image_ptr->_is_decay_corrected = + // shead.processing_code & DecayPrc + dynamic_image_ptr->set_if_decay_corrected(false); + + for (unsigned int frame_num=1; frame_num <= dynamic_image_ptr->get_num_time_frames(); ++ frame_num) + { + shared_ptr dens_sptr + (ECAT7_to_VoxelsOnCartesianGrid(filename, + frame_num, + /* gate_num, data_num, bed_num */ 1,0,0) + ); + if (is_null_ptr(dens_sptr)) + error("read_from_file for DynamicDiscretisedDensity: No frame %d available", frame_num); + dynamic_image_ptr->set_density_sptr(dens_sptr, frame_num ); + } + return dynamic_image_ptr; + } + else + { + error("read_from_file for DynamicDiscretisedDensity: ECAT7 file %s is not an image file", filename.c_str()); + // return something to satisfy compilers + return std::auto_ptr(0); + } +} + +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT7 +END_NAMESPACE_STIR + diff --git a/src/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.cxx b/src/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.cxx new file mode 100644 index 0000000000..b5dd44d553 --- /dev/null +++ b/src/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.cxx @@ -0,0 +1,144 @@ +// +// +/* + Copyright (C) 2002-2011, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Implementation of class stir::ecat::ecat7::ECAT7DynamicDiscretisedDensityOutputFileFormat + + \author Kris Thielemans + +*/ + +#ifdef HAVE_LLN_MATRIX + +#include "stir/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.h" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/NumericType.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/Scanner.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +const char * const +ECAT7DynamicDiscretisedDensityOutputFileFormat::registered_name = "ECAT7"; + +ECAT7DynamicDiscretisedDensityOutputFileFormat:: +ECAT7DynamicDiscretisedDensityOutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + this->set_defaults(); + this->set_type_of_numbers(type); + this->set_byte_order(byte_order); +} + +void +ECAT7DynamicDiscretisedDensityOutputFileFormat:: +initialise_keymap() +{ + this->parser.add_start_key("ECAT7 Output File Format Parameters"); + this->parser.add_stop_key("End ECAT7 Output File Format Parameters"); + this->parser.add_key("default scanner name", &default_scanner_name); + base_type::initialise_keymap(); +} + +void +ECAT7DynamicDiscretisedDensityOutputFileFormat:: +set_defaults() +{ + this->default_scanner_name = "ECAT 962"; + base_type::set_defaults(); + this->file_byte_order = ByteOrder::big_endian; + this->type_of_numbers = NumericType::SHORT; + + this->set_key_values(); +} + +bool +ECAT7DynamicDiscretisedDensityOutputFileFormat:: +post_processing() +{ + if (base_type::post_processing()) + return true; + + shared_ptr scanner_ptr( + Scanner::get_scanner_from_name(this->default_scanner_name)); + + if (find_ECAT_system_type(*scanner_ptr)==0) + { + warning("ECAT7DynamicDiscretisedDensityOutputFileFormat: default_scanner_name %s is not supported\n", + this->default_scanner_name.c_str()); + return true; + } + + return false; +} + +NumericType +ECAT7DynamicDiscretisedDensityOutputFileFormat:: +set_type_of_numbers(const NumericType& new_type, const bool warn) +{ + const NumericType supported_type_of_numbers = + NumericType("signed integer", 2); + if (new_type != supported_type_of_numbers) + { + if (warn) + warning("ECAT7DynamicDiscretisedDensityOutputFileFormat: output type of numbers is currently fixed to short (2 byte signed integers)\n"); + this->type_of_numbers = supported_type_of_numbers; + } + else + this->type_of_numbers = new_type; + return this->type_of_numbers; +} + +ByteOrder +ECAT7DynamicDiscretisedDensityOutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool warn) +{ + if (new_byte_order != ByteOrder::big_endian) + { + if (warn) + warning("ECAT7DynamicDiscretisedDensityOutputFileFormat: byte_order is currently fixed to big-endian\n"); + this->file_byte_order = ByteOrder::big_endian; + } + else + this->file_byte_order = new_byte_order; + return this->file_byte_order; +} + +Succeeded +ECAT7DynamicDiscretisedDensityOutputFileFormat:: + actual_write_to_file(string& filename, + const DynamicDiscretisedDensity& dynamic_density) const +{ + add_extension(filename, ".img"); + return + dynamic_density.write_to_ecat7(filename); +} + + +//template class ECAT7DynamicDiscretisedDensityOutputFileFormat; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif // #ifdef HAVE_LLN_MATRIX diff --git a/src/IO/ECAT7OutputFileFormat.cxx b/src/IO/ECAT7OutputFileFormat.cxx new file mode 100644 index 0000000000..ef38ff6a4a --- /dev/null +++ b/src/IO/ECAT7OutputFileFormat.cxx @@ -0,0 +1,162 @@ +// +// +/* + Copyright (C) 2002-2011, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Implementation of class stir::ecat::ecat7::ECAT7OutputFileFormat + + \author Kris Thielemans + +*/ + +#ifdef HAVE_LLN_MATRIX + +#include "stir/IO/ECAT7OutputFileFormat.h" +#include "stir/NumericType.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/Scanner.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +const char * const +ECAT7OutputFileFormat::registered_name = "ECAT7"; + +ECAT7OutputFileFormat:: +ECAT7OutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + base_type::set_defaults(); + set_type_of_numbers(type); + set_byte_order(byte_order); +} + +void +ECAT7OutputFileFormat:: +initialise_keymap() +{ + parser.add_start_key("ECAT7 Output File Format Parameters"); + parser.add_stop_key("End ECAT7 Output File Format Parameters"); + parser.add_key("default scanner name", &default_scanner_name); + base_type::initialise_keymap(); +} + +void +ECAT7OutputFileFormat:: +set_defaults() +{ + default_scanner_name = "ECAT 962"; + base_type::set_defaults(); + file_byte_order = ByteOrder::big_endian; + type_of_numbers = NumericType::SHORT; + + set_key_values(); + +} + +bool +ECAT7OutputFileFormat:: +post_processing() +{ + if (base_type::post_processing()) + return true; + + shared_ptr scanner_ptr(Scanner::get_scanner_from_name(default_scanner_name)); + + if (find_ECAT_system_type(*scanner_ptr)==0) + { + warning("ECAT7OutputFileFormat: default_scanner_name %s is not supported\n", + default_scanner_name.c_str()); + return true; + } + + return false; +} + +NumericType +ECAT7OutputFileFormat:: +set_type_of_numbers(const NumericType& new_type, const bool warn) +{ + const NumericType supported_type_of_numbers = + NumericType("signed integer", 2); + if (new_type != supported_type_of_numbers) + { + if (warn) + warning("ECAT7OutputFileFormat: output type of numbers is currently fixed to short (2 byte signed integers)\n"); + type_of_numbers = supported_type_of_numbers; + } + else + type_of_numbers = new_type; + return type_of_numbers; + +} + +ByteOrder +ECAT7OutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool warn) +{ + if (new_byte_order != ByteOrder::big_endian) + { + if (warn) + warning("ECAT7OutputFileFormat: byte_order is currently fixed to big-endian\n"); + file_byte_order = ByteOrder::big_endian; + } + else + file_byte_order = new_byte_order; + return file_byte_order; +} + +Succeeded +ECAT7OutputFileFormat:: + actual_write_to_file(string& filename, + const DiscretisedDensity<3,float>& density) const +{ + shared_ptr scanner_ptr(Scanner::get_scanner_from_name(default_scanner_name)); + + add_extension(filename, ".img"); + + Main_header mhead; + make_ECAT7_main_header(mhead, *scanner_ptr, "", density); + mhead.num_frames = 1; + mhead.acquisition_type = + mhead.num_frames>1 ? DynamicEmission : StaticEmission; + + MatrixFile* mptr= matrix_create (filename.c_str(), MAT_CREATE, &mhead); + if (mptr == 0) + { + warning("ECAT7OutputFileFormat::write_to_file: error opening output file %s\n", + filename.c_str()); + return Succeeded::no; + } + + Succeeded success = + DiscretisedDensity_to_ECAT7(mptr, density, 1 /*frame_num*/); + matrix_close(mptr); + + return success; +} + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + + +#endif // #ifdef HAVE_LLN_MATRIX diff --git a/src/IO/ECAT7ParametricDensityOutputFileFormat.cxx b/src/IO/ECAT7ParametricDensityOutputFileFormat.cxx new file mode 100644 index 0000000000..1092509121 --- /dev/null +++ b/src/IO/ECAT7ParametricDensityOutputFileFormat.cxx @@ -0,0 +1,193 @@ +// +// +/* + Copyright (C) 2002-2011, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Implementation of class stir::ecat::ecat7::ECAT7ParametricDensityOutputFileFormat + + \author Kris Thielemans + \author Nicolas A Karakatsanis + +*/ + +#ifdef HAVE_LLN_MATRIX + +#include "stir/IO/ECAT7ParametricDensityOutputFileFormat.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/NumericType.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/Scanner.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +template +const char * const +ECAT7ParametricDensityOutputFileFormat::registered_name = "ECAT7"; + +template +ECAT7ParametricDensityOutputFileFormat:: +ECAT7ParametricDensityOutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + this->set_defaults(); + this->set_type_of_numbers(type); + this->set_byte_order(byte_order); +} + +template +void +ECAT7ParametricDensityOutputFileFormat:: +initialise_keymap() +{ + this->parser.add_start_key("ECAT7 Output File Format Parameters"); + this->parser.add_stop_key("End ECAT7 Output File Format Parameters"); + this->parser.add_key("default scanner name", &default_scanner_name); + base_type::initialise_keymap(); +} + +template +void +ECAT7ParametricDensityOutputFileFormat:: +set_defaults() +{ + this->default_scanner_name = "ECAT 962"; + base_type::set_defaults(); + this->file_byte_order = ByteOrder::big_endian; + this->type_of_numbers = NumericType::SHORT; + + this->set_key_values(); + +} + +template +bool +ECAT7ParametricDensityOutputFileFormat:: +post_processing() +{ + if (base_type::post_processing()) + return true; + + shared_ptr scanner_ptr( + Scanner::get_scanner_from_name(this->default_scanner_name)); + + if (find_ECAT_system_type(*scanner_ptr)==0) + { + warning("ECAT7ParametricDensityOutputFileFormat: default_scanner_name %s is not supported\n", + this->default_scanner_name.c_str()); + return true; + } + + return false; +} + +template +NumericType +ECAT7ParametricDensityOutputFileFormat:: +set_type_of_numbers(const NumericType& new_type, const bool warn) +{ + const NumericType supported_type_of_numbers = + NumericType("signed integer", 2); + if (new_type != supported_type_of_numbers) + { + if (warn) + warning("ECAT7ParametricDensityOutputFileFormat: output type of numbers is currently fixed to short (2 byte signed integers)\n"); + this->type_of_numbers = supported_type_of_numbers; + } + else + this->type_of_numbers = new_type; + return this->type_of_numbers; + +} + +template +ByteOrder +ECAT7ParametricDensityOutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool warn) +{ + if (new_byte_order != ByteOrder::big_endian) + { + if (warn) + warning("ECAT7ParametricDensityOutputFileFormat: byte_order is currently fixed to big-endian\n"); + this->file_byte_order = ByteOrder::big_endian; + } + else + this->file_byte_order = new_byte_order; + return this->file_byte_order; +} + +template +Succeeded +ECAT7ParametricDensityOutputFileFormat:: + actual_write_to_file(string& filename, + const ParametricDiscretisedDensity& parametric_density) const +{ + shared_ptr scanner_ptr( + Scanner::get_scanner_from_name(this->default_scanner_name)); + + add_extension(filename, ".img"); + + typedef + typename ParametricDiscretisedDensity::SingleDiscretisedDensityType + SingleDensityType; + // somewhat naughty trick to get elemT of DiscretisedDensityT + typedef typename DiscretisedDensityT::full_value_type KinParsT; + + SingleDensityType single_density = parametric_density.construct_single_density(1); + + Main_header mhead; + make_ECAT7_main_header(mhead, *scanner_ptr, "", single_density); + mhead.num_frames = KinParsT::size(); + + mhead.acquisition_type = DynamicEmission; + + MatrixFile* mptr= matrix_create (filename.c_str(), MAT_CREATE, &mhead); + if (mptr == 0) + { + warning("ECAT7ParametricDensityOutputFileFormat::write_to_file: error opening output file %s\n", + filename.c_str()); + return Succeeded::no; + } + + for (unsigned int f=1; f<=KinParsT::size(); ++f) + { + parametric_density.construct_single_density(single_density,f); + Succeeded success = + DiscretisedDensity_to_ECAT7(mptr, single_density, f); + if (success == Succeeded::no) + { + matrix_close(mptr); + return success; + } + } + matrix_close(mptr); + + return Succeeded::yes; +} + +template class ECAT7ParametricDensityOutputFileFormat; +template class ECAT7ParametricDensityOutputFileFormat; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif // #ifdef HAVE_LLN_MATRIX diff --git a/src/IO/GIPL_ImageFormat.cxx b/src/IO/GIPL_ImageFormat.cxx new file mode 100644 index 0000000000..9238110038 --- /dev/null +++ b/src/IO/GIPL_ImageFormat.cxx @@ -0,0 +1,781 @@ +// +/* + Copyright (C) 2012 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup IO + \brief Class for reading GIPL data + \author Charalampos Tsoumpas [extension of original by Buerger, see below] + + */ + +/*----- +Original Copyright (c) 2012, Division of Imaging Sciences & Biomedical Engineering, +King's College London + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----*/ + +#include +#include +#include +using namespace std; + +#include + +#include +#include "stir/IO/GIPL_ImageFormat.h" + +// ------------------------------------------------------------------------- +// Constructor +// ------------------------------------------------------------------------- + +Image::Image() +{ + vData = NULL; + vData_f = NULL; + + // Initially no downscaling + vDownsample[0] = 1; + vDownsample[1] = 1; + vDownsample[2] = 1; + + vCenter[0] = 0; + vCenter[1] = 0; + vCenter[2] = 0; + vCenter[3] = 0; +} +Image::Image(const int num_voxels, const short data_type_case) +{ + this->m_image_type=data_type_case; + this->MaxLength=num_voxels; + if(this->m_image_type == 64) + { + vData_f = new float[this->MaxLength]; + for (int i = 0; i < this->MaxLength; i++) + this->vData_f[i] = 0.F; + vData = NULL; + } + else if(this->m_image_type == 15) + { + vData = new short[this->MaxLength]; + for (int i = 0; i < this->MaxLength; i++) + this->vData[i] = 0; + vData_f = NULL; + } + else + { + vData = NULL; + vData_f = NULL; + } + vDownsample[0] = 1; + vDownsample[1] = 1; + vDownsample[2] = 1; + + vCenter[0] = 0; + vCenter[1] = 0; + vCenter[2] = 0; + vCenter[3] = 0; +} + +// ------------------------------------------------------------------------- +// Destructor +// ------------------------------------------------------------------------- + +Image::~Image() +{ + if (vData) + delete[] vData; + if (vData_f) + delete[] vData_f; +} + +// ------------------------------------------------------------------------- +// Public functions +// ------------------------------------------------------------------------- + +// ------------------------------------------------------------------------- +/** +* \brief Read data from GIPL filename. +* +* \param filename Input filename +*/ +// ------------------------------------------------------------------------- +void Image::GiplRead(char* filename) +{ + printf("Read %s\n",filename); + + // Open input binary file + std::fstream myFile(filename, std::ios_base::in | std::ios_base::binary); + + // Initialize image dimensions by zero + m_dim[0] = 0; + m_dim[1] = 0; + m_dim[2] = 0; + + // open file for reading + /*char *buf; + try { + buf = new char[512]; + if( buf == 0 ) + throw "Memory allocation failure!"; + } + catch( char * str ) { + cout << "Exception raised: " << str << '\n'; + }*/ + + // Read gipl header + ReadGiplHeader(&myFile); + + // Require big endian format + ByteSwapHeader(); + + // Length of the data to be read in + MaxLength = m_dim[0]*m_dim[1]*m_dim[2]; + + // File cannot be read, wrong path or filename + if (MaxLength == 0) + { + printf("Error: File %s cannot be found\n",filename); + exit(1); + } + + // Update image dimension + ImageDimension = 2; + if(m_dim[2]>1) ImageDimension = 3; + + // Update parameters dimension + ParametersDimension = ImageDimension*ImageDimension+ImageDimension; + + // Set offset vector + ImageOffset[0] = m_dim[0]; // XLen + ImageOffset[1] = m_dim[0]*m_dim[1]; // XLen*YLen + + // Set center of rotation of the image + for (int i = 0; i < ImageDimension; i++) + vCenter[i] = 0;//m_dim[i]/2.0*m_pixdim[i] - m_origin[i]; + + // Delete possible old data vectors + if (vData) + delete[] vData; + if (vData_f) + delete[] vData_f; + + + + // Check data type + switch(m_image_type) + { + case 15: // shorts (default) + + // Initialize image vector + vData = new short[MaxLength]; + + // Read image data + myFile.read((char*)vData, sizeof(short)*MaxLength); + + // Swap hi lo bytes + for( int i = 0; i < MaxLength; i++) + ByteSwap(&vData[i]); + + // Get min and max gray value + GetMinMaxValue(); + + break; + + case 64: // floats + + // Initialize image vector + vData_f = new float[MaxLength]; + + // Read image data + myFile.read((char*)vData_f, sizeof(float)*MaxLength); + + // Swap hi lo bytes + for( int i = 0; i < MaxLength; i++) + ByteSwap(&vData_f[i]); + + break; + + default: + break; + } + + //int SourceIndex = ((int)(5 + 10*ImageOffset[0] + 20*ImageOffset[1])); + //float test = vData_f[SourceIndex]; + + // Initially no downscaling + vDownsample[0] = 1; + vDownsample[1] = 1; + vDownsample[2] = 1; + + // Close file + myFile.close(); +} + +// ------------------------------------------------------------------------- +/** +* \brief Get minimum and maximum gray values in image. +*/ +// ------------------------------------------------------------------------- +void Image::GetMinMaxValue() +{ + iMax = -16959; + iMin = +16959; + + // Check data type + if(m_image_type == 15) + { + for( int i = 0; i < MaxLength; i++) + { + if (vData[i] > iMax) + iMax = vData[i]; + if (vData[i] < iMin) + iMin = vData[i]; + } + } + if(m_image_type == 64) + { + for( int i = 0; i < MaxLength; i++) + { + if (vData_f[i] > iMax) + iMax = vData_f[i]; + if (vData_f[i] < iMin) + iMin = vData_f[i]; + } + } +} + +// ------------------------------------------------------------------------- +/** +* \brief Read GIPL header. +* +* \param myfile Input file +*/ +// ------------------------------------------------------------------------- +void Image::ReadGiplHeader(std::fstream* myFile) +{ + int i; + for(i=0;i<4;i++) + myFile->read(reinterpret_cast < char * > (&m_dim[i]), sizeof(m_dim[i])); + myFile->read(reinterpret_cast < char * > (&m_image_type), sizeof(m_image_type)); + for(i=0;i<4;i++) + myFile->read(reinterpret_cast < char * > (&m_pixdim[i]), sizeof(m_pixdim[i])); + for(i=0;i<80;i++) + myFile->read(reinterpret_cast < char * > (&m_patDesc[i]), sizeof(m_patDesc[i])); + for(i=0;i<12;i++) + myFile->read(reinterpret_cast < char * > (&m_matrixElements[i]), sizeof(m_matrixElements[i])); + myFile->read(reinterpret_cast < char * > (&m_identifier), sizeof(m_identifier)); + for(i=0;i<28;i++) + myFile->read(reinterpret_cast < char * > (&m_spare[i]), sizeof(m_spare[i])); + myFile->read(reinterpret_cast < char * > (&m_orientationFlag), sizeof(m_orientationFlag)); + myFile->read(reinterpret_cast < char * > (&m_flag1), sizeof(m_flag1)); + myFile->read(reinterpret_cast < char * > (&m_min), sizeof(m_min)); + myFile->read(reinterpret_cast < char * > (&m_max), sizeof(m_max)); + for(i=0;i<4;i++) + myFile->read(reinterpret_cast < char * > (&m_origin[i]), sizeof(m_origin[i])); + myFile->read(reinterpret_cast < char * > (&m_pixval_offset), sizeof(m_pixval_offset)); + myFile->read(reinterpret_cast < char * > (&m_pixval_cal), sizeof(m_pixval_cal)); + myFile->read(reinterpret_cast < char * > (&m_user_def1), sizeof(m_user_def1)); + myFile->read(reinterpret_cast < char * > (&m_user_def2), sizeof(m_user_def2)); + myFile->read(reinterpret_cast < char * > (&m_magic_number), sizeof(m_magic_number)); + +} + +// ------------------------------------------------------------------------- +/** +* \brief Write image data to GIPL output file. +* +* \param filename Output filename +*/ +// ------------------------------------------------------------------------- +void Image::GiplWrite(const char* filename) +{ + // Open file for writing + std::fstream myFile(filename, std::ios_base::out | std::ios_base::binary); + + // Require big endian format + ByteSwapHeader(); + + // Write gipl header + WriteGiplHeader(&myFile); + + // Go back to correct format + ByteSwapHeader(); + + // Check data type + switch(m_image_type) + { + case 15: // shorts (default) + + // Swap bytes of data vector before writing to file + for( int i = 0; i < MaxLength; i++) + ByteSwap(&vData[i]); + + // Read image data + myFile.write((char*)vData, sizeof(short)*MaxLength); + + // Swap hi lo bytes + for( int i = 0; i < MaxLength; i++) + ByteSwap(&vData[i]); + break; + + // Swap bytes back + for(int i = 0; i < MaxLength; i++) + ByteSwap(&vData[i]); + + case 64: // floats + + // Swap bytes of data vector before writing to file + for( int i = 0; i < MaxLength; i++) + ByteSwap(&vData_f[i]); + + // Read image data + myFile.write((char*)vData_f, sizeof(float)*MaxLength); + + // Swap hi lo bytes + for( int i = 0; i < MaxLength; i++) + ByteSwap(&vData_f[i]); + break; + + // Swap bytes back + for(int i = 0; i < MaxLength; i++) + ByteSwap(&vData_f[i]); + + default: + break; + } + + // Close file + myFile.close(); +} + +// ------------------------------------------------------------------------- +/** +* \brief Write GIPL header to output file. +* +* \param myfile Output file +*/ +// ------------------------------------------------------------------------- +void Image::WriteGiplHeader(fstream* myFile) +{ + int i; + for(i=0;i<4;i++) + myFile->write(reinterpret_cast < char * > (&m_dim[i]), sizeof(m_dim[i])); + myFile->write(reinterpret_cast < char * > (&m_image_type), sizeof(m_image_type)); + for(i=0;i<4;i++) + myFile->write(reinterpret_cast < char * > (&m_pixdim[i]), sizeof(m_pixdim[i])); + for(i=0;i<80;i++) + myFile->write(reinterpret_cast < char * > (&m_patDesc[i]), sizeof(m_patDesc[i])); + for(i=0;i<12;i++) + myFile->write(reinterpret_cast < char * > (&m_matrixElements[i]), sizeof(m_matrixElements[i])); + myFile->write(reinterpret_cast < char * > (&m_identifier), sizeof(m_identifier)); + for(i=0;i<28;i++) + myFile->write(reinterpret_cast < char * > (&m_spare[i]), sizeof(m_spare[i])); + myFile->write(reinterpret_cast < char * > (&m_orientationFlag), sizeof(m_orientationFlag)); + myFile->write(reinterpret_cast < char * > (&m_flag1), sizeof(m_flag1)); + myFile->write(reinterpret_cast < char * > (&m_min), sizeof(m_min)); + myFile->write(reinterpret_cast < char * > (&m_max), sizeof(m_max)); + for(i=0;i<4;i++) + myFile->write(reinterpret_cast < char * > (&m_origin[i]), sizeof(m_origin[i])); + myFile->write(reinterpret_cast < char * > (&m_pixval_offset), sizeof(m_pixval_offset)); + myFile->write(reinterpret_cast < char * > (&m_pixval_cal), sizeof(m_pixval_cal)); + myFile->write(reinterpret_cast < char * > (&m_user_def1), sizeof(m_user_def1)); + myFile->write(reinterpret_cast < char * > (&m_user_def2), sizeof(m_user_def2)); + myFile->write(reinterpret_cast < char * > (&m_magic_number), sizeof(m_magic_number)); +} + +// ------------------------------------------------------------------------- +/** +* \brief Swap bytes (little/big endian conversion). +*/ +// ------------------------------------------------------------------------- +void Image::ByteSwapHeader() // for PC little endian +{ + int i; + for(i=0;i<4;i++) ByteSwap(&(m_dim[i])); + + ByteSwap(&(m_image_type)); + + for(i=0;i<4;i++) ByteSwap(&(m_pixdim[i])); + + for(i=0;i<12;i++) ByteSwap(&(m_matrixElements[i])); + + ByteSwap(&(m_min)); + ByteSwap(&(m_max)); + + for(i=0;i<4;i++) ByteSwap(&(m_origin[i])); + + ByteSwap(&(m_pixval_offset)); + ByteSwap(&(m_pixval_cal)); + ByteSwap(&(m_user_def1)); + ByteSwap(&(m_user_def2)); + ByteSwap((int*)&(m_magic_number)); + + return; +} + +// ------------------------------------------------------------------------- +/** +* \brief Initialize zero image +* +* \param Input Input image +*/ +// ------------------------------------------------------------------------- +void Image::Zeros(Image* Input, short iType) +{ + // Initialize image with dimensions + this->Initialize(Input, iType); + + if (iType == _SHORT) + { + // Initialize with zeros + for (int i = 0; i < this->MaxLength; i++) + this->vData[i] = 0; + + // Update min max values + //this->GetMinMaxValue(); + } + + if (iType == _FLOAT) + { + // Initialize with zeros + for (int i = 0; i < this->MaxLength; i++) + this->vData_f[i] = 0; + } + + iMin = 0; + iMax = 0; +} + +// ------------------------------------------------------------------------- +/** +* \brief Initialize zero image +* +* \param Input Input image +*/ +// ------------------------------------------------------------------------- +void Image::Zeros() +{ + // Set image to 0 + if (this->m_image_type == 15) + { + // Initialize with zeros + for (int i = 0; i < this->MaxLength; i++) + this->vData[i] = 0; + + // Update min max values + //this->GetMinMaxValue(); + } + + if (this->m_image_type == 64) + { + // Initialize with zeros + for (int i = 0; i < this->MaxLength; i++) + this->vData_f[i] = 0; + } + + iMin = 0; + iMax = 0; +} + +// ------------------------------------------------------------------------- +/** +* \brief Initialize one image +* +* \param Input Input image +*/ +// ------------------------------------------------------------------------- +void Image::Ones(Image* Input, short iType) +{ + // Initialize image with dimensions + this->Initialize(Input, iType); + + if (iType == _SHORT) + { + // Initialize with zeros + for (int i = 0; i < this->MaxLength; i++) + this->vData[i] = 1; + } + + if (iType == _FLOAT) + { + // Initialize with zeros + for (int i = 0; i < this->MaxLength; i++) + this->vData_f[i] = 1; + } + + iMax = 1; + iMin = 1; +} + +// ------------------------------------------------------------------------- +/** +* \brief Initialize image data by with the dimension of the input image +* +* \param Input Input image +*/ +// ------------------------------------------------------------------------- +void Image::Initialize(Image* Input, short iType) +{ + // Set new data properties + for (int i = 0; i < 4; i++) + { + this->m_dim[i] = Input->m_dim[i]; + this->m_pixdim[i] = Input->m_pixdim[i]; + this->vCenter[i] = Input->vCenter[i]; + this->m_origin[i] = Input->m_origin[i]; + } + + this->m_orientationFlag = Input->m_orientationFlag; + this->m_flag1 = Input->m_flag1; + this->m_min = Input->m_min; + this->m_max = Input->m_max; + this->m_pixval_offset = Input->m_pixval_offset; + this->m_pixval_cal = Input->m_pixval_cal; + this->m_user_def1 = Input->m_user_def1; + this->m_user_def2 = Input->m_user_def2; + this->m_magic_number = Input->m_magic_number; + for (int i = 0; i < 2; i++) + this->ImageOffset[i] = Input->ImageOffset[i]; // XLen and XLen*YLen + this->MaxLength = Input->MaxLength; + + // Initialize data vactor + if (iType == _SHORT) + { + // Delete old vector and initialize data vector + if (this->vData) + delete[] this->vData; + + this->m_image_type = 15; + this->vData = new short[Input->MaxLength]; + } + + if (iType == _FLOAT) + { + // Delete old vector and initialize data vector + if (this->vData_f) + delete[] this->vData_f; + + this->m_image_type = 64; + this->vData_f = new float[Input->MaxLength]; + } +} + +// ------------------------------------------------------------------------- +/** +* \brief Initialize image data by with the dimension of the input image +* +* \param Input Input image +*/ +// ------------------------------------------------------------------------- +void Image::Initialize(Image* Input) +{ + // Set new data properties + for (int i = 0; i < 4; i++) + { + this->m_dim[i] = Input->m_dim[i]; + this->m_pixdim[i] = Input->m_pixdim[i]; + this->vCenter[i] = Input->vCenter[i]; + this->m_origin[i] = Input->m_origin[i]; + } + + this->m_orientationFlag = Input->m_orientationFlag; + this->m_flag1 = Input->m_flag1; + this->m_min = Input->m_min; + this->m_max = Input->m_max; + this->m_pixval_offset = Input->m_pixval_offset; + this->m_pixval_cal = Input->m_pixval_cal; + this->m_user_def1 = Input->m_user_def1; + this->m_user_def2 = Input->m_user_def2; + this->m_magic_number = Input->m_magic_number; + for (int i = 0; i < 2; i++) + this->ImageOffset[i] = Input->ImageOffset[i]; // XLen and XLen*YLen + this->MaxLength = Input->MaxLength; + + // Initialize data vactor + if (this->vData) + delete[] this->vData; + + if (this->vData_f) + delete[] this->vData_f; +} + +// ------------------------------------------------------------------------- +/** +* \brief Copy image +* +* \param Input Input image +*/ +// ------------------------------------------------------------------------- +void Image::Copy(Image* Input, short iType) +{ + // Initialize image with dimensions + this->Initialize(Input, iType); + + if (iType == _SHORT) + { + // Initialize with zeros + for (int i = 0; i < Input->MaxLength; i++) + this->vData[i] = Input->vData[i]; + + // Update min max values + this->GetMinMaxValue(); + } + + if (iType == _FLOAT) + { + // Initialize with zeros + for (int i = 0; i < Input->MaxLength; i++) + this->vData_f[i] = Input->vData_f[i]; + } +} + +// ------------------------------------------------------------------------- +// Byte swap functions +// ------------------------------------------------------------------------- + +void Image::ByteSwap(int *i) // for PC little endian +{ + typedef struct { + unsigned char byte1; + unsigned char byte2; + unsigned char byte3; + unsigned char byte4; + } Bytes; + + typedef union { + int integer; + Bytes bytes; + } intUnion; + + intUnion intU, intUS; + intU.integer = *i; + + intUS.bytes.byte1 = intU.bytes.byte4; + intUS.bytes.byte2 = intU.bytes.byte3; + intUS.bytes.byte3 = intU.bytes.byte2; + intUS.bytes.byte4 = intU.bytes.byte1; + + *i = intUS.integer; + return; +} + +void Image::ByteSwap(short *s) // for PC little endian +{ + typedef struct { + unsigned char byte1; + unsigned char byte2; + } Bytes; + + typedef union { + short shortint; + Bytes bytes; + } shortUnion; + + shortUnion shortU, shortUS; + shortU.shortint = *s; + + shortUS.bytes.byte1 = shortU.bytes.byte2; + shortUS.bytes.byte2 = shortU.bytes.byte1; + + *s = shortUS.shortint; + return; +} + +void Image::ByteSwap(float *f) // for PC little endian +{ + typedef struct { + unsigned char byte1; + unsigned char byte2; + unsigned char byte3; + unsigned char byte4; + } Bytes; + + typedef union { + float floatnum; + Bytes bytes; + } floatUnion; + + floatUnion floatU, floatUS; + floatU.floatnum = *f; + + floatUS.bytes.byte1 = floatU.bytes.byte4; + floatUS.bytes.byte2 = floatU.bytes.byte3; + floatUS.bytes.byte3 = floatU.bytes.byte2; + floatUS.bytes.byte4 = floatU.bytes.byte1; + + *f = floatUS.floatnum; + return; +} + +void Image::ByteSwap(double *d) // for PC little endian +{ + typedef struct { + unsigned char byte1; + unsigned char byte2; + unsigned char byte3; + unsigned char byte4; + unsigned char byte5; + unsigned char byte6; + unsigned char byte7; + unsigned char byte8; + } Bytes; + + typedef union { + double doublenum; + Bytes bytes; + } doubleUnion; + + doubleUnion doubleU, doubleUS; + doubleU.doublenum = *d; + + doubleUS.bytes.byte1 = doubleU.bytes.byte8; + doubleUS.bytes.byte2 = doubleU.bytes.byte7; + doubleUS.bytes.byte3 = doubleU.bytes.byte6; + doubleUS.bytes.byte4 = doubleU.bytes.byte5; + doubleUS.bytes.byte5 = doubleU.bytes.byte4; + doubleUS.bytes.byte6 = doubleU.bytes.byte3; + doubleUS.bytes.byte7 = doubleU.bytes.byte2; + doubleUS.bytes.byte8 = doubleU.bytes.byte1; + + *d = doubleUS.doublenum; + return; +} + +// ------------------------------------------------------------------------- +// EOF +// ------------------------------------------------------------------------- diff --git a/src/IO/IO_registries.cxx b/src/IO/IO_registries.cxx new file mode 100644 index 0000000000..f5b0176a1b --- /dev/null +++ b/src/IO/IO_registries.cxx @@ -0,0 +1,111 @@ +/* + Copyright (C) 2002-2011, Hammersmith Imanet Ltd + Copyright (C) 2012, Kris Thielemans + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) 2013, University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup IO + + \brief File that registers all stir::RegisterObject children in IO + + \author Kris Thielemans + \author Berta Marti Fuster + \author Nicolas A Karakatsanis +*/ + +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/IO/InterfileOutputFileFormat.h" +#include "stir/IO/ITKOutputFileFormat.h" +#include "stir/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.h" +#include "stir/IO/InterfileParametricDensityOutputFileFormat.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/ECAT6OutputFileFormat.h" +#include "stir/IO/ECAT7OutputFileFormat.h" +#include "stir/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.h" +#include "stir/IO/ECAT7ParametricDensityOutputFileFormat.h" +#include "stir/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.h" +#endif + + +#if 1 +#include "stir/IO/InputFileFormatRegistry.h" +#include "stir/IO/InterfileImageInputFileFormat.h" +#include "stir/IO/InterfileDynamicDiscretisedDensityInputFileFormat.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/ECAT6ImageInputFileFormat.h" +#include "stir/IO/ECAT7ImageInputFileFormat.h" +#include "stir/IO/ECAT966ListmodeInputFileFormat.h" +#include "stir/IO/ECAT962ListmodeInputFileFormat.h" +#endif +#endif + +#ifdef HAVE_ITK +#include "stir/IO/ITKOutputFileFormat.h" +#include "stir/IO/ITKImageInputFileFormat.h" +#endif + +START_NAMESPACE_STIR + +static InterfileOutputFileFormat::RegisterIt dummy1; +#ifdef HAVE_ITK +static ITKOutputFileFormat::RegisterIt dummyITK1; +#endif +static InterfileDynamicDiscretisedDensityOutputFileFormat::RegisterIt dummydynIntfIn; +static InterfileParametricDensityOutputFileFormat::RegisterIt dummyparIntfIn; +static InterfileParametricDensityOutputFileFormat::RegisterIt dummyGenPatIntfIn; + + +#ifdef HAVE_LLN_MATRIX +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 +static ECAT6OutputFileFormat::RegisterIt dummy2; +END_NAMESPACE_ECAT6 +START_NAMESPACE_ECAT7 +static ECAT7OutputFileFormat::RegisterIt dummy3; +static ECAT7DynamicDiscretisedDensityOutputFileFormat::RegisterIt dummydynecat7In; +static ECAT7ParametricDensityOutputFileFormat::RegisterIt dummyparecat7In; +static ECAT7ParametricDensityOutputFileFormat::RegisterIt dummyGenPatecat7In; +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +#endif + +static RegisterInputFileFormat dynidummy0(0); +static RegisterInputFileFormat idummy0(0); +#ifdef HAVE_LLN_MATRIX +static RegisterInputFileFormat idummy2(4); + +// ECAT6 very low priority it doesn't have a signature +static RegisterInputFileFormat idummy4(100000); + +static RegisterInputFileFormat dynidummy(0); +#endif +#ifdef HAVE_ITK +// we'll put it at low priority such that it is tried (almost) last, i.e. after STIR specific input routines +// This is because we translate the ITK info currently incompletely. +static RegisterInputFileFormat idummy8(10000); +#endif + + +/*************************** listmode data **********************/ +#ifdef HAVE_LLN_MATRIX +static RegisterInputFileFormat LMdummyECAT966(4); +static RegisterInputFileFormat LMdummyECAT962(5); +#endif +END_NAMESPACE_STIR diff --git a/src/IO/ITKImageInputFileFormat.cxx b/src/IO/ITKImageInputFileFormat.cxx new file mode 100644 index 0000000000..e5b91b2dda --- /dev/null +++ b/src/IO/ITKImageInputFileFormat.cxx @@ -0,0 +1,266 @@ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) 2013-2014, University College London + + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Declaration of class stir::ITKImageInputFileFormat + + \author Berta Marti Fuster + \author Kris Thielemans +*/ + +#include "stir/IO/ITKImageInputFileFormat.h" +#include "stir/DiscretisedDensity.h" +#include "stir/utilities.h" + +#include "itkImage.h" +#include "itkImageFileReader.h" +#include "itkImageRegionIterator.h" +#include "itkGDCMImageIO.h" +#include "itkGDCMSeriesFileNames.h" +#include "itkImageSeriesReader.h" + +START_NAMESPACE_STIR + +//! Class for reading images in ITK file-format. +/*! \ingroup IO + \preliminary + +*/ + +typedef itk::Image FinalImageType; + +template +VoxelsOnCartesianGrid* +convert_ITK_to_STIR(const ImageTypePtr itk_image); + +template VoxelsOnCartesianGrid* +read_file_itk(std::string filename); + +bool +ITKImageInputFileFormat::actual_can_read(const FileSignature& signature, + std::istream& input) const +{ + return false; +} + +bool +ITKImageInputFileFormat::can_read(const FileSignature& signature, + std::istream& input) const +{ + return this->actual_can_read(signature, input); +} + +bool +ITKImageInputFileFormat::can_read(const FileSignature& /*signature*/, + const std::string& filename) const +{ + typedef itk::ImageFileReader ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(filename); + try + { + reader->Update(); + return true; + } + catch( itk::ExceptionObject & /*err*/ ) + { + + return false; + } +} + +std::auto_ptr< DiscretisedDensity<3,float> > +ITKImageInputFileFormat::read_from_file(std::istream& input) const +{ + error("read_from_file for ITK with istream not implemented %s:%d. Sorry", + __FILE__, __LINE__); + return + std::auto_ptr > + (0); +} + +std::auto_ptr< DiscretisedDensity<3,float> > +ITKImageInputFileFormat::read_from_file(const std::string& filename) const +{ + return + std::auto_ptr > + (read_file_itk< FinalImageType >(filename)); +} + + +//To read any file format via ITK +template VoxelsOnCartesianGrid* +read_file_itk(std::string filename) +{ + typedef itk::GDCMImageIO ImageIOType; + ImageIOType::Pointer dicomIO = ImageIOType::New(); + try + { + if (!dicomIO->CanReadFile(filename.c_str())) + { + // Not a DICOM file, so we just read a single image + typedef itk::ImageFileReader ReaderType; + typename ReaderType::Pointer reader = ReaderType::New(); + + reader->SetFileName(filename); + reader->Update(); + typename TImageType::Pointer itk_image = reader->GetOutput(); + return convert_ITK_to_STIR(itk_image); + } + else + { + // It's a DICOM file (I hope). + + // For this, we need to read all slices in a series. + // We use code from ITK's Examples/IO/DicomSeriesReadImageWrite2.cxx + // to do this. + // However, we change it to read the series which contains the filename that was passed. + + // find all series in the directory + // This is by default based on unique + // \item[0020 0011] Series Number + // \item[0018 0024] Sequence Name + // \item[0018 0050] Slice Thickness + // \item[0028 0010] Rows + // \item[0028 0011] Columns + typedef itk::GDCMSeriesFileNames NamesGeneratorType; + typename NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New(); + nameGenerator->SetUseSeriesDetails( true ); + // Make sure we read only data from a single frame and gate + nameGenerator->AddSeriesRestriction("0008|0022" ); // AcquisitionDate + nameGenerator->AddSeriesRestriction("0008|0032" ); // AcquisitionTime + nameGenerator->AddSeriesRestriction("0018|1060" ); // TriggerTime + nameGenerator->AddSeriesRestriction("0018|1063" ); // FrameTime + + const std::string dir_name = get_directory_name(filename); + nameGenerator->SetDirectory( dir_name.c_str() ); + typedef std::vector< std::string > SeriesIdContainer; + const SeriesIdContainer & seriesUIDs = nameGenerator->GetSeriesUIDs(); + + // We've found all "series" (i.e. different data-sets according to above restrictions). Now see which one we should read. + // We do this by checking which one contains the original filename. + typedef std::vector< std::string > FileNamesContainer; + FileNamesContainer fileNames; + // Loop through all "series" + for (SeriesIdContainer::const_iterator iter=seriesUIDs.begin(); iter!= seriesUIDs.end(); ++iter) + { + fileNames = nameGenerator->GetFileNames( iter->c_str() ); + // check if filename is present + if (std::find(fileNames.begin(), fileNames.end(), filename) != fileNames.end()) + break; // yes, get out of series-loop + } + + // ok. we know which filenames are in the same "series", so let's read them + typedef itk::ImageSeriesReader< TImageType > ReaderType; + typename ReaderType::Pointer reader = ReaderType::New(); + + reader->SetImageIO( dicomIO ); + reader->SetFileNames( fileNames ); + reader->Update(); + typename TImageType::Pointer itk_image = reader->GetOutput(); + + // Finally, convert to STIR! + return convert_ITK_to_STIR(itk_image); + + } + } + catch (std::exception &ex) + { + error(ex.what()); + return 0; + } + +} + +// Helper class to be able to work-around ITK's Pointer stuff +// We will need to find the type of the object pointed to. I don't know how to do this +// in ITK, so we do it using the usual way to get rid of pointers, but now including itk::SmartPointer +// (we might only need the latter, but I'm not sure) +template +struct removePtr +{ + typedef PtrType type; +}; + +template +struct removePtr +{ + typedef Type type; +}; + +template +struct removePtr > +{ + typedef Type type; +}; + +// Actual conversion function +// WARNING: COMPLETELY IGNORES ORIENTATION +template +VoxelsOnCartesianGrid* +convert_ITK_to_STIR(const ImageTypePtr itk_image) + { + // find voxel size + CartesianCoordinate3D voxel_size(static_cast(itk_image->GetSpacing()[2]), + static_cast(itk_image->GetSpacing()[1]), + static_cast(itk_image->GetSpacing()[0])); + + // find index range in usual STIR convention + const int z_size = itk_image->GetLargestPossibleRegion().GetSize()[2]; + const int y_size = itk_image->GetLargestPossibleRegion().GetSize()[1]; + const int x_size = itk_image->GetLargestPossibleRegion().GetSize()[0]; + const BasicCoordinate<3,int> min_indices = + make_coordinate(0, -y_size/2, -x_size/2); + const BasicCoordinate<3,int> max_indices = + min_indices + make_coordinate(z_size, y_size, x_size) - 1; + + // find STIR origin + CartesianCoordinate3D origin(static_cast(itk_image->GetOrigin()[2]), + static_cast(itk_image->GetOrigin()[1]), + static_cast(itk_image->GetOrigin()[0])); + { + // make sure that origin is such that + // first_pixel_offsets = min_indices*voxel_size + origin + origin -= voxel_size * BasicCoordinate<3,float>(min_indices); + } + + // create STIR image + VoxelsOnCartesianGrid* image_ptr = + new VoxelsOnCartesianGrid + (IndexRange<3>(min_indices, max_indices), + origin, + voxel_size); + + // copy data + VoxelsOnCartesianGrid::full_iterator stir_iter = image_ptr->begin_all(); + typedef typename removePtr::type ImageType; + typedef itk::ImageRegionConstIterator< ImageType > IteratorType; + IteratorType it (itk_image, itk_image->GetLargestPossibleRegion() ); + for ( it.GoToBegin(); !it.IsAtEnd(); ++it, ++stir_iter ) + { + *stir_iter = static_cast(it.Get()); + } + + return image_ptr; +} + + + +END_NAMESPACE_STIR + diff --git a/src/IO/ITKOutputFileFormat.cxx b/src/IO/ITKOutputFileFormat.cxx new file mode 100644 index 0000000000..a6eb32e29c --- /dev/null +++ b/src/IO/ITKOutputFileFormat.cxx @@ -0,0 +1,178 @@ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Implementation of class stir::ITKOutputFileFormat + + \author Berta Marti Fuster + \author Kris Thielemans +*/ +#include "stir/VoxelsOnCartesianGrid.h" + +#include "stir/IO/ITKOutputFileFormat.h" +#include "stir/utilities.h" +#include "stir/Succeeded.h" +#include "itkImage.h" +#include "itkImageFileWriter.h" +#include "itkImageRegionIterator.h" + +START_NAMESPACE_STIR + + +const char * const +ITKOutputFileFormat::registered_name = "ITK"; + +ITKOutputFileFormat:: +ITKOutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + this->set_defaults(); + this->set_type_of_numbers(type); + this->set_byte_order(byte_order); +} + +void +ITKOutputFileFormat:: +set_defaults() +{ + base_type::set_defaults(); + this->default_extension = ".nhdr"; +} + +void +ITKOutputFileFormat:: +initialise_keymap() +{ + parser.add_start_key("ITK Output File Format Parameters"); + parser.add_key("default extension", &this->default_extension); + parser.add_stop_key("End ITK Output File Format Parameters"); + base_type::initialise_keymap(); +} + +bool +ITKOutputFileFormat:: +post_processing() +{ + if (base_type::post_processing()) + return true; + return false; +} + +// note 'warn' commented below to avoid compiler warning message about unused variables +ByteOrder +ITKOutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool /* warn */) +{ + this->file_byte_order = new_byte_order; + return this->file_byte_order; +} + + + +Succeeded +ITKOutputFileFormat:: +actual_write_to_file(string& filename, + const DiscretisedDensity<3,float>& density) const +{ +#if 0 + TODO use: + this->type_of_numbers, this->scale_to_write_data, + this->file_byte_order); +#endif + try + { + add_extension(filename, this->default_extension); + + const VoxelsOnCartesianGrid image_ptr = + dynamic_cast& >(density); + CartesianCoordinate3D min_indices; + CartesianCoordinate3D max_indices; + if (!density.get_regular_range(min_indices, max_indices)) + { + warning("ITK writer: can handle only regular index ranges."); + return Succeeded::no; + } + + typedef itk::Image< float, 3> ImageType; + typedef itk::ImageFileWriter WriterType; + WriterType::Pointer writer = WriterType::New(); + + //Creating the image + ImageType::Pointer image = ImageType::New(); + + // use 0 start indices in ITK + ImageType::IndexType start; + start[0] = 0; // first index on X + start[1] = 0; // first index on Y + start[2] = 0; // first index on Z + + // find ITK origin (i.e. coordinates of first voxel) + ImageType::PointType origin; + CartesianCoordinate3D stir_offset = density.get_physical_coordinates_for_indices(min_indices); + origin[0] = stir_offset.x(); + origin[1] = stir_offset.y(); + origin[2] = stir_offset.z(); + + // find ITK size + ImageType::SizeType size; + size[0] = image_ptr.get_x_size(); // size along X + size[1] = image_ptr.get_y_size(); // size along Y + size[2] = image_ptr.get_z_size(); // size along Z + + // find ITK voxel size + ImageType::SpacingType spacing; + spacing[0] = image_ptr.get_voxel_size().x(); // size along X + spacing[1] = image_ptr.get_voxel_size().y(); // size along Y + spacing[2] = image_ptr.get_voxel_size().z(); // size along Z + + ImageType::RegionType region; + region.SetSize( size ); + region.SetIndex( start ); + + image->SetSpacing(spacing); + image->SetRegions( region ); + image->SetOrigin(origin); + image->Allocate(); + + // copy data + typedef itk::ImageRegionIterator< ImageType > IteratorType; + IteratorType it (image, image->GetLargestPossibleRegion() ); + DiscretisedDensity<3,float>::const_full_iterator stir_iter = density.begin_all_const(); + for ( it = it.Begin(); !it.IsAtEnd(); ++it, ++stir_iter ){ + + it.Set(*stir_iter); + } + + // write it! + writer->SetInput(image); + writer->SetFileName(filename); + writer->Update(); + + return Succeeded::yes; + } + catch (...) + { + return Succeeded::no; + } + +} + +END_NAMESPACE_STIR + + diff --git a/src/IO/InputFileFormatRegistry.cxx b/src/IO/InputFileFormatRegistry.cxx new file mode 100644 index 0000000000..55b5eca28d --- /dev/null +++ b/src/IO/InputFileFormatRegistry.cxx @@ -0,0 +1,44 @@ +// +// +/* + Copyright (C) 2008- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Instantiations for class stir::InputFileFormatRegistry + + \author Kris Thielemans + \author Nicolas A Karakatsanis + +*/ + +#include "stir/IO/InputFileFormatRegistry.txx" + +#include "stir/DiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/listmode/CListModeData.h" + +START_NAMESPACE_STIR + +// instantiations +template class InputFileFormatRegistry >; +template class InputFileFormatRegistry; +template class InputFileFormatRegistry; +template class InputFileFormatRegistry; +template class InputFileFormatRegistry; + +END_NAMESPACE_STIR diff --git a/src/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.cxx b/src/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.cxx new file mode 100644 index 0000000000..169c325780 --- /dev/null +++ b/src/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.cxx @@ -0,0 +1,105 @@ +// +// +/* + Copyright (C) 2006-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*!\file + \ingroup InterfileIO + \brief Implementation of class stir::InterfileDynamicDiscretisedDensityOutputFileFormat + +\author Kris Thielemans +\author Charalampos Tsoumpas + +*/ + +#include "stir/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.h" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/NumericType.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +const char * const +InterfileDynamicDiscretisedDensityOutputFileFormat::registered_name = "Interfile"; + +InterfileDynamicDiscretisedDensityOutputFileFormat:: +InterfileDynamicDiscretisedDensityOutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + base_type::set_defaults(); + this->set_type_of_numbers(type); + this->set_byte_order(byte_order); +} + +void +InterfileDynamicDiscretisedDensityOutputFileFormat:: +set_defaults() +{ + base_type::set_defaults(); +} + +void +InterfileDynamicDiscretisedDensityOutputFileFormat:: +initialise_keymap() +{ + this->parser.add_start_key("Interfile Output File Format"); + this->parser.add_stop_key("End Interfile Output File Format"); + base_type::initialise_keymap(); +} + +bool +InterfileDynamicDiscretisedDensityOutputFileFormat:: +post_processing() +{ + if (base_type::post_processing()) + return true; + return false; +} + + +ByteOrder +InterfileDynamicDiscretisedDensityOutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool warn) +{ + if (!new_byte_order.is_native_order()) + { + if (warn) + warning("InterfileDynamicDiscretisedDensityOutputFileFormat: byte_order is currently fixed to the native format\n"); + this->file_byte_order = ByteOrder::native; + } + else + this->file_byte_order = new_byte_order; + return this->file_byte_order; +} + +Succeeded +InterfileDynamicDiscretisedDensityOutputFileFormat:: +actual_write_to_file(string& filename, + const DynamicDiscretisedDensity & density) const +{ + // TODO modify write_basic_interfile to return filename + + error("InterfileDynamicDiscretisedDensityOutputFileFormat TODO"); + return Succeeded::no; +}; + + + +// class InterfileDynamicDiscretisedDensityOutputFileFormat; + + +END_NAMESPACE_STIR diff --git a/src/IO/InterfileHeader.cxx b/src/IO/InterfileHeader.cxx new file mode 100644 index 0000000000..59ee7d91da --- /dev/null +++ b/src/IO/InterfileHeader.cxx @@ -0,0 +1,1270 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009-04-30, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup InterfileIO + \brief implementations for the stir::InterfileHeader class + + \author Kris Thielemans + \author PARAPET project +*/ + +#include "stir/IO/InterfileHeader.h" +#include "stir/ExamInfo.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/PatientPosition.h" +#include "stir/ImagingModality.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::binary_function; +using std::pair; +using std::sort; +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR +const double +InterfileHeader:: +double_value_not_set = -12345.60789; + +const ExamInfo* +InterfileHeader::get_exam_info_ptr() const +{ + return exam_info_sptr.get(); +} + +shared_ptr +InterfileHeader::get_exam_info_sptr() const +{ + return exam_info_sptr; +} + +InterfileHeader::InterfileHeader() + : KeyParser() +{ + exam_info_sptr.reset(new ExamInfo); + + number_format_values.push_back("bit"); + number_format_values.push_back("ascii"); + number_format_values.push_back("signed integer"); + number_format_values.push_back("unsigned integer"); + number_format_values.push_back("float"); + + byte_order_values.push_back("LITTLEENDIAN"); + byte_order_values.push_back("BIGENDIAN"); + + PET_data_type_values.push_back("Emission"); + PET_data_type_values.push_back("Transmission"); + PET_data_type_values.push_back("Blank"); + PET_data_type_values.push_back("AttenuationCorrection"); + PET_data_type_values.push_back("Normalisation"); + PET_data_type_values.push_back("Image"); + + type_of_data_values.push_back("Static"); + type_of_data_values.push_back("Dynamic"); + type_of_data_values.push_back("Tomographic"); + type_of_data_values.push_back("Curve"); + type_of_data_values.push_back("ROI"); + type_of_data_values.push_back("PET"); + type_of_data_values.push_back("Other"); + + patient_orientation_values.push_back("head_in"); + patient_orientation_values.push_back("feet_in"); + patient_orientation_values.push_back("other"); + patient_orientation_values.push_back("unknown"); //default + + patient_rotation_values.push_back("supine"); + patient_rotation_values.push_back("prone"); + patient_rotation_values.push_back("right"); + patient_rotation_values.push_back("left"); + patient_rotation_values.push_back("other"); + patient_rotation_values.push_back("unknown"); //default + + // default values + // KT 07/10/2002 added 2 new ones + number_format_index = 3; // unsigned integer + bytes_per_pixel = -1; // standard does not provide a default + // KT 02/11/98 set default for correct variable + byte_order_index = 1;// file_byte_order = ByteOrder::big_endian; + + // need to default to PET for backwards compatibility + this->exam_info_sptr->imaging_modality = ImagingModality::PT; + type_of_data_index = 6; // PET + PET_data_type_index = 5; // Image + patient_orientation_index = 3; //unknown + patient_rotation_index = 5; //unknown + num_dimensions = 2; // set to 2 to be compatible with Interfile version 3.3 (which doesn't have this keyword) + matrix_labels.resize(num_dimensions); + matrix_size.resize(num_dimensions); + pixel_sizes.resize(num_dimensions, 1.); + num_time_frames = 1; + image_scaling_factors.resize(num_time_frames); + for (int i=0; ioriginating_system); + add_key("GENERAL DATA", + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("GENERAL IMAGE DATA", + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("type of data", + KeyArgument::ASCIIlist, + (KeywordProcessor)&InterfileHeader::set_type_of_data, + &type_of_data_index, + &type_of_data_values); + + add_key("patient orientation", + KeyArgument::ASCIIlist, + &patient_orientation_index, + &patient_orientation_values); + add_key("patient rotation", + KeyArgument::ASCIIlist, + &patient_rotation_index, + &patient_rotation_values); + + + add_key("imagedata byte order", + KeyArgument::ASCIIlist, + &byte_order_index, + &byte_order_values); + + add_key("data format", + KeyArgument::ASCII, &KeyParser::do_nothing); + add_key("number format", + KeyArgument::ASCIIlist, + &number_format_index, + &number_format_values); + add_key("number of bytes per pixel", + KeyArgument::INT, &bytes_per_pixel); + add_key("number of dimensions", + KeyArgument::INT, (KeywordProcessor)&InterfileHeader::read_matrix_info,&num_dimensions); + add_key("matrix size", + KeyArgument::LIST_OF_INTS,&matrix_size); + add_key("matrix axis label", + KeyArgument::ASCII, &matrix_labels); + add_key("scaling factor (mm/pixel)", + KeyArgument::DOUBLE, &pixel_sizes); + add_key("number of time frames", + KeyArgument::INT, (KeywordProcessor)&InterfileHeader::read_frames_info,&num_time_frames); + add_key("image relative start time (sec)", + KeyArgument::DOUBLE, &image_relative_start_times); + add_key("image duration (sec)", + KeyArgument::DOUBLE, &image_durations); + //image start time[] := + + // ignore these as we'll never use them + add_key("maximum pixel count", + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("minimum pixel count", + KeyArgument::NONE, &KeyParser::do_nothing); + + // TODO move to PET? + add_key("image scaling factor", + KeyArgument::LIST_OF_DOUBLES, &image_scaling_factors); + + // support for Louvain la Neuve's extension of 3.3 + add_key("quantification units", + KeyArgument::DOUBLE, &lln_quantification_units); + + add_key("END OF INTERFILE", + KeyArgument::NONE, &KeyParser::stop_parsing); +} + + +// MJ 17/05/2000 made bool +bool InterfileHeader::post_processing() +{ + if(type_of_data_index<0) + { + warning("Interfile Warning: 'type_of_data' keyword required"); + return true; + } + + if (patient_orientation_index<0 || patient_rotation_index<0) + return true; + // warning: relies on index taking same values as enums in PatientPosition + exam_info_sptr->patient_position.set_rotation(static_cast(patient_rotation_index)); + exam_info_sptr->patient_position.set_orientation(static_cast(patient_orientation_index)); + + if (number_format_index<0 || + static_cast(number_format_index)>=number_format_values.size()) + { + warning("Interfile internal error: 'number_format_index' out of range\n"); + return true; + } + // KT 07/10/2002 new + // check if bytes_per_pixel is set if the data type is not 'bit' + if (number_format_index!=0 && bytes_per_pixel<=0) + { + warning("Interfile error: 'number of bytes per pixel' keyword should be set\n to a number > 0"); + return true; + } + + type_of_numbers = NumericType(number_format_values[number_format_index], bytes_per_pixel); + + file_byte_order = byte_order_index==0 ? + ByteOrder::little_endian : ByteOrder::big_endian; + + // KT 07/10/2002 more extensive error checking for matrix_size keyword + if (matrix_size.size()==0) + { + warning("Interfile error: no matrix size keywords present\n"); + return true; + } + if (matrix_size[matrix_size.size()-1].size()!=1) + { + warning("Interfile error: last dimension (%d) of 'matrix size' cannot be a list of numbers\n", + matrix_size[matrix_size.size()-1].size()); + return true; + } + for (unsigned int dim=0; dim != matrix_size.size(); ++dim) + { + if (matrix_size[dim].size()==0) + { + warning("Interfile error: dimension (%d) of 'matrix size' not present\n", dim); + return true; + } + for (unsigned int i=0; i != matrix_size[dim].size(); ++i) + { + if (matrix_size[dim][i]<=0) + { + warning("Interfile error: dimension (%d) of 'matrix size' has a number <= 0 at position\n", dim, i); + return true; + } + } + } + + for (int frame=0; frame(image_scaling_factors[frame].size()) != matrix_size[matrix_size.size()-1][0]) + { + warning("Interfile error: wrong number of image scaling factors\n"); + return true; + } + } + + // KT 07/10/2002 new + // support for non-standard key + // TODO as there's currently no way to find out if a key was used in the header, we just rely on the + // fact that the default didn't change. This isn't good enough, but it has to do for now. + if (lln_quantification_units!=1.) + { + const bool all_one = image_scaling_factors[0][0] == 1.; + for (int frame=0; frametime_frame_definitions = + TimeFrameDefinitions(image_relative_start_times, image_durations); + + //Added for old implementations relying on this->time_frame_definitions variable + this->time_frame_definitions=exam_info_sptr->time_frame_definitions; + + return false; + +} + +void InterfileHeader::set_imaging_modality() +{ + set_variable(); + this->exam_info_sptr->imaging_modality = ImagingModality(imaging_modality_as_string); +} + +void InterfileHeader::read_matrix_info() +{ + set_variable(); + + matrix_labels.resize(num_dimensions); + matrix_size.resize(num_dimensions); + pixel_sizes.resize(num_dimensions, 1.); + +} + +void InterfileHeader::set_type_of_data() +{ + set_variable(); + + if (this->type_of_data_index == -1) + error("Interfile parsing: type_of_data needs to be set to supported value"); + + const string type_of_data = this->type_of_data_values[this->type_of_data_index]; + + if (type_of_data == "PET") + { + add_key("PET STUDY (Emission data)", + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("PET STUDY (Image data)", + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("PET STUDY (General)", + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("PET data type", + KeyArgument::ASCIIlist, + &PET_data_type_index, + &PET_data_type_values); + add_key("process status", + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("IMAGE DATA DESCRIPTION", + KeyArgument::NONE, &KeyParser::do_nothing); + // TODO rename keyword + add_key("data offset in bytes", + KeyArgument::ULONG, &data_offset_each_dataset); + + } + else if (type_of_data == "Tomographic") + { + add_key("SPECT STUDY (General)" , + KeyArgument::NONE, &KeyParser::do_nothing); + add_key("SPECT STUDY (acquired data)", + KeyArgument::NONE, &KeyParser::do_nothing); + + process_status_values.push_back("Reconstructed"); + process_status_values.push_back("Acquired"); + add_key("process status", + KeyArgument::ASCIIlist, + &process_status_index, + &process_status_values); + +#if 0 + // overwrite vectored-value, as v3.3 had a scalar + add_key("data offset in bytes", &data_offset); +#endif + } +} + +void InterfileHeader::read_frames_info() +{ + set_variable(); + image_scaling_factors.resize(num_time_frames); + for (int i=0; ifirst_pixel_offsets.resize(num_dimensions); + std::fill(this->first_pixel_offsets.begin(), this->first_pixel_offsets.end(), + base_type::double_value_not_set); +} + +// MJ 17/05/2000 made bool +bool InterfileImageHeader::post_processing() +{ + + if (InterfileHeader::post_processing() == true) + return true; + + if (PET_data_type_values[PET_data_type_index] != "Image") + { warning("Interfile error: expecting an image\n"); return true; } + + if (num_dimensions != 3) + { warning("Interfile error: expecting 3D image\n"); return true; } + + if ( (matrix_size[0].size() != 1) || + (matrix_size[1].size() != 1) || + (matrix_size[2].size() != 1) ) + { warning("Interfile error: only handling image with homogeneous dimensions\n"); return true; } + + // KT 09/10/98 changed order z,y,x->x,y,z + // KT 09/10/98 allow no labels at all + if (matrix_labels[0].length()>0 + && (matrix_labels[0]!="x" || matrix_labels[1]!="y" || + matrix_labels[2]!="z")) + { + warning("Interfile: only supporting x,y,z order of coordinates now.\n"); + return true; + } + std::vector first_pixel_offsets; + + return false; +} +/**********************************************************************/ + +//KT 26/10/98 +// KT 13/11/98 moved stream arg from constructor to parse() +InterfilePDFSHeader::InterfilePDFSHeader() + : InterfileHeader() +{ + num_segments = -1; + + add_key("minimum ring difference per segment", + KeyArgument::LIST_OF_INTS, + (KeywordProcessor)&InterfilePDFSHeader::resize_segments_and_set, + &min_ring_difference); + add_key("maximum ring difference per segment", + KeyArgument::LIST_OF_INTS, + (KeywordProcessor)&InterfilePDFSHeader::resize_segments_and_set, + &max_ring_difference); + + + // warning these keys should match what is in Scanner::parameter_info() + // TODO get Scanner to parse these + add_key("Scanner parameters", + KeyArgument::NONE, &KeyParser::do_nothing); + // this is currently ignored (use "originating system" instead) + add_key("Scanner type", + KeyArgument::NONE, &KeyParser::do_nothing); + + // first set to some crazy values + num_rings = -1; + add_key("number of rings", + &num_rings); + num_detectors_per_ring = -1; + add_key("number of detectors per ring", + &num_detectors_per_ring); + transaxial_FOV_diameter_in_cm = -1; + add_key("transaxial FOV diameter (cm)", + &transaxial_FOV_diameter_in_cm); + inner_ring_diameter_in_cm = -1; + add_key("inner ring diameter (cm)", + &inner_ring_diameter_in_cm); + average_depth_of_interaction_in_cm = -1; + add_key("average depth of interaction (cm)", + &average_depth_of_interaction_in_cm); + distance_between_rings_in_cm = -1; + add_key("distance between rings (cm)", + &distance_between_rings_in_cm); + default_bin_size_in_cm = -1; + add_key("default bin size (cm)", + &default_bin_size_in_cm); + // this is a good default value + view_offset_in_degrees = 0; + add_key("view offset (degrees)", + &view_offset_in_degrees); + max_num_non_arccorrected_bins=0; + default_num_arccorrected_bins=0; + add_key("Maximum number of non-arc-corrected bins", + &max_num_non_arccorrected_bins); + add_key("Default number of arc-corrected bins", + &default_num_arccorrected_bins); + + num_axial_blocks_per_bucket = 0; + add_key("number of blocks_per_bucket in axial direction", + &num_axial_blocks_per_bucket); + num_transaxial_blocks_per_bucket = 0; + add_key("number of blocks_per_bucket in transaxial direction", + &num_transaxial_blocks_per_bucket); + num_axial_crystals_per_block = 0; + add_key("number of crystals_per_block in axial direction", + &num_axial_crystals_per_block); + num_transaxial_crystals_per_block = 0; + add_key("number of crystals_per_block in transaxial direction", + &num_transaxial_crystals_per_block); + num_axial_crystals_per_singles_unit = -1; + add_key("number of crystals_per_singles_unit in axial direction", + &num_axial_crystals_per_singles_unit); + num_transaxial_crystals_per_singles_unit = -1; + add_key("number of crystals_per_singles_unit in transaxial direction", + &num_transaxial_crystals_per_singles_unit); + // sensible default + num_detector_layers = 1; + add_key("number of detector layers", + &num_detector_layers); + + add_key("end scanner parameters", + KeyArgument::NONE, &KeyParser::do_nothing); + + effective_central_bin_size_in_cm = -1; + add_key("effective central bin size (cm)", + &effective_central_bin_size_in_cm); + add_key("applied corrections", + KeyArgument::LIST_OF_ASCII, &applied_corrections); + +} + +void InterfilePDFSHeader::resize_segments_and_set() +{ + // find_storage_order returns true if already found (or error) + if (num_segments < 0 && !find_storage_order()) + { + min_ring_difference.resize(num_segments); + max_ring_difference.resize(num_segments); + + } + + if (num_segments >= 0) + set_variable(); + +} + +int InterfilePDFSHeader::find_storage_order() +{ + + /* if(type_of_data_values[type_of_data_index] != "PET") + { + + warning("Interfile error: expecting PET study "); + stop_parsing(); + return true; + + } +*/ + if (num_dimensions != 4) + { + warning("Interfile error: expecting 4D structure "); + stop_parsing(); + return true; + } + + if (matrix_labels[0] != "tangential coordinate") + { + // use error message with index [1] as that is what the user sees. + warning("Interfile error: expecting 'matrix axis label[1] := tangential coordinate'\n"); + stop_parsing(); + return true; + } + num_bins = matrix_size[0][0]; + + if (matrix_labels[3] == "segment") + { + num_segments = matrix_size[3][0]; + + if (matrix_labels[1] == "axial coordinate" && matrix_labels[2] == "view") + { + storage_order =ProjDataFromStream::Segment_View_AxialPos_TangPos; + num_views = matrix_size[2][0]; +#ifdef _MSC_VER + num_rings_per_segment.assign(matrix_size[1].begin(), matrix_size[1].end()); +#else + num_rings_per_segment = matrix_size[1]; +#endif + } + else if (matrix_labels[1] == "view" && matrix_labels[2] == "axial coordinate") + { + storage_order = ProjDataFromStream::Segment_AxialPos_View_TangPos; + num_views = matrix_size[1][0]; +#ifdef _MSC_VER + + num_rings_per_segment.assign(matrix_size[2].begin(), matrix_size[2].end()); + +#else + num_rings_per_segment = matrix_size[2]; +#endif + } + + } + /* + else if (matrix_labels[3] == "view" && + matrix_labels[2] == "segment" && matrix_labels[1] == "axial coordinate") + { + storage_order = ProjDataFromStream::View_Segment_AxialPos_TangPos; + num_segments = matrix_size[2][0]; + num_views = matrix_size[3][0]; + #ifdef _MSC_VER + num_rings_per_segment.assign(matrix_size[1].begin(), matrix_size[1].end()); + #else + num_rings_per_segment = matrix_size[1]; + #endif + + } + */ + else + { + warning("Interfile error: matrix labels not in expected (or supported) format\n"); + stop_parsing(); + return true; + } + + return false; + +} + +// definition for using sort() below. +// This is a function object that allows comparing the first elements of 2 +// pairs. +template +class compare_first : +public binary_function +{ +public: + bool operator()(const pair& p1, const pair& p2) const + { + return p1.first < p2.first; + } +}; + + +// This function assigns segment numbers by sorting the average +// ring differences. It returns a list of the segment numbers +// in the same order as the min/max_ring_difference vectors +void +find_segment_sequence(vector& segment_sequence, + VectorWithOffset& sorted_num_rings_per_segment, + VectorWithOffset& sorted_min_ring_diff, + VectorWithOffset& sorted_max_ring_diff, + vector& num_rings_per_segment, + const vector& min_ring_difference, + const vector& max_ring_difference) +{ + const int num_segments = static_cast(min_ring_difference.size()); + assert(num_segments%2 == 1); + + + vector< pair > sum_and_location(num_segments); + for (int i=0; i(min_ring_difference[i] + max_ring_difference[i]); + sum_and_location[i].second = i; + } +#if 0 + cerr<< "DISPLAY SUM and LOCATION\n"<()); +#if 0 + cerr<<"display sum_sorted"< 1E-3) + { + error("This data does not seem to contain segment 0. \n" + "We can't handle this at the moment. Sorry."); + } + + vector< pair > location_and_segment_num(num_segments); + for (int i=0; i(ceil(num_segments/2 )); + + sorted_min_ring_diff = VectorWithOffset(min_segment_num,max_segment_num); + sorted_max_ring_diff = VectorWithOffset(min_segment_num,max_segment_num); + sorted_num_rings_per_segment= VectorWithOffset(min_segment_num,max_segment_num); + + + for (int i=0; i()); + + + segment_sequence.resize(num_segments); + for (int i=0; i(num_segments)) + { + warning("Interfile error: per-segment information is inconsistent: min_ring_difference\n"); + return true; + } + if (max_ring_difference.size() != static_cast(num_segments)) + { + warning("Interfile error: per-segment information is inconsistent: max_ring_difference\n"); + return true; + } + if (num_rings_per_segment.size()!= static_cast(num_segments)) + { + warning("Interfile error: per-segment information is inconsistent: num_rings_per_segment\n"); + return true; + } + + // check for arc-correction + if (applied_corrections.size() == 0) + { + warning("\nParsing Interfile header for projection data: \n" + "\t'applied corrections' keyword not found. Assuming arc-corrected data\n"); + is_arccorrected = true; + } + else + { + is_arccorrected = false; + for ( +#ifndef STIR_NO_NAMESPACES + std:: +#endif + vector::const_iterator iter = applied_corrections.begin(); + iter != applied_corrections.end(); + ++iter) + { + const string correction = standardise_keyword(*iter); + if(correction == "arc correction" || correction == "arc corrected") + { + is_arccorrected = true; + break; + } + else if (correction != "none") + warning("\nParsing Interfile header for projection data: \n" + "\t value '%s' for keyword 'applied corrections' ignored\n", + correction.c_str()); + + } + + } + + VectorWithOffset sorted_min_ring_diff; + VectorWithOffset sorted_max_ring_diff; + VectorWithOffset sorted_num_rings_per_segment; + + find_segment_sequence( segment_sequence,sorted_num_rings_per_segment, + sorted_min_ring_diff,sorted_max_ring_diff, + num_rings_per_segment, + min_ring_difference, max_ring_difference); +#if 0 + cerr << "PDFS data read inferred header :\n"; + cerr << "Segment sequence :"; + for (unsigned int i=0; i guessed_scanner_ptr(Scanner::get_scanner_from_name(get_exam_info_ptr()->originating_system)); + bool originating_system_was_recognised = + guessed_scanner_ptr->get_type() != Scanner::Unknown_scanner; + if (!originating_system_was_recognised) + { + // feable attempt to guess the system by checking the num_views etc + + char const * warning_msg = 0; + if (num_detectors_per_ring < 1) + { + num_detectors_per_ring = num_views*2; + warning_msg = "\nInterfile warning: I don't recognise 'originating system' value.\n" + "\tI guessed %s from 'num_views' (note: this guess is wrong for mashed data)\n" + " and 'number of rings'\n"; + } + else + { + warning_msg = "\nInterfile warning: I don't recognise 'originating system' value.\n" + "I guessed %s from 'number of detectors per ring' and 'number of rings'\n"; + } + + + switch (num_detectors_per_ring) + { + case 192*2: + guessed_scanner_ptr.reset(new Scanner( Scanner::E953)); + warning(warning_msg, "ECAT 953"); + break; + case 336*2: + guessed_scanner_ptr.reset(new Scanner( Scanner::Advance)); + warning(warning_msg, "Advance"); + break; + case 288*2: + if(num_rings == 104) + { //added by Dylan Togane + guessed_scanner_ptr.reset(new Scanner( Scanner::HRRT)); + warning(warning_msg, "HRRT"); + } + else if (num_rings == 48) + { + guessed_scanner_ptr.reset(new Scanner( Scanner::E966)); + warning(warning_msg, "ECAT 966"); + } + else if (num_rings == 32) + { + guessed_scanner_ptr.reset(new Scanner( Scanner::E962)); + warning(warning_msg, "ECAT 962"); + } + break; // Dylan Togane [dtogane@camhpet.on.ca] 30/07/2002 bug fix: added break + case 256*2: + guessed_scanner_ptr.reset(new Scanner( Scanner::E951)); + warning(warning_msg, "ECAT 951"); + break; + } + + if (guessed_scanner_ptr->get_type() == Scanner::Unknown_scanner) + warning("\nInterfile warning: I did not recognise the scanner neither from \n" + "'originating_system' or 'number of detectors per ring' and 'number of rings'.\n"); + } + + bool mismatch_between_header_and_guess = false; + + if (guessed_scanner_ptr->get_type() != Scanner::Unknown_scanner && + guessed_scanner_ptr->get_type() != Scanner::User_defined_scanner) + { + // fill in values which are not in the Interfile header + + if (num_rings < 1) + num_rings = guessed_scanner_ptr->get_num_rings(); + if (num_detectors_per_ring < 1) + num_detectors_per_ring = guessed_scanner_ptr->get_max_num_views()*2; +#if 0 + if (transaxial_FOV_diameter_in_cm < 0) + transaxial_FOV_diameter_in_cm = guessed_scanner_ptr->FOV_radius*2/10.; +#endif + if (inner_ring_diameter_in_cm < 0) + inner_ring_diameter_in_cm = guessed_scanner_ptr->get_inner_ring_radius()*2/10.; + if (average_depth_of_interaction_in_cm < 0) + average_depth_of_interaction_in_cm = guessed_scanner_ptr->get_average_depth_of_interaction()/10; + if (distance_between_rings_in_cm < 0) + distance_between_rings_in_cm = guessed_scanner_ptr->get_ring_spacing()/10; + if (default_bin_size_in_cm < 0) + default_bin_size_in_cm = + guessed_scanner_ptr->get_default_bin_size()/10; + if (max_num_non_arccorrected_bins <= 0) + max_num_non_arccorrected_bins = guessed_scanner_ptr->get_max_num_non_arccorrected_bins(); + if (default_num_arccorrected_bins <= 0) + default_num_arccorrected_bins = guessed_scanner_ptr->get_default_num_arccorrected_bins(); + + + if (num_axial_blocks_per_bucket<=0) + num_axial_blocks_per_bucket = guessed_scanner_ptr->get_num_axial_blocks_per_bucket(); + if (num_transaxial_blocks_per_bucket<=0) + num_transaxial_blocks_per_bucket = guessed_scanner_ptr->get_num_transaxial_blocks_per_bucket(); + if (num_axial_crystals_per_block<=0) + num_axial_crystals_per_block = guessed_scanner_ptr->get_num_axial_crystals_per_block(); + if (num_transaxial_crystals_per_block<=0) + num_transaxial_crystals_per_block = guessed_scanner_ptr->get_num_transaxial_crystals_per_block(); + if (num_axial_crystals_per_singles_unit < 0) + num_axial_crystals_per_singles_unit = + guessed_scanner_ptr->get_num_axial_crystals_per_singles_unit(); + if (num_transaxial_crystals_per_singles_unit < 0) + num_transaxial_crystals_per_singles_unit = + guessed_scanner_ptr->get_num_transaxial_crystals_per_singles_unit(); + if (num_detector_layers<=0) + num_detector_layers = guessed_scanner_ptr->get_num_detector_layers(); + + // consistency check with values of the guessed_scanner_ptr we guessed above + + if (num_rings != guessed_scanner_ptr->get_num_rings()) + { + warning("Interfile warning: 'number of rings' (%d) is expected to be %d.\n", + num_rings, guessed_scanner_ptr->get_num_rings()); + mismatch_between_header_and_guess = true; + } + if (num_detectors_per_ring != guessed_scanner_ptr->get_num_detectors_per_ring()) + { + warning("Interfile warning: 'number of detectors per ring' (%d) is expected to be %d.\n", + num_detectors_per_ring, guessed_scanner_ptr->get_num_detectors_per_ring()); + mismatch_between_header_and_guess = true; + } + if (fabs(inner_ring_diameter_in_cm - guessed_scanner_ptr->get_inner_ring_radius()*2/10.) > .001) + { + warning("Interfile warning: 'inner ring diameter (cm)' (%f) is expected to be %f.\n", + inner_ring_diameter_in_cm, guessed_scanner_ptr->get_inner_ring_radius()*2/10.); + mismatch_between_header_and_guess = true; + } + if (fabs(average_depth_of_interaction_in_cm - + guessed_scanner_ptr->get_average_depth_of_interaction()/10) > .001) + { + warning("Interfile warning: 'average depth of interaction (cm)' (%f) is expected to be %f.\n", + average_depth_of_interaction_in_cm, + guessed_scanner_ptr->get_average_depth_of_interaction()/10); + mismatch_between_header_and_guess = true; + } + if (fabs(distance_between_rings_in_cm-guessed_scanner_ptr->get_ring_spacing()/10) > .001) + { + warning("Interfile warning: 'distance between rings (cm)' (%f) is expected to be %f.\n", + distance_between_rings_in_cm, guessed_scanner_ptr->get_ring_spacing()/10); + mismatch_between_header_and_guess = true; + } + if (fabs(default_bin_size_in_cm-guessed_scanner_ptr->get_default_bin_size()/10) > .001) + { + warning("Interfile warning: 'default bin size (cm)' (%f) is expected to be %f.\n", + default_bin_size_in_cm, guessed_scanner_ptr->get_default_bin_size()/10); + mismatch_between_header_and_guess = true; + } + if (max_num_non_arccorrected_bins - guessed_scanner_ptr->get_max_num_non_arccorrected_bins()) + { + warning("Interfile warning: 'max_num_non_arccorrected_bins' (%d) is expected to be %d", + max_num_non_arccorrected_bins, guessed_scanner_ptr->get_max_num_non_arccorrected_bins()); + mismatch_between_header_and_guess = true; + } + if (default_num_arccorrected_bins - guessed_scanner_ptr->get_default_num_arccorrected_bins()) + { + warning("Interfile warning: 'default_num_arccorrected_bins' (%d) is expected to be %d", + default_num_arccorrected_bins, guessed_scanner_ptr->get_default_num_arccorrected_bins()); + mismatch_between_header_and_guess = true; + } + if ( + guessed_scanner_ptr->get_num_transaxial_blocks_per_bucket()>0 && + num_transaxial_blocks_per_bucket != guessed_scanner_ptr->get_num_transaxial_blocks_per_bucket()) + { + warning("Interfile warning: num_transaxial_blocks_per_bucket (%d) is expected to be %d.\n", + num_transaxial_blocks_per_bucket, guessed_scanner_ptr->get_num_transaxial_blocks_per_bucket()); + mismatch_between_header_and_guess = true; + } + if ( + guessed_scanner_ptr->get_num_axial_blocks_per_bucket()>0 && + num_axial_blocks_per_bucket != guessed_scanner_ptr->get_num_axial_blocks_per_bucket()) + { + warning("Interfile warning: num_axial_blocks_per_bucket (%d) is expected to be %d.\n", + num_axial_blocks_per_bucket, guessed_scanner_ptr->get_num_axial_blocks_per_bucket()); + mismatch_between_header_and_guess = true; + } + if ( + guessed_scanner_ptr->get_num_axial_crystals_per_block()>0 && + num_axial_crystals_per_block!= guessed_scanner_ptr->get_num_axial_crystals_per_block()) + { + warning("Interfile warning: num_axial_crystals_per_block (%d) is expected to be %d.\n", + num_axial_crystals_per_block, guessed_scanner_ptr->get_num_axial_crystals_per_block()); + mismatch_between_header_and_guess = true; + } + if ( + guessed_scanner_ptr->get_num_transaxial_crystals_per_block()>0 && + num_transaxial_crystals_per_block!= guessed_scanner_ptr->get_num_transaxial_crystals_per_block()) + { + warning("Interfile warning: num_transaxial_crystals_per_block (%d) is expected to be %d.\n", + num_transaxial_crystals_per_block, guessed_scanner_ptr->get_num_transaxial_crystals_per_block()); + mismatch_between_header_and_guess = true; + } + if ( guessed_scanner_ptr->get_num_axial_crystals_per_singles_unit() > 0 && + num_axial_crystals_per_singles_unit != + guessed_scanner_ptr->get_num_axial_crystals_per_singles_unit() ) + { + warning("Interfile warning: axial crystals per singles unit (%d) is expected to be %d.\n", + num_axial_crystals_per_singles_unit, + guessed_scanner_ptr->get_num_axial_crystals_per_singles_unit()); + mismatch_between_header_and_guess = true; + } + if ( guessed_scanner_ptr->get_num_transaxial_crystals_per_singles_unit() > 0 && + num_transaxial_crystals_per_singles_unit != + guessed_scanner_ptr->get_num_transaxial_crystals_per_singles_unit() ) + { + warning("Interfile warning: transaxial crystals per singles unit (%d) is expected to be %d.\n", + num_transaxial_crystals_per_singles_unit, + guessed_scanner_ptr->get_num_transaxial_crystals_per_singles_unit()); + mismatch_between_header_and_guess = true; + } + if ( + guessed_scanner_ptr->get_num_detector_layers()>0 && + num_detector_layers != guessed_scanner_ptr->get_num_detector_layers()) + { + warning("Interfile warning: num_detector_layers (%d) is expected to be %d.\n", + num_detector_layers, guessed_scanner_ptr->get_num_detector_layers()); + mismatch_between_header_and_guess = true; + } + + // end of checks. If they failed, we ignore the guess + if (mismatch_between_header_and_guess) + { + warning("Interfile warning: I have used all explicit settings for the scanner\n" + "\tfrom the Interfile header, and remaining fields set from the\n" + "\t%s model.\n", + guessed_scanner_ptr->get_name().c_str()); + if (!originating_system_was_recognised) + guessed_scanner_ptr.reset(new Scanner( Scanner::Unknown_scanner)); + } + } + + if (guessed_scanner_ptr->get_type() == Scanner::Unknown_scanner || + guessed_scanner_ptr->get_type() == Scanner::User_defined_scanner) + { + // warn if the Interfile header does not provide enough info + + if (num_rings < 1) + warning("Interfile warning: 'number of rings' invalid.\n"); + if (num_detectors_per_ring < 1) + warning("Interfile warning: 'num_detectors_per_ring' invalid.\n"); +#if 0 + if (transaxial_FOV_diameter_in_cm < 0) + warning("Interfile warning: 'transaxial FOV diameter (cm)' invalid.\n"); +#endif + if (inner_ring_diameter_in_cm <= 0) + warning("Interfile warning: 'inner ring diameter (cm)' invalid. This might disastrous\n"); + if (average_depth_of_interaction_in_cm <= 0) + warning("Interfile warning: 'average depth of interaction (cm)' invalid. This might be disastrous.\n"); + if (distance_between_rings_in_cm <= 0) + warning("Interfile warning: 'distance between rings (cm)' invalid.\n"); + if (default_bin_size_in_cm <= 0) + warning("Interfile warning: 'default_bin size (cm)' invalid.\n"); + if (num_axial_crystals_per_singles_unit <= 0) + warning("Interfile warning: 'axial crystals per singles unit' invalid.\n"); + if (num_transaxial_crystals_per_singles_unit <= 0) + warning("Interfile warning: 'transaxial crystals per singles unit' invalid.\n"); + + } + + // finally, we construct a new scanner object with + // data from the Interfile header (or the guessed scanner). + shared_ptr scanner_ptr_from_file( + new Scanner(guessed_scanner_ptr->get_type(), + get_exam_info_ptr()->originating_system, + num_detectors_per_ring, + num_rings, + max_num_non_arccorrected_bins, + default_num_arccorrected_bins, + static_cast(inner_ring_diameter_in_cm*10./2), + static_cast(average_depth_of_interaction_in_cm*10), + static_cast(distance_between_rings_in_cm*10.), + static_cast(default_bin_size_in_cm*10), + static_cast(view_offset_in_degrees*_PI/180), + num_axial_blocks_per_bucket, + num_transaxial_blocks_per_bucket, + num_axial_crystals_per_block, + num_transaxial_crystals_per_block, + num_axial_crystals_per_singles_unit, + num_transaxial_crystals_per_singles_unit, + num_detector_layers)); + + bool is_consistent = + scanner_ptr_from_file->check_consistency() == Succeeded::yes; + if (scanner_ptr_from_file->get_type() == Scanner::Unknown_scanner || + scanner_ptr_from_file->get_type() == Scanner::User_defined_scanner || + mismatch_between_header_and_guess || + !is_consistent) + { + warning("Interfile parsing ended up with the following scanner:\n%s\n", + scanner_ptr_from_file->parameter_info().c_str()); + } + + + // float azimuthal_angle_sampling =_PI/num_views; + + + + + if (is_arccorrected) + { + if (effective_central_bin_size_in_cm <= 0) + effective_central_bin_size_in_cm = + scanner_ptr_from_file->get_default_bin_size()/10; + else if (fabs(effective_central_bin_size_in_cm - + scanner_ptr_from_file->get_default_bin_size()/10)>.001) + warning("Interfile warning: unexpected effective_central_bin_size_in_cm\n" + "Value in header is %g while the default for the scanner is %g\n" + "Using value from header.", + effective_central_bin_size_in_cm, + scanner_ptr_from_file->get_default_bin_size()/10); + + data_info_ptr = + new ProjDataInfoCylindricalArcCorr ( + scanner_ptr_from_file, + float(effective_central_bin_size_in_cm*10.), + sorted_num_rings_per_segment, + sorted_min_ring_diff, + sorted_max_ring_diff, + num_views,num_bins); + } + else + { + data_info_ptr = + new ProjDataInfoCylindricalNoArcCorr ( + scanner_ptr_from_file, + sorted_num_rings_per_segment, + sorted_min_ring_diff, + sorted_max_ring_diff, + num_views,num_bins); + if (effective_central_bin_size_in_cm>0 && + fabs(effective_central_bin_size_in_cm - + data_info_ptr->get_sampling_in_s(Bin(0,0,0,0))/10.)>.01) + { + warning("Interfile warning: inconsistent effective_central_bin_size_in_cm\n" + "Value in header is %g while I expect %g from the inner ring radius etc\n" + "Ignoring value in header", + effective_central_bin_size_in_cm, + data_info_ptr->get_sampling_in_s(Bin(0,0,0,0))/10.); + } + } + //cerr << data_info_ptr->parameter_info() << endl; + + return false; +} + +END_NAMESPACE_STIR diff --git a/src/IO/InterfileOutputFileFormat.cxx b/src/IO/InterfileOutputFileFormat.cxx new file mode 100644 index 0000000000..d5494f9064 --- /dev/null +++ b/src/IO/InterfileOutputFileFormat.cxx @@ -0,0 +1,101 @@ +// +// +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup InterfileIO + \brief Implementation of class stir::InterfileOutputFileFormat + + \author Kris Thielemans + +*/ + +#include "stir/IO/InterfileOutputFileFormat.h" +#include "stir/IO/interfile.h" + +START_NAMESPACE_STIR + + +const char * const +InterfileOutputFileFormat::registered_name = "Interfile"; + +InterfileOutputFileFormat:: +InterfileOutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + base_type::set_defaults(); + set_type_of_numbers(type); + set_byte_order(byte_order); +} + +void +InterfileOutputFileFormat:: +set_defaults() +{ + base_type::set_defaults(); +} + +void +InterfileOutputFileFormat:: +initialise_keymap() +{ + parser.add_start_key("Interfile Output File Format Parameters"); + parser.add_stop_key("End Interfile Output File Format Parameters"); + base_type::initialise_keymap(); +} + +bool +InterfileOutputFileFormat:: +post_processing() +{ + if (base_type::post_processing()) + return true; + return false; +} + +// note 'warn' commented below to avoid compiler warning message about unused variables +ByteOrder +InterfileOutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool /* warn */) +{ + this->file_byte_order = new_byte_order; + return this->file_byte_order; +} + + + +Succeeded +InterfileOutputFileFormat:: + actual_write_to_file(string& filename, + const DiscretisedDensity<3,float>& density) const +{ + // TODO modify write_basic_interfile to return filename + + Succeeded success = + write_basic_interfile(filename, density, + this->type_of_numbers, this->scale_to_write_data, + this->file_byte_order); + if (success == Succeeded::yes) + replace_extension(filename, ".hv"); + return success; +}; + +END_NAMESPACE_STIR + + diff --git a/src/IO/InterfilePDFSHeaderSPECT.cxx b/src/IO/InterfilePDFSHeaderSPECT.cxx new file mode 100644 index 0000000000..bc043232d1 --- /dev/null +++ b/src/IO/InterfilePDFSHeaderSPECT.cxx @@ -0,0 +1,231 @@ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) 2013-2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! +\file +\ingroup InterfileIO +\brief This file implements the classes stir::InterfilePDFSHeaderSPECT + +\author Kris Thielemans +\author Berta Marti Fuster +*/ + +#include "stir/IO/InterfilePDFSHeaderSPECT.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::binary_function; +using std::pair; +using std::sort; +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + +//KT 26/10/98 +// KT 13/11/98 moved stream arg from constructor to parse() +InterfilePDFSHeaderSPECT::InterfilePDFSHeaderSPECT() +: InterfileHeader() +{ + num_segments = 1; + num_views = -1; + add_key("number of projections", + &num_views); + start_angle=0; + add_key("start angle", + &start_angle); + direction_of_rotation="cw"; + add_key("direction of rotation", + &direction_of_rotation); + extent_of_rotation=double_value_not_set; + add_key("extent of rotation", + &extent_of_rotation); + // TODO convert to ASCIIlist + orbit = "circular"; + add_key("orbit", + &orbit); + radius_of_rotation = double_value_not_set; + add_key("radius",&radius_of_rotation); + add_key("radii",&radii_of_rotation); // for non-circular orbits + // overwrite vectored-value, as v3.3 had a scalar + add_key("data offset in bytes", &data_offset); + +} + +bool InterfilePDFSHeaderSPECT::post_processing() +{ + + if (InterfileHeader::post_processing() == true) + return true; + + // for compatibility with PET code + data_offset_each_dataset[0] = data_offset; + + // SPECT v3.3 doesn't really define matrix_labels. We just check that if they're present, they are as in PET + if (matrix_labels[0].size()>0 && matrix_labels[0] != "bin coordinate") + { + // use error message with index [1] as that is what the user sees. + warning("Interfile error: expecting 'matrix axis label[1] := bin coordinate'"); + return true; + } + if (matrix_labels[1].size()>0 && matrix_labels[1] != "axial coordinate" ) + { + // use error message with index [2] as that is what the user sees. + warning("Interfile error: expecting 'matrix axis label[2] := axial coordinate'"); + return true; + } + + if (extent_of_rotation == double_value_not_set) + { + warning("Interfile error: extent of rotation needs to be set"); + return true; + } + + num_bins = matrix_size[0][0]; + bin_size_in_cm = pixel_sizes[0]/10.; + + storage_order =ProjDataFromStream::Segment_View_AxialPos_TangPos; + num_axial_poss= matrix_size[1][0]; + const double z_spacing_in_cm = pixel_sizes[1]/10.; + + //Fill the radius depending on the type of orbit (just two orbits are supported) + // will be in mm (SPECT Interfile uses mm) + VectorWithOffset radii(0, num_views-1); + orbit=standardise_keyword(orbit); + if (orbit == "circular") + { + if (radius_of_rotation == double_value_not_set) + { + warning("Interfile error: radius not set"); + return true; + } + for ( int i = 0 ; i < num_views ; i++ ) radii[ i ] = static_cast(radius_of_rotation); + } + else if (orbit == "non-circular") + { + + if ( radii_of_rotation.size() != static_cast(num_views)) + { + warning("Interfile error: number of projections must be consistent with radius vector length"); + return true; + } + for ( int i = 0 ; i < num_views ; i++ ) radii[ i ] = static_cast(radii_of_rotation[i]); + } + else + { + warning("Interfile error: only circular or non-circular orbits are supported"); + return true; + } + + + // somewhat strange values to be compatible with PET + VectorWithOffset sorted_min_ring_diff(0,0); + VectorWithOffset sorted_max_ring_diff(0,0); + VectorWithOffset sorted_num_rings_per_segment(0,0); + sorted_min_ring_diff[0]=0; + sorted_max_ring_diff[0]=0; + sorted_num_rings_per_segment[0]=num_axial_poss; + + // we construct a new scanner object with + // data from the Interfile header (or the guessed scanner). + // Initialize the scanner values (most are not used in SPECT reconstruction) + + const int num_rings = sorted_num_rings_per_segment[0]; + const int num_detectors_per_ring = -1;//num_views*2; + const double average_depth_of_interaction_in_cm = 0; + const double distance_between_rings_in_cm = z_spacing_in_cm*2; // need to do times 2 such that default z-spacing of reconstruction is z_spacing + double default_bin_size_in_cm = bin_size_in_cm ; + const double view_offset_in_degrees = start_angle; + const int max_num_non_arccorrected_bins = num_bins; + const int default_num_arccorrected_bins = num_bins; + const int num_axial_blocks_per_bucket = -1; + const int num_transaxial_blocks_per_bucket = -1; + const int num_axial_crystals_per_block = -1; + const int num_transaxial_crystals_per_block = -1; + const int num_axial_crystals_per_singles_unit = -1; + const int num_transaxial_crystals_per_singles_unit = -1; + const int num_detector_layers = 1; + + shared_ptr guessed_scanner_ptr(Scanner::get_scanner_from_name(get_exam_info_ptr()->originating_system)); + shared_ptr scanner_ptr_from_file( + new Scanner(guessed_scanner_ptr->get_type(), + get_exam_info_ptr()->originating_system, + num_detectors_per_ring, + num_rings, + max_num_non_arccorrected_bins, + default_num_arccorrected_bins, + static_cast(radii[0]), + static_cast(average_depth_of_interaction_in_cm*10), + static_cast(distance_between_rings_in_cm*10.), + static_cast(default_bin_size_in_cm*10), + static_cast(view_offset_in_degrees*_PI/180), + num_axial_blocks_per_bucket, + num_transaxial_blocks_per_bucket, + num_axial_crystals_per_block, + num_transaxial_crystals_per_block, + num_axial_crystals_per_singles_unit, + num_transaxial_crystals_per_singles_unit, + num_detector_layers)); +#if 0 + if (default_bin_size_in_cm <= 0) + default_bin_size_in_cm = + scanner_ptr_from_file->get_default_bin_size()/10; + else if (fabs(bin_size_in_cm - + scanner_ptr_from_file->get_default_bin_size()/10)>.001) + warning("Interfile warning: unexpected bin size in cm\n", + bin_size_in_cm, + scanner_ptr_from_file->get_default_bin_size()/10); +#endif + ProjDataInfoCylindricalArcCorr* my_data_info_ptr = + new ProjDataInfoCylindricalArcCorr ( + scanner_ptr_from_file, + float(bin_size_in_cm*10.), + sorted_num_rings_per_segment, + sorted_min_ring_diff, + sorted_max_ring_diff, + num_views,num_bins); + + my_data_info_ptr->set_ring_radii_for_all_views ( radii); + + direction_of_rotation = standardise_keyword(direction_of_rotation); + const float angle_sampling = float (extent_of_rotation)/num_views * float(_PI/180); + if(direction_of_rotation=="cw") + { + my_data_info_ptr->set_azimuthal_angle_sampling(-angle_sampling); + } + else if(direction_of_rotation=="ccw") + { + my_data_info_ptr->set_azimuthal_angle_sampling(angle_sampling); + } + else + { + warning("direction of rotation has to be CW or CCW"); + return true; + } + this->data_info_sptr.reset(my_data_info_ptr); + + //cerr << data_info_ptr->parameter_info() << endl; + + return false; +} + + +END_NAMESPACE_STIR diff --git a/src/IO/InterfileParametricDensityOutputFileFormat.cxx b/src/IO/InterfileParametricDensityOutputFileFormat.cxx new file mode 100644 index 0000000000..f144bf8b5f --- /dev/null +++ b/src/IO/InterfileParametricDensityOutputFileFormat.cxx @@ -0,0 +1,148 @@ +// +// +/* + Copyright (C) 2002-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup InterfileIO + \brief Implementation of class stir::InterfileParametricDensityOutputFileFormat + + \author Kris Thielemans + \author Nicolas A Karakatsanis + +*/ + +#include "stir/IO/InterfileParametricDensityOutputFileFormat.h" +#include "stir/IO/interfile.h" +#include "stir/modelling/KineticParameters.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/NumericType.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +//#define TEMPLATE template +#define TEMPLATE template +//#define InterfileParamDiscDensity InterfileParametricDensityOutputFileFormat +#define InterfileParamDiscDensity InterfileParametricDensityOutputFileFormat + + +TEMPLATE +const char * const +InterfileParamDiscDensity::registered_name = "Interfile"; + +TEMPLATE +InterfileParamDiscDensity:: +InterfileParametricDensityOutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) +{ + base_type::set_defaults(); + this->set_type_of_numbers(type); + this->set_byte_order(byte_order); +} + +TEMPLATE +void +InterfileParamDiscDensity:: +set_defaults() +{ + base_type::set_defaults(); +} + +TEMPLATE +void +InterfileParamDiscDensity:: +initialise_keymap() +{ + this->parser.add_start_key("Interfile Output File Format Parameters"); + this->parser.add_stop_key("End Interfile Output File Format Parameters"); + base_type::initialise_keymap(); +} + +TEMPLATE +bool +InterfileParamDiscDensity:: +post_processing() +{ + if (base_type::post_processing()) + return true; + return false; +} + + +TEMPLATE +ByteOrder +InterfileParamDiscDensity:: +set_byte_order(const ByteOrder& new_byte_order, const bool warn) +{ + if (!new_byte_order.is_native_order()) + { + if (warn) + warning("InterfileParametricDensityOutputFileFormat: byte_order is currently fixed to the native format\n"); + this->file_byte_order = ByteOrder::native; + } + else + this->file_byte_order = new_byte_order; + return this->file_byte_order; +} + + + +TEMPLATE +Succeeded +InterfileParamDiscDensity:: + actual_write_to_file(string& filename, + const ParametricDiscretisedDensity& parametric_density) const +{ + // TODO modify write_basic_interfile to return filename + + //error("InterfileParametricDensityOutputFileFormat TODO"); + //return Succeeded::no; + + + // somewhat naughty trick to get elemT of DiscretisedDensityT + typedef typename DiscDensityT::full_value_type KinParsT; + + typedef + typename ParametricDiscretisedDensity::SingleDiscretisedDensityType + SingleDensityType; + + SingleDensityType single_density = parametric_density.construct_single_density(1); + + for (unsigned int f=1; f<=KinParsT::size(); ++f) + { + string param_filename=filename; + parametric_density.construct_single_density(single_density,f); + Succeeded success = write_basic_interfile(param_filename, single_density, f); + if (success == Succeeded::no) return success; + } + + return Succeeded::yes; + + + +}; + +#undef ParamDiscDensity +#undef TEMPLATE + +template class InterfileParametricDensityOutputFileFormat; +template class InterfileParametricDensityOutputFileFormat; + + +END_NAMESPACE_STIR diff --git a/src/IO/OutputFileFormat.cxx b/src/IO/OutputFileFormat.cxx new file mode 100644 index 0000000000..061f0274c7 --- /dev/null +++ b/src/IO/OutputFileFormat.cxx @@ -0,0 +1,47 @@ +/* + Copyright (C) 2003- 2009-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011, Kris Thielemans + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + + \brief Instantiations of the stir::OutputFileFormat class + \author Kris Thielemans + \author Nicolas A Karakatsanis +*/ + +#include "stir/IO/OutputFileFormat.txx" +#include "stir/DiscretisedDensity.h" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" + +#ifdef _MSC_VER +#pragma warning (disable : 4661) +#endif + +START_NAMESPACE_STIR + + +template class OutputFileFormat >; +template class OutputFileFormat; +template class OutputFileFormat; +template class OutputFileFormat; + +END_NAMESPACE_STIR + + diff --git a/src/IO/OutputFileFormat_default.cxx b/src/IO/OutputFileFormat_default.cxx new file mode 100644 index 0000000000..be66fc1c90 --- /dev/null +++ b/src/IO/OutputFileFormat_default.cxx @@ -0,0 +1,93 @@ +// +// +/* + Copyright (C) 2005- 2009-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief initialisation of the stir::OutputFileFormat::_default_sptr member + \author Kris Thielemans + \author Nicolas A Karakatsanis + +*/ + +#include "stir/IO/InterfileOutputFileFormat.h" +#include "stir/DiscretisedDensity.h" + +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/DynamicDiscretisedDensity.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/ECAT7ParametricDensityOutputFileFormat.h" +#include "stir/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.h" +#else +#include "stir/modelling/KineticParameters.h" +#include "stir/IO/InterfileParametricDensityOutputFileFormat.h" +#include "stir/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.h" +#endif + +START_NAMESPACE_STIR + +template <> +shared_ptr > > +OutputFileFormat >::_default_sptr(new InterfileOutputFileFormat); + + +#if 0 + template <> + shared_ptr > > > + OutputFileFormat > >::_default_sptr = + new InterfileParametricDensityOutputFileFormat<3,KineticParameters<2,float> >; +#else + template <> + shared_ptr > + OutputFileFormat::_default_sptr( +#ifdef HAVE_LLN_MATRIX + new ecat::ecat7::ECAT7ParametricDensityOutputFileFormat +#else + new InterfileParametricDensityOutputFileFormat +#endif + ); + +template <> + shared_ptr > + OutputFileFormat::_default_sptr( +#ifdef HAVE_LLN_MATRIX + new ecat::ecat7::ECAT7ParametricDensityOutputFileFormat +#else + new InterfileParametricDensityOutputFileFormat +#endif + ); + +#endif +#if 1 + template <> + shared_ptr > + OutputFileFormat:: + _default_sptr( +#ifdef HAVE_LLN_MATRIX + new ecat::ecat7::ECAT7DynamicDiscretisedDensityOutputFileFormat +#else + new InterfileDynamicDiscretisedDensityOutputFileFormat +#endif + ); +#endif + +END_NAMESPACE_STIR + + + + diff --git a/src/IO/RegisteredObject.cxx b/src/IO/RegisteredObject.cxx new file mode 100644 index 0000000000..9ee5d8b564 --- /dev/null +++ b/src/IO/RegisteredObject.cxx @@ -0,0 +1,61 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + + \brief Instantiations of stir::RegisteredObject + + Currently only necessary for VC 6.0 + + \author Kris Thielemans + +*/ + +// note: include has to be before #ifdef as it's in this file that +// __STIR_REGISTRY_NOT_INLINE is defined +#include "stir/RegisteredObject.h" + +#ifdef __STIR_REGISTRY_NOT_INLINE + +#pragma message("instantiating RegisteredObject") +#include "stir/IO/OutputFileFormat.h" +// add here all roots of hierarchies based on RegisteredObject + +START_NAMESPACE_STIR + +template +RegisteredObject::RegistryType& +RegisteredObject::registry () +{ + static RegistryType the_registry("None", 0); + return the_registry; +} + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +template RegisteredObject; +// add here all roots of hierarchies based on RegisteredObject + +END_NAMESPACE_STIR + +#endif diff --git a/src/IO/ecat6_utils.cxx b/src/IO/ecat6_utils.cxx new file mode 100644 index 0000000000..6142426a16 --- /dev/null +++ b/src/IO/ecat6_utils.cxx @@ -0,0 +1,599 @@ +// +// + + +/*! + \file + \ingroup ECAT + + \brief Implementation of ECAT 6 CTI functions to access data + \author Kris Thielemans (conversions from/to VAX floats, longs) + \author PARAPET project + + \warning This file relies on ByteOrderDefine.h to find out if it + has to byteswap. This ideally would be changed to use the class stir::ByteOrder. + Make sure you run test/test_ByteOrder. + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ + +/* History + + Original version contained code based on files by Larry Byars + converted to C++ etc by PARAPET project + + KT 10/11/2000 + - added support for attenuation files + - added support for data types different from 16 bit ints. + - added a bit more diagonistics for file IO errors + + KT 11/01/2001 + - added cti_read_norm_subheader,get_normheaders and removed get_attndata + as it was identical to get_scandata + + KT 10/09/2004 + - removed aliasing bugs in get_vax_float etc + + KT 13/01/2008 + replace original CTI code with calls to LLN matrix library: + - introduced mhead_ptr in various functions + - have #define STIR_ORIGINAL_ECAT6 to be able to switch between old and new version + + KT 29/04/2009 + removed CTI-derived code +*/ +#include "stir/IO/stir_ecat_common.h" +#include "stir/IO/ecat6_utils.h" + +#ifndef STIR_ORIGINAL_ECAT6 +// we will need file_data_to_host which is declared in machine_indep.h +// However, that file has a problem with the definition of swab on some systems +// so we declare it here +//#include "machine_indep.h" +extern "C" int file_data_to_host(char *dptr, int nblks, int dtype); +extern "C" FILE *mat_create(char *fname, Main_header *mhead); +#endif + +#include "stir/ByteOrder.h" +#include "stir/ByteOrderDefine.h" +#include "boost/static_assert.hpp" +#include "boost/cstdint.hpp" +#include // for std::swap +#include +#include +#include +#include +#include +#include + +// replace bcopy with memcpy +#define bcopy(src, dest, length) memcpy(dest, src, length) +#define toblocks(x) ((x + (MatBLKSIZE - 1))/MatBLKSIZE) + +BOOST_STATIC_ASSERT(sizeof(unsigned short)==2); + + + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 + + +int get_scanheaders (FILE *fptr, long matnum, ECAT6_Main_header *mhead, + Scan_subheader *shead, ScanInfoRec *scanParams) +{ + int status; + MatDir entry; + + // check the header + status = cti_read_ECAT6_Main_header (fptr, mhead); + if (status != EXIT_SUCCESS) return EXIT_FAILURE; + + if (mhead->file_type != matScanFile) { + printf ("\n- file is not a scan file, type = %d\n", mhead->file_type); +#ifdef STIR_ORIGINAL_ECAT6 + dump_ECAT6_Main_header (0, mhead); +#endif + return EXIT_FAILURE; + } + + // look up matnum in scan file + if (!cti_lookup (fptr, mhead, matnum, &entry)) { + printf ("\n- specified matrix not in scan file\n"); +#ifdef STIR_ORIGINAL_ECAT6 + dump_ECAT6_Main_header (0, mhead); +#endif + return EXIT_FAILURE; + } + + // read scan subheader + status = cti_read_scan_subheader (fptr, mhead, entry.strtblk, shead); + if (status != EXIT_SUCCESS) { + printf ("\n- error reading scan subheader\n"); + return EXIT_FAILURE; + } + + scanParams->strtblk = entry.strtblk + 1; + scanParams->nblks = entry.endblk - entry.strtblk; +#ifndef STIR_ORIGINAL_ECAT6 + scanParams->nprojs = shead->num_r_elements; + scanParams->nviews = shead->num_angles; +#else + scanParams->nprojs = shead->dimension_1; + scanParams->nviews = shead->dimension_2; +#endif + scanParams->data_type = shead->data_type; +#ifdef STIR_ORIGINAL_ECAT6 + if (shead->data_type != mhead->data_type) + printf("\nget_scanheader warning: \n" +"data types differ between main header (%d) and subheader (%d)\n" +"Using value from subheader\n", mhead->data_type, shead->data_type); +#endif + + return EXIT_SUCCESS; +} + +int get_scandata (FILE *fptr, char *scan, ScanInfoRec *scanParams) +{ + int status; + + // read data from scan file + if (!scan) return EXIT_FAILURE; + + status= cti_rblk(fptr, scanParams->strtblk, (char *) scan, scanParams->nblks); + if (status != EXIT_SUCCESS) + return EXIT_FAILURE; + return + file_data_to_host(scan, scanParams->nblks,scanParams->data_type); +} + + +int get_attnheaders (FILE *fptr, long matnum, ECAT6_Main_header *mhead, + Attn_subheader *shead, ScanInfoRec *attnParams) +{ + int status; + MatDir entry; + + // check the header + status = cti_read_ECAT6_Main_header (fptr, mhead); + if (status != EXIT_SUCCESS) return EXIT_FAILURE; + + if (mhead->file_type != matAttenFile) { + printf ("\n- file is not a attn file, type = %d\n", mhead->file_type); +#ifdef STIR_ORIGINAL_ECAT6 + dump_ECAT6_Main_header (0, mhead); +#endif + return EXIT_FAILURE; + } + + // look up matnum in attn file + if (!cti_lookup (fptr, mhead, matnum, &entry)) { + printf ("\n- specified matrix not in attn file\n"); +#ifdef STIR_ORIGINAL_ECAT6 + dump_ECAT6_Main_header (0, mhead); +#endif + return EXIT_FAILURE; + } + + // read attn subheader + status = cti_read_attn_subheader (fptr, mhead, entry.strtblk, shead); + if (status != EXIT_SUCCESS) { + printf ("\n- error reading attn subheader\n"); + return EXIT_FAILURE; + } + + attnParams->strtblk = entry.strtblk + 1; + attnParams->nblks = entry.endblk - entry.strtblk; +#ifndef STIR_ORIGINAL_ECAT6 + attnParams->nprojs = shead->num_r_elements; + attnParams->nviews = shead->num_angles; +#else + attnParams->nprojs = shead->dimension_1; + attnParams->nviews = shead->dimension_2; +#endif + attnParams->data_type = shead->data_type; +#ifdef STIR_ORIGINAL_ECAT6 + if (shead->data_type != mhead->data_type) + printf("\nget_attnheader warning: \n" +"data types differ between main header (%d) and subheader (%d)\n" +"Using value from subheader\n", mhead->data_type, shead->data_type); +#endif + + return EXIT_SUCCESS; +} + + + +int get_normheaders (FILE *fptr, long matnum, ECAT6_Main_header *mhead, + Norm_subheader *shead, ScanInfoRec *normParams) +{ + int status; + MatDir entry; + + // check the header + status = cti_read_ECAT6_Main_header (fptr, mhead); + if (status != EXIT_SUCCESS) return EXIT_FAILURE; + + if (mhead->file_type != matNormFile) { + printf ("\n- file is not a norm file, type = %d\n", mhead->file_type); +#ifdef STIR_ORIGINAL_ECAT6 + dump_ECAT6_Main_header (0, mhead); +#endif + return EXIT_FAILURE; + } + + // look up matnum in norm file + if (!cti_lookup (fptr, mhead, matnum, &entry)) { + printf ("\n- specified matrix not in norm file\n"); +#ifdef STIR_ORIGINAL_ECAT6 + dump_ECAT6_Main_header (0, mhead); +#endif + return EXIT_FAILURE; + } + + // read norm subheader + status = cti_read_norm_subheader (fptr, mhead, entry.strtblk, shead); + if (status != EXIT_SUCCESS) { + printf ("\n- error reading norm subheader\n"); + return EXIT_FAILURE; + } + + normParams->strtblk = entry.strtblk + 1; + normParams->nblks = entry.endblk - entry.strtblk; +#ifndef STIR_ORIGINAL_ECAT6 + normParams->nprojs = shead->num_r_elements; + normParams->nviews = shead->num_angles; +#else + normParams->nprojs = shead->dimension_1; + normParams->nviews = shead->dimension_2; +#endif + normParams->data_type = shead->data_type; +#ifdef STIR_ORIGINAL_ECAT6 + if (shead->data_type != mhead->data_type) + printf("\nget_normheader warning: \n" +"data types differ between main header (%d) and subheader (%d)\n" +"Using value from subheader\n", mhead->data_type, shead->data_type); +#endif + + return EXIT_SUCCESS; +} + +#ifndef STIR_ORIGINAL_ECAT6 +FILE* +cti_create(const char * const fname, const Main_header *mhead) +{ + return mat_create(const_cast(fname), const_cast(mhead)); +} + +int cti_read_ECAT6_Main_header (FILE *fptr, ECAT6_Main_header *h) +{ + const int cti_status = mat_read_main_header(fptr, h); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +long cti_numcod (int frame, int plane, int gate, int data, int bed) +{ + return mat_numcod(frame, plane, gate, data, bed); +} + +void cti_numdoc (long matnum, Matval *matval) +{ + mat_numdoc(matnum, matval); +} + +int cti_rblk (FILE *fptr, int blkno, void *bufr, int nblks) +{ + const int cti_status = mat_rblk(fptr, blkno, reinterpret_cast(bufr), nblks); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int cti_wblk (FILE *fptr, int blkno, void *bufr, int nblks) +{ + const int cti_status = mat_wblk (fptr, blkno, reinterpret_cast(bufr), nblks); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int cti_enter (FILE *fptr, const ECAT6_Main_header* mhead_ptr, long matnum, int nblks) +{ + return mat_enter(fptr, const_cast(mhead_ptr), matnum, nblks); +} + +int cti_lookup (FILE *fptr, const ECAT6_Main_header* mhead_ptr, long matnum, MatDir *entry) +{ + return mat_lookup(fptr, const_cast(mhead_ptr), matnum, entry); +} + +int cti_read_image_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, Image_subheader *header_ptr) +{ + const int cti_status = mat_read_image_subheader (fptr, const_cast(h), blknum, header_ptr); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int cti_read_scan_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, Scan_subheader *header_ptr) +{ + const int cti_status = mat_read_scan_subheader (fptr, const_cast(h), blknum, header_ptr); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int cti_read_attn_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, Attn_subheader *header_ptr) +{ + const int cti_status = mat_read_attn_subheader (fptr, const_cast(h), blknum, header_ptr); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int cti_read_norm_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, Norm_subheader *header_ptr) +{ + const int cti_status = mat_read_norm_subheader (fptr, const_cast(h), blknum, header_ptr); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int cti_write_image_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, const Image_subheader *header_ptr) +{ + const int cti_status = mat_write_image_subheader (fptr, const_cast(h), blknum, const_cast(header_ptr)); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int cti_write_scan_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, const Scan_subheader *header_ptr) +{ + const int cti_status = mat_write_scan_subheader (fptr, const_cast(h), blknum, const_cast(header_ptr)); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int file_data_to_host(char *dptr, int nblks, int dtype) +{ + const int cti_status = ::file_data_to_host(dptr, nblks, dtype); + return cti_status==0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +#else// STIR_ORIGINAL_ECAT6 + +#error Original ECAT6 code removed + +#endif // STIR_ORIGINAL_ECAT6 + +int cti_rings2plane (short nrings, short ring0, short ring1) + +{ + int d = (int) (ring0 / (nrings/2)); + + return (ring1 * nrings/2 + ring0 % (nrings/2) + + nrings/2 * nrings * d + 1); +} + +#ifdef STIR_ORIGINAL_ECAT6 +#endif // STIR_ORIGINAL_ECAT6 + +int cti_write_idata (FILE *fptr, int blk, const short *data, int ibytes) +{ + unsigned int nblks; + char *dataptr; + int status; + + if (ibytes%MatBLKSIZE != 0) + { + warning("Error writing ECAT6 data: data_size should be a multiple of %d.\nNo Data written to file.", + MatBLKSIZE); + return (EXIT_FAILURE); + } +#if STIRIsNativeByteOrderBigEndian + char bufr[MatBLKSIZE]; + + dataptr = (char *) data; // point into data buffer + + // we'll use cti_wblk to write the data via another buffer. + // this way, if we need to transform the data as we went, we can do it. + nblks = toblocks (ibytes); + for (unsigned int i=0; i +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::ofstream; +using std::ifstream; +using std::iostream; +using std::fstream; +#endif + +START_NAMESPACE_STIR + +bool +is_interfile_signature(const char * const signature) +{ + // checking for "interfile :" + const char * pos_of_colon = strchr(signature, ':'); + if (pos_of_colon == NULL) + return false; + string keyword(signature, pos_of_colon-signature); + return ( + standardise_interfile_keyword(keyword) == + standardise_interfile_keyword("interfile")); +} + + + +VoxelsOnCartesianGrid* +read_interfile_image(istream& input, + const string& directory_for_data) +{ + InterfileImageHeader hdr; + if (!hdr.parse(input)) + { + return 0; //KT 10/12/2001 do not call ask_parameters anymore + } + + // prepend directory_for_data to the data_file_name from the header + char full_data_file_name[max_filename_length]; + strcpy(full_data_file_name, hdr.data_file_name.c_str()); + prepend_directory_name(full_data_file_name, directory_for_data.c_str()); + + ifstream data_in; + open_read_binary(data_in, full_data_file_name); + + CartesianCoordinate3D voxel_size(static_cast(hdr.pixel_sizes[2]), + static_cast(hdr.pixel_sizes[1]), + static_cast(hdr.pixel_sizes[0])); + + const int z_size = hdr.matrix_size[2][0]; + const int y_size = hdr.matrix_size[1][0]; + const int x_size = hdr.matrix_size[0][0]; + const BasicCoordinate<3,int> min_indices = + make_coordinate(0, -y_size/2, -x_size/2); + const BasicCoordinate<3,int> max_indices = + min_indices + make_coordinate(z_size, y_size, x_size) - 1; + + CartesianCoordinate3D origin(0,0,0); + if (hdr.first_pixel_offsets[2] != InterfileHeader::double_value_not_set) + { + // make sure that origin is such that + // first_pixel_offsets = min_indices*voxel_size + origin + origin = + make_coordinate(float(hdr.first_pixel_offsets[2]), + float(hdr.first_pixel_offsets[1]), + float(hdr.first_pixel_offsets[0])) + - voxel_size * BasicCoordinate<3,float>(min_indices); + } + + VoxelsOnCartesianGrid* image_ptr = + new VoxelsOnCartesianGrid + (IndexRange<3>(min_indices, max_indices), + origin, + voxel_size); + + data_in.seekg(hdr.data_offset_each_dataset[0]); + + float scale = float(1); + if (read_data(data_in, *image_ptr, hdr.type_of_numbers, scale, hdr.file_byte_order) + == Succeeded::no + || scale != 1) + { + warning("read_interfile_image: error reading data or scale factor returned by read_data not equal to 1\n"); + return 0; + } + + for (int i=0; i< hdr.matrix_size[2][0]; i++) + if (hdr.image_scaling_factors[0][i]!= 1) + (*image_ptr)[i] *= static_cast(hdr.image_scaling_factors[0][i]); + + return image_ptr; +} + + +VoxelsOnCartesianGrid* read_interfile_image(const string& filename) +{ + ifstream image_stream(filename.c_str()); + if (!image_stream) + { + error("read_interfile_image: couldn't open file %s\n", filename.c_str()); + } + + char directory_name[max_filename_length]; + get_directory_name(directory_name, filename.c_str()); + + return read_interfile_image(image_stream, directory_name); +} + +//Nicolas A Karakatsanis +VoxelsOnCartesianGrid* +read_interfile_frame_image(std::istream& input, + const unsigned int data_offset, + InterfileImageHeader& ifheader, + const string& directory_for_data) +{ + /* + InterfileImageHeader ifheader; + if (!ifheader.parse(input)) + { + error("read_interfile_frame_image: Failed to properly parse the Interfile header file of the provided data stream"); + return 0; + } + */ + // prepend directory_for_data to the data_file_name from the header + + char full_data_file_name[max_filename_length]; + strcpy(full_data_file_name, ifheader.data_file_name.c_str()); + prepend_directory_name(full_data_file_name, directory_for_data.c_str()); + + std::cout << "Preparing to load the image data of current image with offset = " << data_offset << endl; + ifstream data_in; + open_read_binary(data_in, full_data_file_name); + + std::cout << "Loading of image data stream for current image/frame was successful\n"; + + CartesianCoordinate3D voxel_size(static_cast(ifheader.pixel_sizes[2]), + static_cast(ifheader.pixel_sizes[1]), + static_cast(ifheader.pixel_sizes[0])); + + const int z_size = ifheader.matrix_size[2][0]; + const int y_size = ifheader.matrix_size[1][0]; + const int x_size = ifheader.matrix_size[0][0]; + const BasicCoordinate<3,int> min_indices = + make_coordinate(0, -y_size/2, -x_size/2); + const BasicCoordinate<3,int> max_indices = + min_indices + make_coordinate(z_size, y_size, x_size) - 1; + + CartesianCoordinate3D origin(0,0,0); + if (ifheader.first_pixel_offsets[2] != InterfileHeader::double_value_not_set) + { + // make sure that origin is such that + // first_pixel_offsets = min_indices*voxel_size + origin + origin = + make_coordinate(float(ifheader.first_pixel_offsets[2]), + float(ifheader.first_pixel_offsets[1]), + float(ifheader.first_pixel_offsets[0])) + - voxel_size * BasicCoordinate<3,float>(min_indices); + // TODO remove + if (norm(origin)>.01) + warning("interfile parsing: setting origin to (z=%g,y=%g,x=%g)", + origin.z(), origin.y(), origin.x()); + } + + std::cout << "The min. and max. indices as well as the origin of the current image have been determined.\n"; + + VoxelsOnCartesianGrid* image_ptr = + new VoxelsOnCartesianGrid + (IndexRange<3>(min_indices, max_indices), + origin, + voxel_size); + + std::cout << "Loading of image data buffer for current image was successful.\n"; + + data_in.seekg(data_offset); + + std::cout << "Shifting of the reference point of the current data stream was successful.\n"; + + float scale = float(1); + if (read_data(data_in, *image_ptr, ifheader.type_of_numbers, scale, ifheader.file_byte_order) + == Succeeded::no + || scale != 1) + { + error("read_interfile_image: error reading data or scale factor returned by read_data not equal to 1\n"); + return 0; + } + + for (int i=0; i< ifheader.matrix_size[2][0]; i++) + if (ifheader.image_scaling_factors[0][i]!= 1) + (*image_ptr)[i] *= static_cast(ifheader.image_scaling_factors[0][i]); + + std::cout << "Binary data stream was successfully loaded to the image buffer.\nReady to return the current image/frame data buffer pointer.\n\n"; + + return image_ptr; +} + +//Nicolas A Karakatsanis +VoxelsOnCartesianGrid* read_interfile_frame_image(const string& filename, + const unsigned int data_offset) +{ + ifstream image_stream(filename.c_str()); + if (!image_stream) + { + error("read_interfile_frame_image: couldn't open file %s\n", filename.c_str()); + } + + + InterfileImageHeader ifheader; + if (!ifheader.parse(image_stream)) + { + error("read_interfile_frame_image: Failed to properly parse the Interfile header file of the provided data stream\n"); + return 0; + } + + char directory_name[max_filename_length]; + get_directory_name(directory_name, filename.c_str()); + + return read_interfile_frame_image(image_stream, data_offset, ifheader, directory_name); +} + + +#if 0 +const VectorWithOffset +compute_file_offsets(int number_of_time_frames, + const NumericType output_type, + const CartesianCoordinate3D& dim, + std::streamoff initial_offset) +{ + const std::size_t a= dim.x()*dim.y()*dim.z()*output_type.size_in_bytes(); + VectorWithOffset temp(number_of_time_frames); + { + for (int i=0; i<=number_of_time_frames-1;i++) + temp[i]= initial_offset +i*a; + } + return temp; +} +#endif +/* A function that finds the appropriate filename for the binary data + to write in the header. It tries to cut the directory part of + data_file_name if it's the same as the directory part of the header. +*/ +static +string +interfile_get_data_file_name_in_header(const string& header_file_name, + const string& data_file_name) +{ + const string dir_name_of_binary_data = + get_directory_name(data_file_name); + if (dir_name_of_binary_data.size() == 0 || + is_absolute_pathname(data_file_name)) + { + // data_dirname is empty or it's an absolute path + return data_file_name; + } + const string dir_name_of_header = + get_directory_name(header_file_name); + if (dir_name_of_header == dir_name_of_binary_data) + { + // dirnames are the same, so strip from data_file_name + return + string(data_file_name, + find_pos_of_filename(data_file_name), + string::npos); + } + else + { + // just copy, what else to do? + return data_file_name; + } +} + +Succeeded +write_basic_interfile_image_header(const string& header_file_name, + const string& image_file_name, + const IndexRange<3>& index_range, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& origin, + const NumericType output_type, + const ByteOrder byte_order, + const VectorWithOffset& scaling_factors, + const VectorWithOffset& file_offsets) +{ + CartesianCoordinate3D min_indices; + CartesianCoordinate3D max_indices; + if (!index_range.get_regular_range(min_indices, max_indices)) + { + warning("write_basic_interfile: can handle only regular index ranges\n. No output\n"); + return Succeeded::no; + } + CartesianCoordinate3D dimensions = max_indices - min_indices + 1; + string header_name = header_file_name; + add_extension(header_name, ".hv"); + ofstream output_header(header_name.c_str(), ios::out); + if (!output_header.good()) + { + warning("Error opening Interfile header '%s' for writing\n", + header_name.c_str()); + return Succeeded::no; + } + + // handle directory names + const string data_file_name_in_header = + interfile_get_data_file_name_in_header(header_file_name, image_file_name); + + output_header << "!INTERFILE :=\n"; + output_header << "name of data file := " << data_file_name_in_header << endl; + output_header << "!GENERAL DATA :=\n"; + output_header << "!GENERAL IMAGE DATA :=\n"; + output_header << "!type of data := PET\n"; + output_header << "imagedata byte order := " << + (byte_order == ByteOrder::little_endian + ? "LITTLEENDIAN" + : "BIGENDIAN") + << endl; + output_header << "!PET STUDY (General) :=\n"; + output_header << "!PET data type := Image\n"; + output_header << "process status := Reconstructed\n"; + + output_header << "!number format := "; + if (output_type.integer_type() ) + output_header << (output_type.signed_type() + ? "signed integer\n" : "unsigned integer\n"); + else + output_header << "float\n"; + output_header << "!number of bytes per pixel := " + << output_type.size_in_bytes() << endl; + + output_header << "number of dimensions := 3\n"; + + output_header << "matrix axis label [1] := x\n"; + output_header << "!matrix size [1] := " + << dimensions.x() << endl; + output_header << "scaling factor (mm/pixel) [1] := " + << voxel_size.x() << endl; + output_header << "matrix axis label [2] := y\n"; + output_header << "!matrix size [2] := " + << dimensions.y() << endl; + output_header << "scaling factor (mm/pixel) [2] := " + << voxel_size.y() << endl; + output_header << "matrix axis label [3] := z\n"; + output_header << "!matrix size [3] := " + << dimensions.z()<< endl; + output_header << "scaling factor (mm/pixel) [3] := " + << voxel_size.z() << endl; + + if (origin.z() != InterfileHeader::double_value_not_set) + { + const CartesianCoordinate3D first_pixel_offsets = + voxel_size * BasicCoordinate<3,float>(min_indices) + origin; + output_header << "first pixel offset (mm) [1] := " + << first_pixel_offsets.x() << '\n'; + output_header << "first pixel offset (mm) [2] := " + << first_pixel_offsets.y() << '\n'; + output_header << "first pixel offset (mm) [3] := " + << first_pixel_offsets.z() << '\n'; + } + + output_header << "number of time frames := " << scaling_factors.get_length() << endl; + + for (int i=1; i<=scaling_factors.get_length();i++) + { + // only write scaling factors and offset if more than 1 frame or they are not default values + if (scaling_factors[i-1]!=1. || scaling_factors.get_length()>1) + output_header << "image scaling factor"<<"["< 1300) +template +#else +#define elemT float +#endif +Succeeded +write_basic_interfile(const string& filename, + const Array<3,elemT>& image, + const NumericType output_type, + const float scale, + const ByteOrder byte_order) +{ + CartesianCoordinate3D origin; + origin.fill(static_cast(InterfileHeader::double_value_not_set)); + return + write_basic_interfile(filename, + image, + CartesianCoordinate3D(1,1,1), + origin, + output_type, + scale, + byte_order); +} +#if defined(_MSC_VER) && (_MSC_VER <= 1300) +#undef elemT +#endif + +template +Succeeded write_basic_interfile(const string& filename, + const Array<3,NUMBER>& image, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& origin, + const NumericType output_type, + const float scale, + const ByteOrder byte_order) +{ + +#if 1 + string data_name=filename; + { + string::size_type pos=find_pos_of_extension(filename); + if (pos!=string::npos && filename.substr(pos)==".hv") + replace_extension(data_name, ".v"); + else + add_extension(data_name, ".v"); + } + string header_name=filename; +#else + char * data_name = new char[filename.size() + 5]; + char * header_name = new char[filename.size() + 5]; + + strcpy(data_name, filename.c_str()); + // KT 29/06/2001 make sure that a filename ending on .hv is treated correctly + { + const char * const extension = strchr(find_filename(data_name),'.'); + if (extension!=NULL && strcmp(extension, ".hv")==0) + replace_extension(data_name, ".v"); + else + add_extension(data_name, ".v"); + } + strcpy(header_name, data_name); +#endif + replace_extension(header_name, ".hv"); + + ofstream output_data; + open_write_binary(output_data, data_name.c_str()); + + float scale_to_use = scale; + write_data(output_data, image, output_type, scale_to_use, + byte_order); + + VectorWithOffset scaling_factors(1); + scaling_factors[0] = scale_to_use; + VectorWithOffset file_offsets(1); + file_offsets.fill(0); + + + const Succeeded success = + write_basic_interfile_image_header(header_name, + data_name, + image.get_index_range(), + voxel_size, + origin, + output_type, + byte_order, + scaling_factors, + file_offsets); +#if 0 + delete[] header_name; + delete[] data_name; +#endif + return success; +} + +Succeeded +write_basic_interfile(const string& filename, + const VoxelsOnCartesianGrid& image, + const NumericType output_type, + const float scale, + const ByteOrder byte_order) +{ + return + write_basic_interfile(filename, + image, // use automatic reference to base class + image.get_grid_spacing(), + image.get_origin(), + output_type, + scale, + byte_order); +} + +Succeeded +write_basic_interfile(const string& filename, + const DiscretisedDensity<3,float>& image, + const NumericType output_type, + const float scale, + const ByteOrder byte_order) +{ + // dynamic_cast will throw an exception when it's not valid + return + write_basic_interfile(filename, + dynamic_cast& >(image), + output_type, + scale, byte_order); +} + +//Nicolas A Karakatsanis +Succeeded +write_basic_interfile(string& filename, + const DiscretisedDensity<3,float>& image, + const unsigned int param_num, + const NumericType output_type, + const float scale, + const ByteOrder byte_order) +{ + + //Construct a string stream from the integer denoting the frame index + std::ostringstream frame_idx; + frame_idx << param_num; + + //Append the frame/parameter dependent extension to the original filename + //string frame_ext = "_p"; + filename+="_p"; + filename+=frame_idx.str(); + + // dynamic_cast will throw an exception when it's not valid + return + write_basic_interfile(filename, + dynamic_cast& >(image), + output_type, + scale, byte_order); +} + +static ProjDataFromStream* +read_interfile_PDFS_SPECT(istream& input, + const string& directory_for_data, + const ios::openmode open_mode) +{ + + InterfilePDFSHeaderSPECT hdr; + if (!hdr.parse(input)) + { + return 0; // KT 10122001 do not call ask_parameters anymore + } + + char full_data_file_name[max_filename_length]; + strcpy(full_data_file_name, hdr.data_file_name.c_str()); + prepend_directory_name(full_data_file_name, directory_for_data.c_str()); + + vector segment_sequence(1); + segment_sequence[0]=0; + + for (unsigned int i=1; i data_in(new fstream (full_data_file_name, open_mode | ios::binary)); + if (!data_in->good()) + { + warning("interfile parsing: error opening file %s",full_data_file_name); + return 0; + } + + return new ProjDataFromStream(hdr.get_exam_info_sptr(), + hdr.data_info_sptr, + data_in, + hdr.data_offset_each_dataset[0], + segment_sequence, + hdr.storage_order, + hdr.type_of_numbers, + hdr.file_byte_order, + static_cast(hdr.image_scaling_factors[0][0])); + + +} + + +ProjDataFromStream* +read_interfile_PDFS(istream& input, + const string& directory_for_data, + const ios::openmode open_mode) +{ + + { + InterfileHeader hdr; + std::ios::off_type offset = input.tellg(); + if (!hdr.parse(input, false)) // parse without warnings + { + warning("Interfile parsing failed"); + return 0; + } + input.seekg(offset); + if (hdr.get_exam_info_ptr()->imaging_modality.get_modality() == + ImagingModality::NM) + { + // spect data + input.seekg(offset); + return read_interfile_PDFS_SPECT(input, directory_for_data, open_mode); + } + } + // if we get here, it's PET + + InterfilePDFSHeader hdr; + if (!hdr.parse(input)) + { + warning("Interfile parsing of PET projection data failed"); + return 0; + } + + // KT 14/01/2000 added directory capability + // prepend directory_for_data to the data_file_name from the header + + char full_data_file_name[max_filename_length]; + strcpy(full_data_file_name, hdr.data_file_name.c_str()); + prepend_directory_name(full_data_file_name, directory_for_data.c_str()); + + for (unsigned int i=1; i data_in(new fstream (full_data_file_name, open_mode | ios::binary)); + if (!data_in->good()) + { + warning("interfile parsing: error opening file %s",full_data_file_name); + return 0; + } + + return new ProjDataFromStream(hdr.get_exam_info_sptr(), + hdr.data_info_ptr->create_shared_clone(), + data_in, + hdr.data_offset_each_dataset[0], + hdr.segment_sequence, + hdr.storage_order, + hdr.type_of_numbers, + hdr.file_byte_order, + static_cast(hdr.image_scaling_factors[0][0])); + + +} + + +ProjDataFromStream* +read_interfile_PDFS(const string& filename, + const ios::openmode open_mode) +{ + ifstream image_stream(filename.c_str()); + if (!image_stream) + { + error("read_interfile_PDFS: couldn't open file %s\n", filename.c_str()); + } + + char directory_name[max_filename_length]; + get_directory_name(directory_name, filename.c_str()); + + return read_interfile_PDFS(image_stream, directory_name, open_mode); +} + + +Succeeded +write_basic_interfile_PDFS_header(const string& header_file_name, + const string& data_file_name, + const ProjDataFromStream& pdfs) +{ + + string header_name = header_file_name; + add_extension(header_name, ".hs"); + ofstream output_header(header_name.c_str(), ios::out); + if (!output_header.good()) + { + warning("Error opening Interfile header '%s' for writing\n", + header_name.c_str()); + return Succeeded::no; + } + + // handle directory names + const string data_file_name_in_header = + interfile_get_data_file_name_in_header(header_file_name, data_file_name); + + const vector segment_sequence = pdfs.get_segment_sequence_in_stream(); + +#if 0 + // TODO get_phi currently ignores view offset + const float angle_first_view = + pdfs.get_proj_data_info_ptr()->get_phi(Bin(0,0,0,0)) * float(180/_PI); +#else + const float angle_first_view = + pdfs.get_proj_data_info_ptr()->get_scanner_ptr()->get_default_intrinsic_tilt() * float(180/_PI); +#endif + const float angle_increment = + (pdfs.get_proj_data_info_ptr()->get_phi(Bin(0,1,0,0)) - + pdfs.get_proj_data_info_ptr()->get_phi(Bin(0,0,0,0))) * float(180/_PI); + + const ExamInfo * exam_info_ptr = pdfs.get_exam_info_ptr(); + // default modality is PET + ImagingModality imaging_modality(ImagingModality::PT); + if (!is_null_ptr(exam_info_ptr)) + imaging_modality=exam_info_ptr->imaging_modality; + const bool is_spect = imaging_modality.get_modality() == ImagingModality::NM; + + output_header << "!INTERFILE :=\n"; + output_header << "!imaging modality := " << imaging_modality.get_name() << '\n'; + + output_header << "name of data file := " << data_file_name_in_header << endl; + + output_header << "originating system := "; + output_header <get_scanner_ptr()->get_name() << endl; + + if (is_spect) + output_header << "!version of keys := 3.3\n"; + else + output_header << "!version of keys := STIR3.0\n"; + + output_header << "!GENERAL DATA :=\n"; + output_header << "!GENERAL IMAGE DATA :=\n"; + output_header << "!type of data := " << (is_spect ? "Tomographic" : "PET") << '\n'; + + // output patient position + // note: strictly speaking this should come after "!SPECT STUDY (general)" but + // that's strange as these keys would be useful for all other cases as well + { + string orientation; + switch (pdfs.get_exam_info_ptr()->patient_position.get_orientation()) + { + case PatientPosition::head_in: orientation="head_in";break; + case PatientPosition::feet_in: orientation="feet_in";break; + case PatientPosition::other_orientation: orientation="other";break; + default: orientation="unknown"; break; + } + string rotation; + switch (pdfs.get_exam_info_ptr()->patient_position.get_rotation()) + { + case PatientPosition::prone: rotation="prone";break; + case PatientPosition::supine: rotation="supine";break; + case PatientPosition::other_rotation: + case PatientPosition::left: + case PatientPosition::right: + rotation="other";break; + default: rotation="unknown"; break; + } + if (orientation!="unknown") + output_header << "patient orientation := " << orientation << '\n'; + if (rotation!="unknown") + output_header << "patient rotation := " << rotation << '\n'; + } + + output_header << "imagedata byte order := " << + (pdfs.get_byte_order_in_stream() == ByteOrder::little_endian + ? "LITTLEENDIAN" + : "BIGENDIAN") + << endl; + + + if (is_spect) + { + // output_header << "number of energy windows :=1\n"; + output_header << "!SPECT STUDY (General) :=\n"; + } + else + { + output_header << "!PET STUDY (General) :=\n"; + output_header << "!PET data type := Emission\n"; + { + // KT 10/12/2001 write applied corrections keyword + if(dynamic_cast< const ProjDataInfoCylindricalArcCorr*> (pdfs.get_proj_data_info_ptr()) != NULL) + output_header << "applied corrections := {arc correction}\n"; + else + output_header << "applied corrections := {None}\n"; + } + } + { + string number_format; + size_t size_in_bytes; + + const NumericType data_type = pdfs.get_data_type_in_stream(); + data_type.get_Interfile_info(number_format, size_in_bytes); + + output_header << "!number format := " << number_format << "\n"; + output_header << "!number of bytes per pixel := " << size_in_bytes << "\n"; + } + + if (is_spect) + { + output_header << "!number of projections := " << pdfs.get_num_views() << '\n'; + output_header << "!extent of rotation := " << pdfs.get_num_views() * fabs(angle_increment) << '\n'; + output_header << "process status := acquired\n"; + output_header << "!SPECT STUDY (acquired data):=\n"; + + output_header << "!direction of rotation := " + << (angle_increment<0 ? "CCW" : "CW") + << '\n'; + output_header << "start angle := " << angle_first_view << '\n'; + + ProjDataInfoCylindricalArcCorr const * proj_data_info_cyl_ptr = + dynamic_cast(pdfs.get_proj_data_info_ptr()); + + VectorWithOffset ring_radii = proj_data_info_cyl_ptr->get_ring_radii_for_all_views(); + if (*std::min_element(ring_radii.begin(),ring_radii.end()) == + *std::max_element(ring_radii.begin(),ring_radii.end())) + { + output_header << "orbit := Circular\n"; + output_header << "Radius := " << *ring_radii.begin() << '\n'; + } + else + { + output_header << "orbit := Non-circular\n"; + output_header << "Radius := " << ring_radii << '\n'; + } + + output_header << "!matrix size [1] := " + <get_num_tangential_poss() << '\n'; + output_header << "!scaling factor (mm/pixel) [1] := " + <get_tangential_sampling() << '\n'; + output_header << "!matrix size [2] := " + <get_num_axial_poss(0) << '\n'; + output_header << "!scaling factor (mm/pixel) [2] := " + <get_axial_sampling(0) << '\n'; + + if (pdfs.get_offset_in_stream()) + output_header<<"data offset in bytes := " + <get_num_axial_poss(*seg); + for (seg++; seg != segment_sequence.end(); seg++) + output_header << "," << pdfs.get_proj_data_info_ptr()->get_num_axial_poss(*seg); + output_header << "}\n"; + } + + output_header << "matrix axis label [" << order_of_bin << "] := tangential coordinate\n"; + output_header << "!matrix size [" << order_of_bin << "] := " + <get_num_tangential_poss() << "\n"; + } + + const ProjDataInfoCylindrical* proj_data_info_ptr = + dynamic_cast< const ProjDataInfoCylindrical*> (pdfs.get_proj_data_info_ptr()); + + if (proj_data_info_ptr!=NULL) + { + // cylindrical scanners + + output_header << "minimum ring difference per segment := "; + { + std::vector::const_iterator seg = segment_sequence.begin(); + output_header << "{ " << proj_data_info_ptr->get_min_ring_difference(*seg); + for (seg++; seg != segment_sequence.end(); seg++) + output_header << "," <get_min_ring_difference(*seg); + output_header << "}\n"; + } + + output_header << "maximum ring difference per segment := "; + { + std::vector::const_iterator seg = segment_sequence.begin(); + output_header << "{ " <get_max_ring_difference(*seg); + for (seg++; seg != segment_sequence.end(); seg++) + output_header << "," <get_max_ring_difference(*seg); + output_header << "}\n"; + } + + const Scanner& scanner = *proj_data_info_ptr->get_scanner_ptr(); + if (fabs(proj_data_info_ptr->get_ring_radius()- + scanner.get_effective_ring_radius()) > .1) + warning("write_basic_interfile_PDFS_header: inconsistent effective ring radius:\n" + "\tproj_data_info has %g, scanner has %g.\n" + "\tThis really should not happen and signifies a bug.\n" + "\tYou will have a problem reading this data back in.", + proj_data_info_ptr->get_ring_radius(), + scanner.get_effective_ring_radius()); + if (fabs(proj_data_info_ptr->get_ring_spacing()- + scanner.get_ring_spacing()) > .1) + warning("write_basic_interfile_PDFS_header: inconsistent ring spacing:\n" + "\tproj_data_info has %g, scanner has %g.\n" + "\tThis really should not happen and signifies a bug.\n" + "\tYou will have a problem reading this data back in.", + proj_data_info_ptr->get_ring_spacing(), + scanner.get_ring_spacing()); + + output_header << scanner.parameter_info(); + + output_header << "effective central bin size (cm) := " + << proj_data_info_ptr->get_sampling_in_s(Bin(0,0,0,0))/10. << endl; + + } // end of cylindrical scanner + else + { + // TODO something here + } + + + // write time frame info + // TODO this is according to the proposed interfile standard for PET. Interfile 3.3 is different + { + const TimeFrameDefinitions& frame_defs(pdfs.get_exam_info_ptr()->time_frame_definitions); + if (frame_defs.get_num_time_frames()>0) + { + output_header << "number of time frames := " << frame_defs.get_num_time_frames() << '\n'; + for (unsigned int frame_num=1; frame_num<=frame_defs.get_num_time_frames(); ++frame_num) + { + if (frame_defs.get_duration(frame_num)>0) + { + output_header << "image duration (sec)[" << frame_num << "] := " + << frame_defs.get_duration(frame_num) << '\n'; + output_header << "image relative start time (sec)[" << frame_num << "] := " + << frame_defs.get_start_time(frame_num) << '\n'; + } + } + } + else + { + // need to write this anyway to allow vectored keys below + output_header << "number of time frames := 1\n"; + } + } + if (pdfs.get_scale_factor()!=1.F) + output_header <<"image scaling factor[1] := " + <(const string& filename, + const Array<3,signed short>&, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& origin, + const NumericType output_type, + const float scale, + const ByteOrder byte_order); +template +Succeeded +write_basic_interfile<>(const string& filename, + const Array<3,unsigned short>&, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& origin, + const NumericType output_type, + const float scale, + const ByteOrder byte_order); + +template +Succeeded +write_basic_interfile<>(const string& filename, + const Array<3,float>&, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& origin, + const NumericType output_type, + const float scale, + const ByteOrder byte_order); + +#if !defined(_MSC_VER) || (_MSC_VER > 1300) + +template +Succeeded +write_basic_interfile<>(const string& filename, + const Array<3,signed short>& image, + const NumericType output_type, + const float scale, + const ByteOrder byte_order); + +template +Succeeded +write_basic_interfile<>(const string& filename, + const Array<3,unsigned short>& image, + const NumericType output_type, + const float scale, + const ByteOrder byte_order); + +template +Succeeded +write_basic_interfile<>(const string& filename, + const Array<3,float>& image, + const NumericType output_type, + const float scale, + const ByteOrder byte_order); +#endif + +END_NAMESPACE_STIR diff --git a/src/IO/lib.mk b/src/IO/lib.mk new file mode 100644 index 0000000000..f429d68909 --- /dev/null +++ b/src/IO/lib.mk @@ -0,0 +1,35 @@ +dir := IO + +$(dir)_LIB_SOURCES := \ + OutputFileFormat.cxx \ + OutputFileFormat_default.cxx \ + InterfileOutputFileFormat.cxx \ + interfile.cxx InterfileHeader.cxx InterfilePDFSHeaderSPECT.cxx\ + InputFileFormatRegistry.cxx \ + InterfileDynamicDiscretisedDensityOutputFileFormat.cxx \ + InterfileParametricDensityOutputFileFormat.cxx \ + InterfileDynamicDiscretisedDensityInputFileFormat.cxx \ + GIPL_ImageFormat.cxx + +ifeq ($(HAVE_ITK),1) + ITKImageInputFileFormat.cxx \ + ITKImageOutputFileFormat.cxx +endif + +ifeq ($(HAVE_LLN_MATRIX),1) + $(dir)_LIB_SOURCES += ECAT7OutputFileFormat.cxx stir_ecat7.cxx \ + ECAT6OutputFileFormat.cxx \ + stir_ecat_common.cxx \ + ECAT7ParametricDensityOutputFileFormat.cxx \ + ECAT7DynamicDiscretisedDensityOutputFileFormat.cxx \ + ECAT7DynamicDiscretisedDensityInputFileFormat.cxx \ + stir_ecat6.cxx ecat6_utils.cxx +endif + +ifeq ($(HAVE_AVW),1) + $(dir)_LIB_SOURCES += stir_AVW.cxx +endif + +$(dir)_REGISTRY_SOURCES:= $(dir)_registries.cxx + +include $(WORKSPACE)/lib.mk diff --git a/src/IO/stir_AVW.cxx b/src/IO/stir_AVW.cxx new file mode 100644 index 0000000000..c70f539d51 --- /dev/null +++ b/src/IO/stir_AVW.cxx @@ -0,0 +1,167 @@ +// +// +/* + Copyright (C) 2001- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ + +/*! +\file +\ingroup IO +\brief routines to convert AVW data structures to STIR +\author Kris Thielemans + +*/ + +#ifdef HAVE_AVW + +#include "stir/IO/stir_AVW.h" +#include "stir/IndexRange3D.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/CartesianCoordinate3D.h" + + +START_NAMESPACE_STIR + +namespace AVW +{ + +template +static +void +AVW_Volume_to_VoxelsOnCartesianGrid_help(VoxelsOnCartesianGrid& image, + elemT const* avw_data, + const bool flip_z) +{ + // std::copy(avw_data, avw_data+avw_volume->VoxelsPerVolume, image->begin_all()); + + // AVW data seems to be y-flipped + for (int z=image.get_min_z(); z<=image.get_max_z(); ++z) + { + const int out_z = + !flip_z ? z : image.get_max_z() - z + image.get_min_z(); + for (int y=image.get_max_y(); y>=image.get_min_y(); --y) + { + for (int x=image.get_min_x(); x<=image.get_max_x(); ++x) + image[out_z][y][x] = static_cast(*avw_data++); + //std::copy(avw_data, avw_data + image.get_x_size(), image[z][y].begin()); + //avw_data += image.get_x_size(); + } + } +} + + +VoxelsOnCartesianGrid * +AVW_Volume_to_VoxelsOnCartesianGrid(AVW_Volume const* const avw_volume, + const bool flip_z) +{ + // find sizes et al + + const int size_x = avw_volume->Width; + const int size_y = avw_volume->Height; + const int size_z = avw_volume->Depth; + IndexRange3D range(0, size_z-1, + -(size_y/2), -(size_y/2)+size_y-1, + -(size_x/2), -(size_x/2)+size_x-1); + + CartesianCoordinate3D voxel_size; + voxel_size.x() = + static_cast(AVW_GetNumericInfo("VoxelWidth", avw_volume->Info)); + if (voxel_size.x()==0) + { + warning("AVW_Volume_to_VoxelsOnCartesianGrid: VoxelWidth not found or 0"); + } + + voxel_size.y() = + static_cast(AVW_GetNumericInfo("VoxelHeight", avw_volume->Info)); + if (voxel_size.y()==0) + { + warning("AVW_Volume_to_VoxelsOnCartesianGrid: VoxelHeight not found or 0"); + } + + voxel_size.z() = + static_cast(AVW_GetNumericInfo("VoxelDepth", avw_volume->Info)); + if (voxel_size.z()==0) + { + warning("AVW_Volume_to_VoxelsOnCartesianGrid: VoxelDepth not found or 0"); + } + + // construct VoxelsOnCartesianGrid + VoxelsOnCartesianGrid * volume_ptr = + new VoxelsOnCartesianGrid(range, + CartesianCoordinate3D(0,0,0), + voxel_size); + + // fill in data + switch(avw_volume->DataType) + { + case AVW_SIGNED_CHAR: + { + AVW_Volume_to_VoxelsOnCartesianGrid_help(*volume_ptr, + reinterpret_cast(avw_volume->Mem), flip_z); + break; + } + case AVW_UNSIGNED_CHAR: + { + AVW_Volume_to_VoxelsOnCartesianGrid_help(*volume_ptr, + reinterpret_cast(avw_volume->Mem), flip_z); + break; + } + case AVW_UNSIGNED_SHORT: + { + AVW_Volume_to_VoxelsOnCartesianGrid_help(*volume_ptr, + reinterpret_cast(avw_volume->Mem), flip_z); + break; + } + case AVW_SIGNED_SHORT: + { + AVW_Volume_to_VoxelsOnCartesianGrid_help(*volume_ptr, + reinterpret_cast(avw_volume->Mem), flip_z); + break; + } + case AVW_UNSIGNED_INT: + { + AVW_Volume_to_VoxelsOnCartesianGrid_help(*volume_ptr, + reinterpret_cast(avw_volume->Mem), flip_z); + break; + } + case AVW_SIGNED_INT: + { + AVW_Volume_to_VoxelsOnCartesianGrid_help(*volume_ptr, + reinterpret_cast(avw_volume->Mem), flip_z); + break; + } + case AVW_FLOAT: + { + AVW_Volume_to_VoxelsOnCartesianGrid_help(*volume_ptr, + reinterpret_cast(avw_volume->Mem), flip_z); + break; + } + default: + { + warning("AVW_Volume_to_VoxelsOnCartesianGrid: unsupported data type %d\n", + avw_volume->DataType); + return 0; + } + } + + return volume_ptr; +} + +} // end namespace AVW + +END_NAMESPACE_STIR + +#endif diff --git a/src/IO/stir_ecat6.cxx b/src/IO/stir_ecat6.cxx new file mode 100644 index 0000000000..075200702a --- /dev/null +++ b/src/IO/stir_ecat6.cxx @@ -0,0 +1,1082 @@ +/*! + \file + \ingroup ECAT + + \brief Implementation of routines which convert CTI things into our + building blocks and vice versa. + + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2012-06-05, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/IO/interfile.h" +#include "stir/Sinogram.h" +#include "stir/ProjDataFromStream.h" +#include "stir/ProjDataInfo.h" +#include "stir/IndexRange3D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ByteOrder.h" +#include "stir/ProjData.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/convert_array.h" +#include "stir/IndexRange2D.h" +#include "stir/utilities.h" + +#include "stir/Scanner.h" +#include "stir/ExamInfo.h" +#include "stir/IO/ecat6_utils.h" +#include "stir/IO/stir_ecat6.h" +#ifndef STIR_ORIGINAL_ECAT6 +#include "stir/IO/stir_ecat7.h" +#endif + +#include "boost/cstdint.hpp" +#include "boost/static_assert.hpp" +#include "boost/scoped_array.hpp" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cout; +using std::endl; +using std::fstream; +using std::ios; +using std::min; +#endif + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 + +static void cti_data_to_float_Array(Array<2,float>&out, + char const * const buffer, const float scale_factor, int dtype); + + +/* + \brief reads data from a CTI file into a Sinogram object + \param buffer is supposed to be a pre-allocated buffer (which will be modified) + + It applies all scale factors. + \warning \a buffer has to be allocated with a size at least as large as the + multiple of MatBLKSIZE that fits the whole sinogram (because it uses cti_wblk). + */ +static void read_sinogram(Sinogram& sino_2D, + char *buffer, + FILE*fptr, + int mat_index, + int frame, int gate, int data, int bed); + +static bool is_ECAT6_file(ECAT6_Main_header& mhead, const string& filename) +{ + //check if it's ECAT 6 + FILE * cti_fptr=fopen(filename.c_str(), "rb"); + + if(!cti_fptr) + return false; + + // we first need to check if the file size is large enough, due to a bug + // in the LLN MATRIX library (it will only read a buffer large enough + // for the data, but use 512 bytes of that buffer anyway). + // we suppose that any sensible file will be larger than 2048+512 bytes + // Because of some undefined behaviour of fseek and ftell when you try to + // beyond the file size, our tests is 3 staged: + // fseek, ftell, fread. All of these should work. + { + int ret= fseek(cti_fptr, 2048L, SEEK_SET); + long pos=ftell(cti_fptr); + if (ret || pos != 2048L) + { + // not enough bytes, so not ECAT6 + fclose(cti_fptr); + return false; + } + + char buffer[512]; + ret=fread(buffer,1, 512, cti_fptr); + if (ret != 512) + { + // failure to read + fclose(cti_fptr); + return false; + } + } + // seek back to start + fseek(cti_fptr, 0L, SEEK_SET); + + if(cti_read_ECAT6_Main_header(cti_fptr, &mhead)!=EXIT_SUCCESS) + { + // this is funny as it's just reading a bunch of bytes. anyway. we'll assume it isn't ECAT6 + fclose(cti_fptr); + return false; + } + else + { + fclose(cti_fptr); + // do some checks on the main header + return + mhead.sw_version>=0 && mhead.sw_version<=69 && + ( mhead.file_type == matScanFile || + mhead.file_type == matImageFile || + mhead.file_type == matAttenFile || + mhead.file_type == matNormFile) && + mhead.num_frames>0; + } +} + + +bool is_ECAT6_file(const string& filename) +{ + ECAT6_Main_header mhead; + return is_ECAT6_file(mhead, filename); +} + +bool is_ECAT6_image_file(const string& filename) +{ + ECAT6_Main_header mhead; + return is_ECAT6_file(mhead, filename) && + mhead.file_type ==matImageFile; +} + + +bool is_ECAT6_emission_file(const string& filename) +{ + ECAT6_Main_header mhead; + return is_ECAT6_file(mhead, filename) && + mhead.file_type ==matScanFile; +} + + +bool is_ECAT6_attenuation_file(const string& filename) +{ + ECAT6_Main_header mhead; + return is_ECAT6_file(mhead, filename) && + mhead.file_type ==matAttenFile; +} + + + +Scanner* find_scanner_from_ECAT6_Main_header(const ECAT6_Main_header& mhead) +{ + // we could do more effort here by checking some values of other fields than system_type. + // TODO + + + Scanner * scanner_ptr = + find_scanner_from_ECAT_system_type(mhead.system_type); + return scanner_ptr; +} + +void make_ECAT6_Main_header(ECAT6_Main_header& mhead, + Scanner const& scanner, + const string& orig_name + ) +{ +#ifndef STIR_ORIGINAL_ECAT6 + ecat::ecat7::make_ECAT7_main_header(mhead, scanner, orig_name); + strcpy(mhead.magic_number, "MATRIX6.4"); + mhead.sw_version= 64; +#else + mhead= main_zero_fill(); + mhead.calibration_factor = 1.F; + + // other header parameters + + strncpy(mhead.original_file_name, orig_name.c_str(), 20); + mhead.num_frames= 1; //hdr.num_time_frames; + // cti_utils routines always write data as VAX short + mhead.data_type= ECAT_I2_little_endian_data_type; + + mhead.system_type= find_ECAT_system_type(scanner); + mhead.axial_fov= scanner.get_num_rings()*scanner.get_ring_spacing()/10; + mhead.transaxial_fov= scanner.get_default_num_arccorrected_bins()*scanner.get_default_bin_size()/10; + + mhead.plane_separation= scanner.get_ring_spacing()/2/10; + //WRONG mhead.gantry_tilt= scanner.get_default_intrinsic_tilt(); +#endif // STIR_ORIGINAL_ECAT6 +} + +void make_ECAT6_Main_header(ECAT6_Main_header& mhead, + Scanner const& scanner, + const string& orig_name, + DiscretisedDensity<3,float> const & density + ) +{ + make_ECAT6_Main_header(mhead, scanner, orig_name); + + DiscretisedDensityOnCartesianGrid<3,float> const & image = + dynamic_cast const&>(density); + + + // extra main parameters that depend on data type + mhead.file_type= matImageFile; + mhead.num_planes=image.get_length(); + mhead.plane_separation=image.get_grid_spacing()[1]/10; // convert to cm +} + +void make_ECAT6_Main_header(ECAT6_Main_header& mhead, + const string& orig_name, + ProjDataInfo const & proj_data_info + ) +{ + + make_ECAT6_Main_header(mhead, *proj_data_info.get_scanner_ptr(), orig_name); + + // extra main parameters that depend on data type + mhead.file_type= matScanFile; + + mhead.num_planes = 0; + for(int segment_num=proj_data_info.get_min_segment_num(); + segment_num <= proj_data_info.get_max_segment_num(); + ++segment_num) + mhead.num_planes+= proj_data_info.get_num_axial_poss(segment_num); + + mhead.plane_separation=proj_data_info.get_scanner_ptr()->get_ring_spacing()/10/2; +} + +VoxelsOnCartesianGrid * +ECAT6_to_VoxelsOnCartesianGrid(const int frame_num, const int gate_num, const int data_num, const int bed_num, + FILE *cti_fptr, const ECAT6_Main_header & mhead) +{ + MatDir entry; + Image_subheader ihead; + + + VoxelsOnCartesianGrid * image_ptr = 0; + + // read first subheader to find dimensions + { + long matnum = cti_numcod(frame_num, 1,gate_num, data_num, bed_num); + + if(!cti_lookup(cti_fptr, &mhead, matnum, &entry)) { // get entry + error("\nCouldn't find matnum %d in specified file.\n", matnum); + } + if(cti_read_image_subheader(cti_fptr, &mhead, entry.strtblk, &ihead)!=EXIT_SUCCESS) + { + error("\nUnable to look up image subheader\n"); + } + } + +#ifndef STIR_ORIGINAL_ECAT6 + const int x_size = ihead.x_dimension; + const int y_size = ihead.y_dimension; +#else + const int x_size = ihead.dimension_1; + const int y_size = ihead.dimension_2; +#endif + const int z_size = mhead.num_planes; + const int min_z = 0; + + IndexRange3D range_3D (0,z_size-1, + -y_size/2,(-y_size/2)+y_size-1, + -x_size/2,(-x_size/2)+x_size-1); + +#ifndef STIR_ORIGINAL_ECAT6 + CartesianCoordinate3D + voxel_size(ihead.z_pixel_size*10,ihead.y_pixel_size*10,ihead.x_pixel_size*10); + CartesianCoordinate3D + origin(ihead.z_offset, ihead.y_offset*10, ihead.x_offset*10); +#else + CartesianCoordinate3D + voxel_size(ihead.slice_width*10,ihead.pixel_size*10,ihead.pixel_size*10); + CartesianCoordinate3D + origin(0, ihead.y_origin*10, ihead.x_origin*10); +#endif + + + image_ptr = new VoxelsOnCartesianGrid (range_3D, origin, voxel_size); + + NumericType type; + ByteOrder byte_order; + find_type_from_ECAT_data_type(type, byte_order, ihead.data_type); + // allocation for buffer. Provide enough space for a multiple of MatBLKSIZE + const size_t cti_data_size = x_size*y_size*type.size_in_bytes()+ MatBLKSIZE; + char * cti_data= new char[cti_data_size]; + + for(int z=0; z sub_head_origin(ihead.z_offset, ihead.y_offset*10, ihead.x_offset*10); +#else // STIR_ORIGINAL_ECAT6 + const CartesianCoordinate3D sub_head_origin(0, ihead.y_origin*10, ihead.x_origin*10); +#endif // STIR_ORIGINAL_ECAT6 + { + if (norm(image_ptr->get_origin() - sub_head_origin) > .01F) + { + warning("ECAT6_to_VoxelsOnCartesianGrid: x,y offset in subheader of plane %d does not agree with plane 1. Ignoring it...\n", + z+1); + } + } + +#ifndef STIR_ORIGINAL_ECAT6 + float scale_factor = ihead.scale_factor; +#else // STIR_ORIGINAL_ECAT6 + float scale_factor = ihead.quant_scale; +#endif + if(cti_rblk (cti_fptr, entry.strtblk+1, cti_data, entry.endblk-entry.strtblk)!=EXIT_SUCCESS) { // get data + error("\nUnable to read data\n"); + } + if (file_data_to_host(cti_data, entry.endblk-entry.strtblk, ihead.data_type)!=EXIT_SUCCESS) + error("\nerror converting to host data format\n"); + cti_data_to_float_Array((*image_ptr)[z+min_z],cti_data, scale_factor, ihead.data_type); +#if 0 + NumericType type; + ByteOrder byte_order; + find_type_from_cti_data_type(type, byte_order, ihead.data_type); + + for(int y=0; y scanner_ptr(find_scanner_from_ECAT6_Main_header(mhead)); + cout << "Scanner determined from ECAT6_Main_header: " << scanner_ptr->get_name() << endl; + if (scanner_ptr->get_type() == Scanner::Unknown_scanner || + scanner_ptr->get_type() == Scanner::User_defined_scanner) + { + warning("ECAT6_to_PDFS: Couldn't determine the scanner \n" + "(Main_header.system_type=%d), defaulting to 953.\n" + "This will give dramatic problems when the number of rings of your scanner is NOT 16.\n", + mhead.system_type); + scanner_ptr.reset(new Scanner(Scanner::E953)); + } + + + const int num_rings = scanner_ptr->get_num_rings(); + + // ECAT 6 does not have a flag for 3D vs. 2D, so we guess it first from num_planes + bool is_3D_file = (mhead.num_planes > 2*num_rings-1); + if (!is_3D_file) + { + // better make sure by checking if plane (5,5) is not in its '3D' place + MatDir entry; + const int mat_index= cti_rings2plane(num_rings, 5,5); + const long matnum= cti_numcod(frame_num, mat_index,gate_num, data_num, bed_num); + // KT 18/08/2000 add !=0 to prevent compiler warning on conversion from int to bool + is_3D_file = cti_lookup (cti_fptr, &mhead, matnum, &entry)!=0; + } + int span = 1; + + if (!is_3D_file) + { + warning("I'm guessing this is a stack of 2D sinograms\n"); + if(mhead.num_planes == 2*num_rings-1) + { + span=3; + max_ring_diff = 1; + } + else if (mhead.num_planes == num_rings) + { + span=1; + max_ring_diff = 0; + } + else + { + error("Impossible num_planes: %d\n", mhead.num_planes); + } + } + else + { + if (max_ring_diff < 0) + max_ring_diff = num_rings-1; + const int num_sinos = + (2*max_ring_diff+1) * num_rings - (max_ring_diff+1)*max_ring_diff; + + if (num_sinos > mhead.num_planes) + warning("\n\aWarning: header says not enough planes in the file: %d (expected %d)." + "Continuing anyway...", mhead.num_planes, num_sinos); + } + + // construct a ProjDataFromStream object + shared_ptr proj_data; + ScanInfoRec scanParams; + + { + // read first subheader for dimensions + { + // use temporary copy to avoid overwriting mhead argument + ECAT6_Main_header mhead_copy; + + long matnum= cti_numcod(frame_num, 1,gate_num, data_num, bed_num); + switch(mhead.file_type) + { + case matScanFile: + { + Scan_subheader shead; + if (get_scanheaders(cti_fptr, matnum, &mhead_copy, &shead, &scanParams)!= EXIT_SUCCESS) + error("Error reading matnum %d\n", matnum); + break; + } + case matAttenFile: + { + Attn_subheader shead; + if(get_attnheaders (cti_fptr, matnum, &mhead_copy, + &shead, &scanParams)!= EXIT_SUCCESS) + error("Error reading matnum %d\n", matnum); + break; + } + case matNormFile: + { + Norm_subheader shead; + if(get_normheaders (cti_fptr, matnum, &mhead_copy, + &shead, &scanParams)!= EXIT_SUCCESS) + error("Error reading matnum %d\n", matnum); + break; + } + + default: + error("ECAT6_to_PDFS: unsupported file type %d\n",mhead.file_type); + } + } + const int num_views = scanParams.nviews; + const int num_tangential_poss = scanParams.nprojs; + + + shared_ptr p_data_info( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr,span,max_ring_diff,num_views,num_tangential_poss,arccorrected)); + + + ProjDataFromStream::StorageOrder storage_order= + ProjDataFromStream::Segment_AxialPos_View_TangPos; + +#if 1 + string actual_data_name=data_name; + { + string::size_type pos=find_pos_of_extension(data_name); + if (pos!=string::npos && data_name.substr(pos)==".hs") + replace_extension(actual_data_name, ".s"); + else + add_extension(actual_data_name, ".s"); + } +#else + // TODO replace these char* things with string based extension stuff + boost::scoped_array actual_data_name(new char[data_name.size() + 4]); + strcpy(actual_data_name.get(), data_name.c_str()); + // KT 30/05/2002 make sure that a filename ending on .hs is treated correctly + { + const char * const extension = strchr(find_filename(actual_data_name.get()),'.'); + if (extension!=NULL && strcmp(extension, ".hs")==0) + replace_extension(actual_data_name.get(), ".s"); + else + add_extension(actual_data_name.get(), ".s"); + } +#endif + shared_ptr sino_stream( + new fstream (actual_data_name.c_str(), ios::out| ios::binary)); + + if (!sino_stream->good()) + { + error("ECAT6cti_to_PDFS: error opening file %s\n",actual_data_name.c_str()); + } + + shared_ptr exam_info_sptr(new ExamInfo); + proj_data.reset( + new ProjDataFromStream(exam_info_sptr,p_data_info,sino_stream, std::streamoff(0), storage_order)); + + write_basic_interfile_PDFS_header(actual_data_name, *proj_data); + } + + + // write to proj_data + { + NumericType type; + ByteOrder byte_order; + find_type_from_ECAT_data_type(type, byte_order, scanParams.data_type); + // allocation for buffer. Provide enough space for a multiple of MatBLKSIZE + const size_t cti_data_size = + proj_data->get_num_tangential_poss()*proj_data->get_num_views()*type.size_in_bytes()+ MatBLKSIZE; + //use scoped_array to auto-delete the memory + boost::scoped_array cti_data_sptr(new char[cti_data_size]); + char * cti_data= cti_data_sptr.get(); + + cout<<"\nProcessing segment number:"; + + if (is_3D_file) + { + for(int w=0; w<=max_ring_diff; w++) + { // loop on segment number + + // positive ring difference + cout<<" "< sino_2D = proj_data->get_empty_sinogram(ring1,w); + //TODO remove as will be set below + proj_data->set_sinogram(sino_2D); + read_sinogram(sino_2D, cti_data, cti_fptr, mat_index, + frame_num, gate_num, data_num, bed_num); + proj_data->set_sinogram(sino_2D); + } + + // negative ring difference + if(w>0) { + cout<<" "<<-w; + for(int ring2=0; ring2ring2 + int mat_index= cti_rings2plane(num_rings, ring1, ring2); + Sinogram sino_2D = proj_data->get_empty_sinogram(ring2,-w,false); + read_sinogram(sino_2D, cti_data, + cti_fptr, mat_index, + frame_num, gate_num, data_num, bed_num); + + proj_data->set_sinogram(sino_2D); + } + } + } // end of loop on segment number + } // end of 3D case + else + { + // 2D case + cout << "0\n"; + for(int z=0; zget_num_axial_poss(0); z++) + { + Sinogram sino_2D = proj_data->get_empty_sinogram(z,0,false); + read_sinogram(sino_2D, cti_data, cti_fptr, z+1, + frame_num, gate_num, data_num, bed_num); + proj_data->set_sinogram(sino_2D); + } + + } // end of 2D case + + cout<& sino_2D, + char *buffer, + FILE*fptr, + int mat_index, + int frame, int gate, int data, int bed) +{ + ECAT6_Main_header mhead; + ScanInfoRec scanParams; + const long matnum= + cti_numcod (frame,mat_index,gate,data,bed); + if (cti_read_ECAT6_Main_header (fptr, &mhead) != EXIT_SUCCESS) + error("read_sinogram: error reading ECAT6_Main_header"); + + float scale_factor = 0; // intialised to avoid compiler warnings + switch(mhead.file_type) + { + case matScanFile: + { + Scan_subheader shead; + + if(get_scanheaders (fptr, matnum, &mhead, + &shead, &scanParams)!= EXIT_SUCCESS) + error("Error reading matnum %d\n", matnum); + + scale_factor = shead.scale_factor; + if (shead.loss_correction_fctr>0) + scale_factor *= shead.loss_correction_fctr; + else + warning("\nread_sinogram warning: loss_correction_fctr invalid, using 1\n"); + break; + } + case matAttenFile: + { + Attn_subheader shead; + + if(get_attnheaders (fptr, matnum, &mhead, + &shead, &scanParams)!= EXIT_SUCCESS) + error("Error reading matnum %d\n", matnum); + + scale_factor = shead.scale_factor; + break; + } + case matNormFile: + { + Norm_subheader shead; + + if(get_normheaders (fptr, matnum, &mhead, + &shead, &scanParams)!= EXIT_SUCCESS) + error("Error reading matnum %d\n", matnum); + + scale_factor = shead.scale_factor; + break; + } + default: + error("read_sinogram: unsupported format"); + } + if(get_scandata (fptr, buffer, &scanParams)!= EXIT_SUCCESS) + error("Error reading matnum %d\n", matnum); + + cti_data_to_float_Array(sino_2D, buffer, scale_factor, scanParams.data_type); + +} + + +Succeeded +DiscretisedDensity_to_ECAT6(FILE *fptr, + DiscretisedDensity<3,float> const & density, + const ECAT6_Main_header& mhead, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + + + DiscretisedDensityOnCartesianGrid<3,float> const & image = + dynamic_cast const&>(density); + + + if (mhead.file_type!= matImageFile) + { + warning("DiscretisedDensity_to_ECAT6: converting (f%d, g%d, d%d, b%d)\n" + "Main header.file_type should be ImageFile\n", + frame_num, gate_num, data_num, bed_num); + return Succeeded::no; + } + if (mhead.num_planes!=image.get_length()) + { + warning("DiscretisedDensity_to_ECAT6: converting (f%d, g%d, d%d, b%d)\n" + "Main header.num_planes should be %d\n", + frame_num, gate_num, data_num, bed_num,image.get_length()); + return Succeeded::no; + } + const float voxel_size_z = image.get_grid_spacing()[1]/10;// convert to cm + //const float voxel_size_y = image.get_grid_spacing()[2]/10; + const float voxel_size_x = image.get_grid_spacing()[3]/10; + if (fabs(mhead.plane_separation - voxel_size_z) > 1.E-4) + { + warning("DiscretisedDensity_to_ECAT6: converting (f%d, g%d, d%d, b%d)\n" + "Main header.plane_separation should be %g\n", + frame_num, gate_num, data_num, bed_num,voxel_size_z); + return Succeeded::no; + } + + + Image_subheader ihead= img_zero_fill(); + + const int min_z= image.get_min_index(); + const int min_y= image[min_z].get_min_index(); + const int min_x= image[min_z][min_y].get_min_index(); + + const int z_size= image.get_length(); + const int y_size= image[min_z].get_length(); + const int x_size= image[min_z][min_y].get_length(); + + const int plane_size= y_size * x_size; + + // Setup subheader params +#ifndef STIR_ORIGINAL_ECAT6 + ihead.data_type=ECAT_I2_little_endian_data_type; + ihead.x_dimension= x_size; + ihead.y_dimension= y_size; + ihead.z_dimension= z_size; + ihead.x_pixel_size= voxel_size_x; + ihead.y_pixel_size= voxel_size_x; + ihead.z_pixel_size= voxel_size_z; + + ihead.num_dimensions= 3; + // STIR origin depends on the index range, but the index range is lost + // after writing to file. + // ECAT6 origin is somewhere in the middle of the image + // WARNING this has to be consistent with reading + if (image[0][0].get_min_index() != -(x_size/2) || + image[0][0].get_max_index() != -(x_size/2) + x_size - 1 || + image[0].get_min_index() != -(y_size/2) || + image[0].get_max_index() != -(y_size/2) + y_size - 1 || + image.get_min_index() != 0) + { + warning("DiscretisedDensity_to_ECAT6 is currently limited to input images in the standard STIR index range.\n" + "Data not written."); + return Succeeded::no; + } + ihead.x_offset= image.get_origin().x()/10; + ihead.y_offset= image.get_origin().y()/10; + ihead.z_offset= image.get_origin().z()/10; + shared_ptr scanner_ptr(find_scanner_from_ECAT6_Main_header(mhead)); + + const float depth_of_interaction_factor = + 1 + + scanner_ptr->get_average_depth_of_interaction() / + scanner_ptr->get_inner_ring_radius(); + // note: CTI uses shead.x_resolution instead of mhead.bin_size + // but we don't have access to the sinogram here, and these 2 fields + // should be equal anyway. + ihead.recon_zoom= + mhead.bin_size/voxel_size_x * + scanner_ptr->get_default_num_arccorrected_bins()/ + float(image[0].size()) * + depth_of_interaction_factor; + + ihead.decay_corr_fctr= 1; +#else // STIR_ORIGINAL_ECAT6 + ihead.data_type= mhead.data_type; + ihead.dimension_1= x_size; + ihead.dimension_2= y_size; + ihead.slice_width= mhead.plane_separation; + ihead.pixel_size= voxel_size_x; + + ihead.num_dimensions= 2; + ihead.x_origin= image.get_origin().x()/10; + ihead.y_origin= image.get_origin().y()/10; + ihead.recon_scale= 1; + ihead.decay_corr_fctr= 1; + ihead.loss_corr_fctr= 1; + ihead.ecat_calibration_fctr= 1; + ihead.well_counter_cal_fctr=1; +#endif // STIR_ORIGINAL_ECAT6 + + // make sure we have a large enough multiple of MatBLKSIZE + int cti_data_size = plane_size*2; + if (cti_data_size%MatBLKSIZE != 0) + cti_data_size = ((cti_data_size/MatBLKSIZE)+1)*MatBLKSIZE; + short *cti_data= new short[cti_data_size/2]; + Array<2,short> plane(image[min_z].get_index_range()); + + for(int z=0; z const & density, + string const & cti_name, string const&orig_name, + const Scanner& scanner, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + ECAT6_Main_header mhead; + make_ECAT6_Main_header(mhead, scanner, orig_name, density); + + + FILE *fptr= cti_create (cti_name.c_str(), &mhead); + Succeeded result = + DiscretisedDensity_to_ECAT6(fptr, + density, + mhead, + frame_num, gate_num,data_num, bed_num); + + fclose(fptr); + return result; +} + +Succeeded +ProjData_to_ECAT6(FILE *fptr, ProjData const& proj_data, const ECAT6_Main_header& mhead, + const int frame_num, const int gate_num, const int data_num, const int bed_num, + const bool write_2D_sinograms) +{ + if (mhead.file_type!= matScanFile) + { + warning("ProjData_to_ECAT6: converting (f%d, g%d, d%d, b%d)\n" + "Main header.file_type should be ImageFile\n", + frame_num, gate_num, data_num, bed_num); + return Succeeded::no; + } + + const int max_segment_num = + write_2D_sinograms + ? 0 + : + min(proj_data.get_max_segment_num(), -proj_data.get_min_segment_num()) +; + const int min_segment_num = - max_segment_num; + + { + int num_planes = 0; + for(int segment_num=min_segment_num; + segment_num <= max_segment_num; + ++segment_num) + num_planes+= proj_data.get_num_axial_poss(segment_num); + + if (mhead.num_planes!=num_planes) + { + warning("ProjData_to_ECAT6: converting (f%d, g%d, d%d, b%d)\n" + "Main header.num_planes should be %d, but is %d\n", + frame_num, gate_num, data_num, bed_num,num_planes, mhead.num_planes); + if (mhead.num_planes + (proj_data.get_proj_data_info_ptr()); + if (proj_data_info_cyl_ptr==NULL) + { + warning("This is not arc-corrected data. Filling in default_bin_size from scanner \n"); +#ifndef STIR_ORIGINAL_ECAT6 + shead.x_resolution= +#else + shead.sample_distance= +#endif + proj_data.get_proj_data_info_ptr()->get_scanner_ptr()->get_default_bin_size()/10; + } + else + { +#ifndef STIR_ORIGINAL_ECAT6 + shead.x_resolution= +#else + shead.sample_distance= +#endif + proj_data_info_cyl_ptr->get_tangential_sampling()/10; + } + } + + // find num_rings and check span + int num_rings = proj_data.get_num_axial_poss(0); + { + ProjDataInfoCylindrical const * const + proj_data_info_cyl_ptr = + dynamic_cast + (proj_data.get_proj_data_info_ptr()); + if (proj_data_info_cyl_ptr!=NULL) + { + // check if spanned data in segment 0 + if (proj_data_info_cyl_ptr->get_min_ring_difference(0) < + proj_data_info_cyl_ptr->get_max_ring_difference(0)) + { + if (write_2D_sinograms) + num_rings = (proj_data.get_num_axial_poss(0)+1)/2; + else + { + warning("Can only handle span==1 data. Exiting\n"); + return Succeeded::no; + } + } + } + } + + + if (num_rings != proj_data.get_proj_data_info_ptr()->get_scanner_ptr()->get_num_rings()) +{ + warning("Expected %d num_rings from scanner while segment 0 implies %d rings\n", + proj_data.get_proj_data_info_ptr()->get_scanner_ptr()->get_num_rings(), num_rings); +} + + short *cti_data= new short[plane_size]; + Array<2,short> short_sinogram(IndexRange2D(min_view,proj_data.get_max_view_num(), + min_bin,proj_data.get_max_tangential_pos_num())); + + cout< float_sinogram= proj_data.get_sinogram(z+min_axial_poss,segment_num,false); + + float scale_factor = 0; + convert_array(short_sinogram, scale_factor, float_sinogram); + + + shead.scan_min= short_sinogram.find_min(); + shead.scan_max= short_sinogram.find_max(); + shead.scale_factor= scale_factor==0 ? 1.F : scale_factor; + + for(int y=0; y=0) + { ring1= z; ring2= z+segment_num; } + else + { ring1= z+abs(segment_num); ring2= z; } + + const int indexcod= + write_2D_sinograms + ? z+1 + : cti_rings2plane( num_rings, ring1, ring2); // change indexation into CTI + const long matnum= cti_numcod(frame_num, indexcod, gate_num, data_num, bed_num); + if(cti_write_scan(fptr, matnum, &mhead, &shead, cti_data, plane_size*sizeof(short))!=EXIT_SUCCESS) + { + warning("Unable to write short_sinogram for rings %d,%d to file, exiting.\n",ring1,ring2); + delete[] cti_data; + return Succeeded::no; + } + } // end of loop on planes + } // end of loop on segments + cout<&out, + char const * const buffer, const float scale_factor, int dtype) +{ + + BOOST_STATIC_ASSERT(sizeof(float)==4); + + switch (dtype) + { + case ECAT_Byte_data_type: + { + signed char const * cti_data = + reinterpret_cast(buffer); + for(int y=out.get_min_index(); y<=out.get_max_index(); y++) + for(int x=out[y].get_min_index(); x<=out[y].get_max_index(); x++) + out[y][x]=scale_factor*(*cti_data++); + break; + } + case ECAT_I2_little_endian_data_type: + case ECAT_I2_big_endian_data_type: + { + boost::int16_t const * cti_data = + reinterpret_cast(buffer); + for(int y=out.get_min_index(); y<=out.get_max_index(); y++) + for(int x=out[y].get_min_index(); x<=out[y].get_max_index(); x++) + out[y][x]=scale_factor*(*cti_data++); + break; + } + case ECAT_I4_little_endian_data_type: + case ECAT_I4_big_endian_data_type: + { + boost::int32_t const * cti_data = + reinterpret_cast(buffer); + for(int y=out.get_min_index(); y<=out.get_max_index(); y++) + for(int x=out[y].get_min_index(); x<=out[y].get_max_index(); x++) + out[y][x]=scale_factor*(*cti_data++); + break; + } + case ECAT_R4_VAX_data_type: + case ECAT_R4_IEEE_big_endian_data_type: + { + float const * cti_data = + reinterpret_cast(buffer); + for(int y=out.get_min_index(); y<=out.get_max_index(); y++) + for(int x=out[y].get_min_index(); x<=out[y].get_max_index(); x++) + out[y][x]=scale_factor*(*cti_data++); + break; + } + } +} + +END_NAMESPACE_ECAT6 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR diff --git a/src/IO/stir_ecat7.cxx b/src/IO/stir_ecat7.cxx new file mode 100644 index 0000000000..9c8d5b693b --- /dev/null +++ b/src/IO/stir_ecat7.cxx @@ -0,0 +1,2318 @@ +/* + Copyright (C) 2002 - 2011-12-31, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup ECAT + + \brief Implementation of routines which convert ECAT7 things into our + building blocks and vice versa. + + \author Kris Thielemans + \author Cristina de Oliveira (stir::ecat::ecat7::offset_in_ECAT_file function) + \warning This only works with some CTI file_types. In particular, it does NOT + work with the ECAT6-like files_types, as then there are subheaders 'in' the + datasets. + + \warning Implementation uses the Louvain la Neuve Ecat library. So, it will + only work on systems where this library works properly. +*/ + +#ifdef HAVE_LLN_MATRIX + +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataFromStream.h" +#include "stir/ExamInfo.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/PatientPosition.h" +#include "stir/ImagingModality.h" +#include "stir/IO/interfile.h" +#include "stir/utilities.h" +#include "stir/NumericInfo.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/Sinogram.h" +#include "stir/IndexRange3D.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ByteOrder.h" +#include "stir/ProjData.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/SegmentByView.h" +#include "stir/IndexRange2D.h" +#include "stir/Scanner.h" +#include "stir/Bin.h" +#include "stir/Succeeded.h" +#include "stir/convert_array.h" +#include "stir/NumericInfo.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/IO/write_data.h" +#include "stir/IO/read_data.h" +#include "stir/ExamInfo.h" +#include "stir/TimeFrameDefinitions.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::size_t; +using std::string; +using std::ios; +using std::iostream; +using std::fstream; +using std::cerr; +using std::endl; +using std::cout; +using std::copy; +#ifndef STIR_NO_AUTO_PTR +using std::auto_ptr; +#endif +#endif + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 +/* ------------------------------------ + * print_debug + * ------------------------------------*/ +static int print_debug (char const * const fname, char const * const format, ...) +{ + va_list ap; + char *fmt; + int len; + + + if (0)//flagged (fname) != NULL) + { + + len = strlen (fname) + strlen (format) + 5; + if ((fmt = (char *)calloc ((long)len, sizeof (char))) == NULL) + return (1); + sprintf (fmt, "%s%s%s", fname, " :: ", format); + + va_start (ap, format); + vfprintf (stderr, fmt, ap); + + free (fmt); + va_end (ap); + + } + + return (0); + +} + + +Succeeded read_ECAT7_main_header(Main_header& mhead, const string& filename) +{ + FILE * cti_fptr=fopen(filename.c_str(), "rb"); + if (!cti_fptr) + return Succeeded::no; + + // first check 'magic_number' before going into LLN routines + // to avoid crashes and error messages there + // an ECAT7 file should start with MATRIX7 + { + char magic[7]; + if (fread(magic, 1, 7, cti_fptr) != 7 || + strncmp(magic, "MATRIX7",7)!=0) + { + fclose(cti_fptr); + return Succeeded::no; + } + } + if(mat_read_main_header(cti_fptr, &mhead)!=0) + { + fclose(cti_fptr); + // this is funny as it's just reading a bunch of bytes. anyway. we'll assume it isn't ECAT7 + return Succeeded::no; + } + else + { + // do some checks on the main header + fclose(cti_fptr); + if (mhead.sw_version>=70 && mhead.sw_version<=79 && + ( mhead.file_type >= 1 && mhead.file_type <= Float3dSinogram) && + mhead.num_frames>0) + return Succeeded::yes; + else + return Succeeded::no; + } +} + +static bool is_ECAT7_file(Main_header& mhead, const string& filename) +{ + return read_ECAT7_main_header(mhead, filename) == Succeeded::yes; +} + +bool is_ECAT7_file(const string& filename) +{ + Main_header mhead; + return is_ECAT7_file(mhead, filename); +} + +bool is_ECAT7_image_file(const string& filename) +{ + Main_header mhead; + return is_ECAT7_file(mhead, filename) && + (mhead.file_type == PetImage || + mhead.file_type ==ByteVolume || mhead.file_type == PetVolume); +} + + +bool is_ECAT7_emission_file(const string& filename) +{ + Main_header mhead; + return is_ECAT7_file(mhead, filename) && + (mhead.file_type == CTISinogram || mhead.file_type == Byte3dSinogram|| + mhead.file_type == Short3dSinogram || mhead.file_type == Float3dSinogram); +} + + +bool is_ECAT7_attenuation_file(const string& filename) +{ + Main_header mhead; + return is_ECAT7_file(mhead, filename) && + mhead.file_type ==AttenCor; +} + + + +void find_scanner(shared_ptr & scanner_ptr,const Main_header& mhead) +{ + scanner_ptr.reset(find_scanner_from_ECAT_system_type(mhead.system_type)); +} + + +short find_ECAT_data_type(const NumericType& type, const ByteOrder& byte_order) +{ + if (!type.signed_type()) + warning("find_ECAT_data_type: CTI data support only signed types. Using the signed equivalent\n"); + if (type.integer_type()) + { + switch(type.size_in_bytes()) + { + case 1: + return ByteData; + case 2: + return byte_order==ByteOrder::big_endian ? SunShort : VAX_Ix2; + case 4: + return byte_order==ByteOrder::big_endian ? SunLong : VAX_Ix4; + default: + { + // write error message below + } + } + } + else + { + switch(type.size_in_bytes()) + { + case 4: + return byte_order==ByteOrder::big_endian ? IeeeFloat : VAX_Rx4; + default: + { + // write error message below + } + } + } + string number_format; + size_t size_in_bytes; + type.get_Interfile_info(number_format, size_in_bytes); + warning("find_ECAT_data_type: CTI does not support data type '%s' of %d bytes.\n", + number_format.c_str(), size_in_bytes); + return short(0); +} + +/* ------------------------------------------- +* o f f s e t +* ------------------------------------------- +*/ +static long offset_in_ECAT_file (MatrixFile *mptr, int frame, int plane, int gate, int data, + int bed, int segment, int *plane_size_ptr = NULL) +{ + + int el_size[15], matnum, strtblk, group = abs(segment), i; + long plane_size = 0, off; + struct MatDir matdir; + Scan_subheader scansub; + Image_subheader imagesub; + Norm_subheader normsub; + Attn_subheader attnsub; + Scan3D_subheader scan3dsub; + const char * const prog = "offset_in_ECAT_file"; + /* + set_debug (prog); + */ + el_size[ByteData] = 1; + el_size[VAX_Ix2] = el_size[SunShort] = 2; + el_size[VAX_Ix4] = el_size[VAX_Rx4] = el_size[IeeeFloat] = el_size[SunLong] = 4; + + if (mptr->mhptr->sw_version < V7) + matnum = mat_numcod (frame, plane, gate, data, bed); + else + matnum = mat_numcod (frame, 1, gate, data, bed); + print_debug (prog, "matnum = %d\n", matnum); + + if (matrix_find (mptr, matnum, &matdir) != 0) + return -1; + + strtblk = matdir.strtblk; + print_debug (prog, "strtblk = %d\n", strtblk); + + + off = (strtblk + 1) * MatBLKSIZE; + + switch (mptr->mhptr->file_type) + { +#ifndef STIR_NO_NAMESPACES + case ::Sinogram: +#else + case CTISinogram: +#endif + + { + // KT 14/05/2002 added error check. + if (mat_read_scan_subheader (mptr->fptr, mptr->mhptr, strtblk, &scansub)) + { + if (ferror(mptr->fptr)) + perror("offset_in_ECAT_file: error in reading subheader"); + return -1; + } + plane_size = scansub.num_r_elements * + scansub.num_angles * + el_size[scansub.data_type]; + + if (mptr->mhptr->sw_version < V7) + off = strtblk*MatBLKSIZE; + else + off = (strtblk + 1) * MatBLKSIZE + (plane-1) * plane_size; + break; + } + case PetImage: + case ByteVolume: + case PetVolume: + { + // KT 14/05/2002 added error check. + if (mat_read_image_subheader (mptr->fptr, mptr->mhptr, strtblk, &imagesub)) + { + if (ferror(mptr->fptr)) + perror("offset_in_ECAT_file: error in reading subheader"); + return -1; + } + + off = strtblk*MatBLKSIZE; + plane_size = imagesub.x_dimension * + imagesub.y_dimension * + el_size[imagesub.data_type]; + + if (mptr->mhptr->sw_version >= V7) + off += (plane-1) * plane_size; + break; + + } + + case AttenCor: + { + off = strtblk * MatBLKSIZE; + print_debug (prog, "off = %d\n", off); + + if (mptr->mhptr->sw_version >= V7) + { + print_debug (prog, "AttenCor\n"); + // KT 14/05/2002 added error check. + if (mat_read_attn_subheader (mptr->fptr, mptr->mhptr, strtblk, &attnsub)) + { + if (ferror(mptr->fptr)) + perror("offset_in_ECAT_file: error in reading subheader"); + return -1; + } + + + switch (attnsub.storage_order) + { + case ElVwAxRd: + plane_size = attnsub.num_r_elements * + attnsub.num_angles * + el_size[attnsub.data_type]; + + if (group) + for (i = 0; i < group; i++) + off += plane_size * attnsub.z_elements[i]; + // KT 25/10/2000 swapped segment order + if (segment > 0) + off += plane_size * attnsub.z_elements[group]/2; + off += (plane - 1) * plane_size; + break; + + case ElAxVwRd: + print_debug (prog, "group %d, plane %d\n", group, plane); + if (group) + for (i = 0; i < group; i++) + { + plane_size = attnsub.num_r_elements * + attnsub.z_elements[i] * + el_size[attnsub.data_type]; + off += plane_size * attnsub.num_angles; + } + plane_size = attnsub.num_r_elements * + attnsub.z_elements[group] * + el_size[attnsub.data_type]; + if (group) + plane_size /=2; + // KT 25/10/2000 swapped segment order + if (segment > 0) + off += plane_size*attnsub.num_angles; + + off += (plane - 1) *plane_size; + + break; + } + + } + break; + } + + + case Normalization: + { + + // KT 14/05/2002 added error check. + if (mat_read_norm_subheader (mptr->fptr, mptr->mhptr, strtblk, &normsub)) + { + if (ferror(mptr->fptr)) + perror("offset_in_ECAT_file: error in reading subheader"); + return -1; + } + off = strtblk*MatBLKSIZE; + plane_size = normsub.num_r_elements * + normsub.num_angles * + el_size[normsub.data_type]; + if (mptr->mhptr->sw_version >= V7) + off += (plane-1) * plane_size; + break; + } + case ByteProjection: + case PetProjection: + case PolarMap: + { + fprintf (stderr, "Not implemented for this file type\n"); + off = -1; + break; + } + case Byte3dSinogram: + case Short3dSinogram: + case Float3dSinogram : + { + off = (strtblk+1) * MatBLKSIZE; + print_debug (prog, "off = %d\n", off); + + // KT 14/05/2002 added error check. + if (mat_read_Scan3D_subheader (mptr->fptr, mptr->mhptr, strtblk, &scan3dsub)) + { + if (ferror(mptr->fptr)) + perror("offset_in_ECAT_file: error in reading subheader"); + return -1; + } + + switch (scan3dsub.storage_order) + { + case ElVwAxRd: + plane_size = scan3dsub.num_r_elements * + scan3dsub.num_angles * + el_size[scan3dsub.data_type]; + print_debug (prog, "xdim = %d (num_r_elements)\n", scan3dsub.num_r_elements); + print_debug (prog, "ydim = %d (num_angles) \n", scan3dsub.num_angles); + print_debug (prog, "plane_size = %d \n", plane_size); + if (group) + for (i = 0; i < group; i++) + off += (plane_size * scan3dsub.num_z_elements[i]); + // KT 25/10/2000 swapped segment order + if (segment > 0) + off += plane_size * scan3dsub.num_z_elements[group]/2; + + + print_debug (prog, "num_z_elements[group] = %d\n", scan3dsub.num_z_elements[group]); + print_debug (prog, "plane-1 = %d\n", plane-1); + + off += ((plane - 1) * plane_size); + print_debug (prog, "off = %d\n", off); + break; + + case ElAxVwRd: + if (group) + for (i = 0; i < group; i++) + { + plane_size = scan3dsub.num_r_elements * + scan3dsub.num_z_elements[i] * + el_size[scan3dsub.data_type]; + off += plane_size * scan3dsub.num_angles; + } + plane_size = scan3dsub.num_r_elements * + scan3dsub.num_z_elements[group] * + el_size[scan3dsub.data_type]; + // KT 14/05/2002 corrected. It seems that the convention of planes was different + // now it's the same as for AttenCor +#if 0 + if (group) + { + plane_size /=2; + // KT 25/10/2000 swapped segment order + if (segment > 0) + off += plane_size; + off += (plane - 1) *plane_size * 2; + } + else + off += (plane - 1) *plane_size; +#else + if (group) + plane_size /=2; + // KT 25/10/2000 swapped segment order + if (segment > 0) + off += plane_size*scan3dsub.num_angles; + off += (plane - 1) *plane_size; +#endif + break; + } + break; + } + case Norm3d: + { + fprintf (stderr, "Not implemented yet\n"); + off = 1; + break; + } + } + + if (plane_size_ptr != NULL) + *plane_size_ptr = plane_size; + + return (off); + +} + + +static void fill_string (char *str, int len) +{ + for (int i=0; i +read_ECAT7_exam_info(MatrixFile *mptr) +{ + + const int num_frames = std::max(static_cast( mptr->mhptr->num_frames),1); + // funnily enough, num_bed_pos seems to be offset with 1 + // (That's to say, in a singled bed study, num_bed_pos==0) + // TODO maybe not true for multi-bed studies + const int num_bed_poss = static_cast( mptr->mhptr->num_bed_pos) + 1; + // const int num_gates = std::max(static_cast( mptr->mhptr->num_gates),1); + + int min_frame_num = 1; + int max_frame_num = num_frames; + const int min_bed_num = 0; + const int max_bed_num = num_bed_poss-1; + const int gate_num = 1; + const int data_num = 0; + + std::vector > frame_times; + + for (int frame_num=min_frame_num; frame_num<=max_frame_num;++frame_num) + for (int bed_num=min_bed_num; bed_num<=max_bed_num;++bed_num) + { + const int matnum = mat_numcod (frame_num, 1, gate_num, data_num, bed_num); + MatrixData* matrix = matrix_read( mptr, matnum, MAT_SUB_HEADER); + + if (matrix==NULL) + { + warning("TimeFrameDefinitions: Matrix not found at \"%d,1,%d,%d,%d\" in file \"%s\"\n.", + frame_num, 1, gate_num, data_num, bed_num, mptr->fname); + continue; + } + + switch (mptr->mhptr->file_type) + { + case PetImage: + case ByteVolume: + case PetVolume: + { + Image_subheader *sheader_ptr= + reinterpret_cast(matrix->shptr); + frame_times.push_back(std::make_pair(sheader_ptr->frame_start_time/1000., + sheader_ptr->frame_start_time/1000. + + sheader_ptr->frame_duration/1000.)); + + break; + } + case Byte3dSinogram: + case Short3dSinogram: + case Float3dSinogram : + { + Scan3D_subheader *sheader_ptr= + reinterpret_cast(matrix->shptr); + frame_times.push_back(std::make_pair(sheader_ptr->frame_start_time/1000., + sheader_ptr->frame_start_time/1000. + + sheader_ptr->frame_duration/1000.)); + + break; + } + case CTISinogram : + { + Scan_subheader *sheader_ptr= + reinterpret_cast(matrix->shptr); + frame_times.push_back(std::make_pair(sheader_ptr->frame_start_time/1000., + sheader_ptr->frame_start_time/1000. + + sheader_ptr->frame_duration/1000.)); + + break; + } + default: + { + // can't do anything here + } + } + free_matrix_data(matrix); + } + + TimeFrameDefinitions time_frame_defs(frame_times); + ExamInfo exam_info; + exam_info.imaging_modality = ImagingModality::PT; + exam_info.set_time_frame_definitions(time_frame_defs); + exam_info.start_time_in_secs_since_1970 = double(mptr->mhptr->scan_start_time); + + switch(mptr->mhptr->patient_orientation) + { + case FeetFirstProne: + exam_info.patient_position = PatientPosition(PatientPosition::FFP); break; + case HeadFirstProne: + exam_info.patient_position = PatientPosition(PatientPosition::HFP); break; + case FeetFirstSupine: + exam_info.patient_position = PatientPosition(PatientPosition::FFS); break; + case HeadFirstSupine: + exam_info.patient_position = PatientPosition(PatientPosition::HFS); break; + case FeetFirstRight: + exam_info.patient_position = PatientPosition(PatientPosition::FFDR); break; + case HeadFirstRight: + exam_info.patient_position = PatientPosition(PatientPosition::HFDR); break; + case FeetFirstLeft: + exam_info.patient_position = PatientPosition(PatientPosition::FFDL); break; + case HeadFirstLeft: + exam_info.patient_position = PatientPosition(PatientPosition::HFDL); break; + case UnknownOrientation: + default: + exam_info.patient_position = PatientPosition(PatientPosition::unknown_position); break; + } + + shared_ptr exam_info_sptr(new ExamInfo(exam_info)); + return exam_info_sptr; +} + +shared_ptr +read_ECAT7_exam_info(const string& filename) +{ + MatrixFile * const mptr = + matrix_open( filename.c_str(), MAT_READ_ONLY, MAT_UNKNOWN_FTYPE); + if (!mptr) + { + matrix_perror( filename.c_str()); + error("Error reading ECAT7 file"); + } + shared_ptr exam_info_sptr(read_ECAT7_exam_info(mptr)); + matrix_close(mptr); + return exam_info_sptr; +} + +void make_ECAT7_main_header(Main_header& mhead, + Scanner const& scanner, + const string& orig_name + ) +{ + // first set to default (sometimes nonsensical) values + strcpy(mhead.magic_number, "MATRIX7.0"); // TODO check + fill_string(mhead.original_file_name, 32); + mhead.sw_version= V7; + mhead.system_type= -1; + mhead.file_type= -1; + fill_string(mhead.serial_number,10); + mhead.scan_start_time= 0; + fill_string(mhead.isotope_code, 8); + mhead.isotope_halflife= 0.F; + fill_string(mhead.radiopharmaceutical, 32); + mhead.gantry_tilt= 0.F; + mhead.gantry_rotation= 0.F; + mhead.bed_elevation= 0.F; + mhead.intrinsic_tilt = 0; + mhead.wobble_speed= 0; + mhead.transm_source_type= -1; + mhead.distance_scanned = -1.F; + mhead.transaxial_fov= -1.F; + mhead.angular_compression = -1; + mhead.calibration_factor= 0.F; + mhead.calibration_units = 0; + mhead.calibration_units_label = 0; + mhead.compression_code = 0; + fill_string(mhead.study_name, 12); + fill_string(mhead.patient_id, 16); + fill_string(mhead.patient_name, 32); + mhead.patient_sex[0] = '.'; + mhead.patient_dexterity[0] = '.'; + mhead.patient_age = 0.F; + mhead.patient_height = 0.F; + mhead.patient_weight = 0.F; + mhead.patient_birth_date=1; + fill_string(mhead.physician_name,32); + fill_string(mhead.operator_name,32); + fill_string(mhead.study_description,32); + mhead.acquisition_type = 0; + mhead.coin_samp_mode = 0; // default to net_trues + mhead.axial_samp_mode= 0; + mhead.patient_orientation = HeadFirstSupine; + fill_string(mhead.facility_name, 20); + mhead.num_planes= 0; + mhead.num_frames= 1; // used for matnum, so set coherent default values + mhead.num_gates= 1; + mhead.num_bed_pos= 0; + mhead.init_bed_position= -1.F; + for (int i=0; i<15; i++) mhead.bed_offset[i]= 0.F; + mhead.plane_separation= -1.F; + mhead.lwr_sctr_thres= 0; // WARNING: default setup for the 966 + mhead.lwr_true_thres= 350; // WARNING: default setup for the 966 + mhead.upr_true_thres= 650; // WARNING: default setup for the 966 + fill_string(mhead.user_process_code, 10); + mhead.acquisition_mode= 0; // default to NORMAL + mhead.bin_size = -1.F; + mhead.branching_fraction = -1.F; + mhead.dose_start_time = 0; + mhead.dosage = 0.F; + mhead.well_counter_factor = 1.F; + fill_string(mhead.data_units,32); + mhead.septa_state= -1; + + // now fill in what we can + mhead.calibration_factor = 1.F; + mhead.well_counter_factor=1.F; + + strncpy(mhead.original_file_name, orig_name.c_str(), 31); + mhead.original_file_name[31]='\0'; + mhead.num_frames= 1; + + mhead.system_type= find_ECAT_system_type(scanner); + mhead.transaxial_fov= + scanner.get_inner_ring_radius()*2* + static_cast(sin(_PI/scanner.get_num_detectors_per_ring()* + scanner.get_max_num_non_arccorrected_bins()/2.)/10); + mhead.intrinsic_tilt = scanner.get_default_intrinsic_tilt(); + mhead.bin_size = scanner.get_default_bin_size()/10; + mhead.plane_separation= scanner.get_ring_spacing()/2/10; + mhead.intrinsic_tilt = scanner.get_default_intrinsic_tilt(); + + mhead.distance_scanned= + mhead.plane_separation * scanner.get_num_rings()*2; +} + +void make_ECAT7_main_header(Main_header& mhead, + Scanner const& scanner, + const string& orig_name, + DiscretisedDensity<3,float> const & density + ) +{ + make_ECAT7_main_header(mhead, scanner, orig_name); + + DiscretisedDensityOnCartesianGrid<3,float> const & image = + dynamic_cast const&>(density); + + + // extra main parameters that depend on data type + mhead.file_type= PetVolume; + mhead.num_planes=image.get_length(); + mhead.plane_separation=image.get_grid_spacing()[1]/10; // convert to cm + +} + +static short find_angular_compression(const ProjDataInfo& proj_data_info) +{ + // try to convert to cylindrical ProjDataInfo + // use pointer such that we can check if it worked (without catching exceptions) + ProjDataInfoCylindrical const * const proj_data_info_cyl_ptr = + dynamic_cast(&proj_data_info); + if (proj_data_info_cyl_ptr!=0) + { + const int mash_factor = + proj_data_info_cyl_ptr->get_view_mashing_factor(); + if (mash_factor>1 && mash_factor%2==1) + { + warning("ECAT7::find_angular_compression: odd mash factor %d is not supported by CTI header. " + "Using a value of 0\n", mash_factor); + return static_cast(0); + } + else + return static_cast(mash_factor/2); + } + else + { + warning("ECAT7::find_angular_compression: proj data info does not correspond to a cylindrical scanner. " + "Using a value of 0\n"); + return static_cast(0); + } + +} + +static short find_axial_compression(const ProjDataInfo& proj_data_info) +{ + int axial_compression = 0; + // try to convert to cylindrical ProjDataInfo + // use pointer such that we can check if it worked (without catching exceptions) + ProjDataInfoCylindrical const * const proj_data_info_cyl_ptr = + dynamic_cast(&proj_data_info); + if (proj_data_info_cyl_ptr!=0) + { + axial_compression = + proj_data_info_cyl_ptr->get_max_ring_difference(0) - + proj_data_info_cyl_ptr->get_min_ring_difference(0) + 1; + for (int segment_num = proj_data_info.get_min_segment_num(); + segment_num <= proj_data_info.get_max_segment_num(); + ++segment_num) + { + const int this_segments_axial_compression = + proj_data_info_cyl_ptr->get_max_ring_difference(segment_num) - + proj_data_info_cyl_ptr->get_min_ring_difference(segment_num) + 1; + if (axial_compression != this_segments_axial_compression) + error("ECAT 7 file format does not support data with non-uniform angular compression. " + "Segment %d has angular compression %d while segment 0 has %d\n", + segment_num, this_segments_axial_compression, axial_compression); + } + } + else + { + axial_compression = 1; + warning("ECAT 7 file format used with non-cylindrical ProjDataInfo type. " + "I set axial_compression to 1, but who knows what will happen?"); + } + return static_cast(axial_compression); +} + + +NumericType +make_ECAT7_main_header(Main_header& mhead, + const string& orig_name, + ExamInfo const & exam_info, + ProjDataInfo const & proj_data_info, + const bool write_as_attenuation, + NumericType output_type + ) +{ + + make_ECAT7_main_header(mhead, *proj_data_info.get_scanner_ptr(), orig_name); + + mhead.num_frames = exam_info.time_frame_definitions.get_num_frames(); + mhead.acquisition_type = + mhead.num_frames>1 ? DynamicEmission : StaticEmission; + + mhead.scan_start_time = static_cast(floor(exam_info.start_time_in_secs_since_1970)); + + switch(exam_info.patient_position.get_position()) + { + case PatientPosition::FFP: + mhead.patient_orientation = FeetFirstProne; break; + case PatientPosition::HFP: + mhead.patient_orientation = HeadFirstProne; break; + case PatientPosition::FFS: + mhead.patient_orientation = FeetFirstSupine; break; + case PatientPosition::HFS: + mhead.patient_orientation = HeadFirstSupine; break; + case PatientPosition::FFDR: + mhead.patient_orientation = FeetFirstRight; break; + case PatientPosition::HFDR: + mhead.patient_orientation = HeadFirstRight; break; + case PatientPosition::FFDL: + mhead.patient_orientation = FeetFirstLeft; break; + case PatientPosition::HFDL: + mhead.patient_orientation = HeadFirstLeft; break; + default: + mhead.patient_orientation = UnknownOrientation; break; + } + + // extra main parameters that depend on data type + + mhead.num_planes = 0; + for(int segment_num=proj_data_info.get_min_segment_num(); + segment_num <= proj_data_info.get_max_segment_num(); + ++segment_num) + mhead.num_planes+= proj_data_info.get_num_axial_poss(segment_num); + + + const float natural_bin_size = + proj_data_info.get_sampling_in_s(Bin(0,0,0,0)); + const float default_bin_size = + proj_data_info.get_scanner_ptr()->get_default_bin_size(); + + if (fabs(natural_bin_size - default_bin_size)>.02 && + dynamic_cast(&proj_data_info) == 0) + { + warning("CTI default bin size (%g) differs from STIR sampling in s (%g)\n" + "for this data. Using default bin size for field main header anyway.\n" + "However, you better check this out, especially for arc-corrected data.", + default_bin_size, natural_bin_size); + } + mhead.bin_size = default_bin_size/10; + + + mhead.angular_compression = find_angular_compression(proj_data_info); + // guess septa state + // assume that if it has more than 1 segment, it's a 3D scan... + // except for some scanners without septa + switch(proj_data_info.get_scanner_ptr()->get_type()) + { + case Scanner::E966: + case Scanner::E925: + case Scanner::RATPET: + mhead.septa_state= NoSeptaInstalled; + break; + default: + mhead.septa_state= + proj_data_info.get_num_segments()==1 + ? SeptaExtended + : SeptaRetracted; + } + + + if (write_as_attenuation) + { + mhead.file_type = AttenCor; + mhead.acquisition_type = TransmissionScan; + if (output_type != NumericType::FLOAT) + { + warning("make_ECAT7_main_header: attenuation file will be written as floats " + "to avoid problems with CTI utilities"); + output_type = NumericType::FLOAT; + } + + } + else + { + mhead.acquisition_type = StaticEmission; + switch (output_type.id) + { + case NumericType::FLOAT: + mhead.file_type = Float3dSinogram; break; + case NumericType::SHORT: + mhead.file_type = Short3dSinogram; break; + case NumericType::SCHAR: + mhead.file_type = Byte3dSinogram; break; + default: + warning("make_ECAT7_main_header: output type is not supported by ECAT7 format. Will use floats"); + mhead.file_type = Float3dSinogram; + output_type = NumericType::FLOAT; + break; + } + } + + return output_type; +} + +// A utility function only called by scan_subheader_zero_fill +/* + \internal + + Most of the names of the variables we need are the same in the + Scan3D or Attn subheader, except num_z_elements and span. + So, instead of writing essentially the same function twice, we + use a templated version. Note that this takes care of the + different locations of the information in the subheaders, + as only the name is used. +*/ + +template +static void scan_subheader_zero_fill_aux(Subheader& shead) +{ + shead.data_type= -1; + shead.num_dimensions = -1; + shead.num_r_elements = -1; + shead.num_angles = -1; + shead.ring_difference = -1; + shead.storage_order = -1; + shead.x_resolution = -1.F; + shead.z_resolution = -1.F; + shead.w_resolution = -1.F; + shead.scale_factor= -1.F; +} + +void scan_subheader_zero_fill(Scan3D_subheader& shead) +{ + scan_subheader_zero_fill_aux(shead); + shead.v_resolution = -1.F; + shead.corrections_applied = 0; + for (int i=0; i<64; ++i) shead.num_z_elements[i] = -1; + shead.axial_compression = -1; + shead.gate_duration= 0; + shead.r_wave_offset= -1; + shead.num_accepted_beats = -1; + shead.scan_min= -1; + shead.scan_max= -1; + shead.prompts= -1; + shead.delayed= -1; + shead.multiples= -1; + shead.net_trues= -1; + shead.tot_avg_cor= -1.F; + shead.tot_avg_uncor= -1.F; + shead.total_coin_rate= -1; + shead.frame_start_time= 0; + shead.frame_duration= 0; + shead.loss_correction_fctr = -1.F; + for(int i=0;i<128;++i) shead.uncor_singles[i] = -1.F; + +} + +void scan_subheader_zero_fill(Attn_subheader& shead) +{ + scan_subheader_zero_fill_aux(shead); + shead.y_resolution = -1.F; + shead.attenuation_type = 1; // default to measured + shead.num_z_elements = -1; + for (int i=0; i<64; ++i) shead.z_elements[i] = -1; + shead.span = -1; + shead.x_offset = -1.F; + shead.y_offset = -1.F; + shead.x_radius = -1.F; + shead.y_radius = -1.F; + shead.tilt_angle = -1.F; + shead.attenuation_coeff = -1.F; + shead.attenuation_min = -1.F; + shead.attenuation_max = -1.F; + shead.skull_thickness = -1.F; + shead.num_additional_atten_coeff = -1; + for (int i=0; i<8; ++i) shead.additional_atten_coeff[i] = -1.F; + shead.edge_finding_threshold = -1.F; +} + +void img_subheader_zero_fill(Image_subheader & ihead) +{ + ihead.data_type= -1; + ihead.num_dimensions= 3; + ihead.x_dimension= -1; + ihead.y_dimension= -1; + ihead.z_dimension= -1; + ihead.x_offset= 0.F; + ihead.y_offset= 0.F; + ihead.z_offset= 0.F; + ihead.recon_zoom= -1.F; + ihead.scale_factor= -1.F; + ihead.image_min= -1; + ihead.image_max= -1; + ihead.x_pixel_size= -1.F; + ihead.y_pixel_size= -1.F; + ihead.z_pixel_size= -1.F; + ihead.frame_duration= 0; + ihead.frame_start_time= 0; + ihead.filter_code = -1; + ihead.x_resolution = -1.F; + ihead.y_resolution = -1.F; + ihead.z_resolution = -1.F; + ihead.num_r_elements = -1; + ihead.num_angles = -1; + ihead.z_rotation_angle = -1; + ihead.decay_corr_fctr= -1.F; + ihead.processing_code= -1; + ihead.gate_duration = 0; + ihead.r_wave_offset = -1; + ihead.num_accepted_beats = -1; + ihead.filter_cutoff_frequency = -1.F; + ihead.filter_resolution = -1.F; + ihead.filter_ramp_slope = -1.F; + ihead.filter_order = -1; + ihead.filter_scatter_fraction = -1.F; + ihead.filter_scatter_slope = -1.F; + ihead.mt_1_1 = -1.F; + ihead.mt_1_2 = -1.F; + ihead.mt_1_3 = -1.F; + ihead.mt_2_1 = -1.F; + ihead.mt_2_2 = -1.F; + ihead.mt_2_3 = -1.F; + ihead.mt_3_1 = -1.F; + ihead.mt_3_2 = -1.F; + ihead.mt_3_3 = -1.F; + ihead.rfilter_cutoff = -1.F; + ihead.rfilter_resolution = -1.F; + ihead.rfilter_code = -1; + ihead.rfilter_order = -1; + ihead.zfilter_cutoff = -1.F; + ihead.zfilter_resolution = -1.F; + ihead.zfilter_code = -1; + ihead.zfilter_order = -1; + ihead.mt_1_4 = -1.F; + ihead.mt_2_4 = -1.F; + ihead.mt_3_4 = -1.F; + ihead.scatter_type = -1; + ihead.recon_type = -1; + ihead.recon_views = -1; + fill_string(ihead.annotation, 40); +} + + + +//! A utility function only called by make_subheader_for_ECAT7(..., ProjDataInfo&) +/*! + \internal + + Most of the names of the variables we need are the same in the + Scan3D or Attn subheader, except num_z_elements and span. + So, instead of writing essentially the same function twice, we + use a templated version. Note that this takes care of the + different locations of the information in the subheaders, + as only the name is used. + + Extra parameters are used when the names of the variables do not match. +*/ +template +static void +make_subheader_for_ECAT7_aux(SUBHEADERPTR sub_header_ptr, + short * num_z_elements, + short& span, + const Main_header& mhead, + const ProjDataInfo& proj_data_info + ) +{ + scan_subheader_zero_fill(*sub_header_ptr); + sub_header_ptr->num_dimensions = 4; + sub_header_ptr->num_r_elements = proj_data_info.get_num_tangential_poss(); + sub_header_ptr->num_angles = proj_data_info.get_num_views(); + + if (proj_data_info.get_max_segment_num() != + -proj_data_info.get_min_segment_num()) + error("ECAT 7 file format can only handle data with max_segment_num == -min_segment_num\n"); + span = find_axial_compression(proj_data_info); + + if (proj_data_info.get_max_segment_num() > 64) + error("ECAT 7 file format supports only a maximum segment number of 64 while this data has %d\n", + proj_data_info.get_max_segment_num()); + num_z_elements[0] = static_cast(proj_data_info.get_num_axial_poss(0)); + for (int segment_num=1; segment_num<=proj_data_info.get_max_segment_num(); ++segment_num) + { + num_z_elements[segment_num] = + static_cast(2*proj_data_info.get_num_axial_poss(segment_num)); + } + for (int i=proj_data_info.get_max_segment_num()+1; i<64; ++i) + num_z_elements[i] = 0; + + // try to convert to cylindrical ProjDataInfo + // use pointer such that we can check if it worked (without catching exceptions) + const ProjDataInfoCylindrical * const proj_data_info_cyl_ptr = + dynamic_cast(&proj_data_info); + if (proj_data_info_cyl_ptr!=0) + { + sub_header_ptr->ring_difference = + proj_data_info_cyl_ptr->get_max_ring_difference(proj_data_info.get_max_segment_num()); + } + else + { + sub_header_ptr->ring_difference = -1; + } + + + float x_resolution; + const Scanner& scanner = + *proj_data_info.get_scanner_ptr(); + if (dynamic_cast(&proj_data_info) != 0) + { + const float depth_of_interaction_factor = + 1 + + scanner.get_average_depth_of_interaction() / + scanner.get_inner_ring_radius(); + x_resolution = + proj_data_info.get_sampling_in_s(Bin(0,0,0,0))/ + depth_of_interaction_factor; + if (fabs(x_resolution - scanner.get_default_bin_size()) > .01) + { + warning("ECAT7 IO: Bin size derived from data (%g) does not agree with expected value %g\n" + "for scanner %s. Using default bin size for header.x_resolution...", + x_resolution, + scanner.get_default_bin_size(), + scanner.get_name().c_str()); + } + // always use default because there's a small discrepancy between the + // default bin size and the value derived from the ring radius etc + x_resolution = scanner.get_default_bin_size(); + } + else + { + x_resolution = + proj_data_info.get_sampling_in_s(Bin(0,0,0,0)); + if (fabs(x_resolution - scanner.get_default_bin_size()) > .01) + { + warning("ECAT7 IO: Bin size derived from data (%g) does not agree with expected value %g\n" + "for scanner %s. Using data-derived value for header.x_resolution...", + x_resolution, + scanner.get_default_bin_size(), + scanner.get_name().c_str()); + } + } + sub_header_ptr->x_resolution = x_resolution/10; + sub_header_ptr->storage_order = ElAxVwRd; + + +} + + +// WARNING data_type has still to be set +void +make_subheader_for_ECAT7(Attn_subheader& shead, + const Main_header& mhead, + const ProjDataInfo& proj_data_info + ) +{ + make_subheader_for_ECAT7_aux(&shead, shead.z_elements, shead.span, + mhead, proj_data_info); + if (dynamic_cast(&proj_data_info)) + { + warning("make_subheader_for_ECAT7: data is not arc-corrected but info is not available in CTI attenuation subheader\n"); + } +} + +// WARNING data_type has to be set +void +make_subheader_for_ECAT7(Scan3D_subheader& shead, + const Main_header& mhead, + const ProjDataInfo& proj_data_info + ) +{ + make_subheader_for_ECAT7_aux(&shead, shead.num_z_elements, shead.axial_compression, + mhead, proj_data_info); + // try to convert to cylindrical ProjDataInfo to check if it's arccorrected + // use pointer such that we can check if it worked (without catching exceptions) + if (dynamic_cast(&proj_data_info)) + { + shead.corrections_applied = static_cast(ArcPrc); + } + else if (dynamic_cast(&proj_data_info)) + { + shead.corrections_applied = 0; + } + else + { + warning("make_subheader_for_ECAT7: unknown type of proj_data_info. Setting data to arc-corrected anyway\n"); + shead.corrections_applied = static_cast(ArcPrc); + } + +} + + +//! A utility function only called by make_pdfs_matrix() +/*! + \internal + + Most of the names of the variables we need are the same in the + Scan3D or Attn subheader, except num_z_elements and span. + So, instead of writing essentially the same function twice, we + use a templated version. Note that this takes care of the + different locations of the information in the subheaders, + as only the name is used. + + Extra parameters are used when the names of the variables do not match. +*/ +template +static +ProjDataFromStream * +make_pdfs_from_matrix_aux(SUBHEADERPTR sub_header_ptr, + short const * num_z_elements, + const int span, + const bool arc_corrected, + unsigned int frame_start_time, + unsigned int frame_duration, + MatrixFile * const mptr, + MatrixData * const matrix, + const ExamInfo& exam_info_whole_file, + const shared_ptr& stream_ptr) +{ + shared_ptr scanner_ptr; + find_scanner(scanner_ptr, *(mptr->mhptr)); + if (scanner_ptr->get_type() == Scanner::Unknown_scanner) + { + warning("ECAT7 IO: Couldn't determine the scanner \n" + "(Main_header.system_type=%d), defaulting to 962.\n" + "This might give dramatic problems.\n", + mptr->mhptr->system_type); + scanner_ptr.reset(new Scanner(Scanner::E962)); + } +#ifdef B_JOINT_STIRGATE + // zlong, 08-04-2004, add support for Unknown_scanner + // we have no idea about the geometry, so, ask user. + if(scanner_ptr->get_type() == Scanner::Unknown_scanner) + { + warning("Joint Gate Stir project warning:\n"); + warning("I have no idea about your scanner, please give me the scanner info.\n"); + scanner_ptr.reset(Scanner::ask_parameters()); + } +#endif + + shared_ptr exam_info_sptr(new ExamInfo(exam_info_whole_file)); + if (frame_duration>0) + { + std::vector > frame_times; + frame_times.push_back(std::make_pair(frame_start_time/1000., + frame_start_time/1000. + + frame_duration/1000.)); + TimeFrameDefinitions time_frame_defs(frame_times); + exam_info_sptr->set_time_frame_definitions(time_frame_defs); + exam_info_sptr->start_time_in_secs_since_1970 = double(mptr->mhptr->scan_start_time); + } + + if(sub_header_ptr->num_dimensions != 4) + warning("ECAT7 IO: Expected subheader.num_dimensions==4. Continuing..."); + const int num_tangential_poss = sub_header_ptr->num_r_elements; + const int num_views = sub_header_ptr->num_angles; + + // find maximum segment + int max_segment_num = 0; + while(max_segment_num<64 && num_z_elements[max_segment_num+1] != 0) + ++max_segment_num; + + VectorWithOffset num_axial_poss_per_seg(-max_segment_num,max_segment_num); + + num_axial_poss_per_seg[0] = num_z_elements[0]; + for (int segment_num=1; segment_num<=max_segment_num; ++segment_num) + { + num_axial_poss_per_seg[-segment_num] = + num_axial_poss_per_seg[segment_num] = + num_z_elements[segment_num]/2; + } + + const int max_delta = sub_header_ptr->ring_difference; + const float bin_size = sub_header_ptr->x_resolution * 10; // convert to mm + const float scale_factor = sub_header_ptr->scale_factor; + + ProjDataFromStream::StorageOrder storage_order; + switch (sub_header_ptr->storage_order) + { + case ElVwAxRd: + storage_order = ProjDataFromStream::Segment_AxialPos_View_TangPos; + break; + + case ElAxVwRd: + storage_order = ProjDataFromStream::Segment_View_AxialPos_TangPos; + break; + default: + warning("ECAT7 IO: Funny value for subheader.storage_order. Assuming ElVwAxRd"); + storage_order = ProjDataFromStream::Segment_AxialPos_View_TangPos; + } + NumericType data_type; + ByteOrder byte_order; + find_type_from_ECAT_data_type(data_type, byte_order, sub_header_ptr->data_type); + + if (fabs(bin_size - scanner_ptr->get_default_bin_size())>.01) + { + warning("ECAT7 IO: Bin size from header.x_resolution (%g) does not agree with expected value %g\n" + "for scanner %s. Using bin size from header...", + bin_size, + scanner_ptr->get_default_bin_size(), + scanner_ptr->get_name().c_str()); + scanner_ptr->set_default_bin_size(bin_size); + } + // TODO more checks on FOV etc. + + int span_to_use = span; + if (span == 0) + { + if (num_z_elements[0] == scanner_ptr->get_num_rings()) + { + warning("\nECAT7 subheader says span=0, while span should be odd.\n" + "However, num_z_elements[0]==num_rings, so we'll asssume it's span=1\n"); + span_to_use = 1; + } + else + { + error("\nECAT7 subheader says span=0, while span should be odd.\n" + "Moreover, num_z_elements[0] (%d)!=num_rings (%d), so, I give up.\n", + num_z_elements[0], scanner_ptr->get_num_rings()); + } + } + + shared_ptr pdi_ptr( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, span_to_use, max_delta, + num_views, num_tangential_poss, + arc_corrected)); + + pdi_ptr->set_num_axial_poss_per_segment(num_axial_poss_per_seg); + + vector segment_sequence_in_stream(2*max_segment_num+1); + // KT 25/10/2000 swapped segment order + // ECAT 7 always stores segments as 0, -1, +1, ... + segment_sequence_in_stream[0] = 0; + for (int segment_num = 1; segment_num<=max_segment_num; ++segment_num) + { + segment_sequence_in_stream[2*segment_num-1] = -segment_num; + segment_sequence_in_stream[2*segment_num] = segment_num; + } + + Matval matval; + mat_numdoc(matrix->matnum, &matval); + + const long offset_in_file = + offset_in_ECAT_file(mptr, + matval.frame, 1, matval.gate, matval.data, matval.bed, + 0, NULL); + // KT 14/05/2002 added error check + if (offset_in_ECAT_file<0) + return 0; + + + return new ProjDataFromStream (exam_info_sptr, pdi_ptr, stream_ptr, offset_in_file, + segment_sequence_in_stream, + storage_order, + data_type, + byte_order, + scale_factor); +} + + +ProjDataFromStream * +make_pdfs_from_matrix(MatrixFile * const mptr, + MatrixData * const matrix, + const shared_ptr& stream_ptr) +{ + shared_ptr exam_info_sptr(read_ECAT7_exam_info(mptr)); + switch (mptr->mhptr->file_type) + { + case AttenCor: + { + Attn_subheader const *sub_header_ptr= + reinterpret_cast(matrix->shptr); + + // CTI does not provide corrections_applied to check if the data + // is arc-corrected. Presumably its attenuation data is always + // arccorrected + const bool arc_corrected = true; + warning("Assuming data is arc-corrected (info not available in CTI attenuation subheader)\n"); + return + make_pdfs_from_matrix_aux(sub_header_ptr, + sub_header_ptr->z_elements, + sub_header_ptr->span, + arc_corrected, + 0U, 0U, // pass invalid frame_duration + mptr, matrix, *exam_info_sptr, stream_ptr); + } + case Byte3dSinogram: + case Short3dSinogram: + case Float3dSinogram : + { + Scan3D_subheader const * sub_header_ptr= + reinterpret_cast(matrix->shptr); + + ProcessingCode cti_processing_code = + static_cast(sub_header_ptr->corrections_applied); + + const bool arc_corrected = + (cti_processing_code & ArcPrc) != 0; + + return + make_pdfs_from_matrix_aux(sub_header_ptr, + sub_header_ptr->num_z_elements, + sub_header_ptr->axial_compression, + arc_corrected, + sub_header_ptr->frame_start_time, + sub_header_ptr->frame_duration, + mptr, matrix, *exam_info_sptr, stream_ptr); + } + default: + { + warning ("make_pdfs_from_matrix: unsupported file_type %d\n", + mptr->mhptr->file_type); + return NULL; + } + } +} + +static +Succeeded +get_ECAT7_image_info(CartesianCoordinate3D& dimensions, + CartesianCoordinate3D& voxel_size, + Coordinate3D& origin, + float& scale_factor, + NumericType& type_of_numbers, + ByteOrder& byte_order, + long& offset_in_file, + + const string& ECAT7_filename, + const int frame_num, const int gate_num, const int data_num, const int bed_num, + const char * const warning_prefix, + const char * const warning_suffix) +{ + MatrixFile * const mptr = + matrix_open( ECAT7_filename.c_str(), MAT_READ_ONLY, MAT_UNKNOWN_FTYPE); + if (!mptr) { + matrix_perror( ECAT7_filename.c_str()); + return Succeeded::no; + } + if (mptr->mhptr->sw_version < V7) + { + matrix_close(mptr); + warning("%s: %s seems to be an ECAT 6 file. " + "%s", + warning_prefix, ECAT7_filename.c_str(), warning_suffix); + return Succeeded::no; + } + + //case PetImage: TODO this probably has subheaders? + if (mptr->mhptr->file_type != ByteVolume && + mptr->mhptr->file_type != PetVolume) + { + matrix_close(mptr); + warning("%s: %s has the wrong file type to be read as an image." + "%s", + warning_prefix, ECAT7_filename.c_str(), warning_suffix); + return Succeeded::no; + } + + const int matnum = mat_numcod (frame_num, 1, gate_num, data_num, bed_num); + MatrixData* matrix = matrix_read( mptr, matnum, MAT_SUB_HEADER); + + if (matrix==NULL) + { + matrix_close(mptr); + warning("%s: Matrix not found at \"%d,1,%d,%d,%d\" in file %s\n." + "%s", + warning_prefix, + frame_num, gate_num, data_num, bed_num, ECAT7_filename.c_str(), + warning_suffix); + return Succeeded::no; + } + + Image_subheader const * const sub_header_ptr= + reinterpret_cast(matrix->shptr); + + if(sub_header_ptr->num_dimensions != 3) + warning("%s: while reading matrix \"%d,1,%d,%d,%d\" in file %s:\n" + "Expected subheader_ptr->num_dimensions==3. Continuing\n", + warning_prefix, + frame_num, gate_num, data_num, bed_num, ECAT7_filename.c_str()); + dimensions = + CartesianCoordinate3D(matrix->zdim, + matrix->ydim, + matrix->xdim); + voxel_size = + CartesianCoordinate3D(matrix->z_size * 10, + matrix->y_size * 10, + matrix->pixel_size * 10); // convert to mm + + // TODO: next line assumes that the index-range for the image is contracted in a particular way. We'd really need to check that. + // At present, it will only be detected by test_OutputFileFormat + origin = + Coordinate3D(matrix->z_origin, + matrix->y_origin, + matrix->x_origin) * 10; // convert to mm + + + scale_factor = matrix->scale_factor; + + find_type_from_ECAT_data_type(type_of_numbers, byte_order, matrix->data_type); + + offset_in_file = + offset_in_ECAT_file(mptr, frame_num, 1, gate_num, data_num, bed_num, 0, NULL); + if (offset_in_ECAT_file<0) + { + free_matrix_data(matrix); + matrix_close(mptr); + warning("%s: while reading matrix \"%d,1,%d,%d,%d\" in file %s:\n" + "Error in determining offset into ECAT7 file %s.\n" + "%s", + warning_prefix, + frame_num, gate_num, data_num, bed_num, ECAT7_filename.c_str(), + warning_suffix); + return Succeeded::no; + } + + free_matrix_data(matrix); + matrix_close(mptr); + return Succeeded::yes; +} + +VoxelsOnCartesianGrid * +ECAT7_to_VoxelsOnCartesianGrid(const string& ECAT7_filename, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + const char * const warning_prefix = "ECAT7_to_VoxelsOnCartesianGrid"; + const char * const warning_suffix = "I'm not reading any data...\n"; + + CartesianCoordinate3D dimensions; + CartesianCoordinate3D voxel_size; + Coordinate3D origin; + float scale_factor; + NumericType type_of_numbers; + ByteOrder byte_order; + long offset_in_file; + if (get_ECAT7_image_info(dimensions, voxel_size, origin, + scale_factor, type_of_numbers, byte_order, offset_in_file, + + ECAT7_filename, + frame_num, gate_num, data_num, bed_num, + warning_prefix, + warning_suffix) == + Succeeded::no) + { + return 0; + } + + // WARNING: this has to be consistent with the writing + // in write_basic_interfile_header_for_ECAT7 and DiscretisedDensity_to_ECAT7 + const IndexRange3D range_3D (0,dimensions.z()-1, + -dimensions.y()/2,(-dimensions.y()/2)+dimensions.y()-1, + -dimensions.x()/2,(-dimensions.x()/2)+dimensions.x()-1); + VoxelsOnCartesianGrid* image_ptr = + new VoxelsOnCartesianGrid (range_3D, origin, voxel_size); + + std::ifstream data_in(ECAT7_filename.c_str(), ios::in | ios::binary); + if (!data_in) + { + warning("%s: cannot open %s using C++ ifstream.\n" + "%s", + warning_prefix, ECAT7_filename.c_str(), warning_suffix); + return 0; + } + + data_in.seekg(static_cast(offset_in_file)); + if (!data_in) + { + warning("%s: while reading %s:\n" + "error seeking to position of data.\n" + "%s", + warning_prefix, ECAT7_filename.c_str(), warning_suffix); + + return 0; + } + + { + float scale = float(1); + read_data(data_in, *image_ptr, type_of_numbers, scale, byte_order); + if (scale != 1) + { + warning("%s: while reading %s:\n" + "error in reading data with convertion to floats.\n", + "%s", + warning_prefix, ECAT7_filename.c_str(), warning_suffix); + + return 0; + } + } + *image_ptr *= scale_factor; + + return image_ptr; +} + +ProjDataFromStream* +ECAT7_to_PDFS(const string& ECAT7_filename, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + MatrixFile * const mptr = matrix_open( ECAT7_filename.c_str(), MAT_READ_ONLY, MAT_UNKNOWN_FTYPE); + if (!mptr) { + matrix_perror( ECAT7_filename.c_str()); + return 0; + } + const char * const warning_prefix = "ECAT7_to_PDFS"; + const char * const warning_suffix = "I'm not reading any data...\n"; + + if (mptr->mhptr->sw_version < V7) + { + warning("%s: %s seems to be an ECAT 6 file. " + "%s", warning_prefix, ECAT7_filename.c_str(), warning_suffix); + return 0; + } + const int matnum = mat_numcod (frame_num, 1, gate_num, data_num, bed_num); + MatrixData* matrix = matrix_read( mptr, matnum, MAT_SUB_HEADER); + + if (matrix==NULL) + { + matrix_close(mptr); + warning("%s: Matrix not found at \"%d,1,%d,%d,%d\" in file %s\n." + "%s", + warning_prefix, + frame_num, gate_num, data_num, bed_num, + ECAT7_filename.c_str(), warning_suffix); + return 0; + } + + shared_ptr stream_ptr( + new fstream(ECAT7_filename.c_str(), ios::in | ios::binary)); + + ProjDataFromStream * pdfs_ptr = + make_pdfs_from_matrix(mptr, matrix, stream_ptr); + free_matrix_data(matrix); + matrix_close(mptr); + return pdfs_ptr; +} + + +Succeeded +write_basic_interfile_header_for_ECAT7(string& interfile_header_filename, + const string& ECAT7_filename, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + + MatrixFile * const mptr = matrix_open( ECAT7_filename.c_str(), MAT_READ_ONLY, MAT_UNKNOWN_FTYPE); + if (!mptr) { + matrix_perror( ECAT7_filename.c_str()); + return Succeeded::no; + } + const char * const warning_prefix = "write_basic_interfile_header_for_ECAT7"; + const char * const warning_suffix = "I'm not writing an Interfile header...\n"; + + if (mptr->mhptr->sw_version < V7) + { + warning("%s: '%s' seems to be an ECAT 6 file. " + "%s", warning_prefix, ECAT7_filename.c_str(), warning_suffix); + return Succeeded::no; + } + + + char *header_filename = new char[ECAT7_filename.size() + 100]; + { + strcpy(header_filename, ECAT7_filename.c_str()); + // keep extension, just in case we would have conflicts otherwise + // but replace the . with a _ + const char * dot_ptr = strchr(find_filename(header_filename),'.'); + if (dot_ptr != NULL) + header_filename[dot_ptr - header_filename] = '_'; + // now add stuff to say which frame, gate, bed, data this was + sprintf(header_filename+strlen(header_filename), "_f%dg%dd%db%d", + frame_num, gate_num, data_num, bed_num); + } + + switch (mptr->mhptr->file_type) + { + //case PetImage: // TODO this probably has subheaders? + case ByteVolume: + case PetVolume: + { + CartesianCoordinate3D dimensions; + CartesianCoordinate3D voxel_size; + Coordinate3D origin; + float scale_factor; + NumericType type_of_numbers; + ByteOrder byte_order; + long offset_in_file; + if (get_ECAT7_image_info(dimensions, voxel_size, origin, + scale_factor, type_of_numbers, byte_order, offset_in_file, + + ECAT7_filename, + frame_num, gate_num, data_num, bed_num, + warning_prefix, + warning_suffix) == + Succeeded::no) + { + matrix_close(mptr); + return Succeeded::no; + } + + VectorWithOffset scaling_factors(1); + VectorWithOffset file_offsets(1); + scaling_factors[0] = scale_factor; + file_offsets[0] = static_cast(offset_in_file); + strcat(header_filename, ".hv"); + interfile_header_filename = header_filename; + // WARNING: this has to be consistent with the reading + // in ECAT7_to_VoxelsOnCartesianGrid + const IndexRange3D range_3D (0,dimensions.z()-1, + -dimensions.y()/2,(-dimensions.y()/2)+dimensions.y()-1, + -dimensions.x()/2,(-dimensions.x()/2)+dimensions.x()-1); + write_basic_interfile_image_header(header_filename, ECAT7_filename, + range_3D, voxel_size, origin, + type_of_numbers, byte_order, + scaling_factors, + file_offsets); + break; + } + + case AttenCor: + case Byte3dSinogram: + case Short3dSinogram: + case Float3dSinogram : + { + const int matnum = mat_numcod (frame_num, 1, gate_num, data_num, bed_num); + MatrixData* matrix = matrix_read( mptr, matnum, MAT_SUB_HEADER); + + if (matrix==NULL) + { + matrix_close(mptr); + warning("%s: Matrix not found at \"%d,1,%d,%d,%d\" in file '%s'.\n" + "%s", + warning_prefix, + frame_num, gate_num, data_num, bed_num, + ECAT7_filename.c_str(), warning_suffix); + return Succeeded::no; + } + + shared_ptr stream_ptr( + new fstream(ECAT7_filename.c_str(), ios::in | ios::binary)); + + shared_ptr pdfs_ptr(make_pdfs_from_matrix(mptr, matrix, stream_ptr)); + free_matrix_data(matrix); + + if (is_null_ptr(pdfs_ptr)) + { + matrix_close(mptr); + return Succeeded::no; + } + strcat(header_filename, ".hs"); + interfile_header_filename = header_filename; + write_basic_interfile_PDFS_header(header_filename, ECAT7_filename, *pdfs_ptr); + + break; + } + + default: + matrix_close(mptr); + warning("%s: File type not handled for file '%s'.\n" + "%s", + warning_prefix, ECAT7_filename.c_str(), warning_suffix); + return Succeeded::no; + } + + delete[] header_filename; + matrix_close(mptr); + return Succeeded::yes; +} + + +Succeeded +DiscretisedDensity_to_ECAT7(MatrixFile *mptr, + DiscretisedDensity<3,float> const & density, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + + const Main_header& mhead = *(mptr->mhptr); + DiscretisedDensityOnCartesianGrid<3,float> const & image = + dynamic_cast const&>(density); + + + if (mhead.file_type!= PetVolume) + { + warning("DiscretisedDensity_to_ECAT7: converting (f%d, g%d, d%d, b%d)\n" + "Main header.file_type should be ImageFile\n", + frame_num, gate_num, data_num, bed_num); + return Succeeded::no; + } + if (mhead.num_planes!=image.get_length()) + { + warning("DiscretisedDensity_to_ECAT7: converting (f%d, g%d, d%d, b%d)\n" + "Main header.num_planes should be %d\n", + frame_num, gate_num, data_num, bed_num,image.get_length()); + return Succeeded::no; + } + const float voxel_size_z = image.get_grid_spacing()[1]/10;// convert to cm + const float voxel_size_y = image.get_grid_spacing()[2]/10; + const float voxel_size_x = image.get_grid_spacing()[3]/10; + if (fabs(mhead.plane_separation - voxel_size_z) > 1.E-4) + { + warning("DiscretisedDensity_to_ECAT7: converting (f%d, g%d, d%d, b%d)\n" + "Main header.plane_separation should be %g\n", + frame_num, gate_num, data_num, bed_num,voxel_size_z); + return Succeeded::no; + } + + + Image_subheader ihead; + img_subheader_zero_fill(ihead); + + const int z_size= image.get_length(); + const int y_size= image[0].get_length(); + const int x_size= image[0][0].get_length(); + + // Setup subheader params + // ihead.data_type set by save_volume7; + ihead.x_dimension= x_size; + ihead.y_dimension= y_size; + ihead.z_dimension= z_size; + ihead.x_pixel_size= voxel_size_x; + ihead.y_pixel_size= voxel_size_y; + ihead.z_pixel_size= voxel_size_z; + + ihead.num_dimensions= 3; + // ECAT7 origin is somewhere in the middle of the image. + // It seems at present consistent with the STIR origin. + // WARNING this has to be consistent with reading (get_ECAT7_image_info) + const CartesianCoordinate3D ecat_origin = + image.get_physical_coordinates_for_indices(make_coordinate(0.F,0.F,0.F)); + ihead.x_offset= ecat_origin.x()/10; + ihead.y_offset= ecat_origin.y()/10; + ihead.z_offset= ecat_origin.z()/10; + shared_ptr scanner_ptr; + find_scanner(scanner_ptr, mhead); + + const float depth_of_interaction_factor = + 1 + + scanner_ptr->get_average_depth_of_interaction() / + scanner_ptr->get_inner_ring_radius(); + // note: CTI uses shead.x_resolution instead of mhead.bin_size + // but we don't have access to the sinogram here, and these 2 fields + // should be equal anyway. + ihead.recon_zoom= + mhead.bin_size/voxel_size_x * + scanner_ptr->get_default_num_arccorrected_bins()/ + float(image[0].size()) * + depth_of_interaction_factor; + + ihead.decay_corr_fctr= 1; + +#if 0 + // attempt to write this ourselves, but we'd need to write the subheader, and we + // don't have neat functions for written Arrays to FILE anyway (only to streams) + NumericType data_type; + ByteOrder byte_order; + find_type_from_ECAT_data_type(data_type, byte_order, mhead.data_type); + + const long offset_in_file = + offset_in_ECAT_file(mptr, frame, 1, gate, data, bed, 0, NULL); + + // KT 14/05/2002 added error check + if (offset_in_ECAT_file<0) + { + warning("Error in determining offset into ECAT file for segment %d (f%d, g%d, d%d, b%d)\n" + "No data written for this segment and all remaining segments\n", + segment_num, frame_num, gate_num, data_num, bed_num); + return Succeeded::no; + } if (fseek(mptr->fptr, offset_in_file, SEEK_SET) !=0) + { + warning("DiscretisedDensity_to_ECAT7: could not seek to file position %d\n" + "No data written for frame %d, gate %d, data %d, bed %d\n", + offset_in_file, + frame_num, gate_num,data_num, bed_num); + return Succeeded::no; + } + //TODO somehow write data + return Succeeded::no; +#else + // use LLN function + // easy, but wasteful: we need to copy the data first to a float buffer + // then save_volume7 makes a short buffer... + const unsigned int buffer_size = + static_cast(x_size)* + static_cast(y_size)* + static_cast(z_size); + auto_ptr float_buffer = + auto_ptr(new float[buffer_size]); + // save_volume7 does a swap in z, so we can't use the following + //copy(density.begin_all(), density.end_all(), float_buffer.get()); + { + float * current_buffer_pos = float_buffer.get(); + const unsigned int plane_size = + static_cast(x_size)* + static_cast(y_size); + for (int z=density.get_max_index(); z>= density.get_min_index(); --z) + { + copy(density[z].begin_all(), density[z].end_all(), current_buffer_pos); + current_buffer_pos += plane_size; + } + } + if (save_volume7(mptr, &ihead, float_buffer.get(), + frame_num, gate_num,data_num, bed_num) != 0) + { + warning("Error writing image to ECAT7 file.\n" + "No data written for frame %d, gate %d, data %d, bed %d\n", + frame_num, gate_num,data_num, bed_num); + return Succeeded::no; + } + else + { + return Succeeded::yes; + } +#endif +} + + +Succeeded +DiscretisedDensity_to_ECAT7(DiscretisedDensity<3,float> const & density, + string const & cti_name, string const&orig_name, + const Scanner& scanner, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + Main_header mhead; + make_ECAT7_main_header(mhead, scanner, orig_name, density); + + + MatrixFile* mptr= matrix_create (cti_name.c_str(), MAT_CREATE, &mhead); + if (mptr == 0) + return Succeeded::no; + Succeeded result = + DiscretisedDensity_to_ECAT7(mptr, + density, + frame_num, gate_num,data_num, bed_num); + + matrix_close(mptr); + return result; +} + + +Succeeded +update_ECAT7_subheader(MatrixFile *mptr, Scan_subheader& shead, + const MatDir& matdir) +{ + const int ERROR=-1; + if (mptr->mhptr->file_type != +#ifndef STIR_NO_NAMESPACES + ::Sinogram +#else + CTISinogram +#endif + ) + return Succeeded::no; + return + mat_write_scan_subheader(mptr->fptr, mptr->mhptr, matdir.strtblk, + &shead) == ERROR ? + Succeeded::no : Succeeded::yes; +} + + +Succeeded +update_ECAT7_subheader(MatrixFile *mptr, Norm_subheader& shead, const MatDir& matdir) +{ + const int ERROR=-1; + if (mptr->mhptr->file_type != Normalization) + return Succeeded::no; + return + mat_write_norm_subheader(mptr->fptr, mptr->mhptr, matdir.strtblk, + &shead) == ERROR ? + Succeeded::no : Succeeded::yes; +} + + +Succeeded +update_ECAT7_subheader(MatrixFile *mptr, Image_subheader& shead, const MatDir& matdir) +{ + const int ERROR=-1; + if (!(mptr->mhptr->file_type == PetImage || + mptr->mhptr->file_type == ByteVolume || + mptr->mhptr->file_type == PetVolume)) + return Succeeded::no; + return + mat_write_image_subheader(mptr->fptr, mptr->mhptr, matdir.strtblk, + &shead) == ERROR ? + Succeeded::no : Succeeded::yes; +} + +Succeeded +update_ECAT7_subheader(MatrixFile *mptr, Attn_subheader& shead, const MatDir& matdir) +{ + const int ERROR=-1; + if (mptr->mhptr->file_type != AttenCor) + return Succeeded::no; + return + mat_write_attn_subheader(mptr->fptr, mptr->mhptr, matdir.strtblk, + &shead) == ERROR ? + Succeeded::no : Succeeded::yes; +} + +Succeeded +update_ECAT7_subheader(MatrixFile *mptr, Scan3D_subheader& shead, const MatDir& matdir) +{ + const int ERROR=-1; + if (!(mptr->mhptr->file_type == Byte3dSinogram || + mptr->mhptr->file_type == Short3dSinogram || + mptr->mhptr->file_type == Float3dSinogram)) + return Succeeded::no; + return + mat_write_Scan3D_subheader(mptr->fptr, mptr->mhptr, matdir.strtblk, + &shead) == ERROR ? + Succeeded::no : Succeeded::yes; +} + +template +Succeeded +update_ECAT7_subheader(MatrixFile *mptr, SUBHEADER_TYPE& shead, + const int frame_num, const int gate_num, const int data_num, const int bed_num) +{ + const int ERROR=-1; + const int matnum = mat_numcod (frame_num, 1, gate_num, data_num, bed_num); + MatDir matdir; + if (matrix_find(mptr, matnum, &matdir) == ERROR) + return Succeeded::no; + + return update_ECAT7_subheader(mptr, shead, matdir); +} + +namespace detail +{ + +template +Succeeded +static +ProjData_to_ECAT7_help(MatrixFile *mptr, const NumericInfo& output_type_info, + ProjData const& proj_data, + const int frame_num, const int gate_num, + const int data_num, const int bed_num, + float scale_factor) +{ + const ByteOrder output_byte_order = + // output_type_info.integer_type() ? ByteOrder::get_native_order() : ByteOrder::big_endian; +ByteOrder::big_endian; + + const short int cti_data_type = + find_ECAT_data_type(output_type_info.type_id(), output_byte_order); + if (cti_data_type==0) + return Succeeded::no; + const Main_header& mhead = *(mptr->mhptr); + { + int num_planes = 0; + for(int segment_num=proj_data.get_min_segment_num(); + segment_num <= proj_data.get_max_segment_num(); + ++segment_num) + num_planes+= proj_data.get_num_axial_poss(segment_num); + + if (mhead.num_planes!=num_planes) // TODO check if this is the usual convention + { + warning("ProjData_to_ECAT7: converting (f%d, g%d, d%d, b%d)\n" + "Main header.num_planes should be %d", + frame_num, gate_num, data_num, bed_num,num_planes); + return Succeeded::no; + } + } + + + // If scale_factor is not set (=0) then calculate the scale factor to apply. + if ( scale_factor == 0.0 ) { + scale_factor = 1; + + // If a integers are being written, and the suppress_scaling + // find scale factor in case we're not writing floats + if (output_type_info.integer_type()) + { + scale_factor = 0;// set first to 0 to use maximum range of output type + for(int segment_num=proj_data.get_min_segment_num(); + segment_num <= proj_data.get_max_segment_num(); + ++segment_num) + { + const SegmentByView segment = + proj_data.get_segment_by_view(segment_num); + + find_scale_factor(scale_factor, + segment, + NumericInfo()); + } + } + } + + cout << "\nProjData_to_ECAT7: Will use scale factor " << scale_factor; + + Scan3D_subheader scan3d_shead; + Attn_subheader attn_shead; + + if (mhead.file_type == AttenCor) + { + make_subheader_for_ECAT7(attn_shead, mhead, *proj_data.get_proj_data_info_ptr()); + // Setup remaining subheader params + attn_shead.data_type= cti_data_type; + attn_shead.scale_factor= scale_factor; + attn_shead.storage_order = ElAxVwRd; + } + else + { + make_subheader_for_ECAT7(scan3d_shead, mhead, *proj_data.get_proj_data_info_ptr()); + // Setup remaining subheader params + scan3d_shead.data_type= cti_data_type; + scan3d_shead.loss_correction_fctr= 1.F; + scan3d_shead.scale_factor= scale_factor; + scan3d_shead.storage_order = ElAxVwRd; + // do frame times. + if (mhead.num_bed_pos>1) + { + // TODO not sure how to handle this + warning("Not filling in frame-start/duration for multi-bed position data in ECAT7 subheader"); + } + else + { + const ExamInfo& exam_info = *proj_data.get_exam_info_ptr(); + if (exam_info.time_frame_definitions.get_num_time_frames()==1) + { + // note: always use frame 1 for proj_data + const double frame_start_time = + exam_info.time_frame_definitions.get_start_time(1U) + + exam_info.start_time_in_secs_since_1970 - mhead.scan_start_time; + const double frame_duration = + exam_info.time_frame_definitions.get_duration(1U); + scan3d_shead.frame_start_time = static_cast(round(frame_start_time*1000.)); + scan3d_shead.frame_duration = static_cast(round(frame_duration*1000.)); + } + } + } + + // allocate space in file, and write subheader + { + const int ERROR=-1; + const int plane_size= proj_data.get_num_tangential_poss() * proj_data.get_num_views(); + + // TODO only ok if main_header.num_planes is set as above + int nblks = (mhead.num_planes*plane_size*sizeof(OutputType)+511)/512; + + /* 3D sinograms subheader use one more block */ + if (mptr->mhptr->file_type == Byte3dSinogram || + mptr->mhptr->file_type == Short3dSinogram || + mptr->mhptr->file_type == Float3dSinogram) nblks += 1; + + int matnum = mat_numcod (frame_num, 1, gate_num, data_num, bed_num); + struct MatDir matdir; + if (matrix_find(mptr, matnum, &matdir) == ERROR) + { + int blkno = mat_enter(mptr->fptr, mptr->mhptr, matnum, nblks) ; + if( blkno == ERROR ) return( Succeeded::no ); + matdir.matnum = matnum ; + matdir.strtblk = blkno ; + matdir.endblk = matdir.strtblk + nblks - 1 ; + matdir.matstat = 1 ; + insert_mdir(matdir, mptr->dirlist) ; + } + + if (mhead.file_type == AttenCor) + { + if (mat_write_attn_subheader(mptr->fptr, mptr->mhptr, matdir.strtblk, + &attn_shead) == ERROR) + return Succeeded::no; + } + else + { + if (mat_write_Scan3D_subheader(mptr->fptr, mptr->mhptr, matdir.strtblk, + &scan3d_shead) == ERROR) + return Succeeded::no; + } + + } + + cout<<"\nProcessing segment number:"; + + for(int segment_num=proj_data.get_min_segment_num(); + segment_num <= proj_data.get_max_segment_num(); + ++segment_num) + { + cout<<" "< segment = + proj_data.get_segment_by_view(segment_num); + + const long offset_in_file = + offset_in_ECAT_file(mptr, + frame_num, 1, gate_num, data_num, bed_num, + segment_num, NULL); + + if (offset_in_file<0) + { + warning("ProjData_to_ECAT7: Error in determining offset into ECAT file for segment %d (f%d, g%d, d%d, b%d)\n" + "Maybe the file is too big?\n" + "No data written for this segment and all remaining segments", + segment_num, frame_num, gate_num, data_num, bed_num); + return Succeeded::no; + } + + if (fseek(mptr->fptr, offset_in_file, SEEK_SET)) + { + warning("\nProjData_to_ECAT7: error in fseek for segment %d (f%d, g%d, d%d, b%d)\n" + "No data written for this segment and all remaining segments\n", + segment_num, frame_num, gate_num, data_num, bed_num); + return Succeeded::no; + } + for (int view_num=proj_data.get_min_view_num(); view_num<=proj_data.get_max_view_num(); ++view_num) + for (int ax_pos_num=proj_data.get_min_axial_pos_num(segment_num); ax_pos_num <= proj_data.get_max_axial_pos_num(segment_num); ++ax_pos_num) + { + if (write_data_with_fixed_scale_factor(mptr->fptr, + segment[view_num][ax_pos_num], + output_type_info, + scale_factor, + output_byte_order, + /*can_corrupt_data=*/true) + == Succeeded::no) + { + warning("ProjData_to_ECAT7: error in writing segment %d (f%d, g%d, d%d, b%d)\n" + "Not all data written for this segment and none for all remaining segments\n", + segment_num, frame_num, gate_num, data_num, bed_num); + return Succeeded::no; + } + } // end of loop over ax_pos_num + + + } // end of loop on segments + + cout << endl; + return Succeeded::yes; +} + +} // end of namespace detail + +Succeeded +ProjData_to_ECAT7(MatrixFile *mptr, ProjData const& proj_data, + const int frame_num, const int gate_num, + const int data_num, const int bed_num, + float scale_factor) +{ + switch (mptr->mhptr->file_type) + { + case AttenCor: + // always use float to prevent problems with CTI utilities + return + detail::ProjData_to_ECAT7_help(mptr, NumericInfo(), proj_data, + frame_num, gate_num,data_num, bed_num, scale_factor); + case Float3dSinogram: + return + detail::ProjData_to_ECAT7_help(mptr, NumericInfo(), proj_data, + frame_num, gate_num,data_num, bed_num, scale_factor); + case Short3dSinogram: + // Note: this relies on sizeof(short)==2. However, find_ECAT_data_type will find out later if this is not true + return + detail::ProjData_to_ECAT7_help(mptr, NumericInfo(), proj_data, + frame_num, gate_num,data_num, bed_num, scale_factor); + case Byte3dSinogram: + return + detail::ProjData_to_ECAT7_help(mptr, NumericInfo(), proj_data, + frame_num, gate_num,data_num, bed_num, scale_factor); + default: + warning("ProjData_to_ECAT7: unsupported file type %d. No data written.", + mptr->mhptr->file_type); + return Succeeded::no; + } + +} + +Succeeded +ProjData_to_ECAT7(ProjData const& proj_data, NumericType output_type, + string const & cti_name, string const & orig_name, + const int frame_num, const int gate_num, const int data_num, const int bed_num, + const bool write_as_attenuation, + float scale_factor) +{ + Main_header mhead; + + make_ECAT7_main_header(mhead, orig_name, + *proj_data.get_exam_info_ptr(), + *proj_data.get_proj_data_info_ptr(), + write_as_attenuation, output_type); + + MatrixFile *mptr= matrix_create(cti_name.c_str(), MAT_CREATE, &mhead); + + Succeeded result = + ProjData_to_ECAT7(mptr, proj_data, frame_num, gate_num,data_num, bed_num, scale_factor); + + matrix_close(mptr); + return result; +} + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif //#ifdef HAVE_LLN_MATRIX diff --git a/src/IO/stir_ecat_common.cxx b/src/IO/stir_ecat_common.cxx new file mode 100644 index 0000000000..2178ee84da --- /dev/null +++ b/src/IO/stir_ecat_common.cxx @@ -0,0 +1,191 @@ +// +// +/*! + \file + \ingroup ECAT + + \brief Implementation of routines which convert ECAT6 and ECAT7 things into our building blocks and vice versa. + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ByteOrder.h" +#include "stir/NumericType.h" +#include "stir/Scanner.h" +#include "stir/IO/stir_ecat_common.h" + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT + + +void find_type_from_ECAT_data_type(NumericType& type, ByteOrder& byte_order, const short data_type) +{ + switch(data_type) + { + case ECAT_Byte_data_type: + type = NumericType("signed integer", 1); + byte_order=ByteOrder::little_endian; + return; + case ECAT_I2_little_endian_data_type: + type = NumericType("signed integer", 2); + byte_order=ByteOrder::little_endian; + return; + case ECAT_I2_big_endian_data_type: + type = NumericType("signed integer", 2); + byte_order = ByteOrder::big_endian; + return; + case ECAT_R4_VAX_data_type: + type = NumericType("float", 4); + byte_order=ByteOrder::little_endian; + return; + case ECAT_R4_IEEE_big_endian_data_type: + type = NumericType("float", 4); + byte_order=ByteOrder::big_endian; + return; + case ECAT_I4_little_endian_data_type: + type = NumericType("signed integer", 4); + byte_order=ByteOrder::little_endian; + return; + case ECAT_I4_big_endian_data_type: + type = NumericType("signed integer", 4); + byte_order=ByteOrder::big_endian; + return; + default: + error("find_type_from_ecat_data_type: unsupported data_type: %d", data_type); + // just to avoid compiler warnings + return; + } +} + +short find_ECAT_data_type(const NumericType& type, const ByteOrder& byte_order) +{ + if (!type.signed_type()) + warning("find_ecat_data_type: ecat data support only signed types. Using the signed equivalent\n"); + if (type.integer_type()) + { + switch(type.size_in_bytes()) + { + case 1: + return ECAT_Byte_data_type; + case 2: + return byte_order==ByteOrder::big_endian ? ECAT_I2_big_endian_data_type : ECAT_I2_little_endian_data_type; + case 4: + return byte_order==ByteOrder::big_endian ? ECAT_I4_big_endian_data_type : ECAT_I4_little_endian_data_type; + default: + { + // write error message below + } + } + } + else + { + switch(type.size_in_bytes()) + { + case 4: + return byte_order==ByteOrder::big_endian ? ECAT_R4_IEEE_big_endian_data_type : ECAT_R4_VAX_data_type; + default: + { + // write error message below + } + } + } + string number_format; + size_t size_in_bytes; + type.get_Interfile_info(number_format, size_in_bytes); + error("find_ecat_data_type: ecat does not support data type '%s' of %d bytes.\n", + number_format.c_str(), size_in_bytes); + // just to satisfy compilers + return short(0); +} + +short find_ECAT_system_type(const Scanner& scanner) +{ + switch(scanner.get_type()) + { + case Scanner::E921: + return 921; + case Scanner::E925: + return 925; + + case Scanner::E931: + return 931; + + case Scanner::E951: + return 951; + + case Scanner::E953: + return 953; + + case Scanner::E961: + return 961; + + case Scanner::E962: + return 962; + + case Scanner::E966: + return 966; + + case Scanner::RPT: + return 128; + + case Scanner::RATPET: + return 42; + + default: + warning("\nfind_ecat_system_type: scanner \"%s\" currently unsupported. Returning 0.\n", + scanner.get_name().c_str()); + return 0; + } +} + +Scanner* find_scanner_from_ECAT_system_type(const short system_type) +{ + switch(system_type) + { + case 128 : + return new Scanner(Scanner::RPT); + case 921 : + return new Scanner(Scanner::E921); + case 925 : + return new Scanner(Scanner::E925); + case 931 : + case 12 : + return new Scanner(Scanner::E931); + case 951 : + return new Scanner(Scanner::E951); + case 953 : + return new Scanner(Scanner::E953); + case 961 : + return new Scanner(Scanner::E961); + case 962 : + return new Scanner(Scanner::E962); + case 966 : + return new Scanner(Scanner::E966); + case 42: + return new Scanner(Scanner::RATPET); + default : + return new Scanner(Scanner::Unknown_scanner); + } +} + +END_NAMESPACE_ECAT +END_NAMESPACE_STIR diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000000..c62fd0f442 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,278 @@ +# +# +# Author Kris Thielemans +# +# Copyright (C) 2004 - 2011-01-23 Hammersmith Imanet Ltd +# Copyright (C) 2013-01-01 - 2013, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# +# This makefile defines dependencies and rules for the +# following targets: +# how (gives brief usage info) +# all clean lib install install-all uninstall uninstall-all +# clean_tests clean_lib clean_exes +# run_tests run_interactive_tests +# +# It works by using the 'recursive makefile' scheme. +# It is set-up to recurse into $(LIBDIRS), $(EXEDIRS), $(TESTDIRS) +# from where it imports lib.mk, exe.mk and test.mk respectively. +# These 'sub'makefiles will define other targets such as +# EXESUBDIR, clean_exes_EXESUBDIR, install_exes_EXESUBDIR +# build_tests_TESTSUBDIR, clean_tests_TESTSUBDIR, +# run_tests_TESTSUBDIR, +# run_interactive_tests_TESTSUBDIR +# build_lib_LIBSUBDIR, clean_lib_LIBSUBDIR +# See lib.mk, exe.mk and test.mk in this directory for more details. +# +.PHONY: how all clean lib \ + install install-all install-exes install-lib install-include \ + uninstall uninstall-all uninstall-exes uninstall-lib uninstall-include \ + clean_tests clean_lib clean_exes \ + run_tests run_interactive_tests all_test_exes \ + print-make-vars \ + default_target + +WORKSPACE := $(CURDIR) + +# make sure that 'all' is also the first target and hence the default +default_target: all + +how: + @echo "Usage: make [target] [options]" + @echo "where useful targets are:" + @echo " all clean lib install install-all" + @echo " uninstall uninstall-all" + @echo " clean_tests clean_lib clean_exes " + @echo " run_tests run_interactive_tests" + @echo " print-make-vars" + @echo "and options can be for instance:" + @echo " BUILD=debug DEST=somenicedir/ INSTALL_PREFIX=/usr/local" + @echo "In addition, you can build all files in a directory with e.g." + @echo " make utilities" + @echo "or make a single file, e.g." + @echo " make utilities/stir_math" + @echo "See the STIR User's guide for more info." + + + +include config.mk + +LIBDIRS := +EXEDIRS := +TESTDIRS:= +-include stir_dirs.mk +-include local/extra_dirs.mk + +STIR_LIB:=$(DEST)$(LIB_PREFIX)stir$(LIB_SUFFIX) + +include $(addsuffix /lib.mk, $(LIBDIRS)) + + +# STIR_REGISTRIES should be set to all object files we want to +# explicitly link with (i.e. in addition to the library). +# In particular, this should include all files with +# global variables of type +# RegisteredParsingObject::RegisterIt +# We set it here such that the sub-Makefiles below can use it +STIR_REGISTRIES:=$(foreach dir, $(LIBDIRS), $($(dir)_REGISTRY_OBJS)) + +include $(addsuffix /exe.mk, $(EXEDIRS)) +include $(addsuffix /test.mk, $(TESTDIRS)) + + +all: $(EXEDIRS) + +clean_tests: $(addprefix clean_tests_, $(TESTDIRS)) + +clean_lib: $(addprefix clean_lib_, $(LIBDIRS)) + rm -f $(STIR_LIB) + +clean_exes: $(addprefix clean_exes_, $(EXEDIRS)) + +clean: clean_tests clean_lib clean_exes +# rm -rf $(DEST) + +install: all install-exes + +install-all: install-exes install-lib install-include + +uninstall: uninstall-exes + +uninstall-all: uninstall-exes uninstall-lib uninstall-include + +run_tests: $(addprefix run_tests_, $(TESTDIRS)) + +run_interactive_tests: $(addprefix run_interactive_tests_, $(TESTDIRS)) + +# next target is necessary to get $(dir)_run_tests to compile/link all its files first +all_test_exes: $(foreach dir, $(TESTDIRS), $($(dir)_TEST_EXES)) + +.PRECIOUS: $(DEST)*$(LIB_SUFFIX) + +lib: $(STIR_LIB) + +$(STIR_LIB): $(foreach dir, $(LIBDIRS), $($(dir)_LIB_OBJS)) +ifneq ("$(AR)","link") + $(AR) $(ARFLAGS) $(AR_OUTFLAG)$@ $? +ifeq ("$(IS_GNU_AR)","") + ranlib $@ +endif +else + $(AR) $(ARFLAGS) $(AR_OUTFLAG)$@ $^ +# link /lib seems to need a list of all .objs +endif + + + +install-exes: $(addprefix install_exes_, $(EXEDIRS)) + + +uninstall-exes: $(addprefix uninstall_exes_, $(EXEDIRS)) + +install-lib: lib $(STIR_REGISTRIES) + mkdir -p $(INSTALL_LIB_DIR) + $(INSTALL) $(STIR_LIB) $(STIR_REGISTRIES) $(INSTALL_LIB_DIR) + +uninstall-lib: + $(RM) $(addprefix $(INSTALL_LIB_DIR)/, $(notdir $(STIR_LIB) $(STIR_REGISTRIES))) + +install-include: + mkdir -p $(INSTALL_INCLUDE_DIR) + cp -R ${WORKSPACE}/include/stir $(INSTALL_INCLUDE_DIR) + @echo Check permissions for the files in $(INSTALL_INCLUDE_DIR)/stir + @echo Warning: boost include files are not copied + +uninstall-include: + $(RM) -r $(INSTALL_INCLUDE_DIR)/stir + +print-make-vars: + @echo CC: $(CC) + @echo CXX: $(CXX) + @echo LINK: $(LINK) + @echo CFLAGS: $(CFLAGS) + @echo LINKFLAGS: $(LINKFLAGS) + @echo SYS_LIBS: $(SYS_LIBS) + @echo AR: $(AR) + @echo ARFLAGS: $(ARFLAGS) + @echo DEST: $(DEST) + @echo INSTALL_PREFIX: $(INSTALL_PREFIX) + @echo INSTALL_EXE_DIR: $(INSTALL_EXE_DIR) + @echo INSTALL_LIB_DIR: $(INSTALL_LIB_DIR) + @echo INSTALL_INCLUDE_DIR: $(INSTALL_INCLUDE_DIR) + + +#********* default rules + +# These are the rules for compiling and linking. + +# There is some complicated trickery to get automatic dependency checking on +# .h and .inl files. This means that if you change only a .h file, make will +# still rebuild all .c and .cxx files that include this .h file (even indirectly). + +# To generate dependencies, we use -MM for gcc (or g++) and -M for other compilers +ifeq ($(CXX),g++) +MAKE_DEPEND_FLAG=-MM +else +ifeq ($(CC),gcc) +MAKE_DEPEND_FLAG=-MM +else +MAKE_DEPEND_FLAG=-M +endif +endif + +# default rule for making 'mini-Makefiles' with the dependency info +# for a single source file +# See http://make.paulandlesley.org/autodep.html + +ifneq ("$(IS_GCC_3)","") + +#$(warning Using rules for gcc 3 or later) + +# use gcc -MD -MP flags to obtain the .P files at the same time as the +# ordinary compilation + +${DEST}%.o : %.cxx + @ -mkdir -p $(dir $@); + $(CXX) $(CFLAGS) -o $@ ${MAKE_DEPEND_FLAG}D -MP -c $< + @ mv $(DEST)$(*).d $(DEST)$(*).P + +${DEST}%.o : %.c + @ -mkdir -p $(dir $@); + $(CC) $(CFLAGS) -o $@ ${MAKE_DEPEND_FLAG}D -MP -c $< ; + @ mv $(DEST)$(*).d $(DEST)$(*).P + +else + +#$(warning Using rules for non-gcc compilers (or gcc 2.*)) + +# we have to follow the original scheme of Paul D. Smith +# Modifications by KT: +# - handle DEST (in definition of df and by replacing the line "cp $(df.d) $(df.P)" +# to a sed line that inserts $(DEST) before the name of the .o file +# - declare a variable dotD2dotP with all the sed stuff to create the .P file. +# Note that to get this to work, I had to escape (i.e. put a backslash in front of) +# the # sign in Paul's sed pattern. Otherwise, make interpretes it as the start +# of a comment. + +df = $(DEST)$* + +# alternative choices for MAKEDEPEND +ifeq ("$(IS_MS_VC)","") +# normal case +MAKEDEPENDCXX = $(CXX) $(MAKE_DEPEND_FLAG) $(CFLAGS) $< > $(df).d +MAKEDEPENDC = $(CC) $(MAKE_DEPEND_FLAG) $(CFLAGS) $< > $(df).d +else +# use when your compiler cannot generate dependencies in text form +# (Visual C++ can generate a database file, but we cannot read that) +# of course, this only works when you have makedepend, touch, sed + +# the -Y option disables looking for system includes +MAKEDEPENDCXX = touch $(df).d && makedepend $(CFLAGS) -f $(df).d $< -Y -o$(O_SUFFIX) 2> /dev/null +MAKEDEPENDC = $(MAKEDEPENDCXX) +endif + +dotD2dotP = sed -e 's&$(*F)\.o&$(DEST)$(*).o&' < $(df).d > $(df).P; \ + sed -e 's/\#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ + -e '/^$$/ d' -e 's/$$/ :/' < $(df).d >> $(df).P; \ + $(RM) $(df).d + + +${DEST}%${O_SUFFIX} : %.cxx + @ -mkdir -p $(dir $@); +ifeq ("$(DISABLE_DEPENDENCY_GENERATION)","") + $(MAKEDEPENDCXX);$(dotD2dotP); +endif + $(CXX) $(CFLAGS) ${O_OUTFLAG}$@ -c $< + +${DEST}%${O_SUFFIX} : %.c + @ -mkdir -p $(dir $@); +ifeq ("$(DISABLE_DEPENDENCY_GENERATION)","") + $(MAKEDEPENDC); $(dotD2dotP); +endif + $(CC) $(CFLAGS) ${O_OUTFLAG}$@ -c $< + + +endif # GCC3 + +# Default rule for making executables +# Note: this rule has to occur AFTER the definition of the macros +# occuring in the dependencies. +# Otherwise the value of the macros is empty when +# checking the dependencies (even when they are alright when +# executing the corresponding command) +${DEST}%: ${DEST}%${O_SUFFIX} $(STIR_LIB) $(STIR_REGISTRIES) $(EXTRA_LIBS) + ${LINK} ${EXE_OUTFLAG}${@}$(EXE_SUFFIX) $< $(STIR_REGISTRIES) $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) +# DO NOT DELETE diff --git a/src/Makefile_common_system_type b/src/Makefile_common_system_type new file mode 100644 index 0000000000..b748b8e1b8 --- /dev/null +++ b/src/Makefile_common_system_type @@ -0,0 +1,52 @@ +# +# +# find out which system we are on +# sets SYSTEM to LINUX, DARWIN, CYGWIN, AIX, SUN, CC, AP3000 +# +# Alexey Zverovich +# Kris Thielemans + +# first check on cygwin +ifdef OSTYPE +ifneq (,$(findstring cygwin, $(OSTYPE))) +SYSTEM = CYGWIN +endif +endif + +# if SYSTEM wasn't set, check using uname +ifndef SYSTEM + +__TEST_OS = $(shell uname) +ifeq ($(__TEST_OS),Linux) +SYSTEM = LINUX +else +ifeq ($(__TEST_OS),Darwin) +SYSTEM = LINUX +else +ifeq ($(__TEST_OS),AIX) +__TEST_EPX =$(shell csh -f -c "if (-e /epx) echo 1") +ifeq ($(__TEST_EPX),1) +SYSTEM = CC +else +SYSTEM = AIX +endif +else +ifneq (,$(findstring CYGWIN, $(__TEST_OS))) +SYSTEM = CYGWIN +else +ifeq ($(__TEST_OS),SunOS) +# test if this is the Fujitsu parallel processor +# TODO +__TEST_AP = 0# $(shell csh -f -c "if (-e `which aprun`) echo 1") +ifeq ($(__TEST_AP),1) +SYSTEM = AP3000 +else +SYSTEM = SUN +endif +endif +endif +endif +endif +endif + +endif # ifndef SYSTEM diff --git a/src/Shape_buildblock/Box3D.cxx b/src/Shape_buildblock/Box3D.cxx new file mode 100644 index 0000000000..32f6a7c026 --- /dev/null +++ b/src/Shape_buildblock/Box3D.cxx @@ -0,0 +1,184 @@ +// +// +/* + Copyright (C) 2005- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Non-inline implementations for class stir::Box3D + + \author C. Ross Schmidtlein + \author Kris Thielemans (brought up-to-date to STIR 2.0) +*/ +#include "stir/Shape/Box3D.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +const char * const +Box3D::registered_name = "Box3D"; + +void +Box3D::initialise_keymap() +{ + parser.add_start_key("box parameters"); + parser.add_key("length-x (in mm)", &length_x); + parser.add_key("length-y (in mm)", &length_y); + parser.add_key("length-z (in mm)", &length_z); + parser.add_stop_key("END"); + Shape3DWithOrientation::initialise_keymap(); +} + +void +Box3D::set_defaults() +{ + Shape3DWithOrientation::set_defaults(); + length_x=0; + length_y=0; + length_z=0; +} + +bool +Box3D:: +post_processing() +{ + if (Shape3DWithOrientation::post_processing()==true) + return true; + + if (length_x <= 0) + { + warning("length_x should be positive, but is %g\n", length_x); + return true; + } + if (length_y <= 0) + { + warning("length_y should be positive, but is %g\n", length_y); + return true; + } + if (length_z <= 0) + { + warning("length_z should be positive, but is %g\n", length_z); + return true; + } + return false; +} + +Box3D::Box3D() +{ + set_defaults(); +} + +Box3D::Box3D(const float length_xv, + const float length_yv, + const float length_zv, + const CartesianCoordinate3D& centre_v, + const Array<2,float>& direction_vectors) + : + length_x(length_xv), + length_y(length_yv), + length_z(length_zv) +{ + this->set_origin(centre_v); + if (this->set_direction_vectors(direction_vectors) == Succeeded::no) + error("Box3D constructor called with wrong direction_vectors"); +} +#if 0 + +Box3D::Box3D(const float length_xv, + const float length_yv, + const float length_zv, + const CartesianCoordinate3D& centre_v, + const float alpha_v, + const float beta_v, + const float gamma_v) + : + length_x(length_xv), + length_y(length_yv), + length_z(length_zv) +{ + this->set_origin(centre_v); + this->set_directions_from_Euler_angles(alpha_v, beta_v, gamma_v); +} + +#endif + +bool Box3D::is_inside_shape(const CartesianCoordinate3D& coord) const +{ + const CartesianCoordinate3D r = + this->transform_to_shape_coords(coord); + + const float distance_along_x_axis= r.x(); + const float distance_along_y_axis= r.y(); + const float distance_along_z_axis= r.z(); + + return + fabs(distance_along_x_axis)(length_x*length_y*length_z) / this->get_volume_of_unit_cell(); +} + + +#if 0 +// doesn't take scaling into account +float +Box3D:: +get_geometric_area()const +{ + return static_cast(2*(length_x*length_y+length_x + *length_z+length_y*length_z)); +} +#endif + +Shape3D* +Box3D:: +clone() const +{ + return static_cast(new Box3D(*this)); +} + +bool +Box3D:: +operator==(const Box3D& box) const +{ + const float tolerance = + std::min(length_z, std::min(length_x, length_y))/1000; + return + std::fabs(this->length_x - box.length_x) < tolerance + && std::fabs(this->length_y - box.length_y) < tolerance + && std::fabs(this->length_z - box.length_z) < tolerance + && Shape3DWithOrientation::operator==(box); +} + +bool +Box3D:: +operator==(const Shape3D& shape) const +{ + Box3D const * box_ptr = + dynamic_cast(&shape); + return + box_ptr != 0 && (*this == *box_ptr); +} + +END_NAMESPACE_STIR diff --git a/src/Shape_buildblock/CMakeLists.txt b/src/Shape_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..1aaef4df04 --- /dev/null +++ b/src/Shape_buildblock/CMakeLists.txt @@ -0,0 +1,20 @@ +# +# +set(dir Shape_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + Shape3D + DiscretisedShape3D + Shape3DWithOrientation + Ellipsoid + EllipsoidalCylinder + Box3D +) + +#$(dir)_REGISTRY_SOURCES:= $(dir)_registries + +include(stir_lib_target) + +target_link_libraries(Shape_buildblock buildblock IO ) diff --git a/src/Shape_buildblock/DiscretisedShape3D.cxx b/src/Shape_buildblock/DiscretisedShape3D.cxx new file mode 100644 index 0000000000..f3ab021a03 --- /dev/null +++ b/src/Shape_buildblock/DiscretisedShape3D.cxx @@ -0,0 +1,186 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Non-inline implementations for class stir::DiscretisedShape3D + + \author Kris Thielemans +*/ +#include "stir/Shape/DiscretisedShape3D.h" +#include "stir/round.h" +#include "stir/zoom.h" +#include "stir/is_null_ptr.h" +#include "stir/IO/read_from_file.h" +START_NAMESPACE_STIR + +void +DiscretisedShape3D:: +set_origin(const CartesianCoordinate3D& new_origin) +{ + assert(this->get_origin() == density_ptr->get_origin()); + Shape3D::set_origin(new_origin); + density_ptr->set_origin(new_origin); +} + +// TODO check code +float +DiscretisedShape3D:: +get_voxel_weight( + const CartesianCoordinate3D& voxel_centre, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& num_samples) const +{ + assert(this->get_origin() == density_ptr->get_origin()); + + assert(voxel_size == image().get_voxel_size()); + const CartesianCoordinate3D r = + this->density_ptr->get_index_coordinates_for_physical_coordinates(voxel_centre); + + const int x = round(r.x()); + const int y = round(r.y()); + const int z = round(r.z()); + // check that r points to the middle of a voxel + assert(fabs(x-r.x())<=1E-6); + assert(fabs(y-r.y())<=1E-6); + assert(fabs(z-r.z())<=1E-6); + if ( z <= image().get_max_z() && z >= image().get_min_z() && + y <= image().get_max_y() && y >= image().get_min_y() && + x <= image().get_max_x() && x >= image().get_min_x()) + return image()[z][y][x]; + else + return 0.F; +} + +bool +DiscretisedShape3D:: +is_inside_shape(const CartesianCoordinate3D& coord) const +{ + assert(this->get_origin() == density_ptr->get_origin()); + return + get_voxel_weight(coord, + image().get_voxel_size(), + CartesianCoordinate3D(1,1,1)) > 0; +} + +void +DiscretisedShape3D:: +construct_volume(VoxelsOnCartesianGrid &new_image, const CartesianCoordinate3D& num_samples) const +{ + zoom_image(new_image, this->image()); + const float factor = + (image().get_voxel_size().x()*image().get_voxel_size().y()*image().get_voxel_size().z())/ + (new_image.get_voxel_size().x()*new_image.get_voxel_size().y()*new_image.get_voxel_size().z()); + if (fabs(factor-1)>.01) + new_image *= factor; +} + +Shape3D* +DiscretisedShape3D:: +clone() const +{ + assert(this->get_origin() == density_ptr->get_origin()); + + return new DiscretisedShape3D(*this); +} + +DiscretisedDensity<3,float>& +DiscretisedShape3D:: +get_discretised_density() +{ + return *density_ptr; +} + +const DiscretisedDensity<3,float>& +DiscretisedShape3D:: +get_discretised_density() const +{ + return *density_ptr; +} + +DiscretisedShape3D:: +DiscretisedShape3D() +{ + set_defaults(); +} + +DiscretisedShape3D:: +DiscretisedShape3D(const VoxelsOnCartesianGrid& image_v) + : density_ptr(image_v.clone()) +{ + this->set_origin(image_v.get_origin()); + this->filename = "FROM MEMORY"; +} + + + +DiscretisedShape3D:: +DiscretisedShape3D(const shared_ptr >& density_ptr_v) + : density_ptr(density_ptr_v) +{ + if(dynamic_cast *>(density_ptr.get()) == NULL) + { + error("DiscretisedShape3D can currently only handle images of type VoxelsOnCartesianGrid.\n"); + } + this->set_origin(density_ptr_v->get_origin()); + this->filename = "FROM MEMORY"; +} + + +void +DiscretisedShape3D::initialise_keymap() +{ + Shape3D::initialise_keymap(); + parser.add_start_key("Discretised Shape3D Parameters"); + parser.add_key("input filename", &filename); + parser.add_stop_key("END"); +} + + + +void +DiscretisedShape3D::set_defaults() +{ + Shape3D::set_defaults(); +} + +bool +DiscretisedShape3D:: +post_processing() +{ + if (Shape3D::post_processing()==true) + return true; + + density_ptr = read_from_file >(filename); + if (!is_null_ptr(density_ptr)) + { + if (this->get_origin() != density_ptr->get_origin()) + { + warning("DiscretisedShape3D: Shape3D::origin and image origin are inconsistent. Using origin from image\n"); + this->set_origin(density_ptr->get_origin()); + } + } + return is_null_ptr(density_ptr); +} + +const char * const +DiscretisedShape3D::registered_name = "Discretised Shape3D"; + +END_NAMESPACE_STIR diff --git a/src/Shape_buildblock/Ellipsoid.cxx b/src/Shape_buildblock/Ellipsoid.cxx new file mode 100644 index 0000000000..22ac330b79 --- /dev/null +++ b/src/Shape_buildblock/Ellipsoid.cxx @@ -0,0 +1,172 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Non-inline implementations for class stir::Ellipsoid + + \author Sanida Mustafovic +*/ +#include "stir/Shape/Ellipsoid.h" +#include "stir/numerics/MatrixFunction.h" +#include "stir/Succeeded.h" +#include + +START_NAMESPACE_STIR + +const char * const +Ellipsoid::registered_name = "Ellipsoid"; + + +void +Ellipsoid::initialise_keymap() +{ + parser.add_start_key("Ellipsoid Parameters"); + parser.add_key("radius-x (in mm)", &radii.x()); + parser.add_key("radius-y (in mm)", &radii.y()); + parser.add_key("radius-z (in mm)", &radii.z()); + parser.add_stop_key("END"); + Shape3DWithOrientation::initialise_keymap(); +} + + + +void +Ellipsoid::set_defaults() +{ + Shape3DWithOrientation::set_defaults(); + radii.fill(0); +} + + +bool +Ellipsoid:: +post_processing() +{ + if (Shape3DWithOrientation::post_processing()==true) + return true; + + if (radii.x() <= 0) + { + warning("radii.x() should be positive, but is %g\n", radii.x()); + return true; + } + if (radii.y() <= 0) + { + warning("radii.y() should be positive, but is %g\n", radii.y()); + return true; + } + if (radii.z() <= 0) + { + warning("radii.z() should be positive, but is %g\n", radii.z()); + return true; + } + return false; +} + +Ellipsoid::Ellipsoid() +{ + set_defaults(); +} + +Ellipsoid::Ellipsoid(const CartesianCoordinate3D& radii_v, + const CartesianCoordinate3D& centre_v, + const Array<2,float>& direction_vectors) + : + radii(radii_v) +{ + assert(radii.x() > 0); + assert(radii.y() > 0); + assert(radii.z() > 0); + this->set_origin(centre_v); + if (this->set_direction_vectors(direction_vectors) == Succeeded::no) + error("Ellipsoid constructor called with wrong direction_vectors"); +} + +void +Ellipsoid:: +set_radii(const CartesianCoordinate3D& new_radii) +{ + radii = new_radii; + assert(radii.x() > 0); + assert(radii.y() > 0); + assert(radii.z() > 0); +} + +float Ellipsoid::get_geometric_volume() const + { + return static_cast((4*radii.x()*radii.y()*radii.z()*_PI)/3) / get_volume_of_unit_cell(); + } + +#if 0 +// formula is incorrect except when it's a sphere +// also, scaling of axes does not simply scale area +float +Ellipsoid:: +get_geometric_area()const +{ + return static_cast(4*std::pow(radii.x()*radii.y()*radii.z() / get_volume_of_unit_cell(),2.F/3)*_PI); +} +#endif + +bool Ellipsoid::is_inside_shape(const CartesianCoordinate3D& coord) const + +{ + const CartesianCoordinate3D r = + this->transform_to_shape_coords(coord); + + if (norm_squared(r / this->radii)<=1) + return true; + else + return false; +} + + +Shape3D* Ellipsoid:: clone() const +{ + return static_cast(new Ellipsoid(*this)); +} + +bool +Ellipsoid:: +operator==(const Ellipsoid& cylinder) const +{ + const float tolerance = + std::min(radii.z(), std::min(radii.x(), radii.y()))/1000; + return + std::fabs(this->radii.x() - cylinder.radii.x()) < tolerance + && std::fabs(this->radii.y() - cylinder.radii.y()) < tolerance + && std::fabs(this->radii.z() - cylinder.radii.z()) < tolerance + && Shape3DWithOrientation::operator==(cylinder); +; +} + +bool +Ellipsoid:: +operator==(const Shape3D& shape) const +{ + Ellipsoid const * cylinder_ptr = + dynamic_cast(&shape); + return + cylinder_ptr != 0 && (*this == *cylinder_ptr); +} + + +END_NAMESPACE_STIR diff --git a/src/Shape_buildblock/EllipsoidalCylinder.cxx b/src/Shape_buildblock/EllipsoidalCylinder.cxx new file mode 100644 index 0000000000..0d93001e4c --- /dev/null +++ b/src/Shape_buildblock/EllipsoidalCylinder.cxx @@ -0,0 +1,377 @@ +// +// +/* + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Non-inline implementations for class stir::EllipsoidalCylinder + + \author Sanida Mustafovic + \author Kris Thielemans + \author C. Ross Schmidtlein (Added new parsing commands and functions so that a + sector of a cylinder can be defined and updated the + associated tests and volume and area calculations.)_ + +*/ +#include "stir/Shape/EllipsoidalCylinder.h" +#include "stir/numerics/MatrixFunction.h" +#include "stir/Succeeded.h" +#include +#include + +START_NAMESPACE_STIR + +const char * const +EllipsoidalCylinder::registered_name = "Ellipsoidal Cylinder"; + +void +EllipsoidalCylinder::initialise_keymap() +{ + parser.add_start_key("Ellipsoidal Cylinder Parameters"); + parser.add_key("radius-x (in mm)", &radius_x); + parser.add_key("radius-y (in mm)", &radius_y); + parser.add_key("length-z (in mm)", &length); + parser.add_key("initial angle (in deg)", &theta_1); + parser.add_key("final angle (in deg)", &theta_2); + parser.add_stop_key("END"); + Shape3DWithOrientation::initialise_keymap(); +} + +void +EllipsoidalCylinder::set_defaults() +{ + Shape3DWithOrientation::set_defaults(); + radius_x=0; + radius_y=0; + length=0; + theta_1=0.0; + theta_2=360.0; +} + +bool +EllipsoidalCylinder:: +post_processing() +{ + if (Shape3DWithOrientation::post_processing()==true) + return true; + + if (radius_x <= 0) + { + warning("radius_x should be positive, but is %g\n", radius_x); + return true; + } + if (radius_y <= 0) + { + warning("radius_y should be positive, but is %g\n", radius_y); + return true; + } + if (length <= 0) + { + warning("length-z should be positive, but is %g\n", length); + return true; + } + if ((theta_1 < 0)||(theta_1>=360)) + { + warning("initial theta should be positive or less than 360 deg., but is %g\n", theta_1); + return true; + } + if ((theta_2 < 0)||(theta_2>360)) + { + warning("final theta should be positive or less than 360 deg., but is %g\n", theta_2); + return true; + } + return false; +} + + + +EllipsoidalCylinder::EllipsoidalCylinder() +{ + set_defaults(); +} + +EllipsoidalCylinder::EllipsoidalCylinder(const float length_v, + const float radius_xv, + const float radius_yv, + const CartesianCoordinate3D& centre_v, + const Array<2,float>& direction_vectors) + : + length(length_v), + radius_x(radius_xv), + radius_y(radius_yv), + theta_1(0.0F), + theta_2(360.0F) + + +{ + assert(length>0); + assert(radius_x>0); + assert(radius_y>0); + this->set_origin(centre_v); + if (this->set_direction_vectors(direction_vectors) == Succeeded::no) + error("Ellipsoid constructor called with wrong direction_vectors"); +} + +EllipsoidalCylinder::EllipsoidalCylinder(const float length_v, + const float radius_xv, + const float radius_yv, + const float theta_1v, + const float theta_2v, + const CartesianCoordinate3D& centre_v, + const Array<2,float>& direction_vectors) + : + length(length_v), + radius_x(radius_xv), + radius_y(radius_yv), + theta_1(theta_1v), + theta_2(theta_2v) + + +{ + assert(length>0); + assert(radius_x>0); + assert(radius_y>0); + this->set_origin(centre_v); + if (this->set_direction_vectors(direction_vectors) == Succeeded::no) + error("Ellipsoid constructor called with wrong direction_vectors"); +} + +void +EllipsoidalCylinder:: +set_length(const float new_length) +{ + assert(new_length>0); + length = new_length; +} + +void +EllipsoidalCylinder:: +set_radius_x(const float new_radius_x) +{ + assert(new_radius_x>0); + radius_x = new_radius_x; +} + +void +EllipsoidalCylinder:: +set_radius_y(const float new_radius_y) +{ + assert(new_radius_y>0); + radius_y = new_radius_y; +} + + + +bool EllipsoidalCylinder::is_inside_shape(const CartesianCoordinate3D& coord) const + +{ + const CartesianCoordinate3D r = + this->transform_to_shape_coords(coord); + + const float distance_along_axis= r.z(); + + if (fabs(distance_along_axis)(_PI*theta_1/180.0); + const float phi_2 = + static_cast(_PI*theta_2/180.0); + // Adding theta cuts for partial cylinders from theta_1 to theta_2 + float theta_r = atan2(y_pos,x_pos); + if (theta_r < 0.0) + theta_r = static_cast(2.0 * _PI + theta_r); + return + (((phi_1 < phi_2)&&((theta_r >= phi_1)&&(theta_r <= phi_2))) || + ((phi_1 > phi_2)&&((theta_r >= phi_1)||(theta_r <= phi_2)))); + } + else + return false; + } + else return false; +} + +float +EllipsoidalCylinder:: +get_geometric_volume()const + { + const float volume_of_unit_cell = this->get_volume_of_unit_cell(); + float A1=0, A2=0; + float T1 = theta_1; + float T2 = theta_2; + if (theta_1 == theta_2) + { + T1 = 0.0; + T2 = 360.0; + } + if (theta_1 == 360.0) T1 = 0.0; + if (theta_2 == 0.0) T2 = 360.0; + const float phi_1 = static_cast(T1*_PI/180.0); + const float phi_2 = static_cast(T2*_PI/180.0); + + // Begin Volume Calculation + if (T1 == 0.0 && T2 == 360.0) + return static_cast(_PI*radius_x*radius_y*length/volume_of_unit_cell); + if (radius_x == radius_y) + { + if (T1 < T2) + return static_cast(_PI*radius_x*radius_y*length* + (T2-T1)/360.0/volume_of_unit_cell); + else + return static_cast(_PI*radius_x*radius_y*length* + (360.0-T1+T2)/360.0/volume_of_unit_cell); + } + + if (T2 >= 0.0 && T2 < 90.0) //branch one + A2 = atan2(radius_x/radius_y * fabs(tan(phi_2)),1); + if (T2 >= 90.0 && T2 < 180.0) //branch two + A2 = atan2(radius_x/radius_y * fabs(tan(phi_2)),-1); + if (T2 >= 180.0 && T2 < 270.0) //branch three + A2 = static_cast(2*_PI + atan2(-radius_x/radius_y * fabs(tan(phi_2)),-1)); + if (T2 >= 270.0 && T2 <= 360.0) //branch four + A2 = static_cast(2*_PI + atan2(-radius_x/radius_y * fabs(tan(phi_2)),1)); + + if (T1 >= 0.0 && T1 < 90.0) //branch one + A1 = atan2(radius_x/radius_y * fabs(tan(phi_1)),1); + if (T1 >= 90.0 && T1 < 180.0) //branch two + A1 = atan2(radius_x/radius_y * fabs(tan(phi_1)),-1); + if (T1 >= 180.0 && T1 < 270.0) //branch three + A1 = static_cast(2*_PI + atan2(-radius_x/radius_y * fabs(tan(phi_1)),-1)); + if (T1 >= 270.0 && T1 <= 360.0) //branch four + A1 = static_cast(2*_PI + atan2(-radius_x/radius_y * fabs(tan(phi_1)),1)); + + if (T1 > T2) + return static_cast(radius_x*radius_y/2.0* + (2.0*_PI - A2 + A1)*length/volume_of_unit_cell); + + return static_cast(radius_x*radius_y/2.0*(A2-A1)*length/volume_of_unit_cell); + } + +#if 0 +// scaling of axes does not simply scale area +float +EllipsoidalCylinder:: +get_geometric_area()const +{ + float T1 = theta_1, T2 = theta_2; + if (theta_1 == theta_2) + { + T1 = 0.0; + T2 = 360.0; + } + if (theta_1 == 360.0) T1 = 0.0; + if (theta_2 == 0.0) T2 = 360.0; + const float phi_1 = T1*_PI/180.0; + const float phi_2 = T2*_PI/180.0; + + // Begin Surface Area Calculation + if (radius_x == radius_y) + { + if (theta_1 < theta_2) + return static_cast((2.0*_PI*radius_x*length + 2.0*_PI*radius_x*radius_y) + *(theta_2-theta_1)/360.0); + else + return static_cast((2.0*_PI*radius_x*length + 2.0*_PI*radius_x*radius_y) + *(360.0-theta_1+theta_2)/360.0); + } + if (theta_1 == 0.0 && theta_2 == 360.0) + { + // Surface Area Uses Cantrell's approximation based upon + // Ramanujan's second approximation plus the area of the end caps + float h = (radius_x - radius_y)/(radius_x + radius_y); + h = h*h; + float P = _PI*(radius_x + radius_y)*(1.0 + 3.0 * h/(10.0 + sqrt(4.0 - 3.0 * h)) + + 4 * pow(h,12) * (1.0/_PI - 7.0/22.0)); + return static_cast(P * length + 2.0 * _PI * radius_x * radius_y); + } + + // Simpson's Rule for an elliptic integral of the second kind + // int(a*sqrt(1-e^2*sin^2(theta)),theta=phi_1...phi_2) + // a = semi-major axis, b = semi-minor axis, e = eccentricty := 1-(b/a)^2, w/ b<=a + const int n = 500;// n is arbitrailly set to ensure good accuracy + const float dx = (phi_2 - phi_1)/static_cast(n); + float a = radius_x; + float b = radius_y; + + if (radius_x < radius_y) + { + a = radius_y; + b = radius_x; + } + const float e2 = 1.0 - b*b/(a*a); + + float f = 0; + f = sqrt(1.0 - e2 * sin(phi_1) * sin(phi_1)); + for (int j = 1; j <= n - 1 ; j = j + 2) + f = f + 4.0 * sqrt(1.0 - e2 * sin(phi_1 + j * dx) * sin(phi_1 + j * dx)); + for (int j = 2; j <= n - 2 ; j = j + 2) + f = f + 2.0 * sqrt(1.0 - e2 * sin(phi_1 + j * dx) * sin(phi_1 + j * dx)); + f = dx * a / 3.0 * (f + sqrt(1.0 - e2 * sin(phi_2) * sin(phi_2))); + + float r_1 = sqrt(radius_x*radius_x*(cos(phi_1)*cos(phi_1)) + + radius_y*radius_y*(sin(phi_1)*sin(phi_1))); + float r_2 = sqrt(radius_x*radius_x*(cos(phi_2)*cos(phi_2)) + + radius_y*radius_y*(sin(phi_2)*sin(phi_2))); + + float area = get_geometric_volume()/length; + + return static_cast((f+r_1+r_2)*length + 2.0*area); +} +#endif + +Shape3D* +EllipsoidalCylinder:: +clone() const +{ + return static_cast(new EllipsoidalCylinder(*this)); +} + +bool +EllipsoidalCylinder:: +operator==(const EllipsoidalCylinder& cylinder) const +{ + const float tolerance = + std::min(length, std::min(radius_x, radius_y))/1000; + return + std::fabs(this->length - cylinder.length) < tolerance + && std::fabs(this->radius_x - cylinder.radius_x) < tolerance + && std::fabs(this->radius_y - cylinder.radius_y) < tolerance + && std::fabs(theta_1 - cylinder.theta_1) < .1F + && std::fabs(theta_2 - cylinder.theta_2) < .1F + && Shape3DWithOrientation::operator==(cylinder); + +; +} + +bool +EllipsoidalCylinder:: +operator==(const Shape3D& shape) const +{ + EllipsoidalCylinder const * cylinder_ptr = + dynamic_cast(&shape); + return + cylinder_ptr != 0 && (*this == *cylinder_ptr); +} + +END_NAMESPACE_STIR diff --git a/src/Shape_buildblock/RegisteredObject.cxx b/src/Shape_buildblock/RegisteredObject.cxx new file mode 100644 index 0000000000..000beadb7c --- /dev/null +++ b/src/Shape_buildblock/RegisteredObject.cxx @@ -0,0 +1,59 @@ +// +// +/*! + + \file + \ingroup Shape3D + \brief instantiations of RegisteredObject for classes in Shape_buildblock + (only useful for Microsoft Visual Studio 6.0) + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +// note: include has to be before #ifdef as it's in this file that +// __STIR_REGISTRY_NOT_INLINE is defined +#include "stir/RegisteredObject.h" + +#ifdef __STIR_REGISTRY_NOT_INLINE + +#pragma message("instantiating RegisteredObject") +#include "stir/Shape/Shape3D.h" + +// and others +START_NAMESPACE_STIR + +template +RegisteredObject::RegistryType& +RegisteredObject::registry () +{ + static RegistryType the_registry("None", 0); + return the_registry; +} + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +template RegisteredObject; + +END_NAMESPACE_STIR + +#endif diff --git a/src/Shape_buildblock/Shape3D.cxx b/src/Shape_buildblock/Shape3D.cxx new file mode 100644 index 0000000000..f8ad5c82e9 --- /dev/null +++ b/src/Shape_buildblock/Shape3D.cxx @@ -0,0 +1,248 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Non-inline implementations for class stir::Shape3D + + \author Kris Thielemans + \author Sanida Mustafovic +*/ +#include "stir/Shape/Shape3D.h" +#include "stir/Shape/DiscretisedShape3D.h" +#include "stir/DiscretisedDensity.h" +#include "stir/VoxelsOnCartesianGrid.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + + +// Check the sampled elements of the voxel + +START_NAMESPACE_STIR +/* +Shape3D* Shape3D::read_from_file(const string& filename) +{ + // at the moment only this one + return new + DiscretisedShape3D(DiscretisedDensity<3,float>::read_from_file(filename)); +} +*/ + +void +Shape3D:: +set_origin(const CartesianCoordinate3D& new_origin) +{ + this->origin = new_origin; +} + + +void +Shape3D:: +translate(const CartesianCoordinate3D& direction) +{ + this->set_origin(this->get_origin() + direction); +} + +float +Shape3D:: +get_geometric_volume() const +{ + return -1.F; +} + +#if 0 +float +Shape3D:: +get_geometric_area() const +{ + return -1.F; +} +#endif + +float +Shape3D:: +get_voxel_weight( + const CartesianCoordinate3D& voxel_centre, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& num_samples) const +{ + int value=0; + + for (float zsmall = -float(num_samples.z()-1)/num_samples.z()/2.F; + zsmall<=0.5F; + zsmall+=1.F/num_samples.z()) + { + for (float ysmall =-float(num_samples.y()-1)/num_samples.y()/2.F; + ysmall<=0.5F; + ysmall+=1.F/num_samples.y()) + { + for(float xsmall=-float(num_samples.x()-1)/num_samples.x()/2.F; + xsmall<=0.5F; + xsmall+=1.F/num_samples.x()) + { + { + const CartesianCoordinate3D r(zsmall,ysmall,xsmall); + if(is_inside_shape(voxel_centre+r*voxel_size)) + value += 1; + } + } + } + + } + return float(value)/(num_samples.z()*num_samples.y()*num_samples.x()); +} + +/* Construct the volume- use the convexity, e.g + the inner voxels sampled with num_samples=1, only the outer + voxels checked with the user defined num_samples + + \bug Objects which are only at the edge of the image can be missed +*/ +void +Shape3D::construct_volume(VoxelsOnCartesianGrid &image, + const CartesianCoordinate3D& num_samples) const +{ + const CartesianCoordinate3D& voxel_size= image.get_voxel_size(); + const CartesianCoordinate3D& origin= image.get_origin(); + //if (norm(origin)>.00001) + // error("Shape3D::construct_volume currently ignores image origin (not shape origin)\n"); + const int min_z = image.get_min_z(); + const int min_y = image.get_min_y(); + const int min_x = image.get_min_x(); + const int max_z = image.get_max_z(); + const int max_y = image.get_max_y(); + const int max_x = image.get_max_x(); + + CartesianCoordinate3D crude_num_samples(1,1,1); + + for(int z = min_z;z<=max_z;z++) + { + for(int y =min_y;y<=max_y;y++) + for(int x=min_x;x<=max_x;x++) + + { + const CartesianCoordinate3D + current_index(static_cast(z), + static_cast(y), + static_cast(x)); + + //image[z][y][x] = get_voxel_weight(current_point,voxel_size,crude_num_samples); + + image[z][y][x] = + (is_inside_shape(current_index*voxel_size+origin)) + ? 1.F : 0.F; + } + } + + if (num_samples.x() == 1 && num_samples.y() == 1 && num_samples.z() == 1) + return; + + int num_recomputed = 0; + for(int z =min_z;z<=max_z;z++) + for(int y =min_y;y<=max_y;y++) + for(int x=min_x;x<= max_x;x++) + { + const float current_value = image[z][y][x]; + + // first check if we're already at an edge voxel + // Note: this allow fuzzy boundaries + bool recompute = current_value<.999F && current_value>.00F; + if (!recompute) + { + // check neighbour values. If they are all equal, we'll assume it's ok. + for(int i = z-1;!recompute && (i<=z+1);i++) + for(int j= y-1;!recompute && (j<=y+1);j++) + for(int k=x-1;!recompute && (k<=x+1);k++) + { + const float value_of_neighbour = + ((i < min_z) || (i> max_z) || + (j < min_y) || (j> max_y) || + (k < min_x) || (k> max_x) + ) ? 0 : image[i][j][k]; + recompute = (value_of_neighbour!=current_value); + } + } + if (recompute) + { + num_recomputed++; + const CartesianCoordinate3D + current_index(static_cast(z), + static_cast(y), + static_cast(x)); + image[z][y][x] = get_voxel_weight(current_index*voxel_size+origin,voxel_size,num_samples); + } + } + cerr << "Number of voxels recomputed with finer sampling : " << num_recomputed << endl; + +} + +#if 0 +void Shape3D::construct_slice(PixelsOnCartesianGrid &plane, + const CartesianCoordinate3D& num_samples) const + { + + // TODO + // CartesianCoordinate3D voxel_size = plane.get_voxel_size(); + CartesianCoordinate2D pre_voxel_size= plane.get_pixel_size(); + //TODO + //CartesianCoordinate3D grid_spacing =plane.get_grid_spacing(); + int voxel_size_z=1;// grid_spacing.z(); + + CartesianCoordinate3D voxel_size(pre_voxel_size.x(), pre_voxel_size.y(),voxel_size_z); + CartesianCoordinate3D origin = plane.get_origin(); + int z = origin.z(); + + //TODO + for ( int y = plane.get_min_y(); y<=plane.get_max_y(); y++) + for ( int x = plane.get_min_x();x<=plane.get_max_x();x++) + + { + CartesianCoordinate3D current_point(x,y,z); + plane[y][x]= get_voxel_weight(current_point,voxel_size, num_samples); + } + } + +#endif + +void +Shape3D:: +set_defaults() +{ + origin[3] = origin[2] = origin[1] =0; +} + +void +Shape3D:: +initialise_keymap() +{ + this->parser.add_key("origin (in mm)", &origin); +} + +std::string +Shape3D::parameter_info() +{ + return ParsingObject::parameter_info(); +} + + +END_NAMESPACE_STIR diff --git a/src/Shape_buildblock/Shape3DWithOrientation.cxx b/src/Shape_buildblock/Shape3DWithOrientation.cxx new file mode 100644 index 0000000000..029a92401e --- /dev/null +++ b/src/Shape_buildblock/Shape3DWithOrientation.cxx @@ -0,0 +1,235 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Non-inline implementations for class stir::Shape3DWithOrientation + + \author Sanida Mustafovic + \author Kris Thielemans +*/ +#include "stir/Shape/Shape3DWithOrientation.h" +#include "stir/numerics/determinant.h" +#include "stir/numerics/norm.h" +#include "stir/Succeeded.h" +#include + +START_NAMESPACE_STIR + + +#if 0 +void +Shape3DWithOrientation:: +set_directions_from_Euler_angles( + const float alpha, + const float beta, + const float gamma) +{ +/* + dir_x( -cos(gamma)*sin(beta), + cos(beta)*cos(gamma)*sin(alpha)+cos(alpha)*sin(gamma), + cos(alpha)*cos(beta)*cos(gamma)-sin(alpha)*sin(gamma)), + dir_y( sin(beta)*sin(gamma), + cos(alpha)*cos(gamma)-cos(beta)*sin(alpha)*sin(gamma), + -cos(gamma)*sin(alpha)-cos(alpha)*cos(beta)*sin(gamma)), + dir_z( sin(beta)*sin(gamma), + cos(alpha)*cos(gamma)-cos(beta)*sin(alpha)*sin(gamma), + -cos(gamma)*sin(alpha)-cos(alpha)*cos(beta)*sin(gamma)) + */ + + dir_x = CartesianCoordinate3D( + sin(beta)*sin(gamma), + cos(gamma)*sin(alpha) + cos(alpha)*cos(beta)*sin(gamma), + cos(alpha)*cos(gamma) - cos(beta)*sin(alpha)*sin(gamma)); + dir_y = CartesianCoordinate3D( + cos(gamma)*sin(beta), + cos(alpha)*cos(beta)*cos(gamma) - sin(alpha)*sin(gamma), + -(cos(beta)*cos(gamma)*sin(alpha)) - cos(alpha)*sin(gamma)); + dir_z = CartesianCoordinate3D( + cos(beta), + -(cos(alpha)*sin(beta)), + sin(alpha)*sin(beta)); +} +#endif + + + +Shape3DWithOrientation::Shape3DWithOrientation() +{} + + +Shape3DWithOrientation::Shape3DWithOrientation(const CartesianCoordinate3D& origin, + const Array<2,float>& direction_vectors) +: Shape3D(origin) +{ + if (this->set_direction_vectors(direction_vectors) == Succeeded::no) + error("Shaped3DWithOrientation constructor called with wrong direction_vectors"); +} + +Succeeded +Shape3DWithOrientation:: +set_direction_vectors(const Array<2,float>& directions) +{ + this->_directions = directions; + if (this->_directions.size() != 3) + return Succeeded::no; + + // set index offset to 1, such that matrix_multiply can be used with BasicCoordinate + this->_directions.set_min_index(1); + for (int i=1; i<=this->_directions.get_max_index(); ++i) + { + this->_directions[i].set_min_index(1); + if (this->_directions[i].size() != 3) + return Succeeded::no; + } + return Succeeded::yes; +} + +bool +Shape3DWithOrientation:: +operator==(const Shape3DWithOrientation& s) const +{ + const float tolerance = .001F; + return + norm(this->get_origin() - s.get_origin()) < tolerance + && norm(this->_directions[1] - s._directions[1]) < tolerance + && norm(this->_directions[2] - s._directions[2]) < tolerance + && norm(this->_directions[3] - s._directions[3]) < tolerance + && base_type::operator==(s); +} + +float +Shape3DWithOrientation:: +get_volume_of_unit_cell() const +{ + return std::fabs(determinant(this->get_direction_vectors())); +} + +CartesianCoordinate3D +Shape3DWithOrientation:: +transform_to_shape_coords(const CartesianCoordinate3D& coord) const +{ + return + matrix_multiply(this->get_direction_vectors(), coord - this->get_origin()); +} + +void Shape3DWithOrientation::scale(const CartesianCoordinate3D& scale3D) +{ + this->_directions[1] /= scale3D[1]; + this->_directions[2] /= scale3D[2]; + this->_directions[3] /= scale3D[3]; + + this->set_origin(this->get_origin() * scale3D); +} + +#if 0 +float Shape3DWithOrientation::get_angle_alpha() const +{ + return atan2(dir_z.y(),dir_z.x()); +} + +float Shape3DWithOrientation::get_angle_beta()const +{ + return atan2(sqrt(square(dir_z.x())+ square(dir_z.y())),dir_z.z()); +} + +float Shape3DWithOrientation::get_angle_gamma()const +{ + return atan2(-dir_y.z(),_directions.x().z()); +} +#endif + +void +Shape3DWithOrientation:: +set_defaults() +{ + Shape3D::set_defaults(); + this->set_direction_vectors(diagonal_matrix(3,1.F)); + +#if 0 + // set alpha,beta,gamma to non-sensical values for parsing + // this is necessary because we need to detect if they are used or not + // see post_processing() + alpha_in_degrees = beta_in_degrees = gamma_in_degrees = 10000000.F; +#endif +} + +void +Shape3DWithOrientation:: +initialise_keymap() +{ + Shape3D::initialise_keymap(); +#if 0 + parser.add_key("Euler angle alpha (in degrees)", &alpha_in_degrees); + parser.add_key("Euler angle beta (in degrees)", &beta_in_degrees); + parser.add_key("Euler angle gamma (in degrees)", &gamma_in_degrees); +#endif + parser.add_key("direction vectors (in mm)", &_directions); +} + +bool +Shape3DWithOrientation:: +post_processing() +{ +#if 0 + if (alpha_in_degrees != 10000000.F + || beta_in_degrees != 10000000.F + || gamma_in_degrees != 10000000.F) + { + // one of the Euler angles was set. Now check if all were set + if (!(alpha_in_degrees != 10000000.F + && beta_in_degrees != 10000000.F + && gamma_in_degrees != 10000000.F)) + { + warning("Shape3DWithOrientation: one of the Euler angles was set, but not all"); + return true; + } + set_directions_from_Euler_angles( + static_cast(alpha_in_degrees * _PI/180.), + static_cast(beta_in_degrees * _PI/180.), + static_cast(gamma_in_degrees * _PI/180.)); + } + else + { + // assume that directions have been set + } +#endif + // make sure that indices etc are ok + if (this->set_direction_vectors(_directions) == Succeeded::no) + { + warning("Direction vectors should be a 3x3 matrix"); + return true; + } + + return Shape3D::post_processing(); +} + +void +Shape3DWithOrientation:: +set_key_values() +{ + base_type::set_key_values(); +#if 0 + alpha_in_degrees = static_cast(get_angle_alpha()*180./_PI); + beta_in_degrees = static_cast(get_angle_beta()*180./_PI); + gamma_in_degrees = static_cast(get_angle_gamma()*180./_PI); +#endif +} +END_NAMESPACE_STIR diff --git a/src/Shape_buildblock/Shape_buildblock_registries.cxx b/src/Shape_buildblock/Shape_buildblock_registries.cxx new file mode 100644 index 0000000000..576dba1f93 --- /dev/null +++ b/src/Shape_buildblock/Shape_buildblock_registries.cxx @@ -0,0 +1,43 @@ +// +// +/* + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup Shape + + \brief File that registers all stir::RegisteredObject children in Shape_buildblock + + \author Kris Thielemans + \author C. Ross Schmidtlein (added stir::Box3D Shape class) + +*/ + +#include "stir/Shape/Ellipsoid.h" +#include "stir/Shape/EllipsoidalCylinder.h" +#include "stir/Shape/Box3D.h" +#include "stir/Shape/DiscretisedShape3D.h" + +START_NAMESPACE_STIR + +static Ellipsoid::RegisterIt dummy; +static EllipsoidalCylinder::RegisterIt dummy2; +static DiscretisedShape3D::RegisterIt dummy3; +static Box3D::RegisterIt dummy4; + +END_NAMESPACE_STIR diff --git a/src/Shape_buildblock/lib.mk b/src/Shape_buildblock/lib.mk new file mode 100644 index 0000000000..545ec72d7b --- /dev/null +++ b/src/Shape_buildblock/lib.mk @@ -0,0 +1,17 @@ +# +# +dir := Shape_buildblock + +$(dir)_LIB_SOURCES = \ + Shape3D.cxx \ + DiscretisedShape3D.cxx \ + Shape3DWithOrientation.cxx \ + Ellipsoid.cxx \ + EllipsoidalCylinder.cxx \ + Box3D.cxx + + +$(dir)_REGISTRY_SOURCES:= $(dir)_registries.cxx + +include $(WORKSPACE)/lib.mk + diff --git a/src/SimSET/CMakeLists.txt b/src/SimSET/CMakeLists.txt new file mode 100644 index 0000000000..b4781a2215 --- /dev/null +++ b/src/SimSET/CMakeLists.txt @@ -0,0 +1,36 @@ +# +# +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. +set(dir SimSET) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +# routines that need linking with the STIR library +set(${dir_EXE_SOURCES} + conv_SimSET_projdata_to_STIR + conv_to_SimSET_att_image +) + +include(stir_exe_targets) + +# stand-alone +add_executable(write_phg_image_info write_phg_image_info.c) +SET_PROPERTY(TARGET write_phg_image_info PROPERTY FOLDER "Executables") +install(TARGETS write_phg_image_info DESTINATION bin) diff --git a/src/SimSET/README.txt b/src/SimSET/README.txt new file mode 100644 index 0000000000..acac055c49 --- /dev/null +++ b/src/SimSET/README.txt @@ -0,0 +1,87 @@ + + Copyright (C) 2008- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +This directory contains a set of utilities and scripts to make it easier to +use STIR together with SimSET. + +WARNING: SimSET has miriad options. The files here assume that you run SimSET in +a certain way. There are hardly any checks if this was the case or not. + +WARNING: An important caveat is that STIR can at presently not handle SimSET data +with an even number of tangential positions ('num_td_bins') with a symmetric range +for min_td and max_td. This is because STIR uses a convention suitable for ECAT data +taking interleaving of sinogram-bins into account. You will get artifacts in the +images unless you use an odd number for num_td_bins. +Similarly, usually in SimSET you put the centre of the image in the centre of the +scanner (although you don't have to of course). The current version of STIR will +only do this if you have an odd number of pixels in x and y. + +Most scripts require bash. Some require python. We also use various standard +utilities such as awk, grep, tr. + +Available utilities: +(see code for more info) + +- conv_to_SimSET_att_image +Allows converting an image with attenuation factor for 511 keV photons to a (8-bit) +index file that can be used as input for SimSET. + +- conv_SimSET_projdata_to_STIR.sh +Allows converting SimSET output sinograms ("weight files" to STIR Interfile files. +(Do not use the executable of the same name (without .sh) unless in emergencies). +Read the header of the script for some information. + +- SimSET_STIR_names.sh +Prints the (root of) the names of the projection data constructed by the above script. + +- make_hv_from_Simset_params.sh +Construct an Interfile header for a binary (attenuation or emission) image +output by SimSET. + +- write_phg_image_info +Helps constructing a PHG input file by generating the object-spec. +You would not normally run this directly, but use stir_image_to_simset_object.sh + +- stir_image_to_simset_object.sh +Helps constructing a PHG input file by generating the object-spec for an image +(as interpreted by list_image_info). +You probably don't need this if you use run_SimSET.sh + +- run_SimSET.sh +A script to run SimSET. It takes input images that STIR can read, and a few templates +input files. + +- add_SimSET_results.sh +A script to add results from run_SimSET.sh from different simulations. Useful if for +example to increase statistics. +WARNING: this script first calls mult_num_photons.sh in an attempt to handle cases where +you have different number of decays per simulations. However, this most definitely does +not handle cases where you change importance sampling parameters. + +How to use +----------- +You first have to tell these routines where your SimSET installation is located, for instance + + SIMSET_DIR=~/simset/2.9.1 + export SIMSET_DIR + +All STIR utilities/scripts have to be in your path, e.g. if your +INSTALL_PREFIX was ~/STIR-bin: + + PATH=$PATH:~/STIR-bin/bin + +See the SimSET/examples directory for an example. diff --git a/src/SimSET/TODO.txt b/src/SimSET/TODO.txt new file mode 100644 index 0000000000..10fb0b0ee8 --- /dev/null +++ b/src/SimSET/TODO.txt @@ -0,0 +1,13 @@ +The SimSET header does not contain the ring radius used for the binning. +This is why we need to pass the scanner name to th eSTIR conversion routines. +This is underdesirable (or even dangerous) however as +it relies on the user having match the SimSET and STIR scanner. +We could get the ring radius from phg.rec. + +The correspondence between the coordinate system between the SimSET scanner +definition and STIR image needs to be documented better (currently only +via the example files) image. The SimSET input image is constructed +using coordinates obtained by list_image_info. Scanner +coordinates have currently to be set by hand. +It needs to be tested what happens with non-standard number of planes in +the image etc. (Definitely not the same as STIR which shifts to centre of image) diff --git a/src/SimSET/conv_SimSET_projdata_to_STIR.cxx b/src/SimSET/conv_SimSET_projdata_to_STIR.cxx new file mode 100644 index 0000000000..37e7f4a2df --- /dev/null +++ b/src/SimSET/conv_SimSET_projdata_to_STIR.cxx @@ -0,0 +1,192 @@ +/* + Copyright (C) 2005-2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup SimSET + \brief This program converts SimSET 3D sinograms to STIR format + + This program should normally be called from the conv_SimSET_projdata_to_STIR.sh script. + \warning This program does not read the SimSET header, and is thus terribly unsafe. + + \author Pablo Aguiar + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ + +#include "stir/ProjDataInterfile.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/Sinogram.h" +#include "stir/Scanner.h" +#include "stir/shared_ptr.h" +#include "stir/is_null_ptr.h" +#include "stir/IO/read_data.h" +#include "stir/Succeeded.h" +#include +#include +#include +#include +#define NUMARG 12 + + +int main(int argc,char **argv) +{ + using namespace stir; + + static const char * const options[]={ + "argv[1] SimSET file\n", + "argv[2] SimSET file format\n", + "argv[3] Angles in SimSET file\n", + "argv[4] Bins in SimSET filele\n", + "argv[5] Axial slices in SimSET file\n", + "argv[6] FOV_radius in cm as given to simset binning module (max_td)\n", + "argv[7] range on Z value in cm as given to simset binning module\n", + "argv[8] STIR scanner name\n", + "argv[9] maximum ring difference to use for writing\n", + "argv[10] index of 3d-sinogram in file (0-based)\n" + "argv[11] STIR file name\n" + }; + if (argc!=NUMARG){ + std::cerr << "\n\nConvert SimSET to STIR\n\n"; + std::cerr << "Not enough arguments !!! ..\n"; + for (int i=1;i(atof(argv[6])*10); // times 10 for mm + const float scanner_length = static_cast(atof(argv[7])*10); // times 10 for mm + const char * const scanner_name = argv[8]; + const int max_ring_difference=atoi(argv[9]); + const int dataset_num = atoi(argv[10]); + const char * const stir_filename = argv[11]; + const int nitems=num_views*num_tangential_poss; + + if (num_tangential_poss%2 != 1) + warning("STIR can at present not handle simset data with an even " + "number of tangential positions.\n" + "Proceed at your own risk (but you will get artifacts in the images"); + FILE *file; + if( (file=fopen(simset_filename,"rb")) ==NULL){ + error("Cannot open the simset file %s", simset_filename); + } + shared_ptr scanner_sptr(Scanner::get_scanner_from_name(scanner_name)); + if (is_null_ptr(scanner_sptr)) + error("Scanner '%s' is not a valid name", scanner_name); + + { + const float STIR_scanner_length = + scanner_sptr->get_num_rings() * scanner_sptr->get_ring_spacing(); + if (fabs(STIR_scanner_length - scanner_length)>1.0) + { + warning("scanner length from SimSET %g does not match STIR scanner length %g.\n" + "Continuing anyway, but this is bad.", + scanner_length, STIR_scanner_length); + } + } + scanner_sptr->set_num_rings(num_rings); + scanner_sptr->set_ring_spacing(scanner_length/num_rings); + scanner_sptr->set_num_detectors_per_ring(num_views*2); + shared_ptr proj_data_info_sptr( + ProjDataInfo::ProjDataInfoCTI( scanner_sptr, + /*span=*/1, + /*max_delta=*/max_ring_difference, + num_views, + num_tangential_poss, + /*arc_corrected =*/ true)); + dynamic_cast(*proj_data_info_sptr). + set_tangential_sampling(2*FOV_radius/num_tangential_poss); + + shared_ptr exam_info_sptr(new ExamInfo); + ProjDataInterfile proj_data(exam_info_sptr, proj_data_info_sptr, + stir_filename, std::ios::out); + + + if(strncmp(input_data_type,"fl",2)==0) + { + } + else + { + error("file format %s not valid. Only fl at present", input_data_type); + } + + + // skip simset header + const long offset = 32768 + dataset_num*num_rings*(long(num_rings*nitems*4)); + if (fseek(file, offset, SEEK_SET) != 0) + error("Error while skipping simset header and data sets (%ld). Maybe file too short?", offset); + Array<1,float> seq(0,(num_rings*num_rings*nitems)-1); + read_data(file, seq /*, byteorder */); + + int i_ring_difference=0; + int n=0; + while(i_ring_difference<=max_ring_difference) + { + int lim_down=0; + int lim_up=lim_down+((num_rings-i_ring_difference-1)*(num_rings+1)); + for(n=lim_down;n<=lim_up;) //Extraccion de los sinogramas de una serie !!! + { + + Sinogram pos_sino = proj_data.get_empty_sinogram((n-lim_down)/(num_rings+1), i_ring_difference); + Sinogram neg_sino = proj_data.get_empty_sinogram((n-lim_down)/(num_rings+1), -i_ring_difference); + Sinogram::full_iterator pos_sino_iter = pos_sino.begin_all(); + Sinogram::full_iterator neg_sino_iter = neg_sino.begin_all(); + + int ii=nitems-1; + const int i_r1r2=(n + i_ring_difference)*nitems; + const int i_r2r1=(n + i_ring_difference*num_rings)*nitems; + + // get 2 sinograms from simset data + for(int i=0;i +/***********************************************************/ +int main(int argc, char *argv[]) +{ + USING_NAMESPACE_STIR; + if (argc!=3) + { + std::cerr << "Usage:" << argv[0] + << " SimSET_image_filename original_image\n"; + return EXIT_FAILURE; + } + shared_ptr< DiscretisedDensity<3,float> > + input_image_sptr(read_from_file >(argv[2])); + string output_image_filename(argv[1]); + shared_ptr > + output_image_sptr(input_image_sptr->clone()); + bool is_implemented=true; + DiscretisedDensity<3,float>::full_iterator out_iter = output_image_sptr->begin_all(); + DiscretisedDensity<3,float>::const_full_iterator in_iter = input_image_sptr->begin_all_const(); + while( in_iter != input_image_sptr->end_all_const()) + { + // values from standard Simset file at 511keV + if (fabs(*in_iter-0.096)<0.004) // Water + *out_iter = 1.F; + else if (fabs(*in_iter-0.102)<0.004) // Blood + *out_iter = 2.F; + else if (fabs(*in_iter-0.01)<0.010001) // Air + *out_iter = 0.F; + else if (fabs(*in_iter-0.19669)<0.004) // Bone + *out_iter = 3.F; + else if (fabs(*in_iter-0.02468)<0.005) // Lung + *out_iter = 6.F; + else if (fabs(*in_iter-0.0011)<0.005) // air + *out_iter = 30.F; + else if (fabs(*in_iter-0.22548)<0.005) // Aluminum + *out_iter = 20.F; + else + { + is_implemented=false; + std::cerr << "\t" << *in_iter ; + } + ++in_iter; ++out_iter; + } + + if(is_implemented==false) + std::cerr << "\nAt least one attenuation value (shown above) does not" + << "\ncorrespond to a SimSET attenuation index in the segmentation table." + << "\nImplement the new attenuation indices or change the input image. \n" + << "HINT: If produced by generate_image set the subsampling parameters to 1, \n." + << "when small voxels sizes are used.\n"; + // write to file as 1 byte without changing the scale + Succeeded success = + write_basic_interfile(output_image_filename, *output_image_sptr, + NumericType::UCHAR, 1.F); + return success == Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} + diff --git a/src/SimSET/examples/generate_uniform_cylinder.par b/src/SimSET/examples/generate_uniform_cylinder.par new file mode 100644 index 0000000000..7817059d85 --- /dev/null +++ b/src/SimSET/examples/generate_uniform_cylinder.par @@ -0,0 +1,24 @@ +generate_image Parameters := +; just a simple uniform cylinder, 10cm radius +output filename:=my_uniform_cylinder +X output image size (in pixels):=111 +Y output image size (in pixels):=111 +Z output image size (in pixels):=47 +X voxel size (in mm):= 3 +Y voxel size (in mm):= 3 +Z voxel size (in mm) :=3.27 + + Z number of samples to take per voxel := 1 + Y number of samples to take per voxel := 1 + X number of samples to take per voxel := 1 + +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=100 + radius-y (in mm):=100 + length-z (in mm):=110 + origin (in mm):={70,10,20} + END:= +value :=1 + +END:= diff --git a/src/SimSET/examples/howto_run_SimSET.sh b/src/SimSET/examples/howto_run_SimSET.sh new file mode 100755 index 0000000000..761e5b20d6 --- /dev/null +++ b/src/SimSET/examples/howto_run_SimSET.sh @@ -0,0 +1,58 @@ +#! /bin/sh + +# This is an example run with the templates distributed with STIR (appropriate for the HR+). +# The code below works in bash, sh, ksh etc, but needs to be modified for csh. +# Authors: Kris Thielemans +# +# +# Copyright (C) 2005 - 2006, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# adjust location of SimSET to where you have it installed. +SIMSET_DIR=~/simset/2.9.1 +export SIMSET_DIR + +#All STIR utilities/scripts have to be in your path, e.g. if your +#INSTALL_PREFIX was ~/STIR-bin, you could do +# PATH=$PATH:~/STIR-bin/bin + +# generate emission image +generate_image generate_uniform_cylinder.par +# use the same size for the attenuation in this example +# above par file sets image values to 1, so line below will use water for attenuation +stir_math --including-first --times-scalar 0.096 uniform_cylinder_atten.hv my_uniform_cylinder.hv + +# give the simulation a name. All output files will go into a new subdirectory of this name +SIM_NAME=sim3 +# number of decays to simulate +PHOTONS=5000000 +# specify names/locations of input files +EMISS_DATA=my_uniform_cylinder.hv +ATTEN_DATA=uniform_cylinder_atten.hv +templ_dir=`pwd` +TEMPLATE_PHG=${templ_dir}/template_phg.rec +TEMPLATE_BIN=${templ_dir}/template_bin.rec +TEMPLATE_DET=${templ_dir}/template_det.rec +# specify scanner +SCANNER="ECAT HR+" +# maximum ring difference to store in conversion from SimSET to Interfile projdata +NUM_SEG=31 +# export all variables +export SIM_NAME EMISS_DATA ATTEN_DATA TEMPLATE_PHG TEMPLATE_BIN TEMPLATE_DET +export PHOTONS NUM_SEG SCANNER + +# set the simulation going +run_SimSET.sh diff --git a/src/SimSET/examples/template_bin.rec b/src/SimSET/examples/template_bin.rec new file mode 100644 index 0000000000..1e3de01369 --- /dev/null +++ b/src/SimSET/examples/template_bin.rec @@ -0,0 +1,80 @@ +############################################################################### +# PARAMETER FILE FOR THE PHG BINNING MODULE +# to be used with run_SimSET.sh +# It uses the following strings which will be replaced by run_SimSET.sh: +# OUTPUT_DIRECTORY +# +# The particular binning module is created for the Siemens HR+ scanner +# +# Author: Pablo Aguiar - University of Barcelona (Nov 2004) +# Updated and added to the archive by Charalampos Tsoumpas +# +# +############################################################################### +# BINNING OPTIONS + + +# Scatter bin #### +# Scatter params = 0 for 1 scatter bin +# Scatter params = 1 for 2 scatter bins (primary vs all other [set min_s to 0]) +# Scatter params = 2 for num scatter bins = (max_s - min_s + 1) +INT scatter_param = 1 +INT min_s = 0 +INT max_s = 1 + +# Z axis binning #### +# HR+ length is 15.52 with 32 rings +# Currently, z_Min has to start at -(ring_spacing)/2 +INT num_z_bins = 32 +REAL min_z = -0.2425 +REAL max_z = 15.035 + +# Azimuthal angle bins #### +INT num_aa_bins = 144 + +# Transaxial binning.#### +# NOTE: Take note if you are setting min_td and max_td to any value less than the radius of your object cylinder. +# num_td_bins needs to be odd for STIR, and the range needs to be symmetric +INT num_td_bins = 287 +REAL min_td = -29.16815 +REAL max_td = 29.16815 +# Energy bins #### +# Note: e2 is ignored for (SPECT) +INT num_e1_bins = 1 +INT num_e2_bins = 1 +REAL min_e = 350 +REAL max_e = 650 + +# Specification of output file data type #### +# Weight weight_image_type = 0 for two byte integers (1 byte= 0..255 numero) +# Weight weight_image_type = 1 for four byte integers +# Weight weight_image_type = 2 for four byte reals +# Weight weight_image_type = 3 for 8 byte reals +# Needs to be 2 for STIR conversion to work +INT weight_image_type = 2 + +# Specification of output file data type +# Weight weight_image_type = 0 for one byte integers +# Weight weight_image_type = 1 for two byte integers +# Weight weight_image_type = 2 for four byte integers +# Needs to be 2 for STIR conversion to work +INT count_image_type = 2 + + +# Flag to indicate whether or not to add to existing images +BOOL add_to_existing_img = false + +# Path to the binned values of photon weights +STR weight_image_path = "OUTPUT_DIRECTORY/rec.weight" + +# Path to the binned values of photon weights squared. +STR weight_squared_image_path = "OUTPUT_DIRECTORY/rec.weight2" + +# Path to the binned values of absolute photons count +STR count_image_path = "OUTPUT_DIRECTORY/rec.count" + +# Specify history file name for photons reaching the binning parameter +STR history_file = "" + +# Specify history file parameter name for histogram history file +STR history_params_file = "" diff --git a/src/SimSET/examples/template_det.rec b/src/SimSET/examples/template_det.rec new file mode 100644 index 0000000000..b10af7e1a9 --- /dev/null +++ b/src/SimSET/examples/template_det.rec @@ -0,0 +1,25 @@ +############################################################################### +# PARAMETER FILE FOR THE DETECTOR MODULE +# +# The particular detector module is created for the Siemens HR+ scanner +# +# Author: Pablo Aguiar - University of Barcelona (Nov 2004) +# Updated and added to the archive by Charalampos Tsoumpas +# +# +############################################################################### + +# Specify the detector type. +# Select detector_type = 1 for simple Gaussian blur + +# This detector will be modelled with a Gaussian +INT detector_type = 1 + +# Specify the energy resolution as a percentage of FWHM (25% es BGO) +REAL energy_resolution_percentage = 22 + +# Specify the reference energy of the detected photons +REAL reference_energy_keV = 511 + +# Specify the name of the history file (empty for no file) +STR history_file = "" diff --git a/src/SimSET/examples/template_phg.rec b/src/SimSET/examples/template_phg.rec new file mode 100644 index 0000000000..9ab3b1009c --- /dev/null +++ b/src/SimSET/examples/template_phg.rec @@ -0,0 +1,100 @@ +############################################################################### +# PARAMETER FILE FOR THE PHG SIMULATION +# to be used with run_SimSET.sh +# It uses the following strings which will be replaced by run_SimSET.sh: +# SIMSET_DIRECTORY, INPUT_DIRECTORY, OUTPUT_DIRECTORY, BIN.REC, DET.REC, PHOTONS +# +# This particular file is created for the Siemens HR+ scanner. +# +# Author: Pablo Aguiar - University of Barcelona (Nov 2004) +# Updated and added to the archive by Charalampos Tsoumpas +# +# +############################################################################### + +# RUNTIME OPTIONS +BOOL simulate_stratification = true +BOOL simulate_forced_detection = true +BOOL forced_non_absorbtion = true +REAL acceptance_angle = 90.0 +INT num_to_simulate = PHOTONS +BOOL simulate_SPECT = false +BOOL simulate_PET_coincidences_only = true +BOOL simulate_PET_coincidences_plus_singles = false +BOOL adjust_for_positron_range = false +#REAL length_of_scan = 70 +BOOL adjust_for_collinearity = false +REAL minimum_energy = 276 +REAL photon_energy = 511.0 +REAL weight_window_ratio = 1.0 +BOOL point_source_voxels = false +INT random_seed = 0 +BOOL model_coherent_scatter = false +ENUM isotope = f18 + + +# TARGET CYLINDER INFORMATION +# HR+ length is 15.52 with 32 rings +# Currently, z_Min has to start at -(ring_spacing)/2 +NUM_ELEMENTS_IN_LIST target_cylinder = 3 + REAL target_zMin = -0.2425 + REAL target_zMax = 15.035 + REAL radius = 41.25 + + +# COHERENT ANGULAR DISTRIBUTION FILES +STR coherent_scatter_table = "SIMSET_DIRECTORY/phg.data/coh.tables" + +# ACTIVITY INDEX FILE +STR activity_indexes = "OUTPUT_DIRECTORY/rec.act_indexes" + +# ACTIVITY TABLE FILE +STR activity_table = "SIMSET_DIRECTORY/phg.data/phg_act_table" + +# ACTIVITY INDEX TO TABLE TRANSLATION FILE +STR activity_index_trans = "SIMSET_DIRECTORY/phg.data/phg_act_index_trans" + +# ACTIVITY IMAGE OUTPUT FILE +STR activity_image = "OUTPUT_DIRECTORY/rec.activity_image" + +# ATTENUATION INDEX FILE +STR attenuation_indexes = "OUTPUT_DIRECTORY/rec.att_indexes" + +# ATTENUATION TABLE FILE +STR attenuation_table = "SIMSET_DIRECTORY/phg.data/phg_att_table" + +# ATTENUATION INDEX TO TABLE TRANSLATION FILE +STR attenuation_index_trans = "SIMSET_DIRECTORY/phg.data/phg_att_index_trans" + +# ATTENUATION IMAGE OUTPUT FILE +STR attenuation_image = "OUTPUT_DIRECTORY/rec.attenuation_image" + +# PRODUCTIVITY INPUT TABLE FILE +#STR productivity_input_table = "OUTPUT_DIRECTORY/sampling_rec" +STR productivity_input_table = "" + +# PRODUCTIVITY TABLE FILE +#STR productivity_output_table = "OUTPUT_DIRECTORY/sampling_rec" +STR productivity_output_table = "" + +# FORCED DETECTION TABLE FILE +STR forced_detection_table = "" + +STR statistics_file = "OUTPUT_DIRECTORY/rec.stat" + +# ISOTOPE DATA FILE +STR isotope_data_file = "SIMSET_DIRECTORY/phg.data/isotope_positron_energy_data" + +#COLLIMATOR PARAMETER FILE +#STR collimator_params_file = "OUTPUT_DIRECTORY/col.rec" +STR collimator_params_file = "" + +# DETECTOR PARAMETER FILE +STR detector_params_file = "OUTPUT_DIRECTORY/DET.REC" + +# BINNING PARAMETER FILE +STR bin_params_file = "OUTPUT_DIRECTORY/BIN.REC" + +# HISTORY FILE +STR history_file = "" + diff --git a/src/SimSET/exe.mk b/src/SimSET/exe.mk new file mode 100644 index 0000000000..a2267cb81f --- /dev/null +++ b/src/SimSET/exe.mk @@ -0,0 +1,10 @@ +# +# +dir := SimSET + +$(dir)_SOURCES := \ + conv_SimSET_projdata_to_STIR.cxx \ + conv_to_SimSET_att_image.cxx \ + write_phg_image_info.c + +include $(WORKSPACE)/exe.mk diff --git a/src/SimSET/scripts/CMakeLists.txt b/src/SimSET/scripts/CMakeLists.txt new file mode 100644 index 0000000000..c744a1a23b --- /dev/null +++ b/src/SimSET/scripts/CMakeLists.txt @@ -0,0 +1,38 @@ +# +# +# Copyright 2011-07-01 - 2012 Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file handling all files in this subdirectory + +set(dir SimSET_scripts) + +set(dir_scripts ${dir}_SCRIPTS) + +set(${dir_scripts} +add_SimSET_results.sh +conv_SimSET_projdata_to_STIR.sh +make_hv_from_Simset_params.sh +mult_num_photons.sh +run_SimSET.sh +SimSET_STIR_names.sh +stir_image_to_simset_object.sh +) + + +#include(stir_test_exe_targets) + +install(PROGRAMS ${${dir_scripts}} DESTINATION bin) + diff --git a/src/SimSET/scripts/SimSET_STIR_names.sh b/src/SimSET/scripts/SimSET_STIR_names.sh new file mode 100644 index 0000000000..9ad619399d --- /dev/null +++ b/src/SimSET/scripts/SimSET_STIR_names.sh @@ -0,0 +1,88 @@ +#! /bin/bash +# This scripts prints the names of the projection data constructed by +# conv_SimSET_projdata_to_STIR.sh when converting a Simset weight file. +# +# +# +# Copyright (C) 2005 - 2005-10-24, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans + + +if [ $# -ne 1 ]; then + echo "usage:" + echo "$0 simset_file" + exit 1 +fi + +script_name="$0" +trap "echo ERROR in script $script_name" ERR +PRINTHEADER=${SIMSET_DIR}/bin/printheader + +simset_file="$1" +min_scatter_bin_num=`${PRINTHEADER} ${simset_file} |grep "Binning: min number of scatters" |awk '{ print $6 }'` +max_scatter_bin_num=`${PRINTHEADER} ${simset_file} |grep "Binning: max number of scatters" |awk '{ print $6 }'` +all_scatter_bin_nums=`count $min_scatter_bin_num $max_scatter_bin_num` + +scatter_parameter=`${PRINTHEADER} ${simset_file} |grep "Binning: scatter.*parameter" |awk '{ print $4 }'` + +all="" +case $scatter_parameter in + + 0) + all="total" + ;; + 1|6) + all="" + if [ $min_scatter_bin_num == 0 ]; then + all="$all noscatter" + if [ $max_scatter_bin_num -ge 1 ]; then + all="$all scatter" + if [ $scatter_parameter == 6 ]; then + all="$all randoms" + fi + else + if [ $scatter_parameter == 6 ]; then + all="$all randoms" + fi + fi + fi + ;; + + + 3|8) # scatter_parameter + + all="doubles11 doubles20 multiples singles trues" + ;; + + 4|5|9|10) + all="" + for i in $all_scatter_bin_nums ; + do + all="$all_bin_num} scatter${i};" + done + if [ $scatter_parameter == 10 -o $scatter_parameter == 9 ]; then + all="$all_scatter_bin_num - min_scatter_bin_num + 1)) randoms" + fi + ;; + + *) + # unsupported + ;; +esac +echo $all + diff --git a/src/SimSET/scripts/add_SimSET_results.sh b/src/SimSET/scripts/add_SimSET_results.sh new file mode 100644 index 0000000000..196fca5e5f --- /dev/null +++ b/src/SimSET/scripts/add_SimSET_results.sh @@ -0,0 +1,58 @@ +#! /bin/bash +# +# This scripts adds STIR projection data as produced by the SimSET conversion tool. +# WARNING: it assumes a particular scaling of the SimSET simulation, which might +# depend on the phg input file (see mult_num_photons.sh). +# +# Copyright (C) 2005, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Authors: Kris Thielemans + +prog=$0 +if [ $# -lt 2 ]; then + echo "usage:" + echo "$0 out_dir input_dir1 input_dir2 ...." + exit 1 +fi + +set -e +trap "echo ERROR in script $prog" ERR + +out_dir=$1 +mkdir -p $out_dir + +shift +echo "will process $*" + + +mult_num_photons.sh $* + +weight_filename=`awk -F= '/weight_image_path/ '{print $2}' $1/bin.rec |tr -d \"` +all=(`SimSET_STIR_names.sh $1/${weight_filename}`) + + +for i in `count 0 $(( ${#all[*]} - 1))`; do + all_files="" + for dir in $*; do + all_files="${all_files} $dir/${all[i]}_norm.hs" + done + echo "Adding ${all_files}" +# TODO we currently pipe all output to /dev/null because there's a lot of stuff because blocksizes do not work +trap "echo ERROR in executing stir_math $out_dir/${all[i]} ${all_files} " ERR + stir_math -s --add $out_dir/${all[i]} ${all_files} >& /dev/null +done + diff --git a/src/SimSET/scripts/conv_SimSET_projdata_to_STIR.sh b/src/SimSET/scripts/conv_SimSET_projdata_to_STIR.sh new file mode 100755 index 0000000000..69f4834741 --- /dev/null +++ b/src/SimSET/scripts/conv_SimSET_projdata_to_STIR.sh @@ -0,0 +1,194 @@ +#! /bin/bash +# +# This script is used to convert SimSET output (weight file) into STIR projdata format. +# Multiple files are written for the different scatter orders in the Simset file (if present). +# The names of these files are currently not very predictable. Use SimSET_STIR_names.sh to +# find out what we used. +# +# Most settings of SimSET's scatter_parameter are supported but not all. If you need +# others, you can modify this script and contribute it to the STIR list. +# +# If SimSET's scatter_parameter was set to 3, sinograms for 2nd order scatter are added +# together (doubles02 and doubles11). Even higher order scatter is summed into a file +# currently called "multiples" which is not a good name. +# However, since SimSET 2.9, you probably want to use scatter_parameter 4 or 5 instead. +# +# Names of the output files do not reflect if randoms are included or not. +# If you use scatter_parameter>=6, the total randoms are stored in a separate +# file (called randoms) in most cases. +# +# WARNING: If the scanner name is not supported by STIR, some information +# (in particular the ring diameter and average DOI) will be incorrect in the +# *.hs files. You will need to correct this by hand for the moment. + +# +# Copyright (C) 2005 - 2008/03/22, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author Kris Thielemans +# Author Charalampos Tsoumpas + + +if [ $# -ne 3 ]; then + echo "usage:" + echo "$0 simset-weight-file max_ring_difference stir-scanner-name" + echo "Surround the scanner name with quotes if it contains spaces" + exit 1 +fi + +simset_file=$1 +max_ring_difference=$2 +scanner_name=$3 + +set -e +script_name="$0" +trap "echo ERROR in script $script_name" ERR +PRINTHEADER=${SIMSET_DIR}/bin/printheader + +if [ ! -r ${simset_file} ]; then + if [ -r ${simset_file}.gz ]; then + gunzip ${simset_file}.gz + else + echo "Simset file ${simset_file} not found" + exit 1 + fi +fi + +# find min and max scatter bins in the SimSET file +min_scatter_bin_num=`${PRINTHEADER} ${simset_file} |grep "Binning: min number of scatters" |awk '{ print $6 }'` +max_scatter_bin_num=`${PRINTHEADER} ${simset_file} |grep "Binning: max number of scatters" |awk '{ print $6 }'` + +# find scatter_parameter (maybe called scatter_randoms_parameter in the future) +scatter_parameter=`${PRINTHEADER} ${simset_file} |grep "Binning: scatter.*parameter" |awk '{ print $4 }'` + +num_scatter_bins=$(( $max_scatter_bin_num - $min_scatter_bin_num + 1 )) + +# construct main part of the command line for the conv_SimSET_projdata_to_STIR executable +# by parsing the header of the SimSET file +conv_cmdline="conv_SimSET_projdata_to_STIR \ + ${simset_file} fl \ + `${PRINTHEADER} ${simset_file} |grep "Binning: number of AA bins" |awk '{ print $6 }'` \ + `${PRINTHEADER} ${simset_file} |grep "Binning: number of TD bins" |awk '{ print $6 }'` \ + `${PRINTHEADER} ${simset_file} |grep "Binning: number of Z bins" |awk '{ print $6 }'` \ + `${PRINTHEADER} ${simset_file} |grep "Binning: max Transaxial Distance" |awk '{ print $5 }'` \ + `${PRINTHEADER} ${simset_file} |grep "Binning: range on Z value" |awk '{ print $6 }'` \ + '${scanner_name}' \ + $max_ring_difference " +all_scatter_bin_nums=`count $min_scatter_bin_num $max_scatter_bin_num` + +echo Executing ${conv_cmdline} + +case $scatter_parameter in + + 0) + eval ${conv_cmdline} 0 total + ;; + + 1|6) + if [ $min_scatter_bin_num == 0 ]; then + eval ${conv_cmdline} 0 noscatter + if [ $max_scatter_bin_num -ge 1 ]; then + eval ${conv_cmdline} 1 scatter + if [ $scatter_parameter == 6 ]; then + eval ${conv_cmdline} 2 randoms + fi + else + if [ $scatter_parameter == 6 ]; then + eval ${conv_cmdline} 1 randoms + fi + fi + fi + ;; + + + 3|8) # scatter_parameter + + for i in $all_scatter_bin_nums ; + do for j in $all_scatter_bin_nums ; + do + scatter_bin_num=$(( ${num_scatter_bins} * $i + $j )) + echo extracting scatter bin $scatter_bin_num + echo ${conv_cmdline} ${scatter_bin_num} blue${i}_pink${j}; + eval ${conv_cmdline} ${scatter_bin_num} blue${i}_pink${j}; + done + done + + # get list of all contributing sinograms from blue/pink sinograms + + # first initialise lists to empty + all_trues= + all_singles= + all_singles12= + all_doubles1= + all_doubles2= + all_multiples= + for i in $all_scatter_bin_nums + do for j in $all_scatter_bin_nums + do + k=$(( $i + $j )) + current=blue${i}_pink${j}.hs + if [ $k -eq 0 ]; then all_trues="$all_trues $current"; fi + if [ $k -eq 1 ]; then all_singles="$all_singles $current"; fi + if [ $k -eq 2 ]; then if [ $i -eq 1 ]; then all_singles12="$all_singles12 $current";fi; fi; + if [ $k -eq 2 ]; then if [ $j -eq 2 ]; then all_doubles1="$all_doubles1 $current";fi; fi; + if [ $k -eq 2 ]; then if [ $i -eq 2 ]; then all_doubles2="$all_doubles2 $current";fi; fi; + if [ $k -gt 2 ]; then all_multiples="$all_multiples $current"; fi + done + done + + # TODO we currently pipe all output to /dev/null because there's a lot of stuff because blocksizes do not work + stir_math -s --add trues $all_trues >& /dev/null + stir_math -s --add singles $all_singles >& /dev/null + if [ ! -z "$all_singles12" ]; then + stir_math -s --add doubles11 $all_singles12 >& /dev/null + fi + if [ ! -z "$all_doubles1" ]; then + stir_math -s --add doubles20 $all_doubles1 $all_doubles2 >& /dev/null + fi + stir_math -s --add multiples $all_multiples >& /dev/null + + rm -f blue*s + + if [ $scatter_parameter == 8 ]; then + echo "WARNING: Not storing randoms yet" + fi + #end of scatter_param == 3 + ;; + + 4|5|9|10) # scatter_parameter + # (PET-only) to histogram coincidences into one index with (max_s-min_s)+1 bins + # using (blueScatters + pinkScatters) to compute the index number. + # The coincidence is rejected if the sum is < min_s (or > max_s for scatter_param 4,9). + + for scatter_bin_num in $all_scatter_bin_nums ; + do + echo extracting scatter bin $scatter_bin_num + idx=$((scatter_bin_num - min_scatter_bin_num)) + echo ${conv_cmdline} ${idx} scatter${scatter_bin_num}; + eval ${conv_cmdline} ${idx} scatter${scatter_bin_num}; + done + if [ $scatter_parameter == 10 -o $scatter_parameter == 9 ]; then + echo ${conv_cmdline} $((max_scatter_bin_num - min_scatter_bin_num + 1)) randoms + eval ${conv_cmdline} $((max_scatter_bin_num - min_scatter_bin_num + 1)) randoms + fi + ;; + + *) + echo "scatter_parameter $scatter_parameter currently unsupported" + exit 1 + ;; + +esac diff --git a/src/SimSET/scripts/exe.mk b/src/SimSET/scripts/exe.mk new file mode 100644 index 0000000000..7471a6308e --- /dev/null +++ b/src/SimSET/scripts/exe.mk @@ -0,0 +1,15 @@ +# +# + +dir:=SimSET/scripts + +$(dir)_SCRIPTS:=\ +add_SimSET_results.sh \ +conv_SimSET_projdata_to_STIR.sh \ +make_hv_from_Simset_params.sh \ +mult_num_photons.sh \ +run_SimSET.sh \ +SimSET_STIR_names.sh \ +stir_image_to_simset_object.sh + +include $(WORKSPACE)/exe.mk diff --git a/src/SimSET/scripts/make_hv_from_Simset_params.sh b/src/SimSET/scripts/make_hv_from_Simset_params.sh new file mode 100755 index 0000000000..891ddebbde --- /dev/null +++ b/src/SimSET/scripts/make_hv_from_Simset_params.sh @@ -0,0 +1,141 @@ +#! /bin/bash +# +# This script attempts to make Interfile headers (.hv STIR style and +# .ahv Analyze style) for a raw float image output by Simset. +# It uses the geometric info in a Simset PHG file. +# See the usage message below for some more info + +# Copyright (C) 2009-07-08, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author: Kris Thielemans + +print_usage_and_exit() +{ + echo "usage:" + echo " `basename $prog` simset_phg_params_filename raw_float_filename" + echo "This attempts to make Interfile headers (.hv STIR style and .ahv Analyze style)" + echo "for a raw float image output by Simset by using the geometric info in a Simset PHG file." + echo "WARNING: This does not work yet with different sized emission and attenuation images." + echo "warning: check if output is ok. This is not very stable code...." + exit 1 +} + +# find_param params_file param +find_param() +{ + # get all occurences and sort numerically + grep "[[:blank:]]$2" $1|uniq|awk -F= '{print $2}'|sort -g +} + +prog=$0 +if [ $# != 2 ]; then + print_usage_and_exit +fi + +binary_file="$2" +params_file="$1" + +if [ ! -r "$binary_file" ]; then + echo "ERROR: $prog cannot read binary_file $binary_file" 1>&2 + exit 1 +fi +if [ ! -r "$params_file" ]; then + echo "ERROR: $prog cannot read Simset params_file $params_file" 1>&2 + exit 1 +fi + +set -e # exit on error +trap "echo ERROR in $prog $input_file" ERR + +# get rid of some common extension in binary_file to construct header name +header_name=${binary_file%.f32} +header_name=${header_name%.dat} +output_file_hv=${header_name}.hv +output_file_ahv=${header_name}.ahv + +# remove directory info from the binary_file variable such that we don't store it in the header +binary_file=`basename ${binary_file}` + +xMin=`find_param $params_file xMin` +xMax=`find_param $params_file xMax` +yMin=`find_param $params_file yMin` +yMax=`find_param $params_file yMax` +zMin=`find_param $params_file zMin|head -n 1` +zMax=`find_param $params_file zMin|tail -n 1` +DimSize1=`find_param $params_file num_X_bins` +DimSize2=`find_param $params_file num_Y_bins` +DimSize3=$(( `find_param $params_file slice_number|tail -n 1` + 1 )) +ElementSpacing1=`python -c "print ($xMax - $xMin)*10/$DimSize1"` +ElementSpacing2=`python -c "print ($yMax - $yMin)*10/$DimSize2"` +ElementSpacing3=`python -c "print ($zMax - $zMin)*10/($DimSize3 - 1)"` +Offset1=`python -c "print $xMin*10 + $ElementSpacing1/2"` +Offset2=`python -c "print $yMin*10 + $ElementSpacing2/2"` +Offset3=`python -c "print $zMin*10"` + +number_format="float"; bytes_per_pixel=4; +byte_order=`python -c 'import sys; print sys.byteorder'`endian +HeaderSize=0 + +cat > $output_file_hv < $output_file_ahv < /dev/null + done + shift +done + diff --git a/src/SimSET/scripts/run_SimSET.sh b/src/SimSET/scripts/run_SimSET.sh new file mode 100755 index 0000000000..097e5f4bc9 --- /dev/null +++ b/src/SimSET/scripts/run_SimSET.sh @@ -0,0 +1,246 @@ +#! /bin/bash +#PBS -k eo +# better to add this in the qsub statement PBS -l vmem=1900mb + +# Script to run simset simulations +# Authors: Pablo Aguiar, Kris Thielemans, Nikos Dikaios + +# Still relies on a few things such as +# - scanner is hardwired via template files +# WARNING +# scanner z-coordinates in the templates have to fit with STIR conventions: +# z=0 corresponds to the centre of the first slice of the image +# +# You need to set various environment variables to run this script. +# Check the code below and the example. +# +# Copyright (C) 2005 - 2006, Hammersmith Imanet Ltd +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# + +script_name=$0 + +####################### Script inputs ################################## + +# These directories have to be changed for differents users +#SIMSET_DIR=/data/home/${USER}/simset + + +if [ $# -ne 0 -o -z "${SIMSET_DIR}" ]; then + echo Environment variable SIMSET_DIR needs to be set + exit 1 +fi + + +if [ $# -ne 0 -o -z "${DIR_INPUT}" ]; then + echo Environment variable DIR_INPUT will default to current directory. + DIR_INPUT=`pwd` +fi + +if [ $# -ne 0 -o -z "${DIR_OUTPUT}" ]; then + if [ $# -ne 0 -o -z "${SIM_NAME}" ]; then + echo "usage: $0 " + echo environment variable SIM_NAME or DIR_OUTPUT has to be defined + exit 1 + fi + DIR_OUTPUT=${DIR_INPUT}/${SIM_NAME} +fi +echo Output data will be in ${DIR_OUTPUT} + + +if [ $# -ne 0 -o -z "${PHOTONS}" ]; then + echo "usage: $0 " + echo environment variable PHOTONS has to be defined + echo Contains the number of decays to run + exit 1 +fi + +if [ $# -ne 0 -o -z "${EMISS_DATA}" ]; then + echo "usage: $0 " + echo environment variable EMISS_DATA has to be defined + echo Emission Data Filename + exit 1 +fi + + +if [ $# -ne 0 -o -z "${ATTEN_DATA}" ]; then + echo "usage: $0 " + echo environment variable ATTEN_DATA has to be defined + echo "Attenuation Data Filename (in mu-values units cm^-1)" + exit 1 +fi + +if [ $# -ne 0 -o -z "${SCANNER}" ]; then + echo "usage: $0 " + echo environment variable SCANNER has to be defined + echo Has to be set to a scanner name that STIR understands if you want all dimensions to be ok. + exit 1 +fi + +num_seg=0 +if [ ! -z "${NUM_SEG}" ]; then +num_seg=${NUM_SEG} +fi + +convert_att_to_simset=1 +if [ ! -z "${CONVERT_ATT_TO_SIMSET}" ]; then +convert_att_to_simset=${CONVERT_ATT_TO_SIMSET} +fi + +if [ $# -ne 0 -o -z "${TEMPLATE_PHG}" ]; then + TEMPLATE_PHG=template_phg.rec +fi +echo "Using ${TEMPLATE_PHG}" + +if [ $# -ne 0 -o -z "${TEMPLATE_BIN}" ]; then + TEMPLATE_BIN=template_bin.rec +fi +echo "Using ${TEMPLATE_BIN}" + +if [ $# -ne 0 -o -z "${TEMPLATE_DET}" ]; then + TEMPLATE_DET=template_det.rec +fi +echo "Using ${TEMPLATE_DET}" + +######################## Script code ################################### +# function to parse simset file +# Usage: +# find_param params_file param +# outputs value of parameter +find_param() +{ + # get all occurences and sort numerically + grep "[[:blank:]]$2" $1|uniq|awk -F= '{print $2}'|sort -g +} + +# exit on error +set -e +trap "echo ERROR in script $script_name" ERR + +echo "Preparing files for SimSET from templates and images" + +mkdir -p ${DIR_OUTPUT} + +cd ${DIR_INPUT} + +######## Creating Simset input files + +# Copying into DIR_OUTPUT what SimSET needs to run +if [ ${DIR_INPUT} != ${DIR_OUTPUT} -o ${TEMPLATE_DET} != det.rec ]; then + cp ${TEMPLATE_DET} ${DIR_OUTPUT}/det.rec +fi + +cd ${DIR_OUTPUT} +# first convert input emission to 1byte data +cat > output_format_1byte.par < phg.rec + + +sed -e s#SIMSET_DIRECTORY#${SIMSET_DIR}# \ + -e s#INPUT_DIRECTORY#${DIR_INPUT}# \ + -e s#OUTPUT_DIRECTORY#${DIR_OUTPUT}# \ + < ${TEMPLATE_BIN} > bin.rec + +# add object geometric def +stir_image_to_simset_object.sh ${DIR_INPUT}/${EMISS_DATA} >> phg.rec + +# Building index.dat to input in makeindexfile +echo phg.rec > index.dat +echo y >> index.dat +echo y >> index.dat +echo 0 >> index.dat +echo y >> index.dat +echo act.dat >> index.dat +echo 0 >> index.dat +echo 0 >> index.dat +echo 1 >> index.dat +echo n >> index.dat +echo n >> index.dat +echo y >> index.dat +echo y >> index.dat +echo 0 >> index.dat +echo y >> index.dat +echo att.dat >> index.dat +echo 0 >> index.dat +echo 0 >> index.dat +echo 1 >> index.dat +echo n >> index.dat +echo n >> index.dat + +$SIMSET_DIR/bin/makeindexfile < index.dat >& ${DIR_OUTPUT}/makeindex.log + +######### Run SimSET + +echo "Starting phg (log in ${DIR_OUTPUT}/phg.log) ..." +$SIMSET_DIR/bin/phg phg.rec >& ${DIR_OUTPUT}/phg.log +echo "... phg done. " + +#rm -f ${DIR_OUTPUT}/rec.stat ${DIR_OUTPUT}/*.weight2 ${DIR_OUTPUT}/*.count ${DIR_OUTPUT}/index.dat +# gzip ${DIR_OUTPUT}/*weight* +#rm ${DIR_OUTPUT}/rec.act_indexes ${DIR_OUTPUT}/rec.activity_image ${DIR_OUTPUT}/rec.att_indexes ${DIR_OUTPUT}/rec.attenuation_image + +########## Convert output files + +log=${DIR_OUTPUT}/convert_SimSET_STIR.log +echo "Starting conversion to STIR format (log in ${log}) ..." + +# find output filenames +weight_filename=`find_param bin.rec weight_image_path|tr -d \"` +activity_image=`find_param phg.rec activity_image|tr -d \"` +attenuation_image=`find_param phg.rec attenuation_image|tr -d \"` + +# convert +rm -f ${log} + +if [ ! -z "${weight_filename}" ]; then + conv_SimSET_projdata_to_STIR.sh ${weight_filename} ${num_seg} "${SCANNER}" 2>&1 > ${log} +fi +if [ ! -z "${activity_image}" ]; then + make_hv_from_Simset_params.sh phg.rec ${activity_image} 2>&1 >> ${log} +fi +if [ ! -z "${attenuation_image}" ]; then + make_hv_from_Simset_params.sh phg.rec ${attenuation_image} 2>&1 >> ${log} +fi + + +echo "All done!" diff --git a/src/SimSET/scripts/stir_image_to_simset_object.sh b/src/SimSET/scripts/stir_image_to_simset_object.sh new file mode 100755 index 0000000000..9e62737849 --- /dev/null +++ b/src/SimSET/scripts/stir_image_to_simset_object.sh @@ -0,0 +1,69 @@ +#! /bin/bash +# +# This script attempts to find dimensions etc of an image using list_image_info +# and calls write_phg_image_info to write the corresponding lines for a +# PHG input file to stdout. + +# Copyright (C) 2011-07-01 - 2012, Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details +# +# Author: Kris Thielemans + +print_usage_and_exit() +{ + echo "usage:" + echo " `basename $prog` image_filename" + echo "This script attempts to write the object-spec corresponding to an image to stdout." + exit 1 +} + +prog=$0 +if [ $# -ne 1 ]; then + print_usage_and_exit + exit 1 +fi + +image=$1 + +if [ ! -r ${image} ]; then + echo "File ${image} not found" + exit 1 +fi + +set -e # exit on error +trap "echo ERROR in $prog $image" ERR + +# Find image dimensions etc +first_edge_coords=(`list_image_info ${image}| awk -F: '/first edge/ {print $2}'|tr -d '{},' `) + +if [ -z "${first_edge_coords}" ]; then + echo "File ${image} not readable by STIR?" + exit 1 +fi + +last_edge_coords=(`list_image_info ${image}| awk -F: '/last edge/ {print $2}'|tr -d '{},' `) +num_voxels=(`list_image_info ${image}| awk -F: '/Number of voxels/ {print $2}'|tr -d '{},' `) + +xmin=${first_edge_coords[2]} +xmax=${last_edge_coords[2]} +ymin=${first_edge_coords[1]} +ymax=${last_edge_coords[1]} +zmin=${first_edge_coords[0]} +zmax=${last_edge_coords[0]} +numx=${num_voxels[2]} +numy=${num_voxels[1]} +numz=${num_voxels[0]} + +write_phg_image_info $numz $numx $numy $xmin $xmax $ymin $ymax $zmin $zmax diff --git a/src/SimSET/write_phg_image_info.c b/src/SimSET/write_phg_image_info.c new file mode 100644 index 0000000000..f3d6688604 --- /dev/null +++ b/src/SimSET/write_phg_image_info.c @@ -0,0 +1,104 @@ +/* + Copyright (C) 2004 - 2005-04-19, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup simset + \brief Write object-spec for PHG parameter file for SimSET + \author Pablo Aguiar + \author Kris Thielemans +*/ + +#include +#include +#include + +#define N_INPUTS 10 + +/* parse cmd-line and convert to cm */ +void assign_inputs(char **arg,int *nslices,int *xbins,int *ybins, + float *xMin,float *xMax,float *yMin,float *yMax, + float *zMin, float *zMax); + +int main(int argc,char **argv) +{ + int i; + double dz; + int nslices,xbins,ybins; + float xMin,xMax,yMin,yMax,zMin,zMax; + + char *inputs[]={ + "Number slices in object", + "Number of pixels in x-direction", + "Number of pixels in y-direction", + "xMin (mm)", + "xMax (mm)", + "yMin (mm)", + "yMax (mm)", + "zMin (mm)", + "zMax (mm)" + }; + + if (argc==N_INPUTS) assign_inputs (argv,&nslices,&xbins,&ybins,&xMin,&xMax,&yMin,&yMax,&zMin,&zMax); + else + { + fprintf(stderr,"\nThis program writes the object-spec to stdout to\nhelp constructing a PHG parameter file for SimSET.\n"); + fprintf(stderr,"\nUsage:\nwrite_phg_image_info"); + for(i=0;i1?argv[1]:""); + + + return reconstruction_object.reconstruct() == Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; +} + + diff --git a/src/analytic/FBP2D/FBP2DReconstruction.cxx b/src/analytic/FBP2D/FBP2DReconstruction.cxx new file mode 100644 index 0000000000..c4415d0417 --- /dev/null +++ b/src/analytic/FBP2D/FBP2DReconstruction.cxx @@ -0,0 +1,437 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012-01-09, Hammersmith Imanet Ltd + Copyright (C) 2013 University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup FBP2D + \brief Implementation of class stir::FBP2DReconstruction + + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project +*/ + +#include "stir/analytic/FBP2D/FBP2DReconstruction.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/RelatedViewgrams.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/ArcCorrection.h" +#include "stir/analytic/FBP2D/RampFilter.h" +#include "stir/SSRB.h" +#include "stir/ProjDataInMemory.h" +// #include "stir/ProjDataInterfile.h" +#include "stir/Bin.h" +#include "stir/round.h" +#include "stir/display.h" +#include +#include "stir/IO/interfile.h" + +#ifdef STIR_OPENMP +#include +#endif + +using std::cerr; +using std::endl; + +START_NAMESPACE_STIR + + +void +FBP2DReconstruction:: +set_defaults() +{ + base_type::set_defaults(); + + alpha_ramp = 1; + fc_ramp = 0.5; + pad_in_s=1; + display_level=0; // no display + num_segments_to_combine = -1; + back_projector_sptr.reset(new BackProjectorByBinUsingInterpolation( + /*use_piecewise_linear_interpolation = */true, + /*use_exact_Jacobian = */ false)); + +} + +void +FBP2DReconstruction::initialise_keymap() +{ + base_type::initialise_keymap(); + + parser.add_start_key("FBP2DParameters"); + parser.add_stop_key("End"); + parser.add_key("num_segments_to_combine with SSRB", &num_segments_to_combine); + parser.add_key("Alpha parameter for Ramp filter", &alpha_ramp); + parser.add_key("Cut-off for Ramp filter (in cycles)",&fc_ramp); + parser.add_key("Transaxial extension for FFT", &pad_in_s); + parser.add_key("Display level",&display_level); + + parser.add_parsing_key("Back projector type", &back_projector_sptr); +} + +void +FBP2DReconstruction:: +ask_parameters() +{ + + base_type::ask_parameters(); + + num_segments_to_combine = ask_num("num_segments_to_combine (must be odd)",-1,101,-1); + alpha_ramp = ask_num(" Alpha parameter for Ramp filter ? ",0.,1., 1.); + fc_ramp = ask_num(" Cut-off frequency for Ramp filter ? ",0.,.5, 0.5); + pad_in_s = ask_num(" Transaxial extension for FFT : ",0,1, 1); + display_level = ask_num("Which images would you like to display \n\t(0: None, 1: Final, 2: filtered viewgrams) ? ", 0,2,0); + +#if 0 + // do not ask the user for the projectors to prevent them entering + // silly things + do + { + back_projector_sptr = + BackProjectorByBin::ask_type_and_parameters(); + } +#endif + +} + +bool FBP2DReconstruction::post_processing() +{ + if (base_type::post_processing()) + return true; + return post_processing_only_FBP2D_parameters(); +} + +bool FBP2DReconstruction::post_processing_only_FBP2D_parameters() +{ + if (fc_ramp<=0 || fc_ramp>.5000000001) + { + warning("Cut-off frequency has to be between 0 and .5 but is %g\n", fc_ramp); + return true; + } + if (alpha_ramp<=0 || alpha_ramp>1.000000001) + { + warning("Alpha parameter for ramp has to be between 0 and 1 but is %g\n", alpha_ramp); + return true; + } + if (pad_in_s<0 || pad_in_s>2) + { + warning("padding factor has to be between 0 and 2 but is %d\n", pad_in_s); + return true; + } + if (pad_in_s<1) + warning("Transaxial extension for FFT:=0 should ONLY be used when the non-zero data\n" + "occupy only half of the FOV. Otherwise aliasing will occur!"); + + if (num_segments_to_combine>=0 && num_segments_to_combine%2==0) + { + warning("num_segments_to_combine has to be odd (or -1), but is %d\n", num_segments_to_combine); + return true; + } + + if (num_segments_to_combine==-1) + { + const ProjDataInfoCylindrical * proj_data_info_cyl_ptr = + dynamic_cast(proj_data_ptr->get_proj_data_info_ptr()); + + if (proj_data_info_cyl_ptr==0) + num_segments_to_combine = 1; //cannot SSRB non-cylindrical data yet + else + { + if (proj_data_info_cyl_ptr->get_min_ring_difference(0) != + proj_data_info_cyl_ptr->get_max_ring_difference(0) + || + proj_data_info_cyl_ptr->get_num_segments()==1) + num_segments_to_combine = 1; + else + num_segments_to_combine = 3; + } + } + + if (is_null_ptr(back_projector_sptr)) + { + warning("Back projector not set.\n"); + return true; + } + + return false; +} + +string FBP2DReconstruction::method_info() const +{ + return "FBP2D"; +} + +FBP2DReconstruction:: +FBP2DReconstruction(const string& parameter_filename) +{ + initialise(parameter_filename); + std::cerr<& proj_data_ptr_v, + const double alpha_ramp_v, + const double fc_ramp_v, + const int pad_in_s_v, + const int num_segments_to_combine_v +) +{ + set_defaults(); + + alpha_ramp = alpha_ramp_v; + fc_ramp = fc_ramp_v; + pad_in_s = pad_in_s_v; + num_segments_to_combine = num_segments_to_combine_v; + proj_data_ptr = proj_data_ptr_v; + // have to check here because we're not parsing + if (post_processing_only_FBP2D_parameters() == true) + error("FBP2D: Wrong parameter values. Aborting\n"); +} + +Succeeded +FBP2DReconstruction:: +actual_reconstruct(shared_ptr > const & density_ptr) +{ + + // perform SSRB + if (num_segments_to_combine>1) + { + const ProjDataInfoCylindrical& proj_data_info_cyl = + dynamic_cast + (*proj_data_ptr->get_proj_data_info_ptr()); + + // full_log << "SSRB combining " << num_segments_to_combine + // << " segments in input file to a new segment 0\n" << endl; + + shared_ptr + ssrb_info_sptr(SSRB(proj_data_info_cyl, + num_segments_to_combine, + 1, 0, + (num_segments_to_combine-1)/2 )); + shared_ptr + proj_data_to_FBP_ptr(new ProjDataInMemory (proj_data_ptr->get_exam_info_sptr(), ssrb_info_sptr)); + SSRB(*proj_data_to_FBP_ptr, *proj_data_ptr); + proj_data_ptr = proj_data_to_FBP_ptr; + } + else + { + // just use the proj_data_ptr we have already + } + + // check if segment 0 has direct sinograms + { + const float tan_theta = proj_data_ptr->get_proj_data_info_ptr()->get_tantheta(Bin(0,0,0,0)); + if(fabs(tan_theta ) > 1.E-4) + { + warning("FBP2D: segment 0 has non-zero tan(theta) %g", tan_theta); + return Succeeded::no; + } + } + + float tangential_sampling; + // TODO make next type shared_ptr once we moved to boost::shared_ptr + // will enable us to get rid of a few of the ugly lines related to tangential_sampling below + shared_ptr arc_corrected_proj_data_info_sptr; + + // arc-correction if necessary + ArcCorrection arc_correction; + bool do_arc_correction = false; + if (dynamic_cast + (proj_data_ptr->get_proj_data_info_ptr()) != 0) + { + // it's already arc-corrected + arc_corrected_proj_data_info_sptr = + proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(); + tangential_sampling = + dynamic_cast + (*proj_data_ptr->get_proj_data_info_ptr()).get_tangential_sampling(); + } + else + { + // TODO arc-correct to voxel_size + if (arc_correction.set_up(proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone()) == + Succeeded::no) + return Succeeded::no; + do_arc_correction = true; + // TODO full_log + warning("FBP2D will arc-correct data first"); + arc_corrected_proj_data_info_sptr = + arc_correction.get_arc_corrected_proj_data_info_sptr(); + tangential_sampling = + arc_correction.get_arc_corrected_proj_data_info().get_tangential_sampling(); + } + //ProjDataInterfile ramp_filtered_proj_data(arc_corrected_proj_data_info_sptr,"ramp_filtered"); + + VoxelsOnCartesianGrid& image = + dynamic_cast&>(*density_ptr); + + + // set projector to be used for the calculations + back_projector_sptr->set_up(arc_corrected_proj_data_info_sptr, + density_ptr); + + + // set ramp filter with appropriate sizes + const int fft_size = + round(pow(2., ceil(log((double)(pad_in_s + 1)* arc_corrected_proj_data_info_sptr->get_num_tangential_poss()) / log(2.)))); + + RampFilter filter(tangential_sampling, + fft_size, + float(alpha_ramp), float(fc_ramp)); + + + density_ptr->fill(0); + + shared_ptr + symmetries_sptr(back_projector_sptr->get_symmetries_used()->clone()); + +#ifdef STIR_OPENMP + if (getenv("OMP_NUM_THREADS")==NULL) + { + omp_set_num_threads(omp_get_num_procs()); + if (omp_get_num_procs()==1) + warning("Using OpenMP with #processors=1 produces parallel overhead. You should compile without using USE_OPENMP=TRUE."); + cerr<<"Using OpenMP-version of FBP2D with thread-count = processor-count (="<\""< > empty_density_ptr(density_ptr->clone()); +#endif + +#ifdef STIR_OPENMP +#pragma omp parallel for shared(empty_density_ptr) +#endif + for (int view_num=proj_data_ptr->get_min_view_num(); view_num <= proj_data_ptr->get_max_view_num(); ++view_num) + { + const ViewSegmentNumbers vs_num(view_num, 0); + +#ifndef NDEBUG +#ifdef STIR_OPENMP + cerr<<"Thread "<is_basic(vs_num)) + continue; + + RelatedViewgrams viewgrams; +#ifdef STIR_OPENMP +#pragma omp critical(FBP2D_get_viewgrams) +#endif + { + viewgrams = + proj_data_ptr->get_related_viewgrams(vs_num, symmetries_sptr); + } + + if (do_arc_correction) + viewgrams = + arc_correction.do_arc_correction(viewgrams); + + // now filter + for (RelatedViewgrams::iterator viewgram_iter = viewgrams.begin(); + viewgram_iter != viewgrams.end(); + ++viewgram_iter) + { +#ifdef NRFFT + filter.apply(*viewgram_iter); +#else + std::for_each(viewgram_iter->begin(), viewgram_iter->end(), + filter); +#endif + } + // ramp_filtered_proj_data.set_related_viewgrams(viewgrams); + + if(display_level>1) + display( viewgrams,viewgrams.find_max(),"Ramp filter"); + +#ifdef STIR_OPENMP + //clone density_ptr and backproject + shared_ptr > omp_density_ptr(empty_density_ptr->clone()); + + back_projector_sptr->back_project(*omp_density_ptr, viewgrams); +#pragma omp critical(FBP2D_REDUCTION) + { //reduction + + DiscretisedDensity<3,float>::full_iterator density_iter = density_ptr->begin_all(); + DiscretisedDensity<3,float>::full_iterator density_end = density_ptr->end_all(); + DiscretisedDensity<3,float>::full_iterator omp_density_iter = omp_density_ptr->begin_all(); + + while (density_iter!= density_end) + { + *density_iter += (*omp_density_iter); + ++density_iter; + ++omp_density_iter; + } + } +#else + // and backproject + back_projector_sptr->back_project(*density_ptr, viewgrams); +#endif + } + + // Normalise the image + const ProjDataInfoCylindrical& proj_data_info_cyl = + dynamic_cast + (*proj_data_ptr->get_proj_data_info_ptr()); + + float magic_number = 1.F; + if (dynamic_cast(back_projector_sptr.get()) != 0) + { + // KT & Darren Hogg 17/05/2000 finally found the scale factor! + // TODO remove magic, is a scale factor in the backprojector + magic_number=2*proj_data_info_cyl.get_ring_radius()*proj_data_info_cyl.get_num_views()/proj_data_info_cyl.get_ring_spacing(); + } + else + { + if (proj_data_info_cyl.get_min_ring_difference(0)!= + proj_data_info_cyl.get_max_ring_difference(0)) + { + magic_number=.5F; + } + } +#ifdef NEWSCALE + // added binsize etc here to get units ok + // only do this when the forward projector units are appropriate + image *= magic_number / proj_data_ptr->get_num_views() * + tangential_sampling/ + (image.get_voxel_size().x()*image.get_voxel_size().y()); +#else + image *= magic_number / proj_data_ptr->get_num_views(); +#endif + + if (display_level>0) + display(image, image.find_max(), "FBP image"); + + return Succeeded::yes; +} + + + +END_NAMESPACE_STIR diff --git a/src/analytic/FBP2D/RampFilter.cxx b/src/analytic/FBP2D/RampFilter.cxx new file mode 100644 index 0000000000..5ca183554b --- /dev/null +++ b/src/analytic/FBP2D/RampFilter.cxx @@ -0,0 +1,201 @@ +// +// +/*! + + \file + \ingroup FBP2D + + \brief Implementation of class stir::RampFilter + + \author Kris Thielemans + \author Claire Labbe + \author Darren Hogg + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/analytic/FBP2D/RampFilter.h" +#include +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + +/* Note: #ifdef NRFFT, then the Numerical Recipes version is used (if you have it...) */ + +START_NAMESPACE_STIR + +// This function computes the samples of the ramp filter in real space +// (as opposed to frequency space) +// The formulas are complicated, but derived in Mathematica +// by computing the analytic inverse Fourier transform of a cut-off ramp +// times a Hamming window. + +static inline float +ramp_filter_in_space(const int n, + const float sampledist, + const int length, + const float alpha, + const float fc) +{ + const double x = n*2*fc; + // KT&Darren Hogg 17/05/2000 removed square(sampledist) as this introduced a scaling factor in the reconstructions + if (n==0) + return + static_cast((2*square(fc)*(-4 + alpha*(4 + square(_PI))))/(_PI/* *square(sampledist) */)); + else if (fabs(fabs(x)-1) < 1E-6) + return + static_cast( + -(square(2*fc)*(8*alpha + (-1 + alpha)*square(_PI)))/ + (4*_PI/* *square(sampledist) */)); + else + return + static_cast( + square(2*fc)*( + -alpha - square(x) + 3*alpha*square(x) - square(square(x)) + + _PI*x*sin(_PI*x)*(-1 + square(x))* + (-alpha + (-1 + 2*alpha)*square(x)) + + cos(_PI*x)*(alpha - (1 + alpha)*square(x) + + (-1 + 2*alpha)*square(square(x))) + )/ + (_PI/* *square(sampledist) */*square(-1 + x)*square(x)*square(1 + x)) + ); +} + +// KT&CL 03/08/99 insert max value for fc +RampFilter::RampFilter(float sampledist_v, int length , float alpha_v, float fc_v) + : +#ifdef NRFFT + Filter1D (length), +#endif + fc(min(fc_v, .5F)), alpha(alpha_v), sampledist(sampledist_v) +{ + + start_timers(); + + // Necessary exit for the silly case when length==0 + if (length==0) + return; +#ifdef OLDRAMP + /* This is the straightforward implementation: + define it in complex space as abs(frequency). + This has a well-known problem that DC values are wrong. This is essentially because + the ramp filter is a continuous filter. Discrete convolution should be done + with the samples of the continuous fourier transform of the ramp. + */ + // KT&DH 17/05/2000 TODO: highly suspect that the scale factor is inappropriate +#error check scale factor in ramp filter! +/* As realft uses only positive frequencies, the filter needs to be defined + only for those frequencies, so it has length/2 elements. + However, in general the values are complex, so the numbers of + real numbers is 2*length/2==length. + */ + float f = 0.0; + + for (Int i = 1; i <= length - 1; i += 2) { + f = (float) ((float) 0.5 * (i - 1) / length); + float nu_a = f ; + if (f <= fc) + filter[i] = nu_a * (alpha + (1. - alpha) * cos(_PI * f / fc)); + else + filter[i] = 0.0; + filter[i + 1] = 0.0; /* imaginary part */ + } + if (0.5 <= fc) /* see realft for an explanation:data[2]=last real */ + filter[2] = (0.5) * (alpha + (1. - alpha) * cos(_PI * f / fc)); + else + filter[2] = 0.; +#else + /* This computes the ramp filter in frequency space in 2 steps: + - sample the filter in real space + - perform a discrete FT to find values in the frequency domain + This gives better agreement with the filtering of a band-limited + function with the analytic ramp (with cut-off). + In particular, it solves a problem with the DC component of the + filter. Sampling the ramp in the frequency domain gives 0 for + DC component, resulting in images with negative tails. + */ + + assert(length%2==0); + + // first construct filter in 'real' space +#ifdef NRFFT + filter.set_offset(0); +#else + Array<1,float> filter(length); +#endif + + filter[0] = ramp_filter_in_space(0, sampledist, length, alpha, fc); + // note: filter[length/2] is set twice for even length, but that's fine + for (int n = 1; n <= length/2; n += 1) + { + filter[n] = ramp_filter_in_space(n, sampledist, length, alpha, fc); + filter[length-n] = filter[n]; + } + + //std::cerr <<"Ramp filter in real space = " < +#include +#endif + +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + +START_NAMESPACE_STIR + +std::string ColsherFilter::parameter_info() const +{ +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[2000]; + ostrstream s(str, 2000); +#else + std::ostringstream s; +#endif + s << "\nColsherFilter Parameters :=" +#ifdef NRFFT + << "\nFilter height := "<< height + << "\nFilter width := "<< width +#endif + << "\nMaximum aperture (theta_max) := "<< theta_max + << "\nCut-off in cycles along planar direction:= "<< fc_planar + << "\nCut-off in cycles along axial direction:= "<< fc_axial + << "\nAlpha parameter along planar direction := "< > filter(IndexRange2D(height,width/2+1)); + + // KT&Darren Hogg 03/07/2001 inserted correct scale factor + // TODO this assumes current value for the magic_number in backprojector + const float scale_factor = static_cast(4*_PI*d_a); + + for (int j = 0; j <= height/2; ++j) + { + const float fb = static_cast(j) / height; + const float nu_b = fb / d_b; + for (int k = 0; k <= width/2; ++k) + { + const float fa = (float) k / width; + const float nu_a = fa / d_a; + + float fil = 0; + if (fa < fc_planar && fb < fc_axial) + { + /* Colsher filter */ + const float omega = atan2(nu_b, nu_a); + const float psi = acos(sin(omega) * cos(theta)); + const float mod_nu = sqrt(nu_a * nu_a + nu_b * nu_b); + + if (cos(psi) >= cos(theta_max)) + fil = static_cast(mod_nu / 2. / _PI); + else + fil = static_cast(mod_nu / 4. / asin(sin(theta_max) / sin(psi))); + /* Apodizing Hanning window */; + fil *= + static_cast( + (alpha_planar + (1. - alpha_planar) * cos(_PI * fa / fc_planar)) + *(alpha_axial + (1. - alpha_axial)* cos(_PI * fb / fc_axial))); + fil *= scale_factor; + } + filter[j][k] = fil; + if (j>0) + filter[height-j][k] = fil; + } + } + //*********** now find it on normal grid by passing to 'real' space + + if (stretch_factor_planar>1 || stretch_factor_axial>1) + { + Array<2,float > colsher_real= + inverse_fourier_for_real_data_corrupting_input(filter); + // cut out tails. unfortunately that's a bit complicated because of wrap-around + colsher_real.resize(IndexRange2D(target_height,target_width)); + for (int j = 0; j < target_height/2; ++j) + { + for (int k = 0; k < target_width/2; k++) + { + if (j!=0) colsher_real[target_height-j][k] = colsher_real[j][k]; + if (j!=0 &&k!=0) colsher_real[target_height-j][target_width-k] = colsher_real[j][k]; + if (k!=0) colsher_real[j][target_width-k] = colsher_real[j][k]; + } + } + filter = fourier_for_real_data(colsher_real); + } + //*********** set kernel used for filtering + const Succeeded success= set_kernel_in_frequency_space(filter); + stop_timers(); + +#ifdef __DEBUG_COLSHER + { + // write to file + /* a bit complicated because we can only write Array's of real numbers. + Luckily, the Colsher filter is real in frequency space, so we can + copy its real part into an Array of floats. + */ + Array<2,float > real_filter(IndexRange2D(target_height,target_width/2+1)); + std::transform(filter.begin_all(), filter.end_all(), real_filter.begin_all(), + real_part/*std::real >*/); + char file[200]; + sprintf(file,"%s_%d_%d_%g.dat","new_colsher",target_width,target_height,theta); + std::cout << "Saving filter : " << file << std::endl; + std::ofstream s(file); + write_data(s,real_filter); + } +#endif +#ifdef __DEBUG_COLSHER + { + Array<2,float > PSF(IndexRange2D(-0,target_height/3,-target_width/3,target_width/3)); + PSF.fill(0); + PSF[0][0]=1; + this->operator()(PSF); + display(PSF,"PSF",PSF.find_max()/20); + } +#endif + return success; +} + +#else //NRFFT + +ColsherFilter::ColsherFilter(int height_v, int width_v, float gamma_v, float theta_max_v, + float d_a_v, float d_b_v, + float alpha_colsher_axial_v, float fc_colsher_axial_v, + float alpha_colsher_planar_v, float fc_colsher_planar_v) + : Filter2D(height_v, width_v),gamma(gamma_v), theta_max(theta_max_v), d_a(d_a_v), d_b(d_b_v), + alpha_axial(alpha_colsher_axial_v), fc_axial(fc_colsher_axial_v), + alpha_planar(alpha_colsher_planar_v), fc_planar(fc_colsher_planar_v) +{ + + if (height==0 || width==0) + return; + + int k, j; + float fa, fb, omega, psi; + float mod_nu, nu_a, nu_b; + double fil; + /* + * The Colsher filter is real-valued, so it has only height*width elements, + * going from [1..height*width]. It is arranged in wrap-around order + * in both dimensions, see Num.Rec.C, page 523 + */ + + int ii = 1;//float fmax = 0.F; + + // TODO don't use 0.5* for upper boundary + for (j = 0; j <= 0.5 * height; j++) { + fb = (float) j / height; + nu_b = fb / d_b; + for (k = 0; k <= 0.5 * width; k++) { + fa = (float) k / width; + nu_a = fa / d_a; + if (fa == 0. && fb == 0.) { + filter[ii++] = 0.F; + continue; + } + + omega = atan2(nu_b, nu_a); + psi = acos(sin(omega) * sin(gamma)); + mod_nu = sqrt(nu_a * nu_a + nu_b * nu_b); + + /* Colsher formula = fil = mod_nu / 4. / asin(sin(theta_max) / sin(psi)); */ + if (cos(psi) >= cos(theta_max)) + fil = mod_nu / 2. / _PI; + else + fil = mod_nu / 4. / asin(sin(theta_max) / sin(psi)); + + + /* Apodizing Hanning window */; + //CL 250899 In order to make similar to the CTI program, we use a damping window + //for both planar and axial direction + + if (fa < fc_planar && fb < fc_axial) + filter[ii++] = + static_cast( + fil * (alpha_planar + (1. - alpha_planar) * cos(_PI * fa / fc_planar)) + *(alpha_axial + (1. - alpha_axial)* cos(_PI * fb / fc_axial))); + else + filter[ii++] = 0.F; + + } + + + for (k = int (-0.5 * width) + 1; k <= -1; k++) { + fa = (float) k / width; + nu_a = fa / d_a; + omega = atan2(nu_b, -nu_a); + psi = acos(sin(omega) * sin(gamma)); + + + mod_nu = sqrt(nu_a * nu_a + nu_b * nu_b); + + if (cos(psi) >= cos(theta_max)) + fil = mod_nu / 2. / _PI; + else + fil = mod_nu / 4. / asin(sin(theta_max) / sin(psi)); + + + if (-fa < fc_planar && fb < fc_axial) + filter[ii++] = + static_cast(fil * (alpha_planar + (1. - alpha_planar) * cos(_PI * (-fa) / fc_planar)) + *(alpha_axial + (1. - alpha_axial)* cos(_PI * fb / fc_axial))); + else + filter[ii++] = 0.F; + + } + } + + for (j = int (-0.5 * height) + 1; j <= -1; j++) { + fb = (float) j / height; + nu_b = fb / d_b; + for (k = 0; k <= 0.5 * width; k++) { + fa = (float) k / width; + nu_a = fa / d_a; + omega = atan2(-nu_b, nu_a); + psi = acos(sin(omega) * sin(gamma)); + + mod_nu = sqrt(nu_a * nu_a + nu_b * nu_b); + + if (cos(psi) >= cos(theta_max)) + fil = mod_nu / 2. / _PI; + else + fil = mod_nu / 4. / asin(sin(theta_max) / sin(psi)); + + + if (fa < fc_planar && -fb < fc_axial) + filter[ii++] = + static_cast(fil * (alpha_planar + (1. - alpha_planar) * cos(_PI * fa / fc_planar)) + *(alpha_axial + (1. - alpha_axial)* cos(_PI * (-fb) / fc_axial))); + else + filter[ii++] = 0.F; + + } + + for (k = int (-0.5 * width) + 1; k <= -1; k++) { + fa = (float) k / width; + nu_a = fa / d_a; + omega = atan2(-nu_b, -nu_a); + psi = acos(sin(omega) * sin(gamma)); + + mod_nu = sqrt(nu_a * nu_a + nu_b * nu_b); + + if (cos(psi) >= cos(theta_max)) + fil = mod_nu / 2. / _PI; + else + fil = mod_nu / 4. / asin(sin(theta_max) / sin(psi)); + + if (-fa < fc_planar && -fb < fc_axial) + filter[ii++] = + static_cast(fil * (alpha_planar + (1. - alpha_planar) * cos(_PI * (-fa) / fc_planar)) + *(alpha_axial + (1. - alpha_axial)* cos(_PI * (-fb) / fc_axial))); + else + filter[ii++] = 0.F; + + + } + } + + // KT&Darren Hogg 03/07/2001 inserted correct scale factor + // TODO this assumes current value for the magic_number in backprojector + filter *= static_cast(4*_PI*d_a); + + +#ifdef __DEBUG_COLSHER + { + char file[200]; + sprintf(file,"%s_%d_%d_%g.dat","old_colsher",width,height,_PI/2-gamma); + std::cout << "Saving filter : " << file << std::endl; + std::ofstream s(file); + write_data(s,filter); + } +#endif +} + +void Filter_proj_Colsher(Viewgram & view_i, + Viewgram & view_i1, + ColsherFilter& CFilter, + int PadS, int PadZ) +{ + // start_timers(); + + const int rmin = view_i.get_min_axial_pos_num(); + const int rmax = view_i.get_max_axial_pos_num(); + int nrings = rmax - rmin + 1; + int nprojs = view_i.get_num_tangential_poss(); + + int width = (int) pow(2, ((int) ceil(log((PadS + 1.) * nprojs) / log(2.)))); + int height = (int) pow(2, ((int) ceil(log((PadZ + 1.) * nrings) / log(2.)))); + + const int maxproj = view_i.get_max_tangential_pos_num(); + const int minproj = view_i.get_min_tangential_pos_num(); + + int roffset = -rmin * width *2; + Array<1,float> data(1,2 * height * width); + + + for (int j = rmin; j <= rmax; j++) + { + for (int k = minproj; k <= maxproj; k++) { + data[roffset + 2 * j * width + 2 * (k - minproj) + 1] = view_i[j][k]; + data[roffset + 2 * j * width + 2 * (k - minproj) + 2] = view_i1[j][k]; + } + } + { + + CFilter.apply(data); + } + + + + + for (int j = rmin; j <= rmax; j++) + { + for (int k = minproj; k <= maxproj; k++) + { + view_i[j][k] = data[roffset + 2 * j * width + 2 * (k - minproj) + 1]; + view_i1[j][k] =data[roffset + 2 * j * width + 2 * (k - minproj) + 2]; + } + } + + // stop_timers(); + +} + +#endif //NRFFT +END_NAMESPACE_STIR diff --git a/src/analytic/FBP3DRP/FBP3DRP.cxx b/src/analytic/FBP3DRP/FBP3DRP.cxx new file mode 100644 index 0000000000..a21749f65e --- /dev/null +++ b/src/analytic/FBP3DRP/FBP3DRP.cxx @@ -0,0 +1,54 @@ +// +// +/*! + \file + \ingroup reconstructors + \brief Main program for FBP3DRP reconstruction + \author Claire LABBE + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2004, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/analytic/FBP3DRP/FBP3DRPReconstruction.h" +#ifndef PARALLEL + +#define Main main +#else +#define Main master_main +#endif + +#ifndef STIR_NO_NAMESPACE +using std::endl; +using std::cerr; + +#endif +USING_NAMESPACE_STIR + +int Main(int argc, char **argv) +{ + FBP3DRPReconstruction + reconstruction_object(argc>1?argv[1]:""); + + + return reconstruction_object.reconstruct() == Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; +} + + diff --git a/src/analytic/FBP3DRP/FBP3DRPReconstruction.cxx b/src/analytic/FBP3DRP/FBP3DRPReconstruction.cxx new file mode 100644 index 0000000000..c9c38c08c7 --- /dev/null +++ b/src/analytic/FBP3DRP/FBP3DRPReconstruction.cxx @@ -0,0 +1,1039 @@ +/*! + \file + \ingroup FBP3DRP + \brief FBP3DRP reconstruction implementation + \author Kris Thielemans + \author Claire LABBE + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details. +*/ + +/* + Modification history: (highlights in anti-chronological order) + KT Oct 2004 + - no longer use Numerical Recipes fourier + - option to 'stretch' the colsher filter during definition for better results + + KT 05/10/2003 + - decrease dependency on symmetries by using symmetries_ptr->is_basic(). + Before this, we relied explicitly on the range + 0<=segment_num, 0<=view_num<=num_views()/4 + This range was fine when using the interpolating backprojector + and x and y voxel size are equal. + - moved some 2D-reconstruction stuff to FBP2DReconstruction class. + - merged Parameter class into Reconstruction class + + KT&SM 05/05/2000 + - corrected bug in z_position while determining rmin,rmax + (previous result was wrong for span>1) + - corrected bug in virtual_ring_offset in case of images with an even number + of planes + - some adjustements to allow for even number of planes + - make sure that everything works when there are no missing projections + in the data (i.e. rmin>rmin_orig) + KT 11/04/2000 + - removed (old!) bug by adjusting range for rmin (and hence rmax) + to use 'floor' instead of 'ceil'. Result was that sometimes 1 + missing projection was not filled in. So, better axial uniformity now. + - moved rmin,rmax determination to a separate function, as this is now more complicated + They are now determined in virtual_ring_units, even for the span case. span case + works now correctly ! + + KT&CL 160899 + 3 changes that solve the dependency of the global normalisation + on max_delta: + -changed parameter of Colsher from max_delta+1 to max_delta + - add scaling factors according to num_ring_differences_in_this_segment + - approximate analytic integral over delta by having a 1/2 in the + backprojection of the last segment +*/ +//CL 1st June 1999 +// DIstinguish the alpha and Nyquist parameters from RAmp and Colsher filter +// by alpha_ramp and alpha_colsher (i.e for fc) + +//CL 15 MARCH 1999 +//NOW DONE: +// 1. Remove the write_PSOV_interfile_header as it is not needed +// 2. Change the defaut value of mashing to 1 instead of 0 +// 3. Change the fovrad formula for calculating rmin and rmax +// by setting the number of bins of the segment and not of the scanner +// 4. The axial uniformity for data with span >1, seems to be OK except on the 3 fisrt and last planes +// 5. Drastic chnages in filtColsher.cxx as the definition of the +// Colsher filter is done out of the view loop. This will speed up the +// FBP3DRP implementation + +#include "stir/RelatedViewgrams.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Sinogram.h" +#include "stir/IndexRange3D.h" +#include "stir/Coordinate3D.h" +#include "stir/Succeeded.h" + +#include "stir/analytic/FBP3DRP/ColsherFilter.h" +#include "stir/display.h" +//#include "stir/recon_buildblock/distributable.h" +//#include "stir/FBP3DRP/process_viewgrams.h" + +#include "stir/analytic/FBP3DRP/FBP3DRPReconstruction.h" +#include "stir/analytic/FBP2D/FBP2DReconstruction.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/utilities.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/IO/read_from_file.h" +//#include "stir/mash_views.h" + +#include +#include +#include +#include +#include +// for asctime() +#include + +#ifndef STIR_NO_NAMESPACE +using std::cerr; +using std::endl; +using std::ofstream; +using std::ios; +#endif + +START_NAMESPACE_STIR + + + +// should be private member, TODO +static ofstream full_log; + +// terribly ugly. can be replaced using LORCoordinates stuff (TODO) +static void find_rmin_rmax(int& rmin, int& rmax, + const ProjDataInfoCylindrical& proj_data_info_cyl, + const int seg_num, + const VoxelsOnCartesianGrid& image) +{ + + const float fovrad = + proj_data_info_cyl.get_s(Bin(0,0,0,proj_data_info_cyl.get_num_tangential_poss()/2 - 1)); + // Compute minimum and maximum rings of 'missing' projections + + const float delta=proj_data_info_cyl.get_average_ring_difference(seg_num); + + // find correspondence between ring coordinates and image coordinates: + // z = num_planes_per_virtual_ring * ring + virtual_ring_offset + // compute the offset by matching up the centre of the scanner + // in the 2 coordinate systems + // TODO get all this from ProjDataInfo or so + + const int num_planes_per_virtual_ring = + (proj_data_info_cyl.get_max_ring_difference(seg_num) == proj_data_info_cyl.get_min_ring_difference(seg_num)) ? 2 : 1; + const int num_virtual_rings_per_physical_ring = + (proj_data_info_cyl.get_max_ring_difference(seg_num) == proj_data_info_cyl.get_min_ring_difference(seg_num)) ? 1 : 2; + + + const float virtual_ring_offset = + (image.get_max_z() + image.get_min_z())/2.F + - num_planes_per_virtual_ring + *(proj_data_info_cyl.get_max_axial_pos_num(seg_num)+ num_virtual_rings_per_physical_ring*delta + + proj_data_info_cyl.get_min_axial_pos_num(seg_num))/2; + + + // we first consider the LOR at s=0, phi=0 which goes through z=0,y=0, x=fovrad + // later on, we will shift it to the 'left'most edge of the FOV. + + // find z position of intersection of this LOR with the detector radius + // (i.e. y=0, x=-ring_radius) + // use image coordinates first + float z_in_image_coordinates = + -delta*num_planes_per_virtual_ring*num_virtual_rings_per_physical_ring* + (fovrad + proj_data_info_cyl.get_ring_radius())/(2*proj_data_info_cyl.get_ring_radius()); + // now shift it to the edge of the FOV + // (taking into account that z==get_min_z() is in the middle of the voxel) + z_in_image_coordinates += image.get_min_z() - .5F; + + // now convert to virtual_ring_coordinates using z = num_planes_per_virtual_ring * ring + virtual_ring_offset + const float z_in_virtual_ring_coordinates = + (z_in_image_coordinates - virtual_ring_offset)/num_planes_per_virtual_ring; + + // finally find the 'ring' number + rmin = static_cast(floor(z_in_virtual_ring_coordinates)); + + + // rmax is determined by using symmetry: at both ends there are just as many missing rings + rmax = proj_data_info_cyl.get_max_axial_pos_num(seg_num) + (proj_data_info_cyl.get_min_axial_pos_num(seg_num) - rmin); +} + + + + +void +FBP3DRPReconstruction:: +set_defaults() +{ + base_type::set_defaults(); + + alpha_colsher_axial = 1; + fc_colsher_axial = 0.5; + alpha_colsher_planar = 1; + fc_colsher_planar = 0.5; + alpha_ramp = 1; + fc_ramp = 0.5; + + num_segments_to_combine = -1; + + PadS = 1; + PadZ = 1; + + colsher_stretch_factor_planar=2; + colsher_stretch_factor_axial=2; + + display_level=0; + save_intermediate_files=0; + + forward_projector_sptr. + reset(new ForwardProjectorByBinUsingRayTracing); + back_projector_sptr. + reset(new BackProjectorByBinUsingInterpolation( + /*use_piecewise_linear_interpolation = */false, + /*use_exact_Jacobian = */ false)); +} + +void +FBP3DRPReconstruction::initialise_keymap() +{ + base_type::initialise_keymap(); + + parser.add_start_key("FBP3DRPParameters"); + parser.add_stop_key("End"); + + // parser.add_key("Read data into memory all at once", + // &on_disk ); + parser.add_key("image to be used for reprojection", &image_for_reprojection_filename); + + // TODO move to 2D recon + parser.add_key("num_segments_to_combine with SSRB", &num_segments_to_combine); + parser.add_key("Alpha parameter for Ramp filter", &alpha_ramp); + parser.add_key("Cut-off for Ramp filter (in cycles)",&fc_ramp); + + parser.add_key("Transaxial extension for FFT", &PadS); + parser.add_key("Axial extension for FFT", &PadZ); + + parser.add_key("Alpha parameter for Colsher filter in axial direction", + &alpha_colsher_axial); + parser.add_key("Cut-off for Colsher filter in axial direction (in cycles)", + &fc_colsher_axial); + parser.add_key("Alpha parameter for Colsher filter in planar direction", + &alpha_colsher_planar); + parser.add_key("Cut-off for Colsher filter in planar direction (in cycles)", + &fc_colsher_planar); + parser.add_key("Stretch factor for Colsher filter definition in axial direction", + &colsher_stretch_factor_axial); + parser.add_key("Stretch factor for Colsher filter definition in planar direction", + &colsher_stretch_factor_planar); + + parser.add_parsing_key("Back projector type", &back_projector_sptr); + parser.add_parsing_key("Forward projector type", &forward_projector_sptr); + + parser.add_key("Save intermediate images", &save_intermediate_files); + parser.add_key("Display level",&display_level); +} + + + +void +FBP3DRPReconstruction::ask_parameters() +{ + + base_type::ask_parameters(); + + // bool on_disk = !ask("(1) Read data into memory all at once ?", false); +// TODO move to Reconstruction + + +// PARAMETERS => DISPLAY_LEVEL + + display_level = ask_num("Which images would you like to display \n\t(0: None, 1: Final, 2: intermediate, 3: after each view) ? ", 0,3,0); + + save_intermediate_files =ask_num("Would you like to save all the intermediate images ? ",0,1,0 ); + + image_for_reprojection_filename = + ask_string("filename of image to be reprojected (empty for using FBP):"); + +// PARAMETERS => ZEROES-PADDING IN FFT (PADS, PADZ) + cerr << "\nFilter parameters for 2D and 3D reconstruction"; +#if 0 + PadS = ask_num(" Transaxial extension for FFT : ",0,2, 1); + PadZ = ask_num(" Axial extension for FFT :",0,2, 1); +#endif + +// PARAMETERS => 2D RECONSTRUCTION RAMP FILTER (ALPHA, FC) + cerr << endl << "For 2D reconstruction filtering (Ramp filter) : " ; + + num_segments_to_combine = ask_num("num_segments_to_combine (must be odd).\nDefault means 1 or 3 depending on axial compression of input",-1,101,-1); + // TODO check odd + alpha_ramp = ask_num(" Alpha parameter for Ramp filter ? ",0.,1., 1.); + + fc_ramp = ask_num(" Cut-off frequency for Ramp filter ? ",0.,.5, 0.5); + +// PARAMETERS => 3D RECONSTRUCTION COLSHER FILTER (ALPHA, FC) + cerr << "\nFor 3D reconstruction filtering (Colsher filter) : "; + + alpha_colsher_axial = ask_num(" Alpha parameter for Colsher filter in axial direction ? ",0.,1., 1.); + + fc_colsher_axial = ask_num(" Cut-off frequency for Colsher filter in axial direction ? ",0.,.5, 0.5); + + + alpha_colsher_planar = ask_num(" Alpha parameter for Colsher filter in planar direction ? ",0.,1., 1.); + + fc_colsher_planar = ask_num(" Cut-off frequency fo Colsher filter in planar direction ? ",0.,.5, 0.5); + + +#if 0 + // do not ask the user for the projectors to prevent entering silly things + do + { + back_projector_sptr = + BackProjectorByBin::ask_type_and_parameters(); + } + while (is_null_ptr(back_projector_sptr)); + do + { + forward_projector_sptr = + ForwardProjectorByBin::ask_type_and_parameters(); + } + while (is_null_ptr(forward_projector_sptr)); +#endif +} + +string +FBP3DRPReconstruction:: +method_info() const +{ return("FBP3DRP"); } + +FBP3DRPReconstruction::~FBP3DRPReconstruction() +{} + +VoxelsOnCartesianGrid& +FBP3DRPReconstruction::estimated_image() +{ + return static_cast&>(*image_estimate_density_ptr); +} + +const VoxelsOnCartesianGrid& +FBP3DRPReconstruction::estimated_image() const +{ + return static_cast&>(*image_estimate_density_ptr); +} + +const ProjDataInfoCylindrical& +FBP3DRPReconstruction::input_proj_data_info_cyl() const +{ + return + static_cast + (*proj_data_ptr->get_proj_data_info_ptr()); +} + +FBP3DRPReconstruction:: +FBP3DRPReconstruction(const string& parameter_filename) +{ + initialise(parameter_filename); +} + +FBP3DRPReconstruction::FBP3DRPReconstruction() +{ + set_defaults(); +} + +Succeeded +FBP3DRPReconstruction:: +actual_reconstruct(shared_ptr > const& target_image_ptr) +{ + VoxelsOnCartesianGrid& image = + dynamic_cast &>(*target_image_ptr); + // set default values such that it will work also in the case of already_2D_recon + alpha_fit = 1.0F; + beta_fit = 0.0F; + + // TODO move to post_processing() + { + if (dynamic_cast (proj_data_ptr->get_proj_data_info_ptr()) == 0) + error("FBP3DRP currently needs cylindrical projection data. Sorry\n"); + + if (colsher_stretch_factor_planar<1 || colsher_stretch_factor_axial<1) + { + warning("stretch factors for Colsher filter have to be at least 1"); + return Succeeded::no; + } + + if (PadS<1 || PadZ<1) + warning("Transaxial extension for FFT:=0 (or axial) should \n" + "ONLY be used when the non-zero data\n" + "occupy only half of the FOV. Otherwise aliasing will occur!"); + + if (is_null_ptr(back_projector_sptr)) + { + warning("Back projector not set.\n"); + return Succeeded::no; + } + if (is_null_ptr(forward_projector_sptr)) + { + warning("Forward projector not set.\n"); + return Succeeded::no; + } + + } + start_timers(); + { + //char file[max_filename_length]; + //sprintf(file,"%s.full_log",output_filename_prefix.c_str()); + string file = output_filename_prefix; + file += ".full_log"; + full_log.open(file.c_str(), ios::out); + if (!full_log) + error("Couldn't open full_log file %s", file.c_str()); + } + + full_log << parameter_info(); + full_log << "\n\n********** PROCESSING FBP3DRP RECONSTRUCTION *************" << endl; + + const int old_max_segment_num_to_process = max_segment_num_to_process; + + // Use funny convention that -1 means 'use maximum available' + if (max_segment_num_to_process<0) + max_segment_num_to_process = proj_data_ptr->get_max_segment_num(); + else if (max_segment_num_to_process>proj_data_ptr->get_max_segment_num()) + { + warning("max_segment_num_to_process was too large (%d) for this data, setting it to %d", + max_segment_num_to_process, + proj_data_ptr->get_max_segment_num()); + max_segment_num_to_process = proj_data_ptr->get_max_segment_num(); + } + +#ifndef NRFFT + const float theta_max = + atan(proj_data_ptr->get_proj_data_info_ptr()-> + get_tantheta(Bin(max_segment_num_to_process,0,0,0))); + + colsher_filter = + ColsherFilter(theta_max, + static_cast(alpha_colsher_axial), static_cast(fc_colsher_axial), + static_cast(alpha_colsher_planar), static_cast(fc_colsher_planar), + colsher_stretch_factor_planar, + colsher_stretch_factor_axial); +#else + warning("Using NRFFT"); +#endif + + if(image_for_reprojection_filename == "") + { + do_2D_reconstruction(); + +#if 0 + if (fit_projections==1){//Fitting between measured and estimaed sinograms + full_log << " - Fitting projections" << endl; //CL 010699 Forward project measured sinograms and fitting with alpha and beta + + // From the paper of M. Defrise et al., Phys. Med. Biol. 1990 Vol. 35, No 10, pp1361-1372 + // As the forwrad projected sinograms have, in general, a different scaling factor + // to the measured sinograms, it is necessary to rescale the former. + // The appropriate scaling factors are obtained by forwarding projecting + // a typical measured sinogram and then fitting the forward projected sinogram + // to the corresponding measurements using a linear least squares methods + // The coefficients from the fit are then used to rescale all forward projected sinograms + + // Computes the global coefficients alpha and beta for the best fit of alpha*calculated+beta with measured. + // Look for the plane of the highest activity in the measured sinograms + int plane_with_max_activity =0; + float max_activity = 0.F; + for (int plane = estimated_image().get_min_z(); plane <= estimated_image().get_max_z();plane++){ + const float current_max = (estimated_image())[plane].find_max(); + if (max_activity < current_max){ + max_activity = current_max; + plane_with_max_activity = plane; + } + } + { + full_log << " - Maximum activity = " << max_activity << " in plane= " << plane_with_max_activity << endl; + + //Now forward only on this plane + Sinogram sino_fwd_pos = + direct_sinos_ptr->get_proj_data_info_ptr()->get_empty_sinogram(plane_with_max_activity, 0); + + full_log << " Forward projection on one ring which contains maximum activity from seg0" << endl; + //KTTODO forward_project_2D(estimated_image(),sino_fwd_pos, plane_with_max_activity); + error("Fitting not yet implemented\n"); + // Calculate the fitting the coefficients alpha_fit and beta_fit + // according to alpha_fit x + beta_fit + do_best_fit(direct_sinos_ptr->get_sinogram(plane_with_max_activity),sino_fwd_pos); + } + }else{ + alpha_fit = 1.F; + beta_fit = 0.F; + } +#endif + } + else + { + do_read_image2D(); + // TODO set fit parameters + } + + // find out if arc-correction if necessary + // and initialise proj_data_info_with_missing_data_sptr accordingly + { + if (dynamic_cast + (proj_data_ptr->get_proj_data_info_ptr()) != 0) + { + // it's already arc-corrected + arc_correction_sptr.reset(); // just rest to make sure in case we run the reconstruction twice + proj_data_info_with_missing_data_sptr = + proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(); + } + else + { + arc_correction_sptr.reset(new ArcCorrection); + // TODO arc-correct to voxel_size + if (arc_correction_sptr->set_up(proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone()) == + Succeeded::no) + return Succeeded::no; + + full_log << "FBP3DRP will arc-correct data first\n"; + // warning: need to use clone() as we're modifying it later on + proj_data_info_with_missing_data_sptr = + arc_correction_sptr->get_arc_corrected_proj_data_info_sptr()->create_shared_clone(); + } + } + + // make space for missing data + { + proj_data_info_with_missing_data_sptr-> + reduce_segment_range(-max_segment_num_to_process, + max_segment_num_to_process); + for (int segment_num= proj_data_info_with_missing_data_sptr->get_min_segment_num(); + segment_num<= proj_data_info_with_missing_data_sptr->get_max_segment_num(); + ++segment_num) + { + // note: initialisation to 0 to avoid compiler warnings, + // but will be set by find_rmin_rmax + int new_min_axial_pos_num = 0; + int new_max_axial_pos_num = 0; + find_rmin_rmax(new_min_axial_pos_num, new_max_axial_pos_num, + input_proj_data_info_cyl(), segment_num, image); + proj_data_info_with_missing_data_sptr-> + set_min_axial_pos_num(new_min_axial_pos_num, segment_num); + proj_data_info_with_missing_data_sptr-> + set_max_axial_pos_num(new_max_axial_pos_num, segment_num); + } + } + + { + // set projectors to be used for the calculations + forward_projector_sptr->set_up(proj_data_info_with_missing_data_sptr, + image_estimate_density_ptr); + back_projector_sptr->set_up(proj_data_info_with_missing_data_sptr, + target_image_ptr); +#if 0 + do when enabling callbacks + set_projectors_and_symmetries(forward_projector_sptr, + back_projector_sptr, + back_projector_sptr->get_symmetries_used()->clone()); +#endif + } + + if(max_segment_num_to_process!=0) + do_3D_Reconstruction(image ); + else + { + // TODO + warning("\nOutput image will NOT be zoomed.\n"); + image = estimated_image(); + } + if(display_level>0) + display(image, image.find_max(), "Final image"); + + stop_timers(); + do_log_file(image); + + full_log.close(); + + // restore max_segment_num_to_process to its original value, + // just in case someone wants to use the reconstruction object twice + max_segment_num_to_process = old_max_segment_num_to_process; + + return Succeeded::yes; +} + + + + +void FBP3DRPReconstruction::do_2D_reconstruction() +{ // SSRB+2D FBP with ramp filter + + full_log << "\n---------------------------------------------------------\n"; + full_log << "2D FBP OF DIRECT SINOGRAMS (=> IMAGE_ESTIMATE)\n" << endl; + + + // image_estimate should have 'default' dimensions, origin and voxel_size + image_estimate_density_ptr. + reset(new VoxelsOnCartesianGrid(*proj_data_ptr->get_proj_data_info_ptr())); + + { + FBP2DReconstruction recon2d(proj_data_ptr, + alpha_ramp, fc_ramp, PadS, + num_segments_to_combine); + full_log << "Parameters of the 2D FBP reconstruction" << endl; + full_log << recon2d.parameter_info()<< endl; + recon2d.reconstruct(image_estimate_density_ptr); + } + + full_log << " - min and max in SSRB+FBP image " << estimated_image().find_min() + << " " << estimated_image().find_max() << " SUM= " << estimated_image().sum() << endl; + + if(display_level>1) { + full_log << " - Displaying estimated image" << endl; + display(estimated_image(),estimated_image().find_max(), "Image estimate"); + } + + if (save_intermediate_files) + { + char file[max_filename_length]; + sprintf(file,"%s_estimated",output_filename_prefix.c_str()); + do_save_img(file,estimated_image() ); + } +} + + + + +void FBP3DRPReconstruction::do_save_img(const char *file, const VoxelsOnCartesianGrid &data) const +{ + full_log <<" - Saving " << file << endl; + output_file_format_ptr->write_to_file( file, data); + full_log << " Min= " << data.find_min() + << " Max = " << data.find_max() + << " Sum = " << data.sum() << endl; + +} + +void FBP3DRPReconstruction::do_read_image2D() +{ + full_log <<" - Reading estimated image : "<< image_for_reprojection_filename << endl; + + image_estimate_density_ptr = + read_from_file >(image_for_reprojection_filename.c_str() ); + + // TODO do scale checks + +} + + + +void FBP3DRPReconstruction::do_3D_Reconstruction( + VoxelsOnCartesianGrid &image) +{ + + full_log << "\n---------------------------------------------------------\n"; + full_log << "3D PROCESSING\n" << endl; + + do_byview_initialise(image); + + // TODO check if forward projector and back projector have compatible symmetries + shared_ptr symmetries_sptr( + back_projector_sptr->get_symmetries_used()->clone()); + + for (int seg_num= -max_segment_num_to_process; seg_num <= max_segment_num_to_process; seg_num++) + { + + // a bool value that will be used to determine if we are starting processing for this segment + bool first_view_in_segment = true; + + const int orig_min_axial_pos_num = proj_data_ptr->get_min_axial_pos_num(seg_num); + const int orig_max_axial_pos_num = proj_data_ptr->get_max_axial_pos_num(seg_num); + + for (int view_num=proj_data_ptr->get_min_view_num(); view_num <= proj_data_ptr->get_max_view_num(); ++view_num) { + const ViewSegmentNumbers vs_num(view_num, seg_num); + if (!symmetries_sptr->is_basic(vs_num)) + continue; + + const int new_min_axial_pos_num = + proj_data_info_with_missing_data_sptr->get_min_axial_pos_num(seg_num); + const int new_max_axial_pos_num = + proj_data_info_with_missing_data_sptr->get_max_axial_pos_num(seg_num); + + if (first_view_in_segment) + { + full_log << "\n--------------------------------\n"; + full_log << "PROCESSING SEGMENT No " << seg_num << endl ; + + full_log << "Average delta= " << input_proj_data_info_cyl().get_average_ring_difference(seg_num) + << " with span= " << input_proj_data_info_cyl().get_max_ring_difference(seg_num) - input_proj_data_info_cyl().get_min_ring_difference(seg_num) +1 + << " and extended axial position numbers: min= " << new_min_axial_pos_num << " and max= " << new_max_axial_pos_num < viewgrams = + proj_data_ptr->get_related_viewgrams(vs_num, symmetries_sptr); + + do_process_viewgrams( + viewgrams, + new_min_axial_pos_num, new_max_axial_pos_num, orig_min_axial_pos_num, orig_max_axial_pos_num, + image); + + + } + // do some logging etc, but only when this segment had any processing + // (some segment_nums might not because of the symmetries) + if (!first_view_in_segment) + { + full_log << "\n*************************************************************"; + full_log << "\nEnd of this segment. Current image values:\n" + << "Min= " << image.find_min() + << " Max = " << image.find_max() + << " Sum = " << image.sum() << endl; +#ifndef PARALLEL + if(save_intermediate_files){ + char *file = new char[output_filename_prefix.size() + 20]; + sprintf(file,"%s_afterseg%d",output_filename_prefix.c_str(),seg_num); + do_save_img(file, image); + delete[] file; + } + } +#endif + } + // Normalise the image + if (dynamic_cast(back_projector_sptr.get()) == 0) + { + // TODO remove magic, is a scale factor in the interpolating backprojector (for which we compensate in the Colsher filter) + const float magic_number=2*input_proj_data_info_cyl().get_ring_radius()*input_proj_data_info_cyl().get_num_views()/input_proj_data_info_cyl().get_ring_spacing(); + image /= magic_number; + } + + do_byview_finalise(image); + + +} + + +// CL 010699 NEW function +void FBP3DRPReconstruction::do_best_fit(const Sinogram &sino_measured,const Sinogram &sino_calculated) +{ + float meas_calc = 0.F; + float meas_square = 0.F; + float calc_square = 0.F; + float sigma_square = 0.F; + full_log << " - Fitting estimated sinograms with the measured ones (Max in measured sino = " << sino_measured.find_max() + << " Max in fwd sino = " << sino_calculated.find_max() << ")" <forward_project(viewgrams, estimated_image(), + new_min_axial_pos_num ,orig_min_axial_pos_num-1); + + } + + if (orig_max_axial_pos_num+1 <= new_max_axial_pos_num) + { + full_log << " - Forward projection from ring No " + << orig_max_axial_pos_num+1 + << " to " << new_max_axial_pos_num << endl; + + forward_projector_sptr->forward_project(viewgrams, estimated_image(), + orig_max_axial_pos_num+1, new_max_axial_pos_num); + + } +#if 0 + if (fit_projections) + { + // fitting for viewgrams + // Adjusting estimated sinograms by using the fitting coefficients : + // sino = sino * alpha_fit + beta_fit; + + full_log << " - Adjusting all sinograms with alpha = " << alpha_fit << " and beta = " << beta_fit << endl; + // TODO This is wrong: it adjusts the measured projections as well !!! + // It needs a loop over axial_poss from new_min_axial_pos_num to orig_min_axial_pos_num, etc. + error("This is not correctly implemented at the moment. disable fitting (recommended)\n"); + //viewgrams *= alpha_fit ; + //viewgrams += beta_fit; + } +#endif + + if(display_level>2) { + display( viewgrams,viewgrams.find_max(),"Original+Forward projected"); + } +} + + +void FBP3DRPReconstruction::do_colsher_filter_view( RelatedViewgrams & viewgrams) +{ + + assert(dynamic_cast + (viewgrams.get_proj_data_info_ptr())); + + // TODO make into object member instead of static + static int prev_seg_num = viewgrams.get_proj_data_info_ptr()->get_min_segment_num()-1; +#ifdef NRFFT + static ColsherFilter colsher_filter(0,0,0,0,0,0,0,0,0,0); +#endif + const int seg_num = viewgrams.get_basic_segment_num(); + + if (prev_seg_num != seg_num) + { + prev_seg_num = seg_num; + full_log << " - Constructing Colsher filter for this segment\n"; + const int nrings = viewgrams.get_num_axial_poss(); + const int nprojs = viewgrams.get_num_tangential_poss(); + + const int width = (int) pow(2., ((int) ceil(log((PadS + 1.) * nprojs) / log(2.)))); + const int height = (int) pow(2., ((int) ceil(log((PadZ + 1.) * nrings) / log(2.)))); + + + const float theta_max = atan(viewgrams.get_proj_data_info_ptr()->get_tantheta(Bin(max_segment_num_to_process,0,0,0))); + + const float theta = + static_cast(atan(viewgrams.get_proj_data_info_ptr()->get_tantheta(Bin(seg_num,0,0,0)))); + + const float sampling_in_s = + viewgrams.get_proj_data_info_ptr()->get_sampling_in_s(Bin(seg_num,0,0,0)); + const float sampling_in_t = + viewgrams.get_proj_data_info_ptr()->get_sampling_in_t(Bin(seg_num,0,0,0)); + full_log << "Colsher filter theta_max = " << theta_max << " theta = " << theta + << " d_a = " << sampling_in_s + << " d_b = " << sampling_in_t << endl; + + +#ifdef NRFFT + colsher_filter = + ColsherFilter(height, width, _PI/2 - theta, theta_max, + sampling_in_s, + sampling_in_t, + alpha_colsher_axial, fc_colsher_axial, + alpha_colsher_planar, fc_colsher_planar); +#else + if (colsher_filter.set_up(height, width, + theta, + sampling_in_s, + sampling_in_t) + != Succeeded::yes) + error("Exiting"); +#endif + } + + full_log << " - Apply Colsher filter to complete oblique sinograms" << endl; +#ifdef NRFFT + + assert(viewgrams.get_num_viewgrams()%2 == 0); + + RelatedViewgrams::iterator viewgram_iter = viewgrams.begin(); + + for (; viewgram_iter != viewgrams.end(); viewgram_iter+=2) + Filter_proj_Colsher(*viewgram_iter, *(viewgram_iter+1), + colsher_filter, + PadS, PadZ); + +#else + + // do not use std::for_each. at present on gcc it copies the filter for every viewgram + // std::for_each(viewgrams.begin(), viewgrams.end(), + // colsher_filter); + RelatedViewgrams::iterator viewgram_iter = viewgrams.begin(); + for (; viewgram_iter != viewgrams.end(); ++viewgram_iter) + colsher_filter(*viewgram_iter); + +#endif + /* If the segment is really an amalgam of different ring differences, + we have to multiply it with the number of ring differences + in the segment. + This is to assure that backprojecting each ring difference + on its own would give roughly the same result. + + TODO: should this be put in the backprojector itself ? + */ + { + const int num_ring_differences = + input_proj_data_info_cyl().get_max_ring_difference(seg_num) - + input_proj_data_info_cyl().get_min_ring_difference(seg_num) + 1; + full_log << " - Multiplying filtered projections by " << num_ring_differences << endl; + if (num_ring_differences != 1){ + viewgrams *= static_cast(num_ring_differences); + } + + } + if(display_level>2) { + display( viewgrams,viewgrams.find_max(), "Colsher filtered"); + } +} + + +void FBP3DRPReconstruction::do_3D_backprojection_view(const RelatedViewgrams & viewgrams, + VoxelsOnCartesianGrid &image, + int new_min_axial_pos_num, int new_max_axial_pos_num) +{ + full_log << " - Backproject the filtered Colsher complete sinograms" << endl; + + back_projector_sptr->back_project(image, viewgrams,new_min_axial_pos_num, new_max_axial_pos_num); + +} + + + +void FBP3DRPReconstruction::do_log_file(const VoxelsOnCartesianGrid &image) +{ + char file[max_filename_length]; + sprintf(file,"%s.log",output_filename_prefix.c_str()); + + full_log << endl << "- WRITE LOGFILE (" + << file << ")" << endl; + + ofstream logfile(file); + + if (logfile.fail() || logfile.bad()) { + warning("Error opening log file\n"); + return; + } + full_log << endl ; + + const time_t now = time(NULL); + + logfile << "Date of the image reconstruction : " << asctime(localtime(&now)) + << parameter_info() ; + + +#ifndef PARALLEL + logfile << "\n\n TIMING RESULTS :\n" + << "Total CPU time : " << get_CPU_timer_value() << '\n' + << "forward projection CPU time : " << forward_projector_sptr->get_CPU_timer_value() << '\n' + << "back projection CPU time : " << back_projector_sptr->get_CPU_timer_value() << '\n' +#ifndef NRFFT + << "Colsher filter set-up CPU time : " << colsher_filter.get_CPU_timer_value() << '\n' +#endif + ; +#endif +} + + +void FBP3DRPReconstruction::do_process_viewgrams(RelatedViewgrams & viewgrams, + int new_min_axial_pos_num, int new_max_axial_pos_num, + int orig_min_axial_pos_num, int orig_max_axial_pos_num, + VoxelsOnCartesianGrid &image) +{ + do_arc_correction(viewgrams); + + do_grow3D_viewgram(viewgrams, new_min_axial_pos_num, new_max_axial_pos_num); + + do_forward_project_view(viewgrams, + new_min_axial_pos_num, new_max_axial_pos_num, orig_min_axial_pos_num, orig_max_axial_pos_num); + + do_colsher_filter_view(viewgrams); + + + + /* The backprojection here is really an approximation of a continuous integral + over delta and phi, where + -max_delta <= delta <= max_delta + 0 <= phi < pi + We discretise the integral over delta by summing values + at discrete ring differences. However, we include the boundary points. + The appropriate formula for the integral is then + f(-max_delta)/2 + f(-max_delta+1) + ... f(max_delta-1) + f(max_delta/2) + Note the factors 1/2 at the boundary. + These are inserted below + */ + if (abs(viewgrams.get_basic_segment_num()) == max_segment_num_to_process) + { + viewgrams /= 2; + } + + do_3D_backprojection_view(viewgrams, + image, + new_min_axial_pos_num, new_max_axial_pos_num); + +} + + +END_NAMESPACE_STIR diff --git a/src/analytic/FBP3DRP/exe.mk b/src/analytic/FBP3DRP/exe.mk new file mode 100644 index 0000000000..d6673cd1f7 --- /dev/null +++ b/src/analytic/FBP3DRP/exe.mk @@ -0,0 +1,16 @@ +# +# + +dir:=analytic/FBP3DRP + +$(dir)_SOURCES = \ + FBP3DRP.cxx + +include $(WORKSPACE)/exe.mk + +${DEST}$(dir)/FBP3DRP: ${DEST}$(dir)/FBP3DRP$(O_SUFFIX) \ + $(STIR_LIB) \ + $(filter %recon_buildblock_registries$(O_SUFFIX) %IO_registries$(O_SUFFIX),$(STIR_REGISTRIES)) + $(LINK) $(EXE_OUTFLAG)$@ $< \ + $(filter %recon_buildblock_registries $(O_SUFFIX) %IO_registries$(O_SUFFIX),$(STIR_REGISTRIES)) \ + $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) diff --git a/src/analytic/FBP3DRP/lib.mk b/src/analytic/FBP3DRP/lib.mk new file mode 100644 index 0000000000..49c0405c74 --- /dev/null +++ b/src/analytic/FBP3DRP/lib.mk @@ -0,0 +1,11 @@ +# +# + +dir := analytic/FBP3DRP +$(dir)_LIB_SOURCES:= \ + ColsherFilter.cxx FBP3DRPReconstruction.cxx + +#$(dir)_REGISTRY_SOURCES:= registries.cxx + +include $(WORKSPACE)/lib.mk + diff --git a/src/buildblock/ArcCorrection.cxx b/src/buildblock/ArcCorrection.cxx new file mode 100644 index 0000000000..57acefe493 --- /dev/null +++ b/src/buildblock/ArcCorrection.cxx @@ -0,0 +1,382 @@ +// +// +/* + Copyright (C) 2005 - 2005-02-28, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Implementation of class stir::ArcCorrection + + \author Kris Thielemans + + */ +#include "stir/ArcCorrection.h" +#include "stir/Sinogram.h" +#include "stir/Viewgram.h" +#include "stir/RelatedViewgrams.h" +#include "stir/SegmentBySinogram.h" +#include "stir/SegmentByView.h" +#include "stir/ProjData.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Bin.h" +#include "stir/Succeeded.h" +#include "stir/numerics/overlap_interpolate.h" +#include + +START_NAMESPACE_STIR +ArcCorrection:: +ArcCorrection() +{} + +const ProjDataInfoCylindricalNoArcCorr& +ArcCorrection:: +get_not_arc_corrected_proj_data_info() const +{ + return + static_cast(*_noarc_corr_proj_data_info_sptr); +} + +const ProjDataInfoCylindricalArcCorr& +ArcCorrection:: +get_arc_corrected_proj_data_info() const +{ + return + static_cast(*_arc_corr_proj_data_info_sptr); +} + +shared_ptr +ArcCorrection:: +get_arc_corrected_proj_data_info_sptr() const +{ + return _arc_corr_proj_data_info_sptr; +} + +shared_ptr +ArcCorrection:: +get_not_arc_corrected_proj_data_info_sptr() const +{ + return _noarc_corr_proj_data_info_sptr; +} + + +Succeeded +ArcCorrection:: +set_up(const shared_ptr& noarc_corr_proj_data_info_sptr, + const int num_arccorrected_tangential_poss, + const float bin_size) +{ + if (dynamic_cast + (noarc_corr_proj_data_info_sptr.get()) == 0) + { + // give friendly warning message + if (dynamic_cast + (noarc_corr_proj_data_info_sptr.get()) != 0) + warning("ArcCorrection called with arc-corrected proj_data_info"); + else + warning("ArcCorrection called with proj_data_info of the wrong type:\n\t%s", + typeid(*noarc_corr_proj_data_info_sptr).name()); + return Succeeded::no; + } + + _noarc_corr_proj_data_info_sptr = noarc_corr_proj_data_info_sptr; + const int min_segment_num = + _noarc_corr_proj_data_info_sptr->get_min_segment_num(); + const int max_segment_num = + _noarc_corr_proj_data_info_sptr->get_max_segment_num(); + + VectorWithOffset min_ring_diff(min_segment_num, max_segment_num); + VectorWithOffset max_ring_diff(min_segment_num, max_segment_num); + VectorWithOffset num_axial_pos_per_segment(min_segment_num, max_segment_num); + for (int segment_num=min_segment_num; segment_num<=max_segment_num; ++segment_num) + { + min_ring_diff[segment_num] = + get_not_arc_corrected_proj_data_info().get_min_ring_difference(segment_num); + max_ring_diff[segment_num] = + get_not_arc_corrected_proj_data_info().get_max_ring_difference(segment_num); + num_axial_pos_per_segment[segment_num] = + _noarc_corr_proj_data_info_sptr->get_num_axial_poss(segment_num); + } + + // create new scanner shared_ptr to avoid unexpected problems with people + // modifying the scanner_sptr of the old/new object + shared_ptr new_scanner_sptr(new Scanner(*_noarc_corr_proj_data_info_sptr->get_scanner_ptr())); + _arc_corr_proj_data_info_sptr.reset( + new ProjDataInfoCylindricalArcCorr( + new_scanner_sptr, + bin_size, + num_axial_pos_per_segment, + min_ring_diff, + max_ring_diff, + noarc_corr_proj_data_info_sptr->get_num_views(), + num_arccorrected_tangential_poss)); + + tangential_sampling = + get_arc_corrected_proj_data_info().get_tangential_sampling(); + + _noarccorr_coords.resize(_noarc_corr_proj_data_info_sptr->get_min_tangential_pos_num(), + _noarc_corr_proj_data_info_sptr->get_max_tangential_pos_num()+1); + _noarccorr_bin_sizes.resize(_noarc_corr_proj_data_info_sptr->get_min_tangential_pos_num(), + _noarc_corr_proj_data_info_sptr->get_max_tangential_pos_num()); + { + const float angular_increment = + get_not_arc_corrected_proj_data_info().get_angular_increment(); + const float ring_radius = + get_not_arc_corrected_proj_data_info().get_ring_radius(); + int tang_pos_num = _noarc_corr_proj_data_info_sptr->get_min_tangential_pos_num(); + _noarccorr_coords[tang_pos_num] = + ring_radius * sin((tang_pos_num-.5F)*angular_increment); + for (; + tang_pos_num <= _noarc_corr_proj_data_info_sptr->get_max_tangential_pos_num(); + ++tang_pos_num) + { + _noarccorr_coords[tang_pos_num+1] = + ring_radius * sin((tang_pos_num+.5F)*angular_increment); + _noarccorr_bin_sizes[tang_pos_num] = + _noarccorr_coords[tang_pos_num+1] - + _noarccorr_coords[tang_pos_num]; + } + } + _arccorr_coords.resize(_arc_corr_proj_data_info_sptr->get_min_tangential_pos_num(), + _arc_corr_proj_data_info_sptr->get_max_tangential_pos_num()+1); + { + int tang_pos_num; + for (tang_pos_num = _arc_corr_proj_data_info_sptr->get_min_tangential_pos_num(); + tang_pos_num <= _arc_corr_proj_data_info_sptr->get_max_tangential_pos_num(); + ++tang_pos_num) + { + _arccorr_coords[tang_pos_num] = + (tang_pos_num-.5F)*tangential_sampling; + } + _arccorr_coords[tang_pos_num] = + (tang_pos_num+.5F)*tangential_sampling; + } + return Succeeded::yes; +} + +Succeeded +ArcCorrection:: + set_up(const shared_ptr& noarc_corr_proj_data_info_sptr, + const int num_arccorrected_tangential_poss) +{ + float tangential_sampling = + noarc_corr_proj_data_info_sptr->get_scanner_ptr()->get_default_bin_size(); + if (tangential_sampling<=0) + { + tangential_sampling = + noarc_corr_proj_data_info_sptr-> + get_sampling_in_s(Bin(0,0,0,0)); + warning("ArcCorrection::set_up called for a scanner with default\n" + "tangential sampling (aka bin size) equal to 0.\n" + "Using the central bin size %g.", + tangential_sampling); + } + return + set_up(noarc_corr_proj_data_info_sptr, + num_arccorrected_tangential_poss, + tangential_sampling); +} + + +Succeeded +ArcCorrection:: +set_up(const shared_ptr& noarc_corr_proj_data_info_sptr) +{ + float tangential_sampling = + noarc_corr_proj_data_info_sptr->get_scanner_ptr()->get_default_bin_size(); + if (tangential_sampling<=0) + { + tangential_sampling = + noarc_corr_proj_data_info_sptr-> + get_sampling_in_s(Bin(0,0,0,0)); + warning("ArcCorrection::set_up called for a scanner with default\n" + "tangential sampling (aka bin size) equal to 0.\n" + "Using the central bin size %g.", + tangential_sampling); + } + const float max_s = + std::max( + noarc_corr_proj_data_info_sptr-> + get_s(Bin(0,0,0, + noarc_corr_proj_data_info_sptr-> + get_max_tangential_pos_num()+2)), + -noarc_corr_proj_data_info_sptr-> + get_s(Bin(0,0,0, + noarc_corr_proj_data_info_sptr-> + get_min_tangential_pos_num()-2)) + ); + const int max_arccorr_tangential_pos_num = + static_cast(ceil(max_s/tangential_sampling)); + return + set_up(noarc_corr_proj_data_info_sptr, + 2*max_arccorr_tangential_pos_num+1, + tangential_sampling); +} + +void +ArcCorrection:: +do_arc_correction(Array<1,float>& out, const Array<1,float>& in) const +{ + assert(in.get_index_range() == _noarccorr_bin_sizes.get_index_range()); + assert(out.get_min_index() == _arccorr_coords.get_min_index()); + assert(out.get_max_index() == _arccorr_coords.get_max_index()-1); + + overlap_interpolate(out.begin(), out.end(), + _arccorr_coords.begin(), _arccorr_coords.end(), + in.begin(), in.end(), + _noarccorr_coords.begin(), _noarccorr_coords.end()); + out /= tangential_sampling; +} + +void +ArcCorrection:: +do_arc_correction(Sinogram& out, const Sinogram& in) const +{ + assert(*in.get_proj_data_info_ptr() == *_noarc_corr_proj_data_info_sptr); + assert(*out.get_proj_data_info_ptr() == *_arc_corr_proj_data_info_sptr); + assert(out.get_axial_pos_num() == in.get_axial_pos_num()); + assert(out.get_segment_num() == in.get_segment_num()); + for (int view_num=in.get_min_view_num(); view_num<=in.get_max_view_num(); ++view_num) + do_arc_correction(out[view_num], in[view_num]); +} + +Sinogram +ArcCorrection:: +do_arc_correction(const Sinogram& in) const +{ + Sinogram out(_arc_corr_proj_data_info_sptr, + in.get_axial_pos_num(), + in.get_segment_num()); + do_arc_correction(out, in); + return out; +} + +void +ArcCorrection:: +do_arc_correction(Viewgram& out, const Viewgram& in) const +{ + assert(*in.get_proj_data_info_ptr() == *_noarc_corr_proj_data_info_sptr); + assert(*out.get_proj_data_info_ptr() == *_arc_corr_proj_data_info_sptr); + assert(out.get_view_num() == in.get_view_num()); + assert(out.get_segment_num() == in.get_segment_num()); + for (int axial_pos_num=in.get_min_axial_pos_num(); axial_pos_num<=in.get_max_axial_pos_num(); ++axial_pos_num) + do_arc_correction(out[axial_pos_num], in[axial_pos_num]); +} + +Viewgram +ArcCorrection:: +do_arc_correction(const Viewgram& in) const +{ + Viewgram out(_arc_corr_proj_data_info_sptr, + in.get_view_num(), + in.get_segment_num()); + do_arc_correction(out, in); + return out; +} + +void +ArcCorrection:: +do_arc_correction(RelatedViewgrams& out, const RelatedViewgrams& in) const +{ + RelatedViewgrams::iterator out_iter = out.begin(); + RelatedViewgrams::const_iterator in_iter = in.begin(); + for (; out_iter != out.end(); ++out_iter, ++in_iter) + do_arc_correction(*out_iter, *in_iter); +} + +RelatedViewgrams +ArcCorrection:: +do_arc_correction(const RelatedViewgrams& in) const +{ + RelatedViewgrams out = + _arc_corr_proj_data_info_sptr->get_empty_related_viewgrams(in.get_basic_view_segment_num(), + in.get_symmetries_sptr()); + do_arc_correction(out, in); + return out; +} + +void +ArcCorrection:: +do_arc_correction(SegmentBySinogram& out, const SegmentBySinogram& in) const +{ + assert(*in.get_proj_data_info_ptr() == *_noarc_corr_proj_data_info_sptr); + assert(*out.get_proj_data_info_ptr() == *_arc_corr_proj_data_info_sptr); + assert(out.get_segment_num() == in.get_segment_num()); + for (int axial_pos_num=in.get_min_axial_pos_num(); axial_pos_num<=in.get_max_axial_pos_num(); ++axial_pos_num) + for (int view_num=in.get_min_view_num(); view_num<=in.get_max_view_num(); ++view_num) + do_arc_correction(out[axial_pos_num][view_num], in[axial_pos_num][view_num]); +} + +SegmentBySinogram +ArcCorrection:: +do_arc_correction(const SegmentBySinogram& in) const +{ + SegmentBySinogram out(_arc_corr_proj_data_info_sptr, + in.get_segment_num()); + do_arc_correction(out, in); + return out; +} + + +void +ArcCorrection:: +do_arc_correction(SegmentByView& out, const SegmentByView& in) const +{ + assert(*in.get_proj_data_info_ptr() == *_noarc_corr_proj_data_info_sptr); + assert(*out.get_proj_data_info_ptr() == *_arc_corr_proj_data_info_sptr); + assert(out.get_segment_num() == in.get_segment_num()); + for (int view_num=in.get_min_view_num(); view_num<=in.get_max_view_num(); ++view_num) + for (int axial_pos_num=in.get_min_axial_pos_num(); axial_pos_num<=in.get_max_axial_pos_num(); ++axial_pos_num) + do_arc_correction(out[view_num][axial_pos_num], in[view_num][axial_pos_num]); +} + + +SegmentByView +ArcCorrection:: +do_arc_correction(const SegmentByView& in) const +{ + SegmentByView out(_arc_corr_proj_data_info_sptr, + in.get_segment_num()); + do_arc_correction(out, in); + return out; +} + + +Succeeded +ArcCorrection:: +do_arc_correction(ProjData& out, const ProjData& in) const +{ + assert(*in.get_proj_data_info_ptr() == *_noarc_corr_proj_data_info_sptr); + assert(*out.get_proj_data_info_ptr() == *_arc_corr_proj_data_info_sptr); + // Declare temporary viewgram out of the loop to avoid reallocation + // There is no default constructor, so we need to set it to some junk first. + Viewgram viewgram = + _arc_corr_proj_data_info_sptr->get_empty_viewgram(in.get_min_view_num(), in.get_min_segment_num()); + for (int segment_num=in.get_min_segment_num(); segment_num<=in.get_max_segment_num(); ++segment_num) + for (int view_num=in.get_min_view_num(); view_num<=in.get_max_view_num(); ++view_num) + { + viewgram = + _arc_corr_proj_data_info_sptr->get_empty_viewgram(view_num, segment_num); + do_arc_correction(viewgram, in.get_viewgram(view_num, segment_num)); + if (out.set_viewgram(viewgram) == Succeeded::no) + return Succeeded::no; + } + return Succeeded::yes; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/Array.cxx b/src/buildblock/Array.cxx new file mode 100644 index 0000000000..5781bebbcf --- /dev/null +++ b/src/buildblock/Array.cxx @@ -0,0 +1,65 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief non-inline implementations for the Array class + + \author Kris Thielemans + \author PARAPET project + + + + This file could be empty. However, it contains + contains instantiations for some common cases. + This might reduce the size of the executable a bit + if the compiler cannot inline certain functions. +*/ + +#include "stir/Array.h" + +START_NAMESPACE_STIR + + +/************************************************** + instantiations + **************************************************/ + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +// add any other types you need +template class Array<1,signed char>; +template class Array<1,short>; +template class Array<1,unsigned short>; +template class Array<1,float>; +#endif + +template class Array<2,signed char>; +template class Array<2,short>; +template class Array<2,unsigned short>; +template class Array<2,float>; + +template class Array<3, signed char>; +template class Array<3, short>; +template class Array<3,unsigned short>; +template class Array<3,float>; + +template class Array<4, short>; +template class Array<4,unsigned short>; +template class Array<4,float>; + +END_NAMESPACE_STIR diff --git a/src/buildblock/ArrayFilter1DUsingConvolution.cxx b/src/buildblock/ArrayFilter1DUsingConvolution.cxx new file mode 100644 index 0000000000..24e196308e --- /dev/null +++ b/src/buildblock/ArrayFilter1DUsingConvolution.cxx @@ -0,0 +1,213 @@ +// +// +/*! + + \file + \ingroup Array + \brief Implementations for class stir::ArrayFilter1DUsingConvolution + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2001- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ArrayFilter1DUsingConvolution.h" +#include "stir/IndexRange.h" +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" + +START_NAMESPACE_STIR + +template +ArrayFilter1DUsingConvolution:: +ArrayFilter1DUsingConvolution() + : filter_coefficients(), _bc(BoundaryConditions::zero) +{ + +} + +template +ArrayFilter1DUsingConvolution:: +ArrayFilter1DUsingConvolution(const VectorWithOffset &filter_coefficients_v, const BoundaryConditions::BC bc) + : filter_coefficients(filter_coefficients_v), _bc(bc) +{ + // TODO: remove 0 elements at the outside +} + + +template +bool +ArrayFilter1DUsingConvolution:: +is_trivial() const +{ + return + filter_coefficients.get_length() == 0 || + (filter_coefficients.get_length()==1 && filter_coefficients.get_min_index()==0 && + filter_coefficients[0] == 1); +} + + +template +Succeeded +ArrayFilter1DUsingConvolution:: +get_influencing_indices(IndexRange<1>& influencing_index_range, + const IndexRange<1>& input_index_range) const +{ + influencing_index_range = + (filter_coefficients.get_length() == 0) + ? input_index_range + : IndexRange<1>(input_index_range.get_min_index() - filter_coefficients.get_max_index(), + input_index_range.get_max_index() - filter_coefficients.get_min_index()); + return Succeeded::yes; +} + +template +Succeeded +ArrayFilter1DUsingConvolution:: +get_influenced_indices(IndexRange<1>& influenced_index_range, + const IndexRange<1>& input_index_range) const +{ + influenced_index_range = + (filter_coefficients.get_length() == 0) + ? input_index_range + : IndexRange<1>(input_index_range.get_min_index() + filter_coefficients.get_min_index(), + input_index_range.get_max_index() + filter_coefficients.get_max_index()); + return Succeeded::yes; +} + +template +void +ArrayFilter1DUsingConvolution:: +do_it(Array<1,elemT>& out_array, const Array<1,elemT>& in_array) const +{ + const int in_min = in_array.get_min_index(); + const int in_max = in_array.get_max_index(); + const int out_min = out_array.get_min_index(); + const int out_max = out_array.get_max_index(); + + if (is_trivial()) + { + int i=out_min; + + switch (this->_bc) + { + case BoundaryConditions::zero: + { + for (; i<=min(in_min-1,out_max); ++i) + out_array[i] = 0; + break; + } + case BoundaryConditions::constant: + { + for (; i<=min(in_min-1,out_max); ++i) + out_array[i] = in_array[in_min]; + break; + } + default: + { + error("ArrayFilter1DUsingConvolution: cannot handle this boundary condition yet. sorry"); + } + } + { + for (; i<=min(in_max,out_max); ++i) + { + out_array[i] = in_array[i]; + } + } + switch (this->_bc) + { + case BoundaryConditions::zero: + { + for (; i<=out_max; ++i) + out_array[i] = 0; + break; + } + case BoundaryConditions::constant: + { + for (; i<=out_max; ++i) + out_array[i] = in_array[in_max]; + break; + } + default: + { + // should never get here, but without default: the compiler might issue a warning + } + } + return; + } + const int j_min = filter_coefficients.get_min_index(); + const int j_max = filter_coefficients.get_max_index(); + + + for (int i=out_min; i<=out_max; i++) + { + out_array[i] = 0; + int j=j_min; + // first do right edge + switch (this->_bc) + { + case BoundaryConditions::zero: + { + j=max(j_min, i-in_max); + break; + } + case BoundaryConditions::constant: + { + //i_in=i-j> in_max, hence j< i-in_max + for (; j< min(j_max+1, i-in_max); ++j) + out_array[i] += filter_coefficients[j]*in_array[in_max /*i-j*/]; + break; + } + default: + error("ArrayFilter1DUsingConvolution: unsupported boundary condition"); + } + // region unaffected by boundary + { + for (; j<=min(j_max, i-in_min); ++j) + out_array[i] += filter_coefficients[j]*in_array[i-j]; + } + // left edge + switch (this->_bc) + { + case BoundaryConditions::zero: + { + // nothing to do + break; + } + case BoundaryConditions::constant: + { + //i_in=i-j< in_min, hence j> i-in_min + for (; j<= j_max; ++j) + out_array[i] += filter_coefficients[j]*in_array[in_min /*i-j*/]; + break; + } + default: + { + // should never get here, but without default: the compiler might issue a warning + } + } + } + +} +// instantiation + +template class ArrayFilter1DUsingConvolution; + +END_NAMESPACE_STIR + diff --git a/src/buildblock/ArrayFilter1DUsingConvolutionSymmetricKernel.cxx b/src/buildblock/ArrayFilter1DUsingConvolutionSymmetricKernel.cxx new file mode 100644 index 0000000000..9c861dcba2 --- /dev/null +++ b/src/buildblock/ArrayFilter1DUsingConvolutionSymmetricKernel.cxx @@ -0,0 +1,179 @@ +// +// +/*! + + \file + \ingroup Array + \brief Implementations for class stir::ArrayFilter1DUsingConvolutionSymmetricKernel + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ArrayFilter1DUsingConvolutionSymmetricKernel.h" +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" + +START_NAMESPACE_STIR +template +ArrayFilter1DUsingConvolutionSymmetricKernel:: +ArrayFilter1DUsingConvolutionSymmetricKernel(const VectorWithOffset &filter_coefficients_v) +: filter_coefficients(filter_coefficients_v) +{ + // TODO: remove 0 elements at the outside + + assert(filter_coefficients.get_length() == 0 || + filter_coefficients.get_min_index()==0); +} + + +template +bool +ArrayFilter1DUsingConvolutionSymmetricKernel:: +is_trivial() const +{ + return + filter_coefficients.get_length() == 0 || + (filter_coefficients.get_length()==1 && + filter_coefficients[0] == 1); +} + +// TODO generalise to arbitrary index ranges +template +void +ArrayFilter1DUsingConvolutionSymmetricKernel:: +do_it(Array<1,elemT>& out_array, const Array<1,elemT>& in_array) const +{ + assert(out_array.get_min_index() == in_array.get_min_index()); + assert(out_array.get_max_index() == in_array.get_max_index()); + + if (is_trivial()) + { + out_array = in_array; + return; + } + + const int in_min = in_array.get_min_index(); + const int in_max = in_array.get_max_index(); + const int j_max = filter_coefficients.get_max_index(); + + for (int i=in_array.get_min_index(); + i<=in_array.get_max_index(); i++) + { + out_array[i] = filter_coefficients[0]*in_array[i]; + int j=1; + // first do range where both i-j and i+j indices are valid for in_array + for (; j<=min(j_max,min(in_max-i, i-in_min)); j++) + out_array[i] += filter_coefficients[j]*(in_array[i-j]+in_array[i+j]); + //if (j>j_max) return; + + // now do rest of i+j separate + // next conditional is not necessary + //if (i-in_min < in_max-i) + { + for (; j<=min(j_max,in_max-i); j++) + out_array[i] += filter_coefficients[j]*(in_array[i+j]); + } + // now do rest of i-j separate + // next conditional is not necessary + //else + { + for (; j<=min(j_max,i-in_min); j++) + out_array[i] += filter_coefficients[j]*(in_array[i-j]); + } + } +#if 0 + // untested implementation using padding + VectorWithOffset in_array_padded = in_array; + // next padding statement is bound to be problematic (for instance, take positive min_index) + in_array_padded.grow(2*in_array.get_min_index(),2*in_array.get_max_index()); + in_array_padded.fill(0); + + for (int i= in_array.get_min_index();i<=in_array.get_max_index();i++) + in_array_padded[i] = in_array[i]; + int i,k ; + + // make a vector (2*in_array.get_min_index(),2*in_array.get_max_index() + VectorWithOffset tmp_cfilter =in_array_padded; + + int length = in_array.get_length(); + int flen = filter_coefficients.get_length(); + + tmp_cfilter.fill(0); + int r2=flen-1; + for(int r1=(in_array.get_min_index()-flen+1);r1 multiplyed =tmp_cfilter ; + multiplyed.fill(0); + VectorWithOffset shifted = tmp_cfilter; + + float sum =0; + VectorWithOffsetout_array_tmp; + + // output -> data+filter-1 + out_array_tmp.grow(shifted.get_min_index(),shifted.get_max_index()+flen-3); + + out_array_tmp.fill(0); + VectorWithOffset shifted_tmp = shifted; + + for (int j=out_array_tmp.get_min_index(); j<=out_array_tmp.get_max_index(); j++) + { + for(int i=shifted_tmp.get_min_index();i +static void +cir_shift_to_right(VectorWithOffset&output,const VectorWithOffset&input) +{ + output[input.get_min_index()]= input[input.get_max_index()]; + for (int i=input.get_min_index();i<=input.get_max_index()-1;i++) + output[i+1]= input[i]; +} + +#endif + +// instantiation + +template class ArrayFilter1DUsingConvolutionSymmetricKernel; + +END_NAMESPACE_STIR + diff --git a/src/buildblock/ArrayFilter2DUsingConvolution.cxx b/src/buildblock/ArrayFilter2DUsingConvolution.cxx new file mode 100644 index 0000000000..79f3dff4b0 --- /dev/null +++ b/src/buildblock/ArrayFilter2DUsingConvolution.cxx @@ -0,0 +1,142 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Implementations for class ArrayFilter2DUsingConvolution + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2001- 2009, IRSL + See STIR/LICENSE.txt for details +*/ + +#include "stir/ArrayFilter2DUsingConvolution.h" +#include "stir/IndexRange.h" +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" +#include "stir/IndexRange2D.h" + +START_NAMESPACE_STIR + +template +ArrayFilter2DUsingConvolution:: +ArrayFilter2DUsingConvolution() +: filter_coefficients() +{ + +} + +template +ArrayFilter2DUsingConvolution:: +ArrayFilter2DUsingConvolution(const Array <2, float> &filter_coefficients_v) +: filter_coefficients(filter_coefficients_v) +{ + // TODO: remove 0 elements at the outside +} + + +template +bool +ArrayFilter2DUsingConvolution:: +is_trivial() const +{ + return + filter_coefficients.get_length() == 0 || + (filter_coefficients.get_length()==1 && filter_coefficients.get_min_index()==0 && + filter_coefficients[0][0] == 1); +} + + +template +Succeeded +ArrayFilter2DUsingConvolution:: +get_influencing_indices(IndexRange<1>& influencing_index_range, + const IndexRange<1>& input_index_range) const +{ + influencing_index_range = + (filter_coefficients.get_length() == 0) + ? input_index_range + : IndexRange<1>(input_index_range.get_min_index() - filter_coefficients.get_max_index(), + input_index_range.get_max_index() - filter_coefficients.get_min_index()); + return Succeeded::yes; +} + +template +Succeeded +ArrayFilter2DUsingConvolution:: +get_influenced_indices(IndexRange<1>& influenced_index_range, + const IndexRange<1>& output_index_range) const +{ + influenced_index_range = + (filter_coefficients.get_length() == 0) + ? output_index_range + : IndexRange<1>(output_index_range.get_min_index() + filter_coefficients.get_min_index(), + output_index_range.get_max_index() + filter_coefficients.get_max_index()); + return Succeeded::yes; +} + + +template +void +ArrayFilter2DUsingConvolution:: +do_it(Array<2,elemT>& out_array, const Array<2,elemT>& in_array) const +{ + const int in_min_y = in_array.get_min_index(); + const int in_max_y = in_array.get_max_index(); + const int in_min_x = in_array[in_min_y].get_min_index(); + const int in_max_x = in_array[in_min_y].get_max_index(); + + + const int out_min_y = out_array.get_min_index(); + const int out_max_y = out_array.get_max_index(); + const int out_min_x = out_array[out_min_y].get_min_index(); + const int out_max_x = out_array[out_min_y].get_max_index(); + + + + if (is_trivial()) + { + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + + { + out_array[y][x] = ((y>=in_min_y && y <= in_max_y ) && + (x>=in_min_x && x <= in_max_x ) ? in_array[y][x] : 0); + } + return; + } + + const int j_min = filter_coefficients.get_min_index(); + const int j_max = filter_coefficients.get_max_index(); + const int i_min = filter_coefficients[j_min].get_min_index(); + const int i_max = filter_coefficients[j_min].get_max_index(); + + + + + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + { + out_array[y][x] = 0; + + for (int j=max(j_min, y-in_max_y); j<=min(j_max, y-in_min_y); j++) + for (int i=max(i_min, x-in_max_x); i<=min(i_max, x-in_min_x); i++) + + out_array[y][x] += filter_coefficients[j][i]*in_array[y-j][x-i]; + } + + +} + + +// instantiation + +template class ArrayFilter2DUsingConvolution; + +END_NAMESPACE_STIR + diff --git a/src/buildblock/ArrayFilter3DUsingConvolution.cxx b/src/buildblock/ArrayFilter3DUsingConvolution.cxx new file mode 100644 index 0000000000..eea54f245d --- /dev/null +++ b/src/buildblock/ArrayFilter3DUsingConvolution.cxx @@ -0,0 +1,294 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Implementations for class ArrayFilter3DUsingConvolution + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2001- 2009, IRSL + See STIR/LICENSE.txt for details +*/ + +#include "stir/ArrayFilter3DUsingConvolution.h" +//#include "stir/ArrayFilter2DUsingConvolution.h" +#include "stir/IndexRange.h" +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" +#include "stir/IndexRange3D.h" +#include "stir/IndexRange2D.h" + +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::iostream; +using std::fstream; +using std::cerr; +using std::endl; +#endif + + +START_NAMESPACE_STIR + +template +ArrayFilter3DUsingConvolution:: +ArrayFilter3DUsingConvolution() +: filter_coefficients() +{ + +} + +template +ArrayFilter3DUsingConvolution:: +ArrayFilter3DUsingConvolution(const Array <3, float> &filter_coefficients_v) +: filter_coefficients(filter_coefficients_v) +{ + // TODO: remove 0 elements at the outside +} + + +template +bool +ArrayFilter3DUsingConvolution:: +is_trivial() const +{ + return + filter_coefficients.get_length() == 0 || + (filter_coefficients.get_length()==1 && filter_coefficients.get_min_index()==0 && + filter_coefficients[0][0][0] == 1); +} + + +template +Succeeded +ArrayFilter3DUsingConvolution:: +get_influencing_indices(IndexRange<1>& influencing_index_range, + const IndexRange<1>& input_index_range) const +{ + influencing_index_range = + (filter_coefficients.get_length() == 0) + ? input_index_range + : IndexRange<1>(input_index_range.get_min_index() - filter_coefficients.get_max_index(), + input_index_range.get_max_index() - filter_coefficients.get_min_index()); + return Succeeded::yes; +} + +template +Succeeded +ArrayFilter3DUsingConvolution:: +get_influenced_indices(IndexRange<1>& influenced_index_range, + const IndexRange<1>& output_index_range) const +{ + influenced_index_range = + (filter_coefficients.get_length() == 0) + ? output_index_range + : IndexRange<1>(output_index_range.get_min_index() + filter_coefficients.get_min_index(), + output_index_range.get_max_index() + filter_coefficients.get_max_index()); + return Succeeded::yes; +} + +#if 1 +template +void +ArrayFilter3DUsingConvolution:: +do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const +{ + + const int in_min_z = in_array.get_min_index(); + const int in_max_z = in_array.get_max_index(); + const int in_min_y = in_array[in_min_z].get_min_index(); + const int in_max_y = in_array[in_min_z].get_max_index(); + const int in_min_x = in_array[in_min_z][in_min_y].get_min_index(); + const int in_max_x = in_array[in_min_z][in_min_y].get_max_index(); + + + const int out_min_z = out_array.get_min_index(); + const int out_max_z = out_array.get_max_index(); + const int out_min_y = out_array[out_min_z].get_min_index(); + const int out_max_y = out_array[out_min_z].get_max_index(); + const int out_min_x = out_array[out_min_z][out_min_y].get_min_index(); + const int out_max_x = out_array[out_min_z][out_min_y].get_max_index(); + + if (is_trivial()) + { + for (int z=out_min_z; z<=out_max_z; z++) + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + + { + out_array[z][y][x] = ((z>=in_min_z && z <= in_max_z ) && (y>=in_min_y && y <= in_max_y ) && + (x>=in_min_x && x <= in_max_x ) ? in_array[z][y][x] : 0); + } + return; + } + + const int k_min = filter_coefficients.get_min_index(); + const int k_max = filter_coefficients.get_max_index(); + + const int j_min = filter_coefficients[k_min].get_min_index(); + const int j_max = filter_coefficients[k_min].get_max_index(); + const int i_min = filter_coefficients[k_min][j_min].get_min_index(); + const int i_max = filter_coefficients[k_min][j_min].get_max_index(); + + + if (true)//k_min != k_max) + { + + for (int z=out_min_z; z<=out_max_z; z++) + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + { + out_array[z][y][x] = 0; + + for (int k=max(k_min, z-in_max_z); k<=min(k_max, z-in_min_z); k++) + for (int j=max(j_min, y-in_max_y); j<=min(j_max, y-in_min_y); j++) + for (int i=max(i_min, x-in_max_x); i<=min(i_max, x-in_min_x); i++) + + out_array[z][y][x] += filter_coefficients[k][j][i]*in_array[z-k][y-j][x-i]; + } + + } + else + { + if (out_min_y!= out_max_y || out_min_x!=out_max_x) + error("3D convolution. check code\n"); + Array<2,float> array_out_tmp (IndexRange2D(out_min_y,out_max_y,out_min_x,out_max_x)); + do_it_2d(array_out_tmp, in_array[out_min_z]); + out_array[out_min_z][out_min_y][out_min_x] = array_out_tmp[out_min_y][out_min_x]; + + } + +} + +#endif + + +#if 0 +template +void +ArrayFilter3DUsingConvolution:: +do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const +{ + const int in_min_z = in_array.get_min_index(); + const int in_max_z = in_array.get_max_index(); + const int in_min_y = in_array[in_min_z].get_min_index(); + const int in_max_y = in_array[in_min_z].get_max_index(); + const int in_min_x = in_array[in_min_z][in_min_y].get_min_index(); + const int in_max_x = in_array[in_min_z][in_min_y].get_max_index(); + + + const int out_min_z = out_array.get_min_index(); + const int out_max_z = out_array.get_max_index(); + const int out_min_y = out_array[out_min_z].get_min_index(); + const int out_max_y = out_array[out_min_z].get_max_index(); + const int out_min_x = out_array[out_min_z][out_min_y].get_min_index(); + const int out_max_x = out_array[out_min_z][out_min_y].get_max_index(); + + + + if (is_trivial()) + { + for (int z=out_min_z; z<=out_max_z; z++) + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + + { + out_array[z][y][x] = ((z>=in_min_z && z <= in_max_z ) && (y>=in_min_y && y <= in_max_y ) && + (x>=in_min_x && x <= in_max_x ) ? in_array[z][y][x] : 0); + } + return; + } + const int k_min = filter_coefficients.get_min_index(); + const int k_max = filter_coefficients.get_max_index(); + const int j_min = filter_coefficients[k_min].get_min_index(); + const int j_max = filter_coefficients[k_min].get_max_index(); + const int i_min = filter_coefficients[k_min][j_min].get_min_index(); + const int i_max = filter_coefficients[k_min][j_min].get_max_index(); + + + for (int z=out_min_z; z<=out_max_z; z++) + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + { + out_array[z][y][x] = 0; + + for (int k=max(k_min, z-in_max_z); k<=min(k_max, z-in_min_z); k++) + for (int j=max(j_min, y-in_max_y); j<=min(j_max, y-in_min_y); j++) + for (int i=max(i_min, x-in_max_x); i<=min(k_max, x-in_min_x); i++) + + out_array[z][y][x] += filter_coefficients[k][j][i]*in_array[z-k][y-j][x-i]; + } + + +} + +#endif + + +template +void +ArrayFilter3DUsingConvolution:: +do_it_2d(Array<2,elemT>& out_array, const Array<2,elemT>& in_array) const +{ + const int in_min_y = in_array.get_min_index(); + const int in_max_y = in_array.get_max_index(); + const int in_min_x = in_array[in_min_y].get_min_index(); + const int in_max_x = in_array[in_min_y].get_max_index(); + + + const int out_min_y = out_array.get_min_index(); + const int out_max_y = out_array.get_max_index(); + const int out_min_x = out_array[out_min_y].get_min_index(); + const int out_max_x = out_array[out_min_y].get_max_index(); + + + + if (is_trivial()) + { + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + + { + out_array[y][x] = ((y>=in_min_y && y <= in_max_y ) && + (x>=in_min_x && x <= in_max_x ) ? in_array[y][x] : 0); + } + return; + } + + + const int k_min = filter_coefficients.get_min_index(); + //const int k_max = filter_coefficients.get_max_index(); + const int j_min = filter_coefficients[k_min].get_min_index(); + const int j_max = filter_coefficients[k_min].get_max_index(); + const int i_min = filter_coefficients[k_min][j_min].get_min_index(); + const int i_max = filter_coefficients[k_min][j_min].get_max_index(); + + + + for (int y=out_min_y; y<=out_max_y; y++) + for (int x=out_min_x; x<=out_max_x; x++) + { + out_array[y][x] = 0; + + for (int j=max(j_min, y-in_max_y); j<=min(j_max, y-in_min_y); j++) + for (int i=max(i_min, x-in_max_x); i<=min(i_max, x-in_min_x); i++) + + out_array[y][x] += filter_coefficients[filter_coefficients.get_min_index()][j][i]*in_array[y-j][x-i]; + } + + +} + + +// instantiation + +template class ArrayFilter3DUsingConvolution; + +END_NAMESPACE_STIR + diff --git a/src/buildblock/ArrayFilterUsingRealDFTWithPadding.cxx b/src/buildblock/ArrayFilterUsingRealDFTWithPadding.cxx new file mode 100644 index 0000000000..a2e2b3320d --- /dev/null +++ b/src/buildblock/ArrayFilterUsingRealDFTWithPadding.cxx @@ -0,0 +1,174 @@ +// +// +/* + Copyright (C) 2004- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief Implementation of class stir::ArrayFilterUsingRealDFTWithPadding + + \author Kris Thielemans + +*/ +#include "stir/Array.h" +#include "stir/ArrayFunction.h" +#include "stir/ArrayFilterUsingRealDFTWithPadding.h" +#include "stir/numerics/fourier.h" +#include "stir/Succeeded.h" +#include "stir/BasicCoordinate.h" +#include "stir/array_index_functions.h" +#include "stir/modulo.h" +#include + + +START_NAMESPACE_STIR + +template +ArrayFilterUsingRealDFTWithPadding:: +ArrayFilterUsingRealDFTWithPadding() +{} + +template +ArrayFilterUsingRealDFTWithPadding:: +ArrayFilterUsingRealDFTWithPadding(const Array& real_filter_kernel) +{ + if (set_kernel(real_filter_kernel) == Succeeded::no) + error("Error constructing ArrayFilterUsingRealDFTWithPadding\n"); +} + +#ifndef __stir_ArrayFilterUsingRealDFTWithPadding_no_complex_kernel__ +template +ArrayFilterUsingRealDFTWithPadding:: +ArrayFilterUsingRealDFTWithPadding(const Array >& kernel_in_frequency_space) +{ + if (set_kernel_in_frequency_space(kernel_in_frequency_space) == Succeeded::no) + error("Error constructing ArrayFilterUsingRealDFTWithPadding\n"); +} +#endif + +template +Succeeded +ArrayFilterUsingRealDFTWithPadding:: +set_padding_range() +{ + BasicCoordinate min_indices, max_indices; + + if (!kernel_in_frequency_space.get_regular_range(min_indices, max_indices)) + return Succeeded::no; + // check if kernel_in_frequency_space is 0-based, as currently required by fourier + // TODO we could wrap-around if not + for (int d=1; d<=num_dimensions; ++d) + { + if (min_indices[d]!=0) + return Succeeded::no; + } + max_indices[num_dimensions] = 2*max_indices[num_dimensions] - 1; + this->padding_range = IndexRange(min_indices, max_indices); + this->padded_sizes = max_indices - min_indices +1; + return Succeeded::yes; +} + +template +Succeeded +ArrayFilterUsingRealDFTWithPadding:: +set_kernel(const Array& real_filter_kernel) +{ + BasicCoordinate min_indices, max_indices; + if (!real_filter_kernel.get_regular_range(min_indices, max_indices)) + return Succeeded::no; + // check if we need to use wrap-around + if (norm(min_indices)<.01) // i.e. min_indices==0 + { + kernel_in_frequency_space = + fourier_for_real_data(real_filter_kernel); + }\ + else + { + // copy data to new kernel using wrap-around + const BasicCoordinate sizes = + max_indices - min_indices + 1; + const IndexRange range(sizes); + Array real_filter_kernel_from_0(range); + transform_array_to_periodic_indices(real_filter_kernel_from_0, + real_filter_kernel); + + // do DFT on this array + kernel_in_frequency_space = + fourier_for_real_data(real_filter_kernel_from_0); + } + + return this->set_padding_range(); +} + +template +Succeeded +ArrayFilterUsingRealDFTWithPadding:: +set_kernel_in_frequency_space(const Array >& kernel_in_frequency_space_v) +{ + kernel_in_frequency_space = kernel_in_frequency_space_v; + return this->set_padding_range(); +} + +template +bool ArrayFilterUsingRealDFTWithPadding:: +is_trivial() const +{ + return + kernel_in_frequency_space.size_all()==0 || + (kernel_in_frequency_space.size_all()==1 && + (*kernel_in_frequency_space.begin_all()) == std::complex(1,0)); +} + + +template +void +ArrayFilterUsingRealDFTWithPadding:: +do_it(Array& out_array, const Array& in_array) const +{ + if (in_array.get_index_range() == this->padding_range && + out_array.get_index_range() == this->padding_range) + { + // convolution using DFT + { + Array > tmp = + fourier_for_real_data(in_array); + tmp *= kernel_in_frequency_space; + out_array = inverse_fourier_for_real_data_corrupting_input(tmp); + } + } + else + { + // copy input into padded_array using wrap-around + + Array padded_array(this->padding_range); + transform_array_to_periodic_indices(padded_array, in_array); + // call do_it with padded_array + do_it(padded_array, padded_array); + // Now copy result in out_array using wrap-around + transform_array_from_periodic_indices(out_array, padded_array); + } +} + +template class ArrayFilterUsingRealDFTWithPadding<1,float>; +template class ArrayFilterUsingRealDFTWithPadding<2,float>; +template class ArrayFilterUsingRealDFTWithPadding<3,float>; + +END_NAMESPACE_STIR + + + diff --git a/src/buildblock/ByteOrder.cxx b/src/buildblock/ByteOrder.cxx new file mode 100644 index 0000000000..e1934737c2 --- /dev/null +++ b/src/buildblock/ByteOrder.cxx @@ -0,0 +1,66 @@ +// +// +/*! + \file + \ingroup buildblock + \brief This file initialises ByteOrder::native_order. + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + Modification history: + -first version(s) Kris Thielemans + -KT&AZ 08/12/99 avoid using ntohs() +*/ + +#include "stir/ByteOrder.h" + +START_NAMESPACE_STIR + + +/* A somewhat complicated way to determine the byteorder. + The advantage is that it doesn't need ntohs (and so any + compiler specific definitions, libraries or whatever). + Philosophy: initialise a long number, look at its first byte + by casting its address as a char *. + The reinterpret_cash is to make it typesafe for C++. + + First we do a (paranoid) check : + sizeof(unsigned long) - sizeof(unsigned char) > 0 + This is done via a 'compile-time assertion', i.e. it breaks + at compile time when the assertion is false. The line below + relies on the fact that you cannot have an array with + zero (or less) elements. + */ + +typedef char + assert_unsigned_long_size[sizeof(unsigned long) - sizeof(unsigned char)]; + +static const unsigned long magic = 1; + +const ByteOrder::Order ByteOrder::native_order = + *(reinterpret_cast(&magic) ) == 1 ? + little_endian : big_endian; + + +END_NAMESPACE_STIR diff --git a/src/buildblock/CMakeLists.txt b/src/buildblock/CMakeLists.txt new file mode 100644 index 0000000000..e146517871 --- /dev/null +++ b/src/buildblock/CMakeLists.txt @@ -0,0 +1,92 @@ +set(dir buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + Array + IndexRange + PatientPosition + ProjData + ProjDataInfo + ProjDataInfoCylindrical + ProjDataInfoCylindricalArcCorr + ProjDataInfoCylindricalNoArcCorr + ArcCorrection + ProjDataFromStream + ProjDataGEAdvance + ProjDataInMemory + ProjDataInterfile + Scanner + SegmentBySinogram + Segment + SegmentByView + Viewgram + Sinogram + RelatedViewgrams + scale_sinograms + interpolate_projdata + extend_projdata + DiscretisedDensity + VoxelsOnCartesianGrid + utilities + interfile_keyword_functions + zoom + NumericType ByteOrder + KeyParser + recon_array_functions + linear_regression overlap_interpolate + error warning + DataSymmetriesForViewSegmentNumbers + TimeFrameDefinitions + ParsingObject + ArrayFilter1DUsingConvolutionSymmetricKernel + ArrayFilterUsingRealDFTWithPadding + SeparableArrayFunctionObject + SeparableMetzArrayFilter + MedianArrayFilter3D + MedianImageFilter3D + MinimalArrayFilter3D + MinimalImageFilter3D + SeparableCartesianMetzImageFilter + TruncateToCylindricalFOVImageProcessor + ThresholdMinToSmallPositiveValueDataProcessor + ChainedDataProcessor + ArrayFilter1DUsingConvolution + SeparableConvolutionImageFilter + NonseparableConvolutionUsingRealDFTImageFilter + SSRB + inverse_SSRB + centre_of_gravity + DynamicDiscretisedDensity + DynamicProjData + MultipleProjData + GatedProjData + ArrayFilter2DUsingConvolution + ArrayFilter3DUsingConvolution + find_fwhm_in_image + GatedDiscretisedDensity + MaximalArrayFilter3D + MaximalImageFilter3D + TimeGateDefinitions +) + +if (NOT HAVE_SYSTEM_GETOPT) + # add our own version of getopt to buildblock + list(APPEND ${dir_LIB_SOURCES} getopt) +endif() + +include(stir_lib_target) + +# TODO Remove but currently needed for ProjData.cxx, DynamicDisc*cxx, TimeFrameDef +if (LLN_FOUND) + target_link_libraries(buildblock ${LLN_LIBRARIES}) +endif() + +if (RDF_FOUND) + # TODO cannot do this as it creates circular dependencies + # target_link_libraries(buildblock local_IO_GE) +endif() + +# TODO currently needed as filters need fourier +#target_link_libraries(buildblock numerics_buildblock) + diff --git a/src/buildblock/ChainedDataProcessor.cxx b/src/buildblock/ChainedDataProcessor.cxx new file mode 100644 index 0000000000..c81bca79e0 --- /dev/null +++ b/src/buildblock/ChainedDataProcessor.cxx @@ -0,0 +1,153 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup DataProcessor + \brief Implementations for class stir::ChainedDataProcessor + + \author Kris Thielemans + \author Nicolas A Karakatsanis + +*/ +#include "stir/ChainedDataProcessor.h" +#include "stir/DiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" +#include "stir/is_null_ptr.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::auto_ptr; +#endif + +START_NAMESPACE_STIR + + +template +Succeeded +ChainedDataProcessor:: +virtual_set_up(const DataT& data) +{ + if (!is_null_ptr(this->apply_first)) + { + // note that we cannot really build the filter for the 2nd + // as we don't know what the first will do to the dimensions etc. of the data + return this->apply_first->set_up(data); + } + else if (!is_null_ptr(this->apply_second)) + return this->apply_second->set_up(data); + else + return Succeeded::yes; +} + + +template +void +ChainedDataProcessor:: +virtual_apply(DataT& data) const +{ + if (!is_null_ptr(this->apply_first)) + this->apply_first->apply(data); + if (!is_null_ptr(this->apply_second)) + this->apply_second->apply(data); +} + + +template +void +ChainedDataProcessor:: +virtual_apply(DataT& out_data, + const DataT& in_data) const +{ + if (!is_null_ptr(this->apply_first)) + { + if (!is_null_ptr(this->apply_second)) + { + // a bit complicated because we need a temporary data copy + auto_ptr< DataT> temp_data_ptr = + auto_ptr< DataT>(in_data.get_empty_copy()); + this->apply_first->apply(*temp_data_ptr, in_data); + this->apply_second->apply(out_data, *temp_data_ptr); + } + else + this->apply_first->apply(out_data, in_data); + } + else + if (!is_null_ptr(this->apply_second)) + this->apply_second->apply(out_data, in_data); + +} + +template +ChainedDataProcessor:: +ChainedDataProcessor(shared_ptr > apply_first_v, + shared_ptr > apply_second_v) + : apply_first(apply_first_v), + apply_second(apply_second_v) +{ + this->set_defaults(); +} + +template +void +ChainedDataProcessor:: +set_defaults() +{ + base_type::set_defaults(); +} + +template +void +ChainedDataProcessor:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Chained Data Processor Parameters"); + this->parser.add_parsing_key("Data Processor to apply first", &this->apply_first); + this->parser.add_parsing_key("Data Processor to apply second", &this->apply_second); + this->parser.add_stop_key("END Chained Data Processor Parameters"); +} + + + +template +const char * const +ChainedDataProcessor::registered_name = + "Chained Data Processor"; + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +// Register this class in the DataProcessor registry +// static ChainedDataProcessor::RegisterIt dummy; +// have the above variable in a separate file, which you need to pass at link time + +template class ChainedDataProcessor >; +template class ChainedDataProcessor; +template class ChainedDataProcessor; +END_NAMESPACE_STIR + + + + + diff --git a/src/buildblock/DataSymmetriesForViewSegmentNumbers.cxx b/src/buildblock/DataSymmetriesForViewSegmentNumbers.cxx new file mode 100644 index 0000000000..381c66f8e4 --- /dev/null +++ b/src/buildblock/DataSymmetriesForViewSegmentNumbers.cxx @@ -0,0 +1,81 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Implementations for class stir::DataSymmetriesForViewSegmentNumbers + + \author Kris Thielemans + \author PARAPET project +*/ + +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +#include "stir/ViewSegmentNumbers.h" +#include + +START_NAMESPACE_STIR + +DataSymmetriesForViewSegmentNumbers:: +~DataSymmetriesForViewSegmentNumbers() +{} + +/*! Default implementation always returns \c true. Needs to be overloaded. + */ +bool +DataSymmetriesForViewSegmentNumbers:: +blindly_equals(const root_type * const) const +{ + return true; +} + +bool +DataSymmetriesForViewSegmentNumbers:: +operator ==(const root_type& that) const +{ + return + typeid(*this) == typeid(that) && + (this == &that || + this->blindly_equals(&that) + ); +} + +bool +DataSymmetriesForViewSegmentNumbers:: +operator !=(const root_type& that) const +{ + return !((*this) == that); +} + + +int +DataSymmetriesForViewSegmentNumbers::num_related_view_segment_numbers(const ViewSegmentNumbers& vs) const +{ + vector rel_vs; + get_related_view_segment_numbers(rel_vs, vs); + return static_cast(rel_vs.size()); +} + +bool +DataSymmetriesForViewSegmentNumbers:: +is_basic(const ViewSegmentNumbers& v_s) const +{ + ViewSegmentNumbers copy = v_s; + return !find_basic_view_segment_numbers(copy); +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/DiscretisedDensity.cxx b/src/buildblock/DiscretisedDensity.cxx new file mode 100644 index 0000000000..2de1d29c39 --- /dev/null +++ b/src/buildblock/DiscretisedDensity.cxx @@ -0,0 +1,253 @@ +// +// + +/*! + \file + \ingroup densitydata + + \brief Implementations of non-inline functions of class stir::DiscretisedDensity + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/DiscretisedDensity.h" +#if 1 +#include "stir/IO/read_from_file.h" +#else +#include "stir/IO/interfile.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/ecat6_utils.h" +#include "stir/IO/stir_ecat6.h" +#include "stir/IO/stir_ecat7.h" +#endif +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/is_null_ptr.h" +#ifdef STIR_USE_GE_IO +#include "local/stir/IO/GE/niff.h" +#endif +#endif + +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::fstream; +#endif + +START_NAMESPACE_STIR + +#if 0 +// sadly, gcc 2.95.* does not support local namespaces as used below +// This is slightly funny as it does work in ProjData.cxx. +// Maybe because here it's in a template? +# if __GNUC__ == 2 +#ifdef HAVE_LLN_MATRIX +USING_NAMESPACE_ECAT +USING_NAMESPACE_ECAT7 +USING_NAMESPACE_ECAT6 +#endif +#endif + +#endif + +/*! + This function will attempt to determine the type of image in the file, + construct an object of the appropriate type, and return a pointer to + the object. + + The return value is a shared_ptr, to make sure that the + object will be deleted. + + If more than 1 image is in the file, only the first image is read. + + Currently only Interfile, ECAT6 and ECAT7 file formats are supported. + The image corresponding to frame 1 (and gate=1, data=1, bed=0 for CTI + formats) in the file will be read. Note that ECAT7 support depends on + HAVE_LLN_MATRIX being defined. + + Developer's note: ideally the return value would be an auto_ptr, but + it seems to be difficult (impossible?) to assign auto_ptrs to shared_ptrs + on older compilers (including VC 6.0). +*/ +template +DiscretisedDensity * +DiscretisedDensity:: + read_from_file(const string& filename) +{ + +#if 1 + std::auto_ptr > density_aptr = + stir::read_from_file >(filename); + return density_aptr.release(); + +#else + if (num_dimensions != 3 || typeid(elemT) != typeid(float)) + error("DiscretisedDensity::read_from_file currently only supports 3d float images\n"); + const int max_length=300; + char signature[max_length]; + + // read signature + { + fstream input(filename.c_str(), ios::in | ios::binary); + if (!input) + error("DiscretisedDensity::read_from_file: error opening file %s\n", filename.c_str()); + + input.read(signature, max_length); + signature[max_length-1]='\0'; + } + // Interfile + if (is_interfile_signature(signature)) + { +#ifndef NDEBUG + warning("DiscretisedDensity::read_from_file trying to read %s as Interfile\n", + filename.c_str()); +#endif + DiscretisedDensity * density_ptr = + read_interfile_image(filename); + if (!is_null_ptr(density_ptr)) + return density_ptr; + } + + + +#ifdef HAVE_LLN_MATRIX + if (strncmp(signature, "MATRIX", 6) == 0) + { +#ifndef NDEBUG + warning("DiscretisedDensity::read_from_file trying to read %s as ECAT7\n", filename.c_str()); +#endif + USING_NAMESPACE_ECAT + USING_NAMESPACE_ECAT7 + + if (is_ECAT7_image_file(filename)) + { + warning("\nReading frame 1, gate 1, data 0, bed 0 from file %s\n", + filename.c_str()); + DiscretisedDensity * density_ptr = + ECAT7_to_VoxelsOnCartesianGrid(filename, + /*frame_num, gate_num, data_num, bed_num*/1,1,0,0); + if (!is_null_ptr(density_ptr)) + return density_ptr; + } + else + { + if (is_ECAT7_file(filename)) + warning("DiscretisedDensity::read_from_file ECAT7 file %s is of unsupported file type\n", filename.c_str()); + } + + } +#endif // HAVE_LLN_MATRIX + +#ifdef STIR_USE_GE_IO + // NIFF file format (a simple almost raw format from GE) + { + using namespace GE_IO; + if (Niff::isReadableNiffFile(filename)) + { + Niff::Niff input_niff(filename, std::ios::in | std::ios::out); + if (input_niff.get_num_dimensions() != 3) + { + warning("DiscretisedDensity::read_from_file:\n" + "File %s is a NIFF file but has %d dimensions (should be 3)", + filename.c_str(), input_niff.get_num_dimensions()); + return 0; + } + CartesianCoordinate3D voxel_size; + { + std::vector pixel_spacing = input_niff.get_pixel_spacing(); + std::copy(pixel_spacing.begin(), pixel_spacing.end(), voxel_size.begin()); + } + Array<3, float> data; + { + input_niff.fill_array(data); + // change sizes to standard STIR convention + for (int z=data.get_min_index(); z<= data.get_max_index(); ++z) + { + data[z].set_min_index(-(data[z].get_length()/2)); + for (int y=data[z].get_min_index(); y<= data[z].get_max_index(); ++y) + { + data[z][y].set_min_index(-(data[z][y].get_length()/2)); + } + } + } + CartesianCoordinate3D origin; + origin.fill(0); + + return + new VoxelsOnCartesianGrid(data, + origin, + voxel_size); + } + } +#endif + +#ifdef HAVE_LLN_MATRIX + { + // Try ECAT6 + // ECAT6 does not have a signature +#ifndef NDEBUG + warning("DiscretisedDensity::read_from_file trying to read %s as ECAT6\n", filename.c_str()); +#endif + USING_NAMESPACE_ECAT; + USING_NAMESPACE_ECAT6; + if (is_ECAT6_image_file(filename)) + { + ECAT6_Main_header mhead; + FILE * cti_fptr=fopen(filename.c_str(), "rb"); + if(cti_read_ECAT6_Main_header(cti_fptr, &mhead)!=EXIT_SUCCESS) + { + if (cti_fptr!=NULL) + fclose(cti_fptr); + error ("error reading main header in ECAT 6 file %s\n", filename.c_str()); + } + + warning("\nReading frame 1, gate 1, data 0, bed 0 from file %s\n", + filename.c_str()); + VoxelsOnCartesianGrid * tmp = + ECAT6_to_VoxelsOnCartesianGrid(/*frame_num, gate_num, data_num, bed_num*/1,1,0,0, + cti_fptr, mhead); + fclose(cti_fptr); + return tmp; + } + } +#endif // HAVE_LLN_MATRIX + + + error("DiscretisedDensity::read_from_file: %s seems to be in an unsupported file format\n", + filename.c_str()); + return 0; +#endif + +} + + +/****************************** + instantiations + *****************************/ +#ifdef _MSC_VER +// disable warning on pure virtuals which are not defined +#pragma warning(disable: 4661) +#endif + +template class DiscretisedDensity<3,float>; + +END_NAMESPACE_STIR diff --git a/src/buildblock/DynamicDiscretisedDensity.cxx b/src/buildblock/DynamicDiscretisedDensity.cxx new file mode 100644 index 0000000000..60b38ffd78 --- /dev/null +++ b/src/buildblock/DynamicDiscretisedDensity.cxx @@ -0,0 +1,202 @@ +// +// +/*! + \file + \ingroup densitydata + \brief Implementation of class stir::DynamicDiscretisedDensity + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ +/* + Copyright (C) 2005- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/IO/read_from_file.h" +#include "stir/decay_correction_factor.h" +#include +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/round.h" +#include +#include "stir/IO/interfile.h" + + +#ifndef STIR_NO_NAMESPACES +using std::fstream; +using std::cerr; +#endif + +START_NAMESPACE_STIR + +DynamicDiscretisedDensity:: +DynamicDiscretisedDensity(const DynamicDiscretisedDensity& argument) +{ + (*this) = argument; +} + +DynamicDiscretisedDensity& +DynamicDiscretisedDensity:: +operator=(const DynamicDiscretisedDensity& argument) +{ + this->_time_frame_definitions = argument._time_frame_definitions; + this->_densities.resize(argument._densities.size()); + for (unsigned int i=0; i_densities[i].reset(argument._densities[i]->clone()); + + this->_scanner_sptr = argument._scanner_sptr; + this->_calibration_factor = argument._calibration_factor; + this->_isotope_halflife = argument._isotope_halflife; + this->_is_decay_corrected = argument._is_decay_corrected; + this->_start_time_in_secs_since_1970 = argument._start_time_in_secs_since_1970; + return *this; +} + +void +DynamicDiscretisedDensity:: +set_density_sptr(const shared_ptr >& density_sptr, + const unsigned int frame_num) +{ this->_densities[frame_num-1]=density_sptr; } + +const std::vector > > & +DynamicDiscretisedDensity:: +get_densities() const +{ return this->_densities ; } + +const DiscretisedDensity<3,float> & +DynamicDiscretisedDensity:: +get_density(const unsigned int frame_num) const +{ return *this->_densities[frame_num-1] ; } + +DiscretisedDensity<3,float> & +DynamicDiscretisedDensity:: +get_density(const unsigned int frame_num) +{ return *this->_densities[frame_num-1] ; } + +const float +DynamicDiscretisedDensity:: +get_isotope_halflife() const +{ return this->_isotope_halflife; } + +const float +DynamicDiscretisedDensity:: +get_scanner_default_bin_size() const +{ return this->_scanner_sptr->get_default_bin_size(); } + +const float +DynamicDiscretisedDensity:: +get_calibration_factor() const +{ return this->_calibration_factor; } + +const TimeFrameDefinitions & +DynamicDiscretisedDensity:: +get_time_frame_definitions() const +{ return this->_time_frame_definitions; } + +const double +DynamicDiscretisedDensity:: +get_start_time_in_secs_since_1970() const +{ return this->_start_time_in_secs_since_1970; } + +DynamicDiscretisedDensity* +DynamicDiscretisedDensity:: +read_from_file(const string& filename) // The written image is read in respect to its center as origin!!! +{ + return stir::read_from_file(filename).get(); +} + +//Warning write_time_frame_definitions() is not yet implemented, so time information is missing. +/* sheader_ptr->frame_start_time=this->get_start_time(frame_num)*1000.; //Start Time in Milliseconds + sheader_ptr->frame_duration=this->get_duration(frame_num)*1000.; //Duration in Milliseconds */ +Succeeded +DynamicDiscretisedDensity:: +write_to_ecat7(const string& filename) const +{ +#ifndef HAVE_LLN_MATRIX + return Succeeded::no; +#else + + Main_header mhead; + ecat::ecat7::make_ECAT7_main_header(mhead, *_scanner_sptr, filename, get_density(1) ); + mhead.num_frames = (_time_frame_definitions).get_num_frames(); + mhead.acquisition_type = + mhead.num_frames>1 ? DynamicEmission : StaticEmission; + mhead.calibration_factor=_calibration_factor; + mhead.isotope_halflife=_isotope_halflife; + round_to(mhead.scan_start_time, floor(this->get_start_time_in_secs_since_1970())); + MatrixFile* mptr= matrix_create (filename.c_str(), MAT_CREATE, &mhead); + if (mptr == 0) + { + warning("DynamicDiscretisedDensity::write_to_ecat7 cannot write output file %s\n", filename.c_str()); + return Succeeded::no; + } + for ( unsigned int frame_num = 1 ; frame_num<=(_time_frame_definitions).get_num_frames() ; ++frame_num ) + { + if (ecat::ecat7::DiscretisedDensity_to_ECAT7(mptr, + get_density(frame_num), + frame_num) + == Succeeded::no) + { + matrix_close(mptr); + return Succeeded::no; + } + } + matrix_close(mptr); + return Succeeded::yes; +#endif // end of HAVE_LLN_MATRIX +} + + void DynamicDiscretisedDensity:: + calibrate_frames() const +{ + for ( unsigned int frame_num = 1 ; frame_num<=(_time_frame_definitions).get_num_frames() ; ++frame_num ) + { + *(_densities[frame_num-1])*=_calibration_factor; + } +} + +void DynamicDiscretisedDensity:: +set_calibration_factor(const float calibration_factor) +{ _calibration_factor=calibration_factor; } + +void DynamicDiscretisedDensity:: +set_if_decay_corrected(const bool is_decay_corrected) +{ this->_is_decay_corrected=is_decay_corrected; } + +void DynamicDiscretisedDensity:: +set_isotope_halflife(const float isotope_halflife) +{ _isotope_halflife=isotope_halflife; } + + void DynamicDiscretisedDensity:: + decay_correct_frames() +{ + if (_is_decay_corrected==true) + warning("DynamicDiscretisedDensity is already decay corrected"); + else + { + for ( unsigned int frame_num = 1 ; frame_num<=(_time_frame_definitions).get_num_frames() ; ++frame_num ) + { + *(_densities[frame_num-1])*= + static_cast(decay_correction_factor(_isotope_halflife,_time_frame_definitions.get_start_time(frame_num),_time_frame_definitions.get_end_time(frame_num))); + } + _is_decay_corrected=true; + } +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/DynamicProjData.cxx b/src/buildblock/DynamicProjData.cxx new file mode 100644 index 0000000000..cbeef57ede --- /dev/null +++ b/src/buildblock/DynamicProjData.cxx @@ -0,0 +1,338 @@ +/* + Copyright (C) 2005 - 2011-12-31, Hammersmith Imanet Ltd + Copyright (C) 2013, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup data_buildblock + \brief Implementation of class stir::DynamicProjData + \author Kris Thielemans + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis +*/ + +#include "stir/DynamicProjData.h" +#include "stir/ExamInfo.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/ProjDataFromStream.h" +#include "stir/ExamInfo.h" +#include "stir/TimeFrameDefinitions.h" +#include +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/round.h" +#include "stir/error.h" +#include "stir/warning.h" +#include "stir/info.h" +#include "stir/utilities.h" +#include "stir/IO/FileSignature.h" +#include "stir/IO/InterfileHeader.h" +#include "stir/IO/interfile.h" +#include +#include +#include + +START_NAMESPACE_STIR +// declaration of helper function +static +DynamicProjData* +read_interfile_DPDFS(const string& filename, + const std::ios::openmode open_mode = std::ios::in); + +const double +DynamicProjData:: +get_start_time_in_secs_since_1970() const +{ return this->get_exam_info_sptr()->start_time_in_secs_since_1970; } + +void +DynamicProjData:: +set_start_time_in_secs_since_1970(const double start_time) +{ + // reset local pointer to a new one (with the same info) to avoid changing + // other objects that happen to use the same shared_ptr + this->_exam_info_sptr.reset(new ExamInfo(*this->_exam_info_sptr)); + this->_exam_info_sptr->start_time_in_secs_since_1970=start_time; +} + +void +DynamicProjData:: +set_time_frame_definitions(const TimeFrameDefinitions& time_frame_definitions) +{ + // reset local pointer to a new one (with the same info) to avoid changing + // other objects that happen to use the same shared_ptr + this->_exam_info_sptr.reset(new ExamInfo(*this->_exam_info_sptr)); + this->_exam_info_sptr->time_frame_definitions=time_frame_definitions; +} + +const TimeFrameDefinitions& +DynamicProjData:: +get_time_frame_definitions() const +{ return this->_exam_info_sptr->time_frame_definitions; } + +DynamicProjData* +DynamicProjData:: +read_from_file(const string& filename) // The written projection data is read in respect to its center as origin!!! +{ + const FileSignature file_signature(filename); + const char * signature = file_signature.get_signature(); + + // Interfile + if (is_interfile_signature(signature)) + { +#ifndef NDEBUG + info(boost::format("DynamicProjData::read_from_file trying to read %s as Interfile") % filename); +#endif + DynamicProjData* ptr(read_interfile_DPDFS(filename, std::ios::in)); + if (!is_null_ptr(ptr)) + return ptr; + else + error(boost::format("DynamicProjData::read_from_file failed to read %s as Interfile") % filename); + } + +#ifdef HAVE_LLN_MATRIX + if (strncmp(signature, "MATRIX", 6) == 0) + { +#ifndef NDEBUG + warning("DynamicProjData::read_from_file trying to read '%s' as ECAT7", filename.c_str()); +#endif + USING_NAMESPACE_ECAT + USING_NAMESPACE_ECAT7 + + if (is_ECAT7_emission_file(filename)) + { + Main_header mhead; + if (read_ECAT7_main_header(mhead, filename) == Succeeded::no) + { + warning("DynamicProjData::read_from_file cannot read '%s' as ECAT7", filename.c_str()); + return 0; + } + shared_ptr exam_info_sptr(read_ECAT7_exam_info(filename)); + DynamicProjData * dynamic_proj_data_ptr = new DynamicProjData(exam_info_sptr); + + // we no longer have a _scanner_sptr member, so next lines are commented out + //dynamic_proj_data_ptr->_scanner_sptr.reset( + // find_scanner_from_ECAT_system_type(mhead.system_type)); + + const unsigned int num_frames = + static_cast(mhead.num_frames); + dynamic_proj_data_ptr->_proj_datas.resize(num_frames); + + for (unsigned int frame_num=1; frame_num <= num_frames; ++ frame_num) + { + dynamic_proj_data_ptr->_proj_datas[frame_num-1].reset( + ECAT7_to_PDFS(filename, + frame_num, + /*gate*/1, + /* data_num, bed_num, */ 0,0)); + } + if (is_null_ptr(dynamic_proj_data_ptr->_proj_datas[0])) + error("DynamicProjData: No frame available\n"); + return dynamic_proj_data_ptr; + } + else + { + if (is_ECAT7_file(filename)) + { + warning("DynamicProjData::read_from_file ECAT7 file '%s' should be projection data.", filename.c_str()); + return 0; + } + } + } + else + { + warning("DynamicProjData::read_from_file '%s' seems to correspond to ECAT projection data, but not ECAT7. I cannot read this.", filename.c_str()); + return 0; + } +#endif // end of HAVE_LLN_MATRIX + + + // return a zero pointer if we get here + warning(boost::format("DynamicProjData::read_from_file cannot read '%s'. Unsupported file format?") % filename); + return 0; +} + +Succeeded +DynamicProjData:: +write_to_ecat7(const string& filename) const +{ +#ifndef HAVE_LLN_MATRIX + return Succeeded::no; +#else + + Main_header mhead; + ecat::ecat7::make_ECAT7_main_header(mhead, filename, + *get_exam_info_ptr(), + *get_proj_data(1).get_proj_data_info_ptr() ); + + MatrixFile* mptr= matrix_create (filename.c_str(), MAT_CREATE, &mhead); + if (mptr == 0) + { + warning("DynamicProjData::write_to_ecat7 cannot write output file %s\n", filename.c_str()); + return Succeeded::no; + } + for ( unsigned int frame_num = 1 ; frame_num<=this->get_num_frames() ; ++frame_num ) + { + if (ecat::ecat7::ProjData_to_ECAT7(mptr, + get_proj_data(frame_num), + frame_num) + == Succeeded::no) + { + matrix_close(mptr); + return Succeeded::no; + } + } + matrix_close(mptr); + return Succeeded::yes; +#endif // end of HAVE_LLN_MATRIX +} + +// local helper function to read the data from Interfile +// It is largely a copy of read_interfile_PDFS (for a single time frame) +// This needs to be merged of course. +static +DynamicProjData* +read_interfile_DPDFS(istream& input, + const string& directory_for_data, + const std::ios::openmode open_mode) +{ + //Nicolas A Karakatsanis - Add the printed message for better clarity and evaluation of implementation + info(boost::format("DynamicProjData: Reading the Interfile projection data set located in directory\n%1% ...\n") % directory_for_data); + + InterfilePDFSHeader hdr; + + if (!hdr.parse(input)) + { + return 0; // KT 10122001 do not call ask_parameters anymore + } + + // KT 14/01/2000 added directory capability + // prepend directory_for_data to the data_file_name from the header + + char full_data_file_name[max_filename_length]; + strcpy(full_data_file_name, hdr.data_file_name.c_str()); + prepend_directory_name(full_data_file_name, directory_for_data.c_str()); + + for (unsigned int i=1; i data_in(new std::fstream (full_data_file_name, open_mode | std::ios::binary)); + if (!data_in->good()) + { + warning("interfile parsing: error opening file %s",full_data_file_name); + return 0; + } + shared_ptr proj_data_info_sptr(hdr.data_info_ptr->create_shared_clone()); + unsigned long data_offset = hdr.data_offset_each_dataset[0]; + // offset in file between time frames + unsigned long data_offset_increment = 0UL; // we will find it below + DynamicProjData * dynamic_proj_data_ptr = new DynamicProjData(hdr.get_exam_info_sptr()); + if (is_null_ptr(dynamic_proj_data_ptr)) + { + error(boost::format("DynamicProjData: error allocating memory for new object (for file \"%1%\")") + % full_data_file_name); + } + dynamic_proj_data_ptr->resize(hdr.get_exam_info_ptr()->time_frame_definitions.get_num_time_frames()); + + // now set all proj_data_sptrs + for (unsigned int frame_num=1; frame_num <= dynamic_proj_data_ptr->get_num_frames(); ++frame_num) + { + info(boost::format("Using data offset %1% for frame %2% in file %3%\n") % data_offset % frame_num % full_data_file_name); + shared_ptr current_exam_info_sptr(new ExamInfo(*hdr.get_exam_info_sptr())); + std::vector > frame_times; + frame_times.push_back(std::make_pair(hdr.get_exam_info_ptr()->time_frame_definitions.get_start_time(frame_num), + hdr.get_exam_info_ptr()->time_frame_definitions.get_end_time(frame_num))); + TimeFrameDefinitions time_frame_defs(frame_times); + current_exam_info_sptr->set_time_frame_definitions(time_frame_defs); + + shared_ptr + proj_data_sptr(new ProjDataFromStream(current_exam_info_sptr, + proj_data_info_sptr, + data_in, + data_offset, + hdr.segment_sequence, + hdr.storage_order, + hdr.type_of_numbers, + hdr.file_byte_order, + static_cast(hdr.image_scaling_factors[0][0]))); + if (is_null_ptr(proj_data_sptr)) + { + error(boost::format("DynamicProjData: error reading frame %1% from file '%2%'") + % frame_num % full_data_file_name); + } + + dynamic_proj_data_ptr->set_proj_data_sptr(proj_data_sptr, frame_num); + + // TODO, move offset code to InterfileHeader.cxx + // find data offset increment + if (frame_num==1) + { + int num_sinos = 0; + for (int s=proj_data_info_sptr->get_min_segment_num(); + s<=proj_data_info_sptr->get_max_segment_num(); + ++s) + { + num_sinos += proj_data_info_sptr->get_num_axial_poss(s); + } + data_offset_increment = + static_cast(num_sinos * + proj_data_info_sptr->get_num_tangential_poss() * proj_data_info_sptr->get_num_views() * + hdr.type_of_numbers.size_in_bytes()); + } + + // find offset of next frame + if (frame_num < dynamic_proj_data_ptr->get_num_frames()) + { + // note that hdr.data_offset uses zero-based indexing, so next line finds the offset for frame frame_num+1 + if (hdr.data_offset_each_dataset[frame_num]>0) + { + if (fabs(static_cast(data_offset) - hdr.data_offset_each_dataset[frame_num]) < data_offset_increment) + { + error(boost::format("data offset for frame %1% is too small. Difference in offsets needs to be at least %2%") + % (frame_num+1) % data_offset_increment); + } + data_offset = hdr.data_offset_each_dataset[frame_num]; + } + else + data_offset += data_offset_increment; + } + } // end loop over frames + + return dynamic_proj_data_ptr; +} +static +DynamicProjData* +read_interfile_DPDFS(const string& filename, + const ios::openmode open_mode) +{ + std::ifstream image_stream(filename.c_str(), open_mode); + if (!image_stream) + { + error(boost::format("DynamicProjData: couldn't open file '%s'") % filename); + } + + return read_interfile_DPDFS(image_stream, get_directory_name(filename), open_mode); +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/GatedDiscretisedDensity.cxx b/src/buildblock/GatedDiscretisedDensity.cxx new file mode 100644 index 0000000000..9beb956d44 --- /dev/null +++ b/src/buildblock/GatedDiscretisedDensity.cxx @@ -0,0 +1,205 @@ +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + Copyright (C) 2009- 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup buildblock + \brief Implementation of class stir::GatedDiscretisedDensity + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#include "stir/GatedDiscretisedDensity.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include +#include +#include "stir/IO/interfile.h" +#include "stir/IO/OutputFileFormat.h" + +#ifndef STIR_NO_NAMESPACES +using std::fstream; +using std::cerr; +using std::istringstream; +#endif + +START_NAMESPACE_STIR + +GatedDiscretisedDensity:: +GatedDiscretisedDensity(const GatedDiscretisedDensity& argument) +{ + (*this) = argument; +} + +GatedDiscretisedDensity& +GatedDiscretisedDensity:: +operator=(const GatedDiscretisedDensity& argument) +{ + this->_time_gate_definitions = argument._time_gate_definitions; + this->_densities.resize(argument._densities.size()); + for (unsigned int i=0; i_densities[i].reset(argument._densities[i]->clone()); + return *this; +} + +GatedDiscretisedDensity:: +GatedDiscretisedDensity(const string& filename) +{ + const string gdef_filename=filename+".gdef"; + std::cout << "GatedDiscretisedDensity: Reading gate definitions " << gdef_filename.c_str() << std::endl; + this->_time_gate_definitions.read_gdef_file(gdef_filename); + this->_densities.resize(this->_time_gate_definitions.get_num_gates()); + for ( unsigned int num = 1 ; num<=(this->_time_gate_definitions).get_num_gates() ; ++num ) + { + std::stringstream gate_num_stream; + gate_num_stream << this->_time_gate_definitions.get_gate_num(num); + const string input_filename=filename+"_g"+gate_num_stream.str()+".hv"; + // const shared_ptr > read_sptr = new VoxelsOnCartesianGrid ; + std::cout << "GatedDiscretisedDensity: Reading gate file: " << input_filename.c_str() << std::endl; + this->_densities[num-1].reset(DiscretisedDensity<3,float>::read_from_file(input_filename)); + } +} + +GatedDiscretisedDensity:: +GatedDiscretisedDensity(const shared_ptr >& density_sptr, + const unsigned int num_gates) +{ + this->_densities.resize(num_gates); + for ( unsigned int num = 1 ; num<=num_gates; ++num ) + this->_densities[num-1].reset(density_sptr->get_empty_discretised_density()); +} + + +void +GatedDiscretisedDensity:: +set_density_sptr(const shared_ptr >& density_sptr, + const unsigned int gate_num) +{ this->_densities[gate_num-1]=density_sptr; } + +const std::vector > > & +GatedDiscretisedDensity:: +get_densities() const +{ return this->_densities ; } + +const DiscretisedDensity<3,float> & +GatedDiscretisedDensity:: +get_density(const unsigned int gate_num) const +{ return *this->_densities[gate_num-1] ; } + +DiscretisedDensity<3,float> & +GatedDiscretisedDensity:: +get_density(const unsigned int gate_num) +{ return *this->_densities[gate_num-1] ; } + +const TimeGateDefinitions & +GatedDiscretisedDensity:: +get_time_gate_definitions() const +{ return this->_time_gate_definitions; } + +void GatedDiscretisedDensity:: +fill_with_zero() +{ + for (unsigned int gate_num=0; gate_num_time_gate_definitions.get_num_gates(); ++gate_num) + this->_densities[gate_num].reset((this->_densities[gate_num])->get_empty_discretised_density()); +} + +GatedDiscretisedDensity* +GatedDiscretisedDensity:: +read_from_files(const string& filename) // The written image is read in respect to its center as origin!!! +{ + const string gdef_filename=filename+".gdef"; + std::cout << "GatedDiscretisedDensity: Reading gate definitions " << gdef_filename.c_str() << std::endl; + GatedDiscretisedDensity * gated_image_ptr = 0; + gated_image_ptr = new GatedDiscretisedDensity; + gated_image_ptr->_time_gate_definitions.read_gdef_file(gdef_filename); + gated_image_ptr->_densities.resize(gated_image_ptr->_time_gate_definitions.get_num_gates()); + for ( unsigned int num = 1 ; num<=(gated_image_ptr->_time_gate_definitions).get_num_gates() ; ++num ) + { + std::stringstream gate_num_stream; + gate_num_stream << gated_image_ptr->_time_gate_definitions.get_gate_num(num); + const string input_filename=filename+"_g"+gate_num_stream.str()+".hv"; + const shared_ptr > read_sptr(new VoxelsOnCartesianGrid ); + std::cout << "GatedDiscretisedDensity: Reading gate file: " << input_filename.c_str() << std::endl; + gated_image_ptr->_densities[num-1].reset(DiscretisedDensity<3,float>::read_from_file(input_filename)); + } + return gated_image_ptr; +} + +GatedDiscretisedDensity* +GatedDiscretisedDensity:: +read_from_files(const string& filename,const string& suffix) // The written image is read in respect to its center as origin!!! +{ + const string gdef_filename=filename+".gdef"; + std::cout << "GatedDiscretisedDensity: Reading gate definitions " << gdef_filename.c_str() << std::endl; + GatedDiscretisedDensity * gated_image_ptr = 0; + gated_image_ptr = new GatedDiscretisedDensity; + gated_image_ptr->_time_gate_definitions.read_gdef_file(gdef_filename); + gated_image_ptr->_densities.resize(gated_image_ptr->_time_gate_definitions.get_num_gates()); + for ( unsigned int num = 1 ; num<=(gated_image_ptr->_time_gate_definitions).get_num_gates() ; ++num ) + { + std::stringstream gate_num_stream; + gate_num_stream << gated_image_ptr->_time_gate_definitions.get_gate_num(num); + const string input_filename=filename+"_g"+gate_num_stream.str()+suffix+".hv"; + // const shared_ptr > read_sptr = new VoxelsOnCartesianGrid ; + std::cout << "GatedDiscretisedDensity: Reading gate file: " << input_filename.c_str() << std::endl; + gated_image_ptr->_densities[num-1].reset(DiscretisedDensity<3,float>::read_from_file(input_filename)); + } + return gated_image_ptr; +} + +Succeeded +GatedDiscretisedDensity:: +write_to_files(const string& filename) const +{ + for ( unsigned int num = 1 ; num<=(_time_gate_definitions).get_num_gates() ; ++num ) + { + std::stringstream gate_num_stream; + gate_num_stream << _time_gate_definitions.get_gate_num(num); + const string output_filename=filename+"_g"+gate_num_stream.str()+".hv"; + std::cout << "GatedDiscretisedDensity: Writing new gate file: " << output_filename.c_str() << std::endl; + if(OutputFileFormat >::default_sptr()->write_to_file(output_filename, this->get_density(num)) + == Succeeded::no) + return Succeeded::no; + } + if((this->_time_gate_definitions).get_num_gates()==0) + std::cout << "GatedDiscretisedDensity: No gates to write, please check!!" << std::endl; + return Succeeded::yes; +} + +Succeeded +GatedDiscretisedDensity:: +write_to_files(const string& filename,const string& suffix) const +{ + for ( unsigned int num = 1 ; num<=(_time_gate_definitions).get_num_gates() ; ++num ) + { + std::stringstream gate_num_stream; + gate_num_stream << _time_gate_definitions.get_gate_num(num); + const string output_filename=filename+"_g"+gate_num_stream.str()+suffix+".hv"; + std::cout << "GatedDiscretisedDensity: Writing new gate file: " << output_filename.c_str() << std::endl; + if(OutputFileFormat >::default_sptr()->write_to_file(output_filename, this->get_density(num)) + == Succeeded::no) + return Succeeded::no; + } + if((this->_time_gate_definitions).get_num_gates()==0) + std::cout << "GatedDiscretisedDensity: No gates to write, please check!!" << std::endl; + return Succeeded::yes; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/GatedProjData.cxx b/src/buildblock/GatedProjData.cxx new file mode 100644 index 0000000000..665558a494 --- /dev/null +++ b/src/buildblock/GatedProjData.cxx @@ -0,0 +1,229 @@ +/* + Copyright (C) 2005-2011, Hammersmith Imanet Ltd + Copyright (C) 2009-2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup data_buildblock + \brief Implementation of class stir::GatedProjData + \author Kris Thielemans + \author Charalampos Tsoumpas +*/ + +#include "stir/GatedProjData.h" +#include "stir/IO/FileSignature.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/ProjDataFromStream.h" +#include +#include "stir/Succeeded.h" +#include "stir/KeyParser.h" +#include "stir/is_null_ptr.h" +#include +#include + +START_NAMESPACE_STIR + +GatedProjData* +GatedProjData:: +read_from_file(const string& filename) // The written image is read in respect to its center as origin!!! +{ + std::fstream input(filename.c_str(), std::ios::in | std::ios::binary); + if (!input) + { + warning("GatedProjData::read_from_file cannot read file '%s'. Will now attempt to append .gdef", filename.c_str()); + return read_from_gdef(filename); + } + + const FileSignature file_signature(input); + const char * signature = file_signature.get_signature(); + + GatedProjData * gated_proj_data_ptr = 0; + +#ifdef HAVE_LLN_MATRIX + if (strncmp(signature, "MATRIX", 6) == 0) + { +#ifndef NDEBUG + warning("GatedProjData::read_from_file trying to read %s as ECAT7\n", filename.c_str()); +#endif + USING_NAMESPACE_ECAT + USING_NAMESPACE_ECAT7 + + if (is_ECAT7_emission_file(filename)) + { + Main_header mhead; + if (read_ECAT7_main_header(mhead, filename) == Succeeded::no) + { + warning("GatedProjData::read_from_file cannot read %s as ECAT7\n", filename.c_str()); + return 0; + } + gated_proj_data_ptr = new GatedProjData; + // we no longer have a _scanner_sptr member, so next lines are commented out + //gated_proj_data_ptr->_scanner_sptr.reset( + // find_scanner_from_ECAT_system_type(mhead.system_type)); + + const unsigned int num_gates = + static_cast(mhead.num_gates); // TODO +1? + gated_proj_data_ptr->_proj_datas.resize(num_gates); + + for (unsigned int gate_num=1; gate_num <= num_gates; ++ gate_num) + { + gated_proj_data_ptr->_proj_datas[gate_num-1].reset( + ECAT7_to_PDFS(filename, + 1, + gate_num, + /* data_num, bed_num, */ 0,0)); + } + if (is_null_ptr(gated_proj_data_ptr->_proj_datas[0])) + error("GatedProjData: No gate available\n"); + } + else + { + if (is_ECAT7_file(filename)) + warning("GatedProjData::read_from_file ECAT7 file %s should be an emission sinogram\n", filename.c_str()); + } + } + else +#endif // end of HAVE_LLN_MATRIX + if (strncmp(signature, "Multigate", 9) == 0) + { + //#ifndef NDEBUG + warning("GatedProjData::read_from_file trying to read %s as Multigate", filename.c_str()); + //#endif + //return read_multi_gated_proj_data(filename); + + std::vector filenames; + KeyParser parser; + parser.add_start_key("Multigate"); + parser.add_stop_key("end"); + parser.add_key("filenames", &filenames); + if (parser.parse(filename.c_str()) == false) + { + warning("GatedProjData:::read_from_file: Error parsing %s", filename.c_str()); + return 0; + } + + gated_proj_data_ptr = new GatedProjData; + const unsigned int num_gates = + static_cast(filenames.size()); + gated_proj_data_ptr->_proj_datas.resize(num_gates); + + for (unsigned int gate_num=1; gate_num <= num_gates; ++ gate_num) + { + std::cerr<<" Reading " << filenames[gate_num-1]<<'\n'; + gated_proj_data_ptr->_proj_datas[gate_num-1] = + ProjData::read_from_file(filenames[gate_num-1]); + } + // we no longer have a _scanner_sptr member, so next lines are commented out + //gated_proj_data_ptr->_scanner_sptr.reset( + // new Scanner(*gated_proj_data_ptr->_proj_datas[0]->get_proj_data_info_ptr()->get_scanner_ptr())); + return gated_proj_data_ptr; + } + + if (is_null_ptr(gated_proj_data_ptr)) + error("GatedProjData::read_from_file unrecognised file format for file '%s'", + filename.c_str()); + return gated_proj_data_ptr; +} + +GatedProjData* +GatedProjData::read_from_gdef(const string& filename) +{ + const string gdef_filename=filename+".gdef"; + std::cout << "GatedProjData: Reading gate definitions " << gdef_filename.c_str() << std::endl; + GatedProjData * gated_proj_data_ptr = new GatedProjData; + gated_proj_data_ptr->_time_gate_definitions.read_gdef_file(gdef_filename); + gated_proj_data_ptr->_proj_datas.resize(gated_proj_data_ptr->_time_gate_definitions.get_num_gates()); + for ( unsigned int num = 1 ; num<=(gated_proj_data_ptr->_time_gate_definitions).get_num_gates() ; ++num ) + { + std::stringstream gate_num_stream; + gate_num_stream << gated_proj_data_ptr->_time_gate_definitions.get_gate_num(num); + const string input_filename=filename+"_g"+gate_num_stream.str()+".hs"; + std::cout << "GatedProjData: Reading gate projection file: " << input_filename.c_str() << std::endl; + gated_proj_data_ptr->_proj_datas[num-1] = ProjData::read_from_file(input_filename); + } + // we no longer have a _scanner_sptr member, so next lines are commented out + // gated_proj_data_ptr->_scanner_sptr. + // reset(new Scanner(*gated_proj_data_ptr->_proj_datas[0]->get_proj_data_info_ptr()->get_scanner_ptr())); + if (is_null_ptr(gated_proj_data_ptr)) + error("GatedProjData::read_from_file unrecognised file format for projection files with prefix '%s'", + filename.c_str()); + return gated_proj_data_ptr; +} + +Succeeded +GatedProjData:: +write_to_ecat7(const string& filename) const +{ +#ifndef HAVE_LLN_MATRIX + return Succeeded::no; +#else + + Main_header mhead; + ecat::ecat7::make_ECAT7_main_header(mhead, filename, + *get_proj_data(1).get_exam_info_ptr(), + *get_proj_data(1).get_proj_data_info_ptr() ); + mhead.num_gates = 1; + mhead.num_gates = this->get_num_gates(); + mhead.acquisition_type = + mhead.num_gates>1 ? DynamicEmission : StaticEmission; + + MatrixFile* mptr= matrix_create (filename.c_str(), MAT_CREATE, &mhead); + if (mptr == 0) + { + warning("GatedProjData::write_to_ecat7 cannot write output file %s\n", filename.c_str()); + return Succeeded::no; + } + for ( unsigned int gate_num = 1 ; gate_num<=this->get_num_gates() ; ++gate_num ) + { + if (ecat::ecat7::ProjData_to_ECAT7(mptr, + get_proj_data(gate_num), + 1, + gate_num) + == Succeeded::no) + { + matrix_close(mptr); + return Succeeded::no; + } + } + matrix_close(mptr); + return Succeeded::yes; +#endif // end of HAVE_LLN_MATRIX +} + +#if 0 // This is not necessary for the moment as we only read the files. +Succeeded +GatedProjData:: +write_to_files(const string& filename) const +{ + for ( unsigned int num = 1 ; num<=(_time_gate_definitions).get_num_gates() ; ++num ) + { + std::stringstream gate_num_stream; + gate_num_stream << _time_gate_definitions.get_gate_num(num); + const string output_filename=filename+"_g"+gate_num_stream.str()+".hv"; + std::cout << "GatedProjData: Writing new gate file: " << output_filename.c_str() << std::endl; + if(XXX->write_to_file(output_filename, this->get_density(num)) + == Succeeded::no) + return Succeeded::no; + } + if((this->_time_gate_definitions).get_num_gates()==0) + std::cout << "GatedDiscretisedDensity: No gates to write, please check!!" << std::endl; + return Succeeded::yes; + + return Succeeded::yes; +} +#endif + +END_NAMESPACE_STIR diff --git a/src/buildblock/IndexRange.cxx b/src/buildblock/IndexRange.cxx new file mode 100644 index 0000000000..6b7f6f750a --- /dev/null +++ b/src/buildblock/IndexRange.cxx @@ -0,0 +1,270 @@ +// +// +/*! + \file + \ingroup Array + \brief implementations for the stir::IndexRange class + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/IndexRange.h" +#include + +START_NAMESPACE_STIR + +#ifndef STIR_NO_MUTABLE + + +template +bool +IndexRange::get_regular_range( + BasicCoordinate& min, + BasicCoordinate& max) const +{ + // check if empty range + if (base_type::begin() == base_type::end()) + { +#ifndef STIR_NO_NAMESPACES + std::fill(min.begin(), min.end(), 0); + std::fill(max.begin(), max.end(),-1); +#else + // gcc 2.8.1 needs ::fill, otherwise it gets confused with VectorWithOffset::fill + ::fill(min.begin(), min.end(), 0); + ::fill(max.begin(), max.end(),-1); +#endif + return true; + } + + // if not a regular range, exit + if (is_regular_range == regular_false) + return false; + + typename base_type::const_iterator iter=base_type::begin(); + + BasicCoordinate lower_dim_min; + BasicCoordinate lower_dim_max; + if (!iter->get_regular_range(lower_dim_min, lower_dim_max)) + return false; + + if (is_regular_range == regular_to_do) + { + // check if all lower dimensional ranges have same regular range + BasicCoordinate lower_dim_min_try; + BasicCoordinate lower_dim_max_try; + + for (++iter; iter != base_type::end(); ++iter) + { + if (!iter->get_regular_range(lower_dim_min_try, lower_dim_max_try)) + { + is_regular_range = regular_false; + return false; + } +#ifndef STIR_NO_NAMESPACES + if (!std::equal(lower_dim_min.begin(), lower_dim_min.end(), lower_dim_min_try.begin()) || + !std::equal(lower_dim_max.begin(), lower_dim_max.end(), lower_dim_max_try.begin())) +#else + if (!equal(lower_dim_min.begin(), lower_dim_min.end(), lower_dim_min_try.begin()) || + !equal(lower_dim_max.begin(), lower_dim_max.end(), lower_dim_max_try.begin())) +#endif + { + is_regular_range = regular_false; + return false; + } + } + // yes, they do + is_regular_range = regular_true; + } + +#if defined(_MSC_VER) && _MSC_VER<1200 + // bug in VC++ 5.0, needs explicit template args + min = join(base_type::get_min_index(), lower_dim_min); + max = join(base_type::get_max_index(), lower_dim_max); +#elif defined( __GNUC__) && (__GNUC__ == 2 && __GNUC_MINOR__ < 9) + // work around gcc 2.8.1 bug. + // It cannot call 'join' (it generates a bad mangled name for the function) + // So, we explicitly insert the code here + *min.begin() = base_type::get_min_index(); + copy(lower_dim_min.begin(), lower_dim_min.end(), min.begin()+1); + *max.begin() = base_type::get_max_index(); + copy(lower_dim_max.begin(), lower_dim_max.end(), max.begin()+1); +#else + // lines for good compilers... + min = join(base_type::get_min_index(), lower_dim_min); + max = join(base_type::get_max_index(), lower_dim_max); +#endif + return true; +} + +#else // STIR_NO_MUTABLE + +template +bool +IndexRange::get_regular_range( + BasicCoordinate& min, + BasicCoordinate& max) const +{ + // check if empty range + if (base_type::begin() == base_type::end()) + { +#ifndef STIR_NO_NAMESPACES + std::fill(min.begin(), min.end(), 0); + std::fill(max.begin(), max.end(),-1); +#else + fill(min,base_type::begin(), min.end(), 0); + fill(max,base_type::begin(), max.end(),-1); +#endif + return true; + } + + // if not a regular range, exit + if (is_regular_range == regular_false) + return false; + + base_type::const_iterator iter=base_type::begin(); + + BasicCoordinate lower_dim_min; + BasicCoordinate lower_dim_max; + if (!iter->get_regular_range(lower_dim_min, lower_dim_max)) + return false; + + if (is_regular_range == regular_to_do) + { + // check if all lower dimensional ranges have same regular range + BasicCoordinate lower_dim_min_try; + BasicCoordinate lower_dim_max_try; + + for (++iter; iter != base_type::end(); ++iter) + { + if (!iter->get_regular_range(lower_dim_min_try, lower_dim_max_try)) + { + //is_regular_range = regular_false; + return false; + } +#ifndef STIR_NO_NAMESPACES + if (!std::equal(lower_dim_min.begin(), lower_dim_min.end(), lower_dim_min_try.begin()) || + !std::equal(lower_dim_max.begin(), lower_dim_max.end(), lower_dim_max_try.begin())) +#else + if (!equal(lower_dim_min.begin(), lower_dim_min.end(), lower_dim_min_try.begin()) || + !equal(lower_dim_max.begin(), lower_dim_max.end(), lower_dim_max_try.begin())) +#endif + { + //is_regular_range = regular_false; + return false; + } + } + // yes, they do + //is_regular_range = regular_true; + } + +#if defined(_MSC_VER) && _MSC_VER<1200 + // bug in VC++ 5.0, needs explicit template args + min = join(base_type::get_min_index(), lower_dim_min); + max = join(base_type::get_max_index(), lower_dim_max); +#else + min = join(base_type::get_min_index(), lower_dim_min); + max = join(base_type::get_max_index(), lower_dim_max); +#endif + return true; +} + +template +bool +IndexRange::get_regular_range( + BasicCoordinate& min, + BasicCoordinate& max) +{ + // check if empty range + if (base_type::begin() == base_type::end()) + { +#ifndef STIR_NO_NAMESPACES + std::fill(min.begin(), min.end(), 0); + std::fill(max.begin(), max.end(),-1); +#else + fill(min.begin(), min.end(), 0); + fill(max.begin(), max.end(),-1); +#endif + return true; + } + + // if not a regular range, exit + if (is_regular_range == regular_false) + return false; + + base_type::iterator iter=base_type::begin(); + + BasicCoordinate lower_dim_min; + BasicCoordinate lower_dim_max; + if (!iter->get_regular_range(lower_dim_min, lower_dim_max)) + return false; + + if (is_regular_range == regular_to_do) + { + // check if all lower dimensional ranges have same regular range + BasicCoordinate lower_dim_min_try; + BasicCoordinate lower_dim_max_try; + + for (++iter; iter != base_type::end(); ++iter) + { + if (!iter->get_regular_range(lower_dim_min_try, lower_dim_max_try)) + { + is_regular_range = regular_false; + return false; + } +#ifndef STIR_NO_NAMESPACES + if (!std::equal(lower_dim_min.begin(), lower_dim_min.end(), lower_dim_min_try.begin()) || + !std::equal(lower_dim_max.begin(), lower_dim_max.end(), lower_dim_max_try.begin())) +#else + if (!equal(lower_dim_min.begin(), lower_dim_min.end(), lower_dim_min_try.begin()) || + !equal(lower_dim_max.begin(), lower_dim_max.end(), lower_dim_max_try.begin())) +#endif + { + is_regular_range = regular_false; + return false; + } + } + // yes, they do + is_regular_range = regular_true; + } + +#if defined(_MSC_VER) && _MSC_VER<1200 + // bug in VC++ 5.0, needs explicit template args + min = join(base_type::get_min_index(), lower_dim_min); + max = join(base_type::get_max_index(), lower_dim_max); +#else + min = join(base_type::get_min_index(), lower_dim_min); + max = join(base_type::get_max_index(), lower_dim_max); +#endif + return true; +} + +#endif // STIR_NO_MUTABLE + + +/*************************************************** + instantiations + ***************************************************/ + +template class IndexRange<2>; +template class IndexRange<3>; +template class IndexRange<4>; +END_NAMESPACE_STIR diff --git a/src/buildblock/Jamfile b/src/buildblock/Jamfile new file mode 100644 index 0000000000..6cb8128d15 --- /dev/null +++ b/src/buildblock/Jamfile @@ -0,0 +1,51 @@ +# (C) Copyright David Abrahams 2001. Permission to copy, use, modify, sell and +# distribute this software is granted provided this copyright notice appears +# in all copies. This software is provided "as is" without express or implied +# warranty, and with no claim as to its suitability for any purpose. +# +# Stir.Python library Jamfile + + +# declare the location of this subproject relative to the root +subproject buildblock ; + + +local local_sources ; + +local_sources = + Array.cxx + IndexRange.cxx + ProjData.cxx + ProjDataInfo.cxx + ProjDataInfoCylindrical.cxx + ProjDataInfoCylindricalArcCorr.cxx + ProjDataInfoCylindricalNoArcCorr.cxx + ArcCorrection.cxx + ProjDataFromStream.cxx + ProjDataGEAdvance.cxx + ProjDataInMemory.cxx + ProjDataInterfile.cxx + Scanner.cxx + SegmentBySinogram.cxx + SegmentByView.cxx + Viewgram.cxx + Sinogram.cxx + RelatedViewgrams.cxx + DiscretisedDensity.cxx + VoxelsOnCartesianGrid.cxx + utilities.cxx + interfile_keyword_functions.cxx + zoom.cxx + NumericType.cxx + ByteOrder.cxx + KeyParser.cxx + recon_array_functions.cxx + linear_regression.cxx + overlap_interpolate.cxx + error.cxx + warning.cxx + ; + +sources += buildblock/$(local_sources) ; + + diff --git a/src/buildblock/KeyParser.cxx b/src/buildblock/KeyParser.cxx new file mode 100644 index 0000000000..c048c19de0 --- /dev/null +++ b/src/buildblock/KeyParser.cxx @@ -0,0 +1,1246 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009-04-30, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012-01-29, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Implementations for class stir::KeyParser + + \author Patrick Valente + \author Kris Thielemans + \author PARAPET project +*/ + +#include "stir/KeyParser.h" +#include "stir/Succeeded.h" +#include "stir/Object.h" +#include "stir/interfile_keyword_functions.h" +#include "stir/stream.h" +#include "stir/is_null_ptr.h" +#include +#include +#include +#include +# ifdef BOOST_NO_STDC_NAMESPACE + namespace std { using ::getenv; } +# endif + +#include + +#ifndef BOOST_NO_STRINGSTREAM +#include +#endif + +#ifndef STIR_NO_NAMESPACES +using std::ifstream; +using std::cerr; +using std::cout; +using std::cin; +using std::endl; +using std::istrstream; +using std::ostrstream; +#endif + +START_NAMESPACE_STIR + +/* function that reads a line upto \n + + It allows for \r at the end of the line (as in files + originating in DOS/Windows). + When the line ends with continuation_char, the next line + will just be appended to the current one. + + The continuation_char HAS to be the last character. Even + spaces after it will stop the 'continuation'. + + This function should be moved somewhere else as it + might be useful to someone else as well. (TODO) +*/ +static void read_line(istream& input, string& line, + const char continuation_char = '\\') +{ + line.resize(0); + if (!input) + return; + + string thisline; + while(true) + { +#ifndef _MSC_VER + std::getline(input, thisline); +#else + /* VC 6.0 getline does not work properly when input==cin. + It only returns after a 2nd CR is entered. (The entered input is + used for the next getline, so that the input is indeed ok. Problem is + if that in a sequence + getline(cin,...); + cout << "prompt"; + getline(cin,...); + the user sees the 'prompt' only after the 2nd CR. + So, we replace getline(stream,string) with our own mess... + */ + { + const size_t buf_size=512; // arbitrary number here. we'll check if the line was too long below + char buf[buf_size]; + thisline.resize(0); + bool more_chars = false; + do + { + buf[0]='\0'; + input.getline(buf,buf_size); + thisline += buf; + if (input.fail() && !input.bad()) + { + // either no characters (end-of-line somehow) or buf_size-1 + input.clear(); + more_chars = strlen(buf)==buf_size-1; + } + else + more_chars = false; + } + while (more_chars); + } +#endif + // check if last character is \r, + // in case this is a DOS file, but not a DOS/Windows host + if (thisline.size() != 0) + { + string::size_type position_of_last_char = + thisline.size()-1; + if (thisline[position_of_last_char] == '\r') + thisline.erase(position_of_last_char, 1); + } + // TODO handle the case of a Mac file on a non-Mac host (EOL on Mac is \r) + + line += thisline; + + // check for continuation + if (line.size() != 0) + { + string::size_type position_of_last_char = + line.size()-1; + if (line[position_of_last_char] == continuation_char) + { + line.erase(position_of_last_char, 1); + // now the while loop will keep on reading + } + else + { + // exit the loop + break; + } + } + else + { + // exit the loop + break; + } + } + + // replace ${text} with value of environment variable + { + string::size_type start_of_env_string; + while ((start_of_env_string = line.find("${")) != string::npos) + { + const string::size_type end_of_env_string = line.find('}',start_of_env_string+2); + if (end_of_env_string == string::npos) + break; + const string::size_type size_of_env_string = + end_of_env_string-start_of_env_string+1; + const string name_of_env_variable = line.substr(start_of_env_string+2, size_of_env_string-3); + const char * const value_of_env_variable = std::getenv(name_of_env_variable.c_str()); + if (value_of_env_variable == 0) + { + warning("KeyParser: environment variable '%s' not found. Replaced by empty string.\n" + "This happened while parsing the following line:\n%s", + name_of_env_variable.c_str(), + line.c_str()); + line.erase(start_of_env_string, size_of_env_string); + } + else + { + line.replace(start_of_env_string, + size_of_env_string, + value_of_env_variable); + } + } + } +} + +// map_element implementation; + +map_element::map_element() +{ + type=KeyArgument::NONE; + p_object_member=0; + p_object_variable=0; + p_object_list_of_values=0; +} + +map_element::map_element(KeyArgument::type t, + KeyParser::KeywordProcessor pom, + void* pov, + const ASCIIlist_type *list_of_values) +{ + type=t; + p_object_member=pom; + p_object_variable=pov; + p_object_list_of_values=list_of_values; +} + +map_element::map_element(void (KeyParser::*pom)(), + Object** pov, + Parser* parser) + : + type(KeyArgument::PARSINGOBJECT), + p_object_member(pom), + p_object_variable(pov), + parser(parser)//static_cast(parser)) + {} + +map_element::map_element(void (KeyParser::*pom)(), + shared_ptr* pov, + Parser* parser) + : + type(KeyArgument::SHARED_PARSINGOBJECT), + p_object_member(pom), + p_object_variable(pov), + parser(parser)//static_cast(parser)) + {} + +map_element::~map_element() +{ +} + + +map_element& map_element::operator=(const map_element& me) +{ + type=me.type; + p_object_member=me.p_object_member; + p_object_variable=me.p_object_variable; + p_object_list_of_values=me.p_object_list_of_values; + parser = me.parser; + return *this; +} + +// KeyParser implementation + + +KeyParser::KeyParser() +{ + + current_index=-1; + status=end_parsing; + current=0;//KTnew map_element(); +} + +KeyParser::~KeyParser() +{ +} + +bool KeyParser::parse(const char * const filename, const bool write_warning) +{ + ifstream hdr_stream(filename); + if (!hdr_stream) + { + warning("KeyParser::parse: couldn't open file %s\n", filename); + return false; + } + return parse(hdr_stream, write_warning); +} + +bool KeyParser::parse(istream& f, const bool write_warning) +{ + // print_keywords_to_stream(cerr); + + input=&f; + return (parse_header(write_warning)==Succeeded::yes && post_processing()==false); +} + + +// KT 10/07/2000 new function +/*! + This follows Interfile 3.3 conventions: +
          +
        • The characters \c space, \c tab, \c underscore, \c ! are all + treated as white space and ignored. +
        • Case is ignored. +
        + Note: in this implementation 'ignoring' white space means 'trimming' + at the start and end of the keyword, and replacing repeated white space + with a single space. + +*/ +string +KeyParser::standardise_keyword(const string& keyword) const +{ + return standardise_interfile_keyword(keyword); +} + +// KT 07/10/2002 moved here from Line +string +KeyParser::get_keyword(const string& line) const +{ + // keyword stops at either := or an index [] + // TODO should check that = follows : to allow keywords with colons in there + const string::size_type eok = line.find_first_of(":[",0); + return line.substr(0,eok); +} + +map_element* KeyParser::find_in_keymap(const string& keyword) +{ + for (Keymap::iterator iter = kmap.begin(); + iter != kmap.end(); + ++iter) + { + if (iter->first == keyword) + return &(iter->second); + } + // it wasn't there + return 0; +} + +void +KeyParser::add_in_keymap(const string& keyword, const map_element& new_element) +{ + const string standardised_keyword = standardise_keyword(keyword); + map_element * elem_ptr = find_in_keymap(standardised_keyword); + if (elem_ptr != 0) + { + warning("KeyParser: overwriting value of the keyword %s\n", keyword.c_str()); + *elem_ptr = new_element; + } + else + kmap.push_back(pair(standardised_keyword, new_element)); +} + +void +KeyParser::add_key(const string& keyword, float * variable) + { + add_key(keyword, KeyArgument::FLOAT, variable); + } + +void +KeyParser::add_key(const string& keyword, double * variable) + { + add_key(keyword, KeyArgument::DOUBLE, variable); + } + +void +KeyParser::add_key(const string& keyword, int * variable) + { + add_key(keyword, KeyArgument::INT, variable); + } + +void +KeyParser::add_key(const string& keyword, unsigned int * variable) + { + add_key(keyword, KeyArgument::UINT, variable); + } + +void +KeyParser::add_key(const string& keyword, unsigned long * variable) + { + add_key(keyword, KeyArgument::ULONG, variable); + } + +void +KeyParser::add_key(const string& keyword, bool * variable) + { + add_key(keyword, KeyArgument::BOOL, variable); + } + +void +KeyParser::add_key(const string& keyword, vector* variable) + { + add_key(keyword, KeyArgument::LIST_OF_DOUBLES, variable); + } + +void +KeyParser::add_key(const string& keyword, vector* variable) + { + add_key(keyword, KeyArgument::LIST_OF_ASCII, variable); + } + +void +KeyParser::add_key(const string& keyword, Array<2,float>* variable) + { + add_key(keyword, KeyArgument::ARRAY2D_OF_FLOATS, variable); + } + +void +KeyParser::add_key(const string& keyword, Array<3,float>* variable) + { + add_key(keyword, KeyArgument::ARRAY3D_OF_FLOATS, variable); + } + +void +KeyParser::add_key(const string& keyword, BasicCoordinate<3,float>* variable) + { + add_key(keyword, KeyArgument::BASICCOORDINATE3D_OF_FLOATS, variable); + } + +void +KeyParser::add_key(const string& keyword, BasicCoordinate<3,Array<3,float> >* variable) + { + add_key(keyword, KeyArgument::BASICCOORDINATE3D_OF_ARRAY3D_OF_FLOATS, variable); + } + +void +KeyParser::add_key(const string& keyword, string * variable) + { + add_key(keyword, KeyArgument::ASCII, variable); + } + +void +KeyParser::add_key(const string& keyword, int * variable, + const ASCIIlist_type * list_of_values_ptr) + { + add_key(keyword, KeyArgument::ASCIIlist, variable, list_of_values_ptr); + } + +void +KeyParser::add_start_key(const string& keyword) + { + add_key(keyword, KeyArgument::NONE, &KeyParser::start_parsing); + } +void +KeyParser::add_stop_key(const string& keyword) + { + add_key(keyword, KeyArgument::NONE, &KeyParser::stop_parsing); + } + + + + +void KeyParser::add_key(const string& keyword, + KeyArgument::type t, + KeywordProcessor function, + void* variable, + const ASCIIlist_type * const list_of_values) +{ + add_in_keymap(keyword, map_element(t, function, variable, list_of_values)); +} + +void KeyParser::add_key(const string& keyword, + KeyArgument::type t, + void* variable, + const ASCIIlist_type * const list_of_values) +{ + add_in_keymap(keyword, map_element(t, &KeyParser::set_variable, variable, list_of_values)); +} + +void +KeyParser::print_keywords_to_stream(ostream& out) const +{ + for (Keymap::const_iterator key = kmap.begin(); key != kmap.end(); ++key) + { + out << key->first << '\n'; + } + out << endl; +} + + +Succeeded KeyParser::parse_header(const bool write_warning) +{ + + if (read_and_parse_line(false) == Succeeded::yes) + process_key(); + if (status != parsing) + { + // something's wrong. We're finding data, but we're not supposed to be + // parsing. We'll exit with an error, but first write a warning. + // The warning will say that we miss the "start parsing" keyword (if we can find it in the map) + + // find starting keyword + string start_keyword; + for (Keymap::const_iterator i=kmap.begin(); i!= kmap.end(); ++i) + { + if (i->second.p_object_member == &KeyParser::start_parsing) + start_keyword = i->first; + } + if (start_keyword.length()>0) + { + warning("KeyParser error: required first keyword \"%s\" not found\n", + start_keyword.c_str()); + } + else + { + // there doesn't seem to be a start_parsing keyword, so we cannot include it + // in the warning. (it could be a side-effect of another key, so we're + // not sure if the map is correct or not) + warning("KeyParser error: data found, but KeyParser status is \"not parsing\". Keymap possibly incorrect"); + } + return Succeeded::no; + } + + while(status==parsing) + { + if(read_and_parse_line(write_warning) == Succeeded::yes) + process_key(); + } + + return Succeeded::yes; + +} + +Succeeded KeyParser::read_and_parse_line(const bool write_warning) +{ + string line; + // we keep reading a line until it's either non-empty, or we're at the end of the input + while (true) + { + if (!input->good()) + { + warning("KeyParser warning: early EOF or bad file"); + stop_parsing(); + return Succeeded::no; + } + + read_line(*input, line); + // check if only white-space, if not, get out of the loop to continue + std::size_t pos = line.find_first_not_of(" \t"); + if ( pos != string::npos) + break; + } + + // gets keyword + keyword=standardise_keyword(get_keyword(line)); + return parse_value_in_line(line, write_warning); +} + + +// functions that get arbitrary type parameters from a string (after '=') +// unfortunately, the string type needs special case as istream::operator>> stops a string at white space +// we also do special things for vectors +// they all return Succeeded::yes when there was a parameter + +template +static +Succeeded +get_param_from_string(T& param, const string& s) +{ + const string::size_type cp=s.find('=',0); + if(cp==string::npos) + return Succeeded::no; + + istrstream str(s.c_str()+cp+1); + str >> param; + return str.fail() ? Succeeded::no : Succeeded::yes; +} + +template <> +Succeeded +get_param_from_string(string& param, const string& s) +{ + const string::size_type cp = s.find('=',0); + if(cp!=string::npos) + { + // skip starting white space + const string::size_type sok=s.find_first_not_of(" \t",cp+1); // KT 07/10/2002 now also skips tabs + if(sok!=string::npos) + { + // strip trailing white space + const string::size_type eok=s.find_last_not_of(" \t",s.length()); + param=s.substr(sok,eok-sok+1); + return Succeeded::yes; + } + } + return Succeeded::no; +} + +// special handling for vectors if we desire that no {} means only 1 element +// this is currently only used for the matrix_size keywords in InterfileHeader. + +template +static +Succeeded +get_vparam_from_string(vector& param, const string& s) +{ + const string::size_type cp = s.find('=',0); + if(cp!=string::npos) + { + // skip starting white space + const string::size_type start=s.find_first_not_of(" \t",cp+1); // KT 07/10/2002 now also skips tabs + if(start!=string::npos) + { + istrstream str(s.c_str()+start); + + if (s[start] == '{') + str >> param; + else + { + param.resize(1); + str >> param[0]; + } + return str.fail() ? Succeeded::no : Succeeded::yes; + } + } + return Succeeded::no; +} + +template +static +Succeeded +get_vparam_from_string(VectorWithOffset& param, const string& s) +{ + const string::size_type cp = s.find('=',0); + if(cp!=string::npos) + { + // skip starting white space + const string::size_type start=s.find_first_not_of(" \t",cp+1); // KT 07/10/2002 now also skips tabs + if(start!=string::npos) + { + istrstream str(s.c_str()+start); + + if (s[start] == '{') + str >> param; + else + { + param = VectorWithOffset(); // TODO will NOT work with multi-dimensional arrays + param.grow(0,0); + str >> param[0]; + } + return str.fail() ? Succeeded::no : Succeeded::yes; + } + } + return Succeeded::no; +} + +// vectors of strings are also special as we need to split the string up if there are commas +template <> +Succeeded +get_vparam_from_string(vector& param, const string& s) +{ + string::size_type cp = s.find('=',0); + if(cp!=string::npos) + { + // skip starting white space + const string::size_type start=s.find_first_not_of(" \t",cp+1); // KT 07/10/2002 now also skips tabs + if(start!=string::npos) + { + if (s[start] == '{') + { + bool end=false; + cp = start+1; + while (!end) + { + cp=s.find_first_not_of("},",cp); + cp=s.find_first_not_of(" \t",cp); + + if(cp==string::npos) + { + end=true; + } + else + { + string::size_type eop=s.find_first_of(",}",cp); + if(eop==string::npos) + { + end=true; + eop=s.length(); + } + // trim ending white space + const string::size_type eop2 = s.find_last_not_of(" \t",eop); + param.push_back(s.substr(cp,eop2-cp)); + cp=eop+1; + } + } + } + else + { + param.resize(1); + param[0] = s.substr(start, s.find_last_not_of(" \t",s.size())); + } + return Succeeded::yes; + } + } + return Succeeded::no; +} + +// function that finds the current_index. work to do here! +static int get_index(const string& line) +{ + // we take 0 as a default value for the index + int in=0; + // make sure that the index is part of the key (i.e. before :=) + const string::size_type cp=line.find_first_of(":[",0); + if(cp!=string::npos && line[cp] == '[') + { + const string::size_type sok=cp+1; + const string::size_type eok=line.find_first_of(']',cp); + // check if closing bracket really there + if (eok == string::npos) + { + // TODO do something more graceful + warning("Interfile warning: invalid vectored key in line \n'%s'.\n%s", + line.c_str(), + "Assuming this is not a vectored key."); + return 0; + } + in=atoi(line.substr(sok,eok-sok).c_str()); + } + return in; +} + +// more template trickery such that we can use boost::any + +// this class comes from "Modern C++ Design" by Andrei Alexandrescu +template +struct Type2Type +{ + typedef T type; +}; + +template +static +Succeeded +get_any_param_from_string(boost::any& parameter, Type2Type, const string& s) +{ + parameter = T(); + // note: don't use cast to reference as it might break VC 6.0 + return + get_param_from_string(*boost::any_cast(¶meter), s); +} + +template +static +Succeeded +get_any_vparam_from_string(boost::any& parameter, Type2Type, const string& s) +{ + parameter = T(); + // note: don't use cast to reference as it might break VC 6.0 + return + get_vparam_from_string(*boost::any_cast(¶meter), s); +} + +Succeeded KeyParser::parse_value_in_line(const string& line, const bool write_warning) +{ + // KT 07/10/2002 use return value of get_param to detect if a value was present at all + current_index=get_index(line); + + // maps keyword to appropriate map_element (sets current) + if(map_keyword(keyword)==Succeeded::yes) + { + switch(current->type) // depending on the par_type, gets the correct value from the line + { // and sets the right temporary variable + case KeyArgument::NONE : + keyword_has_a_value = false; + break; + case KeyArgument::ASCII : + case KeyArgument::ASCIIlist : + // KT 07/02/2001 new + case KeyArgument::PARSINGOBJECT: + case KeyArgument::SHARED_PARSINGOBJECT: + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type(), line) == Succeeded::yes; + break; + case KeyArgument::INT : + case KeyArgument::BOOL : + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type(), line) == Succeeded::yes; + break; + case KeyArgument::UINT : + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type(), line) == Succeeded::yes; + break; + case KeyArgument::ULONG : + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type(), line) == Succeeded::yes; + break; + case KeyArgument::DOUBLE : + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type(), line) == Succeeded::yes; + break; + case KeyArgument::FLOAT : + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type(), line) == Succeeded::yes; + break; + case KeyArgument::LIST_OF_INTS : + keyword_has_a_value = + get_any_vparam_from_string(this->parameter, Type2Type >(), line) == Succeeded::yes; + break; + case KeyArgument::LIST_OF_DOUBLES : + keyword_has_a_value = + get_any_vparam_from_string(this->parameter, Type2Type >(), line) == Succeeded::yes; + break; + case KeyArgument::LIST_OF_ASCII : + // TODO enforce {} by writing get_param_from_string for vector + keyword_has_a_value = + get_any_vparam_from_string(this->parameter, Type2Type >(), line) == Succeeded::yes; + break; + case KeyArgument::ARRAY2D_OF_FLOATS: + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type >(), line) == Succeeded::yes; + break; + case KeyArgument::ARRAY3D_OF_FLOATS: + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type >(), line) == Succeeded::yes; + break; + case KeyArgument::BASICCOORDINATE3D_OF_FLOATS: + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type >(), line) == Succeeded::yes; + break; + case KeyArgument::BASICCOORDINATE3D_OF_ARRAY3D_OF_FLOATS: + keyword_has_a_value = + get_any_param_from_string(this->parameter, Type2Type > >(), line) == Succeeded::yes; + break; + default : + // KT 07/10/2002 now exit with error + error ("KeyParser internal error: keyword '%s' has unsupported type of parameters\n", + keyword.c_str()); + return Succeeded::no; // just a line to avoid compiler warnings + } + return Succeeded::yes; + } + + // skip empty lines and comments + if (keyword.length() != 0 && keyword[0] != ';' && write_warning) + warning("KeyParser warning: unrecognized keyword: %s\n", keyword.c_str()); + + // do no processing of this key + return Succeeded::no; +} + +void KeyParser::start_parsing() +{ + status=parsing; +} + +void KeyParser::stop_parsing() +{ + status=end_parsing; +} + +// KT 07/02/2001 new +void KeyParser::set_parsing_object() +{ + // KT 07/10/2002 new + if (!keyword_has_a_value) + return; + + // TODO this does not handle the vectored key convention + + // current_index is set to 0 when there was no index + if(current_index!=0) + error("KeyParser::PARSINGOBJECT can't handle vectored keys yet\n"); + const std::string& par_ascii = *boost::any_cast(&this->parameter); + *reinterpret_cast(current->p_object_variable) = + (*current->parser)(input, par_ascii); +} + + +// KT 20/08/2001 new +void KeyParser::set_shared_parsing_object() +{ + // KT 07/10/2002 new + if (!keyword_has_a_value) + return; + + // TODO this does not handle the vectored key convention + + // current_index is set to 0 when there was no index + if(current_index!=0) + error("KeyParser::SHARED_PARSINGOBJECT can't handle vectored keys yet"); + const std::string& par_ascii = *boost::any_cast(&this->parameter); + reinterpret_cast *>(current->p_object_variable)-> + reset((*current->parser)(input, par_ascii)); +} + +// local function to be used in set_variable below +template +void static +assign_to_list(T1& mylist, const T2& value, const int current_index, + const string& keyword) +{ + if(mylist.size() < static_cast(current_index)) + { + error("KeyParser: the list corresponding to the keyword \"%s\" has to be resized " + "to size %d. This means you have a problem in the keyword values.", + keyword.c_str(), current_index); + // mylist.resize(current_index); + } + mylist[current_index-1] = value; +} + +void KeyParser::set_variable() +{ + if (!keyword_has_a_value) + return; + + // TODO this does not handle the vectored key convention + + // current_index is set to 0 when there was no index + if(!current_index) + { + switch(current->type) + { +#define KP_case_assign(KeyArgumentValue, type) \ + case KeyArgumentValue : \ + *reinterpret_cast(current->p_object_variable) = \ + * boost::any_cast(&this->parameter); break + + case KeyArgument::BOOL : + { + const int par_int = * boost::any_cast(¶meter); + if (par_int !=0 && par_int != 1) + warning("KeyParser: keyword %s expects a bool value which should be 0 or 1\n" + " (actual value is %d). A non-zero value will be assumed to mean 'true'\n", + keyword.c_str(), par_int); + bool* p_bool=(bool*)current->p_object_variable; // performs the required casting + *p_bool=par_int != 0; + break; + } + KP_case_assign(KeyArgument::INT, int); + KP_case_assign(KeyArgument::UINT, unsigned int); + KP_case_assign(KeyArgument::ULONG,unsigned long); + KP_case_assign(KeyArgument::DOUBLE,double); + KP_case_assign(KeyArgument::FLOAT,float); + KP_case_assign(KeyArgument::ASCII, std::string); + + case KeyArgument::ASCIIlist : + { + const std::string& par_ascii = *boost::any_cast(&this->parameter); + const int index = + find_in_ASCIIlist(par_ascii, *(current->p_object_list_of_values)); + *((int *)current->p_object_variable) = index; + if (index == -1) + { + // it was not in the list + // TODO we should use warning() instead + cerr << "KeyParser warning : value of keyword \"" + << keyword << "\" is \"" + << par_ascii + << "\"\n\tshould have been one of:"; + for (unsigned int i=0; ip_object_list_of_values->size(); i++) + cerr << "\n\t" << (*current->p_object_list_of_values)[i]; + cerr << '\n' << endl; + } + break; + } + KP_case_assign(KeyArgument::LIST_OF_INTS, IntVect); + KP_case_assign(KeyArgument::LIST_OF_DOUBLES, DoubleVect); + // sigh... macro expansion fails of type contain commas.... + // Work-around: use typedefs. + typedef Array<2,float> KP_array2d; + typedef Array<3,float> KP_array3d; + typedef BasicCoordinate<3,float> KP_coord; + typedef BasicCoordinate<3,Array<3,float> > KP_coord_array3d; + KP_case_assign(KeyArgument::ARRAY2D_OF_FLOATS, KP_array2d); + KP_case_assign(KeyArgument::ARRAY3D_OF_FLOATS, KP_array3d); + KP_case_assign(KeyArgument::BASICCOORDINATE3D_OF_FLOATS, KP_coord); + KP_case_assign(KeyArgument::BASICCOORDINATE3D_OF_ARRAY3D_OF_FLOATS,KP_coord_array3d); + KP_case_assign(KeyArgument::LIST_OF_ASCII, std::vector); + default : + warning("KeyParser error: unknown type. Implementation error"); + break; + } +#undef KP_case_assign + } + else // Sets vector elements using current_index + { + switch(current->type) + { +#define KP_case_assign(KeyArgumentValue, type) \ + case KeyArgumentValue : \ + assign_to_list(*reinterpret_cast *>(current->p_object_variable), \ + * boost::any_cast(&this->parameter), current_index, keyword); \ + break + + KP_case_assign(KeyArgument::INT, int); + KP_case_assign(KeyArgument::UINT,unsigned int); + KP_case_assign(KeyArgument::ULONG,unsigned long); + KP_case_assign(KeyArgument::DOUBLE,double); + KP_case_assign(KeyArgument::FLOAT,float); + KP_case_assign(KeyArgument::ASCII, std::string); + case KeyArgument::ASCIIlist : + { + const std::string& par_ascii = *boost::any_cast(&this->parameter); + const int index_in_asciilist = + find_in_ASCIIlist(par_ascii, *(current->p_object_list_of_values)); + assign_to_list(*(IntVect*)current->p_object_variable, + index_in_asciilist, current_index, keyword); + if (index_in_asciilist == -1) + { + // it was not in the list + // TODO we should use warning() instead + cerr << "KeyParser warning : value of keyword \"" + << keyword << "\" is \"" + << par_ascii + << "\"\n\tshould have been one of:"; + for (unsigned int i=0; ip_object_list_of_values->size(); i++) + cerr << "\n\t" << (*current->p_object_list_of_values)[i]; + } + break; + } + KP_case_assign(KeyArgument::LIST_OF_INTS, IntVect); + KP_case_assign(KeyArgument::LIST_OF_DOUBLES, DoubleVect); + default : + + warning("KeyParser error: unknown type. Implementation error"); + break; + } +#undef KP_case_assign + } +} + +int KeyParser::find_in_ASCIIlist(const string& par_ascii, const ASCIIlist_type& list_of_values) +{ + { + // TODO, once we know for sure type of ASCIIlist_type, we could use STL find() + // TODO it would be more efficient to call standardise_keyword on the + // list_of_values in add_key() + for (unsigned int i=0; ip_object_member!=0) + { + (this->*(current->p_object_member))(); //calls appropriate member function + } +} + +namespace detail +{ + /* A local helper function, essentially equivalent to operator<<(ostream&, const T& var). + However, it will insert \ characters in front of end-of-line. + This is used for types for which operator<< can result in multi-line strings. + If this is not fixed, it would mean that the output of parameter_info() is + not immediatelly suitable for parsing back. + Example: suppose there's a keyword that needs a 2d array. If at parsing we have + my array:={{1,2},{3}} + then parameter_info would give + my_array:={{1,2} + , {3} + } + and this would not follow standard syntax. When using the following function + in parameter_info(), the output will be + my_array:={{1,2}\ + , {3}\ + } + */ + template + static void to_stream(ostream& s, const T& var, const char continuation_char = '\\') + { + // we will first write everything to a temporary stringstream + // and then read it back, inserting the backslash +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[100000]; + strstream stemp(str, 100000); +#else + std::stringstream stemp; +#endif + // write to stemp + stemp << var; + + // now read it back, character by character + while (true) + { + char c; + stemp.get(c); + if (!stemp) + break; + if (c == '\n') + s << continuation_char; // insert continuation character + s << c; + } + } +} + +// TODO breaks with vectored keys (as there is no way of finding out if the +// variable is actually a vector of the relevant type +string KeyParser::parameter_info() const +{ +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[100000]; + ostrstream s(str, 100000); +#else + std::ostringstream s; +#endif + + // first find start key + for (Keymap::const_iterator i=kmap.begin(); i!= kmap.end(); ++i) + { + if (i->second.p_object_member == &KeyParser::start_parsing) + s << i->first << " :=\n"; + } + + for (Keymap::const_iterator i=kmap.begin(); i!= kmap.end(); ++i) + { + if (i->second.p_object_member == &KeyParser::start_parsing || + i->second.p_object_member == &KeyParser::stop_parsing) + continue; + + s << i->first << " := "; + switch(i->second.type) + { + // TODO will break with vectored keys + case KeyArgument::DOUBLE: + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::FLOAT: + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::INT: + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::BOOL: + s << (*reinterpret_cast(i->second.p_object_variable) ? 1 : 0); break; + case KeyArgument::UINT: + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::ULONG: + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::NONE: + break; + case KeyArgument::ASCII : + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::ASCIIlist : + { + const int index = *reinterpret_cast(i->second.p_object_variable); + s << (index == -1 ? + "UNALLOWED VALUE" : + (*i->second.p_object_list_of_values)[index]); + break; + } + case KeyArgument::PARSINGOBJECT: + { + Object* parsing_object_ptr = + *reinterpret_cast(i->second.p_object_variable); + if (parsing_object_ptr!=0) + { + s << parsing_object_ptr->get_registered_name() << endl; + s << parsing_object_ptr->parameter_info() << endl; + } + else + s << "None"; + break; + } + case KeyArgument::SHARED_PARSINGOBJECT: + { +#if defined(__GNUC__) && __GNUC__ < 3 + + s << "COMPILED WITH GNU C++ (prior to version 3.0), CANNOT INSERT VALUE"; +#else + shared_ptr parsing_object_ptr = + (*reinterpret_cast*>(i->second.p_object_variable)); + + if (!is_null_ptr(parsing_object_ptr)) + { + //std::cerr << "\nBefore *parsing_object_ptr" << endl; + //std::cerr << "\ntypename *parsing_object_ptr " << typeid(*parsing_object_ptr).name() <get_registered_name() << endl; + s << parsing_object_ptr->parameter_info(); + } + else + s << "None"; +#endif + break; + } + + case KeyArgument::LIST_OF_DOUBLES: + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::LIST_OF_INTS: + s << *reinterpret_cast(i->second.p_object_variable); break; + case KeyArgument::ARRAY2D_OF_FLOATS: + detail::to_stream(s, *reinterpret_cast*>(i->second.p_object_variable)); break; + case KeyArgument::ARRAY3D_OF_FLOATS: + detail::to_stream(s, *reinterpret_cast*>(i->second.p_object_variable)); break; + case KeyArgument::BASICCOORDINATE3D_OF_FLOATS: + { + typedef BasicCoordinate<3,float> type; + s << *reinterpret_cast(i->second.p_object_variable); + break; + } + case KeyArgument::BASICCOORDINATE3D_OF_ARRAY3D_OF_FLOATS: + { + typedef BasicCoordinate<3,Array<3,float> > type; + detail::to_stream(s, *reinterpret_cast(i->second.p_object_variable)); + break; + } + case KeyArgument::LIST_OF_ASCII: + s << *reinterpret_cast*>(i->second.p_object_variable); break; + default : + warning("KeyParser error: unknown type. Implementation error\n"); + break; + + } + s << endl; + } + // finally, find stop key + for (Keymap::const_iterator i=kmap.begin(); i!= kmap.end(); ++i) + { + if (i->second.p_object_member == &KeyParser::stop_parsing) + s << i->first << " := \n"; + } + + return s.str(); + } + +// KT 13/03/2001 new +// TODO breaks with vectored keys (as there is no way of finding out if the +// variable is actually a vector of the relevant type +void KeyParser::ask_parameters() +{ + // This is necessary for set_parsing_object. It will allow the + // 'recursive' parser to see it's being called interactively. + input = 0; + while(true) + { + string line; + + for (Keymap::const_iterator i=kmap.begin(); i!= kmap.end(); ++i) + { + + if (i->second.p_object_member == &KeyParser::do_nothing || + i->second.p_object_member == &KeyParser::start_parsing || + i->second.p_object_member == &KeyParser::stop_parsing) + continue; + + keyword = i->first; + + cout << keyword << " := "; + { + read_line(cin, line); + // prepend ":=" such that parse_value_in_line can work properly + line.insert(0, ":= "); + } + + if (parse_value_in_line(line, false) == Succeeded::yes) + process_key(); + } + if (post_processing()) + cout << " Asking all questions again! (Sorry)\n"; + else + return; + } +} +END_NAMESPACE_STIR diff --git a/src/buildblock/MaximalArrayFilter3D.cxx b/src/buildblock/MaximalArrayFilter3D.cxx new file mode 100644 index 0000000000..8dad72e64a --- /dev/null +++ b/src/buildblock/MaximalArrayFilter3D.cxx @@ -0,0 +1,115 @@ +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + Copyright (C) 2010 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup Array + \brief Applies the dilation filter (i.e. voxel=max(neighbours)) + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ +#include "stir/MaximalArrayFilter3D.h" +#include "stir/Coordinate3D.h" +#include +#include + +START_NAMESPACE_STIR + +template +MaximalArrayFilter3D::MaximalArrayFilter3D(const Coordinate3D& mask_radius) +{ + this->mask_radius_x = mask_radius[3]; + this->mask_radius_y = mask_radius[2]; + this->mask_radius_z = mask_radius[1]; +} + +template +MaximalArrayFilter3D::MaximalArrayFilter3D() +{ + this->mask_radius_x = 0; + this->mask_radius_y = 0; + this->mask_radius_z = 0; +} + +template +int +MaximalArrayFilter3D:: +extract_neighbours(Array<1,elemT>& neigbours,const Array<3,elemT>& in_array,const Coordinate3D& c_pixel) const +{ + int index=0; + + for (int zi =-mask_radius_z;zi<= mask_radius_z;++zi) + { + const int z = c_pixel[1]+zi; + if (z in_array.get_max_index()) + continue; + for (int yi =-mask_radius_y;yi<= mask_radius_y;++yi) + { + const int y = c_pixel[2]+yi; + if (y in_array[z].get_max_index()) + continue; + for( int xi=-mask_radius_x;xi<= mask_radius_x;++xi) + { + const int x = c_pixel[3]+xi; + if (x in_array[z][y].get_max_index()) + continue; + neigbours[index++] = in_array[z][y][x]; + } + } + } + return index; +} + +template +void +MaximalArrayFilter3D:: +do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const +{ + assert(out_array.get_index_range() == in_array.get_index_range()); + + Array<1,elemT> neighbours (0,(2*mask_radius_x+1)*(2*mask_radius_y+1)*(2*mask_radius_z+1)-1); + + for (int z=out_array.get_min_index();z<= out_array.get_max_index();++z) + for (int y=out_array[z].get_min_index();y <= out_array[z].get_max_index();++y) + for (int x=out_array[z][y].get_min_index();x <= out_array[z][y].get_max_index();++x) + { + const int num_neighbours = + extract_neighbours(neighbours,in_array,Coordinate3D(z,y,x)); + if (num_neighbours==0) + continue; + out_array[z][y][x] = + *std::max_element(neighbours.begin(), neighbours.begin() + num_neighbours); + } +} + +template +bool +MaximalArrayFilter3D:: +is_trivial() const +{ + if (mask_radius_x!=1 &&mask_radius_y !=1 &&mask_radius_z!=1) + return true; + else + return false; +} + +// instantiation +template class MaximalArrayFilter3D; + +END_NAMESPACE_STIR diff --git a/src/buildblock/MaximalImageFilter3D.cxx b/src/buildblock/MaximalImageFilter3D.cxx new file mode 100644 index 0000000000..3513efe420 --- /dev/null +++ b/src/buildblock/MaximalImageFilter3D.cxx @@ -0,0 +1,115 @@ +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + Copyright (C) 2010 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup ImageProcessor + \brief Implementations for class stir::MaximalImageFilter3D + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#include "stir/MaximalImageFilter3D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/DiscretisedDensity.h" + + +START_NAMESPACE_STIR + +template +MaximalImageFilter3D:: MaximalImageFilter3D(const CartesianCoordinate3D& mask_radius) +{ + mask_radius_x = mask_radius.x(); + mask_radius_y = mask_radius.y(); + mask_radius_z = mask_radius.z(); +} + +template +MaximalImageFilter3D:: MaximalImageFilter3D() +{ + set_defaults(); +} + +template +Succeeded +MaximalImageFilter3D::virtual_set_up (const DiscretisedDensity<3,elemT>& density) +{ + /* if (consistency_check(density) == Succeeded::no) + return Succeeded::no;*/ + maximal_filter = + MaximalArrayFilter3D(Coordinate3D + (mask_radius_z, mask_radius_y, mask_radius_x)); + + return Succeeded::yes; +} + +template +void +MaximalImageFilter3D::virtual_apply(DiscretisedDensity<3, elemT>& density) const +{ + //assert(consistency_check(density) == Succeeded::yes); + maximal_filter(density); +} + +template +void +MaximalImageFilter3D::virtual_apply(DiscretisedDensity<3, elemT>& out_density, const DiscretisedDensity<3, elemT>& in_density) const +{ + //assert(consistency_check(in_density) == Succeeded::yes); + maximal_filter(out_density,in_density); +} + +template +void +MaximalImageFilter3D::set_defaults() +{ + base_type::set_defaults(); + + mask_radius_x = 0; + mask_radius_y = 0; + mask_radius_z = 0; +} + +template +void +MaximalImageFilter3D::initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Maximal Filter Parameters"); + this->parser.add_key("mask radius x", &mask_radius_x); + this->parser.add_key("mask radius y", &mask_radius_y); + this->parser.add_key("mask radius z", &mask_radius_z); + this->parser.add_stop_key("END Maximal Filter Parameters"); +} + +template <> +const char * const +MaximalImageFilter3D::registered_name = + "Maximal"; + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +template class MaximalImageFilter3D; + +END_NAMESPACE_STIR diff --git a/src/buildblock/MedianArrayFilter3D.cxx b/src/buildblock/MedianArrayFilter3D.cxx new file mode 100644 index 0000000000..e7aba4a3c6 --- /dev/null +++ b/src/buildblock/MedianArrayFilter3D.cxx @@ -0,0 +1,144 @@ +// +// +/*! + + \file + \ingroup Array + \brief Implementations for class stir::MedianArrayFilter3D + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* History: + SM first version + KT 19/03/2002 + change handling of edges (they were not filtered before) + correct bug in case output and input array size were not the same +*/ +#include "stir/MedianArrayFilter3D.h" +#include "stir/Coordinate3D.h" + +#include + +#ifndef STIR_NO_NAMESPACES +using std::nth_element; +#endif + +START_NAMESPACE_STIR + + +template +MedianArrayFilter3D::MedianArrayFilter3D(const Coordinate3D& mask_radius) +{ + this->mask_radius_x = mask_radius[3]; + this->mask_radius_y = mask_radius[2]; + this->mask_radius_z = mask_radius[1]; + + /* assert(mask_radius_x>0); + assert(mask_radius_x%2 == 1); + assert(mask_radius_y>0); + assert(mask_radius_y%2 == 1); + assert(mask_radius_z>0); + assert(mask_radius_z%2 == 1);*/ +} + +template +MedianArrayFilter3D::MedianArrayFilter3D() +{ + this->mask_radius_x = 0; + this->mask_radius_y = 0; + this->mask_radius_z = 0; +} + + +template +int +MedianArrayFilter3D:: +extract_neighbours(Array<1,elemT>& neigbours,const Array<3,elemT>& in_array,const Coordinate3D& c_pixel) const +{ + int index=0; + + for (int zi =-mask_radius_z;zi<= mask_radius_z;++zi) + { + const int z = c_pixel[1]+zi; + if (z in_array.get_max_index()) + continue; + for (int yi =-mask_radius_y;yi<= mask_radius_y;++yi) + { + const int y = c_pixel[2]+yi; + if (y in_array[z].get_max_index()) + continue; + for( int xi=-mask_radius_x;xi<= mask_radius_x;++xi) + { + const int x = c_pixel[3]+xi; + if (x in_array[z][y].get_max_index()) + continue; + neigbours[index++] = in_array[z][y][x]; + } + } + } + return index; +} + +template +void +MedianArrayFilter3D:: +do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const +{ + assert(out_array.get_index_range() == in_array.get_index_range()); + + Array<1,elemT> neighbours (0,(2*mask_radius_x+1)*(2*mask_radius_y+1)*(2*mask_radius_z+1)-1); + + for (int z=out_array.get_min_index();z<= out_array.get_max_index();++z) + for (int y=out_array[z].get_min_index();y <= out_array[z].get_max_index();++y) + for (int x=out_array[z][y].get_min_index();x <= out_array[z][y].get_max_index();++x) + { + const int num_neighbours = + extract_neighbours(neighbours,in_array,Coordinate3D(z,y,x)); + if (num_neighbours==0) + continue; + nth_element(neighbours.begin(), neighbours.begin()+num_neighbours/2, neighbours.end()); + if (num_neighbours%2==1) + out_array[z][y][x] = neighbours[num_neighbours/2]; + else + out_array[z][y][x] = (neighbours[num_neighbours/2]+ + neighbours[num_neighbours/2 - 1])/2; + } +} + + +template +bool +MedianArrayFilter3D:: +is_trivial() const +{ + if (mask_radius_x!=1 &&mask_radius_y !=1 &&mask_radius_z!=1) + return true; + else + return false; + +} + + +// instantiation +template class MedianArrayFilter3D; + +END_NAMESPACE_STIR + diff --git a/src/buildblock/MedianImageFilter3D.cxx b/src/buildblock/MedianImageFilter3D.cxx new file mode 100644 index 0000000000..7ae3a7a07e --- /dev/null +++ b/src/buildblock/MedianImageFilter3D.cxx @@ -0,0 +1,121 @@ +// +// +/*! + \file + \ingroup ImageProcessor + \brief Implementations for class stir::MedianImageFilter3D + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/MedianImageFilter3D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/DiscretisedDensity.h" + + +START_NAMESPACE_STIR + +template +MedianImageFilter3D:: MedianImageFilter3D(const CartesianCoordinate3D& mask_radius) +{ + mask_radius_x = mask_radius.x(); + mask_radius_y = mask_radius.y(); + mask_radius_z = mask_radius.z(); +} + +template +MedianImageFilter3D:: MedianImageFilter3D() +{ + set_defaults(); +} + +template +Succeeded +MedianImageFilter3D::virtual_set_up (const DiscretisedDensity<3,elemT>& density) +{ + +/* if (consistency_check(density) == Succeeded::no) + return Succeeded::no;*/ + median_filter = + MedianArrayFilter3D(Coordinate3D + (mask_radius_z, mask_radius_y, mask_radius_x)); + + return Succeeded::yes; +} + +template +void +MedianImageFilter3D::virtual_apply(DiscretisedDensity<3, elemT>& density) const +{ + //assert(consistency_check(density) == Succeeded::yes); + median_filter(density); +} + +template +void +MedianImageFilter3D::virtual_apply(DiscretisedDensity<3, elemT>& out_density, const DiscretisedDensity<3, elemT>& in_density) const +{ + //assert(consistency_check(in_density) == Succeeded::yes); + median_filter(out_density,in_density); +} + +template +void +MedianImageFilter3D::set_defaults() +{ + base_type::set_defaults(); + + mask_radius_x = 0; + mask_radius_y = 0; + mask_radius_z = 0; +} + +template +void +MedianImageFilter3D::initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Median Filter Parameters"); + this->parser.add_key("mask radius x", &mask_radius_x); + this->parser.add_key("mask radius y", &mask_radius_y); + this->parser.add_key("mask radius z", &mask_radius_z); + this->parser.add_stop_key("END Median Filter Parameters"); +} + +template <> +const char * const +MedianImageFilter3D::registered_name = + "Median"; + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + + +// Register this class in the ImageProcessor registry +//static MedianImageFilter3D::RegisterIt dummy; + +template class MedianImageFilter3D; + +END_NAMESPACE_STIR diff --git a/src/buildblock/MinimalArrayFilter3D.cxx b/src/buildblock/MinimalArrayFilter3D.cxx new file mode 100644 index 0000000000..656454320f --- /dev/null +++ b/src/buildblock/MinimalArrayFilter3D.cxx @@ -0,0 +1,117 @@ +// +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief Applies the erosion filter (i.e. voxel=min(neighbours)) + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ +#include "stir/MinimalArrayFilter3D.h" +#include "stir/Coordinate3D.h" +#include +#include + +START_NAMESPACE_STIR + +template +MinimalArrayFilter3D::MinimalArrayFilter3D(const Coordinate3D& mask_radius) +{ + this->mask_radius_x = mask_radius[3]; + this->mask_radius_y = mask_radius[2]; + this->mask_radius_z = mask_radius[1]; +} + +template +MinimalArrayFilter3D::MinimalArrayFilter3D() +{ + this->mask_radius_x = 0; + this->mask_radius_y = 0; + this->mask_radius_z = 0; +} + +template +int +MinimalArrayFilter3D:: +extract_neighbours(Array<1,elemT>& neigbours,const Array<3,elemT>& in_array,const Coordinate3D& c_pixel) const +{ + int index=0; + + for (int zi =-mask_radius_z;zi<= mask_radius_z;++zi) + { + const int z = c_pixel[1]+zi; + if (z in_array.get_max_index()) + continue; + for (int yi =-mask_radius_y;yi<= mask_radius_y;++yi) + { + const int y = c_pixel[2]+yi; + if (y in_array[z].get_max_index()) + continue; + for( int xi=-mask_radius_x;xi<= mask_radius_x;++xi) + { + const int x = c_pixel[3]+xi; + if (x in_array[z][y].get_max_index()) + continue; + neigbours[index++] = in_array[z][y][x]; + } + } + } + return index; +} + +template +void +MinimalArrayFilter3D:: +do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const +{ + assert(out_array.get_index_range() == in_array.get_index_range()); + + Array<1,elemT> neighbours (0,(2*mask_radius_x+1)*(2*mask_radius_y+1)*(2*mask_radius_z+1)-1); + + for (int z=out_array.get_min_index();z<= out_array.get_max_index();++z) + for (int y=out_array[z].get_min_index();y <= out_array[z].get_max_index();++y) + for (int x=out_array[z][y].get_min_index();x <= out_array[z][y].get_max_index();++x) + { + const int num_neighbours = + extract_neighbours(neighbours,in_array,Coordinate3D(z,y,x)); + if (num_neighbours==0) + continue; + out_array[z][y][x] = + *std::min_element(neighbours.begin(), neighbours.begin() + num_neighbours); + } +} + +template +bool +MinimalArrayFilter3D:: +is_trivial() const +{ + if (mask_radius_x!=1 &&mask_radius_y !=1 &&mask_radius_z!=1) + return true; + else + return false; + +} + +// instantiation +template class MinimalArrayFilter3D; + +END_NAMESPACE_STIR diff --git a/src/buildblock/MinimalImageFilter3D.cxx b/src/buildblock/MinimalImageFilter3D.cxx new file mode 100644 index 0000000000..5c0ecff61e --- /dev/null +++ b/src/buildblock/MinimalImageFilter3D.cxx @@ -0,0 +1,117 @@ +// +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup ImageProcessor + \brief Implementations for class MinimalImageFilter3D + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + +#include "stir/MinimalImageFilter3D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/DiscretisedDensity.h" + + +START_NAMESPACE_STIR + +template +MinimalImageFilter3D:: MinimalImageFilter3D(const CartesianCoordinate3D& mask_radius) +{ + mask_radius_x = mask_radius.x(); + mask_radius_y = mask_radius.y(); + mask_radius_z = mask_radius.z(); +} + +template +MinimalImageFilter3D:: MinimalImageFilter3D() +{ + set_defaults(); +} + +template +Succeeded +MinimalImageFilter3D::virtual_set_up (const DiscretisedDensity<3,elemT>& density) +{ + +/* if (consistency_check(density) == Succeeded::no) + return Succeeded::no;*/ + minimal_filter = + MinimalArrayFilter3D(Coordinate3D + (mask_radius_z, mask_radius_y, mask_radius_x)); + + return Succeeded::yes; +} + +template +void +MinimalImageFilter3D::virtual_apply(DiscretisedDensity<3, elemT>& density) const +{ + //assert(consistency_check(density) == Succeeded::yes); + minimal_filter(density); +} + +template +void +MinimalImageFilter3D::virtual_apply(DiscretisedDensity<3, elemT>& out_density, const DiscretisedDensity<3, elemT>& in_density) const +{ + //assert(consistency_check(in_density) == Succeeded::yes); + minimal_filter(out_density,in_density); +} + +template +void +MinimalImageFilter3D::set_defaults() +{ + base_type::set_defaults(); + + mask_radius_x = 0; + mask_radius_y = 0; + mask_radius_z = 0; +} + +template +void +MinimalImageFilter3D::initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Minimal Filter Parameters"); + this->parser.add_key("mask radius x", &mask_radius_x); + this->parser.add_key("mask radius y", &mask_radius_y); + this->parser.add_key("mask radius z", &mask_radius_z); + this->parser.add_stop_key("END Minimal Filter Parameters"); +} + +template <> +const char * const +MinimalImageFilter3D::registered_name = + "Minimal"; + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +template class MinimalImageFilter3D; + +END_NAMESPACE_STIR diff --git a/src/buildblock/MultipleProjData.cxx b/src/buildblock/MultipleProjData.cxx new file mode 100644 index 0000000000..70cfcfb7a0 --- /dev/null +++ b/src/buildblock/MultipleProjData.cxx @@ -0,0 +1,61 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup data_buildblock + \brief Implementation of class stir::MultipleProjData + \author Kris Thielemans + +*/ + +#include "stir/MultipleProjData.h" +#include "stir/is_null_ptr.h" +#include + +START_NAMESPACE_STIR + +const ProjDataInfo * +MultipleProjData:: +get_proj_data_info_ptr() const +{ + if (get_num_gates() == 0) + return 0; + else + return _proj_datas[0]->get_proj_data_info_ptr(); +} + +void +MultipleProjData:: +set_proj_data_sptr(const shared_ptr& proj_data_sptr, + const unsigned int gate_num) +{ + this->_proj_datas[gate_num-1]=proj_data_sptr; +} + +#if 0 +// currently inline +const ProjData & +MultipleProjData:: +get_proj_data(const unsigned int gate_num) const +{ + return *this->_proj_datas[gate_num-1] ; +} +#endif + +END_NAMESPACE_STIR diff --git a/src/buildblock/NonseparableConvolutionUsingRealDFTImageFilter.cxx b/src/buildblock/NonseparableConvolutionUsingRealDFTImageFilter.cxx new file mode 100644 index 0000000000..e8657890aa --- /dev/null +++ b/src/buildblock/NonseparableConvolutionUsingRealDFTImageFilter.cxx @@ -0,0 +1,168 @@ +/* + Copyright (C) 2007 - 2007-10-08, Hammersmith Imanet + Copyright (C) 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ + +/*! + + \file + \ingroup ImageProcessor + \brief Implementations for class stir::NonseparableConvolutionUsingRealDFTImageFilter + + \author Sanida Mustafovic + \author Kris Thielemans +*/ + +#include "stir/NonseparableConvolutionUsingRealDFTImageFilter.h" +#include "stir/IndexRange3D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/ArrayFunction.h" +#include "stir/Array_complex_numbers.h" +#include "stir/IO/read_from_file.h" + + +START_NAMESPACE_STIR + +// fixed to 3D at present +static const int num_dimensions = 3; + +template +NonseparableConvolutionUsingRealDFTImageFilter:: +NonseparableConvolutionUsingRealDFTImageFilter() +{ + this->set_defaults(); +} + +template +NonseparableConvolutionUsingRealDFTImageFilter:: +NonseparableConvolutionUsingRealDFTImageFilter( const Array<3,elemT>& filter_coefficients ) +{ + this->_filter_coefficients = filter_coefficients; +} + +template +Succeeded +NonseparableConvolutionUsingRealDFTImageFilter:: +virtual_set_up(const DiscretisedDensity<3,elemT>& density) +{ + BasicCoordinate min_indices, max_indices; + if (!density.get_regular_range(min_indices, max_indices)) + return Succeeded::no; + BasicCoordinate padded_sizes = max_indices - min_indices +1; + if (!this->_filter_coefficients.get_regular_range(min_indices, max_indices)) + return Succeeded::no; + padded_sizes += max_indices - min_indices +1; + // remove 1 to be accurate + padded_sizes -= 1; + // need to make it a power of 2 for the DFT implementation + for (int d=1; d<= num_dimensions; ++d) + { + padded_sizes[d] = + static_cast(round(pow(2., ceil(log(static_cast(padded_sizes[d])) / log(2.))))); + } + IndexRange padding_range(padded_sizes); + Array padded_filter_coefficients(padding_range); + transform_array_to_periodic_indices(padded_filter_coefficients, this->_filter_coefficients); + this->_array_filter_sptr.reset( + new ArrayFilterUsingRealDFTWithPadding(padded_filter_coefficients)); + return Succeeded::yes; +} + +template +void +NonseparableConvolutionUsingRealDFTImageFilter:: +virtual_apply(DiscretisedDensity<3,elemT>& out_density, const DiscretisedDensity<3,elemT>& in_density) const +{ + (*this->_array_filter_sptr)(out_density, in_density); +} + +template +void +NonseparableConvolutionUsingRealDFTImageFilter:: +virtual_apply(DiscretisedDensity<3,elemT>& density) const +{ + // should use scoped_ptr but don't have it yet + shared_ptr > tmp_density_sptr(density.clone()); + this->virtual_apply(density, *tmp_density_sptr); +} + + +template +void +NonseparableConvolutionUsingRealDFTImageFilter::set_defaults() +{ + this->_kernel_filename=""; + this->_filter_coefficients.fill(0.F); +} + +template +void +NonseparableConvolutionUsingRealDFTImageFilter:: initialise_keymap() +{ + this->parser.add_start_key("Nonseparable Convolution Using Real DFT Image Filter"); + this->parser.add_key("filter kernel", &this->_kernel_filename); + this->parser.add_stop_key("END Nonseparable Convolution Using Real DFT Image Filter"); +} + +template +bool +NonseparableConvolutionUsingRealDFTImageFilter:: +post_processing() +{ + if (this->_kernel_filename.length() == 0) + { warning("You need to specify a kernel file"); return true; } + else + this->_kernel_sptr = read_from_file >(this->_kernel_filename); + const DiscretisedDensity<3,elemT>& kernel = *this->_kernel_sptr; + BasicCoordinate min_indices, max_indices; + if (!kernel.get_regular_range(min_indices, max_indices)) + return true; + + const BasicCoordinate sizes = max_indices - min_indices + 1; + + if (sizes[1]%2==0 || sizes[2]%2==0 || sizes[3]%2==0) + warning("Parsing Nonseparable Convolution Using Real DFT Image Filter\n" + "Even number of filter coefficients for at least one of the dimensions." + "I'll (effectively) append a 0 at the end.\n"); + + const BasicCoordinate new_min_indices = (sizes/2)*(-1); + + this->_filter_coefficients.grow(IndexRange(new_min_indices, new_min_indices + sizes - 1 )); + + BasicCoordinate index = get_min_indices(this->_filter_coefficients); + do + { + this->_filter_coefficients[index] = kernel[index - new_min_indices + min_indices]; + } + while(next(index, this->_filter_coefficients)); + + return false; +} + +template<> +const char * const +NonseparableConvolutionUsingRealDFTImageFilter::registered_name = +"Nonseparable Convolution Using Real DFT Image Filter"; + +# ifdef _MSC_VER + // prevent warning message on reinstantiation, + // note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +template class NonseparableConvolutionUsingRealDFTImageFilter; + +END_NAMESPACE_STIR + diff --git a/src/buildblock/NumericType.cxx b/src/buildblock/NumericType.cxx new file mode 100644 index 0000000000..bf73b62c5d --- /dev/null +++ b/src/buildblock/NumericType.cxx @@ -0,0 +1,216 @@ +/*! + \file + + \brief implementations for the stir::NumericType class + + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009 Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + History: + - first version Kris Thielemans + + - KT 15/12/99 added get_Interfile_info + */ +#include "stir/NumericType.h" +#include "stir/NumericInfo.h" + +#ifndef STIR_NO_NAMESPACES +using std::size_t; +using std::string; +#endif + +START_NAMESPACE_STIR + +NumericType::NumericType(const string& number_format, const size_t size_in_bytes) +{ + bool it_is_signed; + bool it_is_integral; + + if (number_format == "signed integer") + { + it_is_signed = true; + it_is_integral = true; + } + else if (number_format == "unsigned integer") + { + it_is_signed = false; + it_is_integral = true; + } + else if (number_format == "float") + { + it_is_signed = true; + it_is_integral = false; + } + + else if (number_format == "bit") + { + id = BIT; + return; + } + else + { + // set to some values which are guaranteed to break later on + it_is_signed = false; + it_is_integral = false; + } + + // set up default value + id = UNKNOWN_TYPE; + + // rely on enum<->int conversions + for (int t=1; t < (int)UNKNOWN_TYPE; t++) + { + const NumericType type = (Type)t; + if (it_is_signed == type.signed_type() && + it_is_integral == type.integer_type() && + size_in_bytes == type.size_in_bytes()) + { + id = (Type)t; + return; + } + } + +} + + +void +NumericType::get_Interfile_info(string& number_format, + size_t& size_in_bytes_v) const +{ + size_in_bytes_v = size_in_bytes(); + + switch(id) + { + case BIT: + number_format = "bit"; break; + case SCHAR: + case SHORT: + case INT: + case LONG: + number_format = "signed integer"; break; + case UCHAR: + case USHORT: + case UINT: + case ULONG: + number_format = "unsigned integer"; break; + case FLOAT: + case DOUBLE: + number_format = "float"; break; + case UNKNOWN_TYPE: + number_format = "unknown"; break; + } +} + + + +size_t NumericType::size_in_bytes() const + { + // KT TODO pretty awful way of doings things, but I'm not sure how to handle it + switch(id) + { + case BIT: + // TODO sensible value ? + return 0; +#define CASE(NUMERICTYPE) \ + case NUMERICTYPE : \ + return NumericInfo::type>().size_in_bytes(); + + // now list cases that we want + CASE(NumericType::SCHAR); + CASE(NumericType::UCHAR); + CASE(NumericType::SHORT); + CASE(NumericType::USHORT); + CASE(NumericType::INT); + CASE(NumericType::UINT); + CASE(NumericType::LONG); + CASE(NumericType::ULONG); + CASE(NumericType::FLOAT); + CASE(NumericType::DOUBLE); +#undef CASE + case UNKNOWN_TYPE: + return 0; + } + // we never get here, but VC++ wants a return nevertheless + return 0; + } + +size_t NumericType::size_in_bits() const + { return CHAR_BIT * size_in_bytes(); } + +bool NumericType::signed_type() const + { + switch(id) + { + case BIT: + return false; +#define CASE(NUMERICTYPE) \ + case NUMERICTYPE : \ + return NumericInfo::type>().signed_type(); + + // now list cases that we want + CASE(NumericType::SCHAR); + CASE(NumericType::UCHAR); + CASE(NumericType::SHORT); + CASE(NumericType::USHORT); + CASE(NumericType::INT); + CASE(NumericType::UINT); + CASE(NumericType::LONG); + CASE(NumericType::ULONG); + CASE(NumericType::FLOAT); + CASE(NumericType::DOUBLE); +#undef CASE + case UNKNOWN_TYPE: + return false; + } + // we never get here, but VC++ wants a return nevertheless + return false; + } + +bool NumericType::integer_type() const + { + switch(id) + { + case BIT: + return true; +#define CASE(NUMERICTYPE) \ + case NUMERICTYPE : \ + return NumericInfo::type>().integer_type(); + + // now list cases that we want + CASE(NumericType::SCHAR); + CASE(NumericType::UCHAR); + CASE(NumericType::SHORT); + CASE(NumericType::USHORT); + CASE(NumericType::INT); + CASE(NumericType::UINT); + CASE(NumericType::LONG); + CASE(NumericType::ULONG); + CASE(NumericType::FLOAT); + CASE(NumericType::DOUBLE); +#undef CASE + case UNKNOWN_TYPE: + return false; + + } + // we never get here, but VC++ wants a return nevertheless + return false; + } +END_NAMESPACE_STIR diff --git a/src/buildblock/ParsingObject.cxx b/src/buildblock/ParsingObject.cxx new file mode 100644 index 0000000000..c9ab25fc9e --- /dev/null +++ b/src/buildblock/ParsingObject.cxx @@ -0,0 +1,157 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Non-linline implementations for class stir::ParsingObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/ParsingObject.h" +#include + +#ifndef STIR_NO_NAMESPACE +using std::ifstream; +#endif + +START_NAMESPACE_STIR + +ParsingObject::ParsingObject() +: + keymap_is_initialised(false) +{} + + + + +ParsingObject::ParsingObject(const ParsingObject& par) +: + keymap_is_initialised(false) + {} + + +ParsingObject& +ParsingObject::operator =(const ParsingObject& par) +{ + if (&par == this) return *this; + keymap_is_initialised = false; + return *this; +} + +void +ParsingObject:: +set_defaults() +{} + +void +ParsingObject:: +initialise_keymap() +{} + +bool +ParsingObject:: +post_processing() +{ return false; } + +void +ParsingObject:: +set_key_values() +{} + +//void +bool +ParsingObject:: parse(istream& in) +{ + // potentially remove the if() and always call initialise_keymap + if (!keymap_is_initialised) + { + initialise_keymap(); + keymap_is_initialised = true; + } + set_key_values(); + if (!parser.parse(in)) + { + warning("Error parsing.\n"); + return false; + } + else if (post_processing()==true) + { + warning("Error post processing keyword values.\n"); + return false; + } + else + return true; +} + + +//void +bool +ParsingObject::parse(const char * const filename) +{ + ifstream hdr_stream(filename); + if (!hdr_stream) + { + error("ParsingObject::parse: couldn't open file %s\n", filename); + return false; + } + return parse(hdr_stream); +} + +void +ParsingObject::ask_parameters() +{ + // potentially remove the if() and always call initialise_keymap + if (!keymap_is_initialised) + { + initialise_keymap(); + keymap_is_initialised = true; + } + // TODO drop next line + set_defaults(); + set_key_values(); + + while(true) + { + parser.ask_parameters(); + + if (post_processing()==true) + { + warning("\nError post processing keyword values. Doing it all over again...\n"); + } + else + return; + } +} + +string +ParsingObject::parameter_info() +{ + if (!keymap_is_initialised) + { + initialise_keymap(); + keymap_is_initialised = true; + } + set_key_values(); + return parser.parameter_info(); +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/PatientPosition.cxx b/src/buildblock/PatientPosition.cxx new file mode 100644 index 0000000000..a95431302e --- /dev/null +++ b/src/buildblock/PatientPosition.cxx @@ -0,0 +1,90 @@ +/* + Copyright (C) 2004 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Implementations of class stir::PatientPosition + + \author Kris Thielemans +*/ + +#include "stir/PatientPosition.h" + +START_NAMESPACE_STIR + +PatientPosition::PatientPosition(PatientPosition::PositionValue position) +{ + switch(position) + { + case FFP: + orientation=feet_in; rotation=prone; break; + case HFP: + orientation=head_in; rotation=prone; break; + case FFS: + orientation=feet_in; rotation=supine; break; + case HFS: + orientation=head_in; rotation=supine; break; + case FFDR: + orientation=feet_in; rotation=right; break; + case HFDR: + orientation=head_in; rotation=right; break; + case FFDL: + orientation=feet_in; rotation=left; break; + case HFDL: + orientation=head_in; rotation=left; break; + case unknown_position: + orientation=unknown_orientation; rotation=unknown_rotation; break; + } +} + +PatientPosition::PositionValue +PatientPosition::get_position() const +{ + // make use of order of enum's + if (orientation<=feet_in && rotation<=left) + { + return static_cast(orientation*4 + rotation); + } + else + { + return unknown_position; + } +} + +const char * const +PatientPosition:: +get_position_as_string() const +{ + switch (this->get_position()) + { + case HFP: return "HFP"; + case HFS: return "HFS"; + case HFDR: return "HFDR"; + case HFDL: return "HFDL"; + case FFDR: return "FFDR"; + case FFDL: return "FFDL"; + case FFP: return "FFP"; + case FFS: return "FFS"; + case unknown_position: + default: + return "unknown"; + } +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/ProjData.cxx b/src/buildblock/ProjData.cxx new file mode 100644 index 0000000000..6cdd58e896 --- /dev/null +++ b/src/buildblock/ProjData.cxx @@ -0,0 +1,361 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2010-10-15, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 -2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + + \brief Implementations for non-inline functions of class stir::ProjData + + \author Kris Thielemans + \author PARAPET project +*/ +#include "stir/ProjData.h" +#include "stir/ExamInfo.h" +#include "stir/Succeeded.h" +#include "stir/RelatedViewgrams.h" +#include "stir/SegmentBySinogram.h" +#include "stir/SegmentByView.h" +#include "stir/Viewgram.h" +#include "stir/DataSymmetriesForViewSegmentNumbers.h" + +#include "stir/utilities.h" // TODO remove (temporary for test GEAdvance) +// for read_from_file +#include "stir/IO/FileSignature.h" +#include "stir/IO/interfile.h" +#include "stir/ProjDataFromStream.h" // needed for converting ProjDataFromStream* to ProjData* + +#ifndef STIR_USE_GE_IO +#include "stir/ProjDataGEAdvance.h" +#else +#include "local/stir/IO/GE/ProjDataVOLPET.h" +#ifdef HAVE_RDF +#include "local/stir/IO/GE/stir_RDF.h" +#include "local/stir/IO/GE/ProjDataRDF.h" +#endif +#endif // STIR_USE_GE_IO +#ifdef HAVE_IE +#include "local/stir/IO/GE/ProjDataIE.h" +#endif +#include "stir/IO/stir_ecat7.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/is_null_ptr.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::istream; +using std::fstream; +using std::ios; +using std::string; +#endif + +START_NAMESPACE_STIR + +/*! + This function will attempt to determine the type of projection data in the file, + construct an object of the appropriate type, and return a pointer to + the object. + + The return value is a shared_ptr, to make sure that the caller will + delete the object. + + If more than 1 projection data set is in the file, only the first is read. + + When the file is not readable for some reason, the program is aborted + by calling error(). + + Currently supported: +
          +
        • GE VOLPET data (via class ProjDataVOLPET) +
        • Interfile (using read_interfile_PDFS()) +
        • ECAT 7 3D sinograms and attenuation files +
        + + Developer's note: ideally the return value would be an auto_ptr. +*/ +shared_ptr +ProjData:: +read_from_file(const string& filename, + const std::ios::openmode openmode) +{ + std::string actual_filename = filename; + // parse filename to see if it's like filename,options + { + const std::size_t comma_pos = filename.find(','); + if (comma_pos != std::string::npos) + { + actual_filename.resize(comma_pos); + } + } + + fstream * input = new fstream(actual_filename.c_str(), openmode | ios::binary); + if (! *input) + error("ProjData::read_from_file: error opening file %s", actual_filename.c_str()); + + const FileSignature file_signature(actual_filename); + const char * signature = file_signature.get_signature(); + + // GE Advance + if (strncmp(signature, "2D3D", 4) == 0) + { +// if (ask("Read with old code (Y) or new (N)?",false)) +#ifndef STIR_USE_GE_IO + { +#ifndef NDEBUG + warning("ProjData::read_from_file trying to read %s as GE Advance file", + filename.c_str()); +#endif + return shared_ptr( new ProjDataGEAdvance(input) ); + } + //else +#else // use VOLPET + { +#ifndef NDEBUG + warning("ProjData::read_from_file trying to read %s as GE VOLPET file", + filename.c_str()); +#endif + delete input;// TODO no longer use pointer after getting rid of ProjDataGEAdvance + return shared_ptr( new GE_IO::ProjDataVOLPET(filename, openmode) ); + } +#endif // STIR_USE_GE_IO to differentiate between Advance and VOLPET code + } + + delete input;// TODO no longer use pointer after getting rid of ProjDataGEAdvance + +#ifdef HAVE_IE + // GE IE file format + if (GE_IO::is_IE_signature(signature)) + { +#ifndef NDEBUG + warning("ProjData::read_from_file trying to read %s as GE IE file", + filename.c_str()); +#endif + return shared_ptr( new GE_IO::ProjDataIE(filename) ); + } +#endif // HAVE_IE + + +#ifdef HAVE_LLN_MATRIX + // ECAT 7 + if (strncmp(signature, "MATRIX", 6) == 0) + { +#ifndef NDEBUG + warning("ProjData::read_from_file trying to read %s as ECAT7", filename.c_str()); +#endif + USING_NAMESPACE_ECAT; + USING_NAMESPACE_ECAT7; + + if (is_ECAT7_emission_file(actual_filename) || is_ECAT7_attenuation_file(actual_filename)) + { + warning("\nReading frame 1, gate 1, data 0, bed 0 from file %s", + actual_filename.c_str()); + shared_ptr proj_data_sptr(ECAT7_to_PDFS(filename, /*frame_num, gate_num, data_num, bed_num*/1,1,0,0)); + return proj_data_sptr; + } + else + { + if (is_ECAT7_file(actual_filename)) + warning("ProjData::read_from_file ECAT7 file %s is of unsupported file type", actual_filename.c_str()); + } + } +#endif // HAVE_LLN_MATRIX + + // Interfile + if (is_interfile_signature(signature)) + { +#ifndef NDEBUG + warning("ProjData::read_from_file trying to read %s as Interfile", filename.c_str()); +#endif + shared_ptr ptr(read_interfile_PDFS(filename, openmode)); + if (!is_null_ptr(ptr)) + return ptr; + } + + +#if defined(STIR_USE_GE_IO) && defined(HAVE_RDF) + if (GE_IO::is_RDF_file(actual_filename)) + { +#ifndef NDEBUG + warning("ProjData::read_from_file trying to read %s as RDF", filename.c_str()); +#endif + shared_ptr ptr(new GE_IO::ProjDataRDF(filename)); + if (!is_null_ptr(ptr)) + return ptr; + } +#endif // RDF + + + error("\nProjData::read_from_file could not read projection data %s.\n" + "Unsupported file format? Aborting.", + filename.c_str()); + // need to return something to satisfy the compiler, but we never get here + shared_ptr null_ptr; + return null_ptr; +} + +void +ProjData::set_exam_info(ExamInfo const& new_exam_info) +{ + this->exam_info_sptr.reset(new ExamInfo(new_exam_info)); +} + + +Viewgram +ProjData::get_empty_viewgram(const int view_num, const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + return + proj_data_info_ptr->get_empty_viewgram(view_num, segment_num, make_num_tangential_poss_odd); +} + +Sinogram +ProjData::get_empty_sinogram(const int ax_pos_num, const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + return + proj_data_info_ptr->get_empty_sinogram(ax_pos_num, segment_num, make_num_tangential_poss_odd); +} + + +SegmentBySinogram +ProjData::get_empty_segment_by_sinogram(const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + return + proj_data_info_ptr->get_empty_segment_by_sinogram(segment_num, make_num_tangential_poss_odd); +} + + +SegmentByView +ProjData::get_empty_segment_by_view(const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + return + proj_data_info_ptr->get_empty_segment_by_view(segment_num, make_num_tangential_poss_odd); + +} + +RelatedViewgrams +ProjData::get_empty_related_viewgrams(const ViewSegmentNumbers& view_segmnet_num, + //const int view_num, const int segment_num, + const shared_ptr& symmetries_used, + const bool make_num_tangential_poss_odd) const +{ + return + proj_data_info_ptr->get_empty_related_viewgrams(view_segmnet_num, symmetries_used, make_num_tangential_poss_odd); +} + + +RelatedViewgrams +ProjData::get_related_viewgrams(const ViewSegmentNumbers& view_segmnet_num, + //const int view_num, const int segment_num, + const shared_ptr& symmetries_used, + const bool make_num_bins_odd) const +{ + vector pairs; + symmetries_used->get_related_view_segment_numbers( + pairs, + ViewSegmentNumbers(view_segmnet_num.view_num(),view_segmnet_num.segment_num()) + ); + + vector > viewgrams; + viewgrams.reserve(pairs.size()); + + for (unsigned int i=0; i(viewgrams, symmetries_used); +} + + +Succeeded +ProjData::set_related_viewgrams( const RelatedViewgrams& viewgrams) +{ + + RelatedViewgrams::const_iterator r_viewgrams_iter = viewgrams.begin(); + while( r_viewgrams_iter!=viewgrams.end()) + { + if (set_viewgram(*r_viewgrams_iter)== Succeeded::no) + return Succeeded::no; + ++r_viewgrams_iter; + } + return Succeeded::yes; +} + +#if 0 + for (int i=0; i ProjData::get_segment_by_sinogram(const int segment_num) const +{ + SegmentBySinogram segment = + proj_data_info_ptr->get_empty_segment_by_sinogram(segment_num,false); + // TODO optimise to get shared proj_data_info_ptr + for (int view_num = get_min_view_num(); view_num <= get_max_view_num(); ++view_num) + segment.set_viewgram(get_viewgram(view_num, segment_num, false)); + + return segment; +} + +SegmentByView ProjData::get_segment_by_view(const int segment_num) const +{ + SegmentByView segment = + proj_data_info_ptr->get_empty_segment_by_view(segment_num,false); + // TODO optimise to get shared proj_data_info_ptr + for (int view_num = get_min_view_num(); view_num <= get_max_view_num(); ++view_num) + segment.set_viewgram(get_viewgram(view_num, segment_num, false)); + + return segment; +} + +Succeeded +ProjData::set_segment(const SegmentBySinogram& segment) +{ + for (int view_num = get_min_view_num(); view_num <= get_max_view_num(); ++view_num) + { + if(set_viewgram(segment.get_viewgram(view_num)) + == Succeeded::no) + return Succeeded::no; + } + return Succeeded::yes; +} + +Succeeded +ProjData::set_segment(const SegmentByView& segment) +{ + for (int view_num = get_min_view_num(); view_num <= get_max_view_num(); ++view_num) + { + if(set_viewgram(segment.get_viewgram(view_num)) + == Succeeded::no) + return Succeeded::no; + } + return Succeeded::yes; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/ProjDataFromStream.cxx b/src/buildblock/ProjDataFromStream.cxx new file mode 100644 index 0000000000..8ada90b67e --- /dev/null +++ b/src/buildblock/ProjDataFromStream.cxx @@ -0,0 +1,1046 @@ +/*! + \file + \ingroup projdata + \brief Implementations for non-inline functions of class stir::ProjDataFromStream + + \author Sanida Mustafovic + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-12-21, Hammersmith Imanet Ltd + Copyright (C) 2011-2012, Kris Thielemans + Copyright (C) 2013, University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ProjDataFromStream.h" +#include "stir/ExamInfo.h" +#include "stir/Succeeded.h" +#include "stir/Viewgram.h" +#include "stir/Sinogram.h" +#include "stir/SegmentBySinogram.h" +#include "stir/SegmentByView.h" +#include "stir/IndexRange2D.h" +#include "stir/IndexRange3D.h" +#include "stir/utilities.h" +#include "stir/IO/interfile.h" +#include "stir/IO/write_data.h" +#include "stir/IO/read_data.h" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::find; +using std::ios; +using std::iostream; +using std::streamoff; +using std::fstream; +using std::cout; +using std::cerr; +using std::endl; +using std::vector; +#endif + +#ifdef _MSC_VER +// work-around for compiler bug: VC messes up std namespace +#define FIND std::find +#else +#define FIND find +#endif + +START_NAMESPACE_STIR +//--------------------------------------------------------- +// constructors +//--------------------------------------------------------- + +ProjDataFromStream::ProjDataFromStream(shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + shared_ptr const& s, const streamoff offs, + const vector& segment_sequence_in_stream_v, + StorageOrder o, + NumericType data_type, + ByteOrder byte_order, + float scale_factor) + + : + ProjData(exam_info_sptr, proj_data_info_ptr), + sino_stream(s), offset(offs), + segment_sequence(segment_sequence_in_stream_v), + storage_order(o), + on_disk_data_type(data_type), + on_disk_byte_order(byte_order), + scale_factor(scale_factor) +{ + assert(storage_order != Unsupported); + assert(!(data_type == NumericType::UNKNOWN_TYPE)); +} + +ProjDataFromStream::ProjDataFromStream(shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + shared_ptr const& s, const streamoff offs, + StorageOrder o, + NumericType data_type, + ByteOrder byte_order, + float scale_factor) + : + ProjData(exam_info_sptr, proj_data_info_ptr), + sino_stream(s), offset(offs), + storage_order(o), + on_disk_data_type(data_type), + on_disk_byte_order(byte_order), + scale_factor(scale_factor) +{ + assert(storage_order != Unsupported); + assert(!(data_type == NumericType::UNKNOWN_TYPE)); + + segment_sequence.resize(proj_data_info_ptr->get_num_segments()); + + int segment_num, i; + for (i= 0, segment_num = proj_data_info_ptr->get_min_segment_num(); + segment_num<=proj_data_info_ptr->get_max_segment_num(); + ++i, ++segment_num) + { + segment_sequence[i] =segment_num; + } +} + +Viewgram +ProjDataFromStream::get_viewgram(const int view_num, const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + if (sino_stream == 0) + { + error("ProjDataFromStream::get_viewgram: stream ptr is 0\n"); + } + if (! *sino_stream) + { + error("ProjDataFromStream::get_viewgram: error in stream state before reading\n"); + } + + vector offsets = get_offsets(view_num,segment_num); + + const streamoff segment_offset = offsets[0]; + const streamoff beg_view_offset = offsets[1]; + const streamoff intra_views_offset = offsets[2]; + + sino_stream->seekg(segment_offset, ios::beg); // start of segment + sino_stream->seekg(beg_view_offset, ios::cur); // start of view within segment + + if (! *sino_stream) + { + error("ProjDataFromStream::get_viewgram: error after seekg\n"); + } + + Viewgram viewgram(proj_data_info_ptr, view_num, segment_num); + float scale = float(1); + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + { + for (int ax_pos_num = get_min_axial_pos_num(segment_num); ax_pos_num <= get_max_axial_pos_num(segment_num); ax_pos_num++) + { + + if (read_data(*sino_stream, viewgram[ax_pos_num], on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no) + error("ProjDataFromStream: error reading data\n"); + if(scale != 1) + error("ProjDataFromStream: error reading data: scale factor returned by read_data should be 1\n"); + // seek to next line unless it was the last we need to read + if(ax_pos_num != get_max_axial_pos_num(segment_num)) + sino_stream->seekg(intra_views_offset, ios::cur); + } + } + + + else if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + if(read_data(*sino_stream, viewgram, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no) + error("ProjDataFromStream: error reading data\n"); + if(scale != 1) + error("ProjDataFromStream: error reading data: scale factor returned by read_data should be 1\n"); + } + + viewgram *= scale_factor; + + if (make_num_tangential_poss_odd &&(get_num_tangential_poss()%2==0)) + { + const int new_max_tangential_pos = get_max_tangential_pos_num() + 1; + + viewgram.grow( + IndexRange2D(get_min_axial_pos_num(segment_num), + get_max_axial_pos_num(segment_num), + + get_min_tangential_pos_num(), + new_max_tangential_pos)); + } + + return viewgram; +} + +vector +ProjDataFromStream::get_offsets(const int view_num, const int segment_num) const + +{ + if (!(segment_num >= get_min_segment_num() && + segment_num <= get_max_segment_num())) + error("ProjDataFromStream::get_offsets: segment_num out of range : %d", segment_num); + + if (!(view_num >= get_min_view_num() && + view_num <= get_max_view_num())) + error("ProjDataFromStream::get_offsets: view_num out of range : %d", view_num); + + + // cout<<"get_offsets"<(FIND(segment_sequence.begin(), segment_sequence.end(), segment_num) - + segment_sequence.begin()); + + streamoff num_axial_pos_offset = 0; + for (int i=0; i(num_axial_pos_offset* + get_num_tangential_poss() * + get_num_views() * + on_disk_data_type.size_in_bytes()); + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + { + + + const streamoff beg_view_offset = + (view_num - get_min_view_num()) *get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + + const streamoff intra_views_offset = + (get_num_views() -1) *get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + vector temp(3); + temp[0] = segment_offset; + temp[1] = beg_view_offset; + temp[2] = intra_views_offset; + + return temp; + } + else //if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + const streamoff beg_view_offset = + (view_num - get_min_view_num()) + * get_num_axial_poss(segment_num) + * get_num_tangential_poss() + * on_disk_data_type.size_in_bytes(); + + + vector temp(3); + temp[0] =segment_offset; + temp[1]= beg_view_offset; + temp[2] = 0; + return temp; + + } +} + +Succeeded +ProjDataFromStream::set_viewgram(const Viewgram& v) +{ + if (sino_stream == 0) + { + warning("ProjDataFromStream::set_viewgram: stream ptr is 0\n"); + return Succeeded::no; + } + if (! *sino_stream) + { + warning("ProjDataFromStream::set_viewgram: error in stream state before writing\n"); + return Succeeded::no; + } + + // KT 03/07/2001 modified handling of scale_factor etc. + if (on_disk_data_type.id != NumericType::FLOAT) + { + warning("ProjDataFromStream::set_viewgram: non-float output uses original " + "scale factor %g which might not be appropriate for the current data\n", + scale_factor); + } + + if (get_num_tangential_poss() != v.get_proj_data_info_ptr()->get_num_tangential_poss()) + { + warning("ProjDataFromStream::set_viewgram: num_bins is not correct\n"); + return Succeeded::no; + } + + if (get_num_axial_poss(v.get_segment_num()) != v.get_num_axial_poss()) + { + warning("ProjDataFromStream::set_viewgram: number of axial positions is not correct\n"); + return Succeeded::no; + } + + + + if (*get_proj_data_info_ptr() != *(v.get_proj_data_info_ptr())) + { + warning("ProjDataFromStream::set_viewgram: viewgram has incompatible ProjDataInfo member\n" + "Original ProjDataInfo: %s\n" + "ProjDataInfo From viewgram: %s", + this->get_proj_data_info_ptr()->parameter_info().c_str(), + v.get_proj_data_info_ptr()->parameter_info().c_str() + ); + + return Succeeded::no; + } + int segment_num = v.get_segment_num(); + int view_num = v.get_view_num(); + + + vector offsets = get_offsets(view_num,segment_num); + const streamoff segment_offset = offsets[0]; + const streamoff beg_view_offset = offsets[1]; + const streamoff intra_views_offset = offsets[2]; + + sino_stream->seekp(segment_offset, ios::beg); // start of segment + sino_stream->seekp(beg_view_offset, ios::cur); // start of view within segment + + if (! *sino_stream) + { + warning("ProjDataFromStream::set_viewgram: error after seekg\n"); + return Succeeded::no; + } + float scale = scale_factor; + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + { + for (int ax_pos_num = get_min_axial_pos_num(segment_num); ax_pos_num <= get_max_axial_pos_num(segment_num); ax_pos_num++) + { + + if (write_data(*sino_stream, v[ax_pos_num], on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no + || scale != scale_factor) + { + warning("ProjDataFromStream::set_viewgram: viewgram (view=%d, segment=%d)" + " corrupted due to problems with writing or the scale factor \n", + view_num, segment_num); + return Succeeded::no; + } + // seek to next line unless it was the last we need to read + if(ax_pos_num != get_max_axial_pos_num(segment_num)) + sino_stream->seekp(intra_views_offset, ios::cur); + } + return Succeeded::yes; + } + else if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + if (write_data(*sino_stream, v, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no + || scale != scale_factor) + { + warning("ProjDataFromStream::set_viewgram: viewgram (view=%d, segment=%d)" + " corrupted due to problems with writing or the scale factor \n", + view_num, segment_num); + return Succeeded::no; + } + return Succeeded::yes; + } + else + { + warning("ProjDataFromStream::set_viewgram: unsupported storage order\n"); + return Succeeded::no; + } +} + + + + +// get offsets for the sino data +vector +ProjDataFromStream::get_offsets_sino(const int ax_pos_num, const int segment_num) const +{ + if (!(segment_num >= get_min_segment_num() && + segment_num <= get_max_segment_num())) + error("ProjDataFromStream::get_offsets: segment_num out of range : %d", segment_num); + + if (!(ax_pos_num >= get_min_axial_pos_num(segment_num) && + ax_pos_num <= get_max_axial_pos_num(segment_num))) + error("ProjDataFromStream::get_offsets: axial_pos_num out of range : %d", ax_pos_num); + + const int index = + static_cast(FIND(segment_sequence.begin(), segment_sequence.end(), segment_num) - + segment_sequence.begin()); + + + streamoff num_axial_pos_offset = 0; + for (int i=0; i(num_axial_pos_offset* + get_num_tangential_poss() * + get_num_views() * + on_disk_data_type.size_in_bytes()); + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + { + + const streamoff beg_ax_pos_offset = + (ax_pos_num - get_min_axial_pos_num(segment_num))* + get_num_views() * + get_num_tangential_poss()* + on_disk_data_type.size_in_bytes(); + + vector temp(3); + temp[0] = segment_offset; + temp[1] = beg_ax_pos_offset; + temp[2] = 0; + + return temp; + } + else //if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + + + const streamoff beg_ax_pos_offset = + (ax_pos_num - get_min_axial_pos_num(segment_num)) *get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + + const streamoff intra_ax_pos_offset = + (get_num_axial_poss(segment_num) -1) *get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + + + vector temp(3); + temp[0] =segment_offset; + temp[1]= beg_ax_pos_offset; + temp[2] =intra_ax_pos_offset; + return temp; + + } +} + +Sinogram +ProjDataFromStream::get_sinogram(const int ax_pos_num, const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + if (sino_stream == 0) + { + error("ProjDataFromStream::get_sinogram: stream ptr is 0\n"); + } + if (! *sino_stream) + { + error("ProjDataFromStream::get_sinogram: error in stream state before reading\n"); + } + + // Call the get_offset to calculate the offsets, e.g + // segment offset + view_offset + intra_view_offsets + vector offsets = get_offsets_sino(ax_pos_num,segment_num); + + const streamoff segment_offset = offsets[0]; + const streamoff beg_ax_pos_offset = offsets[1]; + const streamoff intra_ax_pos_offset = offsets[2]; + + sino_stream->seekg(segment_offset, ios::beg); // start of segment + sino_stream->seekg(beg_ax_pos_offset, ios::cur); // start of view within segment + + if (! *sino_stream) + { + error("ProjDataFromStream::get_sinogram: error after seekg\n"); + } + + Sinogram sinogram(proj_data_info_ptr, ax_pos_num, segment_num); + float scale = float(1); + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + { + if(read_data(*sino_stream, sinogram, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no) + error("ProjDataFromStream: error reading data\n"); + if(scale != 1) + error("ProjDataFromStream: error reading data: scale factor returned by read_data should be 1\n"); + } + + + else if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + for (int view = get_min_view_num(); view <= get_max_view_num(); view++) + { + if (read_data(*sino_stream, sinogram[view], on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no) + error("ProjDataFromStream: error reading data\n"); + if(scale != 1) + error("ProjDataFromStream: error reading data: scale factor returned by read_data should be 1\n"); + // seek to next line unless it was the last we need to read + if(view != get_max_view_num()) + sino_stream->seekg(intra_ax_pos_offset, ios::cur); + } + } + sinogram *= scale_factor; + + if (make_num_tangential_poss_odd&&(get_num_tangential_poss()%2==0)) + { + int new_max_tangential_pos = get_max_tangential_pos_num() + 1; + + sinogram.grow(IndexRange2D(get_min_view_num(), + get_max_view_num(), + get_min_tangential_pos_num(), + new_max_tangential_pos)); + } + + return sinogram; + + +} + +Succeeded +ProjDataFromStream::set_sinogram(const Sinogram& s) +{ + if (sino_stream == 0) + { + warning("ProjDataFromStream::set_sinogram: stream ptr is 0\n"); + return Succeeded::no; + } + if (! *sino_stream) + { + warning("ProjDataFromStream::set_sinogram: error in stream state before writing\n"); + return Succeeded::no; + } + // KT 03/07/2001 modified handling of scale_factor etc. + if (on_disk_data_type.id != NumericType::FLOAT) + { + warning("ProjDataFromStream::set_sinogram: non-float output uses original " + "scale factor %g which might not be appropriate for the current data\n", + scale_factor); + } + + if (*get_proj_data_info_ptr() != *(s.get_proj_data_info_ptr())) + { + warning("ProjDataFromStream::set_sinogram: Sinogram has incompatible ProjDataInfo member.\n" + "Original ProjDataInfo: %s\n" + "ProjDataInfo from sinogram: %s", + this->get_proj_data_info_ptr()->parameter_info().c_str(), + s.get_proj_data_info_ptr()->parameter_info().c_str() + ); + + return Succeeded::no; + } + int segment_num = s.get_segment_num(); + int ax_pos_num = s.get_axial_pos_num(); + + + vector offsets = get_offsets_sino(ax_pos_num,segment_num); + const streamoff segment_offset = offsets[0]; + const streamoff beg_ax_pos_offset = offsets[1]; + const streamoff intra_ax_pos_offset = offsets[2]; + + sino_stream->seekp(segment_offset, ios::beg); // start of segment + sino_stream->seekp(beg_ax_pos_offset, ios::cur); // start of view within segment + + if (! *sino_stream) + { + warning("ProjDataFromStream::set_sinogram: error after seekg\n"); + return Succeeded::no; + } + float scale = scale_factor; + + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + + { + if (write_data(*sino_stream, s, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no + || scale != scale_factor) + { + warning("ProjDataFromStream::set_sinogram: sinogram (ax_pos=%d, segment=%d)" + " corrupted due to problems with writing or the scale factor \n", + ax_pos_num, segment_num); + return Succeeded::no; + } + + return Succeeded::yes; + } + + else if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + for (int view = get_min_view_num();view <= get_max_view_num(); view++) + { + if (write_data(*sino_stream, s[view], on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no + || scale != scale_factor) + { + warning("ProjDataFromStream::set_sinogram: sinogram (ax_pos=%d, segment=%d)" + " corrupted due to problems with writing or the scale factor \n", + ax_pos_num, segment_num); + return Succeeded::no; + } + // seek to next line unless it was the last we need to read + if(view != get_max_view_num()) + sino_stream->seekp(intra_ax_pos_offset, ios::cur); + } + return Succeeded::yes; + } + else + { + warning("ProjDataFromStream::set_sinogram: unsupported storage order\n"); + return Succeeded::no; + } + } + +streamoff +ProjDataFromStream::get_offset_segment(const int segment_num) const +{ + assert(segment_num >= get_min_segment_num() && + segment_num <= get_max_segment_num()); + { + const int index = + static_cast(FIND(segment_sequence.begin(), segment_sequence.end(), segment_num) - + segment_sequence.begin()); + + streamoff num_axial_pos_offset = 0; + for (int i=0; i No need for get_offset_segment + +SegmentBySinogram +ProjDataFromStream::get_segment_by_sinogram(const int segment_num) const +{ + if(sino_stream == 0) + { + error("ProjDataFromStream::get_segment_by_sinogram: stream ptr is 0\n"); + } + if (! *sino_stream) + { + error("ProjDataFromStream::get_segment_by_sinogram: error in stream state before reading\n"); + } + + streamoff segment_offset = get_offset_segment(segment_num); + sino_stream->seekg(segment_offset, ios::beg); + if (! *sino_stream) + { + error("ProjDataFromStream::get_segment_by_sinogram: error after seekg\n"); + } + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + { + SegmentBySinogram segment(proj_data_info_ptr,segment_num); + { + float scale = float(1); + if(read_data(*sino_stream, segment, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no) + error("ProjDataFromStream: error reading data\n"); + if(scale != 1) + error("ProjDataFromStream: error reading data: scale factor returned by read_data should be 1\n"); + } + + segment *= scale_factor; + + return segment; + + } + else + { + // TODO rewrite in terms of get_viewgram + return SegmentBySinogram (get_segment_by_view(segment_num)); + } + + +} + +SegmentByView +ProjDataFromStream::get_segment_by_view(const int segment_num) const +{ + + if(sino_stream == 0) + { + error("ProjDataFromStream::get_segment_by_view: stream ptr is 0\n"); + } + if (! *sino_stream) + { + error("ProjDataFromStream::get_segment_by_view: error in stream state before reading\n"); + } + + if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + + streamoff segment_offset = get_offset_segment(segment_num); + sino_stream->seekg(segment_offset, ios::beg); + + if (! *sino_stream) + { + error("ProjDataFromStream::get_segment_by_sinogram: error after seekg\n"); + } + + SegmentByView segment(proj_data_info_ptr,segment_num); + + { + float scale = float(1); + if(read_data(*sino_stream, segment, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no) + error("ProjDataFromStream: error reading data\n"); + if(scale != 1) + error("ProjDataFromStream: error reading data: scale factor returned by read_data should be 1\n"); + } + + segment *= scale_factor; + + return segment; + } + else + // TODO rewrite in terms of get_sinogram as this doubles memory temporarily + return SegmentByView (get_segment_by_sinogram(segment_num)); +} + +Succeeded +ProjDataFromStream::set_segment(const SegmentBySinogram& segmentbysinogram_v) +{ + if(sino_stream == 0) + { + error("ProjDataFromStream::set_segment: stream ptr is 0\n"); + } + if (! *sino_stream) + { + error("ProjDataFromStream::set_segment: error in stream state before writing\n"); + } + + if (get_num_tangential_poss() != segmentbysinogram_v.get_num_tangential_poss()) + { + warning("ProjDataFromStream::set_segmen: num_bins is not correct\n"); + return Succeeded::no; + } + if (get_num_views() != segmentbysinogram_v.get_num_views()) + { + warning("ProjDataFromStream::set_segment: num_views is not correct\n"); + return Succeeded::no; + } + + int segment_num = segmentbysinogram_v.get_segment_num(); + streamoff segment_offset = get_offset_segment(segment_num); + + sino_stream->seekp(segment_offset,ios::beg); + + if (! *sino_stream) + { + warning("ProjDataFromStream::set_segment: error after seekp\n"); + return Succeeded::no; + } + + if (get_storage_order() == Segment_AxialPos_View_TangPos) + { + // KT 03/07/2001 handle scale_factor appropriately + if (on_disk_data_type.id != NumericType::FLOAT) + { + warning("ProjDataFromStream::set_segment: non-float output uses original " + "scale factor %g which might not be appropriate for the current data\n", + scale_factor); + } + float scale = scale_factor; + if (write_data(*sino_stream, segmentbysinogram_v, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no + || scale != scale_factor) + { + warning("ProjDataFromStream::set_segment: segment (%d)" + " corrupted due to problems with writing or the scale factor \n", + segment_num); + return Succeeded::no; + } + + return Succeeded::yes; + } + else + { + // TODO rewrite in terms of set_viewgram + const SegmentByView segmentbyview= + SegmentByView(segmentbysinogram_v); + + set_segment(segmentbyview); + return Succeeded::yes; + } + +} + +Succeeded +ProjDataFromStream::set_segment(const SegmentByView& segmentbyview_v) +{ + if(sino_stream == 0) + { + error("ProjDataFromStream::set_segment: stream ptr is 0\n"); + } + if (! *sino_stream) + { + error("ProjDataFromStream::set_segment: error in stream state before writing\n"); + } + + + if (get_num_tangential_poss() != segmentbyview_v.get_num_tangential_poss()) + { + warning("ProjDataFromStream::set_segment: num_bins is not correct\n"); + return Succeeded::no; + } + if (get_num_views() != segmentbyview_v.get_num_views()) + { + warning("ProjDataFromStream::set_segment: num_views is not correct\n"); + return Succeeded::no; + } + + int segment_num = segmentbyview_v.get_segment_num(); + streamoff segment_offset = get_offset_segment(segment_num); + + sino_stream->seekp(segment_offset,ios::beg); + + if (! *sino_stream) + { + warning("ProjDataFromStream::set_segment: error after seekp"); + return Succeeded::no; + } + + if (get_storage_order() == Segment_View_AxialPos_TangPos) + { + // KT 03/07/2001 handle scale_factor appropriately + if (on_disk_data_type.id != NumericType::FLOAT) + { + warning("ProjDataFromStream::set_segment: non-float output uses original " + "scale factor %g which might not be appropriate for the current data\n", + scale_factor); + } + float scale = scale_factor; + if (write_data(*sino_stream, segmentbyview_v, on_disk_data_type, scale, on_disk_byte_order) + == Succeeded::no + || scale != scale_factor) + { + warning("ProjDataFromStream::set_segment: segment (%d)" + " corrupted due to problems with writing or the scale factor \n", + segment_num); + return Succeeded::no; + } + + return Succeeded::yes; + } + else + { + // TODO rewrite in terms of set_sinogram + const SegmentBySinogram segmentbysinogram = + SegmentBySinogram(segmentbyview_v); + set_segment(segmentbysinogram); + return Succeeded::yes; + } + +} + + +#if 0 +ProjDataFromStream* ProjDataFromStream::ask_parameters(const bool on_disk) +{ + + shared_ptr p_in_stream; + + + char filename[256]; + + ask_filename_with_extension( + filename, + "Enter file name of 3D sinogram data : ", ".scn"); + + + // KT 03/07/2001 initialise to avoid compiler warnings + ios::openmode open_mode=ios::in; + switch(ask_num("Read (1), Create and write(2), Read/Write (3) : ", 1,3,1)) + { + case 1: open_mode=ios::in; break; + case 2: open_mode=ios::out; break; + case 3: open_mode=ios::in | ios::out; break; + } + + if (on_disk) + { + + //fstream * p_fstream = new fstream; + p_in_stream.reset(new fstream (filename, open_mode | ios::binary)); + if (!p_in_stream->good()) + { + error("ProjDataFromStream::ask_parameters: error opening file %s\n",filename); + } + //open_read_binary(*p_fstream, filename); + //p_in_stream = p_fstream; + } + else + { + streamsize file_size = 0; + char *memory = 0; + { + fstream input; + open_read_binary(input, filename); + memory = (char *)read_stream_in_memory(input, file_size); + } + +#ifdef BOOST_NO_STRINGSTREAM + // This is the old implementation of the strstream class. + // The next constructor should work according to the doc, but it doesn't in gcc 2.8.1. + //strstream in_stream(memory, file_size, ios::in | ios::binary); + // Reason: in_stream contains an internal strstreambuf which is + // initialised as buffer(memory, file_size, memory), which prevents + // reading from it. + + strstreambuf * buffer = new strstreambuf(memory, file_size, memory+file_size); + p_in_stream.reset(new iostream(buffer)); +#else + // TODO this does allocate and copy 2 times + // TODO file_size could be longer than what size_t allows, but string doesn't take anything longer + p_in_stream.reset(new std::stringstream (string(memory, std::size_t(file_size)), + open_mode | ios::binary)); + + delete[] memory; +#endif + + } // else 'on_disk' + + + // KT 03/07/2001 initialise to avoid compiler warnings + ProjDataFromStream::StorageOrder storage_order = + Segment_AxialPos_View_TangPos; + { + int data_org = ask_num("Type of data organisation:\n\ + 0: Segment_AxialPos_View_TangPos, 1: Segment_View_AxialPos_TangPos", + 0, + 1,0); + + switch (data_org) + { + case 0: + storage_order = ProjDataFromStream::Segment_AxialPos_View_TangPos; + break; + case 1: + storage_order =ProjDataFromStream::Segment_View_AxialPos_TangPos; + break; + } + } + + NumericType data_type; + { + int data_type_sel = ask_num("Type of data :\n\ + 0: signed 16bit int, 1: unsigned 16bit int, 2: 4bit float ", 0,2,2); + switch (data_type_sel) + { + case 0: + data_type = NumericType::SHORT; + break; + case 1: + data_type = NumericType::USHORT; + break; + case 2: + data_type = NumericType::FLOAT; + break; + } + } + + + ByteOrder byte_order; + { + byte_order = + ask("Little endian byte order ?", + ByteOrder::get_native_order() == ByteOrder::little_endian) ? + ByteOrder::little_endian : + ByteOrder::big_endian; + } + + std::streamoff offset_in_file ; + { + // find file size + p_in_stream->seekg(static_cast(0), ios::beg); + streamsize file_size = find_remaining_size(*p_in_stream); + + offset_in_file = ask_num("Offset in file (in bytes)", + static_cast(0), + static_cast(file_size), + static_cast(0)); + } + float scale_factor =1; + + shared_ptr data_info_ptr(ProjDataInfo::ask_parameters()); + + vector segment_sequence_in_stream; + segment_sequence_in_stream = vector(data_info_ptr->get_num_segments()); + segment_sequence_in_stream[0] = 0; + + for (int i=1; i<= data_info_ptr->get_num_segments()/2; i++) + { + segment_sequence_in_stream[2*i-1] = i; + segment_sequence_in_stream[2*i] = -i; + } + + + cerr << "Segment sequence :"; + for (unsigned int i=0; i +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +using std::ios; +using std::accumulate; +using std::find; +#endif + +START_NAMESPACE_STIR + +ProjDataGEAdvance::ProjDataGEAdvance(iostream* s) + : + sino_stream(s), + offset(0), + on_disk_data_type(NumericType::SHORT), + on_disk_byte_order(ByteOrder::big_endian) +{ + // TODO find from file + const int max_delta = 11; + shared_ptr scanner_sptr(new Scanner(Scanner::Advance)); + proj_data_info_ptr.reset( + ProjDataInfo::ProjDataInfoGE(scanner_sptr, max_delta, + scanner_sptr->get_max_num_views(), + scanner_sptr->get_default_num_arccorrected_bins())); + + + const int min_view = proj_data_info_ptr->get_min_view_num(); + const int max_view = proj_data_info_ptr->get_max_view_num(); + view_scaling_factor.grow(min_view, max_view); + + const int offset_begin = 256; + sino_stream->seekg(offset, ios::beg); // overall offset + sino_stream->seekg(offset_begin, ios::cur); // "breakfile" offset + + // reads the views_scaling_factors + { + float scale = float(1); + // KT 18/10/99 added on_disk_byte_order + if (read_data(*sino_stream, view_scaling_factor, + NumericType::FLOAT, + scale, + on_disk_byte_order) == Succeeded::no + || scale != 1) + error("ProjDataGEAdvance: error reading scale factors from header\n"); + + // for ( int k=min_view ; k <= max_view ; k++) + // { + // cout << "view_scaling_factor[" << k << "] = " + // << view_scaling_factor[k] << endl; + // } + } + + //============================================================= + // parameters as in the unsorted case (help to access the file) + //============================================================= + //------------------------------------------------------------- + // WARNING: this construction works only with odd max_delta + //------------------------------------------------------------- + + int num_segments_orig = proj_data_info_ptr->get_max_segment_num()+1; + //(int) get_max_average_ring_difference(); + + num_rings_orig.resize(num_segments_orig); + segment_sequence_orig.resize(num_segments_orig); + + + const int num_rings = proj_data_info_ptr->get_scanner_ptr()->get_num_rings(); + num_rings_orig[0]=(2*num_rings-1); + + { + for (unsigned int i=1; i<= num_rings_orig.size()/2; i++) + { + num_rings_orig[2*i-1]=(2*num_rings-1) - 4*i; + num_rings_orig[2*i]=(2*num_rings-1) - 4*i; + // cout << "num_rings_orig[" << 2*i-1 << "] = " << num_rings_orig[2*i-1] << endl; + // cout << "num_rings_orig[" << 2*i << "] = " << num_rings_orig[2*i] << endl; + } + } + + + + // segment sequence in the unsorted data format + + segment_sequence_orig[0]=0; + + { + for (unsigned int i=1; i<= segment_sequence_orig.size()/2; i++) + { + segment_sequence_orig[2*i-1] = static_cast(i); + segment_sequence_orig[2*i] = -static_cast(i); + // cout << "segment_sequence_orig[" << 2*i-1 << "] = " << segment_sequence_orig[2*i-1] << endl; + // cout << "segment_sequence_orig[" << 2*i << "] = " << segment_sequence_orig[2*i] << endl; + } + } + +} + +Viewgram +ProjDataGEAdvance:: +get_viewgram(const int view_num, const int segment_num, + const bool make_num_tangential_poss_odd) const + { + // -------------------------------------------------------- + // -------------------------------------------------------- + // Advance GE format reader with sort of the segments + // -------------------------------------------------------- + // -------------------------------------------------------- + // + // segment_num 0 +1 -1 +2 -2 +3 -3 ....... + // ave_ring_diff 0 +2 -2 +3 -3 +4 -4 ....... + // max_ring_diff +1 +2 -2 +3 -3 +4 -4 ....... + // min_ring_diff -1 +2 -2 +3 -3 +4 -4 ....... + + + streamoff odd_ring_segment_offset; + streamoff num_rings_offset; + streamoff segment_offset; + streamoff jump_size; + streamoff jump_ring; + + + //---------------------------------------------------------------- + // data with delta ring = +1 and -1 are contained in segment 0: + // for this reason there is not a segment +1 and a segment -1 + //---------------------------------------------------------------- + + // segment number in the unsorted data format + // (no problem for segments +1 and -1) + + const int sign_segment_num = (segment_num == 0) ? 0 : ( (segment_num > 0) ? 1 : -1 ); + const int segment_num_orig = (int) ((segment_num+sign_segment_num) / 2); + + // cout << "segment_num_orig " << segment_num_orig << endl; + + // segment index in the unsorted data format + + const int index_orig = + static_cast(find(segment_sequence_orig.begin(), + segment_sequence_orig.end(), segment_num_orig) - + segment_sequence_orig.begin()); + + // cout << "index_orig " << index_orig << endl; + + + //--------------------------------------------------------------- + // OFFSETS + //--------------------------------------------------------------- + + const streamoff offset_begin = 256; + + // offset in rings for the odd sorted segments (value 0 or 1) + + odd_ring_segment_offset = abs((segment_num+sign_segment_num) % 2); + + // cout << "odd_ring_segment_offset " << odd_ring_segment_offset << endl; + + // offset in rings in the unsorted data format + + num_rings_offset = + accumulate(num_rings_orig.begin(), + num_rings_orig.begin() + index_orig, 0) + + odd_ring_segment_offset; + + // cout << "num_rings_offset " << num_rings_offset << endl; + + // offset to the first data in the first view_num of the segment chosen + + segment_offset = + num_rings_offset * get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + + // cout << "segment_offset " << segment_offset << endl; + + // size of the jump to the first record of the following view_num + if (segment_num == 0) + { + jump_size = + ( + accumulate(num_rings_orig.begin(), num_rings_orig.end(), 0) + - num_rings_orig[index_orig] + + + 2 * odd_ring_segment_offset + ) * get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + } + else + { + jump_size = + ( + accumulate(num_rings_orig.begin(), num_rings_orig.end(), 0) + - num_rings_orig[index_orig] + - 1 // offset to balance the jump_ring in the cycle + + 2 * odd_ring_segment_offset + ) * get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + } + // cout << "jump_size " << jump_size << endl; + + // size of the jump between two rings of the same view_num and of the same + // segment + if (segment_num == 0) + jump_ring = 0; + else + jump_ring = get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + + streamoff ring_offset = get_num_tangential_poss() * on_disk_data_type.size_in_bytes(); + + // jumps the initial offset + + sino_stream->seekg(offset, ios::beg); // overall offset + sino_stream->seekg(offset_begin, ios::cur); // "breakfile" offset + sino_stream->seekg(get_num_views() * sizeof(float), ios::cur); // skip view scaling factors + + // jumps at the beginning of the chosen segment + + sino_stream->seekg(segment_offset, ios::cur); + + // jump to the right Viewgram + + streamoff jump_ini = (view_num - get_min_view_num())* + (ring_offset*get_num_axial_poss(segment_num) + + jump_ring*get_num_axial_poss(segment_num) + + jump_size); + + // cout << "ring_offset " << ring_offset << endl; + // cout << "jump_ring " << jump_ring << endl; + // cout << "jump_size " << jump_size << endl; + // cout << " jump_ini " << jump_ini << endl; + + sino_stream->seekg(jump_ini, ios::cur); + + Viewgram data = get_empty_viewgram(view_num, segment_num,false); + + for (int ring =get_min_axial_pos_num(segment_num) ; ring <= get_max_axial_pos_num(segment_num); ring++) + { + { + float scale = float(1); + if (read_data(*sino_stream, data[ring], + on_disk_data_type, + scale, + on_disk_byte_order) == Succeeded::no + || scale != 1) + error("ProjDataGEAdvance: error reading data\n"); + } + sino_stream->seekg(jump_ring, ios::cur); + } + + // scales the Viewgram + data *= view_scaling_factor[view_num]; + + if (make_num_tangential_poss_odd && get_num_tangential_poss()%2==0) + { + const int new_max_tangential_pos = get_max_tangential_pos_num() + 1; + data.grow( + IndexRange2D(get_min_axial_pos_num(segment_num), + get_max_axial_pos_num(segment_num), + get_min_tangential_pos_num(), + new_max_tangential_pos)); + } + + return data; +} + + +Succeeded ProjDataGEAdvance::set_viewgram(const Viewgram& v) +{ + // TODO + // but this is difficult: how to adjust the scale factors when writing only 1 viewgram ? + warning("ProjDataGEAdvance::set_viewgram not implemented yet\n"); + return Succeeded::no; +} + +Sinogram ProjDataGEAdvance::get_sinogram(const int ax_pos_num, const int segment_num,const bool make_num_tangential_poss_odd) const +{ + // TODO + error("ProjDataGEAdvance::get_sinogram not implemented yet\n"); + return get_empty_sinogram(ax_pos_num, segment_num);} + +Succeeded ProjDataGEAdvance::set_sinogram(const Sinogram& s) +{ + // TODO + warning("ProjDataGEAdvance::set_sinogram not implemented yet\n"); + return Succeeded::no; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/ProjDataInMemory.cxx b/src/buildblock/ProjDataInMemory.cxx new file mode 100644 index 0000000000..40d094db0e --- /dev/null +++ b/src/buildblock/ProjDataInMemory.cxx @@ -0,0 +1,165 @@ +/*! + + \file + \ingroup projdata + \brief Implementations for non-inline functions of class stir::ProjDataInMemory + + \author Kris Thielemans +*/ +/* + Copyright (C) 2002 - 2011-02-23, Hammersmith Imanet Ltd + Copyright (C) 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/ProjDataInMemory.h" +#include "stir/shared_ptr.h" +#include "stir/Succeeded.h" +#include "stir/SegmentByView.h" +#include "stir/ProjDataInterfile.h" +#include "stir/Bin.h" +#include + + +#ifdef STIR_USE_OLD_STRSTREAM +#include +#else +#include +#endif + +#ifndef STIR_NO_NAMESPACES +using std::fstream; +using std::iostream; +using std::ios; +using std::strstream; +#endif + +START_NAMESPACE_STIR + +ProjDataInMemory:: +~ProjDataInMemory() +{} + +ProjDataInMemory:: +ProjDataInMemory(shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, const bool initialise_with_0) + : + ProjDataFromStream(exam_info_sptr, proj_data_info_ptr, shared_ptr()) // trick: first initialise sino_stream_ptr to 0 +{ + +#ifdef STIR_USE_OLD_STRSTREAM + const size_t buffer_size = get_size_of_buffer(); + //buffer = auto_ptr(new char[buffer_size]); + buffer.reset(new char[buffer_size]); + sino_stream.reset(new strstream(buffer.get(), buffer_size, ios::in | ios::out | ios::binary)); +#else + // it would be advantageous to preallocate memory as well + // the only way to do this is by passing a string of the appropriate size + // However, if basic_string doesn't do reference counting, we would have + // temporarily 2 strings of a (potentially large) size in memory. + // todo? + sino_stream.reset(new std::stringstream(ios::in | ios::out | ios::binary)); +#endif + + if (!*sino_stream) + error("ProjDataInMemory error initialising stream\n"); + + if (initialise_with_0) + { + for (int segment_num = proj_data_info_ptr->get_min_segment_num(); + segment_num <= proj_data_info_ptr->get_max_segment_num(); + ++segment_num) + set_segment(proj_data_info_ptr->get_empty_segment_by_view(segment_num)); + } +} + +ProjDataInMemory:: +ProjDataInMemory(const ProjData& proj_data) + : ProjDataFromStream(proj_data.get_exam_info_sptr(), + proj_data.get_proj_data_info_ptr()->create_shared_clone(), shared_ptr()) +{ +#ifdef STIR_USE_OLD_STRSTREAM + const size_t buffer_size = get_size_of_buffer(); + //buffer = auto_ptr(new char[buffer_size]); + buffer.reset(new char[buffer_size]); + sino_stream.reset(new strstream(buffer.get(), buffer_size, ios::in | ios::out | ios::binary)); +#else + // it would be advantageous to preallocate memory as well + // the only way to do this is by passing a string of the appropriate size + // However, if basic_string doesn't do reference counting, we would have + // temporarily 2 strings of a (potentially large) size in memory. + // todo? + sino_stream.reset(new std::stringstream(ios::in | ios::out | ios::binary)); +#endif + + if (!*sino_stream) + error("ProjDataInMemory error initialising stream\n"); + + // copy data + for (int segment_num = proj_data_info_ptr->get_min_segment_num(); + segment_num <= proj_data_info_ptr->get_max_segment_num(); + ++segment_num) + set_segment(proj_data.get_segment_by_view(segment_num)); +} + +size_t +ProjDataInMemory:: +get_size_of_buffer() const +{ + size_t num_sinograms = 0; + for (int segment_num = proj_data_info_ptr->get_min_segment_num(); + segment_num <= proj_data_info_ptr->get_max_segment_num(); + ++segment_num) + num_sinograms += proj_data_info_ptr->get_num_axial_poss(segment_num); + return + num_sinograms * + proj_data_info_ptr->get_num_views() * + proj_data_info_ptr->get_num_tangential_poss() * + sizeof(float); +} + +Succeeded +ProjDataInMemory:: +write_to_file(const string& output_filename) const +{ + + ProjDataInterfile out_projdata(this->get_exam_info_sptr(), + this->proj_data_info_ptr, output_filename, ios::out); + + Succeeded success=Succeeded::yes; + for (int segment_num = proj_data_info_ptr->get_min_segment_num(); + segment_num <= proj_data_info_ptr->get_max_segment_num(); + ++segment_num) + { + Succeeded success_this_segment = + out_projdata.set_segment(get_segment_by_view(segment_num)); + if (success==Succeeded::yes) + success = success_this_segment; + } + return success; + +} + +float +ProjDataInMemory::get_bin_value(Bin& bin) +{ + Viewgram viewgram = get_viewgram(bin.view_num(),bin.segment_num()); + + return viewgram[bin.axial_pos_num()][bin.tangential_pos_num()]; + +} +END_NAMESPACE_STIR + diff --git a/src/buildblock/ProjDataInfo.cxx b/src/buildblock/ProjDataInfo.cxx new file mode 100644 index 0000000000..78af9cba44 --- /dev/null +++ b/src/buildblock/ProjDataInfo.cxx @@ -0,0 +1,578 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009-05-13, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + + \brief Implementation of non-inline functions of class stir::ProjDataInfo + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Scanner.h" +#include "stir/Viewgram.h" +#include "stir/Sinogram.h" +#include "stir/SegmentBySinogram.h" +#include "stir/SegmentByView.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/Coordinate2D.h" +#include "stir/Coordinate3D.h" +#include "stir/IndexRange2D.h" +#include "stir/IndexRange3D.h" +#include "stir/Bin.h" +// include for ask and ask_num +#include "stir/utilities.h" + +#include +#include +#include +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + + +#ifndef STIR_NO_NAMESPACES +using std::vector; +using std::cerr; +using std::cout; +using std::endl; +using std::equal; +#endif + +START_NAMESPACE_STIR + + +float +ProjDataInfo::get_sampling_in_t(const Bin& bin) const +{ + return + (get_t(Bin(bin.segment_num(), bin.view_num(), bin.axial_pos_num()+1,bin.tangential_pos_num())) - + get_t(Bin(bin.segment_num(), bin.view_num(), bin.axial_pos_num()-1,bin.tangential_pos_num())) + )/2; +} + +float +ProjDataInfo::get_sampling_in_m(const Bin& bin) const +{ + return + (get_m(Bin(bin.segment_num(), bin.view_num(), bin.axial_pos_num()+1,bin.tangential_pos_num())) - + get_m(Bin(bin.segment_num(), bin.view_num(), bin.axial_pos_num()-1,bin.tangential_pos_num())) + )/2; +} + + +float +ProjDataInfo::get_sampling_in_s(const Bin& bin) const +{ + return + (get_s(Bin(bin.segment_num(), bin.view_num(), bin.axial_pos_num(),bin.tangential_pos_num()+1)) - + get_s(Bin(bin.segment_num(), bin.view_num(), bin.axial_pos_num(),bin.tangential_pos_num()-1)) + )/2; +} + +void +ProjDataInfo::set_num_views(const int num_views) +{ + min_view_num = 0; + max_view_num = num_views-1; +} + +void +ProjDataInfo::set_num_tangential_poss(const int num_tang_poss) +{ + + min_tangential_pos_num = -(num_tang_poss/2); + max_tangential_pos_num = min_tangential_pos_num + num_tang_poss-1; +} + +/*! Sets min_axial_pos_per_seg to 0 */ +void +ProjDataInfo::set_num_axial_poss_per_segment(const VectorWithOffset& num_axial_poss_per_segment) +{ + // first do assignments to make the members the correct size + // (data will be overwritten) + min_axial_pos_per_seg= num_axial_poss_per_segment; + max_axial_pos_per_seg= num_axial_poss_per_segment; + + for (int i=num_axial_poss_per_segment.get_min_index(); + i<=num_axial_poss_per_segment.get_max_index(); + i++) + { + min_axial_pos_per_seg[i]=0; + max_axial_pos_per_seg[i]=num_axial_poss_per_segment[i]-1; + } + +} + +/*! No checks are done on validity of the min_ax_pos_num argument */ +void +ProjDataInfo::set_min_axial_pos_num(const int min_ax_pos_num, const int segment_num) +{ + min_axial_pos_per_seg[segment_num] = min_ax_pos_num; +} +/*! No checks are done on validity of the max_ax_pos_num argument */ +void +ProjDataInfo::set_max_axial_pos_num(const int max_ax_pos_num, const int segment_num) +{ + max_axial_pos_per_seg[segment_num] = max_ax_pos_num; +} + + +void +ProjDataInfo::set_min_tangential_pos_num(const int min_tang_poss) +{ + min_tangential_pos_num = min_tang_poss; +} + +void +ProjDataInfo::set_max_tangential_pos_num(const int max_tang_poss) +{ + max_tangential_pos_num = max_tang_poss; +} + + +ProjDataInfo::ProjDataInfo() +{} + + + + +ProjDataInfo::ProjDataInfo(const shared_ptr& scanner_ptr_v, + const VectorWithOffset& num_axial_pos_per_segment_v, + const int num_views_v, + const int num_tangential_poss_v) + :scanner_ptr(scanner_ptr_v) + +{ + set_num_views(num_views_v); + set_num_tangential_poss(num_tangential_poss_v); + set_num_axial_poss_per_segment(num_axial_pos_per_segment_v); +} + +string +ProjDataInfo::parameter_info() const +{ + +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[30000]; + ostrstream s(str, 30000); +#else + std::ostringstream s; +#endif + s << scanner_ptr->parameter_info(); + + s << "\nSegment_num range: (" + << get_min_segment_num() + << ", " << get_max_segment_num() << ")\n"; + s << "Number of Views: " << get_num_views() << endl; + s << "Number of axial positions per seg: {"; + for (int seg_num=get_min_segment_num(); seg_num <= get_max_segment_num(); ++seg_num) + s << get_num_axial_poss(seg_num) << " "; + s << "}\n"; + s << "Number of tangential positions: " << get_num_tangential_poss() << endl; + + return s.str(); + +} + + +void +ProjDataInfo:: +reduce_segment_range(const int min_segment_num, const int max_segment_num) +{ + assert(min_segment_num >= get_min_segment_num()); + assert(max_segment_num <= get_max_segment_num()); + + VectorWithOffset new_min_axial_pos_per_seg(min_segment_num, max_segment_num); + VectorWithOffset new_max_axial_pos_per_seg(min_segment_num, max_segment_num); + + for (int segment_num = min_segment_num; segment_num<= max_segment_num; ++segment_num) + { + new_min_axial_pos_per_seg[segment_num] = + min_axial_pos_per_seg[segment_num]; + new_max_axial_pos_per_seg[segment_num] = + max_axial_pos_per_seg[segment_num]; + } + + min_axial_pos_per_seg = new_min_axial_pos_per_seg; + max_axial_pos_per_seg = new_max_axial_pos_per_seg; + +} + + +Viewgram +ProjDataInfo::get_empty_viewgram(const int view_num, + const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + // we can't access the shared ptr, so we have to clone 'this'. + shared_ptr proj_data_info_sptr(this->clone()); + + if (make_num_tangential_poss_odd && (get_num_tangential_poss()%2==0)) + proj_data_info_sptr->set_max_tangential_pos_num(get_max_tangential_pos_num() + 1); + + Viewgram v(proj_data_info_sptr, view_num, segment_num); + + return v; +} + + +Sinogram +ProjDataInfo::get_empty_sinogram(const int axial_pos_num, const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + // we can't access the shared ptr, so we have to clone 'this'. + shared_ptr proj_data_info_sptr(this->clone()); + + if (make_num_tangential_poss_odd && (get_num_tangential_poss()%2==0)) + proj_data_info_sptr->set_max_tangential_pos_num(get_max_tangential_pos_num() + 1); + + Sinogram s(proj_data_info_sptr, axial_pos_num, segment_num); + + return s; +} + +SegmentBySinogram +ProjDataInfo::get_empty_segment_by_sinogram(const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + assert(segment_num >= get_min_segment_num()); + assert(segment_num <= get_max_segment_num()); + + // we can't access the shared ptr, so we have to clone 'this'. + shared_ptr proj_data_info_sptr(this->clone()); + + if (make_num_tangential_poss_odd && (get_num_tangential_poss()%2==0)) + proj_data_info_sptr->set_max_tangential_pos_num(get_max_tangential_pos_num() + 1); + + SegmentBySinogram s(proj_data_info_sptr, segment_num); + + return s; +} + + +SegmentByView +ProjDataInfo::get_empty_segment_by_view(const int segment_num, + const bool make_num_tangential_poss_odd) const +{ + assert(segment_num >= get_min_segment_num()); + assert(segment_num <= get_max_segment_num()); + + // we can't access the shared ptr, so we have to clone 'this'. + shared_ptr proj_data_info_sptr(this->clone()); + + if (make_num_tangential_poss_odd && (get_num_tangential_poss()%2==0)) + proj_data_info_sptr->set_max_tangential_pos_num(get_max_tangential_pos_num() + 1); + + SegmentByView s(proj_data_info_sptr, segment_num); + + return s; +} + +RelatedViewgrams +ProjDataInfo::get_empty_related_viewgrams(const ViewSegmentNumbers& view_segmnet_num, + //const int view_num, const int segment_num, + const shared_ptr& symmetries_used, + const bool make_num_tangential_poss_odd) const +{ + vector pairs; + symmetries_used->get_related_view_segment_numbers( + pairs, + ViewSegmentNumbers(view_segmnet_num.view_num(),view_segmnet_num.segment_num()) + ); + + vector > viewgrams; + viewgrams.reserve(pairs.size()); + + for (unsigned int i=0; i(viewgrams, symmetries_used); +} + + +/****************** static members **********************/ + +ProjDataInfo* +ProjDataInfo::ProjDataInfoCTI(const shared_ptr& scanner, + const int span, const int max_delta, + const int num_views, const int num_tangential_poss, + const bool arc_corrected) +{ + if (span < 1) + error("ProjDataInfoCTI: span %d has to be larger than 0\n", span); + if (span%2 != 1) + error("ProjDataInfoCTI: span %d has to be odd\n", span); + if (max_delta<(span-1)/2) + error("ProjDataInfoCTI: max_ring_difference %d has to be at least (span-1)/2, span is %d\n", + max_delta, span); + + const int num_ring = scanner->get_num_rings(); + // Construct first a temporary list of min and max ring diff per segment (0,1,2,3...) + + // KT changed dimension to num_ring + vector RDmintmp(num_ring); + vector RDmaxtmp(num_ring); + + // KT avoid float stuff + // RDmintmp[0]= (int) ceil(-span/2); + RDmintmp[0] = -(span-1)/2; + RDmaxtmp[0] = RDmintmp[0] + span - 1; + + int seg_num =0; + while (RDmaxtmp[seg_num] < max_delta) + { + seg_num++; + RDmintmp[seg_num] = span + RDmintmp[seg_num-1]; + RDmaxtmp[seg_num] = RDmintmp[seg_num] + span - 1; + } + // check if we went one too far + if (RDmaxtmp[seg_num] > max_delta) + seg_num--; + + const int max_seg_num = seg_num; + // KT possible modifications + // RDmintmp[i] = (i)*span - (span-1)/2; + // RDmaxtmp[i] = (i+1)*span - (span-1)/2 -1; + + + + VectorWithOffset num_axial_pos_per_segment(-max_seg_num,max_seg_num); + VectorWithOffset min_ring_difference(-max_seg_num,max_seg_num); + VectorWithOffset max_ring_difference(-max_seg_num,max_seg_num); + + min_ring_difference[0] = RDmintmp[0]; + max_ring_difference[0]= RDmaxtmp[0]; + + for(int i=1; i<=max_seg_num; i++) + { + // KT 28/06/2001 make sure max_ring_diff>min_ring_diff for negative segments + max_ring_difference[-i]= -RDmintmp[i]; + max_ring_difference[i]= RDmaxtmp[i]; + min_ring_difference[-i]= -RDmaxtmp[i]; + min_ring_difference[i]= RDmintmp[i]; + } + + if (span==1) + { + num_axial_pos_per_segment[0] = num_ring; + for(int i=1; i<=max_seg_num; i++) + { + num_axial_pos_per_segment[i]= + num_axial_pos_per_segment[-i] = num_ring -i; + } + } + else + { + num_axial_pos_per_segment[0] = 2*num_ring -1 ; + for( int i=1; i<=max_seg_num; i++) + { + num_axial_pos_per_segment[i] = + num_axial_pos_per_segment[-i] = (2*num_ring -1 - 2*RDmintmp[i]); + } + } + + const float bin_size = scanner->get_default_bin_size(); + + + if (arc_corrected) + return + new ProjDataInfoCylindricalArcCorr(scanner,bin_size, + num_axial_pos_per_segment, + min_ring_difference, + max_ring_difference, + num_views,num_tangential_poss); + else + return + new ProjDataInfoCylindricalNoArcCorr(scanner, + num_axial_pos_per_segment, + min_ring_difference, + max_ring_difference, + num_views,num_tangential_poss); + +} + +// KT 28/06/2001 added arc_corrected flag +ProjDataInfo* +ProjDataInfo::ProjDataInfoGE(const shared_ptr& scanner, + const int max_delta, + const int num_views, const int num_tangential_poss, + const bool arc_corrected) + + +{ + /* mixed span case: + segment 0 has ring diff -1,0,1, + other segments have no axial compression + */ + const int num_rings = scanner->get_num_rings(); + const float bin_size = scanner->get_default_bin_size(); + + if(max_delta<1) + error("ProjDataInfo::ProjDataInfoGE: can only handle max_delta>=1\n"); + + const int max_segment_num = + max_delta==0? 0 : max_delta-1; + + VectorWithOffset num_axial_pos_per_segment(-max_segment_num,max_segment_num); + + VectorWithOffset min_ring_difference(-max_segment_num,max_segment_num); + VectorWithOffset max_ring_difference(-max_segment_num,max_segment_num); + + num_axial_pos_per_segment[0] = 2*num_rings-1; + min_ring_difference[0] = -1; + max_ring_difference[0] = 1; + + for (int i=1; i<=max_segment_num; i++) + + { + num_axial_pos_per_segment[i]= + num_axial_pos_per_segment[-i]=num_rings-i-1; + + max_ring_difference[i]= + min_ring_difference[i]= i+1; + max_ring_difference[-i]= + min_ring_difference[-i]= -i-1; + + } + + + + if (arc_corrected) + return + new ProjDataInfoCylindricalArcCorr(scanner,bin_size, + num_axial_pos_per_segment, + min_ring_difference, + max_ring_difference, + num_views,num_tangential_poss); + else + return + new ProjDataInfoCylindricalNoArcCorr(scanner, + num_axial_pos_per_segment, + min_ring_difference, + max_ring_difference, + num_views,num_tangential_poss); +} + + +ProjDataInfo* ProjDataInfo::ask_parameters() +{ + + shared_ptr scanner_ptr(Scanner::ask_parameters()); + + const bool is_Advance = + scanner_ptr->get_type() == Scanner::Advance || + scanner_ptr->get_type() == Scanner::DiscoveryLS; + const bool is_DiscoveryST = + scanner_ptr->get_type() == Scanner::DiscoveryST; + const bool is_GE = + is_Advance || is_DiscoveryST; + + const int num_views = scanner_ptr->get_max_num_views()/ + ask_num("Mash factor for views",1,16,1); + + const bool arc_corrected = + ask("Is the data arc-corrected?",true); + + const int num_tangential_poss= + ask_num("Number of tangential positions",1, + scanner_ptr->get_max_num_non_arccorrected_bins(), + arc_corrected + ? scanner_ptr->get_default_num_arccorrected_bins() + : scanner_ptr->get_max_num_non_arccorrected_bins()); + + int span = is_GE ? 0 : 1; + do + { + span = + ask_num("Span value (must be odd), but use 0 for mixed-span case of the Advance : ", 0,11,span); + } + while(span!=0 && span%2==0); + + const int max_delta = ask_num("Max. ring difference acquired : ", + 0, + scanner_ptr->get_num_rings()-1, + is_Advance ? 11 : scanner_ptr->get_num_rings()-1); + + + ProjDataInfo * pdi_ptr = + span==0 + ? ProjDataInfoGE(scanner_ptr,max_delta,num_views,num_tangential_poss,arc_corrected) + : ProjDataInfoCTI(scanner_ptr,span,max_delta,num_views,num_tangential_poss,arc_corrected); + + cout << pdi_ptr->parameter_info() <blindly_equals(&that) + ); +} + +bool +ProjDataInfo:: +operator !=(const root_type& that) const +{ + return !((*this) == that); +} + + +END_NAMESPACE_STIR + diff --git a/src/buildblock/ProjDataInfoCylindrical.cxx b/src/buildblock/ProjDataInfoCylindrical.cxx new file mode 100644 index 0000000000..df62e2f583 --- /dev/null +++ b/src/buildblock/ProjDataInfoCylindrical.cxx @@ -0,0 +1,564 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009-10-18 Hammersmith Imanet Ltd + Copyright (C) 2011, Kris Thielemans + Copyright (C) 2013, University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Non-inline implementations of stir::ProjDataInfoCylindrical + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project +*/ + +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/LORCoordinates.h" +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + +#include "stir/round.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::min_element; +using std::max_element; +using std::min; +using std::max; +using std::swap; +using std::endl; +#endif + +START_NAMESPACE_STIR + +ProjDataInfoCylindrical:: +ProjDataInfoCylindrical() +{} + + +ProjDataInfoCylindrical:: +ProjDataInfoCylindrical(const shared_ptr& scanner_ptr, + const VectorWithOffset& num_axial_pos_per_segment, + const VectorWithOffset& min_ring_diff_v, + const VectorWithOffset& max_ring_diff_v, + const int num_views,const int num_tangential_poss) + :ProjDataInfo(scanner_ptr,num_axial_pos_per_segment, + num_views,num_tangential_poss), + min_ring_diff(min_ring_diff_v), + max_ring_diff(max_ring_diff_v) +{ + + azimuthal_angle_sampling = static_cast(_PI/num_views); + ring_radius.resize(0,0); + ring_radius[0] = get_scanner_ptr()->get_effective_ring_radius(); + ring_spacing= get_scanner_ptr()->get_ring_spacing() ; + + // TODO this info should probably be provided via the constructor, or at + // least by Scanner. + sampling_corresponds_to_physical_rings = + scanner_ptr->get_type() != Scanner::HiDAC; + + + assert(min_ring_diff.get_length() == max_ring_diff.get_length()); + assert(min_ring_diff.get_length() == num_axial_pos_per_segment.get_length()); + + // check min,max ring diff + { + for (int segment_num=get_min_segment_num(); segment_num<=get_max_segment_num(); ++segment_num) + if (min_ring_diff[segment_num]> max_ring_diff[segment_num]) + { + warning("ProjDataInfoCylindrical: min_ring_difference %d is larger than max_ring_difference %d for segment %d. " + "Swapping them around", + min_ring_diff[segment_num], max_ring_diff[segment_num], segment_num); + swap(min_ring_diff[segment_num], max_ring_diff[segment_num]); + } + } + + initialise_ring_diff_arrays(); +} + +void +ProjDataInfoCylindrical:: +initialise_ring_diff_arrays() const +{ + + // check min,max ring diff + { + // check is necessary here again because of set_min_ring_difference() + // we do not swap here because that would require the min/max_ring_diff arrays to be mutable as well + for (int segment_num=get_min_segment_num(); segment_num<=get_max_segment_num(); ++segment_num) + if (min_ring_diff[segment_num]> max_ring_diff[segment_num]) + { + error("ProjDataInfoCylindrical: min_ring_difference %d is larger than " + "max_ring_difference %d for segment %d.", + min_ring_diff[segment_num], max_ring_diff[segment_num], segment_num); + } + } + // initialise m_offset + { + m_offset = + VectorWithOffset(get_min_segment_num(),get_max_segment_num()); + + /* m_offsets are found by requiring + get_m(..., min_axial_pos_num,...) == - get_m(..., max_axial_pos_num,...) + */ + for (int segment_num=get_min_segment_num(); segment_num<=get_max_segment_num(); ++segment_num) + { + m_offset[segment_num] = + ((get_max_axial_pos_num(segment_num) + get_min_axial_pos_num(segment_num)) + *get_axial_sampling(segment_num) + )/2; + } + } + // initialise ax_pos_num_offset + if (sampling_corresponds_to_physical_rings) + { + const int num_rings = get_scanner_ptr()->get_num_rings(); + ax_pos_num_offset = + VectorWithOffset(get_min_segment_num(),get_max_segment_num()); + + /* ax_pos_num will be determined by looking at ring1+ring2. + This also works for axially compressed data (i.e. span) as + ring1+ring2 is constant for all ring-pairs combined into 1 + segment,ax_pos. + + Ignoring the difficulties of axial compression for a second, it is clear that + for a given bin, there will be 2 rings as follows: + ring2 = get_m(bin)/ring_spacing + ring_diff/2 + (num_rings-1)/2 + ring1 = get_m(bin)/ring_spacing - ring_diff/2 + (num_rings-1)/2 + This follows from the fact that get_m() returns the z position + in millimeter of the middle of the LOR w.r.t. the middle of the scanner. + The (num_rings-1)/2 shifts the origin such that the first ring has + ring_num==0. + + From the above, it follows that + ring1+ring2=2*get_m(bin)/ring_spacing + (num_rings-1) + Finally, we use the formula for get_m to obtain + ring1+ring2=2*ax_pos_num/get_num_axial_poss_per_ring_inc(segment_num) + -2*m_offset[segment_num]/ring_spacing + (num_rings-1) + Solving this for ax_pos_num: + ax_pos_num = (ring1+ring2-(num_rings-1) + + 2*m_offset[segment_num]/ring_spacing + ) * get_num_axial_poss_per_ring_inc(segment_num)/2 + + We could plug m_offset in to obtain + ax_pos_num = (ring1+ring2-(num_rings-1) + ) * get_num_axial_poss_per_ring_inc(segment_num)/2. + + + (get_max_axial_pos_num(segment_num) + + get_min_axial_pos_num(segment_num) )/2. + this formula is easy to understand, but we don't use it as + at some point somebody might change m_offset + and forget to change this code... + (also, the form above would need float division and then rounding) + */ + for (int segment_num=get_min_segment_num(); segment_num<=get_max_segment_num(); ++segment_num) + { + ax_pos_num_offset[segment_num] = + round((num_rings-1) - 2*m_offset[segment_num]/ring_spacing); + // check that it was integer + if (fabs(ax_pos_num_offset[segment_num] - + ((num_rings-1) - 2*m_offset[segment_num]/ring_spacing)) > 1E-4) + { + error("ProjDataInfoCylindrical: in segment %d, the axial positions\n" + "do not correspond to the usual locations between physical rings.\n" + "This is suspicious and can make things go wrong in STIR, so I abort.\n" + "Check the number of axial positions in this segment.", + segment_num); + } + + if (get_num_axial_poss_per_ring_inc(segment_num)==1) + { + // check that we'll get an integer ax_pos_num, i.e. + // (ring1+ring2 - ax_pos_num_offset) has to be even, for any + // ring1,ring2 in the segment, i.e ring1-ring2 = ring_diff, so + // ring1+ring2 = 2*ring2 + ring_diff + assert(get_min_ring_difference(segment_num) == + get_max_ring_difference(segment_num)); + if ((get_max_ring_difference(segment_num) - + ax_pos_num_offset[segment_num]) % 2 != 0) + warning("ProjDataInfoCylindrical: the number of axial positions in " + "segment %d is such that current conventions will place " + "the LORs shifted with respect to the physical rings.", + segment_num); + } + } + } + // initialise ring_diff_to_segment_num + if (sampling_corresponds_to_physical_rings) + { + const int min_ring_difference = + *min_element(min_ring_diff.begin(), min_ring_diff.end()); + const int max_ring_difference = + *max_element(max_ring_diff.begin(), max_ring_diff.end()); + + // set ring_diff_to_segment_num to appropriate size + // in principle, the max ring difference would be scanner.num_rings-1, but + // in case someone is up to strange things, we take the max of this value + // with the max_ring_difference as given in the file + ring_diff_to_segment_num = + VectorWithOffset(min(min_ring_difference, -(get_scanner_ptr()->get_num_rings()-1)), + max(max_ring_difference, get_scanner_ptr()->get_num_rings()-1)); + // first set all to impossible value + // warning: get_segment_num_for_ring_difference relies on the fact that this value + // is larger than get_max_segment_num() + ring_diff_to_segment_num.fill(get_max_segment_num()+1); + + for(int ring_diff=min_ring_difference; ring_diff <= max_ring_difference; ++ring_diff) + { + int segment_num; + for (segment_num=get_min_segment_num(); segment_num<=get_max_segment_num(); ++segment_num) + { + if (ring_diff >= min_ring_diff[segment_num] && + ring_diff <= max_ring_diff[segment_num]) + { +#if 0 + std::cerr << "ring diff " << ring_diff << " stored in s:" << segment_num << std::endl; +#endif + ring_diff_to_segment_num[ring_diff] = segment_num; + break; + } + } + if (segment_num>get_max_segment_num()) + { + warning("ProjDataInfoCylindrical: ring difference %d does not belong to a segment", + ring_diff); + } + } + } + // initialise segment_axial_pos_to_ring1_plus_ring2 + if (sampling_corresponds_to_physical_rings) + { + segment_axial_pos_to_ring1_plus_ring2 = + VectorWithOffset >(get_min_segment_num(), get_max_segment_num()); + for (int s_num=get_min_segment_num(); s_num<=get_max_segment_num(); ++s_num) + { + const int min_ax_pos_num = get_min_axial_pos_num(s_num); + const int max_ax_pos_num = get_max_axial_pos_num(s_num); + segment_axial_pos_to_ring1_plus_ring2[s_num].grow(min_ax_pos_num, max_ax_pos_num); + for (int ax_pos_num=min_ax_pos_num; ax_pos_num<=max_ax_pos_num; ++ax_pos_num) + { + // see documentation above for formulas + const float ring1_plus_ring2_float = + 2*ax_pos_num/get_num_axial_poss_per_ring_inc(s_num) + -2*m_offset[s_num]/ring_spacing + (get_scanner_ptr()->get_num_rings()-1); + const int ring1_plus_ring2 = + round(ring1_plus_ring2_float); + // check that it was integer + assert(fabs(ring1_plus_ring2 - ring1_plus_ring2_float) < 1E-4) ; + segment_axial_pos_to_ring1_plus_ring2[s_num][ax_pos_num] = ring1_plus_ring2; + } + } + } + + if (sampling_corresponds_to_physical_rings) + allocate_segment_axial_pos_to_ring_pair(); + + ring_diff_arrays_computed = true; +} + +/*! Default implementation checks common variables. Needs to be overloaded. + */ +bool +ProjDataInfoCylindrical:: +blindly_equals(const root_type * const that) const +{ + if (!base_type::blindly_equals(that)) + return false; + + const self_type& proj_data_info = static_cast(*that); + return + this->azimuthal_angle_sampling == proj_data_info.azimuthal_angle_sampling && + this->ring_radius == proj_data_info.ring_radius && + this->sampling_corresponds_to_physical_rings == proj_data_info.sampling_corresponds_to_physical_rings && + this->ring_spacing == proj_data_info.ring_spacing && + this->min_ring_diff == proj_data_info.min_ring_diff && + this->max_ring_diff == proj_data_info.max_ring_diff; +} + +void +ProjDataInfoCylindrical:: +get_ring_pair_for_segment_axial_pos_num(int& ring1, + int& ring2, + const int segment_num, + const int axial_pos_num) const +{ + if (!sampling_corresponds_to_physical_rings) + error("ProjDataInfoCylindrical::get_ring_pair_for_segment_axial_pos_num does not work for this type of sampled data"); + // can do only span=1 at the moment + if (get_min_ring_difference(segment_num) != get_max_ring_difference(segment_num)) + error("ProjDataInfoCylindrical::get_ring_pair_for_segment_axial_pos_num does not work for data with axial compression"); + + if (!ring_diff_arrays_computed) + initialise_ring_diff_arrays(); + + const int ring_diff = get_max_ring_difference(segment_num); + const int ring1_plus_ring2= segment_axial_pos_to_ring1_plus_ring2[segment_num][axial_pos_num]; + + // KT 01/08/2002 swapped rings + ring1 = (ring1_plus_ring2 - ring_diff)/2; + ring2 = (ring1_plus_ring2 + ring_diff)/2; + assert((ring1_plus_ring2 + ring_diff)%2 == 0); + assert((ring1_plus_ring2 - ring_diff)%2 == 0); +} + + +void +ProjDataInfoCylindrical:: +set_azimuthal_angle_sampling(const float angle_v) +{ + azimuthal_angle_sampling = angle_v; +} + +//void +//ProjDataInfoCylindrical:: +//set_axial_sampling(const float samp_v, int segment_num) +//{axial_sampling = samp_v;} + + +void +ProjDataInfoCylindrical:: +set_num_views(const int new_num_views) +{ + const float old_azimuthal_angle_range = + this->get_azimuthal_angle_sampling() * this->get_num_views(); + base_type::set_num_views(new_num_views); + this->azimuthal_angle_sampling = old_azimuthal_angle_range/this->get_num_views(); +} + +void +ProjDataInfoCylindrical:: +set_min_ring_difference( int min_ring_diff_v, int segment_num) +{ + ring_diff_arrays_computed = false; + min_ring_diff[segment_num] = min_ring_diff_v; +} + +void +ProjDataInfoCylindrical:: +set_max_ring_difference( int max_ring_diff_v, int segment_num) +{ + ring_diff_arrays_computed = false; + max_ring_diff[segment_num] = max_ring_diff_v; +} + +void +ProjDataInfoCylindrical:: +set_ring_spacing(float ring_spacing_v) +{ + ring_diff_arrays_computed = false; + ring_spacing = ring_spacing_v; +} + +void +ProjDataInfoCylindrical:: +allocate_segment_axial_pos_to_ring_pair() const +{ + segment_axial_pos_to_ring_pair = + VectorWithOffset > > + (get_min_segment_num(), get_max_segment_num()); + + for (int segment_num = get_min_segment_num(); + segment_num <= get_max_segment_num(); + ++segment_num) + { + segment_axial_pos_to_ring_pair[segment_num].grow(get_min_axial_pos_num(segment_num), + get_max_axial_pos_num(segment_num)); + } +} + +void +ProjDataInfoCylindrical:: +compute_segment_axial_pos_to_ring_pair(const int segment_num, const int axial_pos_num) const +{ + shared_ptr new_el(new RingNumPairs); + segment_axial_pos_to_ring_pair[segment_num][axial_pos_num] = new_el; + + RingNumPairs& table = + *segment_axial_pos_to_ring_pair[segment_num][axial_pos_num]; + table.reserve(get_max_ring_difference(segment_num) - + get_min_ring_difference(segment_num) + 1); + + /* We compute the lookup-table in a fancy way. + We could just as well have a simple loop over all ring pairs and check + if it belongs to this segment/axial_pos. + The current way is a lot faster though. + */ + const int min_ring_diff = get_min_ring_difference(segment_num); + const int max_ring_diff = get_max_ring_difference(segment_num); + const int num_rings = get_scanner_ptr()->get_num_rings(); + + /* ring1_plus_ring2 is the same for any ring pair that contributes to + this particular segment_num, axial_pos_num. + */ + const int ring1_plus_ring2= + segment_axial_pos_to_ring1_plus_ring2[segment_num][axial_pos_num]; + + /* + The ring_difference increments with 2 as the other ring differences do + not give a ring pair with this axial_position. This is because + ring1_plus_ring2%2 == ring_diff%2 + (which easily follows by plugging in ring1+ring2 and ring1-ring2). + The starting ring_diff is determined such that the above condition + is satisfied. You can check it by noting that the + start_ring_diff%2 + == (min_ring_diff + (min_ring_diff+ring1_plus_ring2)%2)%2 + == (2*min_ring_diff+ring1_plus_ring2)%2 + == ring1_plus_ring2%2 + */ + for(int ring_diff = min_ring_diff + (min_ring_diff+ring1_plus_ring2)%2; + ring_diff <= max_ring_diff; + ring_diff+=2 ) + { + const int ring1 = (ring1_plus_ring2 - ring_diff)/2; + const int ring2 = (ring1_plus_ring2 + ring_diff)/2; + if (ring1<0 || ring2 < 0 || ring1>=num_rings || ring2 >= num_rings) + continue; + assert((ring1_plus_ring2 + ring_diff)%2 == 0); + assert((ring1_plus_ring2 - ring_diff)%2 == 0); + table.push_back(pair(ring1, ring2)); +#ifndef NDEBUG + int check_segment_num = 0, check_axial_pos_num = 0; + assert(get_segment_axial_pos_num_for_ring_pair(check_segment_num, + check_axial_pos_num, + ring1, + ring2) == + Succeeded::yes); + assert(check_segment_num == segment_num); + assert(check_axial_pos_num == axial_pos_num); +#endif + } +} + +void +ProjDataInfoCylindrical:: +set_num_axial_poss_per_segment(const VectorWithOffset& num_axial_poss_per_segment) +{ + ProjDataInfo::set_num_axial_poss_per_segment(num_axial_poss_per_segment); + ring_diff_arrays_computed = false; +} + +void +ProjDataInfoCylindrical:: +set_min_axial_pos_num(const int min_ax_pos_num, const int segment_num) +{ + ProjDataInfo::set_min_axial_pos_num(min_ax_pos_num, segment_num); + ring_diff_arrays_computed = false; +} + + +void ProjDataInfoCylindrical:: +set_max_axial_pos_num(const int max_ax_pos_num, const int segment_num) +{ + ProjDataInfo::set_max_axial_pos_num(max_ax_pos_num, segment_num); + ring_diff_arrays_computed = false; +} + +void +ProjDataInfoCylindrical:: +reduce_segment_range(const int min_segment_num, const int max_segment_num) +{ + ProjDataInfo::reduce_segment_range(min_segment_num, max_segment_num); + // reduce ring_diff arrays to new valid size + VectorWithOffset new_min_ring_diff(min_segment_num, max_segment_num); + VectorWithOffset new_max_ring_diff(min_segment_num, max_segment_num); + + for (int segment_num = min_segment_num; segment_num<= max_segment_num; ++segment_num) + { + new_min_ring_diff[segment_num] = this->min_ring_diff[segment_num]; + new_max_ring_diff[segment_num] = this->max_ring_diff[segment_num]; + } + + this->min_ring_diff = new_min_ring_diff; + this->max_ring_diff = new_max_ring_diff; + + // make sure other arrays will be updated if/when necessary + this->ring_diff_arrays_computed = false; +} + + +void +ProjDataInfoCylindrical:: +get_LOR(LORInAxialAndNoArcCorrSinogramCoordinates& lor, + const Bin& bin) const +{ + const float s_in_mm = get_s(bin); + const float m_in_mm = get_m(bin); + const float tantheta = get_tantheta(bin); + const float phi = get_phi(bin); + /* parametrisation of LOR is + X= s*cphi + a*sphi, + Y= s*sphi - a*cphi, + Z= m - a*tantheta + find now min_a, max_a such that end-points intersect the ring + */ + assert(fabs(s_in_mm) < get_ring_radius()); + // a has to be such that X^2+Y^2 == R^2 + const float max_a = sqrt(square(get_ring_radius()) - square(s_in_mm)); + const float min_a = -max_a; + + /* start_point.x() = (s_in_mm*cphi + max_a*sphi); + start_point.y() = (s_in_mm*sphi - max_a*cphi); + start_point.z() = (m_in_mm - max_a*tantheta); + stop_point.x() = (s_in_mm*cphi + min_a*sphi); + stop_point.y() = (s_in_mm*sphi - min_a*cphi); + stop_point.z() = (m_in_mm - min_a*tantheta); + */ + const float z1 = (m_in_mm - max_a*tantheta); + const float z2 = (m_in_mm - min_a*tantheta); + + + lor = + LORInAxialAndNoArcCorrSinogramCoordinates(z1, z2, + phi, + asin(s_in_mm/get_ring_radius()), + get_ring_radius()); +} + +string +ProjDataInfoCylindrical::parameter_info() const +{ + +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[30000]; + ostrstream s(str, 30000); +#else + std::ostringstream s; +#endif + s << ProjDataInfo::parameter_info(); + s << "Azimuthal angle increment (deg): " << get_azimuthal_angle_sampling()*180/_PI << '\n'; + s << "Azimuthal angle extent (deg): " << fabs(get_azimuthal_angle_sampling())*get_num_views()*180/_PI << '\n'; + + s << "ring differences per segment: \n"; + for (int segment_num=get_min_segment_num(); segment_num<=get_max_segment_num(); ++segment_num) + { + s << '(' << min_ring_diff[segment_num] << ',' << max_ring_diff[segment_num] <<')'; + } + s << std::endl; + return s.str(); +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/ProjDataInfoCylindricalArcCorr.cxx b/src/buildblock/ProjDataInfoCylindricalArcCorr.cxx new file mode 100644 index 0000000000..31685551ec --- /dev/null +++ b/src/buildblock/ProjDataInfoCylindricalArcCorr.cxx @@ -0,0 +1,250 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Implementation of non-inline functions of class + stir::ProjDataInfoCylindricalArcCorr + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/Bin.h" +#include "stir/round.h" +#include "stir/LORCoordinates.h" +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + +#ifndef STIR_NO_NAMESPACES +using std::endl; +using std::ends; +#endif + + +START_NAMESPACE_STIR +ProjDataInfoCylindricalArcCorr:: ProjDataInfoCylindricalArcCorr() +{} + +ProjDataInfoCylindricalArcCorr:: ProjDataInfoCylindricalArcCorr(const shared_ptr scanner_ptr,float bin_size_v, + const VectorWithOffset& num_axial_pos_per_segment, + const VectorWithOffset& min_ring_diff_v, + const VectorWithOffset& max_ring_diff_v, + const int num_views,const int num_tangential_poss) + :ProjDataInfoCylindrical(scanner_ptr, + num_axial_pos_per_segment, + min_ring_diff_v, max_ring_diff_v, + num_views, num_tangential_poss), + bin_size(bin_size_v) + +{} + + +void +ProjDataInfoCylindricalArcCorr::set_tangential_sampling(const float new_tangential_sampling) +{bin_size = new_tangential_sampling;} + + + +ProjDataInfo* +ProjDataInfoCylindricalArcCorr::clone() const +{ + return static_cast(new ProjDataInfoCylindricalArcCorr(*this)); +} + + +bool +ProjDataInfoCylindricalArcCorr:: +operator==(const self_type& that) const +{ + if (!base_type::blindly_equals(&that)) + return false; + return + this->bin_size == that.bin_size; +} + +bool +ProjDataInfoCylindricalArcCorr:: +blindly_equals(const root_type * const that_ptr) const +{ + assert(dynamic_cast(that_ptr) != 0); + return + this->operator==(static_cast(*that_ptr)); +} + +string +ProjDataInfoCylindricalArcCorr::parameter_info() const +{ + +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[50000]; + ostrstream s(str, 50000); +#else + std::ostringstream s; +#endif + s << "ProjDataInfoCylindricalArcCorr := \n"; + s << ProjDataInfoCylindrical::parameter_info(); + s << "tangential sampling := " << get_tangential_sampling() << endl; + s << "End :=\n"; + return s.str(); +} + + +Bin +ProjDataInfoCylindricalArcCorr:: +get_bin(const LOR& lor) const + +{ + Bin bin; + LORInAxialAndSinogramCoordinates lor_coords; + if (lor.change_representation(lor_coords, get_ring_radius()) == Succeeded::no) + { + bin.set_bin_value(-1); + return bin; + } + + // first find view + // unfortunately, phi ranges from [0,Pi[, but the rounding can + // map this to a view which corresponds to Pi anyway. + bin.view_num() = round(lor_coords.phi() / get_azimuthal_angle_sampling()); + assert(bin.view_num()>=0); + assert(bin.view_num()<=get_num_views()); + const bool swap_direction = + bin.view_num() > get_max_view_num(); + if (swap_direction) + bin.view_num()-=get_num_views(); + + bin.tangential_pos_num() = round(lor_coords.s() / get_tangential_sampling()); + if (swap_direction) + bin.tangential_pos_num() *= -1; + + if (bin.tangential_pos_num() < get_min_tangential_pos_num() || + bin.tangential_pos_num() > get_max_tangential_pos_num()) + { + bin.set_bin_value(-1); + return bin; + } + +#if 0 + const int num_rings = + get_scanner_ptr()->get_num_rings(); + // TODO WARNING LOR coordinates are w.r.t. centre of scanner, but the rings are numbered with the first ring at 0 + int ring1, ring2; + if (!swap_direction) + { + ring1 = round(lor_coords.z1()/get_ring_spacing() + (num_rings-1)/2.F); + ring2 = round(lor_coords.z2()/get_ring_spacing() + (num_rings-1)/2.F); + } + else + { + ring2 = round(lor_coords.z1()/get_ring_spacing() + (num_rings-1)/2.F); + ring1 = round(lor_coords.z2()/get_ring_spacing() + (num_rings-1)/2.F); + } + + if (!(ring1 >=0 && ring1get_num_rings() && + ring2 >=0 && ring2get_num_rings() && + get_segment_axial_pos_num_for_ring_pair(bin.segment_num(), + bin.axial_pos_num(), + ring1, + ring2) == Succeeded::yes) + ) + { + bin.set_bin_value(-1); + return bin; + } +#else + // find nearest segment + { + const float delta = + (swap_direction + ? lor_coords.z1()-lor_coords.z2() + : lor_coords.z2()-lor_coords.z1() + )/get_ring_spacing(); + // check if out of acquired range + // note the +1 or -1, which takes the size of the rings into account + if (delta>get_max_ring_difference(get_max_segment_num())+1 || + delta=0) + { + for (bin.segment_num()=0; bin.segment_num()get_min_segment_num(); --bin.segment_num()) + { + if (delta > get_min_ring_difference(bin.segment_num())-.5) + break; + } + } + } + // now find nearest axial position + { + const float m = (lor_coords.z2()+lor_coords.z1())/2; +#if 0 + // this uses private member of ProjDataInfoCylindrical + // enable when moved + if (!ring_diff_arrays_computed) + initialise_ring_diff_arrays(); +#ifndef NDEBUG + bin.axial_pos_num()=0; + assert(get_m(bin)==- m_offset[bin.segment_num()]); +#endif + bin.axial_pos_num() = + round((m + m_offset[bin.segment_num()])/ + get_axial_sampling(bin.segment_num())); +#else + bin.axial_pos_num()=0; + bin.axial_pos_num() = + round((m - get_m(bin))/ + get_axial_sampling(bin.segment_num())); +#endif + if (bin.axial_pos_num() < get_min_axial_pos_num(bin.segment_num()) || + bin.axial_pos_num() > get_max_axial_pos_num(bin.segment_num())) + { + bin.set_bin_value(-1); + return bin; + } + } +#endif + + bin.set_bin_value(1); + return bin; +} +END_NAMESPACE_STIR + diff --git a/src/buildblock/ProjDataInfoCylindricalNoArcCorr.cxx b/src/buildblock/ProjDataInfoCylindricalNoArcCorr.cxx new file mode 100644 index 0000000000..a47d08d9fd --- /dev/null +++ b/src/buildblock/ProjDataInfoCylindricalNoArcCorr.cxx @@ -0,0 +1,702 @@ +// +// +/* + Copyright (C) 2000- 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Implementation of non-inline functions of class + stir::ProjDataInfoCylindricalNoArcCorr + + \author Kris Thielemans + +*/ + +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Bin.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/LORCoordinates.h" +#include "stir/round.h" + +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + +#ifndef STIR_NO_NAMESPACES +using std::endl; +using std::ends; +#endif + +START_NAMESPACE_STIR +ProjDataInfoCylindricalNoArcCorr:: +ProjDataInfoCylindricalNoArcCorr() +{} + +ProjDataInfoCylindricalNoArcCorr:: +ProjDataInfoCylindricalNoArcCorr(const shared_ptr scanner_ptr, + const float ring_radius_v, const float angular_increment_v, + const VectorWithOffset& num_axial_pos_per_segment, + const VectorWithOffset& min_ring_diff_v, + const VectorWithOffset& max_ring_diff_v, + const int num_views,const int num_tangential_poss) +: ProjDataInfoCylindrical(scanner_ptr, + num_axial_pos_per_segment, + min_ring_diff_v, max_ring_diff_v, + num_views, num_tangential_poss), + ring_radius(ring_radius_v), + angular_increment(angular_increment_v) +{ + uncompressed_view_tangpos_to_det1det2_initialised = false; + det1det2_to_uncompressed_view_tangpos_initialised = false; +} + +ProjDataInfoCylindricalNoArcCorr:: +ProjDataInfoCylindricalNoArcCorr(const shared_ptr scanner_ptr, + const VectorWithOffset& num_axial_pos_per_segment, + const VectorWithOffset& min_ring_diff_v, + const VectorWithOffset& max_ring_diff_v, + const int num_views,const int num_tangential_poss) +: ProjDataInfoCylindrical(scanner_ptr, + num_axial_pos_per_segment, + min_ring_diff_v, max_ring_diff_v, + num_views, num_tangential_poss) +{ + assert(!is_null_ptr(scanner_ptr)); + ring_radius = scanner_ptr->get_effective_ring_radius(); + angular_increment = static_cast(_PI/scanner_ptr->get_num_detectors_per_ring()); + uncompressed_view_tangpos_to_det1det2_initialised = false; + det1det2_to_uncompressed_view_tangpos_initialised = false; +} + + + + +ProjDataInfo* +ProjDataInfoCylindricalNoArcCorr::clone() const +{ + return static_cast(new ProjDataInfoCylindricalNoArcCorr(*this)); +} + +bool +ProjDataInfoCylindricalNoArcCorr:: +operator==(const self_type& that) const +{ + if (!base_type::blindly_equals(&that)) + return false; + return + this->ring_radius == that.ring_radius && + this->angular_increment == that.angular_increment; +} + +bool +ProjDataInfoCylindricalNoArcCorr:: +blindly_equals(const root_type * const that_ptr) const +{ + assert(dynamic_cast(that_ptr) != 0); + return + this->operator==(static_cast(*that_ptr)); +} + + +string +ProjDataInfoCylindricalNoArcCorr::parameter_info() const +{ + +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[50000]; + ostrstream s(str, 50000); +#else + std::ostringstream s; +#endif + s << "ProjDataInfoCylindricalNoArcCorr := \n"; + s << ProjDataInfoCylindrical::parameter_info(); + s << "End :=\n"; + return s.str(); +} + +/* + TODO make compile time assert + + Warning: + this code makes use of an implementation dependent feature: + bit shifting negative ints to the right. + -1 >> 1 should be -1 + -2 >> 1 should be -1 + This is ok on SUNs (gcc, but probably SUNs cc as well), Parsytec (gcc), + Pentium (gcc, VC++) and probably every other system which uses + the 2-complement convention. +*/ + +/*! + Go from sinograms to detectors. + + Because sinograms are not arc-corrected, tang_pos_num corresponds + to an angle as well. Before interleaving we have that + \verbatim + det_angle_1 = LOR_angle + bin_angle + det_angle_2 = LOR_angle + (Pi - bin_angle) + \endverbatim + (Hint: understand this first at LOR_angle=0, then realise that + other LOR_angles follow just by rotation) + + Code gets slightly intricate because: + - angles have to be defined modulo 2 Pi (so num_detectors) + - interleaving +*/ +void +ProjDataInfoCylindricalNoArcCorr:: +initialise_uncompressed_view_tangpos_to_det1det2() const +{ + assert(-1 >> 1 == -1); + assert(-2 >> 1 == -1); + + const int num_detectors = + get_scanner_ptr()->get_num_detectors_per_ring(); + + assert(num_detectors%2 == 0); + // check views range from 0 to Pi + assert(fabs(get_phi(Bin(0,0,0,0))) < 1.E-4); + assert(fabs(get_phi(Bin(0,get_num_views(),0,0)) - _PI) < 1.E-4); + const int min_tang_pos_num = -(num_detectors/2)+1; + const int max_tang_pos_num = -(num_detectors/2)+num_detectors; + + if (this->get_min_tangential_pos_num() < min_tang_pos_num || + this->get_max_tangential_pos_num() > max_tang_pos_num) + { + error("The tangential_pos range (%d to %d) for this projection data is too large.\n" + "Maximum supported range is from %d to %d", + this->get_min_tangential_pos_num(), this->get_max_tangential_pos_num(), + min_tang_pos_num, max_tang_pos_num); + } + + uncompressed_view_tangpos_to_det1det2.grow(0,num_detectors/2-1); + for (int v_num=0; v_num<=num_detectors/2-1; ++v_num) + { + uncompressed_view_tangpos_to_det1det2[v_num].grow(min_tang_pos_num, max_tang_pos_num); + + for (int tp_num=min_tang_pos_num; tp_num<=max_tang_pos_num; ++tp_num) + { + /* + adapted from CTI code + Note for implementation: avoid using % with negative numbers + so add num_detectors before doing modulo num_detectors) + */ + uncompressed_view_tangpos_to_det1det2[v_num][tp_num].det1_num = + (v_num + (tp_num >> 1) + num_detectors) % num_detectors; + uncompressed_view_tangpos_to_det1det2[v_num][tp_num].det2_num = + (v_num - ( (tp_num + 1) >> 1 ) + num_detectors/2) % num_detectors; + } + } + uncompressed_view_tangpos_to_det1det2_initialised = true; +} + +void +ProjDataInfoCylindricalNoArcCorr:: +initialise_det1det2_to_uncompressed_view_tangpos() const +{ + assert(-1 >> 1 == -1); + assert(-2 >> 1 == -1); + + const int num_detectors = + get_scanner_ptr()->get_num_detectors_per_ring(); + + if (num_detectors%2 != 0) + { + error("Number of detectors per ring should be even but is %d", num_detectors); + } + if (this->get_min_view_num() != 0) + { + error("Minimum view number should currently be zero to be able to use get_view_tangential_pos_num_for_det_num_pair()"); + } + // check views range from 0 to Pi + assert(fabs(get_phi(Bin(0,0,0,0))) < 1.E-4); + assert(fabs(get_phi(Bin(0,get_max_view_num()+1,0,0)) - _PI) < 1.E-4); + //const int min_tang_pos_num = -(num_detectors/2); + //const int max_tang_pos_num = -(num_detectors/2)+num_detectors; + const int max_num_views = num_detectors/2; + + det1det2_to_uncompressed_view_tangpos.grow(0,num_detectors-1); + for (int det1_num=0; det1_num> 1) + num_detectors) % num_detectors; + + /* Now adjust ranges for view_num, tang_pos_num. + The next lines go only wrong in the singular (and irrelevant) case + det_num1 == det_num2 (when tang_pos_num == num_detectors - tang_pos_num) + + We use the combinations of the following 'symmetries' of + (tang_pos_num, view_num) == (tang_pos_num+2*num_views, view_num + num_views) + == (-tang_pos_num, view_num + num_views) + Using the latter interchanges det_num1 and det_num2, and this leaves + the LOR the same in the 2D case. However, in 3D this interchanges the rings + as well. So, we keep track of this in swap_detectors, and return its final + value. + */ + if (view_num < max_num_views) + { + if (tang_pos_num >= max_num_views) + { + tang_pos_num = num_detectors - tang_pos_num; + swap_detectors = 1; + } + else + { + swap_detectors = 0; + } + } + else + { + view_num -= max_num_views; + if (tang_pos_num >= max_num_views) + { + tang_pos_num -= num_detectors; + swap_detectors = 0; + } + else + { + tang_pos_num *= -1; + swap_detectors = 1; + } + } + + det1det2_to_uncompressed_view_tangpos[det1_num][det2_num].view_num = view_num; + det1det2_to_uncompressed_view_tangpos[det1_num][det2_num].tang_pos_num = tang_pos_num; + det1det2_to_uncompressed_view_tangpos[det1_num][det2_num].swap_detectors = swap_detectors==0; + } + } + det1det2_to_uncompressed_view_tangpos_initialised = true; +} + +unsigned int +ProjDataInfoCylindricalNoArcCorr:: +get_num_det_pos_pairs_for_bin(const Bin& bin) const +{ + return + get_num_ring_pairs_for_segment_axial_pos_num(bin.segment_num(), + bin.axial_pos_num())* + get_view_mashing_factor(); +} + +void +ProjDataInfoCylindricalNoArcCorr:: +get_all_det_pos_pairs_for_bin(vector >& dps, + const Bin& bin) const +{ + if (!uncompressed_view_tangpos_to_det1det2_initialised) + initialise_uncompressed_view_tangpos_to_det1det2(); + + dps.resize(get_num_det_pos_pairs_for_bin(bin)); + + const ProjDataInfoCylindrical::RingNumPairs& ring_pairs = + get_all_ring_pairs_for_segment_axial_pos_num(bin.segment_num(), + bin.axial_pos_num()); + // not sure how to handle mashing with non-zero view offset... + assert(get_min_view_num()==0); + + unsigned int current_dp_num=0; + for (int uncompressed_view_num=bin.view_num()*get_view_mashing_factor(); + uncompressed_view_num<(bin.view_num()+1)*get_view_mashing_factor(); + ++uncompressed_view_num) + { + const int det1_num = + uncompressed_view_tangpos_to_det1det2[uncompressed_view_num][bin.tangential_pos_num()].det1_num; + const int det2_num = + uncompressed_view_tangpos_to_det1det2[uncompressed_view_num][bin.tangential_pos_num()].det2_num; + for (ProjDataInfoCylindrical::RingNumPairs::const_iterator rings_iter = ring_pairs.begin(); + rings_iter != ring_pairs.end(); + ++rings_iter) + { + assert(current_dp_num < get_num_det_pos_pairs_for_bin(bin)); + dps[current_dp_num].pos1().tangential_coord() = det1_num; + dps[current_dp_num].pos1().axial_coord() = rings_iter->first; + dps[current_dp_num].pos2().tangential_coord() = det2_num; + dps[current_dp_num].pos2().axial_coord() = rings_iter->second; + ++current_dp_num; + } + } + assert(current_dp_num == get_num_det_pos_pairs_for_bin(bin)); +} + +Succeeded +ProjDataInfoCylindricalNoArcCorr:: +find_scanner_coordinates_given_cartesian_coordinates(int& det1, int& det2, int& ring1, int& ring2, + const CartesianCoordinate3D& c1, + const CartesianCoordinate3D& c2) const +{ + const int num_detectors=get_scanner_ptr()->get_num_detectors_per_ring(); + const float ring_spacing=get_scanner_ptr()->get_ring_spacing(); + const float ring_radius=get_scanner_ptr()->get_effective_ring_radius(); + +#if 0 + const CartesianCoordinate3D d = c2 - c1; + /* parametrisation of LOR is + c = l*d+c1 + l has to be such that c.x^2 + c.y^2 = R^2 + i.e. + (l*d.x+c1.x)^2+(l*d.y+c1.y)^2==R^2 + l^2*(d.x^2+d.y^2) + 2*l*(d.x*c1.x + d.y*c1.y) + c1.x^2+c2.y^2-R^2==0 + write as a*l^2+2*b*l+e==0 + l = (-b +- sqrt(b^2-a*e))/a + argument of sqrt simplifies to + R^2*(d.x^2+d.y^2)-(d.x*c1.y-d.y*c1.x)^2 + */ + const float dxy2 = (square(d.x())+square(d.y())); + assert(dxy2>0); // otherwise parallel to z-axis, which is gives ill-defined bin-coordinates + const float argsqrt= + (square(ring_radius)*dxy2-square(d.x()*c1.y()-d.y()*c1.x())); + if (argsqrt<=0) + return Succeeded::no; // LOR is outside detector radius + const float root = sqrt(argsqrt); + + const float l1 = (- (d.x()*c1.x() + d.y()*c1.y())+root)/dxy2; + const float l2 = (- (d.x()*c1.x() + d.y()*c1.y())-root)/dxy2; + const CartesianCoordinate3D coord_det1 = d*l1 + c1; + const CartesianCoordinate3D coord_det2 = d*l2 + c1; + assert(fabs(square(coord_det1.x())+square(coord_det1.y())-square(ring_radius)) cyl_coords; + if (find_LOR_intersections_with_cylinder(cyl_coords, + LORAs2Points(c1, c2), + ring_radius) + == Succeeded::no) + return Succeeded::no; + + det1 = modulo(round(cyl_coords.p1().psi()/(2.*_PI/num_detectors)), num_detectors); + det2 = modulo(round(cyl_coords.p2().psi()/(2.*_PI/num_detectors)), num_detectors); + ring1 = round(cyl_coords.p1().z()/ring_spacing); + ring2 = round(cyl_coords.p2().z()/ring_spacing); + +#endif + + assert(det1 >=0 && det1get_num_detectors_per_ring()); + assert(det2 >=0 && det2get_num_detectors_per_ring()); + + return + (ring1 >=0 && ring1get_num_rings() && + ring2 >=0 && ring2get_num_rings()) + ? Succeeded::yes : Succeeded::no; +} + + +void +ProjDataInfoCylindricalNoArcCorr:: +find_cartesian_coordinates_of_detection( + CartesianCoordinate3D& coord_1, + CartesianCoordinate3D& coord_2, + const Bin& bin) const +{ + // find detectors + int det_num_a; + int det_num_b; + int ring_a; + int ring_b; + get_det_pair_for_bin(det_num_a, ring_a, + det_num_b, ring_b, bin); + + // find corresponding cartesian coordinates + find_cartesian_coordinates_given_scanner_coordinates(coord_1,coord_2, + ring_a,ring_b,det_num_a,det_num_b); +} + + +void +ProjDataInfoCylindricalNoArcCorr:: +find_cartesian_coordinates_given_scanner_coordinates (CartesianCoordinate3D& coord_1, + CartesianCoordinate3D& coord_2, + const int Ring_A,const int Ring_B, + const int det1, const int det2) const +{ + const int num_detectors_per_ring = + get_scanner_ptr()->get_num_detectors_per_ring(); + +#if 0 + const float df1 = (2.*_PI/num_detectors_per_ring)*(det1); + const float df2 = (2.*_PI/num_detectors_per_ring)*(det2); + const float x1 = get_scanner_ptr()->get_effective_ring_radius()*cos(df1); + const float y1 = get_scanner_ptr()->get_effective_ring_radius()*sin(df1); + const float x2 = get_scanner_ptr()->get_effective_ring_radius()*cos(df2); + const float y2 = get_scanner_ptr()->get_effective_ring_radius()*sin(df2); + const float z1 = Ring_A*get_scanner_ptr()->get_ring_spacing(); + const float z2 = Ring_B*get_scanner_ptr()->get_ring_spacing(); + // make sure the return values are in STIR coordinates + coord_1.z() = z1; + coord_1.y() = -x1; + coord_1.x() = y1; + + coord_2.z() = z2; + coord_2.y() = -x2; + coord_2.x() = y2; +#else + // although code maybe doesn't really need the following, + // asserts in the LOR code will break if these conditions are not satisfied. + assert(0<=det1); + assert(det1 cyl_coords(get_scanner_ptr()->get_effective_ring_radius()); + cyl_coords.p1().psi() = static_cast((2.*_PI/num_detectors_per_ring)*(det1)); + cyl_coords.p2().psi() = static_cast((2.*_PI/num_detectors_per_ring)*(det2)); + cyl_coords.p1().z() = Ring_A*get_scanner_ptr()->get_ring_spacing(); + cyl_coords.p2().z() = Ring_B*get_scanner_ptr()->get_ring_spacing(); + LORAs2Points lor(cyl_coords); + coord_1 = lor.p1(); + coord_2 = lor.p2(); + +#endif +} + + +void +ProjDataInfoCylindricalNoArcCorr:: +find_bin_given_cartesian_coordinates_of_detection(Bin& bin, + const CartesianCoordinate3D& coord_1, + const CartesianCoordinate3D& coord_2) const +{ + int det_num_a; + int det_num_b; + int ring_a; + int ring_b; + + // given two CartesianCoordinates find the intersection + if (find_scanner_coordinates_given_cartesian_coordinates(det_num_a,det_num_b, + ring_a, ring_b, + coord_1, + coord_2) == + Succeeded::no) + { + bin.set_bin_value(-1); + return; + } + + // check rings are in valid range + // this should have been done by find_scanner_coordinates_given_cartesian_coordinates + assert(!(ring_a<0 || + ring_a>=get_scanner_ptr()->get_num_rings() || + ring_b<0 || + ring_b>=get_scanner_ptr()->get_num_rings())); + + if (get_bin_for_det_pair(bin, + det_num_a, ring_a, + det_num_b, ring_b) == Succeeded::no || + bin.tangential_pos_num() < get_min_tangential_pos_num() || + bin.tangential_pos_num() > get_max_tangential_pos_num()) + bin.set_bin_value(-1); +} + +Bin +ProjDataInfoCylindricalNoArcCorr:: +get_bin(const LOR& lor) const +{ + Bin bin; +#ifndef STIR_DEVEL + // find nearest bin by going to nearest detectors first + LORInCylinderCoordinates cyl_coords; + if (lor.change_representation(cyl_coords, get_ring_radius()) == Succeeded::no) + { + bin.set_bin_value(-1); + return bin; + } + const int num_detectors_per_ring = + get_scanner_ptr()->get_num_detectors_per_ring(); + const int num_rings = + get_scanner_ptr()->get_num_rings(); + + const int det1 = modulo(round(cyl_coords.p1().psi()/(2.*_PI/num_detectors_per_ring)),num_detectors_per_ring); + const int det2 = modulo(round(cyl_coords.p2().psi()/(2.*_PI/num_detectors_per_ring)),num_detectors_per_ring); + // TODO WARNING LOR coordinates are w.r.t. centre of scanner, but the rings are numbered with the first ring at 0 + const int ring1 = round(cyl_coords.p1().z()/get_ring_spacing() + (num_rings-1)/2.F); + const int ring2 = round(cyl_coords.p2().z()/get_ring_spacing() + (num_rings-1)/2.F); + + assert(det1 >=0 && det1=0 && det2=0 && ring1=0 && ring2= get_min_tangential_pos_num() && + bin.tangential_pos_num() <= get_max_tangential_pos_num()) + { + bin.set_bin_value(1); + return bin; + } + else + { + bin.set_bin_value(-1); + return bin; + } + + +#else + LORInAxialAndNoArcCorrSinogramCoordinates lor_coords; + if (lor.change_representation(lor_coords, get_ring_radius()) == Succeeded::no) + { + bin.set_bin_value(-1); + return bin; + } + + // first find view + // unfortunately, phi ranges from [0,Pi[, but the rounding can + // map this to a view which corresponds to Pi anyway. + bin.view_num() = round(lor_coords.phi() / get_azimuthal_angle_sampling()); + assert(bin.view_num()>=0); + assert(bin.view_num()<=get_num_views()); + const bool swap_direction = + bin.view_num() > get_max_view_num(); + if (swap_direction) + bin.view_num()-=get_num_views(); + + bin.tangential_pos_num() = round(lor_coords.beta() / angular_increment); + if (swap_direction) + bin.tangential_pos_num() *= -1; + + if (bin.tangential_pos_num() < get_min_tangential_pos_num() || + bin.tangential_pos_num() > get_max_tangential_pos_num()) + { + bin.set_bin_value(-1); + return bin; + } + +#if 0 + const int num_rings = + get_scanner_ptr()->get_num_rings(); + // TODO WARNING LOR coordinates are w.r.t. centre of scanner, but the rings are numbered with the first ring at 0 + int ring1, ring2; + if (!swap_direction) + { + ring1 = round(lor_coords.z1()/get_ring_spacing() + (num_rings-1)/2.F); + ring2 = round(lor_coords.z2()/get_ring_spacing() + (num_rings-1)/2.F); + } + else + { + ring2 = round(lor_coords.z1()/get_ring_spacing() + (num_rings-1)/2.F); + ring1 = round(lor_coords.z2()/get_ring_spacing() + (num_rings-1)/2.F); + } + + if (!(ring1 >=0 && ring1get_num_rings() && + ring2 >=0 && ring2get_num_rings() && + get_segment_axial_pos_num_for_ring_pair(bin.segment_num(), + bin.axial_pos_num(), + ring1, + ring2) == Succeeded::yes) + ) + { + bin.set_bin_value(-1); + return bin; + } +#else + // find nearest segment + { + const float delta = + (swap_direction + ? lor_coords.z1()-lor_coords.z2() + : lor_coords.z2()-lor_coords.z1() + )/get_ring_spacing(); + // check if out of acquired range + // note the +1 or -1, which takes the size of the rings into account + if (delta>get_max_ring_difference(get_max_segment_num())+1 || + delta=0) + { + for (bin.segment_num()=0; bin.segment_num()get_min_segment_num(); --bin.segment_num()) + { + if (delta > get_min_ring_difference(bin.segment_num())-.5) + break; + } + } + } + // now find nearest axial position + { + const float m = (lor_coords.z2()+lor_coords.z1())/2; +#if 0 + // this uses private member of ProjDataInfoCylindrical + // enable when moved + if (!ring_diff_arrays_computed) + initialise_ring_diff_arrays(); +#ifndef NDEBUG + bin.axial_pos_num()=0; + assert(get_m(bin)==- m_offset[bin.segment_num()]); +#endif + bin.axial_pos_num() = + round((m + m_offset[bin.segment_num()])/ + get_axial_sampling(bin.segment_num())); +#else + bin.axial_pos_num()=0; + bin.axial_pos_num() = + round((m - get_m(bin))/ + get_axial_sampling(bin.segment_num())); +#endif + if (bin.axial_pos_num() < get_min_axial_pos_num(bin.segment_num()) || + bin.axial_pos_num() > get_max_axial_pos_num(bin.segment_num())) + { + bin.set_bin_value(-1); + return bin; + } + } +#endif + + bin.set_bin_value(1); + return bin; +#endif +} + + +END_NAMESPACE_STIR + diff --git a/src/buildblock/ProjDataInterfile.cxx b/src/buildblock/ProjDataInterfile.cxx new file mode 100644 index 0000000000..2e8630ee52 --- /dev/null +++ b/src/buildblock/ProjDataInterfile.cxx @@ -0,0 +1,118 @@ +/*! + + \file + \ingroup projdata + \brief Implementation of class stir::ProjDataInterfile + + \author Kris Thielemans +*/ +/* + Copyright (C) 2002 - 2008-10-01, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ProjDataInterfile.h" +#include "stir/utilities.h" +#include "stir/IO/interfile.h" + +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::iostream; +using std::fstream; +using std::vector; +#endif + +START_NAMESPACE_STIR + + +void +ProjDataInterfile :: +create_stream(const string& filename, const ios::openmode open_mode) +{ +#if 1 + string data_name=filename; + { + string::size_type pos=find_pos_of_extension(filename); + if (pos!=string::npos && filename.substr(pos)==".hs") + replace_extension(data_name, ".s"); + else + add_extension(data_name, ".s"); + } + string header_name=filename; +#else + char * data_name = new char[filename.size() + 5]; + { + strcpy(data_name, filename.c_str()); + const char * const extension = strchr(find_filename(data_name),'.'); + if (extension!=NULL && strcmp(extension, ".hs")==0) + replace_extension(data_name, ".s"); + else + add_extension(data_name, ".s"); + } + char * header_name = new char[filename.size() + 5]; + strcpy(header_name, data_name); +#endif + replace_extension(header_name, ".hs"); + write_basic_interfile_PDFS_header(header_name, data_name, + *this); + + sino_stream.reset( + new fstream (data_name.c_str(), open_mode|ios::binary)); + if (!sino_stream->good()) + { + error("ProjDataInterfile: error opening output file %s\n", data_name.c_str()); + } +#if 0 + delete[] header_name; + delete[] data_name; +#endif +} + +ProjDataInterfile :: +ProjDataInterfile (shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + const string& filename, const ios::openmode open_mode, + const vector& segment_sequence_in_stream, + StorageOrder o, + NumericType data_type, + ByteOrder byte_order, + float scale_factor) + : ProjDataFromStream(exam_info_sptr, proj_data_info_ptr, shared_ptr(), 0, + segment_sequence_in_stream, o, data_type, byte_order, scale_factor) +{ + create_stream(filename, open_mode); +} + +ProjDataInterfile :: +ProjDataInterfile (shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + const string& filename, const ios::openmode open_mode, + StorageOrder o, + NumericType data_type, + ByteOrder byte_order, + float scale_factor ) + : ProjDataFromStream(exam_info_sptr, proj_data_info_ptr, shared_ptr(), 0, + o, data_type, byte_order, scale_factor) +{ + create_stream(filename, open_mode); +} + + + +END_NAMESPACE_STIR diff --git a/src/buildblock/RegisteredObject.cxx b/src/buildblock/RegisteredObject.cxx new file mode 100644 index 0000000000..147cd44177 --- /dev/null +++ b/src/buildblock/RegisteredObject.cxx @@ -0,0 +1,57 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Instantiations of stir::RegisteredObject + + Currently only necessary for VC 6.0 + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +// note: include has to be before #ifdef as it's in this file that +// __STIR_REGISTRY_NOT_INLINE is defined +#include "stir/RegisteredObject.h" + +#ifdef __STIR_REGISTRY_NOT_INLINE +#pragma message("instantiating RegisteredObject > >") +#include "stir/DataProcessor.h" +#include "stir/DiscretisedDensity.h" + +// add here all roots of hierarchies based on RegisteredObject + +START_NAMESPACE_STIR + +template +RegisteredObject::RegistryType& +RegisteredObject::registry () +{ + static RegistryType the_registry("None", 0); + return the_registry; +} + +template RegisteredObject > >; +// add here all roots of hierarchies based on RegisteredObject + +END_NAMESPACE_STIR + +#endif diff --git a/src/buildblock/RelatedViewgrams.cxx b/src/buildblock/RelatedViewgrams.cxx new file mode 100644 index 0000000000..021ed538f2 --- /dev/null +++ b/src/buildblock/RelatedViewgrams.cxx @@ -0,0 +1,405 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + + \brief Implementations for class stir::RelatedViewgrams + + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/RelatedViewgrams.h" +#include "boost/format.hpp" + +#ifdef _MSC_VER +// disable warning that constructor with PMessage is not implemented +#pragma warning(disable: 4661) +#endif // _MSC_VER + +START_NAMESPACE_STIR + + +// a function which is called internally to see if the object is valid +template +void RelatedViewgrams::debug_check_state() const +{ + // KT 09/03/99 can't use any methods of RelatedViewgrams here, as + // this causes an infinite recursion with check_state + if (viewgrams.size() == 0) + return; + + vector pairs; + symmetries_used->get_related_view_segment_numbers( + pairs, + ViewSegmentNumbers( + viewgrams[0].get_view_num(), + viewgrams[0].get_segment_num() + ) ); + + assert(pairs.size() == viewgrams.size()); + for (unsigned int i=0; i +RelatedViewgrams RelatedViewgrams::get_empty_copy() const +{ + check_state(); + + vector > empty_viewgrams; + empty_viewgrams.reserve(viewgrams.size()); + // TODO optimise to get shared proj_data_info_ptr + for (unsigned int i=0; i(empty_viewgrams, + symmetries_used); +} + +template +bool +RelatedViewgrams:: +has_same_characteristics(self_type const& other, + string& explanation) const +{ + using boost::format; + using boost::str; + + if (*this->get_proj_data_info_ptr() != + *other.get_proj_data_info_ptr()) + { + explanation = + str(format("Differing projection data info:\n%1%\n-------- vs-------\n %2%") + % this->get_proj_data_info_ptr()->parameter_info() + % other.get_proj_data_info_ptr()->parameter_info() + ); + return false; + } + if (*this->get_symmetries_ptr() != + *other.get_symmetries_ptr()) + { + explanation = + str(format("Differing symmetries") + ); + return false; + } + if (this->get_basic_view_num() != + other.get_basic_view_num()) + { + explanation = + str(format("Differing basic view number: %1% vs %2%") + % this->get_basic_view_num() + % other.get_basic_view_num() + ); + return false; + } + if (this->get_basic_segment_num() != + other.get_basic_segment_num()) + { + explanation = + str(format("Differing basic segment number: %1% vs %2%") + % this->get_basic_segment_num() + % other.get_basic_segment_num() + ); + return false; + } + return true; +} + +template +bool +RelatedViewgrams:: +has_same_characteristics(self_type const& other) const +{ + std::string explanation; + return this->has_same_characteristics(other, explanation); +} + +template +bool +RelatedViewgrams:: +operator ==(const self_type& that) const +{ + return + this->has_same_characteristics(that) && + std::equal(this->begin(), this->end(), that.begin()); +} + +template +bool +RelatedViewgrams:: +operator !=(const self_type& that) const +{ + return !((*this) == that); +} + +/*! \warning: this uses multiplication according to elemT (careful for overflow for integer types!) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator*= (const elemT f) +{ + for (iterator iter = begin(); iter != end(); ++iter) + *iter *= f; + return *this; +} + +/*! \warning: this uses division according to elemT (i.e. no rounding or so) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator/= (const elemT f) +{ + assert(f!=0); + + for (iterator iter = begin(); iter != end(); ++iter) + *iter /= f; + return *this; +} + +/*! \warning: this uses addition according to elemT (careful with overflow with integer types!) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator+= (const elemT f) +{ + for (iterator iter = begin(); iter != end(); ++iter) + *iter += f; + return *this; +} + +/*! \warning: this uses subtraction according to elemT (careful with unsigned types!) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator-= (const elemT f) +{ + for (iterator iter = begin(); iter != end(); ++iter) + *iter -= f; + return *this; +} + + +/*! \warning: this uses multiplication according to elemT (careful for overflow for integer types!) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator*= (const RelatedViewgrams& arg) +{ + assert(get_num_viewgrams() == arg.get_num_viewgrams()); + iterator iter = begin(); + const_iterator arg_iter = arg.begin(); + for ( ; iter != end(); ++iter, ++arg_iter) + *iter *= *arg_iter; + return *this; +} + +/*! \warning: this uses division according to elemT (i.e. no rounding or so) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator/= (const RelatedViewgrams& arg) +{ + assert(get_num_viewgrams() == arg.get_num_viewgrams()); + iterator iter = begin(); + const_iterator arg_iter = arg.begin(); + for ( ; iter != end(); ++iter, ++arg_iter) + *iter /= *arg_iter; + return *this; +} + + +/*! \warning: this uses addition according to elemT (careful with overflow with integer types!) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator+= (const RelatedViewgrams& arg) +{ + assert(get_num_viewgrams() == arg.get_num_viewgrams()); + iterator iter = begin(); + const_iterator arg_iter = arg.begin(); + for ( ; iter != end(); ++iter, ++arg_iter) + *iter += *arg_iter; + return *this; +} + +/*! \warning: this uses subtraction according to elemT (careful with unsigned types!) */ +template +RelatedViewgrams& +RelatedViewgrams:: +operator-= (const RelatedViewgrams& arg) +{ + assert(get_num_viewgrams() == arg.get_num_viewgrams()); + iterator iter = begin(); + const_iterator arg_iter = arg.begin(); + for ( ; iter != end(); ++iter, ++arg_iter) + *iter -= *arg_iter; + return *this; +} + + + +template +elemT +RelatedViewgrams:: +find_max() const +{ + Array<1,elemT> max_per_viewgram(get_num_viewgrams()); + typename Array<1,elemT>::iterator max_iter = max_per_viewgram.begin(); + const_iterator iter = begin(); + while (iter != end()) + { + *max_iter = iter->find_max(); + ++iter; ++ max_iter; + } + return max_per_viewgram.find_max(); +} + +template +elemT +RelatedViewgrams:: +find_min() const +{ + Array<1,elemT> min_per_viewgram(get_num_viewgrams()); + typename Array<1,elemT>::iterator min_iter = min_per_viewgram.begin(); + const_iterator iter = begin(); + while (iter != end()) + { + *min_iter = iter->find_min(); + ++iter; ++ min_iter; + } + return min_per_viewgram.find_min(); +} + + +template +void +RelatedViewgrams::fill(const elemT &n) +{ + for (iterator iter = begin(); iter != end(); ++iter) + iter->fill(n); +} + +/*! + This function is necessary because it modifies the size of + each viewgram sequentially. This is not allowed by an external + function, and leads to different proj_data_info_ptrs anyway. + So, it would be caught by an assert at some point. + */ +template +void RelatedViewgrams:: +grow(const IndexRange<2>& range) +{ + check_state(); + + if (begin()==end()) + return; + + if (range == begin()->get_index_range()) + return; + + assert(range.is_regular()==true); + + // first construct a new appropriate ProjDataInfo object + + const int ax_min = range.get_min_index(); + const int ax_max = range.get_max_index(); + + shared_ptr pdi_ptr(get_proj_data_info_ptr()->clone()); + + // set axial_pos range for all segments + for (const_iterator iter= begin(); + iter != end(); + ++iter) + { + pdi_ptr->set_min_axial_pos_num(ax_min, iter->get_segment_num()); + pdi_ptr->set_max_axial_pos_num(ax_max, iter->get_segment_num()); + } + pdi_ptr->set_min_tangential_pos_num(range[ax_min].get_min_index()); + pdi_ptr->set_max_tangential_pos_num(range[ax_min].get_max_index()); + shared_ptr pdi_shared_ptr = pdi_ptr; + + // now resize each viewgram + // this will not set their respective proj_data_info_ptr correctly though, + // so, we have to construct new viewgrams for this + for (iterator iter= begin(); + iter != end(); + ++iter) + { + iter->grow(range); + *iter = Viewgram(*iter, pdi_shared_ptr, + iter->get_view_num(), iter->get_segment_num()); + } + + check_state(); +} +/* + TODO +#include "stir/zoom.h" + +template +void RelatedViewgrams::zoom(const float zoom, const float Xoffp, const float Yoffp, + const int size, const float itophi) +{ + check_state(); + + for (vector::iterator iter= viewgrams.begin(); + iter != viewgrams.end(); + iter++) + zoom_viewgram((*iter), zoom, Xoffp, Yoffp, size, itophi); + + check_state(); +} +*/ +/* +template +void RelatedViewgrams::grow_num_bins(const int new_min_bin_num, + const int new_max_bin_num) +{ + for (vector::iterator iter= viewgrams.begin(); + iter != viewgrams.end(); + iter++) + (*iter).grow_width(new_min_bin_num, new_max_bin_num); +} +*/ + +/************************************* + instantiations + *************************************/ + +template class RelatedViewgrams; + +END_NAMESPACE_STIR diff --git a/src/buildblock/SSRB.cxx b/src/buildblock/SSRB.cxx new file mode 100644 index 0000000000..f47107b6c0 --- /dev/null +++ b/src/buildblock/SSRB.cxx @@ -0,0 +1,323 @@ +// +// +/* + Copyright (C) 2002- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup projdata + \brief Implementation of stir::SSRB + + \author Kris Thielemans + +*/ +#include "stir/ProjDataFromStream.h" +#include "stir/ProjDataInterfile.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/SSRB.h" +#include "stir/Sinogram.h" +#include "stir/Bin.h" +#include "stir/round.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::fstream; +using std::min; +using std::max; +#endif + +START_NAMESPACE_STIR + +// TODO this function needs work to reliable handle segments with unequal 'num_segments_to_combine' (as GE Advance) +// parts with 'num_segments_to_combine' should be revised, all the rest is fine +ProjDataInfo * +SSRB(const ProjDataInfo& in_proj_data_info, + const int num_segments_to_combine, + const int num_views_to_combine, + const int num_tang_poss_to_trim, + const int max_in_segment_num_to_process_argument + ) +{ + if (num_segments_to_combine%2==0) + error("SSRB: num_segments_to_combine (%d) needs to be odd\n", + num_segments_to_combine); + const int max_in_segment_num_to_process = + max_in_segment_num_to_process_argument >= 0 + ? max_in_segment_num_to_process_argument + : in_proj_data_info.get_max_segment_num(); + + if (in_proj_data_info.get_max_segment_num() < max_in_segment_num_to_process) + error("SSRB: max_in_segment_num_to_process (%d) is too large\n" + "Input data has maximum segment number %d.", + max_in_segment_num_to_process, + in_proj_data_info.get_max_segment_num()); + if (in_proj_data_info.get_num_tangential_poss() <= + num_tang_poss_to_trim) + error("SSRB: too large number of tangential positions to trim (%d)\n", + num_tang_poss_to_trim); + const ProjDataInfoCylindrical * const in_proj_data_info_ptr = + dynamic_cast + (&in_proj_data_info); + if (in_proj_data_info_ptr== NULL) + { + error("SSRB works only on segments with proj_data_info of " + "type ProjDataInfoCylindrical\n"); + } + ProjDataInfoCylindrical * out_proj_data_info_ptr = + dynamic_cast + (in_proj_data_info_ptr->clone()); + + out_proj_data_info_ptr-> + set_num_views( + in_proj_data_info.get_num_views()/ + num_views_to_combine); + out_proj_data_info_ptr-> + set_num_tangential_poss(in_proj_data_info.get_num_tangential_poss() - + num_tang_poss_to_trim); + + // Find new maximum segment_num + // To understand this formula, check how the out_segment_num is related to + // the in_segment_num below + const int out_max_segment_num = + ((max_in_segment_num_to_process == -1 + ? in_proj_data_info.get_max_segment_num() + : max_in_segment_num_to_process + )-(num_segments_to_combine/2))/num_segments_to_combine; + if (out_max_segment_num <0) + error("SSRB: max_in_segment_num_to_process %d is too small. No output segments\n", + max_in_segment_num_to_process); + + const int in_axial_compression = + in_proj_data_info_ptr->get_max_ring_difference(0) - + in_proj_data_info_ptr->get_min_ring_difference(0) + + 1; + + out_proj_data_info_ptr->reduce_segment_range(-out_max_segment_num,out_max_segment_num); + for (int out_segment_num = -out_max_segment_num; + out_segment_num <= out_max_segment_num; + ++out_segment_num) + { + const int in_min_segment_num = out_segment_num*num_segments_to_combine - num_segments_to_combine/2; + const int in_max_segment_num = out_segment_num*num_segments_to_combine + num_segments_to_combine/2; + out_proj_data_info_ptr-> + set_min_ring_difference(in_proj_data_info_ptr->get_min_ring_difference(in_min_segment_num), + out_segment_num); + out_proj_data_info_ptr-> + set_max_ring_difference(in_proj_data_info_ptr->get_max_ring_difference(in_max_segment_num), + out_segment_num); + + out_proj_data_info_ptr-> + set_min_axial_pos_num(0,out_segment_num); + + // find number of axial_poss in out_segment + // get_m could be replaced by get_t + { + float min_m =1.E37F; + float max_m =-1.E37F; + for (int in_segment_num = in_min_segment_num; + in_segment_num <= in_max_segment_num; + ++in_segment_num) + { + if (in_axial_compression != + (in_proj_data_info_ptr->get_max_ring_difference(in_segment_num) - + in_proj_data_info_ptr->get_min_ring_difference(in_segment_num) + + 1)) + warning("SSRB: in_proj_data_info with non-identical axial compression for all segments.\n" + "That's ok, but results might not be what you expect.\n"); + + min_m = + min(min_m, + in_proj_data_info_ptr-> + get_m(Bin(in_segment_num,0,in_proj_data_info_ptr->get_min_axial_pos_num(in_segment_num), 0))); + max_m = + max(max_m, + in_proj_data_info_ptr-> + get_m(Bin(in_segment_num,0,in_proj_data_info_ptr->get_max_axial_pos_num(in_segment_num), 0))); + } + const float number_of_ms = + (max_m - min_m)/out_proj_data_info_ptr->get_axial_sampling(out_segment_num)+1; + if (fabs(round(number_of_ms)-number_of_ms) > 1.E-3) + error("SSRB: number of axial positions to be found in out_segment %d is non-integer %g\n", + out_segment_num, number_of_ms); + out_proj_data_info_ptr-> + set_max_axial_pos_num(round(number_of_ms) - 1, + out_segment_num); + } + } + return out_proj_data_info_ptr; +} + +void +SSRB(const string& output_filename, + const ProjData& in_proj_data, + const int num_segments_to_combine, + const int num_views_to_combine, + const int num_tang_poss_to_trim, + const bool do_norm, + const int max_in_segment_num_to_process + ) +{ + shared_ptr out_proj_data_info_ptr( + SSRB(*in_proj_data.get_proj_data_info_ptr(), + num_segments_to_combine, + num_views_to_combine, + num_tang_poss_to_trim, + max_in_segment_num_to_process + )); + ProjDataInterfile out_proj_data(in_proj_data.get_exam_info_sptr(), + out_proj_data_info_ptr, output_filename, std::ios::out); + + SSRB(out_proj_data, in_proj_data, do_norm); +} + +void +SSRB(ProjData& out_proj_data, + const ProjData& in_proj_data, + const bool do_norm + ) +{ + const ProjDataInfoCylindrical * const in_proj_data_info_ptr = + dynamic_cast + (in_proj_data.get_proj_data_info_ptr()); + if (in_proj_data_info_ptr== NULL) + { + error("SSRB works only on segments with proj_data_info of " + "type ProjDataInfoCylindrical\n"); + } + const ProjDataInfoCylindrical * const out_proj_data_info_ptr = + dynamic_cast + (out_proj_data.get_proj_data_info_ptr()); + if (out_proj_data_info_ptr== NULL) + { + error("SSRB works only on segments with proj_data_info of " + "type ProjDataInfoCylindrical\n"); + } + + const int num_views_to_combine = + in_proj_data.get_num_views()/ out_proj_data.get_num_views(); + + + if (in_proj_data.get_min_view_num()!=0 || out_proj_data.get_min_view_num()!=0) + error ("SSRB can only mash views when min_view_num==0\n"); + if (in_proj_data.get_num_views() % out_proj_data.get_num_views()) + error ("SSRB can only mash views when out_num_views divides in_num_views\n"); + + for (int out_segment_num = out_proj_data.get_min_segment_num(); + out_segment_num <= out_proj_data.get_max_segment_num(); + ++out_segment_num) + { + // find range of input segments that fit in the current output segment + int in_min_segment_num = in_proj_data.get_max_segment_num(); + int in_max_segment_num = in_proj_data.get_min_segment_num(); + { + // this the only place where we need ProjDataInfoCylindrical + // Presumably for other types, there'd be something equivalent (say range of theta) + const int out_min_ring_diff = + out_proj_data_info_ptr->get_min_ring_difference(out_segment_num); + const int out_max_ring_diff = + out_proj_data_info_ptr->get_max_ring_difference(out_segment_num); + for (int in_segment_num = in_proj_data.get_min_segment_num(); + in_segment_num <= in_proj_data.get_max_segment_num(); + ++in_segment_num) + { + const int in_min_ring_diff = + in_proj_data_info_ptr->get_min_ring_difference(in_segment_num); + const int in_max_ring_diff = + in_proj_data_info_ptr->get_max_ring_difference(in_segment_num); + if (in_min_ring_diff >= out_min_ring_diff && + in_max_ring_diff <= out_max_ring_diff) + { + // it's a in_segment that should be rebinned in the out_segment + if (in_min_segment_num > in_segment_num) + in_min_segment_num = in_segment_num; + if (in_max_segment_num < in_segment_num) + in_max_segment_num = in_segment_num; + } + else if (in_min_ring_diff > out_max_ring_diff || + in_max_ring_diff < out_min_ring_diff) + { + // this one is outside the range of the out_segment + } + else + { + error("SSRB called with in and out ring difference ranges that overlap:\n" + "in_segment %d has ring diffs (%d,%d)\n" + "out_segment %d has ring diffs (%d,%d)\n", + in_segment_num, in_min_ring_diff, in_max_ring_diff, + in_segment_num, out_min_ring_diff, out_max_ring_diff); + } + } + + // keep sinograms out of the loop to avoid reallocations + // initialise to something because there's no default constructor + Sinogram out_sino = + out_proj_data.get_empty_sinogram(out_proj_data.get_min_axial_pos_num(out_segment_num),out_segment_num); + Sinogram in_sino = + in_proj_data.get_empty_sinogram(in_proj_data.get_min_axial_pos_num(out_segment_num),out_segment_num); + + for (int out_ax_pos_num = out_proj_data.get_min_axial_pos_num(out_segment_num); + out_ax_pos_num <= out_proj_data.get_max_axial_pos_num(out_segment_num); + ++out_ax_pos_num ) + { + out_sino= out_proj_data.get_empty_sinogram(out_ax_pos_num, out_segment_num); + // get_m could be replaced by get_t + const float out_m = out_proj_data_info_ptr->get_m(Bin(out_segment_num,0, out_ax_pos_num, 0)); + + unsigned int num_in_ax_pos = 0; + + for (int in_segment_num = in_min_segment_num; + in_segment_num <= in_max_segment_num; + ++in_segment_num) + for (int in_ax_pos_num = in_proj_data.get_min_axial_pos_num(in_segment_num); + in_ax_pos_num <= in_proj_data.get_max_axial_pos_num(in_segment_num); + ++in_ax_pos_num ) + { + const float in_m = in_proj_data_info_ptr->get_m(Bin(in_segment_num,0, in_ax_pos_num, 0)); + if (fabs(out_m - in_m) < 1E-4) + { + ++num_in_ax_pos; + + in_sino = in_proj_data.get_sinogram(in_ax_pos_num, in_segment_num); + for (int in_view_num=in_proj_data.get_min_view_num(); + in_view_num <= in_proj_data.get_max_view_num(); + ++in_view_num) + for (int tangential_pos_num= + max(in_proj_data.get_min_tangential_pos_num(), + out_proj_data.get_min_tangential_pos_num()); + tangential_pos_num <= + min(in_proj_data.get_max_tangential_pos_num(), + out_proj_data.get_max_tangential_pos_num()); + ++tangential_pos_num) + out_sino[in_view_num/num_views_to_combine][tangential_pos_num] += + in_sino[in_view_num][tangential_pos_num]; + + break; // out of loop over ax_pos as we found where to put it + } + } + if (do_norm && num_in_ax_pos!=0) + out_sino /= static_cast(num_in_ax_pos*num_views_to_combine); + if (num_in_ax_pos==0) + warning("SSRB: no sinograms contributing to output segment %d, ax_pos %d\n", + out_segment_num, out_ax_pos_num); + + out_proj_data.set_sinogram(out_sino); + } + } + } +} +END_NAMESPACE_STIR diff --git a/src/buildblock/Scanner.cxx b/src/buildblock/Scanner.cxx new file mode 100644 index 0000000000..4f546bcf7c --- /dev/null +++ b/src/buildblock/Scanner.cxx @@ -0,0 +1,994 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2010-07-21, Hammersmith Imanet Ltd + Copyright (C) 2011, Kris Thielemans + Copyright (C) 2010-2013, King's College London + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup buildblock + + \brief Implementations for class stir::Scanner + + \author Charalampos Tsoumpas + \author Sanida Mustafovic + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project +*/ + +#include "stir/Scanner.h" +#include "stir/utilities.h" +#include "stir/Succeeded.h" +#include "stir/interfile_keyword_functions.h" +#include +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::cout; +using std::endl; +using std::cin; +#endif + +START_NAMESPACE_STIR + +// local convenience functions to make a list of strings +static list + string_list(const string&); +static list + string_list(const string&, const string&); +static list + string_list(const string&, const string&, const string&); +static list + string_list(const string&, const string&, const string&, const string&); + + + + + +Scanner::Scanner(Type scanner_type) +{ + + // set_params parameters: + // + // Type type_v, + // const list& list_of_names_v, + // + // int num_rings_v, + // int max_num_non_arccorrected_bins_v, + // (optional) int default_num_arccorrected_bins_v, + // int num_detectors_per_ring_v, + // + // float inner_ring_radius_v, + // float average_depth_of_interaction_v, + // float ring_spacing_v, + // float bin_size_v, + // float intrinsic_tilt_v, + // + // int num_axial_blocks_per_bucket_v, + // int num_transaxial_blocks_per_bucket_v, + // int num_axial_crystals_per_block_v, + // int num_transaxial_crystals_per_block_v, + // int num_axial_crystals_per_singles_unit_v, + // int num_transaxial_crystals_per_singles_unit_v, + // int num_detector_layers_v + // + + + /* for CTI scanners (at least upto 966): + + before arc-correction, central_bin_size ~= ring_radius* pi/num_detectors + num_transaxial_crystals_per_singles_unit= + transaxial_blocks_per_bucket*transaxial_crystals_per_block + + num_axial_crystals_per_singles_unit= + axial_crystals_per_block * x + where x=1 except for the 966 where x=2 + */ + + + switch ( scanner_type ) { + + case E931: + + // KT 25/01/2002 corrected ring_spacing + set_params(E931, string_list("ECAT 931"), + 8, 192, 2 * 256, + 510.0F, 7.0F, 13.5F, 3.129F, 0.0F, + 2, 4, 4, 8, 4, 8 * 4, 1); + // 16 BUCKETS per ring in TWO rings - i.e. 32 buckets in total + + break; + + case E951: + + set_params(E951, string_list("ECAT 951"), + 16, 192, 2 * 256, + 510.0F, 7.0F, 6.75F, 3.12932F, 0.0F, + 1, 4, 8, 8, 8, 8 * 4, 1); + break; + + case E953: + + set_params(E953, string_list("ECAT 953"), + 16, 160, 2 * 192, + 382.5F, 7.0F, 6.75F, 3.12932F, static_cast(15.*_PI/180), + 1, 4, 8, 8, 8, 8 * 4, 1); + break; + + case E921: + + set_params(E921, string_list("ECAT 921", "ECAT EXACT", "EXACT"), + 24, 192, 2* 192, + 412.5F, 7.0F, 6.75F, 3.375F, static_cast(15.*_PI/180), + 1, 4, 8, 8, 8, 8 * 4, 1); + break; + + case E925: + + set_params(E925, string_list("ECAT 925", "ECAT ART"), + 24, 192, 2* 192, + 412.5F, 7.0F, 6.75F, 3.375F, static_cast(15.*_PI/180), + 3, 4, 8, 8, 8, 8 * 4, 1); + break; + + + case E961: + + set_params(E961,string_list("ECAT 961", "ECAT HR"), + 24, 336, 2* 392, + 412.0F, 7.0F, 6.25F, 1.650F, static_cast(13.*_PI/180), + 1, 8, 8, 7, 8, 7 * 8, 1); + break; + + case E962: + + set_params(E962,string_list("ECAT 962","ECAT HR+"), + 32, 288, 2* 288, + 412.0F, 7.0F, 4.85F, 2.25F, 0.0F, + 4, 3, 8, 8, 8, 8 * 3, 1); + break; + + case E966: + + set_params(E966, string_list("ECAT EXACT 3D", "EXACT 3D", "ECAT HR++","ECAT 966"), + 48, 288, 2* 288, + 412.0F, 7.0F, 4.850F, 2.250F, 0.0, + 6, 2, 8, 8, 2 * 8, 8 * 2, 1); + break; + + case E1080: + // data added by Robert Barnett, Westmead Hospital, Sydney + set_params(E1080, string_list("ECAT 1080", "Biograph 16", "1080"), + 41, 336, 2* 336, + 412.0F, 7.0F, 4.0F, 2.000F, 0.0F, + 1, 2, 41, 14, 41, 14, 1); + // Transaxial blocks have 13 physical crystals and a gap at the + // 140th crystal where the counts are zero. + // There are 39 rings with 13 axial crystals per block. Two virtual + // rings are added, but contain counts after applying axial compression. + break; + + case Siemens_mMR: + // 8x8 blocks, 1 virtual "crystal", 56 blocks along the ring, 8 blocks in axial direction + // Transaxial blocks have 8 physical crystals and a gap at the + // 9th crystal where the counts are zero. + set_params(Siemens_mMR, string_list("Siemens mMR", "mMR", "2008"), + 64, 344, 2* 252, + 328.0F, 7.0F, 4.0625F, 2.08626F, 0.0F, + 2, 1, 8, 9, 16, 9, 1 ); // TODO bucket/singles info incorrect? 224 buckets in total, but not sure how distributed + break; + + case RPT: + + set_params(RPT, string_list("PRT-1", "RPT"), + 16, 128, 2 * 192, + 380.0F - 7.0F, 7.0F, 6.75F, 3.1088F, 0.0F, + 1, 4, 8, 8, 8, 32, 1); + + // Default 7.0mm average interaction depth. + // This 7mm taken off the inner ring radius so that the effective radius remains 380mm + break; + + case RATPET: + + set_params(RATPET, string_list("RATPET"), + 8, 56, 2 * 56, + 115 / 2.F, 7.0F, 6.25F, 1.65F, 0.0F, + 1, 16, 8, 7, 8, 0, 1); // HR block, 4 buckets per ring + + // Default 7.0mm average interaction depth. + // 8 x 0 crystals per singles unit because not known + // although likely transaxial_blocks_per_bucket*transaxial_crystals_per_block + break; + + case PANDA: + + set_params(PANDA, string_list("PANDA"), + 1 /*NumRings*/, 512 /*MaxBinsNonArcCor*/, 512 /*MaxBinsArcCor*/, 2048 /*NumDetPerRing*/, + /*MeanInnerRadius*/ 75.5/2.F, /*AverageDoI*/ 10.F, /*Ring Spacing*/ 3.F, /*BinSize*/ 0.1F, /*IntrinsicTilt*/ 0.F, + 1, 1, 1, 1, 0, 0, 1); + break; + + case nanoPET: + + set_params(nanoPET, string_list("nanoPET"), /*Modelling the gap with one fake crystal */ + 81, 39*3, /* We could also model gaps in the future as one detector so 39->39+1, while 1 (point source), 3 (mouse) or 5 (rats) */ + 39*3, /* Just put the same with NonArcCor for now*/ + 12 * 39, 174.F, 5.0F, 1.17F, 1.17F, /* Actual size is 1.12 and 0.05 is the thickness of the optical reflector */ 0.0F, /* not sure for this */ + 0,0,0,0,0,0, 1); + break; + + case HYPERimage: + + set_params(HYPERimage, string_list("HYPERimage"), /*Modelling the gap with one fake crystal */ + 22, 239, 245, + 490, 103.97F, 3.0F, 1.4F, 1.4F, /* Actual size is 1.3667 and assume 0.0333 is the thickness of the optical reflector */ 0.F, + 0,0,0,0,0,0,1); + break; + + + case Advance: + + // 283 bins (non-uniform sampling) + // 281 bins (uniform sampling) + /* crystal size 4x8x30*/ + set_params(Advance, string_list("GE Advance", "Advance"), + 18, 283, 281, 2 * 336, + 471.875F - 8.4F, 8.4F, 8.5F, 1.970177F, 0.0F, //TODO view offset shouldn't be zero + 3, 2, 6, 6, 1, 1, 1); + break; + + case DiscoveryLS: + // identical to Advance + set_params(DiscoveryLS, string_list("GE Discovery LS", "Discovery LS"), + 18, 283, 281, 2 * 336, + 471.875F - 8.4F, 8.4F, 8.5F, 1.970177F, 0.0F, //TODO view offset shouldn't be zero + 3, 2, 6, 6, 1, 1, 1); + break; + case DiscoveryST: + + // 249 bins (non-uniform sampling) + // 221 bins (uniform sampling) + /* crystal size: 6.3 x 6.3 x 30 mm*/ + set_params(DiscoveryST, string_list("GE Discovery ST", "Discovery ST"), + 24, 249, 221, 2 * 210, + 886.2F/2.F, 8.4F, 6.54F, 3.195F, + static_cast(-4.54224*_PI/180),//sign? + 4, 2, 6, 6, 1, 1, 1);// TODO not sure about sign of view_offset + break; + + case DiscoverySTE: + + set_params(DiscoverySTE, string_list("GE Discovery STE", "Discovery STE"), + 24, 329, 293, 2 * 280, + 886.2F/2.F, 8.4F, 6.54F, 2.397F, + static_cast(-4.5490*_PI/180),//sign? + 4, 2, 6, 8, 1, 1, 1);// TODO not sure about sign of view_offset + break; + + case DiscoveryRX: + + set_params(DiscoveryRX, string_list("GE Discovery RX", "Discovery RX"), + 24, + 367, + 331, + 2 * 315, + 886.2F/2.F, + 9.4F, + 6.54F, 2.13F, + static_cast(-4.5950*_PI/180),//sign? + 4, + 2, + 6, 9, 1, 1, 1);// TODO not sure about sign of view_offset + break; + + case Discovery600: + + set_params(Discovery600, string_list("GE Discovery 600", "Discovery 600"), + 24, + 339, + 293, // TODO + 2 * 256, + 826.70F/2.F - 8.4F, + 8.4F, + 6.54F, + 2.3974F, + static_cast(-4.5490*_PI/180),//sign? TODO value + 4, + 2, + 6, 8, 1, 1, 1); + break; + + case HZLR: + + set_params(HZLR, string_list("Positron HZL/R"), + 32, 256, 2 * 192, + 780.0F, 7.0F, 5.1875F, 2.F, 0.0F, + 0, 0, 0, 0, 0,0, 1); + // Default 7.0mm average interaction depth. + // crystals per singles unit etc unknown + break; + + case HRRT: + + set_params(HRRT, string_list("HRRT"), + 104, 288, 2 * 288, + 234.765F, 7.0F, 2.4375F, 1.21875F, 0.0F, + 0, 0, 0, 0, 0, 0, 2); // added by Dylan Togane + // warning: used 7.0mm average interaction depth. + // crystals per singles unit etc unknown + break; + + case Allegro: + + /* + The following info is partially from + + Journal of Nuclear Medicine Vol. 45 No. 6 1040-1049 + Imaging Characteristics of a 3-Dimensional GSO Whole-Body PET Camera + Suleman Surti, PhD and Joel S. Karp, PhD + http://jnm.snmjournals.org/cgi/content/full/45/6/1040 + + Other info is from Ralph Brinks (Philips Research Lab, Aachen). + + The Allegro scanner is comprised of 28 flat modules of a 22 x 29 array + of 4 x 6 x 20 mm3 GSO crystals. The output sinograms however consist + of 23 x 29 logical crystals per module. + This creates problems for the current version of STIR as the current + Scanner object does not support does. At present, KT put the + transaxial info on crystals to 0. + For 662keV photons the mean positron range in GSO is about 14 mm, + so we put in 12mm for 511 keV, but we don't really know. + Ralph Brinks things there is only one singles rate for the whole + scanner. + */ + set_params(Allegro,string_list("Allegro", "Philips Allegro"), + 29, 295, 28*23, + 430.05F, 12.F, + 6.3F, 4.3F, 0.0F, + 1, 0, + 29, 0 /* 23* or 22*/, + 29, 0 /* all detectors in a ring? */, + 1); + break; + + case GeminiTF: + set_params(GeminiTF,string_list("GeminiTF", "Philips GeminiTF"), + 44, 322, 287, // Based on GATE output - Normally it is 644 detectors at each of the 44 rings + 322*2, // Actual number of crystals is 644 + 450.17F, 8.F, // DOI is from XXX et al 2008 MIC + 4.F, 4.F, 0.F, + 0, 0, + 0, 0, // Not considering any gap, but this is per module 28 flat modules in total, while 420 PMTs + 0, 0 /* Not sure about these, but shouldn't be important */, + 1); + break; + + case HiDAC: // all of these don't make any sense for the HiDAC + set_params(HiDAC, string_list("HiDAC"), + 0, 0, 0, + 0.F, 0.F, 0.F, 0.F, 0.F, + 0, 0, 0, 0, 0, 0, 0); + + break; + + case User_defined_scanner: // zlong, 08-04-2004, Userdefined support + + set_params(User_defined_scanner, string_list("Userdefined"), + 0, 0, 0, + 0.F, 0.F, 0.F, 0.F, 0.F, + 0, 0, 0, 0, 0, 0, 0); + + break; + + default: + // warning("Unknown scanner type used for initialisation of Scanner\n"); + set_params(Unknown_scanner, string_list("Unknown"), + 0, 0, 0, + 0.F, 0.F, 0.F, 0.F, 0.F, + 0, 0, 0, 0, 0, 0, 0); + + break; + + } + +} + + +Scanner::Scanner(Type type_v, const list& list_of_names_v, + int num_detectors_per_ring_v, int num_rings_v, + int max_num_non_arccorrected_bins_v, + int default_num_arccorrected_bins_v, + float inner_ring_radius_v, float average_depth_of_interaction_v, + float ring_spacing_v, float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v) +{ + set_params(type_v, list_of_names_v, num_rings_v, + max_num_non_arccorrected_bins_v, + default_num_arccorrected_bins_v, + num_detectors_per_ring_v, + inner_ring_radius_v, + average_depth_of_interaction_v, + ring_spacing_v, bin_size_v, intrinsic_tilt_v, + num_axial_blocks_per_bucket_v, num_transaxial_blocks_per_bucket_v, + num_axial_crystals_per_block_v, num_transaxial_crystals_per_block_v, + num_axial_crystals_per_singles_unit_v, + num_transaxial_crystals_per_singles_unit_v, + num_detector_layers_v); +} + + + +Scanner::Scanner(Type type_v, const string& name, + int num_detectors_per_ring_v, int num_rings_v, + int max_num_non_arccorrected_bins_v, + int default_num_arccorrected_bins_v, + float inner_ring_radius_v, float average_depth_of_interaction_v, + float ring_spacing_v, float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v) +{ + set_params(type_v, string_list(name), num_rings_v, + max_num_non_arccorrected_bins_v, + default_num_arccorrected_bins_v, + num_detectors_per_ring_v, + inner_ring_radius_v, + average_depth_of_interaction_v, + ring_spacing_v, bin_size_v, intrinsic_tilt_v, + num_axial_blocks_per_bucket_v, num_transaxial_blocks_per_bucket_v, + num_axial_crystals_per_block_v, num_transaxial_crystals_per_block_v, + num_axial_crystals_per_singles_unit_v, + num_transaxial_crystals_per_singles_unit_v, + num_detector_layers_v); +} + + + + + + + +void +Scanner:: +set_params(Type type_v,const list& list_of_names_v, + int num_rings_v, + int max_num_non_arccorrected_bins_v, + int num_detectors_per_ring_v, + float inner_ring_radius_v, + float average_depth_of_interaction_v, + float ring_spacing_v, + float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v) +{ + set_params(type_v, list_of_names_v, num_rings_v, + max_num_non_arccorrected_bins_v, + max_num_non_arccorrected_bins_v, + num_detectors_per_ring_v, + inner_ring_radius_v, + average_depth_of_interaction_v, + ring_spacing_v, bin_size_v, intrinsic_tilt_v, + num_axial_blocks_per_bucket_v, num_transaxial_blocks_per_bucket_v, + num_axial_crystals_per_block_v, num_transaxial_crystals_per_block_v, + num_axial_crystals_per_singles_unit_v, + num_transaxial_crystals_per_singles_unit_v, + num_detector_layers_v); +} + + +void +Scanner:: +set_params(Type type_v,const list& list_of_names_v, + int num_rings_v, + int max_num_non_arccorrected_bins_v, + int default_num_arccorrected_bins_v, + int num_detectors_per_ring_v, + float inner_ring_radius_v, + float average_depth_of_interaction_v, + float ring_spacing_v, + float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v) +{ + type = type_v; + list_of_names = list_of_names_v; + num_rings = num_rings_v; + max_num_non_arccorrected_bins = max_num_non_arccorrected_bins_v; + default_num_arccorrected_bins = default_num_arccorrected_bins_v; + num_detectors_per_ring = num_detectors_per_ring_v; + inner_ring_radius = inner_ring_radius_v; + average_depth_of_interaction = average_depth_of_interaction_v; + ring_spacing = ring_spacing_v; + bin_size = bin_size_v; + intrinsic_tilt = intrinsic_tilt_v; + num_transaxial_blocks_per_bucket = num_transaxial_blocks_per_bucket_v; + num_axial_blocks_per_bucket = num_axial_blocks_per_bucket_v; + num_axial_crystals_per_block= num_axial_crystals_per_block_v; + num_transaxial_crystals_per_block= num_transaxial_crystals_per_block_v; + num_axial_crystals_per_singles_unit = num_axial_crystals_per_singles_unit_v; + num_transaxial_crystals_per_singles_unit = num_transaxial_crystals_per_singles_unit_v; + num_detector_layers = num_detector_layers_v; + +} + + + +Succeeded +Scanner:: +check_consistency() const +{ + if (intrinsic_tilt<-_PI || intrinsic_tilt>_PI) + warning("Scanner %s: intrinsic_tilt is very large. maybe it's in degrees (but should be in radians)", + this->get_name().c_str()); + + { + if (get_num_transaxial_crystals_per_block() <= 0 || + get_num_transaxial_blocks() <= 0) + warning("Scanner %s: transaxial block info is not set", + this->get_name().c_str()); + else + { + const int dets_per_ring = + get_num_transaxial_blocks() * + get_num_transaxial_crystals_per_block(); + if ( dets_per_ring != get_num_detectors_per_ring()) + { + warning("Scanner %s: inconsistent transaxial block info", + this->get_name().c_str()); + return Succeeded::no; + } + } + } + { + if (get_num_transaxial_blocks_per_bucket() <= 0 || + get_num_transaxial_buckets() <=0) + warning("Scanner %s: transaxial bucket info is not set", + this->get_name().c_str()); + else + { + const int blocks_per_ring = + get_num_transaxial_buckets() * + get_num_transaxial_blocks_per_bucket(); + if ( blocks_per_ring != get_num_transaxial_blocks()) + { + warning("Scanner %s: inconsistent transaxial block/bucket info", + this->get_name().c_str()); + return Succeeded::no; + } + } + } + { + if (get_num_axial_crystals_per_block() <= 0 || + get_num_axial_blocks() <=0) + warning("Scanner %s: axial block info is not set", + this->get_name().c_str()); + else + { + const int dets_axial = + get_num_axial_blocks() * + get_num_axial_crystals_per_block(); + if ( dets_axial != get_num_rings()) + { + warning("Scanner %s: inconsistent axial block info", + this->get_name().c_str()); + return Succeeded::no; + } + } + } + { + if (get_num_axial_blocks_per_bucket() <= 0 || + get_num_axial_buckets() <=0) + warning("Scanner %s: axial bucket info is not set", + this->get_name().c_str()); + else + { + const int blocks_axial = + get_num_axial_buckets() * + get_num_axial_blocks_per_bucket(); + if ( blocks_axial != get_num_axial_blocks()) + { + warning("Scanner %s: inconsistent axial block/bucket info", + this->get_name().c_str()); + return Succeeded::no; + } + } + } + // checks on singles units + { + if (get_num_transaxial_crystals_per_singles_unit() <= 0) + warning("Scanner %s: transaxial singles_unit info is not set", + this->get_name().c_str()); + else + { + if ( get_num_detectors_per_ring() % get_num_transaxial_crystals_per_singles_unit() != 0) + { + warning("Scanner %s: inconsistent transaxial singles unit info:\n" + "\tnum_detectors_per_ring %d should be a multiple of num_transaxial_crystals_per_singles_unit %d", + this->get_name().c_str(), + get_num_detectors_per_ring(), get_num_transaxial_crystals_per_singles_unit()); + return Succeeded::no; + } + if ( get_num_transaxial_crystals_per_bucket() % get_num_transaxial_crystals_per_singles_unit() != 0) + { + warning("Scanner %s: inconsistent transaxial singles unit info:\n" + "\tnum_transaxial_crystals_per_bucket %d should be a multiple of num_transaxial_crystals_per_singles_unit %d", + this->get_name().c_str(), + get_num_transaxial_crystals_per_bucket(), get_num_transaxial_crystals_per_singles_unit()); + return Succeeded::no; + } + } + } + { + if (get_num_axial_crystals_per_singles_unit() <= 0) + warning("Scanner %s: axial singles_unit info is not set", + this->get_name().c_str()); + else + { + if ( get_num_rings() % get_num_axial_crystals_per_singles_unit() != 0) + { + warning("Scanner %s: inconsistent axial singles unit info:\n" + "\tnum_rings %d should be a multiple of num_axial_crystals_per_singles_unit %d", + this->get_name().c_str(), + get_num_rings(), get_num_axial_crystals_per_singles_unit()); + return Succeeded::no; + } + if ( get_num_axial_crystals_per_bucket() % get_num_axial_crystals_per_singles_unit() != 0) + { + warning("Scanner %s: inconsistent axial singles unit info:\n" + "\tnum_axial_crystals_per_bucket %d should be a multiple of num_axial_crystals_per_singles_unit %d", + this->get_name().c_str(), + get_num_axial_crystals_per_bucket(), get_num_axial_crystals_per_singles_unit()); + return Succeeded::no; + } + } + } + + return Succeeded::yes; +} + + + + + + + +// TODO replace by using boost::floating_point_comparison +bool static close_enough(const double a, const double b) +{ + return fabs(a-b) <= std::min(fabs(a), fabs(b)) * 10E-4; +} + +bool +Scanner::operator ==(const Scanner& scanner) const +{ +// KT 04/02/2003 take floating point rounding into account +return + (num_rings == scanner.num_rings) && + (max_num_non_arccorrected_bins == scanner.max_num_non_arccorrected_bins) && + (default_num_arccorrected_bins == scanner.default_num_arccorrected_bins) && + (num_detectors_per_ring == scanner.num_detectors_per_ring) && + close_enough(inner_ring_radius, scanner.inner_ring_radius) && + close_enough(average_depth_of_interaction, scanner.average_depth_of_interaction) && + close_enough(ring_spacing, scanner.ring_spacing) && + close_enough(bin_size,scanner.bin_size) && + close_enough(intrinsic_tilt,scanner.intrinsic_tilt) && + (num_transaxial_blocks_per_bucket == scanner.num_transaxial_blocks_per_bucket) && + (num_axial_blocks_per_bucket == scanner.num_axial_blocks_per_bucket) && + (num_axial_crystals_per_block == scanner.num_axial_crystals_per_block) && + (num_transaxial_crystals_per_block == scanner.num_transaxial_crystals_per_block) && + (num_detector_layers == scanner.num_detector_layers) && + (num_axial_crystals_per_singles_unit == scanner.num_axial_crystals_per_singles_unit) && + (num_transaxial_crystals_per_singles_unit == scanner.num_transaxial_crystals_per_singles_unit); + +} + + +const list& +Scanner::get_all_names() const +{return list_of_names;} + + +const string& +Scanner::get_name() const +{ + + return *(list_of_names.begin()); + +} + +string +Scanner::parameter_info() const +{ + // warning: these should match the parsing keywords in InterfilePDFSHeader +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[10000]; + ostrstream s(str, 10000); +#else + std::ostringstream s; +#endif + s << "Scanner parameters:= "<<'\n'; + + s << "Scanner type := " << get_name() <<'\n'; + + s << "Number of rings := " << num_rings << '\n'; + s << "Number of detectors per ring := " << get_num_detectors_per_ring() << '\n'; + + s << "Inner ring diameter (cm) := " << get_inner_ring_radius()*2./10 << '\n' + << "Average depth of interaction (cm) := " << get_average_depth_of_interaction() / 10 << '\n' + << "Distance between rings (cm) := " << get_ring_spacing()/10 << '\n' + << "Default bin size (cm) := " << get_default_bin_size()/10. << '\n' + << "View offset (degrees) := " << get_default_intrinsic_tilt()*180/_PI << '\n'; + s << "Maximum number of non-arc-corrected bins := " + << get_max_num_non_arccorrected_bins() << '\n' + << "Default number of arc-corrected bins := " + << get_default_num_arccorrected_bins() << '\n'; + + // block/bucket description + s << "Number of blocks per bucket in transaxial direction := " + << get_num_transaxial_blocks_per_bucket() << '\n' + << "Number of blocks per bucket in axial direction := " + << get_num_axial_blocks_per_bucket() << '\n' + << "Number of crystals per block in axial direction := " + << get_num_axial_crystals_per_block() << '\n' + << "Number of crystals per block in transaxial direction := " + << get_num_transaxial_crystals_per_block() << '\n' + << "Number of detector layers := " + << get_num_detector_layers() << '\n' + << "Number of crystals per singles unit in axial direction := " + << get_num_axial_crystals_per_singles_unit() << '\n' + << "Number of crystals per singles unit in transaxial direction := " + << get_num_transaxial_crystals_per_singles_unit() << '\n'; + + s << "end scanner parameters:=\n"; + + return s.str(); +} + +string Scanner::list_names() const +{ +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[3000]; + ostrstream s(str, 3000); +#else + std::ostringstream s; +#endif + +#ifdef _MSC_VER + // work-around VC bug + std:: +#endif + list::const_iterator iterator = list_of_names.begin(); + s << *iterator; + ++iterator; + while(iterator!=list_of_names.end()) + { + s << " , " << *iterator ; + ++iterator; + } + + return s.str(); +} + +/************************************************ + static members + *************************************************/ +Scanner* Scanner::ask_parameters() +{ + + cerr << list_all_names(); + + const string name=ask_string("Enter the name of the scanner"); + + //get the type from the name itself + Scanner* scanner_ptr = + get_scanner_from_name(name); + + if (scanner_ptr->type != Unknown_scanner && scanner_ptr->type != User_defined_scanner) + return scanner_ptr; + + if (scanner_ptr->type == Unknown_scanner) + cerr << "I didn't recognise the scanner you entered."; + cerr << "I'll ask lots of questions\n"; + + while (true) + { + int num_detectors_per_ring = + ask_num("Enter number of detectors per ring:",0,2000,128); + + int NoRings = + ask_num("Enter number of rings :",0,1000,16); + + int NoBins = + ask_num("Enter default number of tangential positions for this scanner: ",0,3000,128); + + float InnerRingRadius= + ask_num("Enter inner ring radius (in mm): ",0.F,600.F,256.F); + + float AverageDepthOfInteraction = + ask_num("Enter average depth of interaction (in mm): ", 0.F, 100.F, 0.F); + + float RingSpacing= + ask_num("Enter ring spacing (in mm): ",0.F,30.F,6.75F); + + float BinSize= + ask_num("Enter default (tangential) bin size after arc-correction (in mm):",0.F,60.F,3.75F); + float intrTilt= + ask_num("Enter intrinsic_tilt (in degrees):",-180.F,360.F,0.F); + int TransBlocksPerBucket = + ask_num("Enter number of transaxial blocks per bucket: ",0,10,2); + int AxialBlocksPerBucket = + ask_num("Enter number of axial blocks per bucket: ",0,10,6); + int AxialCrystalsPerBlock = + ask_num("Enter number of axial crystals per block: ",0,12,8); + int TransaxialCrystalsPerBlock = + ask_num("Enter number of transaxial crystals per block: ",0,12,8); + int AxialCrstalsPerSinglesUnit = + ask_num("Enter number of axial crystals per singles unit: ", 0, NoRings, 1); + int TransaxialCrystalsPerSinglesUnit = + ask_num("Enter number of transaxial crystals per singles unit: ", 0, num_detectors_per_ring, 1); + + + int num_detector_layers = + ask_num("Enter number of detector layers per block: ",1,100,1); + Type type = User_defined_scanner; + + Scanner* scanner_ptr = + new Scanner(type, string_list(name), + num_detectors_per_ring, NoRings, + NoBins, NoBins, + InnerRingRadius, AverageDepthOfInteraction, + RingSpacing, BinSize,intrTilt*float(_PI)/180, + AxialBlocksPerBucket,TransBlocksPerBucket, + AxialCrystalsPerBlock,TransaxialCrystalsPerBlock, + AxialCrstalsPerSinglesUnit, TransaxialCrystalsPerSinglesUnit, + num_detector_layers ); + + if (scanner_ptr->check_consistency()==Succeeded::yes || + !ask("Ask questions again?",true)) + return scanner_ptr; + + delete scanner_ptr; + } // infinite loop +} + + + +Scanner * +Scanner::get_scanner_from_name(const string& name) +{ + Scanner * scanner_ptr; + + const string matching_name = + standardise_interfile_keyword(name); + Type type= E931; + while (type != Unknown_scanner) + { + scanner_ptr = new Scanner(type); + const list& list_of_names = scanner_ptr->get_all_names(); + for (std::list::const_iterator iter =list_of_names.begin(); + iter!=list_of_names.end(); + ++iter) + { + const string matching_scanner_name = + standardise_interfile_keyword(*iter); + if (matching_scanner_name==matching_name) + return scanner_ptr; + } + + // we didn't find it yet + delete scanner_ptr; + // tricky business to find next type + int int_type = type; + ++int_type; + type = static_cast(int_type); + } + // it's not in the list + return new Scanner(Unknown_scanner); +} + + +string Scanner:: list_all_names() +{ + Scanner * scanner_ptr; +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[30000]; + ostrstream s(str, 30000); +#else + std::ostringstream s; +#endif + + Type type= E931; + while (type != Unknown_scanner) + { + scanner_ptr = new Scanner(type); + s << scanner_ptr->list_names() << '\n'; + + delete scanner_ptr; + // tricky business to find next type + int int_type = type; + ++int_type; + type = static_cast(int_type); + } + + return s.str(); +} + + +static list +string_list(const string& s) +{ + list l; + l.push_back(s); + return l; +} + +static list +string_list(const string& s1, const string& s2) +{ + list l; + l.push_back(s1); + l.push_back(s2); + return l; +} + +static list +string_list(const string& s1, const string& s2, const string& s3) +{ + list l; + l.push_back(s1); + l.push_back(s2); + l.push_back(s3); + return l; +} + +static list +string_list(const string& s1, const string& s2, const string& s3, const string& s4) +{ + list l; + l.push_back(s1); + l.push_back(s2); + l.push_back(s3); + l.push_back(s4); + return l; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/Segment.cxx b/src/buildblock/Segment.cxx new file mode 100644 index 0000000000..c27dd099bd --- /dev/null +++ b/src/buildblock/Segment.cxx @@ -0,0 +1,105 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Implementations for non-inline functions of class stir::Segment + + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/Segment.h" +#include "stir/SegmentByView.h" +#include "stir/IndexRange2D.h" +#include "stir/IndexRange3D.h" +#include "boost/format.hpp" + +START_NAMESPACE_STIR + + +template +bool +Segment:: +has_same_characteristics(self_type const& other, + string& explanation) const +{ + using boost::format; + using boost::str; + + if (typeid(*this) != typeid(other)) + { + explanation = + str(format("Differing data types:%1% vs %2%") + % typeid(*this).name() + % typeid(other).name() + ); + return false; + } + if (*this->get_proj_data_info_ptr() != + *other.get_proj_data_info_ptr()) + { + explanation = + str(format("Differing projection data info:\n%1%\n-------- vs-------\n %2%") + % this->get_proj_data_info_ptr()->parameter_info() + % other.get_proj_data_info_ptr()->parameter_info() + ); + return false; + } + if (this->get_segment_num() != + other.get_segment_num()) + { + explanation = + str(format("Differing segment number: %1% vs %2%") + % this->get_segment_num() + % other.get_segment_num() + ); + return false; + } + return true; +} + +template +bool +Segment:: +has_same_characteristics(self_type const& other) const +{ + std::string explanation; + return this->has_same_characteristics(other, explanation); +} + +template +bool +Segment:: +operator !=(const self_type& that) const +{ + return !((*this) == that); +} + +/************************************* + instantiations + *************************************/ + +template class Segment; + +END_NAMESPACE_STIR diff --git a/src/buildblock/SegmentBySinogram.cxx b/src/buildblock/SegmentBySinogram.cxx new file mode 100644 index 0000000000..3653b69667 --- /dev/null +++ b/src/buildblock/SegmentBySinogram.cxx @@ -0,0 +1,178 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Implementations for non-inline functions of class stir::SegmentBySinogram + + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/SegmentBySinogram.h" +#include "stir/SegmentByView.h" +#include "stir/IndexRange2D.h" +#include "stir/IndexRange3D.h" + +START_NAMESPACE_STIR + + + +template +SegmentBySinogram :: +SegmentBySinogram(const Array<3,elemT>& v, + const shared_ptr& pdi_ptr, + const int segment_num) + : + Segment(pdi_ptr, segment_num), + Array<3,elemT>(v) +{ + assert( get_min_view_num() == pdi_ptr->get_min_view_num()); + assert( get_max_view_num() == pdi_ptr->get_max_view_num()); + assert( get_min_axial_pos_num() == pdi_ptr->get_min_axial_pos_num(segment_num)); + assert( get_max_axial_pos_num() == pdi_ptr->get_max_axial_pos_num(segment_num)); + assert( get_min_tangential_pos_num() == pdi_ptr->get_min_tangential_pos_num()); + assert( get_max_tangential_pos_num() == pdi_ptr->get_max_tangential_pos_num()); +} + +template +SegmentBySinogram :: +SegmentBySinogram(const shared_ptr& pdi_ptr, + const int segment_num) + : + Segment(pdi_ptr, segment_num), + Array<3,elemT>(IndexRange3D(pdi_ptr->get_min_axial_pos_num(segment_num), + pdi_ptr->get_max_axial_pos_num(segment_num), + pdi_ptr->get_min_view_num(), + pdi_ptr->get_max_view_num(), + pdi_ptr->get_min_tangential_pos_num(), + pdi_ptr->get_max_tangential_pos_num())) +{} + +template +SegmentBySinogram:: +SegmentBySinogram(const SegmentByView& s_v ) + : Segment(s_v.get_proj_data_info_ptr()->create_shared_clone(), + s_v.get_segment_num()), + Array<3,elemT> (IndexRange3D (s_v.get_min_axial_pos_num(), s_v.get_max_axial_pos_num(), + s_v.get_min_view_num(), s_v.get_max_view_num(), + s_v.get_min_tangential_pos_num(), s_v.get_max_tangential_pos_num())) +{ + + for (int r=get_min_axial_pos_num(); r<= get_max_axial_pos_num(); r++) + set_sinogram(s_v.get_sinogram(r)); +} + +template +bool +SegmentBySinogram:: +operator ==(const Segment& that) const +{ + return + this->has_same_characteristics(that) && + Array<3,elemT>::operator==(static_cast(that)); +} + + +template +Viewgram +SegmentBySinogram::get_viewgram(int view_num) const +{ + // gcc 2.95.2 needs a this-> in front of get_min_ring for unclear reasons + Array<2,elemT> pre_view(IndexRange2D(this->get_min_axial_pos_num(), get_max_axial_pos_num(), + get_min_tangential_pos_num(),get_max_tangential_pos_num())); + for (int r=get_min_axial_pos_num(); r<= get_max_axial_pos_num(); r++) + pre_view[r] = Array<3,elemT>::operator[](r)[view_num]; + //KT 9/12 constructed a PETSinogram before... + // CL&KT 15/12 added ring_difference stuff + return Viewgram(pre_view, this->proj_data_info_ptr->create_shared_clone(), view_num, + this->get_segment_num()); +} + +template +void +SegmentBySinogram::set_viewgram(const Viewgram& viewgram) +{ + for (int r=get_min_axial_pos_num(); r<= get_max_axial_pos_num(); r++) + Array<3,elemT>::operator[](r)[viewgram.get_view_num()] = viewgram[r]; +} + + + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +SegmentBySinogram:: +resize(const IndexRange<3>& range) +{ + if (range == this->get_index_range()) + return; + + assert(range.is_regular()==true); + + const int ax_min = range.get_min_index(); + const int ax_max = range.get_max_index(); + + // can only handle min_view==0 at the moment + // TODO + assert(range[ax_min].get_min_index() == 0); + + shared_ptr pdi_ptr = this->proj_data_info_ptr->create_shared_clone(); + + pdi_ptr->set_min_axial_pos_num(ax_min, this->get_segment_num()); + pdi_ptr->set_max_axial_pos_num(ax_max, this->get_segment_num()); + + pdi_ptr->set_num_views(range[ax_min].get_max_index() + 1); + pdi_ptr->set_min_tangential_pos_num(range[ax_min][0].get_min_index()); + pdi_ptr->set_max_tangential_pos_num(range[ax_min][0].get_max_index()); + + this->proj_data_info_ptr = pdi_ptr; + + Array<3,elemT>::resize(range); + +} + + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +SegmentBySinogram:: +grow(const IndexRange<3>& range) +{ + resize(range); +} + +/************************************* + instantiations + *************************************/ + +template class SegmentBySinogram; + +END_NAMESPACE_STIR diff --git a/src/buildblock/SegmentByView.cxx b/src/buildblock/SegmentByView.cxx new file mode 100644 index 0000000000..4f3586e037 --- /dev/null +++ b/src/buildblock/SegmentByView.cxx @@ -0,0 +1,177 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Implementations for non-inline functions of class stir::SegmentByView + + \author Kris Thielemans + \author PARAPET project + + +*/ +#include "stir/SegmentByView.h" +#include "stir/SegmentBySinogram.h" +#include "stir/IndexRange2D.h" +#include "stir/IndexRange3D.h" + +START_NAMESPACE_STIR + + +template +SegmentByView:: +SegmentByView(const Array<3,elemT>& v, + const shared_ptr& pdi_ptr, + const int segment_num) + : + Segment(pdi_ptr, segment_num), + Array<3,elemT>(v) +{ + assert( get_min_view_num() == pdi_ptr->get_min_view_num()); + assert( get_max_view_num() == pdi_ptr->get_max_view_num()); + assert( get_min_axial_pos_num() == pdi_ptr->get_min_axial_pos_num(segment_num)); + assert( get_max_axial_pos_num() == pdi_ptr->get_max_axial_pos_num(segment_num)); + assert( get_min_tangential_pos_num() == pdi_ptr->get_min_tangential_pos_num()); + assert( get_max_tangential_pos_num() == pdi_ptr->get_max_tangential_pos_num()); + +} + +template +SegmentByView:: +SegmentByView(const shared_ptr& pdi_ptr, + const int segment_num) + : + Segment(pdi_ptr, segment_num), + Array<3,elemT>(IndexRange3D(pdi_ptr->get_min_view_num(), + pdi_ptr->get_max_view_num(), + pdi_ptr->get_min_axial_pos_num(segment_num), + pdi_ptr->get_max_axial_pos_num(segment_num), + pdi_ptr->get_min_tangential_pos_num(), + pdi_ptr->get_max_tangential_pos_num())) +{} + +template +SegmentByView::SegmentByView(const SegmentBySinogram& s_s) + : Segment(s_s.get_proj_data_info_ptr()->create_shared_clone(), + s_s.get_segment_num()), + + Array<3,elemT> (IndexRange3D(s_s.get_min_view_num(),s_s.get_max_view_num(), + s_s.get_min_axial_pos_num(),s_s.get_max_axial_pos_num(), + s_s.get_min_tangential_pos_num(), s_s.get_max_tangential_pos_num())) +{ + + for (int v=get_min_view_num(); v<= get_max_view_num(); v++) + set_viewgram(s_s.get_viewgram(v)); +} + + +template +bool +SegmentByView:: +operator ==(const Segment& that) const +{ + return + this->has_same_characteristics(that) && + Array<3,elemT>::operator==(static_cast(that)); +} + +template +Sinogram +SegmentByView::get_sinogram(int axial_pos_num) const +{ + // gcc 2.95.2 needs a this-> in front of get_min_voew_num for unclear reasons + Array<2,elemT> pre_sino(IndexRange2D(this->get_min_view_num(), get_max_view_num(), + get_min_tangential_pos_num(),get_max_tangential_pos_num())); + for (int v=get_min_view_num(); v<= get_max_view_num(); v++) + pre_sino[v] = Array<3,elemT>::operator[](v)[axial_pos_num]; + + return Sinogram(pre_sino, this->proj_data_info_ptr, axial_pos_num, + this->get_segment_num()); +} + +template +void +SegmentByView::set_sinogram(const Sinogram& sino, int axial_pos_num) +{ + for (int v=get_min_view_num(); v<= get_max_view_num(); v++) + Array<3,elemT>::operator[](v)[axial_pos_num] = sino[v]; +} + + + + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +SegmentByView:: +resize(const IndexRange<3>& range) +{ + if (range == this->get_index_range()) + return; + + assert(range.is_regular()==true); + + // can only handle min_view==0 at the moment + // TODO + assert(range.get_min_index() == 0); + + ProjDataInfo* pdi_ptr = this->proj_data_info_ptr->clone(); + + const int ax_min = range[0].get_min_index(); + const int ax_max = range[0].get_max_index(); + + pdi_ptr->set_min_axial_pos_num(ax_min, this->get_segment_num()); + pdi_ptr->set_max_axial_pos_num(ax_max, this->get_segment_num()); + + pdi_ptr->set_num_views(range.get_max_index() + 1); + pdi_ptr->set_min_tangential_pos_num(range[0][ax_min].get_min_index()); + pdi_ptr->set_max_tangential_pos_num(range[0][ax_min].get_max_index()); + + this->proj_data_info_ptr.reset(pdi_ptr); + + Array<3,elemT>::resize(range); + +} + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +SegmentByView:: +grow(const IndexRange<3>& range) +{ + resize(range); +} + +/************************************* + instantiations + *************************************/ + +template class SegmentByView; + + +END_NAMESPACE_STIR diff --git a/src/buildblock/SeparableArrayFunctionObject.cxx b/src/buildblock/SeparableArrayFunctionObject.cxx new file mode 100644 index 0000000000..051ccc79f2 --- /dev/null +++ b/src/buildblock/SeparableArrayFunctionObject.cxx @@ -0,0 +1,125 @@ +// +// +/*! + + \file + \ingroup Array + \brief Implementations for stir::SeparableArrayFunctionObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2001- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/SeparableArrayFunctionObject.h" +#include "stir/ArrayFunction.h" +#include "stir/is_null_ptr.h" + +START_NAMESPACE_STIR + +template +SeparableArrayFunctionObject:: +SeparableArrayFunctionObject() +: all_1d_array_filters(VectorWithOffset< shared_ptr > >(num_dim)) +{} + +template +SeparableArrayFunctionObject:: +SeparableArrayFunctionObject(const VectorWithOffset< shared_ptr > >& array_filters) +: all_1d_array_filters(array_filters) +{ + assert(all_1d_array_filters.get_length() == num_dim); +} + + +template +void +SeparableArrayFunctionObject:: +do_it(Array& array) const +{ + if (!is_trivial()) + { +#ifndef NDEBUG + // currently in_place_apply_array_functions_on_each_index doesn't handle 0 + // pointers gracefully, so we check here that there aren't any + for (typename VectorWithOffset< shared_ptr > >::const_iterator + iter=all_1d_array_filters.begin(); + iter!=all_1d_array_filters.end(); + ++iter) + assert(!is_null_ptr(*iter)); +#endif + in_place_apply_array_functions_on_each_index(array, + all_1d_array_filters.begin(), + all_1d_array_filters.end()); + } +} + +#if 0 +// TODO insert +template +void +SeparableArrayFunctionObject:: +do_it(Array& out_array, const Array& in_array) const +{ + + //if (!is_trivial()) + { +#ifndef NDEBUG + // currently apply_array_functions_on_each_index doesn't handle 0 + // pointers gracefully, so we check here that there aren't any + for ( VectorWithOffset< shared_ptr > >::const_iterator + iter=all_1d_array_filters.begin(); + iter!=all_1d_array_filters.end(); + ++iter) + assert(!is_null_ptr(*iter)); +#endif + apply_array_functions_on_each_index(out_array, in_array, + all_1d_array_filters.begin(), + all_1d_array_filters.end()); + } + //else somehow copy in_array into out_array but keeping index ranges + //TODO + +} +#endif + +template +bool +SeparableArrayFunctionObject:: +is_trivial() const +{ + for (typename VectorWithOffset< shared_ptr > >::const_iterator + iter=all_1d_array_filters.begin(); + iter!=all_1d_array_filters.end(); + ++iter) + { + if (!is_null_ptr(*iter) && !(*iter)->is_trivial()) + return false; + } + return true; +} + + +// instantiation +template class SeparableArrayFunctionObject<3, float>; + +END_NAMESPACE_STIR + + + diff --git a/src/buildblock/SeparableCartesianMetzImageFilter.cxx b/src/buildblock/SeparableCartesianMetzImageFilter.cxx new file mode 100644 index 0000000000..3240aa9bde --- /dev/null +++ b/src/buildblock/SeparableCartesianMetzImageFilter.cxx @@ -0,0 +1,187 @@ +// +// +/*! + + \file + \ingroup ImageProcessor + \brief Implementations for class stir::SeparableCartesianMetzImageFilter + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/SeparableCartesianMetzImageFilter.h" +#include "stir/VoxelsOnCartesianGrid.h" + + +START_NAMESPACE_STIR + + +template +Succeeded +SeparableCartesianMetzImageFilter:: +virtual_set_up(const DiscretisedDensity<3,elemT>& density) + +{ +/* if (consistency_check(density) == Succeeded::no) + return Succeeded::no; + */ + const VoxelsOnCartesianGrid& image = + dynamic_cast&>(density); + + metz_filter = + SeparableMetzArrayFilter<3,elemT>(get_metz_fwhms(), + get_metz_powers(), + image.get_voxel_size(), + get_max_kernel_sizes()); + + return Succeeded::yes; + +} + + +template +void +SeparableCartesianMetzImageFilter:: +virtual_apply(DiscretisedDensity<3,elemT>& density) const + +{ + //assert(consistency_check(density) == Succeeded::yes); + metz_filter(density); +} + + +template +void +SeparableCartesianMetzImageFilter:: +virtual_apply(DiscretisedDensity<3,elemT>& out_density, + const DiscretisedDensity<3,elemT>& in_density) const +{ + //assert(consistency_check(in_density) == Succeeded::yes); + metz_filter(out_density,in_density); +} + +#if 0 + +template +Succeeded +SeparableCartesianMetzImageFilter:: +consistency_check( const DiscretisedDensity<3, elemT>& image) const +{ + + //TODO? + VoxelsOnCartesianGrid& image = + dynamic_cast&>(density); + + CartesianCoordinate3D voxel_size = image.get_voxel_size(); + + // checks if metz_powers >= 0, also checks if FWHM of the filter + // is smaller than a sampling interval(to prevent bandwidth of the filter + // exceed NF of the image) + if ( metz_powers[0]>=0 && metz_powers[1]>=0 &&metz_powers[1]>=0&& metz_filter.fwhms[0] <=voxel_size.x() && metz_filter.fwhms[1] <=voxel_size.y()&& metz_filter.fwhms[1] <=voxel_size.z()) + + warning("Filter's fwhm is smaller than a sampling distance in the image\n"); + return Succeeded::yes; + //else + //return Succeeded::no; +} +#endif + +template +SeparableCartesianMetzImageFilter:: +SeparableCartesianMetzImageFilter() +: fwhms(VectorWithOffset(1,3)), + metz_powers(VectorWithOffset(1,3)), + max_kernel_sizes(VectorWithOffset(1,3)) +{ + set_defaults(); +} + +template +VectorWithOffset +SeparableCartesianMetzImageFilter:: +get_metz_fwhms() const +{ return fwhms;} + +template +VectorWithOffset +SeparableCartesianMetzImageFilter:: +get_metz_powers() const +{ return metz_powers;} + + +template +VectorWithOffset +SeparableCartesianMetzImageFilter:: +get_max_kernel_sizes() const +{ return max_kernel_sizes;} + +template +void +SeparableCartesianMetzImageFilter:: +set_defaults() +{ + base_type::set_defaults(); + fwhms.fill(0); + metz_powers.fill(0); + max_kernel_sizes.fill(-1); +} + +template +void +SeparableCartesianMetzImageFilter:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Separable Cartesian Metz Filter Parameters"); + this->parser.add_key("x-dir filter FWHM (in mm)", &fwhms[3]); + this->parser.add_key("y-dir filter FWHM (in mm)", &fwhms[2]); + this->parser.add_key("z-dir filter FWHM (in mm)", &fwhms[1]); + this->parser.add_key("x-dir filter Metz power", &metz_powers[3]); + this->parser.add_key("y-dir filter Metz power", &metz_powers[2]); + this->parser.add_key("z-dir filter Metz power", &metz_powers[1]); + this->parser.add_key("x-dir maximum kernel size", &max_kernel_sizes[3]); + this->parser.add_key("y-dir maximum kernel size", &max_kernel_sizes[2]); + this->parser.add_key("z-dir maximum kernel size", &max_kernel_sizes[1]); + this->parser.add_stop_key("END Separable Cartesian Metz Filter Parameters"); +} + + +template <> +const char * const +SeparableCartesianMetzImageFilter::registered_name = + "Separable Cartesian Metz"; + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +// Register this class in the ImageProcessor registry +// static SeparableCartesianMetzImageFilter::RegisterIt dummy; +// have the above variable in a separate file, which you need to pass at link time + +template class SeparableCartesianMetzImageFilter; + +END_NAMESPACE_STIR + + + diff --git a/src/buildblock/SeparableConvolutionImageFilter.cxx b/src/buildblock/SeparableConvolutionImageFilter.cxx new file mode 100644 index 0000000000..234ec6ac35 --- /dev/null +++ b/src/buildblock/SeparableConvolutionImageFilter.cxx @@ -0,0 +1,232 @@ +/*! + \file + \ingroup ImageProcessor + \brief Implementation of class stir::SeparableConvolutionImageFilter + + \author Kris Thielemans + \author Sanida Mustafovic +*/ +/* + Copyright (C) 2002 - 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/SeparableConvolutionImageFilter.h" +#include "stir/SeparableArrayFunctionObject.h" +#include "stir/ArrayFilter1DUsingConvolution.h" +#include "stir/DiscretisedDensity.h" + +START_NAMESPACE_STIR + +template<> +const char * const +SeparableConvolutionImageFilter::registered_name = + "Separable Convolution"; + + +template +void +SeparableConvolutionImageFilter:: +initialise_keymap() +{ + base_type::initialise_keymap(); + + this->parser.add_start_key("Separable Convolution Filter Parameters"); + this->parser.add_key("x-dir filter coefficients", &(*(filter_coefficients_for_parsing.begin()+2))); + this->parser.add_key("y-dir filter coefficients", &(*(filter_coefficients_for_parsing.begin()+1))); + this->parser.add_key("z-dir filter coefficients", &(*filter_coefficients_for_parsing.begin())); + this->parser.add_stop_key("END Separable Convolution Filter Parameters"); + +} + +template +bool +SeparableConvolutionImageFilter:: +post_processing() +{ + if (base_type::post_processing() != false) + return true; + + // copy filter_coefficients_for_parsing to filter_coefficients + // todo drop any 0s at the start or end + + typename VectorWithOffset< VectorWithOffset >::iterator + coefficients_iter = filter_coefficients.begin(); +#ifndef STIR_NO_NAMESPACES + std:: +#endif + vector< vector >::const_iterator + parsing_iter = filter_coefficients_for_parsing.begin(); + for (; + parsing_iter != filter_coefficients_for_parsing.end(); + ++parsing_iter, ++coefficients_iter) + { + const unsigned int size = static_cast(parsing_iter->size()); + const int min_index = -static_cast((size/2)); + if (size%2==0) + warning("Parsing SeparableConvolutionImageFilter\n" + "Even number of filter coefficients for the %d-th dimension." + "I'll (effectively) append a 0 at the end.\n", + coefficients_iter - filter_coefficients.begin() + 1); + + *coefficients_iter = VectorWithOffset(min_index, min_index + size - 1); + + // can't use std::copy because of cast. sigh. + typename VectorWithOffset::iterator + coefficients_elem_iter = coefficients_iter->begin(); +#ifndef STIR_NO_NAMESPACES + std:: +#endif + vector::const_iterator + parsing_elem_iter = parsing_iter->begin(); + for (; + parsing_elem_iter != parsing_iter->end(); + ++parsing_elem_iter, ++coefficients_elem_iter) + *coefficients_elem_iter = static_cast(*parsing_elem_iter); + } + + return false; +} + +template +SeparableConvolutionImageFilter:: +SeparableConvolutionImageFilter() +: filter_coefficients_for_parsing(3) +{ + set_defaults(); +} + + +template +SeparableConvolutionImageFilter:: +SeparableConvolutionImageFilter( + const VectorWithOffset< VectorWithOffset >& + filter_coefficients) + : + filter_coefficients_for_parsing(filter_coefficients.get_length()), + filter_coefficients(filter_coefficients) +{ + assert(filter_coefficients.get_length()==3);// num_dimensions + + // copy filter_coefficients to filter_coefficients_for_parsing such + // that get_parameters() works properly + + typename VectorWithOffset< VectorWithOffset >::const_iterator + coefficients_iter = filter_coefficients.begin(); +#ifndef STIR_NO_NAMESPACES + std:: +#endif + vector< vector >::iterator + parsing_iter = filter_coefficients_for_parsing.begin(); + for (; + parsing_iter != filter_coefficients_for_parsing.end(); + ++parsing_iter, ++coefficients_iter) + { + // make sure that there are 0s appended such that parsing will read it back + // in correct place + const unsigned parsing_size = + 2*(max(coefficients_iter->get_max_index(), + -coefficients_iter->get_min_index())) + 1; + // make it long enough, and initialise with 0 + *parsing_iter = vector(coefficients_iter->get_length(), 0); + + for (int i = coefficients_iter->get_min_index(); + i <= coefficients_iter->get_max_index(); + ++i) + (*parsing_iter)[static_cast((parsing_size/2) + i)] = + (*coefficients_iter)[i]; + } + +} + +#if 0 +template +VectorWithOffset +SeparableConvolutionImageFilter:: +get_filter_coefficients() +{ + return filter_coefficients; +} +#endif + +template +Succeeded +SeparableConvolutionImageFilter:: +virtual_set_up(const DiscretisedDensity<3,elemT>& density) +{ + VectorWithOffset< shared_ptr > > + all_1d_filters(filter_coefficients.get_min_index(), + filter_coefficients.get_max_index()); + + typename VectorWithOffset< VectorWithOffset >::const_iterator + coefficients_iter = filter_coefficients.begin(); + typename VectorWithOffset< shared_ptr > >::iterator + filter_iter = all_1d_filters.begin(); + for (; + coefficients_iter != filter_coefficients.end(); + ++filter_iter, ++coefficients_iter) + { + + filter_iter->reset(new ArrayFilter1DUsingConvolution(*coefficients_iter)); + } + filter = SeparableArrayFunctionObject<3,elemT>(all_1d_filters); + + return Succeeded::yes; + +} + + +template +void +SeparableConvolutionImageFilter:: +virtual_apply(DiscretisedDensity<3,elemT>& density) const + +{ + filter(density); + +} + + +template +void +SeparableConvolutionImageFilter:: +virtual_apply(DiscretisedDensity<3,elemT>& out_density, + const DiscretisedDensity<3,elemT>& in_density) const +{ + filter(out_density,in_density); +} + + +template +void +SeparableConvolutionImageFilter:: +set_defaults() +{ + base_type::set_defaults(); + filter_coefficients = + VectorWithOffset< VectorWithOffset >(3); +} + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +template class SeparableConvolutionImageFilter; + +END_NAMESPACE_STIR diff --git a/src/buildblock/SeparableMetzArrayFilter.cxx b/src/buildblock/SeparableMetzArrayFilter.cxx new file mode 100644 index 0000000000..861113bb1e --- /dev/null +++ b/src/buildblock/SeparableMetzArrayFilter.cxx @@ -0,0 +1,371 @@ +// +// +/*! + + \file + \ingroup Array + + \brief Implementations for class stir::SeparableMetzArrayFilter + + \author Matthew Jacobson + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000 - 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/SeparableMetzArrayFilter.h" +#include "stir/ArrayFilter1DUsingConvolutionSymmetricKernel.h" +#include "stir/VectorWithOffset.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + + +const float ZERO_TOL= 0.000001F; //MJ 12/05/98 Made consistent with other files +const double TPI=6.28318530717958647692; +const int FORWARDFFT=1; +const int INVERSEFFT=-1; + +// TODO get rid of this #defines +#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr +#define REALC(a) 2*(a) +#define IMGC(a) 2*(a)+1 + +// build Gaussian kernel according to the full width half maximum +template +static void build_gauss(VectorWithOffset&kernel, + int res,float s2, float sampling_interval); + +template +static void discrete_fourier_transform(VectorWithOffset&data, unsigned int nn, int isign); + +template +static void build_metz(VectorWithOffset&kernel, + float N,float fwhm, float MmPerVoxel, int max_kernel_size); + + + +template +SeparableMetzArrayFilter:: +SeparableMetzArrayFilter + (const VectorWithOffset& fwhms_v, + const VectorWithOffset& metz_powers_v, + const BasicCoordinate& sampling_distances_v, + const VectorWithOffset& max_kernel_sizes_v) + : fwhms(fwhms_v), + metz_powers(metz_powers_v), + sampling_distances(sampling_distances_v), + max_kernel_sizes(max_kernel_sizes_v) +{ + assert(metz_powers.get_length() == num_dimensions); + assert(fwhms.get_length() == num_dimensions); + assert(metz_powers.get_min_index() == 1); + assert(fwhms.get_min_index() == 1); + assert(max_kernel_sizes.get_length() == num_dimensions); + assert(max_kernel_sizes.get_min_index() == 1); + + for (int i=1; i<=num_dimensions; ++i) + { + VectorWithOffset kernel; + build_metz(kernel, metz_powers[i],fwhms[i],sampling_distances[i],max_kernel_sizes[i]); + + for (int j=0;j0.0) printf ("%d-dir Metz[%d]=%f\n",i,j,kernel[j]); + else printf ("%d-dir Gauss[%d]=%f\n",i,j,kernel[j]); + + + this->all_1d_array_filters[i-1].reset(new ArrayFilter1DUsingConvolutionSymmetricKernel(kernel)); + + } +} + + +template +void discrete_fourier_transform(VectorWithOffset&data, unsigned int nn, int isign) +{ + unsigned int n,mmax,m,j,istep,i; + double wtemp,wr,wpr,wpi,wi,theta; + elemT tempr,tempi; + n=nn << 1; + j=1; + for (i=1;i i) { + SWAP(data[j],data[i]); + SWAP(data[j+1],data[i+1]); + } + m=n >> 1; + while (m >= 2 && j > m) { + j -= m; + m >>= 1; + } + j += m; + } + mmax=2; + while (n > mmax) { + istep=mmax << 1; + theta=isign*(TPI/mmax); + wtemp=sin(0.5*theta); + wpr = -2.0*wtemp*wtemp; + wpi=sin(theta); + wr=1.0; + wi=0.0; + for (m=1;m(wr*data[j]-wi*data[j+1]); + tempi=static_cast(wr*data[j+1]+wi*data[j]); + data[j]=data[i]-tempr; + data[j+1]=data[i+1]-tempi; + data[i] += tempr; + data[i+1] += tempi; + } + wr=(wtemp=wr)*wpr-wi*wpi+wr; + wi=wi*wpr+wtemp*wpi+wi; + } + mmax=istep; + } +} + + +template +void build_gauss(VectorWithOffset&kernel, int res,float s2, float sampling_interval) +{ + + + elemT sum; + int cutoff=0; + int j,hres; + + + + hres = res/2; + kernel[hres-1] = static_cast(1/sqrt(s2*TPI)); + sum = kernel[hres-1]; + kernel[res-1] = 0; + for (j=1;(j(kernel[hres-1]* exp(-0.5*(j*sampling_interval)*(j*sampling_interval)/s2)); + kernel[hres+j-1] = kernel [hres-j-1]; + sum += 2.0F * kernel[hres-j-1]; + if (kernel[hres-j-1] +void build_metz(VectorWithOffset& kernel, + float N,float fwhm, float MmPerVox, int max_kernel_size) +{ + + int kernel_length = 0; + + if(fwhm>0.0F){ + + + // KT 30/05/2000 dropped unsigned + int i; + elemT xreal,ximg,zabs2; + + //MJ 12/05/98 compute parameters relevant to DFT/IDFT + + elemT s2 = fwhm*fwhm/(8*log(2.F)); //variance in Mm + + const int n=7; //determines cut-off in both space and frequency domains + const elemT sinc_length=10000.0F; + int samples_per_voxel=(int)(MmPerVox*2*sqrt(2*log(10.F)*n/s2)/TPI +1); + const elemT sampling_interval=MmPerVox/samples_per_voxel; + elemT stretch= (samples_per_voxel>1)?sinc_length:0.0F; + + int Res=(int)(log((sqrt(8*n*log(10.)*s2)+stretch)/sampling_interval)/log(2.)+1); + Res=(int) pow(2.0,(double) Res); //MJ 12/05/98 made adaptive + + + + cerr< filter(Res); + + //MJ 05/03/2000 padded 1 more element to fftdata and pre-increment + //The former technique was illegal. + VectorWithOffset fftdata(0,2*Res); + for (i=0;i0.0){ + // cerr<cutoff && Res-i>cutoff) zabs2=0; + + } + + if (zabs2>1) zabs2=(elemT) (1-ZERO_TOL); + if (zabs2>0) { + // if (zabs2>=1) cerr<=0;i--){ + if (fabs((double) filter[i])>=(0.0001)*filter[0]) break; + else (kernel_length)--; + + } + + +#if 0 + // SM&KT 04/04/2001 removed this truncation of the kernel as we don't have the relevant parameter anymore + if ((kernel_length)>length_of_row_to_filter/2){ + kernel_length=length_of_row_to_filter/2; + } +#endif + + if (max_kernel_size>0 && (kernel_length)>max_kernel_size/2){ + kernel_length=max_kernel_size/2; + } + + //VectorWithOffset kernel(kernel_length);//=new elemT[(kernel_length)]; + kernel.grow(0,kernel_length-1); + + for (i=0;i<(kernel_length);i++) kernel[i]=filter[i]; + + //return kernel; + } + + else{ + //VectorWithOffset kernel(1);//=new elemT[1]; + kernel.grow(0,0); + //*kernel=1.0F; + //kernel_length=1L; + kernel[0] = 1.F; + kernel_length=1; + + //return kernel; + } + +} + + + +template class SeparableMetzArrayFilter<3, float>; + +END_NAMESPACE_STIR + + + diff --git a/src/buildblock/Sinogram.cxx b/src/buildblock/Sinogram.cxx new file mode 100644 index 0000000000..2d2e4f2610 --- /dev/null +++ b/src/buildblock/Sinogram.cxx @@ -0,0 +1,159 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Implementations for non-inline functions of class stir::Sinogram + + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/Sinogram.h" +#include "boost/format.hpp" + +#ifdef _MSC_VER +// disable warning that not all functions have been implemented when instantiating +#pragma warning(disable: 4661) +#endif // _MSC_VER +START_NAMESPACE_STIR + +template +bool +Sinogram:: +has_same_characteristics(self_type const& other, + string& explanation) const +{ + using boost::format; + using boost::str; + + if (*this->get_proj_data_info_ptr() != + *other.get_proj_data_info_ptr()) + { + explanation = + str(format("Differing projection data info:\n%1%\n-------- vs-------\n %2%") + % this->get_proj_data_info_ptr()->parameter_info() + % other.get_proj_data_info_ptr()->parameter_info() + ); + return false; + } + if (this->get_axial_pos_num() != + other.get_axial_pos_num()) + { + explanation = + str(format("Differing axial position number: %1% vs %2%") + % this->get_axial_pos_num() + % other.get_axial_pos_num() + ); + return false; + } + if (this->get_segment_num() != + other.get_segment_num()) + { + explanation = + str(format("Differing segment number: %1% vs %2%") + % this->get_segment_num() + % other.get_segment_num() + ); + return false; + } + return true; +} + +template +bool +Sinogram:: +has_same_characteristics(self_type const& other) const +{ + std::string explanation; + return this->has_same_characteristics(other, explanation); +} + +template +bool +Sinogram:: +operator ==(const self_type& that) const +{ + return + this->has_same_characteristics(that) && + base_type::operator==(that); +} + +template +bool +Sinogram:: +operator !=(const self_type& that) const +{ + return !((*this) == that); +} + + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +Sinogram:: +resize(const IndexRange<2>& range) +{ + if (range == this->get_index_range()) + return; + + // can only handle min_view==0 at the moment + // TODO + + assert(range.get_min_index() == 0); + + shared_ptr pdi_ptr (proj_data_info_ptr->clone()); + + pdi_ptr->set_num_views(range.get_max_index() + 1); + pdi_ptr->set_min_tangential_pos_num(range[0].get_min_index()); + pdi_ptr->set_max_tangential_pos_num(range[0].get_max_index()); + + proj_data_info_ptr = pdi_ptr; + + Array<2,elemT>::resize(range); + +} + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +Sinogram:: +grow(const IndexRange<2>& range) +{ + resize(range); +} + +/****************************** + instantiations + ****************************/ + +template class Sinogram; + +END_NAMESPACE_STIR diff --git a/src/buildblock/ThresholdMinToSmallPositiveValueDataProcessor.cxx b/src/buildblock/ThresholdMinToSmallPositiveValueDataProcessor.cxx new file mode 100644 index 0000000000..e218dc4168 --- /dev/null +++ b/src/buildblock/ThresholdMinToSmallPositiveValueDataProcessor.cxx @@ -0,0 +1,123 @@ +// +// +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup DataProcessor + \brief Implementations for class stir::ThresholdMinToSmallPositiveValueDataProcessor + + \author Kris Thielemans + +*/ +#include "stir/ThresholdMinToSmallPositiveValueDataProcessor.h" +#include "stir/thresholding.h" +#include "stir/DiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" + +START_NAMESPACE_STIR + + +template +Succeeded +ThresholdMinToSmallPositiveValueDataProcessor:: +virtual_set_up(const DataT& density) + +{ + return Succeeded::yes; +} + + +template +void +ThresholdMinToSmallPositiveValueDataProcessor:: +virtual_apply(DataT& data) const + +{ + threshold_min_to_small_positive_value(data.begin_all(), data.end_all(), 0.000001F); + //threshold_min_to_small_positive_value_and_truncate_rim(data, 0); +} + + +template +void +ThresholdMinToSmallPositiveValueDataProcessor:: +virtual_apply(DataT& out_data, + const DataT& in_data) const +{ + out_data = in_data; + threshold_min_to_small_positive_value(out_data.begin_all(), out_data.end_all(), 0.000001F); +} + +template +ThresholdMinToSmallPositiveValueDataProcessor:: +ThresholdMinToSmallPositiveValueDataProcessor() +{ + set_defaults(); +} + +template +void +ThresholdMinToSmallPositiveValueDataProcessor:: +set_defaults() +{ + base_type::set_defaults(); +} + +template +void +ThresholdMinToSmallPositiveValueDataProcessor:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Threshold Min To Small Positive Value Parameters"); + this->parser.add_stop_key("END Threshold Min To Small Positive Value Parameters"); +} + + + +template +const char * const +ThresholdMinToSmallPositiveValueDataProcessor:: + registered_name = + "Threshold Min To Small Positive Value"; + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +// Register this class in the DataProcessor registry +// static ThresholdMinToSmallPositiveValueDataProcessor::RegisterIt dummy; +// have the above variable in a separate file, which you need to pass at link time + +template class ThresholdMinToSmallPositiveValueDataProcessor >; +template class ThresholdMinToSmallPositiveValueDataProcessor< ParametricVoxelsOnCartesianGrid >; +template class ThresholdMinToSmallPositiveValueDataProcessor< GeneralizedPatlakVoxelsOnCartesianGrid >; +//template class ThresholdMinToSmallPositiveValueDataProcessor< VoxelsOnCartesianGrid > >; +//template class ThresholdMinToSmallPositiveValueDataProcessor< VoxelsOnCartesianGrid > >; +//template class ThresholdMinToSmallPositiveValueDataProcessor< VoxelsOnCartesianGrid > >; +END_NAMESPACE_STIR + + + + + diff --git a/src/buildblock/TimeFrameDefinitions.cxx b/src/buildblock/TimeFrameDefinitions.cxx new file mode 100644 index 0000000000..abbafe0678 --- /dev/null +++ b/src/buildblock/TimeFrameDefinitions.cxx @@ -0,0 +1,274 @@ +/* + Copyright (C) 2000 - 2008-02-22, Hammersmith Imanet Ltd + Copyright (C) 2013, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Implementation of class stir::TimeFrameDefinitions + + \author Kris Thielemans +*/ + +#include "stir/TimeFrameDefinitions.h" +#include "stir/ExamInfo.h" +#include "stir/IO/FileSignature.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/stir_ecat6.h" +#include "stir/IO/stir_ecat7.h" +#endif +#include "stir/IO/InterfileHeader.h" +#include "stir/IO/interfile.h" +#include +#include +#include +#include +#include "stir/warning.h" +#include "stir/error.h" +#include "stir/info.h" + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::pair; +using std::vector; +using std::make_pair; +using std::cerr; +using std::endl; +using std::ifstream; +#endif + +START_NAMESPACE_STIR + + +double +TimeFrameDefinitions:: +get_start_time(unsigned int frame_num) const +{ + assert(frame_num>=1); + assert(frame_num<=get_num_frames()); + return frame_times[frame_num-1].first; +} + +double +TimeFrameDefinitions:: +get_end_time(unsigned int frame_num) const +{ + assert(frame_num>=1); + assert(frame_num<=get_num_frames()); + return frame_times[frame_num-1].second; +} + +double +TimeFrameDefinitions:: +get_duration(unsigned int frame_num) const +{ + return get_end_time(frame_num) - get_start_time(frame_num); +} + +double +TimeFrameDefinitions:: +get_start_time() const +{ + return get_start_time(1); +} + +double +TimeFrameDefinitions:: +get_end_time() const +{ + return get_end_time(get_num_frames()); +} + +unsigned int +TimeFrameDefinitions:: +get_num_frames() const +{ + return static_cast(frame_times.size()); +} + +unsigned int +TimeFrameDefinitions:: +get_num_time_frames() const +{ + return static_cast(frame_times.size()); +} + +TimeFrameDefinitions:: +TimeFrameDefinitions() +{} + +unsigned int +TimeFrameDefinitions:: +get_time_frame_num(const double start_time, const double end_time) const +{ + assert(end_time >=start_time); + for (unsigned int i = 1; i <=this->get_num_frames(); i++) + { + const double start = this->get_start_time(i); + const double end = this->get_end_time(i); + if (std::fabs(start-start_time)<.01 && std::fabs(end-end_time)<.01) + { + return i; + } + } + // not found + return 0; +} + +TimeFrameDefinitions:: +TimeFrameDefinitions(const string& filename) +{ + const FileSignature file_signature(filename); + const char * signature = file_signature.get_signature(); + +#ifdef HAVE_LLN_MATRIX + if (ecat::ecat6::is_ECAT6_file(filename) || + ecat::ecat7::is_ECAT7_file(filename)) + { + shared_ptr exam_info_sptr(ecat::ecat7::read_ECAT7_exam_info(filename)); + *this = exam_info_sptr->time_frame_definitions; + } + else +#endif + // Interfile + if (is_interfile_signature(signature)) + { +#ifndef NDEBUG + info(boost::format("TimeFrameDefinitions: trying to read '%s' as Interfile") % filename); +#endif + InterfileHeader hdr; + + if (!hdr.parse(filename.c_str(), false)) // silent parsing + { + error(boost::format("Parsing of Interfile header failed for file '%s'") % filename); + } + *this = hdr.get_exam_info_ptr()->time_frame_definitions; + } + else + read_fdef_file(filename); + +#if 0 + cerr << "Frame definitions:\n{"; + for (unsigned frame_num=1; frame_num<=get_num_frames(); ++frame_num) + { + cerr << '{' << get_start_time(frame_num) + << ',' << get_end_time(frame_num) + << '}'; + if (frame_num> num >> duration; + if (!in) + break; + // check if input is ok + // note: allow negative 'duration' if num==0 to be able to skip in negative direction + // (useful for starting the first frame at negative time) + if (num<0 || (num>0 && duration<=0)) + error("TimeFrameDefinitions: Reading frame_def file \"%s\":\n" + "encountered negative numbers (%d, %g)\n", + fdef_filename.c_str(), num, duration); + + if (num==0) + { + // special case to allow us to skip a time period without storing it + previous_end_time+=duration; + } + while (num--) + { + frame_times.push_back(make_pair(previous_end_time, previous_end_time+duration)); + previous_end_time+=duration; + } + } + if (this->get_num_frames()==0) + error("TimeFrameDefinitions: Reading frame definitions file \"%s\":\n" + "I didn't discover any frames. Wrong file format?\n" + "Should be an ECAT6, ECAT7 file or a text file with something like\n\n" + "3 50.5\n1 10\n0 3\n1 9\n\n" + "for 3 frames of 50.5 secs, 1 frame of 10 secs, a gap of 3 secs, 1 frame of 9 secs.", + fdef_filename.c_str()); +} + +TimeFrameDefinitions:: +TimeFrameDefinitions(const vector >& frame_times) + : frame_times(frame_times) +{ + if (get_num_frames()==0) + return; + + // check times are in sequence + double current_time = get_start_time(1); + for (unsigned int current_frame = 1; current_frame <= get_num_frames(); ++ current_frame) + { + if (current_time > get_start_time(current_frame) + .001) // add .001 to avoid numerical errors + error("TimeFrameDefinitions: frame number %d start_time (%g) is smaller than " + "previous end_time (%g)\n", + current_frame, get_start_time(current_frame), current_time); + if (get_start_time(current_frame) > get_end_time(current_frame) + .01) // add .01 to avoid numerical errors + error("TimeFrameDefinitions: frame number %d start_time (%g) is larger than " + "end_time (%g)\n", + current_frame, get_start_time(current_frame), get_end_time(current_frame)); + current_time = get_end_time(current_frame); + } +} + +TimeFrameDefinitions:: +TimeFrameDefinitions(const vector& start_times, + const vector& durations) +{ + if (start_times.size() != durations.size()) + error("TimeFrameDefinitions: constructed with start_times " + "and durations of different length"); + + this->frame_times.resize(start_times.size()); + + for (unsigned int current_frame = 1; + current_frame <= this->get_num_frames(); + ++ current_frame) + { + frame_times[current_frame-1].first = + start_times[current_frame-1]; + frame_times[current_frame-1].second = + start_times[current_frame-1] + durations[current_frame-1]; + } +} + +TimeFrameDefinitions:: +TimeFrameDefinitions(const TimeFrameDefinitions& org_frame_defs, unsigned int frame_num) +{ + this->frame_times.push_back(make_pair(org_frame_defs.get_start_time(frame_num), org_frame_defs.get_end_time(frame_num))); +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/TimeGateDefinitions.cxx b/src/buildblock/TimeGateDefinitions.cxx new file mode 100644 index 0000000000..7048025365 --- /dev/null +++ b/src/buildblock/TimeGateDefinitions.cxx @@ -0,0 +1,201 @@ +// +/* + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + Copyright (C) 2009- 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup buildblock + \brief Implementation of class stir::TimeGateDefinitions + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ + +#include "stir/TimeGateDefinitions.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::make_pair; +using std::cerr; +using std::endl; +using std::ifstream; +#endif + +START_NAMESPACE_STIR + + +double +TimeGateDefinitions:: +get_gate_duration(unsigned int num) const +{ + return this->_gate_sequence[num-1].second; +} + +// Nicolas A Karakatsanis +float +TimeGateDefinitions:: +get_gate_relative_duration(unsigned int num) const +{ + return this->_gate_relative_durations_sequence[num-1]; +} + +unsigned int +TimeGateDefinitions:: +get_gate_num(unsigned int num) const +{ + return this->_gate_sequence[num-1].first; +} + +unsigned int +TimeGateDefinitions:: +get_num_gates() const +{ + return static_cast(this->_gate_sequence.size()); +} + +unsigned int +TimeGateDefinitions:: +get_num_time_gates() const +{ + return static_cast(this->_gate_sequence.size()); +} + +// Set function (Nicolas A Karakatsanis) +void +TimeGateDefinitions:: +set_gate_relative_durations(const vector >& gate_sequence) +{ + std::cout << std::endl << "Setting the time fractions for each motion/gate relative to the total acquisition length of the current frame " << std::endl << std::endl; + if (gate_sequence.size() == 0) + error("TimeGateDefinitions::set_gate_relative_durations: Designated input gate_sequence has no gates"); + //Initialization for the total frame duration (of all motion/gates) + this->_acquisition_total_duration = 0; + + for (unsigned int current_gate = 1; current_gate <= gate_sequence.size(); ++current_gate) + this->_acquisition_total_duration += gate_sequence[current_gate-1].second; + + if (this->_acquisition_total_duration !=0) + { + std::cout << std::endl << "Motion/Gate index Time fraction (relative to total frame duration):" << std::endl; + for (unsigned int current_gate = 1; current_gate <= gate_sequence.size(); ++current_gate) + { + float relative_duration = gate_sequence[current_gate-1].second/this->_acquisition_total_duration; + std::cout << current_gate << " " << relative_duration << std::endl; + this->_gate_relative_durations_sequence.push_back(relative_duration); + + } + } +} + +TimeGateDefinitions:: +TimeGateDefinitions() +{} + +TimeGateDefinitions:: +TimeGateDefinitions(const string& gdef_filename) +{ + TimeGateDefinitions::read_gdef_file(gdef_filename); +} + + +void +TimeGateDefinitions:: +read_gdef_file(const string& gdef_filename) +{ + this->_acquisition_total_duration = 0; + ifstream in(gdef_filename.c_str()); + if (!in) + { + const string gdef_newfilename=gdef_filename+".gdef"; + warning("TimeGateDefinitions: Warning failed reading \"%s\"\n Trying with .gdef extension...", gdef_filename.c_str()); + ifstream innew(gdef_filename.c_str()); + if (!innew) + error("TimeGateDefinitions: Error reading \"%s\"\n", gdef_newfilename.c_str()); + } + while (true) + { + int gate_num; + double duration; + in >> gate_num >> duration; + if (!in) + break; + if (gate_num<0 || (gate_num>0 && duration<0)) + error("TimeGateDefinitions: Reading gate_def file \"%s\":\n" + "encountered negative numbers (%d, %g)\n", + gdef_filename.c_str(), gate_num, duration); + this->_gate_sequence.push_back(make_pair(gate_num, duration)); + } + if (this->get_num_gates()==0) + error("TimeGateDefinitions: Reading gate definitions file \"%s\":\n" + "I didn't discover any gates. Wrong file format?\n" + "A text file with something like\n\n" + "3 50.5\n1 10\n10 7\n\n" + "for 3rd gate of 50.5 secs, 1st gate of 10 secs, 10th gate of 7 secs.", + gdef_filename.c_str()); + + // Nicolas A Karakatsanis: Calculate and set the time fraction for each motion/gate relative to the total frame duration + this->set_gate_relative_durations(this->_gate_sequence); +} + +TimeGateDefinitions:: +TimeGateDefinitions(const vector >& gate_sequence) + : _gate_sequence(gate_sequence) +{ + if (gate_sequence.size() == 0) + error("TimeGateDefinitions: constructed with gate_sequence of no gates"); + return; + + this->_gate_sequence.resize(gate_sequence.size()); + this->_acquisition_total_duration = 0; + + for (unsigned int current_gate = 1; + current_gate <= this->_gate_sequence.size(); + ++current_gate) + { + this->_gate_sequence[current_gate-1].first = + gate_sequence[current_gate-1].first; + this->_gate_sequence[current_gate-1].second = + gate_sequence[current_gate-1].second; + } + + // Nicolas A Karakatsanis: Calculate and set the time fraction for each motion/gate relative to the total frame duration + this->set_gate_relative_durations(this->_gate_sequence); +} + +TimeGateDefinitions:: +TimeGateDefinitions(const vector& gate_num_vector, + const vector& duration_vector) +{ + if (gate_num_vector.size() != duration_vector.size()) + error("TimeGateDefinitions: constructed with gate_sequence " + "and durations of different length"); + this->_gate_sequence.resize(gate_num_vector.size()); + for (unsigned int current_gate = 1; + current_gate <= gate_num_vector.size(); + ++current_gate) + { + this->_gate_sequence[current_gate-1].first = + gate_num_vector[current_gate-1]; + this->_gate_sequence[current_gate-1].second = + duration_vector[current_gate-1]; + } + + // Nicolas A Karakatsanis: Calculate and set the time fraction for each motion/gate relative to the total frame duration + this->set_gate_relative_durations(this->_gate_sequence); +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/TruncateToCylindricalFOVImageProcessor.cxx b/src/buildblock/TruncateToCylindricalFOVImageProcessor.cxx new file mode 100644 index 0000000000..fa6f5bd16b --- /dev/null +++ b/src/buildblock/TruncateToCylindricalFOVImageProcessor.cxx @@ -0,0 +1,122 @@ +// +// +/* + Copyright (C) 2005- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ImageProcessor + \brief Implementations for class stir::TruncateToCylindricalFOVImageProcessor + \author Kris Thielemans + +*/ +#include "stir/TruncateToCylindricalFOVImageProcessor.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/recon_array_functions.h" + +START_NAMESPACE_STIR + +template <> +const char * const +TruncateToCylindricalFOVImageProcessor::registered_name = + "Truncate To Cylindrical FOV"; + + +template +void +TruncateToCylindricalFOVImageProcessor:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Truncate To Cylindrical FOV Parameters"); + this->parser.add_key("strictly_less_than_radius", &_strictly_less_than_radius); + this->parser.add_stop_key("END Truncate To Cylindrical FOV Parameters"); +} + + +template +void +TruncateToCylindricalFOVImageProcessor:: +set_defaults() +{ + base_type::set_defaults(); + this->_strictly_less_than_radius = true; +} + + + +template +Succeeded +TruncateToCylindricalFOVImageProcessor:: +virtual_set_up(const DiscretisedDensity<3,elemT>& density) + +{ + if (dynamic_cast *>(&density) == 0) + return Succeeded::no; + else + return Succeeded::yes; + +} + + +template +void +TruncateToCylindricalFOVImageProcessor:: +virtual_apply(DiscretisedDensity<3,elemT>& density) const + +{ + truncate_rim(density, 0, this->_strictly_less_than_radius); +} + + +template +void +TruncateToCylindricalFOVImageProcessor:: +virtual_apply(DiscretisedDensity<3,elemT>& out_density, + const DiscretisedDensity<3,elemT>& in_density) const +{ + out_density = in_density; + this->virtual_apply(out_density); +} + + +template +TruncateToCylindricalFOVImageProcessor:: +TruncateToCylindricalFOVImageProcessor() +{ + this->set_defaults(); +} + + + + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +// Register this class in the ImageProcessor registry +// static TruncateToCylindricalFOVImageProcessor::RegisterIt dummy; +// have the above variable in a separate file, which you need to pass at link time + +template class TruncateToCylindricalFOVImageProcessor; + +END_NAMESPACE_STIR + + + diff --git a/src/buildblock/Viewgram.cxx b/src/buildblock/Viewgram.cxx new file mode 100644 index 0000000000..fa0ba7e566 --- /dev/null +++ b/src/buildblock/Viewgram.cxx @@ -0,0 +1,161 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Implementations for non-inline functions of class stir::Viewgram + + \author Kris Thielemans + \author PARAPET project + +*/ + +#include "stir/Viewgram.h" +#include "boost/format.hpp" + +#ifdef _MSC_VER +// disable warning that not all functions have been implemented when instantiating +#pragma warning(disable: 4661) +#endif // _MSC_VER +START_NAMESPACE_STIR + +template +bool +Viewgram:: +has_same_characteristics(self_type const& other, + string& explanation) const +{ + using boost::format; + using boost::str; + + if (*this->get_proj_data_info_ptr() != + *other.get_proj_data_info_ptr()) + { + explanation = + str(format("Differing projection data info:\n%1%\n-------- vs-------\n %2%") + % this->get_proj_data_info_ptr()->parameter_info() + % other.get_proj_data_info_ptr()->parameter_info() + ); + return false; + } + if (this->get_view_num() != + other.get_view_num()) + { + explanation = + str(format("Differing view number: %1% vs %2%") + % this->get_view_num() + % other.get_view_num() + ); + return false; + } + if (this->get_segment_num() != + other.get_segment_num()) + { + explanation = + str(format("Differing segment number: %1% vs %2%") + % this->get_segment_num() + % other.get_segment_num() + ); + return false; + } + return true; +} + +template +bool +Viewgram:: +has_same_characteristics(self_type const& other) const +{ + std::string explanation; + return this->has_same_characteristics(other, explanation); +} + +template +bool +Viewgram:: +operator ==(const self_type& that) const +{ + return + this->has_same_characteristics(that) && + base_type::operator==(that); +} + +template +bool +Viewgram:: +operator !=(const self_type& that) const +{ + return !((*this) == that); +} + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +Viewgram:: +resize(const IndexRange<2>& range) +{ + if (range == this->get_index_range()) + return; + + assert(range.is_regular()==true); + + const int ax_min = range.get_min_index(); + const int ax_max = range.get_max_index(); + + shared_ptr pdi_ptr(proj_data_info_ptr->clone()); + + pdi_ptr->set_min_axial_pos_num(ax_min, get_segment_num()); + pdi_ptr->set_max_axial_pos_num(ax_max, get_segment_num()); + pdi_ptr->set_min_tangential_pos_num(range[ax_min].get_min_index()); + pdi_ptr->set_max_tangential_pos_num(range[ax_min].get_max_index()); + + proj_data_info_ptr = pdi_ptr; + + Array<2,elemT>::resize(range); + +} + + +/*! + This makes sure that the new Array dimensions are the same as those in the + ProjDataInfo member. +*/ +template +void +Viewgram:: +grow(const IndexRange<2>& range) +{ + resize(range); +} + + +/****************************** + instantiations + ****************************/ + +template class Viewgram; + +END_NAMESPACE_STIR diff --git a/src/buildblock/VoxelsOnCartesianGrid.cxx b/src/buildblock/VoxelsOnCartesianGrid.cxx new file mode 100644 index 0000000000..07886d2964 --- /dev/null +++ b/src/buildblock/VoxelsOnCartesianGrid.cxx @@ -0,0 +1,432 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, Hammersmith Imanet Ltd + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup densitydata + \brief Implementations of stir::VoxelsOnCartesianGrid + + \author Sanida Mustafovic + \author Kris Thielemans (with help from Alexey Zverovich) + \author PARAPET project + + +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/PixelsOnCartesianGrid.h" +#include "stir/NumericType.h" +#include "stir/IndexRange3D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/utilities.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/Scanner.h" +#include "stir/Bin.h" +#include "stir/IO/read_data.h" +#include "stir/info.h" +#include +#include +#include +#include // for auto_ptr +#ifndef STIR_NO_NAMESPACES +using std::ifstream; +using std::max; +#endif +#include + +START_NAMESPACE_STIR + +// a local help function to find appropriate sizes etc. + +static void find_sampling_and_z_size( + float& z_sampling, + float& s_sampling, + int& z_size, + const ProjDataInfo* proj_data_info_ptr) +{ + + // first z- things + + if (const ProjDataInfoCylindrical* + proj_data_info_cyl_ptr = + dynamic_cast(proj_data_info_ptr)) + + { + // the case of cylindrical data + + z_sampling = proj_data_info_cyl_ptr->get_ring_spacing()/2; + + // for 'span>1' case, we take z_size = number of sinograms in segment 0 + // for 'span==1' case, we take 2*num_rings-1 + + // first check if we have segment 0 + assert(proj_data_info_cyl_ptr->get_min_segment_num() <= 0); + assert(proj_data_info_cyl_ptr->get_max_segment_num() >= 0); + + if (z_size<0) + z_size = + proj_data_info_cyl_ptr->get_max_ring_difference(0) > + proj_data_info_cyl_ptr->get_min_ring_difference(0) + ? proj_data_info_cyl_ptr->get_num_axial_poss(0) + : 2*proj_data_info_cyl_ptr->get_num_axial_poss(0) - 1; + } + else + { + // this is any other weird projection data. We just check sampling of segment 0 + + // first check if we have segment 0 + assert(proj_data_info_cyl_ptr->get_min_segment_num() <= 0); + assert(proj_data_info_cyl_ptr->get_max_segment_num() >= 0); + + // TODO make this independent on segment etc. + z_sampling = + proj_data_info_ptr->get_sampling_in_t(Bin(0,0,1,0)); + + if (z_size<0) + z_size = proj_data_info_ptr->get_num_axial_poss(0); + } + + // now do s_sampling + + { + s_sampling = + proj_data_info_ptr->get_scanner_ptr()->get_default_bin_size(); + if (s_sampling ==0) + { + // TODO make this independent on segment etc. + s_sampling = + proj_data_info_ptr->get_sampling_in_s(Bin(0,0,0,0)); + info(boost::format("Determining voxel size from default_bin_size failed.\n" + "Using sampling_in_s for central bin %1%.") % + s_sampling); + } + else + { + info(boost::format("Determined voxel size by dividing default_bin_size (%1%) by zoom") % + s_sampling); + } + + } + +} + + +template +VoxelsOnCartesianGrid ::VoxelsOnCartesianGrid() + : DiscretisedDensityOnCartesianGrid<3,elemT>() +{} + +template +VoxelsOnCartesianGrid::VoxelsOnCartesianGrid + (const Array<3,elemT>& v, + const CartesianCoordinate3D& origin, + const BasicCoordinate<3,float>& grid_spacing) + :DiscretisedDensityOnCartesianGrid<3,elemT> + (v.get_index_range(),origin,grid_spacing) +{ + Array<3,elemT>::operator=(v); +} + + +template +VoxelsOnCartesianGrid::VoxelsOnCartesianGrid + (const IndexRange<3>& range, + const CartesianCoordinate3D& origin, + const BasicCoordinate<3,float>& grid_spacing) + :DiscretisedDensityOnCartesianGrid<3,elemT> + (range,origin,grid_spacing) +{} + +// KT 10/12/2001 use new format of args for the constructor, and remove the make_xy_size_odd constructor +template +VoxelsOnCartesianGrid::VoxelsOnCartesianGrid(const ProjDataInfo& proj_data_info, + const float zoom, + const CartesianCoordinate3D& origin, + const CartesianCoordinate3D& sizes) + +{ + this->set_origin(origin); + + int z_size = sizes.z(); + // initialise to 0 to prevent compiler warnings + //int z_size = 0; + float z_sampling = 0; + float s_sampling = 0; + find_sampling_and_z_size(z_sampling, s_sampling, z_size, &proj_data_info); + + this->set_grid_spacing( + CartesianCoordinate3D(z_sampling, s_sampling/zoom, s_sampling/zoom) + ); + int x_size_used = sizes.x(); + int y_size_used = sizes.y(); + + if (sizes.x()==-1 || sizes.y()==-1) + { + // default it to cover full FOV by taking image_size>=2*FOVradius_in_pixs+1 + const float FOVradius_in_mm = + max(proj_data_info.get_s(Bin(0,0,0,proj_data_info.get_max_tangential_pos_num())), + -proj_data_info.get_s(Bin(0,0,0,proj_data_info.get_min_tangential_pos_num()))); + if (sizes.x()==-1) + x_size_used = 2*static_cast(ceil(FOVradius_in_mm / get_voxel_size().x())) + 1; + if (sizes.y()==-1) + y_size_used = 2*static_cast(ceil(FOVradius_in_mm / get_voxel_size().y())) + 1; + } + if (x_size_used<0) + error("VoxelsOnCartesianGrid: attempt to construct image with negative x_size %d\n", + x_size_used); + if (x_size_used==0) + warning("VoxelsOnCartesianGrid: constructed image with x_size 0\n"); + if (y_size_used<0) + error("VoxelsOnCartesianGrid: attempt to construct image with negative y_size %d\n", + y_size_used); + if (y_size_used==0) + warning("VoxelsOnCartesianGrid: constructed image with y_size 0\n"); + + IndexRange3D range (0, z_size-1, + -(y_size_used/2), -(y_size_used/2) + y_size_used-1, + -(x_size_used/2), -(x_size_used/2) + x_size_used-1); + + + this->grow(range); +} + +/*! + This member function will be unnecessary when all compilers can handle + 'covariant' return types. + It is a non-virtual counterpart of get_empty_voxels_on_cartesian_grid. +*/ +template +VoxelsOnCartesianGrid* +VoxelsOnCartesianGrid::get_empty_voxels_on_cartesian_grid() const + +{ + return new VoxelsOnCartesianGrid(this->get_index_range(), + this->get_origin(), + this->get_grid_spacing()); +} + + +template +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +DiscretisedDensity<3,elemT>* +#else +VoxelsOnCartesianGrid* +#endif +VoxelsOnCartesianGrid::get_empty_copy() const +{ + return get_empty_voxels_on_cartesian_grid(); +} + +template +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +DiscretisedDensity<3,elemT>* +#else +VoxelsOnCartesianGrid* +#endif +VoxelsOnCartesianGrid::clone() const +{ + return new VoxelsOnCartesianGrid(*this); +} + +template +void +VoxelsOnCartesianGrid::set_voxel_size(const BasicCoordinate<3,float>& c) +{ + this->set_grid_spacing(c); +} + +template +PixelsOnCartesianGrid +VoxelsOnCartesianGrid::get_plane(const int z) const +{ + PixelsOnCartesianGrid + plane(this->operator[](z), + this->get_origin(), + Coordinate2D(get_voxel_size().y(), get_voxel_size().x()) + ); + return plane; +} + +/*! This function requires that the dimensions, origin and grid_spacings match. */ +template +void +VoxelsOnCartesianGrid::set_plane(const PixelsOnCartesianGrid& plane, const int z) +{ + assert(this->get_min_x() == plane.get_min_x()); + assert(this->get_max_x() == plane.get_max_x()); + assert(this->get_min_y() == plane.get_min_y()); + assert(this->get_max_y() == plane.get_max_y()); + assert(this->get_origin() == plane.get_origin()); + assert(this->get_voxel_size().x() == plane.get_pixel_size().x()); + assert(this->get_voxel_size().y() == plane.get_pixel_size().y()); + + this->operator[](z) = plane; +} + +template +void +VoxelsOnCartesianGrid::grow_z_range(const int min_z, const int max_z) +{ + /* This is somewhat complicated as Array is not very good with regular ranges. + It works by + - getting the regular range, + - 'grow' this by hand, + - make a general IndexRange from this + - call Array::grow with the general range + */ + CartesianCoordinate3D min_indices; + CartesianCoordinate3D max_indices; + + this->get_regular_range(min_indices, max_indices); + assert(min_z <= min_indices.z()); + assert(max_z >= max_indices.z()); + min_indices.z() = min_z; + max_indices.z() = max_z; + this->grow(IndexRange<3>(min_indices, max_indices)); +} + +template +BasicCoordinate<3,int> +VoxelsOnCartesianGrid:: +get_lengths() const +{ + return make_coordinate(this->get_z_size(), this->get_y_size(), this->get_x_size()); +} + +template +BasicCoordinate<3,int> +VoxelsOnCartesianGrid:: +get_min_indices() const +{ + CartesianCoordinate3D min_indices; + CartesianCoordinate3D max_indices; + this->get_regular_range(min_indices, max_indices); + return min_indices; +} + +template +BasicCoordinate<3,int> +VoxelsOnCartesianGrid:: +get_max_indices() const +{ + CartesianCoordinate3D min_indices; + CartesianCoordinate3D max_indices; + this->get_regular_range(min_indices, max_indices); + return max_indices; +} +#if 0 + +/**************************** + static members + ***************************/ +template +VoxelsOnCartesianGrid VoxelsOnCartesianGrid::ask_parameters() +{ + // this is completely superseded by read_from_file + // TODO make into something else useful? + + // Open file with data + ifstream input; + + ask_filename_and_open( + input, "Enter filename for input image", ".v", + ios::in | ios::binary); + + std::auto_ptr scanner_ptr = + std::auto_ptr(Scanner::ask_parameters()); + + + NumericType data_type; + { + int data_type_sel = ask_num("Type of data :\n\ +0: signed 16bit int, 1: unsigned 16bit int, 2: 4bit float ", 0,2,2); + switch (data_type_sel) + { + case 0: + data_type = NumericType::SHORT; + break; + case 1: + data_type = NumericType::USHORT; + break; + case 2: + data_type = NumericType::FLOAT; + break; + } + } + + + { + // find offset + + input.seekg(0L, ios::beg); + unsigned long file_size = find_remaining_size(input); + + unsigned long offset_in_file = ask_num("Offset in file (in bytes)", + 0UL,file_size, 0UL); + input.seekg(offset_in_file, ios::beg); + } + + + CartesianCoordinate3D + origin(0,0,0); + CartesianCoordinate3D + voxel_size(scanner_ptr->get_ring_spacing()/2, + scanner_ptr->get_default_bin_size(), + scanner_ptr->get_default_bin_size()); + int num_bins_from_scanner = scanner_ptr->get_default_num_arccorrected_bins(); + int num_rings_from_scanner = scanner_ptr->get_num_rings(); + int max_bin = (- num_bins_from_scanner /2) + num_bins_from_scanner -1; + if (num_bins_from_scanner % 2 == 0 && + ask("Make x,y size odd ?", true)) + max_bin++; + + + VoxelsOnCartesianGrid + input_image(IndexRange3D( + 0, 2*num_rings_from_scanner-2, + (-num_bins_from_scanner/2), max_bin, + (-num_bins_from_scanner/2), max_bin), + origin, + voxel_size); + + + // TODO handle scale factor in case of not reading float + float scale = float(1); + // note: currently stir:: needed to avoid conflict with Array::read_data + stir::read_data(input, input_image, + data_type, scale); + assert(scale==1); + + return input_image; + +} +#endif + +/********************************************** + instantiations + **********************************************/ +template class VoxelsOnCartesianGrid; + +END_NAMESPACE_STIR + +#include "stir/modelling/KineticParameters.h" +namespace stir { + template class VoxelsOnCartesianGrid >; + template class VoxelsOnCartesianGrid >; + template class VoxelsOnCartesianGrid >; +} diff --git a/src/buildblock/buildblock_registries.cxx b/src/buildblock/buildblock_registries.cxx new file mode 100644 index 0000000000..bb93c11fb3 --- /dev/null +++ b/src/buildblock/buildblock_registries.cxx @@ -0,0 +1,49 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup buildblock + + \brief File that registers all stir::RegisterObject children in buildblock + + \author Kris Thielemans + +*/ + +#include "stir/SeparableCartesianMetzImageFilter.h" +#include "stir/MedianImageFilter3D.h" +#include "stir/MinimalImageFilter3D.h" +#include "stir/ChainedDataProcessor.h" +#include "stir/ThresholdMinToSmallPositiveValueDataProcessor.h" +#include "stir/SeparableConvolutionImageFilter.h" +#include "stir/NonseparableConvolutionUsingRealDFTImageFilter.h" +#include "stir/TruncateToCylindricalFOVImageProcessor.h" +START_NAMESPACE_STIR + +static MedianImageFilter3D::RegisterIt dummy; +static MinimalImageFilter3D::RegisterIt dummy1; +static SeparableCartesianMetzImageFilter::RegisterIt dummy2; +static SeparableConvolutionImageFilter::RegisterIt dummy5; +static NonseparableConvolutionUsingRealDFTImageFilter::RegisterIt dummy7; +static TruncateToCylindricalFOVImageProcessor ::RegisterIt dummy6; +static ChainedDataProcessor >::RegisterIt dummy3; +static ThresholdMinToSmallPositiveValueDataProcessor >::RegisterIt dummy4; + +END_NAMESPACE_STIR diff --git a/src/buildblock/centre_of_gravity.cxx b/src/buildblock/centre_of_gravity.cxx new file mode 100644 index 0000000000..112bd76c56 --- /dev/null +++ b/src/buildblock/centre_of_gravity.cxx @@ -0,0 +1,174 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + + \brief Implementations of centre_of_gravity.h + \warning Only 1, 2 and 3 dimensional versions with floats are instantiated. + \author Kris Thielemans +*/ + + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/centre_of_gravity.h" +#include "stir/assign.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::min; +using std::max; +#endif + + +START_NAMESPACE_STIR + +template +T +find_unweighted_centre_of_gravity_1d(const VectorWithOffset& row) +{ + T CoG; + assign(CoG, 0); + for (int x=row.get_min_index(); x<=row.get_max_index(); x++) + CoG += row[x]*x; + return CoG; +} + +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#define T float +#else +template +#endif +T +find_unweighted_centre_of_gravity(const Array<1,T>& row) +{ + return find_unweighted_centre_of_gravity_1d(row); +} + +template +BasicCoordinate +find_unweighted_centre_of_gravity(const Array& array) +{ + if (array.size() == 0) + return BasicCoordinate(0); + + /* + Use recursion to lower dimensional case, based on the following + sum_ijk {i,j,k} a_ijk + = sum_i {i,0,0} sum_jk a_ijk + + sum_i sum_jk {0,j,k} a_ijk + The first term can be computed as a 1D CoG calculation, the + last term is a sum of num_dimensions-1 CoG's. + */ + // last term + BasicCoordinate lower_dimension_CoG(0); + for (int i=array.get_min_index(); i<=array.get_max_index(); ++i) + { + lower_dimension_CoG += find_unweighted_centre_of_gravity(array[i]); + } + + // first term + Array<1,T> + first_dim_sums(array.get_min_index(), array.get_max_index()); + for (int i=array.get_min_index(); i<=array.get_max_index(); ++i) + { + first_dim_sums[i] = array[i].sum(); + } + const T first_dim_CoG = + find_unweighted_centre_of_gravity(first_dim_sums); + + // put them into 1 coordinate and return + return join(first_dim_CoG, lower_dimension_CoG); +} + + +template +BasicCoordinate +find_centre_of_gravity(const Array& array) +{ + const T sum = array.sum(); + + if (sum == 0) + error("Warning: find_centre_of_gravity cannot properly normalise, as data sum to 0\n"); + return + find_unweighted_centre_of_gravity(array) / sum; +} + + +template +void +find_centre_of_gravity_in_mm_per_plane( VectorWithOffset< CartesianCoordinate3D >& allCoG, + VectorWithOffset& weights, + const VoxelsOnCartesianGrid& image) +{ + + allCoG = + VectorWithOffset< CartesianCoordinate3D > + (image.get_min_index(), image.get_max_index()); + weights = + VectorWithOffset + (image.get_min_index(), image.get_max_index()); + + for (int z=image.get_min_index(); z<=image.get_max_index(); z++) + { + weights[z] = max(image[z].sum(), 0.F); + if (weights[z]==0) + allCoG[z] = CartesianCoordinate3D(0.F,0.F,0.F); + else + { + const BasicCoordinate<2,T> CoG = find_centre_of_gravity(image[z]); + allCoG[z].y() = CoG[1]; + allCoG[z].x() = CoG[2]; + } + allCoG[z].z() = static_cast(z); + allCoG[z] = image.get_physical_coordinates_for_indices(allCoG[z]); + } +} + +template +CartesianCoordinate3D +find_centre_of_gravity_in_mm(const VoxelsOnCartesianGrid& image) +{ + const BasicCoordinate<3,T> CoG = find_centre_of_gravity(image); + return image.get_physical_coordinates_for_indices(CoG); +} + + + +//******* INSTANTIATIONS + +// next instantiations already does 1 and 2 dimensional versions of the other functions +template +void +find_centre_of_gravity_in_mm_per_plane( VectorWithOffset< CartesianCoordinate3D >& allCoG, + VectorWithOffset& weights, + const VoxelsOnCartesianGrid& image); + +/* +template +BasicCoordinate<3,float> +find_centre_of_gravity(const Array<3,float>&); +*/ +// this instantiates 3D versions +template +CartesianCoordinate3D +find_centre_of_gravity_in_mm(const VoxelsOnCartesianGrid& image); + +END_NAMESPACE_STIR diff --git a/src/buildblock/error.cxx b/src/buildblock/error.cxx new file mode 100644 index 0000000000..3183fe8442 --- /dev/null +++ b/src/buildblock/error.cxx @@ -0,0 +1,63 @@ +// +// +/*! + \file + + \brief defines the stir::error() function + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/error.h" + +#include +#include +#include +/* Warning: vsnprintf is only ISO C99. So your compiler might not have it. + Visual Studio can be accomodated with the following work-around +*/ +#ifdef BOOST_MSVC +#define vsnprintf _vsnprintf +#endif + +START_NAMESPACE_STIR + +void error(const char *const s, ...) +{ + va_list ap; + va_start(ap, s); + const unsigned size=10000; + char tmp[size]; + const int returned_size= vsnprintf(tmp,size, s, ap); + if (returned_size<0) + std::cerr << "\nERROR: but error formatting error message" << std::endl; + else + { + std::cerr << "\nERROR: " << tmp <(returned_size)>=size) + std::cerr << "\nWARNING: previous error message truncated as it exceeds " + << size << "bytes" << std::endl; + } + std::string msg = tmp; + throw msg; +} +END_NAMESPACE_STIR diff --git a/src/buildblock/extend_projdata.cxx b/src/buildblock/extend_projdata.cxx new file mode 100644 index 0000000000..ccbbdcbeee --- /dev/null +++ b/src/buildblock/extend_projdata.cxx @@ -0,0 +1,170 @@ +// +// +/* + Copyright (C) 2005- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! +\file +\ingroup projdata +\brief Implementation of functions to extension of direct sinograms in view direction + +\author Kris Thielemans +\author Charalampos Tsoumpas + +*/ +#include "stir/Array.h" +#include "stir/SegmentBySinogram.h" +#include "stir/Sinogram.h" +#include "stir/ProjDataInfo.h" +#include "stir/IndexRange.h" +#include "stir/Bin.h" +#include "stir/round.h" + +START_NAMESPACE_STIR + +namespace detail +{ + /* This function takes symmetries in the sinogram space into account + to find data in the negative segment if necessary. + However, it needs testing if it would work for non-direct sinograms. + */ + inline static + Array<2,float> + extend_sinogram_in_views(const Array<2,float>& sino_positive_segment, + const Array<2,float>& sino_negative_segment, + const ProjDataInfo& proj_data_info, + const int min_view_extension, const int max_view_extension) + { + //* Check if projdata are from 0 to pi-phi + bool min_is_extended=false; + bool max_is_extended=false; + BasicCoordinate<2,int> min_in, max_in; + if (!sino_positive_segment.get_regular_range(min_in, max_in)) + { + warning("input segment 0 should have a regular range"); + } + + const int org_min_view_num=min_in[1]; + const int org_max_view_num=max_in[1]; + + const float min_phi = proj_data_info.get_phi(Bin(0,0,0,0)); + const float max_phi = proj_data_info.get_phi(Bin(0,max_in[1],0,0)); + + const float sampling_phi = + proj_data_info.get_phi(Bin(0,1,0,0)) - min_phi; + const int num_views_for_180 = round(_PI/sampling_phi); + + if (fabs(min_phi)< .01) + { + min_in[1]-=min_view_extension; + min_is_extended=true; + } + if (fabs(max_phi-(_PI-sampling_phi))<.01) + { + max_in[1]+=max_view_extension; + max_is_extended=true; + } + + + IndexRange<2> extended_range(min_in, max_in); + Array<2,float> input_extended_view(extended_range); + + if (!min_is_extended) + warning("Minimum view of the original projdata is not 0"); + if (!max_is_extended) + warning("Maximum view of the original projdata is not 180-sampling_phi"); + + for (int view_num=min_in[1]; view_num<=max_in[1]; ++view_num) + { + bool use_extension=false; + int symmetric_view_num=0; + if (view_numorg_max_view_num && max_is_extended==true) + { + use_extension=true; + symmetric_view_num = view_num - num_views_for_180; + } + + if (!use_extension) + input_extended_view[view_num]= + sino_positive_segment[view_num]; + else + { + const int symmetric_min = std::max(min_in[2], -max_in[2]); + const int symmetric_max = std::min(-min_in[2], max_in[2]); + for (int tang_num=symmetric_min; tang_num<=symmetric_max; ++tang_num) + input_extended_view[view_num][tang_num]= + sino_negative_segment[symmetric_view_num][-tang_num]; + // now do extrapolation where we don't have data + for (int tang_num=min_in[2]; tang_num +extend_segment_in_views(const SegmentBySinogram& sino, + const int min_view_extension, const int max_view_extension) +{ + if (sino.get_segment_num()!=0) + error("extend_segment with single segment works only for segment 0"); + + BasicCoordinate<3,int> min, max; + + min[1]=sino.get_min_axial_pos_num(); + max[1]=sino.get_max_axial_pos_num(); + min[2]=sino.get_min_view_num(); + max[2]=sino.get_max_view_num(); + min[3]=sino.get_min_tangential_pos_num(); + max[3]=sino.get_max_tangential_pos_num(); + const IndexRange<3> out_range(min,max); + Array<3,float> out(out_range); + for (int ax_pos_num=min[1]; ax_pos_num <=max[1] ; ++ax_pos_num) + { + out[ax_pos_num] = + detail:: + extend_sinogram_in_views(sino[ax_pos_num],sino[ax_pos_num], + *(sino.get_proj_data_info_ptr()), + min_view_extension, max_view_extension); + } + return out; +} + +Array<2,float> +extend_sinogram_in_views(const Sinogram& sino, + const int min_view_extension, const int max_view_extension) +{ + if (sino.get_segment_num()!=0) + error("extend_segment with single segment works only for segment 0"); + + return + detail:: + extend_sinogram_in_views(sino, sino, + *(sino.get_proj_data_info_ptr()), + min_view_extension, max_view_extension); +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/find_fwhm_in_image.cxx b/src/buildblock/find_fwhm_in_image.cxx new file mode 100644 index 0000000000..e4e6371051 --- /dev/null +++ b/src/buildblock/find_fwhm_in_image.cxx @@ -0,0 +1,358 @@ +/* + Copyright (C) 2004- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup resolution + \brief Implementations of functions defined in find_fwhm_in_image.h + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ +#include "stir/shared_ptr.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/find_fwhm_in_image.h" +#include "stir/index_at_maximum.h" +#include "stir/round.h" +#include "stir/assign_to_subregion.h" +#include "stir/extract_line.h" +#include +#include + +using namespace std; + +START_NAMESPACE_STIR + +/* + 2 functions that calculate the maximum point (x0,y0) of a parabola that passes through 3 points. + + As input it takes the Begin and End Iterators of a sequence of numbers (e.g. vector). + The three points are the maximum (x2,y2) of this sequence and the two neighbour points + (x1,y1) and (x3,y3). + + The first function returns the maximum point value y0, the secodn returns x0 +*/ + +template +static float parabolic_3points_fit(const RandomAccessIterType& begin_iter, + const RandomAccessIterType& end_iter); + +template +static float parabolic_3points_fit_x0(const RandomAccessIterType& begin_iter, + const RandomAccessIterType& end_iter) ; + +template +static float find_NEMA_level(const Array<1,elemT>& column, const float level) +{ + const float real_maximum_value = + parabolic_3points_fit(column.begin(),column.end()); + return find_level_width(column.begin(),column.end(),real_maximum_value/level) ; +} + +template +std::list > +find_fwhm_in_image(DiscretisedDensity<3,elemT> & input_image, + const unsigned int num_maxima, + const float level, + const int dimension, + const bool nema) +{ + ResolutionIndex<3,float> res_index; + std::list > list_res_index; + + const DiscretisedDensityOnCartesianGrid <3,float>* input_image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>*> (&input_image); + if (input_image_cartesian_ptr == 0) + { + error("find_fwhm_in_image currently only works with DiscretisedDensityOnCartesianGrid images"); + } + BasicCoordinate<3,int> min_index, max_index; + if (!input_image.get_regular_range(min_index, max_index)) + error("find_fwhm_in_image works only on regular ranges\n"); + + CartesianCoordinate3D + grid_spacing=input_image_cartesian_ptr->get_grid_spacing(); + + for (unsigned int maximum_num=0; maximum_num!=num_maxima; ++ maximum_num) + { + float current_maximum ; + BasicCoordinate<3,int> max_location ; + Coordinate3D do_direction(true,true,true); + if(dimension!=0)//Divide into [maximum_num] slices and returns a max per slice + { + const float step=float( max_index[dimension]- min_index[dimension])/float(num_maxima-1); + const int slice= round(min_index[dimension] + maximum_num*step); + max_location = maximum_location_per_slice(input_image,slice,dimension); + current_maximum = input_image[max_location]; + do_direction[dimension]=false; + } + else // Searches through out the image to find the point sources + { + max_location = indices_at_maximum(input_image); + current_maximum = input_image[max_location]; + } + res_index.voxel_location = max_location; + res_index.voxel_value = current_maximum ; + for(int i=1;i<=3;++i) + res_index.resolution[i] = grid_spacing[i]* + (do_direction[i] ? (nema?find_NEMA_level(extract_line(input_image,max_location, + i), level) : + find_NEMA_level(interpolate_line(input_image,max_location, + do_direction, + i), level)): 0); + list_res_index.push_back(res_index); + if (maximum_num+1!= num_maxima && dimension==0) + assign_to_subregion(input_image,max_location,round(res_index.resolution/grid_spacing/level*2), input_image.find_min()); + } + return list_res_index ; +} + +template +float find_level_width(const RandomAccessIterType& begin_iterator, + const RandomAccessIterType& current_max_iterator, + const RandomAccessIterType& end_iterator, + const float level_height) +{ + const int max_position = static_cast(current_max_iterator - begin_iterator + 1); + RandomAccessIterType current_iter = current_max_iterator; + while(current_iter!= end_iterator && *current_iter > level_height) ++current_iter; + if (current_iter==end_iterator) + { + warning("find_level_width: level extends beyond border." + "Cannot find the real level-width of this point source!"); + // go 1 back to remain inside the range + --current_iter; + } + + // do linear interpolation to find position of level_height + float right_level_max = (*current_iter - level_height)/(*current_iter-*(current_iter-1)); + right_level_max = float(current_iter-(begin_iterator+max_position)) - right_level_max ; + + current_iter = current_max_iterator; + while(current_iter!=begin_iterator && *current_iter > level_height) --current_iter; + if (current_iter == begin_iterator && *current_iter > level_height) + { + warning("find_level_width: level extends beyond border." + "Cannot find the real level-width of this point source!"); + } + + float left_level_max = (*current_iter - level_height)/(*current_iter-*(current_iter+1)); + left_level_max += float(current_iter-(begin_iterator+max_position)); + + return right_level_max - left_level_max; +} + +template +float find_level_width(const RandomAccessIterType& begin_iterator, + const RandomAccessIterType& end_iterator, + const float level_height) +{ + return find_level_width(begin_iterator, + std::max_element(begin_iterator,end_iterator), + end_iterator, + level_height); +} + +template +BasicCoordinate<3,int> +maximum_location_per_slice(const Array<3,elemT>& input_array, + const int slice, const int dimension) +{ + BasicCoordinate<3,int> min_index, max_index; + if (!input_array.get_regular_range(min_index, max_index)) + error("maximum_location_per_slice works only on regular ranges\n"); + BasicCoordinate<3,int> min_slice_index=min_index, + max_slice_index=max_index; + min_slice_index[dimension] = slice ; + max_slice_index[dimension] = slice ; + const IndexRange<3> slice_range(min_slice_index,max_slice_index); + Array<3,elemT> slice_array(slice_range); + BasicCoordinate<3,int> counter; + for (counter[1]=min_slice_index[1]; counter[1]<= max_slice_index[1] ; ++counter[1]) + for (counter[2]=min_slice_index[2]; counter[2]<= max_slice_index[2] ; ++counter[2]) + for (counter[3]=min_slice_index[3]; counter[3]<= max_slice_index[3] ; ++counter[3]) + slice_array[counter] = input_array[counter]; + return indices_at_maximum(slice_array); +} + +template +Array<1,elemT> +interpolate_line(const Array<3,elemT>& input_array, + const BasicCoordinate<3,int>& max_location, + const BasicCoordinate<3,bool>& do_direction, + const int dimension) +/* + This function interpolates a column from the given array, that includes the particular voxel and returns + a column in Array<1,elemT> type, at the wanted dimension (z=1, y=2, x=3). +//Assume same index at each direction // +*/ +{ + BasicCoordinate<3,int> min_index, max_index; + if (!input_array.get_regular_range(min_index, max_index)) + error("interpolate_line works only on regular ranges\n"); + Array<1,elemT> line(min_index[dimension],max_index[dimension]); + { + Array<1,elemT> line_z(min_index[1],max_index[1]), + line_y(min_index[2],max_index[2]), + line_x(min_index[3],max_index[3]), + line_000(min_index[dimension],max_index[dimension]), + line_001(min_index[dimension],max_index[dimension]), + line_010(min_index[dimension],max_index[dimension]), + line_100(min_index[dimension],max_index[dimension]), + line_011(min_index[dimension],max_index[dimension]), + line_101(min_index[dimension],max_index[dimension]), + line_110(min_index[dimension],max_index[dimension]), + line_111(min_index[dimension],max_index[dimension]); + line_z = extract_line(input_array,max_location,1); + line_y = extract_line(input_array,max_location,2); + line_x = extract_line(input_array,max_location,3); + float z0=do_direction[1] ? parabolic_3points_fit_x0(line_z.begin(),line_z.end()) : 0; + float y0=do_direction[2] ? parabolic_3points_fit_x0(line_y.begin(),line_y.end()) : 0; + float x0=do_direction[3] ? parabolic_3points_fit_x0(line_x.begin(),line_x.end()) : 0; + + BasicCoordinate<3,int> location_000,location_001,location_010,location_100, + location_011,location_101,location_110,location_111; + location_000 = max_location; + + location_001[1] = max_location[1]; + location_001[2] = max_location[2]; + location_001[3] = x0>0 ? max_location[3]+1 : (x0<0 ? max_location[3]-1 : max_location[3]) ; + + location_010[1] = max_location[1]; + location_010[2] = y0>0 ? max_location[2]+1 : (y0<0 ? max_location[2]-1 : max_location[2]) ; + location_010[3] = max_location[3]; + + + location_100[1] = z0>0 ? max_location[1]+1 : (z0<0 ? max_location[1]-1 : max_location[1]) ; + location_100[2] = max_location[2]; + location_100[3] = max_location[3]; + + + location_011[1] = max_location[1]; + location_011[2] = y0>0 ? max_location[2]+1 : (y0<0 ? max_location[2]-1 : max_location[2]) ; + location_011[3] = x0>0 ? max_location[3]+1 : (x0<0 ? max_location[3]-1 : max_location[3]) ; + + location_101[1] = z0>0 ? max_location[1]+1 : (z0<0 ? max_location[1]-1 : max_location[1]) ; + location_101[2] = max_location[2]; + location_101[3] = x0>0 ? max_location[3]+1 : (x0<0 ? max_location[3]-1 : max_location[3]) ; + + location_110[1] = z0>0 ? max_location[1]+1 : (z0<0 ? max_location[1]-1 : max_location[1]) ; + location_110[2] = y0>0 ? max_location[2]+1 : (y0<0 ? max_location[2]-1 : max_location[2]) ; + location_110[3] = max_location[3] ; + + location_111[1] = z0>0 ? max_location[1]+1 : (z0<0 ? max_location[1]-1 : max_location[1]) ; + location_111[2] = y0>0 ? max_location[2]+1 : (y0<0 ? max_location[2]-1 : max_location[2]) ; + location_111[3] = x0>0 ? max_location[3]+1 : (x0<0 ? max_location[3]-1 : max_location[3]) ; + + line_000 = extract_line(input_array,location_000,dimension); + line_001 = extract_line(input_array,location_001,dimension); + line_010 = extract_line(input_array,location_010,dimension); + line_100 = extract_line(input_array,location_100,dimension); + line_011 = extract_line(input_array,location_011,dimension); + line_101 = extract_line(input_array,location_101,dimension); + + line_110 = extract_line(input_array,location_110,dimension); + line_111 = extract_line(input_array,location_111,dimension); + line = line_000*(1-abs(z0))*(1-abs(y0))*(1-abs(x0)) ; + line+= line_001*(1-abs(z0))*(1-abs(y0))*abs(x0) ; + line+= line_010*(1-abs(z0))*abs(y0)*(1-abs(x0)) ; + line+= line_100*abs(z0)*(1-abs(y0))*(1-abs(x0)) ; + line+= line_011*(1-abs(z0))*abs(y0)*abs(x0) ; + line+= line_101*abs(z0)*(1-abs(y0))*abs(x0) ; + line+= line_110*abs(z0)*abs(y0)*(1-abs(x0)) ; + line+= line_111*abs(z0)*abs(y0)*abs(x0) ; + } + return line ; +} + +template +float parabolic_3points_fit(const RandomAccessIterType& begin_iter, + const RandomAccessIterType& end_iter) +{ + float real_max_value; + const RandomAccessIterType max_iter = std::max_element(begin_iter,end_iter); + if (max_iter==end_iter-1 || max_iter==begin_iter) + return *max_iter; // In case maximum is at the borders of the image + { + const float y1 = *(max_iter-1); + const float y2 = *max_iter; + const float y3 = *(max_iter+1); + const float x1 = -1.; + const float x2 = 0.; // Giving the axis zero point at x2. + const float x3 = 1.; + const float a1 = (x1-x2)*(x1-x3); + const float a2 = (x2-x1)*(x2-x3); + const float a3 = (x3-x2)*(x3-x1); + /* + Now find parameters for parabola that fits these 3 points. + Using Langrange's classical formula, equation will be: + y(x)=((x - x2)*(x - x3)*y1/a1)+ ((x - x1)*(x - x3)*y2/a2) + ((x - x1)*(x - x2)*y3/a3) + y'(x0) = 0 => x0 = 0.5*(x1*a1*(y2*a3+y3*a2)+x2*a2*(y1*a3+y3*a1)+x3*a3*(y1*a2+y2*a1))/(y1*a2*a3+y2*a1*a3+y3*a1*a2) + */ + const float x0 = 0.5F*(x1*a1*(y2*a3+y3*a2)+x2*a2*(y1*a3+y3*a1)+x3*a3*(y1*a2+y2*a1)) + /(y1*a2*a3+y2*a1*a3+y3*a1*a2) ; + real_max_value = ((x0 - x2)*(x0 - x3)*y1/a1) + + ((x0 - x1)*(x0 - x3)*y2/a2) + + ((x0 - x1)*(x0 - x2)*y3/a3) ; + + } + return real_max_value ; +} + +template +float parabolic_3points_fit_x0(const RandomAccessIterType& begin_iter, + const RandomAccessIterType& end_iter) +{ + // float real_max_value; + const RandomAccessIterType max_iter = std::max_element(begin_iter,end_iter); + if (max_iter==end_iter-1) return 0; // In case maximum is at the borders of the image + if (max_iter==begin_iter) return 0; + //else + + const float y1 = *(max_iter-1); + const float y2 = *max_iter; + const float y3 = *(max_iter+1); + const float x1 = -1.; + const float x2 = 0.; // Giving the axis zero point at x2. + const float x3 = 1.; + const float a1 = (x1-x2)*(x1-x3); + const float a2 = (x2-x1)*(x2-x3); + const float a3 = (x3-x2)*(x3-x1); + /* + Now find parameters for parabola that fits these 3 points. + Using Langrange's classical formula, equation will be: + y(x)=((x - x2)*(x - x3)*y1/a1)+ ((x - x1)*(x - x3)*y2/a2) + ((x - x1)*(x - x2)*y3/a3) + y'(x0) = 0 => x0 = 0.5*(x1*a1*(y2*a3+y3*a2)+x2*a2*(y1*a3+y3*a1)+x3*a3*(y1*a2+y2*a1))/(y1*a2*a3+y2*a1*a3+y3*a1*a2) + */ + const float x0 = 0.5F*(x1*a1*(y2*a3+y3*a2)+x2*a2*(y1*a3+y3*a1)+x3*a3*(y1*a2+y2*a1)) + /(y1*a2*a3+y2*a1*a3+y3*a1*a2) ; + return x0 ; +} + + +/*************************************************** + instantiations +***************************************************/ +template +std::list > +find_fwhm_in_image<>(DiscretisedDensity<3,float> & input_image, + const unsigned int num_maxima, + const float level, + const int dimension, + const bool nema); + + +END_NAMESPACE_STIR diff --git a/src/buildblock/getopt.c b/src/buildblock/getopt.c new file mode 100644 index 0000000000..fff1f5164c --- /dev/null +++ b/src/buildblock/getopt.c @@ -0,0 +1,1260 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef HAVE_SYSTEM_GETOPT + + +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# ifndef _ +# define _(msgid) gettext (msgid) +# endif +# else +# define _(msgid) (msgid) +# endif +# if defined _LIBC && defined USE_IN_LIBIO +# include +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "stir/getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +# if HAVE_STRING_H || WIN32 /* Pete Wilson mod 7/28/02 */ +# include +# else +# include +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (posixly_correct == NULL + && argc == __libc_argc && argv == __libc_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT and LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + __asprintf (&buf, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#else + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); +#endif + } + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; +#endif + + if (argv[optind - 1][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + __asprintf (&buf, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#else + fprintf (stderr, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + __asprintf (&buf, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], + pfound->name); +#else + fprintf (stderr, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#endif + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + __asprintf (&buf, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); +#endif + } + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; +#endif + + if (argv[optind][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#endif + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; +#endif + + if (posixly_correct) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + __asprintf (&buf, _("%s: illegal option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); +#endif + } + else + { +#if defined _LIBC && defined USE_IN_LIBIO + __asprintf (&buf, _("%s: invalid option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#endif + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + __asprintf (&buf, _("%s: option requires an argument -- %c\n"), + argv[0], c); + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#else + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + __asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#else + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); +#endif + } + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + __asprintf (&buf, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#else + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + __asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); +#endif + } + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + __asprintf (&buf, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + free (buf); +#else + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +/* #define TEST */ /* Pete Wilson mod 7/28/02 */ +#ifdef TEST + +#ifndef exit /* Pete Wilson mod 7/28/02 */ + int exit(int); /* Pete Wilson mod 7/28/02 */ +#endif /* Pete Wilson mod 7/28/02 */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ + +#endif /* HAVE_SYSTEM_GETOPT */ diff --git a/src/buildblock/interfile_keyword_functions.cxx b/src/buildblock/interfile_keyword_functions.cxx new file mode 100644 index 0000000000..0bd6d48354 --- /dev/null +++ b/src/buildblock/interfile_keyword_functions.cxx @@ -0,0 +1,75 @@ +/*! + \file + \ingroup buildblock + + \brief Implementations for stir::standardise_interfile_keyword + + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/interfile_keyword_functions.h" +#include + +using namespace std; + +START_NAMESPACE_STIR + +string +standardise_interfile_keyword(const string& keyword) +{ + string::size_type cp =0; //current index + char const * const white_space = " \t_!"; + + // skip white space + cp=keyword.find_first_not_of(white_space,0); + + if(cp==string::npos) + return string(); + + // remove trailing white spaces + const string::size_type eok=keyword.find_last_not_of(white_space); + + string kw; + kw.reserve(eok-cp+1); + bool previous_was_white_space = false; + while (cp <= eok) + { + if (isspace(static_cast(keyword[cp])) || keyword[cp]=='_' || keyword[cp]=='!') + { + if (!previous_was_white_space) + { + kw.append(1,' '); + previous_was_white_space = true; + } + // else: skip this white space character + } + else + { + kw.append(1,static_cast(tolower(static_cast(keyword[cp])))); + previous_was_white_space = false; + } + ++cp; + } + return kw; +} + + +END_NAMESPACE_STIR diff --git a/src/buildblock/interpolate_projdata.cxx b/src/buildblock/interpolate_projdata.cxx new file mode 100644 index 0000000000..7a1fef3245 --- /dev/null +++ b/src/buildblock/interpolate_projdata.cxx @@ -0,0 +1,307 @@ +// +// +/* + Copyright (C) 2005 - 2009-10-27, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Perform B-Splines Interpolation of sinograms + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ +#include "stir/ProjData.h" +//#include "stir/display.h" +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/IndexRange.h" +#include "stir/BasicCoordinate.h" +#include "stir/Sinogram.h" +#include "stir/SegmentBySinogram.h" +#include "stir/Succeeded.h" +#include "stir/numerics/BSplines.h" +#include "stir/numerics/BSplinesRegularGrid.h" +#include "stir/interpolate_projdata.h" +#include "stir/extend_projdata.h" +#include "stir/numerics/sampling_functions.h" +#include + +START_NAMESPACE_STIR + +namespace detail_interpolate_projdata +{ + /* Collection of functions to remove interleaving in non-arccorrected data. + + It does this by doubling the number of views, and filling in the new + tangential positions by averaging the 4 neighbouring bins. + + WARNING: most of STIR will get confused by the resulting sinograms, + so only use them here for the interpolate_projdata implementation. + */ + + static shared_ptr + make_non_interleaved_proj_data_info(const ProjDataInfo& proj_data_info) + { + + if (dynamic_cast(&proj_data_info) == NULL) + error("make_non_interleaved_proj_data is only appropriate for non-arccorrected data"); + + shared_ptr new_proj_data_info_sptr( + proj_data_info.clone()); + new_proj_data_info_sptr-> + set_num_views(proj_data_info.get_num_views()*2); + return new_proj_data_info_sptr; + } + + static void + make_non_interleaved_sinogram(Sinogram& out_sinogram, + const Sinogram& in_sinogram) + { + if (dynamic_cast(in_sinogram.get_proj_data_info_ptr()) == NULL) + error("make_non_interleaved_proj_data is only appropriate for non-arccorrected data"); + + assert(out_sinogram.get_min_view_num() == 0); + assert(in_sinogram.get_min_view_num() == 0); + assert(out_sinogram.get_num_views() == in_sinogram.get_num_views()*2); + assert(in_sinogram.get_segment_num() == 0); + assert(out_sinogram.get_segment_num() == 0); + + const int in_num_views = in_sinogram.get_num_views(); + + for (int view_num = out_sinogram.get_min_view_num(); + view_num <= out_sinogram.get_max_view_num(); + ++view_num) + { + // TODO don't put in outer tangential poss for now to avoid boundary stuff + for (int tangential_pos_num = out_sinogram.get_min_tangential_pos_num()+1; + tangential_pos_num <= out_sinogram.get_max_tangential_pos_num()-1; + ++tangential_pos_num) + { + if ((view_num+tangential_pos_num)%2 == 0) + { + const int in_view_num = + view_num%2==0 ? view_num/2 : (view_num+1)/2; + out_sinogram[view_num][tangential_pos_num] = + in_sinogram[in_view_num%in_num_views][(in_view_num>=in_num_views? -1: 1)*tangential_pos_num]; + } + else + { + const int next_in_view = view_num/2+1; + const int other_in_view = (view_num+1)/2; + + out_sinogram[view_num][tangential_pos_num] = + (in_sinogram[view_num/2][tangential_pos_num] + + in_sinogram[next_in_view%in_num_views][(next_in_view>=in_num_views ? -1 : 1)*tangential_pos_num] + + in_sinogram[other_in_view%in_num_views][(other_in_view>=in_num_views ? -1 : 1)*(tangential_pos_num-1)] + + in_sinogram[other_in_view%in_num_views][(other_in_view>=in_num_views ? -1 : 1)*(tangential_pos_num+1)] + )/4; + } + } + } + } + +#if 0 + // not needed for now + static Sinogram + make_non_interleaved_sinogram(const ProjDataInfo& non_interleaved_proj_data_info, + const Sinogram& in_sinogram) + { + Sinogram out_sinogram = + non_interleaved_proj_data_info.get_empty_sinogram(in_sinogram.get_axial_pos_num(), + in_sinogram.get_segment_num()); + + make_non_interleaved_sinogram(out_sinogram, in_sinogram); + return out_sinogram; + } +#endif + + static void + make_non_interleaved_segment(SegmentBySinogram& out_segment, + const SegmentBySinogram& in_segment) + { + if (dynamic_cast(in_segment.get_proj_data_info_ptr()) == NULL) + error("make_non_interleaved_proj_data is only appropriate for non-arccorrected data"); + + for (int axial_pos_num = out_segment.get_min_axial_pos_num(); + axial_pos_num <= out_segment.get_max_axial_pos_num(); + ++axial_pos_num) + { + Sinogram out_sinogram = out_segment.get_sinogram(axial_pos_num); + make_non_interleaved_sinogram(out_sinogram, + in_segment.get_sinogram(axial_pos_num)); + out_segment.set_sinogram(out_sinogram); + } + } + + static SegmentBySinogram + make_non_interleaved_segment(const ProjDataInfo& non_interleaved_proj_data_info, + const SegmentBySinogram& in_segment) + { + SegmentBySinogram out_segment = + non_interleaved_proj_data_info.get_empty_segment_by_sinogram(in_segment.get_segment_num()); + + make_non_interleaved_segment(out_segment, in_segment); + return out_segment; + } + +} // end namespace detail_interpolate_projdata + + +using namespace detail_interpolate_projdata; + +Succeeded +interpolate_projdata(ProjData& proj_data_out, + const ProjData& proj_data_in, const BSpline::BSplineType these_types, + const bool remove_interleaving, + const bool use_view_offset) +{ + BasicCoordinate<3, BSpline::BSplineType> these_types_3; + these_types_3[1]=these_types_3[2]=these_types_3[3]=these_types; + interpolate_projdata(proj_data_out,proj_data_in,these_types_3, remove_interleaving, use_view_offset); + return Succeeded::yes; +} + +Succeeded +interpolate_projdata(ProjData& proj_data_out, + const ProjData& proj_data_in, + const BasicCoordinate<3, BSpline::BSplineType> & these_types, + const bool remove_interleaving, + const bool use_view_offset) +{ + + if (use_view_offset) + warning("interpolate_projdata with use_view_offset is EXPERIMENTAL and NOT TESTED."); + + const ProjDataInfo & proj_data_in_info = + *proj_data_in.get_proj_data_info_ptr(); + const ProjDataInfo & proj_data_out_info = + *proj_data_out.get_proj_data_info_ptr(); + + if (typeid(proj_data_in_info) != typeid(proj_data_out_info)) + { + error("interpolate_projdata needs both projection data to be of the same type\n" + "(e.g. both arc-corrected or both not arc-corrected)"); + } + // check for the same ring radius + // This is strictly speaking only necessary for non-arccorrected data, but + // we leave it in for all cases. + if (fabs(proj_data_in_info.get_scanner_ptr()->get_inner_ring_radius() - + proj_data_out_info.get_scanner_ptr()->get_inner_ring_radius()) > 1) + { + error("interpolate_projdata needs both projection to be of a scanner with the same ring radius"); + } + + + + BSpline::BSplinesRegularGrid<3, float, float> proj_data_interpolator(these_types); + BasicCoordinate<3, double> offset, step ; + + // find relation between out_index and in_index such that they correspond to the same physical position + // out_index * m_zoom + m_offset = in_index + const float in_sampling_m = proj_data_in_info.get_sampling_in_m(Bin(0,0,0,0)); + const float out_sampling_m = proj_data_out_info.get_sampling_in_m(Bin(0,0,0,0)); + // offset in 'in' index units + offset[1] = + (proj_data_in_info.get_m(Bin(0,0,0,0)) - + proj_data_out_info.get_m(Bin(0,0,0,0))) / in_sampling_m; + step[1]= + out_sampling_m/in_sampling_m; + + const float in_sampling_phi = + (proj_data_in_info.get_phi(Bin(0,1,0,0)) - proj_data_in_info.get_phi(Bin(0,0,0,0))) / + (remove_interleaving ? 2 : 1); + + const float out_sampling_phi = + proj_data_out_info.get_phi(Bin(0,1,0,0)) - proj_data_out_info.get_phi(Bin(0,0,0,0)); + + const float out_view_offset = + use_view_offset + ? proj_data_out_info.get_scanner_ptr()->get_default_intrinsic_tilt() + : 0.F; + const float in_view_offset = + use_view_offset + ? proj_data_in_info.get_scanner_ptr()->get_default_intrinsic_tilt() + : 0.F; + offset[2] = + (proj_data_in_info.get_phi(Bin(0,0,0,0)) + in_view_offset - proj_data_out_info.get_phi(Bin(0,0,0,0)) - out_view_offset) / in_sampling_phi; + step[2] = + out_sampling_phi/in_sampling_phi; + + const float in_sampling_s = proj_data_in_info.get_sampling_in_s(Bin(0,0,0,0)); + const float out_sampling_s = proj_data_out_info.get_sampling_in_s(Bin(0,0,0,0)); + offset[3] = + (proj_data_out_info.get_s(Bin(0,0,0,0)) - + proj_data_in_info.get_s(Bin(0,0,0,0))) / in_sampling_s; + step[3]= + out_sampling_s/in_sampling_s; + + // initialise interpolator + if (remove_interleaving) + { + shared_ptr non_interleaved_proj_data_info_sptr = + make_non_interleaved_proj_data_info(proj_data_in_info); + + const SegmentBySinogram non_interleaved_segment = + make_non_interleaved_segment(*non_interleaved_proj_data_info_sptr, + proj_data_in.get_segment_by_sinogram(0)); + // display(non_interleaved_segment, non_interleaved_segment.find_max(),"non-inter"); + Array<3,float> extended = + extend_segment_in_views(non_interleaved_segment, 2, 2); + for (int z=extended.get_min_index(); z<= extended.get_max_index(); ++z) + { + for (int y=extended[z].get_min_index(); y<= extended[z].get_max_index(); ++y) + { + const int old_min = extended[z][y].get_min_index(); + const int old_max = extended[z][y].get_max_index(); + extended[z][y].grow(old_min-1, old_max+1); + extended[z][y][old_min-1] = extended[z][y][old_min]; + extended[z][y][old_max+1] = extended[z][y][old_max]; + } + } + proj_data_interpolator.set_coef(extended); + } + else + { + Array<3,float> extended = + extend_segment_in_views(proj_data_in.get_segment_by_sinogram(0), 2, 2); + for (int z=extended.get_min_index(); z<= extended.get_max_index(); ++z) + { + for (int y=extended[z].get_min_index(); y<= extended[z].get_max_index(); ++y) + { + const int old_min = extended[z][y].get_min_index(); + const int old_max = extended[z][y].get_max_index(); + extended[z][y].grow(old_min-1, old_max+1); + extended[z][y][old_min-1] = extended[z][y][old_min]; + extended[z][y][old_max+1] = extended[z][y][old_max]; + } + } + proj_data_interpolator.set_coef(extended); + } + + // now do interpolation + SegmentBySinogram sino_3D_out = proj_data_out.get_empty_segment_by_sinogram(0) ; + sample_function_on_regular_grid(sino_3D_out, proj_data_interpolator, offset, step); + + proj_data_out.set_segment(sino_3D_out); + if (proj_data_out.set_segment(sino_3D_out) == Succeeded::no) + return Succeeded::no; + return Succeeded::yes; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/inverse_SSRB.cxx b/src/buildblock/inverse_SSRB.cxx new file mode 100644 index 0000000000..6db6cb4d97 --- /dev/null +++ b/src/buildblock/inverse_SSRB.cxx @@ -0,0 +1,124 @@ +// +// +/* + Copyright (C) 2005- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Implementation of stir::inverse_SSRB + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ +#include "stir/ProjData.h" +#include "stir/ProjDataInfo.h" +#include "stir/inverse_SSRB.h" +#include "stir/Sinogram.h" +#include "stir/Bin.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +Succeeded +inverse_SSRB(ProjData& proj_data_4D, + const ProjData& proj_data_3D) +{ + const ProjDataInfo * const proj_data_3D_info_ptr = + dynamic_cast + (proj_data_3D.get_proj_data_info_ptr()); + const ProjDataInfo * const proj_data_4D_info_ptr = + dynamic_cast + (proj_data_4D.get_proj_data_info_ptr()); + if ((proj_data_3D_info_ptr->get_min_view_num() != + proj_data_4D_info_ptr->get_min_view_num()) || + (proj_data_3D_info_ptr->get_min_view_num() != + proj_data_4D_info_ptr->get_min_view_num())) + { + warning("inverse_SSRB: incompatible view-information"); + return Succeeded::no; + } + if ((proj_data_3D_info_ptr->get_min_tangential_pos_num() != + proj_data_4D_info_ptr->get_min_tangential_pos_num()) || + (proj_data_3D_info_ptr->get_min_tangential_pos_num() != + proj_data_4D_info_ptr->get_min_tangential_pos_num())) + { + warning("inverse_SSRB: incompatible tangential_pos-information"); + return Succeeded::no; + } + + // keep sinograms out of the loop to avoid reallocations + // initialise to something because there's no default constructor + Sinogram sino_4D = + proj_data_4D. + get_empty_sinogram(proj_data_4D.get_min_axial_pos_num(0) , 0); + Sinogram sino_3D = + proj_data_3D. + get_empty_sinogram(proj_data_3D.get_min_axial_pos_num(0) , 0); + + for (int out_segment_num = proj_data_4D.get_min_segment_num(); + out_segment_num <= proj_data_4D.get_max_segment_num(); + ++out_segment_num) + { + for (int out_ax_pos_num = proj_data_4D.get_min_axial_pos_num(out_segment_num); + out_ax_pos_num <= proj_data_4D.get_max_axial_pos_num(out_segment_num); + ++out_ax_pos_num ) + { + sino_4D = proj_data_4D.get_empty_sinogram(out_ax_pos_num, out_segment_num); + const float out_m = + proj_data_4D_info_ptr-> + get_m(Bin(out_segment_num, 0, out_ax_pos_num, 0)); + int num_contributing_sinos = 0; + + for (int in_ax_pos_num = proj_data_3D.get_min_axial_pos_num(0); + in_ax_pos_num <= proj_data_3D.get_max_axial_pos_num(0); + ++in_ax_pos_num ) + { + sino_3D = proj_data_3D.get_sinogram(in_ax_pos_num,0); + const float in_m = + proj_data_3D_info_ptr->get_m(Bin(0, 0, in_ax_pos_num, 0)); + + if (fabs(out_m - in_m) < 1E-2) + { + ++num_contributing_sinos; + sino_4D += sino_3D; + if (proj_data_4D.set_sinogram(sino_4D) == Succeeded::no) + return Succeeded::no; + break; + } + const float in_m_next = in_ax_pos_num == proj_data_3D.get_max_axial_pos_num(0) ? + -1000000.F : proj_data_3D_info_ptr->get_m(Bin(0, 0, in_ax_pos_num+1, 0)); + + if (fabs(out_m - .5F*(in_m + in_m_next)) < 1E-2) + { + ++num_contributing_sinos; + sino_4D += sino_3D; + sino_4D += proj_data_3D.get_sinogram(in_ax_pos_num+1,0); + sino_4D *= .5F; + if (proj_data_4D.set_sinogram(sino_4D) == Succeeded::no) + return Succeeded::no; + break; + } + } + if (num_contributing_sinos == 0) + warning("inverse_SSRB: no sinogram contributes to segment %d, axial_pos_num %d", + out_segment_num, out_ax_pos_num); + } + } + return Succeeded::yes; +} +END_NAMESPACE_STIR diff --git a/src/buildblock/lib.mk b/src/buildblock/lib.mk new file mode 100644 index 0000000000..1a9114d9d6 --- /dev/null +++ b/src/buildblock/lib.mk @@ -0,0 +1,75 @@ +dir:=buildblock + +$(dir)_LIB_SOURCES := \ + Array.cxx \ + IndexRange.cxx \ + PatientPosition.cxx \ + ProjData.cxx \ + ProjDataInfo.cxx \ + ProjDataInfoCylindrical.cxx \ + ProjDataInfoCylindricalArcCorr.cxx \ + ProjDataInfoCylindricalNoArcCorr.cxx \ + ArcCorrection.cxx \ + ProjDataFromStream.cxx \ + ProjDataGEAdvance.cxx \ + ProjDataInMemory.cxx \ + ProjDataInterfile.cxx \ + Scanner.cxx \ + SegmentBySinogram.cxx \ + Segment.cxx \ + SegmentByView.cxx \ + Viewgram.cxx \ + Sinogram.cxx \ + RelatedViewgrams.cxx \ + scale_sinograms.cxx \ + interpolate_projdata.cxx \ + extend_projdata.cxx \ + DiscretisedDensity.cxx \ + VoxelsOnCartesianGrid.cxx \ + utilities.cxx \ + interfile_keyword_functions.cxx \ + zoom.cxx \ + NumericType.cxx ByteOrder.cxx \ + KeyParser.cxx \ + recon_array_functions.cxx \ + linear_regression.cxx overlap_interpolate.cxx \ + error.cxx warning.cxx \ + DataSymmetriesForViewSegmentNumbers.cxx \ + TimeFrameDefinitions.cxx \ + ParsingObject.cxx \ + ArrayFilter1DUsingConvolutionSymmetricKernel.cxx \ + ArrayFilterUsingRealDFTWithPadding.cxx \ + SeparableArrayFunctionObject.cxx \ + SeparableMetzArrayFilter.cxx \ + MedianArrayFilter3D.cxx \ + MedianImageFilter3D.cxx \ + MinimalArrayFilter3D.cxx \ + MinimalImageFilter3D.cxx \ + SeparableCartesianMetzImageFilter.cxx \ + TruncateToCylindricalFOVImageProcessor.cxx \ + ThresholdMinToSmallPositiveValueDataProcessor.cxx \ + ChainedDataProcessor.cxx \ + ArrayFilter1DUsingConvolution.cxx \ + SeparableConvolutionImageFilter.cxx \ + NonseparableConvolutionUsingRealDFTImageFilter.cxx \ + SSRB.cxx \ + inverse_SSRB.cxx \ + centre_of_gravity.cxx \ + DynamicDiscretisedDensity.cxx \ + DynamicProjData.cxx \ + MultipleProjData.cxx \ + GatedProjData.cxx \ + ArrayFilter2DUsingConvolution.cxx \ + ArrayFilter3DUsingConvolution.cxx \ + find_fwhm_in_image.cxx \ + GatedDiscretisedDensity.cxx \ + MaximalArrayFilter3D.cxx \ + MaximalImageFilter3D.cxx \ + TimeGateDefinitions.cxx + + +$(dir)_REGISTRY_SOURCES:= $(dir)_registries.cxx + +include $(WORKSPACE)/lib.mk + + diff --git a/src/buildblock/line.cxx b/src/buildblock/line.cxx new file mode 100644 index 0000000000..337fbb6bd9 --- /dev/null +++ b/src/buildblock/line.cxx @@ -0,0 +1,260 @@ +// +// +/*! + + \file + \ingroup buildblock + + \brief Implementations for class stir::Line + + \author Patrick Valente + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/line.h" + + +START_NAMESPACE_STIR + +const int LINE_ERROR =-1; +const int LINE_OK = 0; + +string Line::get_keyword() +{ + // keyword stops at either := or an index [] + // TODO should check that = follows : to allow keywords with colons in there + const size_type eok =find_first_of(":[",0); + return substr(0,eok); +} + +int Line::get_index() +{ + size_type cp,sok,eok; + // we take 0 as a default value for the index + int in=0; + string sin; + // make sure that the index is part of the key (i.e. before :=) + cp=find_first_of(":[",0); + if(cp!=string::npos && operator[](cp) == '[') + { + sok=cp+1; + eok=find_first_of(']',cp); + // check if closing bracket really there + if (eok == string::npos) + { + // TODO do something more graceful + warning("Interfile warning: invalid vectored key in line \n'%s'.\n%s", + this->c_str(), + "Assuming this is not a vectored key."); + return 0; + } + sin=substr(sok,eok-sok); + in=atoi(sin.c_str()); + } + return in; +} + +int Line::get_param(string& s) +{ + size_type sok,eok; //start & end pos. of keyword + size_type cp =0; //current index + + cp=find('=',0); + + if(cp!=string::npos) + { + cp++; + sok=find_first_not_of(' ',cp); + if(sok!=string::npos) + { + cp=length(); + // strip trailing white space + eok=find_last_not_of(" \t",cp); + s=substr(sok,eok-sok+1); + return LINE_OK; + } + } + return LINE_ERROR; +} + +int Line::get_param(int& i) +{ + string s; + int r; + + r=get_param(s); + if(r==LINE_OK) + i=atoi(s.c_str()); + + return r; +} + + +int Line::get_param(unsigned long& i) +{ + string s; + int r; + + r=get_param(s); + if(r==LINE_OK) + // TODO not unsigned now + i=atol(s.c_str()); + + return r; +} + + +int Line::get_param(double& i) +{ + string s; + int r; + + r=get_param(s); + if(r==LINE_OK) + i=atof(s.c_str()); + + return r; +} + + + +int Line::get_param(vector& v) +{ + string s; + size_type cp; + size_type eop; + bool end=false; + + cp=find_first_of('=',0)+1; + // skip white space + cp=find_first_not_of(" \t",cp); + // TODO? this does not check if brackets are balanced + while (!end) + { + cp=find_first_not_of("{},",cp); + + if(cp==string::npos) + { + end=true; + } + else + { + eop=find_first_of(",}",cp); + if(eop==string::npos) + { + end=true; + eop=length(); + } + s=substr(cp,eop-cp); + // TODO use strstream, would allow templates + v.push_back(atoi(s.c_str())); + cp=eop+1; + } + } + return LINE_OK; +} + + +int Line::get_param(vector& v) +{ + string s; + // KT 02/11/98 don't use temporary variable anymore + //int r=LINE_OK; + size_type cp; + size_type eop; + bool end=false; + + cp=find_first_of('=',0)+1; + // skip white space + cp=find_first_not_of(" \t",cp); + // TODO? this does not check if brackets are balanced + while (!end) + { + cp=find_first_not_of("{},",cp); + + if(cp==string::npos) + { + end=true; + } + else + { + eop=find_first_of(",}",cp); + if(eop==string::npos) + { + end=true; + eop=length(); + } + s=substr(cp,eop-cp); + // TODO use strstream, would allow templates + v.push_back(atof(s.c_str())); + cp=eop+1; + } + } + return LINE_OK; +} + +int Line::get_param(vector& v) +{ + string s; + + size_type cp; + size_type eop; + bool end=false; + + cp=find_first_of('=',0)+1; + // skip white space + cp=find_first_not_of(" \t",cp); + // TODO? this does not check if brackets are balanced + while (!end) + { + cp=find_first_not_of("{},",cp); + cp=find_first_not_of(" \t",cp); + + if(cp==string::npos) + { + end=true; + } + else + { + eop=find_first_of(",}",cp); + if(eop==string::npos) + { + end=true; + eop=length(); + } + // trim ending white space + size_type eop2 = find_last_not_of(" \t",eop); + s=substr(cp,eop2-cp); + + v.push_back(s); + cp=eop+1; + } + } + return LINE_OK; +} + +Line& Line::operator=(const char* ch) +{ + string::operator=(ch); + return *this; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/linear_regression.cxx b/src/buildblock/linear_regression.cxx new file mode 100644 index 0000000000..aefebfc8e0 --- /dev/null +++ b/src/buildblock/linear_regression.cxx @@ -0,0 +1,129 @@ +// +// + +/* + \file + \ingroup buildblock + + \brief Implementation for stir::linear_regression() function + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/linear_regression.h" + +START_NAMESPACE_STIR + +namespace detail { + + // see linear_regression.inl for more info + + +template +void linear_regression_compute_fit_from_S(Value& constant, Value& scale, + Value& chi_square, + Value& variance_of_constant, + Value& variance_of_scale, + Value& covariance_of_constant_with_scale, + const double S, + const double Sx, + const double Sy, + const double Syy, + const double Stt, + const double Sty, + const std::size_t data_size, + const bool use_estimated_variance + ) +{ + + + + scale = static_cast(Sty / Stt); + constant = static_cast((Sy - Sx * scale) / S); + variance_of_scale = static_cast(1/ Stt); + variance_of_constant = static_cast((1 + square(Sx)/(S*Stt))/S); + covariance_of_constant_with_scale = static_cast(- Sx / (S*Stt)); + + // Compute chi_square, i.e. + // sum_i weights[i]*(measured_data[i] - (constant+scale*coordinates[i]))^2 + // It turns out this can be done using previously calculated constants, + // and just 1 extra variable : Syy + + // Proving the next identity is a tough algebraic calculation + // (performed by KT in Mathematica) + chi_square = static_cast(Syy - square(scale)*Stt - square(Sy)/S); + + if (chi_square<0) + { + warning("linear_regression found negative chi_square %g.\n" + "This is probably just because of rounding errors and indicates " + "a small error compared to the data. I will set it to 0 to avoid " + "problems with sqrt(chi_square).", + chi_square); + chi_square=0; + } + if (use_estimated_variance==true) + { + const Value estimated_variance = + static_cast(chi_square/(data_size - 2)); + variance_of_scale *=estimated_variance; + variance_of_constant *=estimated_variance; + covariance_of_constant_with_scale *=estimated_variance; + } +} + +// instantiations +template void +linear_regression_compute_fit_from_S<>(float& constant, float& scale, + float& chi_square, + float& variance_of_constant, + float& variance_of_scale, + float& covariance_of_constant_with_scale, + const double S, + const double Sx, + const double Sy, + const double Syy, + const double Stt, + const double Sty, + const std::size_t data_size, + const bool use_estimated_variance + ); + +template void +linear_regression_compute_fit_from_S<>(double& constant, double& scale, + double& chi_square, + double& variance_of_constant, + double& variance_of_scale, + double& covariance_of_constant_with_scale, + const double S, + const double Sx, + const double Sy, + const double Syy, + const double Stt, + const double Sty, + const std::size_t data_size, + const bool use_estimated_variance + ); + +} // end namespace detail + +END_NAMESPACE_STIR diff --git a/src/buildblock/overlap_interpolate.cxx b/src/buildblock/overlap_interpolate.cxx new file mode 100644 index 0000000000..349d4ae139 --- /dev/null +++ b/src/buildblock/overlap_interpolate.cxx @@ -0,0 +1,404 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2006-01-24, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Implementation of stir::overlap_interpolate + + \author Kris Thielemans (with suggestions by Alexey Zverovich) + \author PARAPET project + +*/ +#include "stir/interpolate.h" +#include "stir/VectorWithOffset.h" +START_NAMESPACE_STIR + +/*! + + This is an implementation of 'overlap' interpolation on + arbitrary data types (using templates). + + This type of interpolation considers the data as the samples of + a step-wise function. The interpolated array again represents a + step-wise function, such that the counts (i.e. integrals) are + preserved. + + \param zoom + The spacing between the new points is determined by the 'zoom' + parameter: e.g. zoom less than 1 stretches the bin size with a factor 1/zoom. + + \param offset (measured in 'units' of the in_data) allows to shift the + range of values you want to compute. In particular, having positive + offset shifts the data to the left (if in_data and out_data have the same + range of indices). + Note that a similar (but less general) effect to using 'offset' can be + achieved by adjusting the min and max indices of the out_data. + + \param assign_rest_with_zeroes + If \c false does not set values in \c out_data which do not overlap with + \c in_data. + If \c true those data are set to 0. (The effect being the same as first + doing \c out_data.fill(0) before calling overlap_interpolate). + + For an index x_out (in \c out_data coordinates), the corresponding + \c in_data coordinates is x_in = x_out/zoom + offset + (The convention is used that the 'bins' are centered around the + coordinate value.) + + \warning when T involves integral types, there is no rounding + but truncation. + + \par Examples: + + \verbatim + in_data = {a,b,c,d} indices from 0 to 3 + zoom = .5 + offset = .5 + out_data = {a+b, c+d} indices from 0 to 1 + + in_data = {a,b,c,d} indices from 0 to 3 + zoom = .5 + offset = -.5 + out_data = {a,b+c,d} indices from 0 to 2 + + in_data = {a,b,c} indices from -1 to 1 + zoom = .5 + offset = 0 + out_data = {a/2, a/2+b+c/2, c/2} indices from -1 to 1 + \endverbatim + + \par Implementation details: + + Because this implementation works for arbitrary (numeric) types T, it + is slightly more complicated than would be necessary for (say) floats. + In particular,
        + - we do our best to avoid creating temporary objects of type T
        + - we zero values by using multiplication with 0
        + (actually we use T::operator*=(0)). This is to allow the case where + T::operator=(int) does not exist (in particular, in our higher + dimensional arrays). + + + \par History: +
          +
        • first version by Kris Thielemans with suggestions by Alexey Zverovich. + (loosely based on a 1D version by Claire Labbe) +
        +*/ + +template +void +overlap_interpolate(VectorWithOffset& out_data, + const VectorWithOffset& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes) +{ + assert(zoom>0); + + // First check trivial case + if (zoom==1.F && offset==0.F && + in_data.get_min_index()==out_data.get_min_index() && + in_data.get_max_index()==out_data.get_max_index()) + { + out_data = in_data; + return; + } + + if(zoom>=1) + { + // Shrinking to a smaller bin size + + // start at the first 'in' bin that overlaps the 'out' data. + // compute by checking by comparing its position with + // the position of the left edge of the first 'out' bin: + // left_edge = (out_data.get_min_index() - .5)/zoom + offset + // x1 -.5 <= left_edge < x1+.5 + int x2 = out_data.get_min_index(); + int x1 = (int)floor((x2 - .5)/zoom + offset + .5); + + // the next variable holds the difference between the coordinates + // of the right edges of the 'in' bin and the 'out' bin, computed + // in a coordinate system where the 'out' voxels are unit distance apart + double diff_between_right_edges = + zoom*(x1-offset+.5) - (x2 + .5); + + for(; + x2 <= out_data.get_max_index(); + x2++, diff_between_right_edges--) + { + + if(x1> in_data.get_max_index()) + { + // just fill out_data with 0, + // no need to check/update diff_between_right_edges + if (assign_rest_with_zeroes) + out_data[x2] *= 0; + + continue; + } + + assert(diff_between_right_edges<= zoom/*+epsilon*/); + assert(diff_between_right_edges>= -1/*epsilon*/); + + if (diff_between_right_edges >= 0) + { + if(x1 >= in_data.get_min_index()) + { + out_data[x2] = in_data[x1]; +#ifndef STIR_OVERLAP_NORMALISATION + out_data[x2] /= zoom; +#endif + } + else + { + if (assign_rest_with_zeroes) + out_data[x2] *= 0; + } + } + else + { + /* + Set out_data[x2] according to + + T V1; // bin value at x1 + T V2; // bin value at x1+1 + out_data[x2] = (V1+diff_between_right_edges*(V1-V2))/zoom; + + The lines below are more complicated because + - testing if x1, x1+1 are inside the range of in_data + - everything is done without creating temporary objects of type T + */ + if(x1 >= in_data.get_min_index()) + { + out_data[x2] = in_data[x1]; + out_data[x2] *= static_cast(1/diff_between_right_edges + 1); // note conversion to float to avoid compiler warnings in case that T is float (or a float array) + } + else + { + if (assign_rest_with_zeroes) + out_data[x2] *= 0; + } + if(x1+1 <= in_data.get_max_index() && x1+1>=in_data.get_min_index()) + { + out_data[x2] -= in_data[x1+1]; + } + +#ifndef STIR_OVERLAP_NORMALISATION + out_data[x2] *= static_cast(diff_between_right_edges/zoom); +#else + out_data[x2] *= static_cast(diff_between_right_edges); +#endif + + // advance 'in' bin + x1++; + diff_between_right_edges += zoom; + } + }// End of for x2 + + } + else + { + // case zoom <1 : stretching the bin size + // start 1 before the first 'in' bin that overlaps the 'out' data. + // compute by comparing its position with + // the position of the left edge of the first 'out' bin: + // left_edge = (out_data.get_min_index() - .5)/zoom + offset + // x1-.5 <= left_edge < x1+.5 + + const float inverse_zoom = 1/zoom; + + // current coordinate in out_data + int x2 = out_data.get_min_index(); + // current coordinate in in_data + int x1 = (int)floor((x2 - .5)*inverse_zoom + offset + .5); + + // the next variable holds the difference between the coordinates + // of the right edges of the 'in' bin and the 'out' bin, computed + // in a coordinate system where the 'in' bins are unit distance apart + double diff_between_right_edges = (x1-offset+.5) - (x2 + .5)*inverse_zoom; + + // we will loop over x1 to update out_data[x2] from in_data[x1] + // however, we first check if the left edge of the first in_data is + // to the left of the left edge of the first out_data. + // If so, will first subtract the contribution of the 'in' bin that + // lies outside the 'out' bin. In the loop later, this part of the + // 'in' bin will be added again. + { + const double diff_between_left_edges = + diff_between_right_edges-1+inverse_zoom; + if (diff_between_left_edges < 0 && + x1 >= in_data.get_min_index() && x1 <= in_data.get_max_index() ) + { + out_data[x2] = in_data[x1]; + out_data[x2] *= static_cast(diff_between_left_edges); + } + else + { + if (assign_rest_with_zeroes) + out_data[x2] *= 0; + } + } + + for (; + x1 <= in_data.get_max_index(); + x1++, diff_between_right_edges++) + { + assert(diff_between_right_edges<= 1/*+epsilon*/); + assert(diff_between_right_edges>= -inverse_zoom/*-epsilon*/); + + if (diff_between_right_edges <= 0) + { + // 'in' bin fits entirely in the 'out' bin + if (x1 >= in_data.get_min_index()) + out_data[x2] += in_data[x1]; + } + else + { + // dx = fraction of 'in' bin that lies within 'out' bin + const double dx= 1- diff_between_right_edges; + // update current 'out' bin + if (x1 >= in_data.get_min_index()) + { + // out_data[x2] += in_data[x1]*dx; + if (fabs(dx) > 1e-5) + { + out_data[x2] /= static_cast(dx); + out_data[x2] += in_data[x1]; + out_data[x2] *= static_cast(dx); + } + } + // next bin + x2++; + diff_between_right_edges -= inverse_zoom; + // update this one with the rest + if (x2<= out_data.get_max_index()) + { + if (x1 >= in_data.get_min_index()) + { + // out_data[x2] = in_data[x1]*(1-dx); + out_data[x2] = in_data[x1]; + out_data[x2] *= static_cast((1-dx)); + } + else if (assign_rest_with_zeroes) + { + out_data[x2] *= 0; + } + } + else + { + // x2 goes out of range, so we can just as well stop + break; + } + } + + }// End of for x1 + + if (assign_rest_with_zeroes) + { + // set rest of out_data to 0 + for (x2++; + x2 <= out_data.get_max_index(); + x2++) + out_data[x2] *= 0; + } +#ifdef STIR_OVERLAP_NORMALISATION + for (x2 = out_data.get_min_index(); + x2 <= out_data.get_max_index(); + x2++) + out_data[x2] *= static_cast(zoom); +#endif + + + }// End of if(zoom>1) + +} + + + +/************************************************ + Instantiations + ************************************************/ + +template +void +overlap_interpolate<>(VectorWithOffset& out_data, + const VectorWithOffset& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes); + +template +void +overlap_interpolate<>(VectorWithOffset& out_data, + const VectorWithOffset& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes); +END_NAMESPACE_STIR + + // TODO remove +#if defined(OLDDESIGN) + +#include "stir/Tensor2D.h" + +template +void +overlap_interpolate<>(VectorWithOffset >& out_data, + const VectorWithOffset >& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes); + +template +void +overlap_interpolate<>(VectorWithOffset >& out_data, + const VectorWithOffset >& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes); + + +#else + +#include "stir/Array.h" + +START_NAMESPACE_STIR + +template +void +overlap_interpolate<>(VectorWithOffset >& out_data, + const VectorWithOffset >& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes); + +template +void +overlap_interpolate<>(VectorWithOffset >& out_data, + const VectorWithOffset >& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes); +#endif + +END_NAMESPACE_STIR diff --git a/src/buildblock/recon_array_functions.cxx b/src/buildblock/recon_array_functions.cxx new file mode 100644 index 0000000000..2293f564e2 --- /dev/null +++ b/src/buildblock/recon_array_functions.cxx @@ -0,0 +1,490 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief implementations for functions declared in recon_array_functions.h + + \author Matthew Jacobson + \author Kris Thielemans + \author Nicolas A Karakatsanis + \author PARAPET project + + +*/ + +//some miscellaneous operators for sinograms and images + +#include "stir/recon_array_functions.h" +#include "stir/min_positive_element.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/RelatedViewgrams.h" +#include "stir/Viewgram.h" +#include "stir/SegmentByView.h" +#include "stir/SegmentBySinogram.h" + +#include + +#ifndef STIR_NO_NAMESPACES +using std::cout; +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + +const float SMALL_NUM = 0.000001F; + + +// AZ 07/10/99: added +void truncate_rim(Viewgram& viewgram, const int rim_truncation_sino) +{ + const int rs=viewgram.get_min_axial_pos_num(); + const int re=viewgram.get_max_axial_pos_num(); + const int bs=viewgram.get_min_tangential_pos_num(); + const int be=viewgram.get_max_tangential_pos_num(); + + //MJ 12/04/2000 to remove the necessity for grow in things like sum_over_projections() + int upper_truncation_offset=rim_truncation_sino; + if(viewgram.get_num_tangential_poss()%2!=0) upper_truncation_offset--; + + + for(int r=rs;r<=re;r++) + { + for(int b=bs;b& seg, const int rim_truncation_sino) +{ + + const int vs=seg.get_min_view_num(); + const int ve=seg.get_max_view_num(); + const int rs=seg.get_min_axial_pos_num(); + const int re=seg.get_max_axial_pos_num(); + const int bs=seg.get_min_tangential_pos_num(); + const int be=seg.get_max_tangential_pos_num(); + + //MJ 25/03/2000 to remove the necessity for grow in things like sum_over_projections() + int upper_truncation_offset=rim_truncation_sino; + if(seg.get_num_tangential_poss()%2!=0) upper_truncation_offset--; + + for(int v=vs;v<=ve;v++) + for(int r=rs;r<=re;r++) + { + for(int b=bs;b& seg, const int rim_truncation_sino) +{ + + const int vs=seg.get_min_view_num(); + const int ve=seg.get_max_view_num(); + const int rs=seg.get_min_axial_pos_num(); + const int re=seg.get_max_axial_pos_num(); + const int bs=seg.get_min_tangential_pos_num(); + const int be=seg.get_max_tangential_pos_num(); + + //MJ 25/03/2000 to remove the necessity for grow in things like sum_over_projections() + int upper_truncation_offset=rim_truncation_sino; + if(seg.get_num_tangential_poss()%2!=0) upper_truncation_offset--; + + + for(int r=rs;r<=re;r++) + for(int v=vs;v<=ve;v++) + { + for(int b=bs;b& input_image, + const int rim_truncation_image, + const bool strictly_less_than_radius) +{ + // TODO the 'rim_truncate' part of this function does not make a lot of sense in general + DiscretisedDensityOnCartesianGrid<3,float>& input_image_cartesian = + dynamic_cast&>(input_image); + + if (!input_image_cartesian.is_regular()) + error("truncate_rim called for non-regular grid. Not implemented"); + + const int zs=input_image_cartesian.get_min_index(); + const int ys=input_image_cartesian[zs].get_min_index(); + const int xs=input_image_cartesian[zs][ys].get_min_index(); + + const int ze=input_image_cartesian.get_max_index(); + const int ye=input_image_cartesian[zs].get_max_index(); + const int xe=input_image_cartesian[zs][ys].get_max_index(); + + // TODO check what happens with even-sized images (i.e. where is the centre?) + + //const int zm=(zs+ze)/2; + const int ym=(ys+ye)/2; + const int xm=(xs+xe)/2; + + const float truncated_radius = + static_cast((xe-xs)/2 - rim_truncation_image); + + + if (strictly_less_than_radius) + { + for (int z=zs; z<=ze; z++) + for (int y=ys; y <= ye; y++) + for (int x=xs; x<= xe; x++) + { + if(square(xm-x)+square(ym-y)>=square(truncated_radius)) + input_image[z][y][x]=0; + } + } + else + { + for (int z=zs; z<=ze; z++) + for (int y=ys; y <= ye; y++) + for (int x=xs; x<= xe; x++) + { + if(square(xm-x)+square(ym-y)>square(truncated_radius)) + input_image[z][y][x]=0; + } + } +} + + + +// AZ&KT 04/10/99: added rim_truncation_sino +void divide_and_truncate(Viewgram& numerator, + const Viewgram& denominator, + const int rim_truncation_sino, + int& count, int& count2, double* log_likelihood_ptr /* = NULL */) +{ + + const int rs=numerator.get_min_axial_pos_num(); + const int re=numerator.get_max_axial_pos_num(); + const int bs=numerator.get_min_tangential_pos_num(); + const int be=numerator.get_max_tangential_pos_num(); + + + const float small_value= + max(numerator.find_max()*SMALL_NUM, 0.F); + + double result=0; // use this for total result for this viewgram, reducing numerical error + for(int r=rs;r<=re;r++) + { + double sub_result=0; // use this for total result for this r, reducing numerical error + for(int b=bs;b<=be;b++){ + + // KT&SM&MJ 21/05/2001 changed truncation strategy + // before singularities (non-zero divided by zero) were set to 0 + // now they are set to max_quotient +#if 0 + // old version + if(denominator[r][b]<=small_value || + numerator[r][b]<=0.0 || + bbe-rim_truncation_sino ) { + if(numerator[r][b]>small_value && denominator[r][b]<=small_value) count++; + else if( numerator[r][b]<0.0) count2++; + numerator[r][b]=0.0; + } + else { + //MJ 28/10/99 corrected - moved above the sinogram division + if (log_likelihood_ptr != NULL) { + sub_result -= numerator[r][b]*log(denominator[r][b]); + }; + numerator[r][b]/=denominator[r][b]; + }; + +#else + if(bbe-rim_truncation_sino ) + { + numerator[r][b] = 0; + } + else + { + float& num = numerator[r][b]; + if (num<=small_value) // KT Feb2011 was "num max_quotient*denom) + { + // cancel singularity + count++; + if (log_likelihood_ptr != NULL) + sub_result -= double(num*log(num/max_quotient)); + num = max_quotient; + } + else + { + if (log_likelihood_ptr != NULL) + sub_result -= double(num*log(denom)); + num = num/denom; + } + } + } +#endif + } + if (log_likelihood_ptr != NULL) + result += sub_result; + } + if (log_likelihood_ptr != NULL) + *log_likelihood_ptr += result; + +} + + + +void divide_and_truncate(RelatedViewgrams& numerator, const RelatedViewgrams& denominator, + const int rim_truncation_sino, + int& count, int& count2, double* log_likelihood_ptr ) +{ + assert(numerator.get_num_viewgrams() == denominator.get_num_viewgrams()); + assert(*(numerator.get_proj_data_info_ptr()) == (*denominator.get_proj_data_info_ptr())); + RelatedViewgrams::iterator numerator_iter = numerator.begin(); + RelatedViewgrams::const_iterator denominator_iter = denominator.begin(); + while(numerator_iter!=numerator.end()) + { + divide_and_truncate(*numerator_iter, + *denominator_iter, + rim_truncation_sino, + count, count2, log_likelihood_ptr); + ++numerator_iter; + ++denominator_iter; + } +} + + +void divide_array(SegmentByView& numerator,const SegmentByView& denominator) +{ + + const int vs=numerator.get_min_view_num(); + const int ve=numerator.get_max_view_num(); + const int rs=numerator.get_min_axial_pos_num(); + const int re=numerator.get_max_axial_pos_num(); + const int bs=numerator.get_min_tangential_pos_num(); + const int be=numerator.get_max_tangential_pos_num(); + + for(int v=vs;v<=ve;v++) + for(int r=rs;r<=re;r++) + for(int b=bs;b<=be;b++) + { + + if (denominator[v][r][b] != 0.0) + numerator[v][r][b]=numerator[v][r][b]/denominator[v][r][b]; + else + numerator[v][r][b]=0.0; + + } + +} + +void divide_array(DiscretisedDensity<3,float>& numerator, const DiscretisedDensity<3,float>& denominator) +{ + assert(numerator.get_index_range() == denominator.get_index_range()); + float small_value= numerator.find_max()*SMALL_NUM; + small_value=(small_value>0.0F)?small_value:0.0F; + // TODO rewrite in terms of 'full' iterator + + for (int z=numerator.get_min_index(); z<=numerator.get_max_index(); z++) + for (int y=numerator[z].get_min_index(); y<=numerator[z].get_max_index(); y++) + for (int x=numerator[z][y].get_min_index(); x<=numerator[z][y].get_max_index(); x++) + { + + if(fabs(denominator[z][y][x])<=small_value && fabs(numerator[z][y][x])<=small_value) + { + numerator[z][y][x]=0; + } + else + numerator[z][y][x]/=denominator[z][y][x]; + } + +} + +// MJ 03/01/2000 for loglikelihood computation +// KT 21/05/2001 make sure it returns same result as divide_and_truncate above +void accumulate_loglikelihood(Viewgram& projection_data, + const Viewgram& estimated_projections, + const int rim_truncation_sino, + double* accum) +{ + + const int rs=projection_data.get_min_axial_pos_num(); + const int re=projection_data.get_max_axial_pos_num(); + const int bs=projection_data.get_min_tangential_pos_num(); + const int be=projection_data.get_max_tangential_pos_num(); + + /* note for implementation: + First compute result for this viewgram in a local variable, + then add to accum. + This avoids problems with adding small numbers to large numbers + For instance if there are a large number of bins in the projection data, + each with about the same contribution. After about 1e6 bins, the value of + accum would be no longer change because of the finite precision. + */ + double result = 0; + const float small_value= + max(projection_data.find_max()*SMALL_NUM, 0.F); + const float max_quotient = 10000.F; + + for(int r=rs;r<=re;r++) + { + double sub_result=0; // use this for total result for this r, reducing numerical error + for(int b=bs;b<=be;b++) + if(!( + bbe-rim_truncation_sino )) + { + // if (estimated_projections[r][b] == 0) + // std::cerr << "Zero at " << r << ", " << b <<'\n'; + const float new_estimate = + max(estimated_projections[r][b], + projection_data[r][b]/max_quotient); + if (projection_data[r][b]<=small_value) + sub_result += - double(new_estimate); + else + sub_result += double(projection_data[r][b]*log(new_estimate) - new_estimate); + } + result += sub_result; + } + + *accum += result; +} + +void accumulate_loglikelihood(DiscretisedDensity<3,float>& outer_loop_dyn_image_estimate, + const DiscretisedDensity<3,float>& nested_loop_dyn_image_estimates, + double* accum) +{ + + assert(outer_loop_dyn_image_estimate.get_index_range() == nested_loop_dyn_image_estimates.get_index_range()); + + /* note for implementation: + First compute result for this image slice in a local variable, + then add to accum. + This avoids problems with adding small numbers to large numbers + For instance if there are a large number of bins in the image, + each with about the same contribution. After about 1e6 bins, the value of + accum would no longer change because of the finite precision. + */ + double result = 0; + const float small_value= + max(outer_loop_dyn_image_estimate.find_max()*SMALL_NUM, 0.F); + const float max_quotient = 10000.F; + + for (int z=outer_loop_dyn_image_estimate.get_min_index(); z<=outer_loop_dyn_image_estimate.get_max_index(); z++) + { + double sub_result=0; // use this for total result for this r, reducing numerical error + + for (int y=outer_loop_dyn_image_estimate[z].get_min_index(); y<=outer_loop_dyn_image_estimate[z].get_max_index(); y++) + for (int x=outer_loop_dyn_image_estimate[z][y].get_min_index(); x<=outer_loop_dyn_image_estimate[z][y].get_max_index(); x++) + { + const float new_estimate = + max(nested_loop_dyn_image_estimates[z][y][x], + outer_loop_dyn_image_estimate[z][y][x]/max_quotient); + if (outer_loop_dyn_image_estimate[z][y][x]<=small_value) + sub_result += - double(new_estimate); + else + sub_result += double(outer_loop_dyn_image_estimate[z][y][x]*log(new_estimate) - new_estimate); + } + result += sub_result; + } + + *accum += result; +} + + +void multiply_and_add(DiscretisedDensity<3,float> &image_res, const DiscretisedDensity<3,float> &image_scaled, float scalar) +{ + + assert(image_res.get_index_range() == image_scaled.get_index_range()); + // TODO rewrite in terms of 'full' iterator + + for (int z=image_res.get_min_index(); z<=image_res.get_max_index(); z++) + for (int y=image_res[z].get_min_index(); y<=image_res[z].get_max_index(); y++) + for (int x=image_res[z][y].get_min_index(); x<=image_res[z][y].get_max_index(); x++) + { + image_res[z][y][x] += image_scaled[z][y][x] *scalar; + } + +} + + + +//to be used with in_place_function +float neg_trunc(float x) +{ + + return (x<0.0F)?0.0F:x; + +} + + + +void truncate_end_planes(DiscretisedDensity<3,float> &input_image, int input_num_planes) +{ + + // TODO this function does not make a lot of sense in general +#ifndef NDEBUG + // this will throw an exception when the cast is invalid + dynamic_cast&>(input_image); +#endif + + const int zs=input_image.get_min_index(); + const int ze=input_image.get_max_index(); + + int upper_limit=(input_image.get_length() % 2 == 1)?input_image.get_length()/2+1:input_image.get_length()/2; + + int num_planes=input_num_planes<=upper_limit?input_num_planes:upper_limit; + + for (int j=0;j scale_factors) +{ + const ProjDataInfo &proj_data_info = + dynamic_cast + (*scaled_scatter_proj_data.get_proj_data_info_ptr()); + + Bin bin; + + for (bin.segment_num()=proj_data_info.get_min_segment_num(); + bin.segment_num()<=proj_data_info.get_max_segment_num(); + ++bin.segment_num()) + for (bin.axial_pos_num()= + proj_data_info.get_min_axial_pos_num(bin.segment_num()); + bin.axial_pos_num()<=proj_data_info.get_max_axial_pos_num(bin.segment_num()); + ++bin.axial_pos_num()) + { + Sinogram scatter_sinogram = scatter_proj_data.get_sinogram( + bin.axial_pos_num(),bin.segment_num(),0); + Sinogram scaled_sinogram = + scatter_sinogram; + scaled_sinogram*=scale_factors[bin.segment_num()][bin.axial_pos_num()]; + + if (scaled_scatter_proj_data.set_sinogram(scaled_sinogram) == Succeeded::no) + return Succeeded::no; + } + return Succeeded::yes; +} + + +Array<2,float> +get_scale_factors_per_sinogram(const ProjData& numerator_proj_data, + const ProjData& denominator_proj_data, + const ProjData& weights_proj_data) +{ + + const ProjDataInfo &proj_data_info = + dynamic_cast + (*weights_proj_data.get_proj_data_info_ptr()); + + Bin bin; + + IndexRange2D sinogram_range(proj_data_info.get_min_segment_num(),proj_data_info.get_max_segment_num(),0,0); + for (int segment_num=proj_data_info.get_min_segment_num(); + segment_num<=proj_data_info.get_max_segment_num(); + ++segment_num) + { + sinogram_range[segment_num].resize( + proj_data_info.get_min_axial_pos_num(segment_num), + proj_data_info.get_max_axial_pos_num(segment_num) ); + } + Array<2,float> total_in_denominator(sinogram_range), + total_in_numerator(sinogram_range); + Array<2,float> scale_factors(sinogram_range); + for (bin.segment_num()=proj_data_info.get_min_segment_num(); + bin.segment_num()<=proj_data_info.get_max_segment_num(); + ++bin.segment_num()) + for (bin.axial_pos_num()= + proj_data_info.get_min_axial_pos_num(bin.segment_num()); + bin.axial_pos_num()<=proj_data_info.get_max_axial_pos_num(bin.segment_num()); + ++bin.axial_pos_num()) + { + const Sinogram weights = + weights_proj_data.get_sinogram(bin.axial_pos_num(),bin.segment_num()); + const Sinogram denominator_sinogram = + denominator_proj_data.get_sinogram(bin.axial_pos_num(),bin.segment_num()); + const Array<2,float> weighted_denominator_sinogram = denominator_sinogram * weights; + const Array<2,float> weighted_numerator_sinogram = + numerator_proj_data.get_sinogram(bin.axial_pos_num(),bin.segment_num()) * weights; + total_in_denominator[bin.segment_num()][bin.axial_pos_num()] = weighted_denominator_sinogram.sum(); + total_in_numerator[bin.segment_num()][bin.axial_pos_num()] = weighted_numerator_sinogram.sum(); + + if (denominator_sinogram.sum()==0) + { + scale_factors[bin.segment_num()][bin.axial_pos_num()] = 0; + } + else + { + if (total_in_denominator[bin.segment_num()][bin.axial_pos_num()]<= + denominator_sinogram.sum()/ + (proj_data_info.get_num_views() * proj_data_info.get_num_tangential_poss()) * .001 + ) + { + error("Problem at segment %d, axial pos %d in finding sinogram scaling factor.\n" + "Weighted data in denominator %g too small compared to total in sinogram %g.\n" + "Adjust weights?", + bin.segment_num(),bin.axial_pos_num(), + total_in_denominator[bin.segment_num()][bin.axial_pos_num()], + denominator_sinogram.sum() + ); + } + scale_factors[bin.segment_num()][bin.axial_pos_num()] = + total_in_numerator[bin.segment_num()][bin.axial_pos_num()]/ + total_in_denominator[bin.segment_num()][bin.axial_pos_num()]; + } + } + + return scale_factors; +} + +END_NAMESPACE_STIR + diff --git a/src/buildblock/utilities.cxx b/src/buildblock/utilities.cxx new file mode 100644 index 0000000000..20420eb830 --- /dev/null +++ b/src/buildblock/utilities.cxx @@ -0,0 +1,487 @@ +/*! + \file + + \brief non-inline implementations for utility.h + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2010, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/utilities.h" +#include "stir/IndexRange3D.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::ifstream; +using std::ofstream; +using std::iostream; +using std::istream; +using std::fstream; +using std::streampos; +using std::streamsize; +using std::cerr; +using std::endl; +using std::ios; +using std::string; +#endif + +START_NAMESPACE_STIR + +bool +ask (const string& str, bool default_value) +{ + string input; + + while (true) + { + cerr << "\n" << str + << " [Y/N D:" + << (default_value ? 'Y' : 'N') + << "]: "; + std::getline(std::cin, input); + if (input.size()==0) + return default_value; + const char answer = input[0]; + switch (answer) + { + case 'N': + case 'n': + return false; + case 'Y': + case 'y': + return true; + default: + cerr << "\nPlease answer Y or N\n"; + } + } +} + + +string ask_string (const string& str, const string& default_value) +{ + string input; + + cerr << "\n" << str + << "\n[default_value : \"" + << default_value + << "\"]: \n"; + std::getline(std::cin, input); + if (input.size()==0) + return default_value; + else + return input; +} +FILE*& open_read_binary(FILE*& fptr, + const string& name) +{ + fptr = fopen(name.c_str(), "rb"); + if (ferror(fptr)) + { error("Error opening file %s\n", name.c_str()); } + return fptr; +} + +FILE*& open_write_binary(FILE*& fptr, + const string& name) +{ + fptr = fopen(name.c_str(), "wb"); + if (ferror(fptr)) + { error("Error opening file %s\n", name.c_str()); } + return fptr; +} + +void close_file(FILE*& fptr) +{ + fclose(fptr); + fptr=0; +} + +const char * +find_filename(const char * const filename_with_directory) +{ + const char * name; + +#if defined(__OS_VAX__) + name = strrchr(filename_with_directory,']'); + if (name==NULL) + name = strrchr(filename_with_directory,':'); +#elif defined(__OS_WIN__) + name = strrchr(filename_with_directory,'\\'); + if (name==NULL) + name = strrchr(filename_with_directory,'/'); + if (name==NULL) + name = strrchr(filename_with_directory,':'); +#elif defined(__OS_MAC__) + name = strrchr(filename_with_directory,':'); +#else // defined(__OS_UNIX__) + name = strrchr(filename_with_directory,'/'); +#endif + if (name!=NULL) + // KT 10/01/2000 name++ changed to name+1 + return name+1; + else + return filename_with_directory; +} + +string::size_type +find_pos_of_filename(const string& filename_with_directory) +{ + string::size_type pos; + +#if defined(__OS_VAX__) + pos = filename_with_directory.find_last_of( ']'); + if (pos==string::npos) + pos = filename_with_directory.find_last_of( ':'); +#elif defined(__OS_WIN__) + pos = filename_with_directory.find_last_of( '\\'); + if (pos==string::npos) + pos = filename_with_directory.find_last_of( '/'); + if (pos==string::npos) + pos = filename_with_directory.find_last_of( ':'); +#elif defined(__OS_MAC__) + pos = filename_with_directory.find_last_of( ':'); +#else // defined(__OS_UNIX__) + pos = filename_with_directory.find_last_of( '/'); +#endif + if (pos != string::npos) + return pos+1; + else + return 0; +} + + +string +get_filename(const string& filename_with_directory) +{ + return + filename_with_directory.substr(find_pos_of_filename(filename_with_directory)); +} + +char * +get_directory_name(char *directory_name, + const char * const filename_with_directory) +{ + size_t num_chars_in_directory_name = + find_filename(filename_with_directory) - filename_with_directory; + strncpy(directory_name, filename_with_directory, num_chars_in_directory_name); + directory_name[num_chars_in_directory_name] = '\0'; + return directory_name; +} + +string +get_directory_name(const string& filename_with_directory) +{ + string dir_name = + filename_with_directory.substr(0, find_pos_of_filename(filename_with_directory)); + if (dir_name.empty()) + dir_name = "."; + return dir_name; +} + +string::size_type +find_pos_of_extension(const string& file_in_directory_name) +{ + string::size_type pos_of_dot = + file_in_directory_name.find_last_of('.'); + string::size_type pos_of_filename = + find_pos_of_filename(file_in_directory_name); + if (pos_of_dot >= pos_of_filename) + return pos_of_dot; + else + return string::npos; +} + +#if 0 +// terribly dangerous for memory overrun. +// will only work if enough memor was allocated +char *add_extension(char *file_in_directory_name, + const char * const extension) + +{ + if (strchr(find_filename(file_in_directory_name),'.') == NULL) + strcat (file_in_directory_name,extension); + return file_in_directory_name; +} +#endif + +string& +add_extension(string& file_in_directory_name, + const string& extension) +{ + string::size_type pos = + find_pos_of_extension(file_in_directory_name); + if (pos == string::npos) + file_in_directory_name += extension; + return file_in_directory_name; +} + + + +#if 0 +// terribly dangerous for memory overrun. +// will only work if new extension is shorter than old +char *replace_extension(char *file_in_directory_name, + const char * const extension) +{ + const char * location_of_dot = + strchr(find_filename(file_in_directory_name),'.'); + + // first truncate at extension + if (location_of_dot!= NULL) + *(location_of_dot) = '\0'; + + strcat (file_in_directory_name,extension); + return file_in_directory_name; +} +#endif + +string& +replace_extension(string& file_in_directory_name, + const string& extension) +{ + string::size_type pos = + find_pos_of_extension(file_in_directory_name); + if (pos != string::npos) + file_in_directory_name.erase(pos); + file_in_directory_name += extension; + + return file_in_directory_name; +} + +bool +is_absolute_pathname(const char * const filename_with_directory) +{ +#if defined(__OS_VAX__) + // relative names either contain no '[', or have '[.' + const char * const ptr = strchr(filename_with_directory,'['); + if (ptr==NULL) + return false; + else + return *(ptr+1) != '.'; +#elif defined(__OS_WIN__) + // relative names do not start with '\' or '?:\' + if (filename_with_directory[0] == '\\' || + filename_with_directory[0] == '/') + return true; + else + return (strlen(filename_with_directory)>3 && + filename_with_directory[1] == ':' && + (filename_with_directory[2] == '\\' || + filename_with_directory[2] == '/') + ); +#elif defined(__OS_MAC__) + // relative names either have no ':' or do not start with ':' + const char * const ptr = strchr(filename_with_directory,':'); + if (ptr == NULL) + return false; + else + return ptr != filename_with_directory; +#else // defined(__OS_UNIX__) + // absolute names start with '/' + return filename_with_directory[0] == '/'; +#endif +} + +bool +is_absolute_pathname(const string& filename_with_directory) +{ + return + is_absolute_pathname(filename_with_directory.c_str()); +} + +// Warning: this function assumes that filename_with_directory +// points to sufficient allocated space to contain the new string +char * +prepend_directory_name(char * filename_with_directory, + const char * const directory_name) +{ + if (is_absolute_pathname(filename_with_directory) || + directory_name == 0 || + strlen(directory_name) == 0) + return filename_with_directory; + + char * new_name = + new char[strlen(filename_with_directory) + strlen(directory_name) + 4]; + strcpy(new_name, directory_name); + char * end_of_new_name = new_name + strlen(directory_name)-1; + + +#if defined(__OS_VAX__) + // relative names either contain no '[', or have '[.' + if (filename_with_directory[0] != '[' || + *end_of_new_name != ']') + strcat(new_name, filename_with_directory); + else + { + // peel of the ][ pair + *end_of_new_name = '\0'; + strcat(new_name, filename_with_directory+1); + } +#elif defined(__OS_WIN__) + // append \ if necessary + if (*end_of_new_name != ':' && *end_of_new_name != '\\' && + *end_of_new_name != '/') + strcat(new_name, "\\"); + strcat(new_name, filename_with_directory); +#elif defined(__OS_MAC__) + // relative names either have no ':' or do not start with ':' + // append : if necessary + if (*end_of_new_name != ':') + strcat(new_name, ":"); + // do not copy starting ':' of filename + if (filename_with_directory[0] == ':') + strcat(new_name, filename_with_directory+1); + else + strcat(new_name, filename_with_directory); +#else // defined(__OS_UNIX__) + // append / if necessary + if (*end_of_new_name != '/') + strcat(new_name, "/"); + strcat(new_name, filename_with_directory); +#endif + + strcpy(filename_with_directory, new_name); + delete[] new_name; + return filename_with_directory; +} + +string +ask_filename_with_extension( + const string& prompt, + const string& default_extension) +{ + string file_in_directory_name; + while (file_in_directory_name.size()==0) + { + cerr << prompt; + if (default_extension.size()!=0) + { + cerr << "(default extension '" + << default_extension + << "'):"; + } + std::getline(std::cin, file_in_directory_name); + } + add_extension(file_in_directory_name,default_extension); + return(file_in_directory_name); +} + +char * +ask_filename_with_extension(char *file_in_directory_name, + const string& prompt, + const string& default_extension) +{ + const string answer = + ask_filename_with_extension(prompt, default_extension); + strcpy(file_in_directory_name, answer.c_str()); + return(file_in_directory_name); +} + +template +void +ask_filename_and_open(FSTREAM& s, + const string& prompt, + const string& default_extension, + ios::openmode mode, + bool abort_if_failed) +{ + string filename = + ask_filename_with_extension(prompt, default_extension); + s.open( + filename.c_str(), + mode); + if (abort_if_failed && !s) + { error("Error opening file %s\n", filename.c_str()); } +} + +// instantiations + +template +void +ask_filename_and_open(ifstream& s, + const string& prompt, + const string& default_extension, + ios::openmode mode, + bool abort_if_failed); +template +void +ask_filename_and_open(ofstream& s, + const string& prompt, + const string& default_extension, + ios::openmode mode, + bool abort_if_failed); +template +void +ask_filename_and_open(fstream& s, + const string& prompt, + const string& default_extension, + ios::openmode mode, + bool abort_if_failed); + +// find number of remaining characters +streamsize find_remaining_size (istream& input) +{ + streampos file_current_pos = input.tellg(); + input.seekg(0L, ios::end); + streampos file_end = input.tellg(); + input.clear(); // necessary because seek past EOF ? + input.seekg(file_current_pos); + return file_end - file_current_pos; +} + +void * read_stream_in_memory(istream& input, streamsize& file_size) +{ + if (file_size == 0) + file_size = find_remaining_size(input); + + cerr << "Reading " << file_size << " bytes from file." <(file_size)]; + if (memory == 0) + { error("Not enough memory\n"); } + + { + const streamsize chunk_size = 1024*64; + streamsize to_read = file_size; + char *current_location = memory; + + while( to_read != 0) + { + const streamsize this_read_size = +#ifndef STIR_NO_NAMESPACES + std::min(to_read, chunk_size); +#else + min(to_read, chunk_size); +#endif + input.read(current_location, this_read_size); + if (!input) + { error("Error after reading from stream"); } + + to_read -= this_read_size; + current_location += this_read_size; + } + } + return memory; +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/warning.cxx b/src/buildblock/warning.cxx new file mode 100644 index 0000000000..03584c0dbb --- /dev/null +++ b/src/buildblock/warning.cxx @@ -0,0 +1,63 @@ +// +// +/*! + \file + + \brief defines the stir::warning() function + + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/warning.h" + +#include +#include + +/* Warning: vsnprintf is only ISO C99. So your compiler might not have it. + Visual Studio can be accomodated with the following work-around +*/ +#ifdef BOOST_MSVC +#define vsnprintf _vsnprintf +#endif + +START_NAMESPACE_STIR + +void warning(const char *const s, ...) +{ + va_list ap; + va_start(ap, s); + const unsigned size=10000; + char tmp[size]; + const int returned_size= vsnprintf(tmp,size, s, ap); + if (returned_size<0) + std::cerr << "\nWARNING: error formatting warning message" << std::endl; + else + { + std::cerr << "\nWARNING: " << tmp <(returned_size)>=size) + std::cerr << "\nWARNING: previous warning message truncated as it exceeds " + << size << "bytes" << std::endl; + } +} + +END_NAMESPACE_STIR diff --git a/src/buildblock/zoom.cxx b/src/buildblock/zoom.cxx new file mode 100644 index 0000000000..cd80afc760 --- /dev/null +++ b/src/buildblock/zoom.cxx @@ -0,0 +1,487 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Implementations of the stir::zoom functions + + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project + + +*/ +/* Modification history: + - First versions by CL and KT (sinogram version based on C code by Matthias Egger (using linear interpolation). + - CL introduced overlap interpolation. + - KT moved interpolation to separate function overlap_interpolate, removing bugs. + - KT introduced 3D zooming for images. + - KT converted to new design + */ + +#include "stir/interpolate.h" +#include "stir/zoom.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/PixelsOnCartesianGrid.h" +#include "stir/Viewgram.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/IndexRange3D.h" +#include "stir/IndexRange2D.h" +#include + +START_NAMESPACE_STIR + +// TODO all these are terribly wasteful with memory allocations +// main reason: we cannot have segments with viewgrams of different sizes (et al) +// also they need to be converted to the new design +// as we don't need them at the moment, I can't be bothered... +#if 0 +void zoom_segment (SegmentByView& segment, + const float zoom, const float azimuthal_angle_sampling, const float y_offset_in_mm, + const int new_size, const float azimuthal_angle_sampling) +{ + + // First check if there is anything to do at all, + // if not, return original segment. + + if (new_size == segment.get_num_bins() && + zoom == 1.0 && x_offset_in_mm == 0.0 && y_offset_in_mm == 0.0) + return; + + // KT 17/01/2000 use local copy of scan_info instead of segment.scan_info + ScanInfo scan_info = segment.scan_info; + scan_info.set_num_bins(new_size); + scan_info.set_bin_size(segment.scan_info.get_bin_size() / zoom); + + const int minsize = -new_size/2; + const int maxsize = minsize+new_size-1; + + // TODO replace by get_empty_segment or so + SegmentByView + out_segment(Tensor3D(segment.get_min_view(), segment.get_max_view(), + segment.get_min_axial_pos_num(), segment.get_max_axial_pos_num(), + minsize, maxsize), + scan_info, + segment.get_segment_num(), + segment.get_min_axial_pos_num_difference(), + segment.get_max_ring_difference()); + + for (int view = segment.get_min_view(); view <= segment.get_max_view(); view++) + { + Viewgram viewgram = segment.get_viewgram(view); + zoom_viewgram(viewgram, + zoom, x_offset_in_mm, y_offset_in_mm, + new_size, azimuthal_angle_sampling); + out_segment.set_viewgram(viewgram); + } + + segment = out_segment; +} + + +#endif + +void +zoom_viewgrams (RelatedViewgrams& in_viewgrams, + const float zoom, + const int min_tang_pos_num, const int max_tang_pos_num, + const float x_offset_in_mm, const float y_offset_in_mm) +{ + if (min_tang_pos_num == in_viewgrams.get_min_tangential_pos_num() && + max_tang_pos_num == in_viewgrams.get_max_tangential_pos_num() && + zoom == 1.0 && x_offset_in_mm == 0.0 && y_offset_in_mm == 0.0) + return; + + ProjDataInfo * new_proj_data_info_ptr = + in_viewgrams.get_proj_data_info_ptr()->clone(); + ProjDataInfoCylindricalArcCorr* new_proj_data_info_arccorr_ptr = + dynamic_cast(new_proj_data_info_ptr); + + if ( new_proj_data_info_arccorr_ptr==0) + error("zoom_viewgram does not support non-arccorrected data. Sorry\n"); + + new_proj_data_info_arccorr_ptr->set_min_tangential_pos_num(min_tang_pos_num); + new_proj_data_info_arccorr_ptr->set_max_tangential_pos_num(max_tang_pos_num); + + new_proj_data_info_arccorr_ptr-> + set_tangential_sampling(new_proj_data_info_arccorr_ptr-> + get_tangential_sampling() / zoom); + + shared_ptr + symmetries_sptr(in_viewgrams.get_symmetries_ptr()->clone()); + + RelatedViewgrams + out_viewgrams = + new_proj_data_info_arccorr_ptr-> + get_empty_related_viewgrams(in_viewgrams.get_basic_view_segment_num(), + symmetries_sptr); + + { + RelatedViewgrams::iterator out_iter = out_viewgrams.begin(); + RelatedViewgrams::const_iterator in_iter = in_viewgrams.begin(); + for (; out_iter != out_viewgrams.end(); ++out_iter, ++in_iter) + zoom_viewgram(*out_iter, *in_iter, + x_offset_in_mm, y_offset_in_mm); + } + + in_viewgrams = out_viewgrams; +} + +void +zoom_viewgram (Viewgram& in_view, + const float zoom, + const int min_tang_pos_num, const int max_tang_pos_num, + const float x_offset_in_mm, const float y_offset_in_mm) +{ + if (min_tang_pos_num == in_view.get_min_tangential_pos_num() && + max_tang_pos_num == in_view.get_max_tangential_pos_num() && + zoom == 1.0 && x_offset_in_mm == 0.0 && y_offset_in_mm == 0.0) + return; + + ProjDataInfo * new_proj_data_info_ptr = + in_view.get_proj_data_info_ptr()->clone(); + ProjDataInfoCylindricalArcCorr* new_proj_data_info_arccorr_ptr = + dynamic_cast(new_proj_data_info_ptr); + + if ( new_proj_data_info_arccorr_ptr==0) + error("zoom_viewgram does not support non-arccorrected data. Sorry\n"); + + new_proj_data_info_arccorr_ptr->set_min_tangential_pos_num(min_tang_pos_num); + new_proj_data_info_arccorr_ptr->set_max_tangential_pos_num(max_tang_pos_num); + + new_proj_data_info_arccorr_ptr-> + set_tangential_sampling(new_proj_data_info_arccorr_ptr-> + get_tangential_sampling() / zoom); + + Viewgram + out_view = new_proj_data_info_arccorr_ptr-> + get_empty_viewgram( + in_view.get_view_num(), + in_view.get_segment_num()); + + zoom_viewgram(out_view, in_view, + x_offset_in_mm, y_offset_in_mm); + + in_view = out_view; +} + +void +zoom_viewgram (Viewgram& out_view, + const Viewgram& in_view, + const float x_offset_in_mm, const float y_offset_in_mm) +{ + // minimal checks on compatibility + assert(in_view.get_proj_data_info_ptr()->get_num_views() == + out_view.get_proj_data_info_ptr()->get_num_views()); + assert(in_view.get_view_num() == out_view.get_view_num()); + assert(in_view.get_proj_data_info_ptr()->get_num_segments() == + out_view.get_proj_data_info_ptr()->get_num_segments()); + assert(in_view.get_segment_num() == out_view.get_segment_num()); + assert(in_view.get_min_axial_pos_num() == out_view.get_min_axial_pos_num()); + assert(in_view.get_max_axial_pos_num() == out_view.get_max_axial_pos_num()); + + // get the pointers to the arc-corrected ProjDataInfo + const ProjDataInfoCylindricalArcCorr* in_proj_data_info_arccorr_ptr = + dynamic_cast(in_view.get_proj_data_info_ptr()); + const ProjDataInfoCylindricalArcCorr* out_proj_data_info_arccorr_ptr = + dynamic_cast(out_view.get_proj_data_info_ptr()); + + if (in_proj_data_info_arccorr_ptr==0 || + out_proj_data_info_arccorr_ptr==0) + error("zoom_viewgram does not support non-arccorrected data. Sorry\n"); + + + const float in_bin_size = + in_proj_data_info_arccorr_ptr->get_tangential_sampling(); + const float out_bin_size = + out_proj_data_info_arccorr_ptr->get_tangential_sampling(); + + const float zoom = in_bin_size / out_bin_size; + + if (out_view.get_min_tangential_pos_num() == in_view.get_min_tangential_pos_num() && + out_view.get_max_tangential_pos_num() == in_view.get_max_tangential_pos_num() && + zoom == 1.0F && x_offset_in_mm == 0.0F && y_offset_in_mm == 0.0F) + return; + + const float phi = + in_proj_data_info_arccorr_ptr-> + get_phi(Bin(in_view.get_segment_num(), in_view.get_view_num(), 0,0)); + + // compute offset in tangential_sampling_in units + const float offset = + (x_offset_in_mm*cos(phi) +y_offset_in_mm*sin(phi))/ in_bin_size; + + for (int axial_pos_num= out_view.get_min_axial_pos_num(); axial_pos_num <= out_view.get_max_axial_pos_num(); ++axial_pos_num) + { + overlap_interpolate(out_view[axial_pos_num], in_view[axial_pos_num], zoom, offset); + } +} + + + + +static +VoxelsOnCartesianGrid +construct_new_image_from_zoom_parameters(const VoxelsOnCartesianGrid &image, + const CartesianCoordinate3D& zooms, + const CartesianCoordinate3D& offsets_in_mm, + const BasicCoordinate<3,int>& new_sizes_arg) +{ + CartesianCoordinate3D new_sizes = new_sizes_arg; + assert(new_sizes.x()>=0); + assert(new_sizes.y()>=0); + assert(new_sizes.z()>=0); + CartesianCoordinate3D + voxel_size = image.get_grid_spacing() / zooms; + + // first set origin to 0 + CartesianCoordinate3D + origin(0.F,0.F,0.F); + + VoxelsOnCartesianGrid + new_image(IndexRange3D(0, new_sizes.z()-1, + -new_sizes.y()/2, -new_sizes.y()/2+new_sizes.y()-1, + -new_sizes.x()/2, -new_sizes.x()/2+new_sizes.x()-1), + origin, + voxel_size); + + // find coordinates of middle of images + BasicCoordinate<3,int> min_indices, max_indices; + if (!image.get_regular_range(min_indices, max_indices)) + error("zoom_image: Non-regular range of coordinates in input image. That's strange."); + BasicCoordinate<3,int> new_min_indices, new_max_indices; + if (!new_image.get_regular_range(new_min_indices, new_max_indices)) + error("zoom_image: Non-regular range of coordinates in output image. That's a bug."); + + const BasicCoordinate<3,float> middle = + (image.get_physical_coordinates_for_indices(min_indices) + + image.get_physical_coordinates_for_indices(max_indices))/2; + const BasicCoordinate<3,float> new_middle = + (new_image.get_physical_coordinates_for_indices(new_min_indices) + + new_image.get_physical_coordinates_for_indices(new_max_indices))/2; + // now make sure that these are shifted as required + new_image.set_origin(offsets_in_mm + middle - new_middle); + // check + { + const BasicCoordinate<3,float> final_middle = + (new_image.get_physical_coordinates_for_indices(new_min_indices) + + new_image.get_physical_coordinates_for_indices(new_max_indices))/2; + if (norm(final_middle - middle - offsets_in_mm) > 1) + error("zoom_image bug in finding new origin"); + } + + return new_image; +} +void +zoom_image_in_place(VoxelsOnCartesianGrid &image, + const float zoom, + const float x_offset_in_mm, const float y_offset_in_mm, + const int new_size ) +{ + VoxelsOnCartesianGrid new_image = + zoom_image(image, zoom, x_offset_in_mm, y_offset_in_mm, new_size); + image = new_image; +} + +VoxelsOnCartesianGrid +zoom_image(const VoxelsOnCartesianGrid &image, + const float zoom, + const float x_offset_in_mm, const float y_offset_in_mm, + const int new_size ) +{ + assert(new_size>=0); + if(zoom==1 && x_offset_in_mm==0 && y_offset_in_mm==0 && new_size== image.get_x_size()) + return image; + + const CartesianCoordinate3D zooms(1,zoom,zoom); + const CartesianCoordinate3D offsets_in_mm(0.F, y_offset_in_mm, x_offset_in_mm); + const BasicCoordinate<3,int> new_sizes = + make_coordinate(image.get_length(), new_size, new_size); + + VoxelsOnCartesianGrid new_image = + construct_new_image_from_zoom_parameters(image, + zooms, + offsets_in_mm, + new_sizes); + + PixelsOnCartesianGrid + new_image2D = new_image.get_plane(new_image.get_min_z()); + for (int plane = image.get_min_z(); plane <= image.get_max_z(); plane++) + { + zoom_image(new_image2D, image.get_plane(plane)); + new_image.set_plane(new_image2D, plane); + } + + assert(norm(new_image.get_voxel_size() - image.get_voxel_size()/zooms)<1); + + return new_image; +} + +void +zoom_image_in_place(VoxelsOnCartesianGrid &image, + const CartesianCoordinate3D& zooms, + const CartesianCoordinate3D& offsets_in_mm, + const BasicCoordinate<3,int>& new_sizes) +{ + const VoxelsOnCartesianGrid new_image = + zoom_image(image, zooms, offsets_in_mm, new_sizes); + image = new_image; +} + +VoxelsOnCartesianGrid +zoom_image(const VoxelsOnCartesianGrid &image, + const CartesianCoordinate3D& zooms, + const CartesianCoordinate3D& offsets_in_mm, + const BasicCoordinate<3,int>& new_sizes) +{ + + VoxelsOnCartesianGrid new_image = + construct_new_image_from_zoom_parameters(image, + zooms, + offsets_in_mm, + new_sizes); + zoom_image(new_image, image); + return new_image; +} + +void +zoom_image(VoxelsOnCartesianGrid &image_out, + const VoxelsOnCartesianGrid &image_in) +{ + +/* + interpolation routine uses the following relation: + x_in_index = x_out_index/zoom + offset + + compare to 'physical' coordinates + x_phys = (x_index) * voxel_size.x + origin.x + + as x_in_phys == x_out_phys, we find + (x_in_index)* voxel_size_in.x + origin_in.x == + (x_out_index )* voxel_size_out.x + origin_out.x + <=> + x_in_index = (x_out_index * voxel_size_out.x + + origin_out.x - origin_in.x) + / voxel_size_in.x + + so, zoom= voxel_size_in.x/ voxel_size_out.x + offset = (origin_out.x - origin_in.x)/ voxel_size_in.x + + */ + // check relation between indices and physical coordinates + { + const BasicCoordinate<3,int> indices = make_coordinate(1,2,3); + if (norm(image_in.get_physical_coordinates_for_indices(indices) + - (image_in.get_voxel_size() * BasicCoordinate<3,float>(indices) + image_in.get_origin()) + ) > 2.F) + error("zoom_image is confused about the relation between indices and physical coordinates"); + } + const float zoom_x = + image_in.get_voxel_size().x() / image_out.get_voxel_size().x(); + const float zoom_y = + image_in.get_voxel_size().y() / image_out.get_voxel_size().y(); + const float zoom_z = + image_in.get_voxel_size().z() / image_out.get_voxel_size().z(); + const float x_offset = + (image_out.get_origin().x() - image_in.get_origin().x()) + / image_in.get_voxel_size().x(); + const float y_offset = + (image_out.get_origin().y() - image_in.get_origin().y()) + / image_in.get_voxel_size().y(); + const float z_offset = + (image_out.get_origin().z() - image_in.get_origin().z()) + / image_in.get_voxel_size().z(); + + + if(zoom_x==1.0F && zoom_y==1.0F && zoom_z==1.0F && + x_offset == 0.F && y_offset == 0.F && z_offset == 0.F && + image_in.get_index_range() == image_out.get_index_range() + ) + { + image_out = image_in; + return; + } + + // TODO creating a lot of new images here... + Array<3,float> + temp(IndexRange3D(image_in.get_min_z(), image_in.get_max_z(), + image_in.get_min_y(), image_in.get_max_y(), + image_out.get_min_x(), image_out.get_max_x())); + + for (int z=image_in.get_min_z(); z<=image_in.get_max_z(); z++) + for (int y=image_in.get_min_y(); y<=image_in.get_max_y(); y++) + overlap_interpolate(temp[z][y], image_in[z][y], zoom_x, x_offset); + + Array<3,float> temp2(IndexRange3D(image_in.get_min_z(), image_in.get_max_z(), + image_out.get_min_y(), image_out.get_max_y(), + image_out.get_min_x(), image_out.get_max_x())); + + for (int z=image_in.get_min_z(); z<=image_in.get_max_z(); z++) + overlap_interpolate(temp2[z], temp[z], zoom_y, y_offset); + + temp.recycle(); + + overlap_interpolate(image_out, temp2, zoom_z, z_offset); + +} + +void +zoom_image(PixelsOnCartesianGrid &image2D_out, + const PixelsOnCartesianGrid &image2D_in) +{ + /* + see above for how to find zoom and offsets + */ + + const float zoom_x = + image2D_in.get_pixel_size().x() / image2D_out.get_pixel_size().x(); + const float zoom_y = + image2D_in.get_pixel_size().y() / image2D_out.get_pixel_size().y(); + const float x_offset = + ((image2D_out.get_origin().x() - image2D_in.get_origin().x()) + / image2D_in.get_pixel_size().x() + ); + const float y_offset = + ((image2D_out.get_origin().y() - image2D_in.get_origin().y()) + / image2D_in.get_pixel_size().y() + ); + + if(zoom_x==1.0F && zoom_y==1.0F && + x_offset == 0.F && y_offset == 0.F && + image2D_in.get_index_range() == image2D_out.get_index_range() + ) + { + image2D_out = image2D_in; + return; + } + + Array<2,float> + temp(IndexRange2D(image2D_in.get_min_y(), image2D_in.get_max_y(), + image2D_out.get_min_x(), image2D_out.get_max_x())); + + for (int y=image2D_in.get_min_y(); y<=image2D_in.get_max_y(); y++) + overlap_interpolate(temp[y], image2D_in[y], zoom_x, x_offset); + + overlap_interpolate(image2D_out, temp, zoom_y, y_offset); +} + +END_NAMESPACE_STIR diff --git a/src/cmake/FindAVW.cmake b/src/cmake/FindAVW.cmake new file mode 100644 index 0000000000..582c1e9c64 --- /dev/null +++ b/src/cmake/FindAVW.cmake @@ -0,0 +1,26 @@ +# expects files in $AVW/include and $AVW/$TARGET/lib + + set(AVW_ROOT_DIR CACHE PATH "root of AVW, normally found from the AVW environment variable") + if (NOT AVW_ROOT_DIR AND NOT $ENV{AVW} STREQUAL "") + set(AVW_ROOT_DIR $ENV{AVW_ROOT_DIR}) + endif(NOT AVW_ROOT_DIR AND NOT $ENV{AVW} STREQUAL "") + +#TODO necessary? + IF( AVW_ROOT_DIR ) + file(TO_CMAKE_PATH ${AVW_ROOT_DIR} AVW_ROOT_DIR) + ENDIF( AVW_ROOT_DIR ) + + find_path(AVW_INCLUDE_DIRS NAME AVW.h PATHS ${AVW_ROOT_DIR}/include + DOC "location of AVW include files") +# message(STATUS "AVW_INCLUDE_DIRS ${AVW_INCLUDE_DIRS}") + + find_library(AVW_LIBRARIES NAME AVW + HINTS ${AVW_ROOT_DIR}/$ENV{TARGET}/lib/ + DOC "location of AVW library") + +# handle the QUIETLY and REQUIRED arguments and set AVW_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(AVW "AVW matrix library not found. If you do have it, set the missing variables" AVW_LIBRARIES AVW_INCLUDE_DIRS) + +MARK_AS_ADVANCED(AVW_LIBRARIES AVW_INCLUDE_DIRS ) \ No newline at end of file diff --git a/src/cmake/FindLLN.cmake b/src/cmake/FindLLN.cmake new file mode 100644 index 0000000000..303ca8fc6a --- /dev/null +++ b/src/cmake/FindLLN.cmake @@ -0,0 +1,28 @@ + + if (NOT LLN_ROOT_DIR AND NOT $ENV{LLN} STREQUAL "") + set(LLN_ROOT_DIR $ENV{LLN_ROOT_DIR}) + endif(NOT LLN_ROOT_DIR AND NOT $ENV{LLN} STREQUAL "") + +#TODO necessary? + IF( LLN_ROOT_DIR ) + file(TO_CMAKE_PATH ${LLN_ROOT_DIR} LLN_ROOT_DIR) + ENDIF( LLN_ROOT_DIR ) + + find_path(LLN_INCLUDE_DIRS NAME matrix.h PATHS ${LLN_ROOT_DIR} + DOC "location of LLN include files") +# message(STATUS "LLN_INCLUDE_DIRS ${LLN_INCLUDE_DIRS}") + + find_library(LLN_LIBRARIES NAME ecat HINTS ${LLN_ROOT_DIR} + DOC "location of LLN library") + + if(LLN_LIBRARIES AND $(CMAKE_SYSTEM_NAME) STREQUAL "SunOS") + find_library(LLN_EXTRA_LIBS NAME nsl socket + DOC "extra libraries for linking with the LLN matrix library") + target_link_libraries(${LLN_LIBRARIES} ${LLN_EXTRA_LIBS}) + endif() + +# handle the QUIETLY and REQUIRED arguments and set LLN_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LLN "LLN matrix library not found. If you do have it, set the missing variables" LLN_LIBRARIES LLN_INCLUDE_DIRS) + diff --git a/src/cmake/FindRDF.cmake b/src/cmake/FindRDF.cmake new file mode 100644 index 0000000000..3fbc9f143f --- /dev/null +++ b/src/cmake/FindRDF.cmake @@ -0,0 +1,22 @@ + + if (NOT RDF_ROOT_DIR AND NOT $ENV{RDF} STREQUAL "") + set(RDF_ROOT_DIR $ENV{RDF_ROOT_DIR}) + endif(NOT RDF_ROOT_DIR AND NOT $ENV{RDF} STREQUAL "") + +#TODO necessary? + IF( RDF_ROOT_DIR ) + file(TO_CMAKE_PATH ${RDF_ROOT_DIR} RDF_ROOT_DIR) + ENDIF( RDF_ROOT_DIR ) + + find_path(RDF_INCLUDE_DIRS NAME GErdfUtils.h PATHS ${RDF_ROOT_DIR} + DOC "location of RDF include files") +# message(STATUS "RDF_INCLUDE_DIRS ${RDF_INCLUDE_DIRS}") + + find_library(RDF_LIBRARIES NAME GEio HINTS ${RDF_ROOT_DIR} + DOC "location of RDF library") + +# handle the QUIETLY and REQUIRED arguments and set RDF_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(RDF "GE RDF IO library not found. If you do have it, set the missing variables" RDF_LIBRARIES RDF_INCLUDE_DIRS) + diff --git a/src/cmake/stir_dirs.cmake b/src/cmake/stir_dirs.cmake new file mode 100644 index 0000000000..12e77576ee --- /dev/null +++ b/src/cmake/stir_dirs.cmake @@ -0,0 +1,91 @@ +# +# +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake helper file for building STIR. +# This file is included by CMakeLists.txt and sets variables +# listing all directories. These variables are then used in CMakeLists.txt. + + + +# add the STIR include directory to the search path for the compiler +include_directories ("${PROJECT_SOURCE_DIR}/src/include") + +SET( STIR_IO_REGISTRIES ${PROJECT_SOURCE_DIR}/src/IO/IO_registries.cxx) + +SET ( STIR_REGISTRIES +${PROJECT_SOURCE_DIR}/src/buildblock/buildblock_registries.cxx +${PROJECT_SOURCE_DIR}/src/data_buildblock/data_buildblock_registries.cxx +${STIR_IO_REGISTRIES} +${PROJECT_SOURCE_DIR}/src/recon_buildblock/recon_buildblock_registries.cxx +${PROJECT_SOURCE_DIR}/src/Shape_buildblock/Shape_buildblock_registries.cxx +${PROJECT_SOURCE_DIR}/src/modelling_buildblock/modelling_registries.cxx +${PROJECT_SOURCE_DIR}/src/spatial_transformation_buildblock/spatial_transformation_registries.cxx +) + +SET( STIR_LIBRARIES analytic_FBP3DRP analytic_FBP2D iterative_OSMAPOSL + iterative_OSSPS + scatter_buildblock modelling_buildblock listmode_buildblock recon_buildblock + display IO data_buildblock numerics_buildblock buildblock + spatial_transformation_buildblock + Shape_buildblock eval_buildblock + # repeat for linking + numerics_buildblock modelling_buildblock listmode_buildblock) + + +SET( STIR_DIRS + buildblock + numerics_buildblock + data_buildblock + display + recon_buildblock + modelling_buildblock + listmode_buildblock + IO + spatial_transformation_buildblock + Shape_buildblock + eval_buildblock + scatter_buildblock + utilities + scatter_utilities + modelling_utilities + listmode_utilities + analytic/FBP2D + analytic/FBP3DRP + iterative/OSMAPOSL + iterative/OSSPS + iterative/POSMAPOSL + iterative/NESTPOSMAPOSL + iterative/NESTGPOSMAPOSL + iterative/POSSPS + SimSET + SimSET/scripts +) + + +if (HAVE_ECAT) + list(APPEND STIR_DIRS utilities/ecat) +endif() + + +SET( STIR_TEST_DIRS + recon_test + test + test/numerics + test/modelling +) diff --git a/src/cmake/stir_exe_targets.cmake b/src/cmake/stir_exe_targets.cmake new file mode 100644 index 0000000000..431dc1f82e --- /dev/null +++ b/src/cmake/stir_exe_targets.cmake @@ -0,0 +1,30 @@ +# +# +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake helper file, to be included by CMakeLists.txt files that +# set dir_EXE_SOURCES to a list of executables that need to +# be compiled and installed + +foreach(executable ${${dir_EXE_SOURCES}}) + add_executable(${executable} ${executable} ${STIR_REGISTRIES}) + target_link_libraries(${executable} ${STIR_LIBRARIES}) + SET_PROPERTY(TARGET ${executable} PROPERTY FOLDER "Executables") +endforeach() + +install(TARGETS ${${dir_EXE_SOURCES}} DESTINATION bin) diff --git a/src/cmake/stir_lib_target.cmake b/src/cmake/stir_lib_target.cmake new file mode 100644 index 0000000000..e5efee147e --- /dev/null +++ b/src/cmake/stir_lib_target.cmake @@ -0,0 +1,26 @@ +# +# +# Copyright 2011-07-01 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake helper file, to be included by CMakeLists.txt files that +# set ${dir} to the target-name of the library and ${dir_LIB_SOURCES} +# to its sources + +add_library(${dir} ${${dir_LIB_SOURCES}} ) +SET_PROPERTY(TARGET ${dir} PROPERTY FOLDER "Libs") + +install(TARGETS ${dir} DESTINATION lib) diff --git a/src/cmake/stir_test_exe_targets.cmake b/src/cmake/stir_test_exe_targets.cmake new file mode 100644 index 0000000000..b913f673e9 --- /dev/null +++ b/src/cmake/stir_test_exe_targets.cmake @@ -0,0 +1,90 @@ +# Copyright (C) 2011, Kris Thielemans +# Copyright (C) 2013-2014, University College London + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake helper file, to be included by CMakeLists.txt files that +# set dir_SIMPLE_TEST_EXE_SOURCES, +# dir_INVOLVED_TEST_EXE_SOURCES_NO_REGISTRIES +# and dir_INVOLVED_TEST_EXE_SOURCES +# to a list of executables that need to be compiled (see below for tests that use MPI). +# Moreover, we will use ADD_TEST to create a test for +# the files in dir_SIMPLE_TEST_EXE_SOURCES and dir_INVOLVED_TEST_EXE_SOURCES_NO_REGISTRIES +# (assuming these don't need any parameters). +# You then have to use ADD_TEST for the executables in dir_INVOLVED_TEST_EXE_SOURCES +# +# +# Alternatively, you can directly use one of 3 macros as follows: +# +# create_stir_test(sometest.cxx "${STIR_LIBRARIES}" "${STIR_REGISTRIES}") +# without registries +# create_stir_test(sometest.cxx "${STIR_LIBRARIES}" "") +# A test that uses any of the MPI routines (e.g. in the reconstruction library) +# create_stir_mpi_test(sometest.cxx "${STIR_LIBRARIES}" "${STIR_REGISTRIES}") +# The above will execute the test with ${MPIEXEC_MAX_NUMPROCS} processors +# (probably defaulting to 2 depending on your CMake version) +# A test for which you will use ADD_TEST yourself +# create_stir_involved_test(sometest.cxx "${STIR_LIBRARIES}" "${STIR_REGISTRIES}") + +# Even more advanced usage: +# create_stir_test (test_something.cxx "buildblock;IO;data_buildblock;recon_buildblock;buildblock" "") +# or when it needs to be linked with a registry (but this usage is not recommended as the registry mechanism is likely to change) +# create_stir_test (test_something.cxx "buildblock" "${CMAKE_HOME_DIRECTORY}/buildblock/buildblock_registries.cxx") + + + +#message(status dir_SIMPLE_TEST_EXE_SOURCES: ${dir_SIMPLE_TEST_EXE_SOURCES}) +#message(status dir_SIMPLE_TEST_EXE_SOURCES: ${${dir_SIMPLE_TEST_EXE_SOURCES}}) +#message(status dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES: ${dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES}) +#message(status dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES: ${${dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES}}) + +#### define macros + +macro (create_stir_involved_test source libraries dependencies) + get_filename_component(executable ${source} NAME_WE) + add_executable(${executable} ${source} ${dependencies}) + target_link_libraries(${executable} ${libraries}) + SET_PROPERTY(TARGET ${executable} PROPERTY FOLDER "Tests") +endmacro( create_stir_involved_test) + +macro (create_stir_test source libraries dependencies) + create_stir_involved_test(${source} "${libraries}" "${dependencies}") + ADD_TEST(${executable} ${CMAKE_CURRENT_BINARY_DIR}/${executable}) +endmacro( create_stir_test) + +# for executables that use MPI. +# Note that if MPI is not enabled, these MPI macros will be empty, so this +# macro will then effectively me the same as create_stir_test +macro (create_stir_mpi_test source libraries dependencies) + create_stir_involved_test(${source} "${libraries}" "${dependencies}") + ADD_TEST(${executable} ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_PREFLAGS} ${CMAKE_CURRENT_BINARY_DIR}/${executable} ${MPIEXEC_POSTFLAGS}) +endmacro( create_stir_mpi_test) + + +#### use the above macros for each target in dir_SIMPLE_TEST_EXE_SOURCES etc + +foreach(executable ${${dir_SIMPLE_TEST_EXE_SOURCES}}) + create_stir_test (${executable}.cxx "${STIR_LIBRARIES}" "${STIR_REGISTRIES}") +endforeach() + +# identical to above, but without including the registries as dependencies +foreach(executable ${${dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES}}) + create_stir_test (${executable}.cxx "${STIR_LIBRARIES}" "") +endforeach() + +foreach(executable ${${dir_INVOLVED_TEST_EXE_SOURCES}}) + create_stir_involved_test (${executable}.cxx "${STIR_LIBRARIES}" "${STIR_REGISTRIES}") +endforeach() + diff --git a/src/config.mk b/src/config.mk new file mode 100644 index 0000000000..afded1cbd4 --- /dev/null +++ b/src/config.mk @@ -0,0 +1,401 @@ +# +# +# Author Kris Thielemans +# Copyright 2004 - 2011-03-01 Hammersmith Imanet Ltd +# Copyright (C) 2013-01-01 - 2013, Kris Thielemans +# This file is part of STIR, and is distributed under the +# terms of the GNU Lesser General Public Licence (LGPL) Version 2.1. + +#******* type of build, if BUILD is not set, we make the optimised version +BUILD=opt + +#******** location of files + +INCLUDE_DIR = ${WORKSPACE}/include +INSTALL_PREFIX := ${HOME} +INSTALL_EXE_DIR = $(INSTALL_PREFIX)/bin +INSTALL_LIB_DIR = $(INSTALL_PREFIX)/lib +INSTALL_INCLUDE_DIR = $(INSTALL_PREFIX)/include + +# location of .o, .a and executables, set DEST if you don't agree with the default +ifndef DEST +ifeq ($(BUILD),debug) +DEST=debug/ +else # not debug +ifeq ($(BUILD),nonopt) +DEST=nonopt/ +else +DEST=opt/ +endif # nonopt +endif # debug/ ? +endif # DEST not defined + +#******* type of graphics used by display() +# possible values: X, PGM, MATHLINK, NONE +# note: only used in display/lib.mk and for GRAPH_LIBS +GRAPHICS=X + +#******* command used for install* targets +INSTALL=cp +# could be something like +#INSTALL="install -s -m 755" + +#****** find out which system we're on + +include $(WORKSPACE)/Makefile_common_system_type + +#******** type of parallel library +# PARALIB can be EPX or PVM +ifeq ($(SYSTEM),CC) +PARALIB=EPX +else +PARALIB=PVM +endif # not CC + +#******** default compiler and linker that will be used + +# for C++ +CXX=g++ +# for C +CC=gcc +# program that will be used for linking, normally the C++ compiler +LINK=$(CXX) + + +# make a variable that allows us to test if we have Microsoft Visual Studio C++ +# If so, lots of variables in the makefiles will have to be set non-standard. +IS_MS_VC:=$(shell $(CXX) 2>&1 |grep Microsoft) + +ifneq ("$(IS_MS_VC)","") +#$(warning Enabling Visual C++ specific fixes) +endif + +#******* compiler and linker extra options + + +#** EXTRA_CFLAGS: for compiler +# allow the user to get some extra options by using make EXTRA_CFLAGS=bla +ifeq ($(CC),gcc) +EXTRA_CFLAGS =-Wall -Wno-deprecated +endif + +#** PARALLEL FLAGS*** + +ifeq ($(findstring mpi,$(CXX)),mpi) +STIR_MPI=1 +endif + +ifeq ($(STIR_MPI),1) +MPI_CFLAGS =-DMPICH_IGNORE_CXX_SEEK -DSTIR_MPI +ifeq ($(STIR_MPI_TIMINGS),1) + MPI_CFLAGS += -DSTIR_MPI_TIMINGS +endif +endif + +ifeq ($(STIR_OPENMP),1) + OPENMP_CFLAGS=-fopenmp -DSTIR_OPENMP +else + OPENMP_CFLAGS= +endif + +#** EXTRA_LINKFLAGS: for linker +#allow the user to get extra options for link time +EXTRA_LINKFLAGS= +#** compiler options + + +#******** variables used only for ecat7 +# local/config.mk can override these defaults +LLN_INCLUDE_DIR=$(WORKSPACE)/../lln/ecat +LLN_LIB_DIR=$(LLN_INCLUDE_DIR) + +#******** variables used only for GE RDF IO +# local/config.mk can override these defaults +RDF_BASE_DIR=$(WORKSPACE)/../rdf +RDF_LIB_DIR=${RDF_BASE_DIR}/src +RDF_INCLUDE_DIR=${RDF_BASE_DIR}/include + +#******** variables used only for GE IE IO +# local/config.mk can override these defaults +IE_BASE_DIR=$(WORKSPACE)/../IE +IE_LIB_DIR=${IE_BASE_DIR} +IE_INCLUDE_DIR=${IE_BASE_DIR} + +#******* compiler and linker options + +IS_GCC:=$(shell $(CXX) -v 2>&1 |grep "gcc") +ifneq ("$(IS_GCC)","") + # gcc compiler + # check if it supports -Ofast + ifneq ("$(shell $(CXX) --help=optimizers|fgrep "Ofast")", "") + FAST_CFLAG=-Ofast + else + FAST_CFLAG=-ffast-math + endif +else + ifeq ($(CC),icc) + # Intel C compiler + FAST_CFLAG=-fast + AR=xiar + endif +endif + +# note for gcc 2.95.2:xxxx +# do not use -malign-double as it crashes in iostream stuff +OPTIM_CFLAGS=-O3 -DNDEBUG $(FAST_CFLAG) + +ifeq ($(SYSTEM),CYGWIN) +OPTIM_CFLAGS+= -malign-double +EXTRA_LINKFLAGS+=-Xlinker --enable-auto-import +endif + +NONOPTIM_CFLAGS=-g +DEBUG_CFLAGS=-D_DEBUG -g + +OPTIM_LINKFLAGS= +NONOPTIM_LINKFLAGS=-g +DEBUG_LINKFLAGS=-g + +ifeq ($(BUILD),debug) +CFLAGS = $(DEBUG_CFLAGS) $(OPENMP_CFLAGS) $(MPI_CFLAGS) $(EXTRA_CFLAGS) -I$(INCLUDE_DIR) +else +ifeq ($(BUILD),nonopt) +CFLAGS = $(NONOPTIM_CFLAGS) $(OPENMP_CFLAGS) $(MPI_CFLAGS) $(EXTRA_CFLAGS) -I$(INCLUDE_DIR) +else +# release version +CFLAGS = $(OPTIM_CFLAGS) $(OPENMP_CFLAGS) $(MPI_CFLAGS) $(EXTRA_CFLAGS) -I$(INCLUDE_DIR) +endif +endif + + + +#** LINKFLAGS: add specific libraries and switches depending on platforms +# possibly this should check on AIX as well +# if so, we should additionally check on ifeq($(CC),gcc) +# as -Xlinker is only appropriate for gcc +ifeq ($(SYSTEM),CC) +LINKFLAGS=-Xlinker -bbigtoc $(EXTRA_LINKFLAGS) $(EXTRA_LIBS) +else +LINKFLAGS=$(EXTRA_LINKFLAGS) $(EXTRA_LIBS) +endif + +ifeq ($(BUILD),debug) +LINKFLAGS+= $(DEBUG_LINKFLAGS) $(OPENMP_CFLAGS) +else +ifeq ($(BUILD),nonopt) +LINKFLAGS+= $(NONOPTIM_LINKFLAGS) $(OPENMP_CFLAGS) +else +# release version +LINKFLAGS+= $(OPTIM_LINKFLAGS) $(OPENMP_CFLAGS) +endif +endif + + +#******** system libraries + +SYS_LIBS = -lm + +# add any others specific to your system using the SYSTEM macros + +#******** system functions +# try to find if the system has its own getopt function +# Our current attempt is very feeble, but works on Linux and CYGWIN +ifneq ($(wildcard /usr/include/getopt.h),"") + CFLAGS+=-DHAVE_SYSTEM_GETOPT +endif + +#********* macros for compiler options +# see below why we need them + +ifeq ("$(IS_MS_VC)","") +# the 'normal' case of cc, ar, etc. + +# flag to be passed to $(CXX) and $(CC) for specifying the name of the object (.o) file +O_OUTFLAG := -o +# extension for object files +O_SUFFIX := .o +# flag to be passed to $(LINK) for specifying the name of the executable +# warning: there has to be a space after the -o. Otherwise, ld on OSX complains. +# Note that Visual Studio does not work when there is a space after its EXE_OUTFLAG... +EXE_OUTFLAG := -o +# note: extension for executables is handled somewhat differently +# CYGWIN make (in Unix mode) appends the .exe in targets etc, so we need +# $(EXE_SUFFIX) only for copying, deleting files etc + +# extension for archives +LIB_SUFFIX:=.a +# usually, on Unix, libraries are called libsomething.a, such that one could do -lsomething +LIB_PREFIX:=lib + +else + +# various settings for the Microsoft Visual C++ compiler +# Unfortunately, this compiler has non-standard options, so we need +# various macros such that the rest of the Makefiles can be general +# (although a bit less readable unfortunately) + +# KT has put other options here as well, to avoid cluttering this file +# with stuff that most people don't want to see. + +# Note that we set CC, LINK and AR here appropriately, see you only need to set +# CXX=cl for all this to jump into action. + +CC=$(CXX) + +O_OUTFLAG:=/Fo +O_SUFFIX:=.obj +LINK=link +#EXE_OUTFLAG=/Fe +EXE_OUTFLAG:=/out: +LIB_SUFFIX:=.lib +LIB_PREFIX:= +AR:=link +ARFLAGS=-lib -nologo +AR_OUTFLAG=-out: + +# Normally, you should set the LIB and INCLUDE environment variables. +# If not, you could specify the location of your Visual Studio files by hand +#MSVCLOC:=c:/Program Files/Microsoft Visual C++ Toolkit 2003/ +EXTRA_LINKFLAGS= /nologo +#/libpath:"${MSVCLOC}lib" + +# get rid of -lm above +SYS_LIBS= + +DEBUG_CFLAGS=/Z7 /Od /D _DEBUG /GS /GZ /MLd +OPTIM_CFLAGS=/D NDEBUG /Ox /ML +EXTRA_CFLAGS=/nologo /G6 /W3 /GR /GX /D "_WINDOWS" /D "WIN32" +# /I"${MSVCLOC}include" + +OPTIM_LINKFLAGS= /incremental:no +DEBUG_LINKFLAGS= /debug + +endif # end of settings for MS VC + +#******** customisation +# include local configuration file, possibly overriding any of the above +# use -include to not warn when it does not exist + +-include $(WORKSPACE)/local/config.mk + + + +#*********************************************************************** +# from here on, things are noncustomisable anymore +# (except by editing this file, which is strongly discouraged for 'normal' users) +#*********************************************************************** + +#****** AVW libraries +# AVW is a C library for image processing, developed at the Mayo and distributed with Analyze + +ifneq ($(HAVE_AVW), 0) + AVW_INCLUDE_DIR=$(AVW)/include + AVW_LIBS=$(AVW)/$(TARGET)/lib/libAVW.so +# $(warning AVW $(AVW_INCLUDE_DIR) $(AVW_LIBS) ) + ifneq ($(wildcard $(AVW_INCLUDE_DIR)/AVW.h),"") + # $(warning found AVW include) + # $(warning wild $(wildcard $(AVW_LIBS) ) ) + ifneq ("$(wildcard $(AVW_LIBS) )","") + # $(warning found AVW library) + HAVE_AVW=1 + CFLAGS += -I $(AVW_INCLUDE_DIR) -D HAVE_AVW + # we include the library-name for linking + # an alternative would be to use -L $(AVW)/$(TARGET)/lib -l AVW + # This seems to have the effect that the system doesn't necessarily find + # the shared library (which can be remedied via ldconfig on Linux, crle on Solaris, or + # environment variables such as LD_RUN_PATH or LD_LIBRARY_PATH). + EXTRA_LIBS += $(AVW_LIBS) + endif + endif +endif + + + +#******* LLN matrix libraries +# check if we find the Louvain la Neuve distribution by looking for matrix.h +ifneq ($(HAVE_LLN_MATRIX),0) + ifneq ("$(wildcard $(LLN_INCLUDE_DIR)/matrix.h)","") + # $(warning found LLN matrix.h) + LLN_LIB=$(LLN_LIB_DIR)/$(LIB_PREFIX)ecat$(LIB_SUFFIX) + ifeq ("$(wildcard $(LLN_LIB))","") + $(error --- Found LLN include files, but no library at $(LLN_LIB). Please build this first, or set HAVE_LLN_MATRIX=0 ) + endif + # $(warning found $(wildcard $(LLN_LIB))) + # yes, the LLN files seem to be there, so we can compile + HAVE_LLN_MATRIX=1 + CFLAGS += -I $(LLN_INCLUDE_DIR) -D HAVE_LLN_MATRIX + EXTRA_LIBS += ${LLN_LIB} + ifeq ($(SYSTEM),SUN) + SYS_LIBS += -lnsl -lsocket + endif + endif +endif + +#******* GE IO +# check if we find it by looking for niff.h +ifneq ($(HAVE_GE_IO),0) + ifneq ("$(wildcard $(INCLUDE_DIR)/local/stir/IO/GE/niff.h)","") + HAVE_GE_IO=1 + CFLAGS+=-DSTIR_USE_GE_IO + endif +endif + +#******* GE RDF library +# check if we find it by looking for GErdfUtils.h +ifneq ($(HAVE_RDF),0) + ifneq ("$(wildcard $(RDF_INCLUDE_DIR)/GErdfUtils.h)","") + RDF_LIB=${RDF_LIB_DIR}/$(LIB_PREFIX)GEio$(LIB_SUFFIX) + ifeq ("$(wildcard $(RDF_LIB))","") + $(error --- Found RDF include files, but no library at $(RDF_LIB). Please build this first, or set HAVE_RDF=0 ) + endif + # $(warning found RDF library) + HAVE_RDF=1 + CFLAGS+=-I ${RDF_INCLUDE_DIR} -DHAVE_RDF + # note: this won't work for MS VC + EXTRA_LIBS += $(RDF_LIB) + endif +endif + +#******* GE IE library +# check if we find it by looking for IEUtils.h +ifneq ($(HAVE_IE),0) + ifneq ("$(wildcard $(IE_INCLUDE_DIR)/IEUtils.h)","") + IE_LIB=${IE_LIB_DIR}/$(LIB_PREFIX)IEIO$(LIB_SUFFIX) + ifeq ("$(wildcard $(IE_LIB))","") + $(error --- Found IE include files, but no library at $(IE_LIB). Please build this first, or set HAVE_IE=0 ) + endif + # $(warning found IE library) + HAVE_IE=1 + CFLAGS+=-I ${IE_INCLUDE_DIR} -DHAVE_IE + # note: this won't work for MS VC + EXTRA_LIBS += $(IE_LIB) + endif +endif + + +#****** other configuration checks +# make a variable that allows us to test if we have gcc 3.0 or later +# If so, this will allow us to simplify generating the dependencies a lot! +IS_GCC_3:=$(shell $(CXX) -v 2>&1 |grep "gcc version [3456789]") + +# make a variable that allows us to test if we have GNU ar +# If so, this we do not run ranlib but use the s option to save some time +IS_GNU_AR:=$(shell $(AR) --version 2>&1 |grep "GNU ar") +ifneq ("$(IS_GNU_AR)","") + # $(warning Using GNU ar) + ARFLAGS:=rs +else + # $(warning Not using GNU ar) +endif + +# a variable that will be used to get the real name of an executable +# this is necessary on Windows. +# CYGWIN make automatically appends .exe to executable files in targets etc, but not +# commands such as cp +ifeq ($(SYSTEM),CYGWIN) +EXE_SUFFIX := .exe +else +#EXE_SUFFIX= +endif + + diff --git a/src/data_buildblock/CMakeLists.txt b/src/data_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..18464888b0 --- /dev/null +++ b/src/data_buildblock/CMakeLists.txt @@ -0,0 +1,39 @@ +# +# +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. + +set(dir data_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + SinglesRates + SinglesRatesForTimeFrames +) +if (HAVE_ECAT) + list(APPEND ${dir_LIB_SOURCES} + SinglesRatesFromSglFile + SinglesRatesFromECAT7 + ) +endif() + +include(stir_lib_target) + +target_link_libraries(${dir} buildblock) diff --git a/src/data_buildblock/RegisteredObject.cxx b/src/data_buildblock/RegisteredObject.cxx new file mode 100644 index 0000000000..b39fd5bd86 --- /dev/null +++ b/src/data_buildblock/RegisteredObject.cxx @@ -0,0 +1,61 @@ +// +// +/* + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup buildblock + \brief instantiations of RegisteredObject for classes in recon_buildblock + (only useful for Microsoft Visual Studio 6.0) + + \author Kris Thielemans + +*/ + +// note: include has to be before #ifdef as it's in this file that +// __STIR_REGISTRY_NOT_INLINE is defined +#include "stir/RegisteredObject.h" +#ifdef __STIR_REGISTRY_NOT_INLINE + +#pragma message("instantiating RegisteredObject") +#include "stir/data/SinglesRates.h" + + +// and others +START_NAMESPACE_STIR + +template +RegisteredObject::RegistryType& +RegisteredObject::registry () +{ + static RegistryType the_registry("None", 0); + return the_registry; +} + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + + +template RegisteredObject; + +END_NAMESPACE_STIR + +#endif diff --git a/src/data_buildblock/SinglesRates.cxx b/src/data_buildblock/SinglesRates.cxx new file mode 100644 index 0000000000..4e5fc564ba --- /dev/null +++ b/src/data_buildblock/SinglesRates.cxx @@ -0,0 +1,100 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup singles_buildblock + \brief Implementation of stir::FrameSinglesRates and stir::SinglesRates + + \author Kris Thielemans + \author Tim Borgeaud +*/ + +#include "stir/data/SinglesRates.h" + + +START_NAMESPACE_STIR + + +/* + *! FrameSinglesRates constructor. + */ +FrameSinglesRates:: +FrameSinglesRates(vector& avg_singles_rates, + double start_time, + double end_time, + shared_ptr scanner_sptr) : + _start_time(start_time), + _end_time(end_time), + _singles(avg_singles_rates), + _scanner_sptr(scanner_sptr) +{ + assert(avg_singles_rates.size() == static_cast(scanner_sptr->get_num_singles_units())); +} + + + +float +FrameSinglesRates:: +get_singles_rate(int singles_bin_index) const { + return(_singles[singles_bin_index]); +} + + + +float +FrameSinglesRates:: +get_singles_rate(const DetectionPosition<>& det_pos) const { + int singles_bin_index = _scanner_sptr->get_singles_bin_index(det_pos); + return(get_singles_rate(singles_bin_index)); +} + + + + +double +FrameSinglesRates:: +get_start_time() const { + return(_start_time); +} + +double +FrameSinglesRates:: +get_end_time() const { + return(_end_time); +} + + + +// Get the average singles rate for a particular bin. +float +SinglesRates:: +get_singles_rate(const DetectionPosition<>& det_pos, + const double start_time, const double end_time) const +{ + const int singles_bin_index = scanner_sptr->get_singles_bin_index(det_pos); + return(get_singles_rate(singles_bin_index, start_time, end_time)); +} + + + +END_NAMESPACE_STIR + + + diff --git a/src/data_buildblock/SinglesRatesForTimeFrames.cxx b/src/data_buildblock/SinglesRatesForTimeFrames.cxx new file mode 100644 index 0000000000..47825f7dc5 --- /dev/null +++ b/src/data_buildblock/SinglesRatesForTimeFrames.cxx @@ -0,0 +1,110 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup singles_buildblock + \brief Implementation of stir::SinglesRatesForTimeFrames + + \author Kris Thielemans + \author Timothy Borgeaud +*/ + +#include "stir/data/SinglesRatesForTimeFrames.h" +//#include "stir/IndexRange2D.h" + +START_NAMESPACE_STIR + +SinglesRatesForTimeFrames:: +SinglesRatesForTimeFrames() +{} + + +float +SinglesRatesForTimeFrames:: +get_singles_rate(const int singles_bin_index, + const unsigned int time_frame_num) const +{ + return(this->_singles[time_frame_num][singles_bin_index]); +} + +void +SinglesRatesForTimeFrames:: +set_singles_rate(const int singles_bin_index, + const unsigned time_frame_num, + const float new_rate) + +{ + this->_singles[time_frame_num][singles_bin_index] = new_rate; +} + + +float +SinglesRatesForTimeFrames:: +get_singles_rate(const int singles_bin_index, + const double start_time, + const double end_time) const +{ + const unsigned frame_number = + this->_time_frame_defs.get_time_frame_num(start_time, end_time); + if (frame_number == 0) + return -1.F; + else + return(get_singles_rate(singles_bin_index, frame_number)); +} + +unsigned int +SinglesRatesForTimeFrames::get_num_frames() const { + return(this->_time_frame_defs.get_num_frames()); +} + +const TimeFrameDefinitions& +SinglesRatesForTimeFrames:: +get_time_frame_definitions() const +{ + return this->_time_frame_defs; +} + + +#if 0 +double +SinglesRatesForTimeFrames:: +get_frame_start(unsigned int frame_number) const { + if ( frame_number < 1 || frame_number > this->_time_frame_defs.get_num_frames() ) { + return(0.0); + } else { + return(this->_time_frame_defs.get_start_time(frame_number)); + } +} + + + +double +SinglesRatesForTimeFrames:: +get_frame_end(unsigned int frame_number) const { + if ( frame_number < 1 || frame_number > this->_time_frame_defs.get_num_frames() ) { + return(0.0); + } else { + return(this->_time_frame_defs.get_end_time(frame_number)); + } +} + +#endif +END_NAMESPACE_STIR + + diff --git a/src/data_buildblock/SinglesRatesFromECAT7.cxx b/src/data_buildblock/SinglesRatesFromECAT7.cxx new file mode 100644 index 0000000000..3b55d275bc --- /dev/null +++ b/src/data_buildblock/SinglesRatesFromECAT7.cxx @@ -0,0 +1,179 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup singles_buildblock + \brief Implementation of stir::ecat::ecat7::SinglesRatesFromECAT7 + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +#include "stir/data/SinglesRatesFromECAT7.h" +#include "stir/DetectionPosition.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/IndexRange2D.h" +#ifdef HAVE_LLN_MATRIX +#include "ecat_model.h" +#endif + +#include + +#ifndef STIR_NO_NAMESPACES +using std::ofstream; +using std::streampos; +#endif + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +const char * const +SinglesRatesFromECAT7::registered_name = "Singles From ECAT7"; + +SinglesRatesFromECAT7:: +SinglesRatesFromECAT7() +{} + + +int +SinglesRatesFromECAT7::read_singles_from_file(const string& ECAT7_filename, + const std::ios::openmode open_mode) + +{ + + int num_frames = 0; + +#ifndef HAVE_LLN_MATRIX + + error("SinglesRatesFromECAT7 compiled without ECAT7 support"); + +#else + + MatrixFile* mptr = matrix_open(ECAT7_filename.c_str(), MAT_READ_ONLY, MAT_UNKNOWN_FTYPE); + + if (mptr==0) { + error("Error opening '%s' as ECAT7\n", ECAT7_filename.c_str()); + } + + if (!(mptr->mhptr->file_type == Byte3dSinogram || + mptr->mhptr->file_type == Short3dSinogram || + mptr->mhptr->file_type == Float3dSinogram)) { + error("SinglesRatesFromECAT7: filename %s should be an ECAT7 emission file\n", + ECAT7_filename.c_str()); + } + + scanner_sptr.reset(find_scanner_from_ECAT_system_type(mptr->mhptr->system_type)); + + + if (scanner_sptr->get_type() != Scanner::E966) { + warning("check SinglesRatesFromECAT7 for non-966\n"); + } + + + Main_header* main_header = reinterpret_cast( mptr->mhptr ) ; + + num_frames = main_header->num_frames; + + // Get total number of bins for this type of scanner. + const int total_singles_units = scanner_sptr->get_num_singles_units(); + + if ( total_singles_units > 0 ) { + // Create the main array of data. + this->_singles = Array<2,float>(IndexRange2D(1, main_header->num_frames, + 0, total_singles_units - 1)); + } + + + MatrixData* matrix; + vector > time_frames(main_header->num_frames); + + + for ( int mat_frame = 1 ; mat_frame <= num_frames ; mat_frame++ ) + { + //cerr << "Reading frame " << mat_frame <(matrix->shptr); + time_frames[mat_frame-1].first=scan_subheader_ptr->frame_start_time/1000.; + time_frames[mat_frame-1].second= + time_frames[mat_frame-1].first + + scan_subheader_ptr->frame_duration/1000.; + + float const* singles_ptr = reinterpret_cast(scan_subheader_ptr->uncor_singles);//matrix->data_ptr); + + // The order of the singles units in the sub header is the same as required + // by the main singles array. This may not be the case for other file formats. + for (int singles_bin = 0 ; singles_bin < total_singles_units ; ++singles_bin) { + this->_singles[mat_frame][singles_bin] = *(singles_ptr + singles_bin); + } + + } + + this->_time_frame_defs = TimeFrameDefinitions(time_frames); +#endif + + return(num_frames); + +} + + + + + + + + + +void +SinglesRatesFromECAT7:: +initialise_keymap() +{ + parser.add_start_key("Singles Rates From ECAT7"); + parser.add_key("ECAT7_filename", &ECAT7_filename); + parser.add_stop_key("End Singles Rates From ECAT7"); +} + +bool +SinglesRatesFromECAT7:: +post_processing() +{ + read_singles_from_file(ECAT7_filename); + return false; +} + + +void +SinglesRatesFromECAT7::set_defaults() +{ + ECAT7_filename = ""; +} + + + + + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + + diff --git a/src/data_buildblock/SinglesRatesFromSglFile.cxx b/src/data_buildblock/SinglesRatesFromSglFile.cxx new file mode 100644 index 0000000000..1b551c11fa --- /dev/null +++ b/src/data_buildblock/SinglesRatesFromSglFile.cxx @@ -0,0 +1,767 @@ +/* + Copyright (C) 2003-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup singles_buildblock + \brief Implementation of stir::ecat::ecat7::SinglesRatesFromECAT7 + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +#include "stir/DetectionPosition.h" +#include "stir/IndexRange.h" +#include "stir/IndexRange2D.h" +#include "stir/data/SinglesRatesFromSglFile.h" +#include "stir/round.h" + +#include +#ifdef HAVE_LLN_MATRIX +#include "ecat_model.h" +#include "stir/IO/stir_ecat7.h" +#endif +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::ofstream; +using std::streampos; +using std::ios; +#endif + + + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 +const unsigned +SinglesRatesFromSglFile::SIZE_OF_SINGLES_RECORD = 4*128; + +const char * const +SinglesRatesFromSglFile::registered_name = "Singles From Sgl File"; + + +const double MAX_INTERVAL_DIFFERENCE = 0.05; // 5% max difference. + + +static inline +unsigned long int +convert_4_bytes(unsigned char * buffer) +{ + // The order from the file is always big endian. The native order doesn't matter + // when converting by multiplying and adding the individual bytes. + //if (ByteOrder::get_native_order() == ByteOrder::big_endian) + // return buffer[0] + 256UL*(buffer[1] + 256UL*(buffer[2] + 256UL*buffer[3])); + //else + return buffer[3] + 256UL*(buffer[2] + 256UL*(buffer[1] + 256UL*buffer[0])); + +} + + + +static inline +void +convert_int_to_4_bytes(unsigned long int val, unsigned char *buffer) { + // Big endian + buffer[0] = (val & 0xff000000) >> 24; + buffer[1] = (val & 0x00ff0000) >> 16; + buffer[2] = (val & 0x0000ff00) >> 8; + buffer[3] = (val & 0x000000ff); +} + + + + + +// Constructor +SinglesRatesFromSglFile:: +SinglesRatesFromSglFile() +{} + + +// Generate a FramesSinglesRate - containing the average rates +// for a frame begining at start_time and ending at end_time. +FrameSinglesRates +SinglesRatesFromSglFile:: +get_rates_for_frame(double start_time, + double end_time) const { + + int num_singles_units = scanner_sptr->get_num_singles_units(); + + // Create a temporary vector + vector average_singles_rates(num_singles_units); + + + // Loop over all bins. + for(int singles_bin = 0 ; singles_bin < num_singles_units ; ++singles_bin) { + average_singles_rates[singles_bin] = get_singles_rate(singles_bin, start_time, end_time); + } + + // Determine that start and end slice indices. + int start_slice = get_start_time_slice_index(start_time); + int end_slice = get_end_time_slice_index(end_time); + + double frame_start_time; + if ( start_slice == 0 ) { + frame_start_time = _times[0] - _singles_time_interval; + } else { + frame_start_time = _times[start_slice - 1]; + } + + double frame_end_time = _times[end_slice]; + + // Create temp FrameSinglesRate object + FrameSinglesRates frame_rates(average_singles_rates, + frame_start_time, + frame_end_time, + scanner_sptr); + + return(frame_rates); + +} + + + + + +// Get time slice index. +// Returns the index of the slice that contains the specified time. +int +SinglesRatesFromSglFile:: +get_end_time_slice_index(double t) const { + + int slice_index = 0; + + // Start with an initial estimate. + if ( _singles_time_interval != 0 ) { + slice_index = static_cast(floor(t / _singles_time_interval)); + } + + if ( slice_index >= _num_time_slices ) { + slice_index = _num_time_slices - 1; + } + + + // Check estimate and determine whether to look further or backwards. + // Note that we could just move fowards first and then backwards but this + // method is more intuitive. + + if ( _times[slice_index] < t ) { + + // Check forwards. + while( slice_index < _num_time_slices - 1 && + _times[slice_index] < t ) { + slice_index++; + } + + } else { + + // Check backwards. + while( slice_index > 0 && _times[slice_index - 1] >= t ) { + slice_index--; + } + + } + + return(slice_index); +} + + + + +// Get time slice index. +// Returns first slice ending _after_ t. +int +SinglesRatesFromSglFile:: +get_start_time_slice_index(double t) const { + + int slice_index = 0; + + // Start with an initial estimate. + if ( _singles_time_interval != 0 ) { + slice_index = static_cast(floor(t / _singles_time_interval)); + } + + if ( slice_index >= _num_time_slices ) { + slice_index = _num_time_slices - 1; + } + + + // Check estimate and determine whether to look further or backwards. + // Note that we could just move fowards first and then backwards but this + // method is more intuitive. + + if ( _times[slice_index] < t ) { + + // Check forwards. + while( slice_index < _num_time_slices - 1 && + _times[slice_index] <= t ) { + slice_index++; + } + + } else { + + // Check backwards. + while( slice_index > 0 && _times[slice_index - 1] > t ) { + slice_index--; + } + + } + + return(slice_index); +} + + + + + + +// Get rates using time slice and singles bin indices. +int +SinglesRatesFromSglFile:: +get_singles_rate(int singles_bin_index, int time_slice) const { + + // Check ranges. + int total_singles_units = scanner_sptr->get_num_singles_units(); + + if ( singles_bin_index < 0 || singles_bin_index >= total_singles_units || + time_slice < 0 || time_slice >= _num_time_slices ) { + return(0); + } else { + return _singles[time_slice][singles_bin_index]; + } + +} + + + +// Set a singles rate by bin index and time slice. +void +SinglesRatesFromSglFile:: +set_singles_rate(int singles_bin_index, int time_slice, int new_rate) { + + int total_singles_units = scanner_sptr->get_num_singles_units(); + + if ( singles_bin_index >= 0 && singles_bin_index < total_singles_units && + time_slice >= 0 && time_slice < _num_time_slices ) { + _singles[time_slice][singles_bin_index] = new_rate; + } +} + + + + +int +SinglesRatesFromSglFile:: +rebin(vector& new_end_times) { + + const int num_new_slices = new_end_times.size(); + const int total_singles_units = scanner_sptr->get_num_singles_units(); + + // Create the new array of singles data. + Array<2, int> new_singles = Array<2, int>(IndexRange2D(0, num_new_slices - 1, + 0, total_singles_units - 1)); + + + // Sort the set of new time slices. + std::sort(new_end_times.begin(), new_end_times.end()); + + // Start with initial time of 0.0 seconds. + double start_time = 0; + + + // Loop over new time slices. + for(unsigned int new_slice = 0 ; new_slice < new_end_times.size(); ++new_slice) { + + // End time for the new time slice. + double end_time = new_end_times[new_slice]; + + // If start time is beyond last end time in original data, then use zeros. + if ( start_time > _times[_num_time_slices - 1] ) { + for(int singles_bin = 0 ; singles_bin < total_singles_units ; ++singles_bin) { + new_singles[new_slice][singles_bin] = 0; + } + } else { + + // Get the singles rate average between start and end times for all bins. + for(int singles_bin = 0 ; singles_bin < total_singles_units ; ++singles_bin ) { + new_singles[new_slice][singles_bin] = + round(get_singles_rate(singles_bin, start_time, end_time)); + } + + } + + // Next new time slice starts at the end of this slice. + start_time = end_time; + + } + + + // Set the singles and times using the new sets. + _singles = new_singles; + _times = new_end_times; + _num_time_slices = _times.size(); + + return(_num_time_slices); +} + + + +vector +SinglesRatesFromSglFile::get_times() const +{ + return _times; +} + + + + +int +SinglesRatesFromSglFile:: +get_num_time_slices() const { + return(_num_time_slices); +} + + + +double +SinglesRatesFromSglFile:: +get_singles_time_interval() const { + return(_singles_time_interval); +} + + + + + +int +SinglesRatesFromSglFile:: +read_singles_from_sgl_file(const string& sgl_filename) +{ + + int slice = 0; + +#ifndef HAVE_LLN_MATRIX + + error("Compiled without ECAT7 support\n"); + +#else + + ifstream singles_file(sgl_filename.c_str(), ios::binary); + if (!singles_file) { + error("\nSinglesRatesFromSglFile: Couldn't open \"%s\".\n", sgl_filename.c_str()); + } + + + //first find out the size of the file + singles_file.seekg(0, ios::end); + const streampos end_stream_position = singles_file.tellg(); + if (!singles_file) { + error("\nSinglesRatesFromSglFile: Couldn't seek to end of file %s.",sgl_filename.c_str()); + } + + + // go to the beginning and read the singles header + singles_file.seekg(0, ios::beg); + + if (!singles_file) { + error("\nSinglesRatesFromSglFile: Couldn't seek to start of file %s.",sgl_filename.c_str()); + } + + + { + char buffer[sizeof(Main_header)]; + singles_file.read(buffer,sizeof(_singles_main_header)); + if (!singles_file) + { + error("\nSinglesRatesFromSglFile: Couldn't read main_header from %s.",sgl_filename.c_str()); + } + else + { + unmap_main_header(buffer, &_singles_main_header); + ecat::ecat7::find_scanner(scanner_sptr, _singles_main_header); + } + } + + + if (scanner_sptr->get_type() != Scanner::E966) { + warning("check SinglesRatesFromSglFile for non-966\n"); + } + + + // Get total number of bins for this type of scanner. + const int total_singles_units = scanner_sptr->get_num_singles_units(); + + // Calculate number of time slices from the length of the data (file size minus header). + _num_time_slices = + static_cast((end_stream_position - static_cast(512)) / + SIZE_OF_SINGLES_RECORD); + + // Allocate the main array. + _singles = Array<2, int>(IndexRange2D(0, _num_time_slices - 1, 0, total_singles_units - 1)); + + + singles_file.seekg(512, ios::beg); + + while (singles_file && slice < _num_time_slices) { + + // Temporary space to store file data. + sgl_str singles_str; + + + { + unsigned char buffer[SIZE_OF_SINGLES_RECORD]; + + singles_file.read(reinterpret_cast(buffer), SIZE_OF_SINGLES_RECORD); + if (!singles_file) { + + if (!singles_file.eof()) { + warning("Error reading singles file record %d. Stopped reading from this point.", + slice); + } + + break; + } + + singles_str.time = convert_4_bytes(buffer); + singles_str.num_sgl = convert_4_bytes(buffer+4); + + for (unsigned int i = 0; i < ( SIZE_OF_SINGLES_RECORD - 8)/4; ++i) { + singles_str.sgl[i] = convert_4_bytes(buffer+8+4*i); + } + } + + + if (singles_str.num_sgl != total_singles_units) { + error("Number of singles units should be %d, but is %d in singles file", + total_singles_units, singles_str.num_sgl); + } + + + + // Copy the singles values to the main array. + + // Note. The singles values are arranged num_axial sets of num_transaxial + // values. + // + // For a singles values for a unit at axial_index, transaxial_index + // the values is found at single_str.sgl[] + // singles_str.sgl[ transaxial_index + (axial_index * num_transaxial) ] + // + // The singles values are stored in the _singles array in the same order. + // For other file formats the ordering of the units may be different. + for (int singles_bin = 0; singles_bin < total_singles_units; ++singles_bin) { + _singles[slice][singles_bin] = static_cast(singles_str.sgl[singles_bin]); + } + + + // singles in the sgl file given in msec.multiply with 0.001 to convert into sec. + _times.push_back(singles_str.time*0.001); + + // Add the last two words - total prompts and total randoms. + _total_prompts.push_back(singles_str.sgl[total_singles_units]); + _total_randoms.push_back(singles_str.sgl[total_singles_units + 1]); + + // Increment the slice index. + ++slice; + + } + + assert(_times.size()!=0); + _singles_time_interval = _times[1] - _times[0]; + + if (slice != _num_time_slices) + { + error("\nSinglesRatesFromSglFile: Couldn't read all records in the .sgl file %s. Read %d of %d. Exiting\n", + sgl_filename.c_str(), slice, _num_time_slices); + //TODO resize singles to return array with new sizes + } + +#endif + + // Return number of time slices read. + return slice; + +} + + + + + +// Write SinglesRatesFromSglFile to a singles file. +std::ostream& +SinglesRatesFromSglFile::write(std::ostream& output) { + +#ifndef HAVE_LLN_MATRIX + + error("Compiled without ECAT7 support\n"); + +#else + + char header_buffer[SIZE_OF_SINGLES_RECORD]; + unsigned char buffer[SIZE_OF_SINGLES_RECORD]; + + memset(header_buffer, 0, SIZE_OF_SINGLES_RECORD); + + // Write header to buffer. + map_main_header(header_buffer, &(this->_singles_main_header)); + + // Write buffer to output. + output.write(header_buffer, SIZE_OF_SINGLES_RECORD); + + if (!output) { + error("\nSinglesRatesFromSglFile: Failed to write to output."); + return(output); + } + + + // Empty buffer. + memset(buffer, 0, SIZE_OF_SINGLES_RECORD); + + int total_singles_units = scanner_sptr->get_num_singles_units(); + unsigned long millisecs; + + // Write 512 byte blocks. One for each time slice recorded. + for(int slice = 0 ; slice < _num_time_slices ; ++slice) { + + // Write data to buffer. + millisecs = static_cast(floor(_times[slice] * 1000.0)); + + // Time and number of singles units + convert_int_to_4_bytes(millisecs, buffer); + convert_int_to_4_bytes(total_singles_units, buffer + 4); + + // Singles units + // Note that the order of values in _singles is the same as that of the file. + // This may not be the case for other file formats. + for(int singles_bin = 0 ; singles_bin < total_singles_units ; ++singles_bin) { + convert_int_to_4_bytes(_singles[slice][singles_bin], buffer + ((2 + singles_bin) * 4)); + } + + // Total prompts and total trues + convert_int_to_4_bytes(_total_prompts[slice], buffer + ((2 + total_singles_units) * 4)); + convert_int_to_4_bytes(_total_randoms[slice], buffer + ((2 + total_singles_units + 1) * 4)); + + + // Write buffer to output. + output.write(reinterpret_cast(buffer), SIZE_OF_SINGLES_RECORD); + + if (!output) { + error("\nSinglesRatesFromSglFile: Failed to write to output."); + break; + } + + } + + +#endif + + return output; +} + + + +float +SinglesRatesFromSglFile:: +get_singles_rate(const int singles_bin_index, + const double start_time, const double end_time) const { + + // First Calculate an inclusive range. start_time_slice is the + // the first slice with an ending time greater than start_time. + // end_time_slice is the first time slice that ends at, or after, + // end_time. + int start_slice = this->get_start_time_slice_index(start_time); + int end_slice = this->get_end_time_slice_index(end_time); + + + // Total contribution from all slices. + double total_singles; + + + if ( start_slice == end_slice ) { + // If the start and end slices are the same then just use that time slice. + total_singles = static_cast(_singles[start_slice][singles_bin_index]); + } else { + + // Start and end times for starting and ending slices. + double slice_start_time; + double slice_end_time; + double included_duration; + double old_duration; + double fraction; + + + // Total slices included (including fractional amounts) in the average. + float total_slices; + + + + // Calculate the fraction of the start_slice to include. + slice_start_time = get_slice_start(start_slice); + slice_end_time = _times[start_slice]; + + old_duration = slice_end_time - slice_start_time; + included_duration = slice_end_time - start_time; + + fraction = included_duration / old_duration; + + + // Set the total number of contributing bins to this fraction. + total_slices = fraction; + + // Set the total singles so far to be the fraction of the bin. + total_singles = fraction * _singles[start_slice][singles_bin_index]; + + + + // Calculate the fraction of the end_slice to include. + slice_start_time = get_slice_start(end_slice); + slice_end_time = _times[end_slice]; + + old_duration = slice_end_time - slice_start_time; + included_duration = end_time - slice_start_time; + + fraction = included_duration / old_duration; + + // Add this fraction to the total of the number of bins contributing. + total_slices += fraction; + + // Add the fraction of the bin to the running total. + total_singles += fraction * _singles[end_slice][singles_bin_index]; + + + // Add all intervening slices. + for(int slice = start_slice + 1; slice < end_slice ; ++slice, total_slices += 1.0) { + total_singles += _singles[slice][singles_bin_index]; + } + + + // Divide by total amount of contributing slices. + total_singles = total_singles / total_slices; + + } + + return( static_cast(total_singles) ); + +} + + + +/* + * + * Private methods. + * + */ + + + + + +void +SinglesRatesFromSglFile:: +set_time_interval() { + + // Run through the _times vector and calculate an average difference + // between the starts of consecutive time slices. + + // Min and max differences (slice durations). + double min_diff = 0; + double max_diff = 0; + double total = 0; + + for(std::vector::const_iterator t = _times.begin(); t < _times.end() - 1; ++t) { + double diff = *(t + 1) - *t; + total += diff; + + if ( min_diff == 0 || diff < min_diff ) { + min_diff = diff; + } + + if ( diff > max_diff ) { + max_diff = diff; + } + } + + _singles_time_interval = total / (_times.size() - 1); + + if ( (max_diff - min_diff) / (_singles_time_interval) > MAX_INTERVAL_DIFFERENCE ) { + // Slice durations are not consistent enough to be considered the same. + _singles_time_interval = 0; + } + +} + + +// get slice start time. +double +SinglesRatesFromSglFile:: +get_slice_start(int slice_index) const { + + if ( slice_index >= _num_time_slices ) { + slice_index = _num_time_slices - 1; + } + + if ( slice_index == 0 ) { + return(0); + } else { + return(_times[slice_index - 1]); + } +} + + + + + + +void +SinglesRatesFromSglFile:: +initialise_keymap() +{ + parser.add_start_key("Singles Rates From Sgl File"); + parser.add_key("sgl_filename", &_sgl_filename); + parser.add_stop_key("End Singles Rates From Sgl File"); +} + +bool +SinglesRatesFromSglFile:: +post_processing() +{ + read_singles_from_sgl_file(_sgl_filename); + return false; +} + + +void +SinglesRatesFromSglFile::set_defaults() +{ + _sgl_filename = ""; +} + + + + + + + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + + + diff --git a/src/data_buildblock/data_buildblock_registries.cxx b/src/data_buildblock/data_buildblock_registries.cxx new file mode 100644 index 0000000000..de4b3d2a39 --- /dev/null +++ b/src/data_buildblock/data_buildblock_registries.cxx @@ -0,0 +1,45 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup data_buildblock + + \brief File that registers all stir::RegisterObject children in data_buildblock + + \author Kris Thielemans + +*/ +#include "stir/common.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/data/SinglesRatesFromECAT7.h" +#include "stir/data/SinglesRatesFromSglFile.h" +#endif + +START_NAMESPACE_STIR +#ifdef HAVE_LLN_MATRIX +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 +static SinglesRatesFromECAT7::RegisterIt dummy100; +static SinglesRatesFromSglFile::RegisterIt dummy200; +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +#endif + +END_NAMESPACE_STIR + diff --git a/src/data_buildblock/lib.mk b/src/data_buildblock/lib.mk new file mode 100644 index 0000000000..3bd3ce8689 --- /dev/null +++ b/src/data_buildblock/lib.mk @@ -0,0 +1,18 @@ +# +# + +dir := data_buildblock +$(dir)_LIB_SOURCES:= \ + SinglesRates.cxx \ + SinglesRatesForTimeFrames.cxx + +ifeq ($(HAVE_LLN_MATRIX),1) + $(dir)_LIB_SOURCES += \ + SinglesRatesFromSglFile.cxx \ + SinglesRatesFromECAT7.cxx +endif + +$(dir)_REGISTRY_SOURCES:= data_buildblock_registries.cxx + +include $(WORKSPACE)/lib.mk + diff --git a/src/display/CMakeLists.txt b/src/display/CMakeLists.txt new file mode 100644 index 0000000000..adbfbd1a3b --- /dev/null +++ b/src/display/CMakeLists.txt @@ -0,0 +1,53 @@ +# +# + +set(dir display) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) +set(${dir}_LIB_SOURCES + display_array +) + +find_package(X11) +if(X11_FOUND) + set(default_GRAPHICS X) +else() + set(default_GRAPHICS PGM) +endif() +set(GRAPHICS ${default_GRAPHICS} + CACHE STRING "Type of graphics to use. Choose X, PGM or None") + + +#******* first find out which files we need and what compilation options + +if( "${GRAPHICS}" STREQUAL "X") + set(${dir}_LIB_SOURCES + ${${dir}_LIB_SOURCES} + gen screengen screen + ) + ADD_DEFINITIONS(-DSTIR_SIMPLE_BITMAPS -DSC_XWINDOWS) + +elseif("${GRAPHICS}" STREQUAL "PGM") + ADD_DEFINITIONS(-DSTIR_PGM) +else() +# TODO +#ifeq "$(GRAPHICS)" "MATHLINK" +# this presumably needs a Mathlink library, depends on your system though +#GRAPH_LIBS = +#GRAPHOPT = -DSTIR_MATHLINK +#$(dir)_LIB_SOURCES := mathlinkhelp.c +elseif("${GRAPHICS}" STREQUAL "None") + # nothing to be done here +else() + message(FATAL_ERROR "GRAPHICS has to be X, PGM or None") +endif() + +include(stir_lib_target) + +if( "${GRAPHICS}" STREQUAL "X") + find_package(Curses REQUIRED) + INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR} ${CURSES_INCLUDE_DIR}) + target_link_libraries(${dir} ${X11_LIBRARIES} ${CURSES_LIBRARY}) +endif() + +target_link_libraries(${dir} buildblock) diff --git a/src/display/display_array.cxx b/src/display/display_array.cxx new file mode 100644 index 0000000000..e9a224e0e8 --- /dev/null +++ b/src/display/display_array.cxx @@ -0,0 +1,585 @@ +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup display + + \brief Functions to display stir::Array objects (2d and 3d) and stir::RelatedViewgrams + + \author Kris Thielemans + \author PARAPET project + + + + \see display.h for some comments on the interface. + + Three implementations now, depending on which preprocessor symbols are defined + at compile-time: + +
          +
        • STIR_SIMPLE_BITMAPS is based on some functions KT wrote in 1991, + which work in XWindows, DOS (upto SVGA resolution, or using a PGA) and + a VAX using a Matrox card (very much similar to PGA). + It's fairly simplistic. No menus. + +
        • STIR_MATHLINK puts the imageinfo over a MathLink connection to Mathematica, + where it can be displayed anyway you like. + +
        • STIR_PGM puts all images in a single PGM file. + +
        + + if both STIR_SIMPLE_BITMAPS and STIR_MATHLINK are defined, stir::display + asks which version you want to use + +*/ +// further doxygen comments. Only enabled when running doxygen +#ifdef DOXYGEN_SKIP +// we need to define these to get doxygen to process their comments +#define STIR_SIMPLE_BITMAPS +#define STIR_MATHLINK +#define STIR_PGM +#endif +/*! \def STIR_SIMPLE_BITMAPS + \brief Preprocessor symbol that needs to be defined to enable X-windows + functionality for stir::display. + + \see display_array.cxx for some info +*/ +/*! \def STIR_MATHLINK + \brief Preprocessor symbol that needs to be defined to enable MathLink + functionality for stir::display. + + \see display_array.cxx for some info +*/ +/*! \def STIR_SIMPLE_BITMAPS + \brief Preprocessor symbol that needs to be defined to enable PGM + functionality for stir::display. + + \see display_array.cxx for some info +*/ + +#include "stir/display.h" +#include "stir/IndexRange3D.h" +#include "stir/utilities.h" +#include "stir/RelatedViewgrams.h" +#include + + +// First we define the different implementations. +// See end of file for display() itself. + +#ifdef STIR_SIMPLE_BITMAPS + +// #include "gen.h" +// gen.h defined Min (which is used in screen.h) +#define Min min +#include "screen.h" +#include + +START_NAMESPACE_STIR + +// local helper routine, defined after display() +template +static void Array2DtoSCImg ( + image_t image[], + const Array<2,elemT>& plane, + int scale, double maxi); + +/* KT + Warning: g++ 2.7.2.2 compiler bug: + when using VectorWithOffset for the scale_factors (and not the template + SCALE), g++ complains about a null character. Removing any of the other + parameters, or using int or double as the type, makes this g++ bug + disappear. Or indeed, using a template... + */ +template +void display_bitmap(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale) +{ + if (plane_stack.get_length() == 0) + return; + + Coordinate3D min_indices; + Coordinate3D max_indices; + + if (!plane_stack.get_regular_range(min_indices, max_indices)) + { + warning("display_bitmap: can only display 'regular' arrays. Returning.\n"); + return; + } + + const int length_y = max_indices[2] - min_indices[2] + 1; + const int length_x = max_indices[3] - min_indices[3] + 1; + + // KT 30/05/2002 open a window here first, such that SC_X_MAX is set to actual window size + SC_START_BIG(); // KT 30/05/2002 select bigger window size + // window dimensions + const int min_x = 0; + const int min_y = 0; + const int max_x = SC_X_MAX - 40; + const int max_y = SC_Y_MAX; + + // first try to get all images in one window + int num_in_window = plane_stack.get_length(); + + screen_image_t *sc_image = new screen_image_t[num_in_window]; + num_in_window = center_sc_images(&scale,min_x,max_x,min_y,max_y, + length_x, + length_y, + sc_image,num_in_window); + if (num_in_window == 0) + { + SC_STOP(); + return; + } + + int nr=plane_stack.get_min_index(); + int i; + while (nr<=plane_stack.get_max_index()) + { + if (nr!=plane_stack.get_min_index()) + SC_START_BIG(); // KT 30/05/2002 select bigger window size + SC_MASK(SC_M_ALL); + SC_CLEAR_BLOCK((SC_C_BACKGROUND+ SC_C_MAX)/3,0,(int)SC_X_MAX ,0,(int)SC_Y_MAX ); + SC_SCALE(SC_X_MAX-30,30, 20, SC_Y_MAX - 60); + // output title, making some attempt to centre it + if (title != 0) + put_textstr(SC_X_MAX/2 - strlen(title)*4, 35, title); + + const long image_sizeX = scale*(length_x-1)+1; + const long image_sizeY = scale*(length_y-1)+1; + + for(i=0; i=0; i--) + { + //delete[] (sc_image[i].image); now deleted by XDestroyImage + delete[] (sc_image[i].text); + } + if (plane_stack.get_max_index()>nr) + if( !ask("Continue display?",true) ) + break; /* out of while */ + } + delete[] sc_image; +} + + +// local functions + +template +static void Array2DtoSCImg ( + image_t image[], + const Array<2,elemT>& plane, + int scale, double maxi) +{ + image_t *pimage; + register image_t *pix; + register int y_count,x_count,i; + + // length x,y of original image + const int org_length_y = plane.get_length(); + const int org_length_x = plane[plane.get_min_index()].get_length(); + // length_x,y sizes of constructed image + const int length_x = scale*(org_length_x-1)+1; + // const int length_y = scale*(org_length_y-1)+1; + + /* pix : address in image of current pixel */ + + pimage = image; + for (y_count=plane.get_min_index(); y_count<=plane.get_max_index(); y_count++, pimage+=length_x*scale) + for (x_count=plane[y_count].get_min_index(), pix=pimage; x_count<=plane[y_count].get_max_index(); x_count++, pix+=scale) + { + const elemT current = plane[y_count][x_count]; + if (current<=0) + *pix = (SC_pixel_t)SC_C_BACKGROUND; + else if ((double)current>=maxi) + *pix = (SC_pixel_t)SC_C_MAX; + else + *pix = (SC_pixel_t)(SC_C_BACKGROUND + + (current * long(SC_C_MAX-SC_C_BACKGROUND)) / maxi); + } + if (scale==1) return; + + /* interpolate horizontal lines */ + pimage = image; + for (y_count=org_length_y; y_count>0; y_count--, pimage+=length_x*scale) + for (x_count=org_length_x-1,pix=pimage; x_count>0; x_count--,pix+=scale) + { +/* Original, slow but good and easy + float tmp; + + tmp=((float)*(pix+scale) - *pix)/scale ; + for (i=1; i the rounding factor .5 becomes 0x80) + Note: the (int) conversion in the tmp=.... line shouldn't be necessary, + but MsC 5.1 wrongly assumes unsigned long's + when SC_pixel_t is unsigned. +*/ + long tmp, init; + + tmp = (((long)*(pix+scale) - (int)*pix) * 0x100) / scale ; + for (i=1, init=*pix * 0x100L + 0x80; i0; y_count--, pimage += length_x*scale) + for (x_count=length_x, pix=pimage; x_count>0; x_count--,pix++) + { +/* Original + float tmp; + + tmp=((float)*(pix + length_x*scale) - *pix)/scale ; + for (i=1; i +void display_mathlink(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale) +{ + if (plane_stack.get_length() == 0) + return; + + init_and_connectlink( "PARAPET"); + fprintf( stderr, "Writing data to MathLink\n"); + MLPutFunction( lp, "List", plane_stack.get_length()); + if( MLError( lp)) + fprintf( stderr, "Error detected by MathLink: %s.\n", + MLErrorMessage(lp)); + int z = scale_factors.get_min_index(); + for (Array<3,elemT>::const_iterator iter1=plane_stack.begin(); + iter1!=plane_stack.end(); + iter1++, z++) + { + MLPutFunction( lp, "List", iter1->get_length()); + for (Array<2,elemT>::const_iterator iter2=iter1->begin(); iter2!=iter1->end(); iter2++) + { + double *tmp = new double[iter2->get_length()]; + int i = 0; + for (Array<1,elemT>::const_iterator iter3=iter2->begin(); iter3!=iter2->end(); iter3++) + tmp[i++] = static_cast(*iter3)*scale_factors[z]; + MLPutRealList(lp,tmp, static_cast(iter2->get_length())); + delete [] tmp; + } + } + + if( MLError( lp)) + fprintf( stderr, "Error detected by MathLink: %s.\n", + MLErrorMessage(lp)); + MLEndPacket( lp); + MLFlush( lp); + if( MLError( lp)) + fprintf( stderr, "Error detected by MathLink: %s.\n", + MLErrorMessage(lp)); + + /*MLPutFunction( lp, "Exit", 0);*/ +} + +END_NAMESPACE_STIR + +#endif // STIR_MATHLINK + +#ifdef STIR_PGM + +#include + +START_NAMESPACE_STIR + + +/* TODO, this ignores all arguments for the moment, except plane_stack and scale_factors */ +template +void +display_pgm (const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale) +{ + if (plane_stack.get_length() == 0) + return; + + Coordinate3D min_indices; + Coordinate3D max_indices; + + if (!plane_stack.get_regular_range(min_indices, max_indices)) + { + warning("display_pgm: can only display 'regular' arrays. Returning.\n"); + return; + } + + char name[max_filename_length]; + ask_filename_with_extension(name, "Name for PGM file", ".pgm"); + + FILE *pgm = fopen ( name , "wb"); + if (pgm == NULL) + { + warning("Error opening file %s for output to PGM.",name); + return; + } + + { + int X = max_indices[3] - min_indices[3] + 1; + // for Y take into account we add 1 white line below every image + int Y = (max_indices[2] - min_indices[2] + 2)*plane_stack.get_length(); + fprintf ( pgm, "P5\n#created by PARAPET display \n%d %d\n255\n", X , Y); + } + + double scaled_max; + { + int z = min_indices[1]; + scaled_max = + static_cast(plane_stack[z].find_max() * scale_factors[z]); + for ( z++; z <= max_indices[1]; z++) + { + const double scaled_plane_max = + static_cast(plane_stack[z].find_max() * scale_factors[z]); + if (scaled_max < scaled_plane_max) + scaled_max = scaled_plane_max; + } + } + + std::cerr << "Scaled maximum in image = " << scaled_max << std::endl; + + for ( int z = min_indices[1]; z <= max_indices[1]; z++) + { + for ( int y = min_indices[2]; y <= max_indices[2]; y++) + { + for ( int x = min_indices[3]; x <= max_indices[3]; x++) + { + double val = plane_stack[z][y][x]* scale_factors[z]*254. /scaled_max; + int u = static_cast(val+.5); + fprintf ( pgm, "%c", u<0 ? 0 : u ); + } + } + // now draw white line below this image + for ( int x = min_indices[3]; x <= max_indices[3]; x++) + { + fprintf ( pgm, "%c", 255 ); + } + } + fclose ( pgm); + std::cerr<< "Wrote PGM plane_stack to file " << name << std::endl; +} + +END_NAMESPACE_STIR + +#endif // STIR_PGM + + +START_NAMESPACE_STIR + +template +void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, + const char * const title, + int scale) +{ + if (plane_stack.get_length() == 0) + return; + + assert(plane_stack.get_min_index() == scale_factors.get_min_index()); + assert(plane_stack.get_max_index() == scale_factors.get_max_index()); + assert(plane_stack.get_min_index() == text.get_min_index()); + assert(plane_stack.get_max_index() == text.get_max_index()); + + std::cerr << "Displaying " << (title==0 ? "" : title) << std::endl; +#if defined(STIR_PGM) + display_pgm(plane_stack, scale_factors, + text, maxi, title, scale); +#endif + +#if defined(STIR_SIMPLE_BITMAPS) && defined(STIR_MATHLINK) + if (ask_num("Display as bitmap (0) or via MathLink (1)",0,1,0) == 0) + display_bitmap(plane_stack, scale_factors, + text, maxi, title, scale); + else + display_mathlink(plane_stack, scale_factors, + text, maxi, title, scale); +#endif +#if defined(STIR_SIMPLE_BITMAPS) && !defined(STIR_MATHLINK) + display_bitmap(plane_stack, scale_factors, + text, maxi, title, scale); +#endif +#if !defined(STIR_SIMPLE_BITMAPS) && defined(STIR_MATHLINK) + display_mathlink(plane_stack, scale_factors, + text, maxi, title, scale); +#endif +} + +template +void display(const RelatedViewgrams& vs, + double maxi, + const char * const title, + int zoom) +{ + Array<3,float> + all_of_them(IndexRange3D(0,vs.get_num_viewgrams()-1, + vs.get_min_axial_pos_num(),vs.get_max_axial_pos_num(), + vs.get_min_tangential_pos_num(),vs.get_max_tangential_pos_num())); + std::copy(vs.begin(), vs.end(), all_of_them.begin()); + + VectorWithOffset text(all_of_them.get_min_index(), + all_of_them.get_max_index()); + + VectorWithOffset::iterator text_iter = text.begin(); + typename RelatedViewgrams::const_iterator vs_iter = vs.begin(); + + while(vs_iter != vs.end()) + { + *text_iter=new char[100]; + sprintf(*text_iter,"v %d, s %d", vs_iter->get_view_num(), vs_iter->get_segment_num()); + ++text_iter; + ++vs_iter; + } + + VectorWithOffset scale_factors(all_of_them.get_min_index(), + all_of_them.get_max_index()); + scale_factors.fill(1.); + + display(all_of_them, scale_factors, text,maxi, title, zoom); + + text_iter = text.begin(); + + while(text_iter != text.end()) + { + delete[] *text_iter; + ++text_iter; + } +} + + + +/*********************************************** + instantiations + ***********************************************/ +template +void display<>(const Array<3,short>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale); +template +void display<>(const Array<3,short>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale); +template +void display<>(const Array<3,float>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale); + +template +void display<>(const Array<3,short>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale); +template +void display<>(const Array<3,short>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale); +template +void display<>(const Array<3,float>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, const char * const title, int scale); + + +template +void display(const RelatedViewgrams& vs, + double maxi, + const char * const title, + int zoom); + +END_NAMESPACE_STIR diff --git a/src/display/gen.c b/src/display/gen.c new file mode 100644 index 0000000000..b49d9b70eb --- /dev/null +++ b/src/display/gen.c @@ -0,0 +1,118 @@ +/* +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + See STIR/LICENSE.txt for details +*/ +/*! +\file + + \brief Utility functions used by the screen* files (internal use only) + + \author Kris Thielemans + \author PARAPET project + + + + \see gen.h + \internal +*/ +#include "gen.h" + +#include + + +#ifdef VAX +#include ssdef +#include descrip +#include iodef +#include dcdef + +static $DESCRIPTOR(TTdevice,"TT"); +static int TTchannel; + +char getch() +{ char chr; + unsigned int iosb[2]; + + if (TTchannel==0) + error_check(sys$assign(&TTdevice,&TTchannel,0,0)); + error_check(sys$qiow(0,TTchannel,IO$_READVBLK|IO$M_ESCAPE|IO$M_NOECHO, + &iosb,0,0,&chr,sizeof(chr),0,0,0,0)); + return (chr); +} + +#endif + + +int asknr (char str[],int minv,int maxv,int def) +{ char ptr[10]; + int nnn,ret; + + while(1) + { printf ("\n%s [%d:%d D:%d]: ",str,minv,maxv,def); + if (fgets(ptr,10,stdin) == NULL) + return def; // nothing read, so return default + ret=sscanf(ptr,"%d",&nnn); + if (ret==0 || ret==EOF) + return def; + if ((nnn>=minv) && (nnn<=maxv)) + return nnn; + puts("\nOut of bounds"); + } +} +size_t fread_check(char *str, void *buffer, size_t size, FILE *infile) +{ size_t ret; + char tmp[200]; + + ret = fread(buffer,sizeof(char),size,infile); + if (ferror(infile)) + { sprintf(tmp,"\n%s: error reading for %lu bytes, %lu read\nreason", + str,(unsigned long)size,(unsigned long)ret); + perror(tmp); + error(""); + } + return(ret); +} + +size_t fwrite_check(char *str, void *buffer, size_t size, FILE *outfile) +{ size_t ret; + char tmp[200]; + + ret = fwrite(buffer,1,size,outfile); + if (ret < size || ferror(outfile)) + { sprintf(tmp,"\n%s: error writing for %lu bytes, %lu written\nreason", + str,(unsigned long)size,(unsigned long)ret); + if (ferror(outfile)) + perror(tmp); + error(""); + } + return(ret); +} + +void fseek_check(char *str, FILE *file, long int offset, int pos) +{ if (fseek(file,offset,pos)) + error("%s: error seeking in file to position %lu",str,offset); +} + + +void message(char *fmt, ...) +{ va_list ptr; + + va_start(ptr,fmt); + fprintf(stderr,"\n"); + vfprintf(stderr,fmt, ptr); + va_end(ptr); +} + +void error(char *fmt, ...) +{ va_list ptr; + + va_start(ptr,fmt); + fprintf(stderr,"\n"); + vfprintf(stderr,fmt, ptr); + fprintf(stderr,"\n"); + va_end(ptr); + exit(EXIT_FAILURE); +} diff --git a/src/display/gen.h b/src/display/gen.h new file mode 100644 index 0000000000..563f72485e --- /dev/null +++ b/src/display/gen.h @@ -0,0 +1,174 @@ +/* +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2001, IRSL + See STIR/LICENSE.txt for details +*/ +/*! + \file + + \brief Declares some utility functions used by the screen* files + + \author Kris Thielemans + \author PARAPET project + + + + + This is part of a library by Kris Thielemans, mainly written in 1991. + + \internal + + Standard include file where some incompatibilities between various + systems are taken care of (together with gen.c). + + Currently this supports: + VAX VMS + #ifdef VAX + ultrix on MIPS + Solaris on Sparc + OSF/1 on Alpha + AIX on PowerPC + #ifdef ultrix + (for historical reasons, all unix machines) + MSDOS (checking MSC, or gcc) + #ifdef MSDOS + PowerMAC (using Metroworks Codewarrior Pro) [no keyboard and +graphics yet] + this last one is a cross-compiler for PPC, 68K and Win NT on x86 +systems. + Only checked it on PPC though. + #ifdef __MSL__ (Metroworks Standard Library) + + As a convenience we include stdio.h and stdlib.h here. + + +*/ +#include + +/* Change November 1997: added next 3 lines */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef VAX +/* The VAX library does not have getch. An implemenation is provided in gen.c + getch reads a character from the keyboard without waiting for a + carriage return. You can use it for detecting arrowkeys + in combination with the KB_... macro's. +*/ +extern char getch(void); +/* Macro's for using the arrowkeys. Use in the following way: + char ch; + ch = getch(); + if (KB_DIRECTION(ch)) + { // ch is now the last character of the escape code + switch(ch) + { KB_UPARROW: ... + ... + } + } + else ... + // ch is not changed, or the second character in the escape code + Note: The following are ANSI escape sequences +*/ +#define KB_DIRECTION(c) (c==0x1b && getch()==0x5b && \ + (c=getch())>=0x41 && c<=0x44) +#define KB_UPARROW 0x41 +#define KB_DNARROW 0x42 +#define KB_RTARROW 0x43 +#define KB_LTARROW 0x44 +#endif /* VAX */ + +#if (defined(_WIN32) || defined(WIN32)) && !defined(MSDOS) +#define MSDOS +#endif + +#ifdef MSDOS + /* Change 05/02/98 */ +#ifdef __GNUC__ + /* TODO */ +#define getch() getchar() +#else +#include /* for getch */ +#define getch _getch +#endif + +/* Macro's for using the arrowkeys. For explanation see above. + Replace "escape code" with "extended charcode" +*/ +#define KB_DIRECTION(c) (c=='\0' && \ + ((c=(char)getch())==0x48 || c==0x4b ||c==0x4d || \ + c==0x50)) +#define KB_UPARROW 0x48 +#define KB_DNARROW 0x50 +#define KB_RTARROW 0x4d +#define KB_LTARROW 0x4b +#endif /* MSDOS */ + +#if !defined(VAX) && !defined(MSDOS) && !defined(__MSL__) +#include /* for getch */ + /* Change November 1997: added 7 lines + work-around a 'bug'. screen.h includes curses.h which #defines some + symbols which conflict in other C++ includes + */ + +#ifdef clear +#undef clear +#endif +#ifdef erase +#undef erase +#endif + +/* Macro's for using the arrowkeys. For explanation see above. +*/ +#define KB_DIRECTION(c) (c==0x1b && getch()==0x5b && \ + (c=getch())>=0x41 && c<=0x44) +#define KB_UPARROW 0x41 +#define KB_DNARROW 0x42 +#define KB_RTARROW 0x43 +#define KB_LTARROW 0x44 +#endif /*ultrix*/ + +#ifdef SC_XWINDOWS +#undef KB_DIRECTION +#undef KB_UPARROW +#undef KB_DNARROW +#undef KB_RTARROW +#undef KB_LTARROW +/* the next one is probably wrong */ +#define KB_DIRECTION(c) (c==0x1b && getch()==0x5b && \ + (c=getch())>=0x41 && c<=0x44) +#define KB_UPARROW XK_Up +#define KB_DNARROW XK_Down +#define KB_RTARROW XK_Right +#define KB_LTARROW XK_Left +#endif + +#include + +#ifndef Min +#define Min(x,y) ((x)<(y) ? (x) : (y)) +#endif +#ifndef Max +#define Max(x,y) ((x)>(y) ? (x) : (y)) +#endif + +/************************************************************************** + +***************************************************************************/ +extern size_t fread_check (char str[],void * buffer,size_t size,FILE *infile); +extern size_t fwrite_check (char str[],void * buffer,size_t size,FILE *outfile); +extern void fseek_check (char str[],FILE *file, long offset, int pos); + +extern int asknr (char str[],int minv,int maxv,int def); + +extern void message(char *fmt, ...); +extern void error (char *fmt, ...); + + +/* Change November 1997: added next 3 lines (end of extern "C") */ +#ifdef __cplusplus +} +#endif diff --git a/src/display/lib.mk b/src/display/lib.mk new file mode 100644 index 0000000000..9ecb056d10 --- /dev/null +++ b/src/display/lib.mk @@ -0,0 +1,47 @@ +# +# + +dir := display + +#******* first find out which files we need and what compilation options + +ifeq "$(GRAPHICS)" "X" +#** CURSES: which curses library to use when having GRAPHICS=X +ifeq ($(SYSTEM),LINUX) +CURSES=ncurses +else +ifeq ($(SYSTEM),CYGWIN) +CURSES=curses +EXTRA_CFLAGS+= -I/usr/include/ncurses +else +CURSES=curses +endif +endif +GRAPHOPT = -DSTIR_SIMPLE_BITMAPS -DSC_XWINDOWS +# last 2 directories seem to be needed for Ubuntu +GRAPH_LIBS += -l$(CURSES) -lX11 -L/usr/X11/lib -L/usr/X11R6/lib -L/etc/X11/ -L/usr/X11R6/bin + +$(dir)_LIB_SOURCES := display_array.cxx gen.c screengen.c screen.c + +else + +ifeq "$(GRAPHICS)" "PGM" +GRAPHOPT = -DSTIR_PGM +$(dir)_LIB_SOURCES := display_array.cxx +else +ifeq "$(GRAPHICS)" "MATHLINK" +# this presumably needs a Mathlink library, depends on your system though +GRAPH_LIBS = +GRAPHOPT = -DSTIR_MATHLINK +$(dir)_LIB_SOURCES := display_array.cxx mathlinkhelp.c +else +GRAPHOPT = +$(dir)_LIB_SOURCES := display_array.cxx +endif +endif +endif + +CFLAGS+=$(GRAPHOPT) +SYS_LIBS+=$(GRAPH_LIBS) + +include $(WORKSPACE)/lib.mk diff --git a/src/display/mathlinkhelp.c b/src/display/mathlinkhelp.c new file mode 100644 index 0000000000..5dcdefa4ef --- /dev/null +++ b/src/display/mathlinkhelp.c @@ -0,0 +1,126 @@ +/* +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2001, IRSL + See STIR/LICENSE.txt for details +*/ + +/*! +\file + + \brief Functions to write data to MathLink + + \author Kris Thielemans + \author PARAPET project + + + + \internal +*/ + +#ifdef STIR_MATHLINK + +#include "mathlink.h" +#include +#include + +int asknr (char str[], int minv, int maxv,int def) +{ + char ptr[10]; + int nnn,ret; + + while(1) + { printf ("\n%s [%d:%d D:%d]: ",str,minv,maxv,def); + fgets(ptr,10,stdin); + ret=sscanf(ptr,"%d",&nnn); + if (ret==0 || ret==EOF) + return def; + if ((nnn>=minv) && (nnn<=maxv)) + return nnn; + puts("\nOut of bounds"); + } +} + + +#if MACINTOSH_MATHLINK +extern int mlmactty_init( char*** argvp); +#endif + +void init_and_connectlink( char* linkname); +static void mlerror( MLINK lp); + + +MLENV ep = (MLENV)0; +MLINK lp = (MLINK)0; + + + +static void mlerror( MLINK lp) +{ + if( MLError( lp)){ + fprintf( stderr, "Error detected by MathLink: %s.\n", + MLErrorMessage(lp)); + }else{ + fprintf( stderr, "Error detected by this program.\n"); + } + exit(3); +} + + +static void deinit( void) +{ + if( ep) MLDeinitialize( ep); +} + + +static void closelink( void) +{ + if( lp) MLClose( lp); +} + + +void init_and_connectlink( char* linkname) +{ + long err; + char arguments[200]; + int num = 0; + + /* test if link is already open */ + if (lp != (MLINK)0) + return; + + num = asknr("Number to add to the linkname",0,500,0); + sprintf(arguments, "-linkconnect -linkname \"%s%d\"", linkname, num); + +/* TCP connection, slow... + num = asknr("TCP IP port to connect to",0,4000,1000); + sprintf(arguments, "-linkconnect -linkprotocol \"TCP\" -linkname \"%d@petnt1\"", num); +*/ + +#if MACINTOSH_MATHLINK + MLYieldFunctionObject yielder; + argc = mlmactty_init( &argv); +#endif + + ep = MLInitialize( (MLParametersPointer)0); + if( ep == (MLENV)0) exit(1); + atexit( deinit); + +#if MACINTOSH_MATHLINK + yielder = MLCreateYieldFunction( ep, NewMLYielderProc( MLDefaultYielder), 0); +#endif + + lp = MLOpenString( ep, arguments, &err); + if(lp == (MLINK)0) exit(2); + atexit( closelink); + +#if MACINTOSH_MATHLINK + MLSetYieldFunction( lp, yielder); +#endif + if( MLError( lp) && MLError(lp) != MLECONNECT) + mlerror(lp); +} + + +#endif /*STIR_MATHLINK */ diff --git a/src/display/screen.c b/src/display/screen.c new file mode 100644 index 0000000000..3e20819ac0 --- /dev/null +++ b/src/display/screen.c @@ -0,0 +1,714 @@ +/* +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, IRSL + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + + \brief very basic display routines for bitmaps (internal use only) + + \author Kris Thielemans + \author PARAPET project + + + + \see screen.h for a few details + + \internal + +*/ + +#include "gen.h" +#include +#include +#include "screen.h" + +#ifdef SC_XWINDOWS + +Display * SCX_display = NULL; +Window SCX_window; +GC SCX_gc; +XVisualInfo SCX_visual_info; +/* translation of linear color range SC_C_BACKGROUND...SC_C_FULL + to X colors as stored in its color map. + For Pseudocolor this is an identity mapping, but not for TrueColor + (or any of the other visual classes presumably). +*/ +unsigned long SCX_color_translation[SC_C_FULL+1]; + +static XPixmapFormatValues SCX_pixmap_format; + +static Colormap SCX_Colormap; +static unsigned int CurrentColormap; + +int SC__curPointX, SC__curPointY, SC__filled; +unsigned long SC__color; + +/* Predefined Color scales */ +#define NUMBER_SCALES 5 + +/* this gives RGB values, and the number of entries will be used for + linear interpolation between this and the next entry. + All .F values should add up to 128. + Last entry is used for the annotation color. +*/ +struct color_info { SC_pixel_t R,G,B,F;}; + +/* last entry is annotation color */ +struct color_info sm4[6]={{0,0,0,32},{0,64,94,32},{0,127,0,32}, + {127,0,0,32},{127,127,127,0},{127,127,0,0}}; + +struct color_info sm4test[6]={{0,0,0,32},{0,0,127,32},{0,127,0,32}, + {127,0,0,32},{127,127,127,0},{127,127,0,0}}; + +/* change November 1997 + .F values added only up to 126, added 2 to the second entry + */ +struct color_info sm4green[6]={{0,0,0,32},{0,0,127,64},{0,127,0,31}, + {127,0,0,1},{127,127,127,0},{127,127,0,0}}; + +/* KT 28/11/2002 adjusted first .F value to 128 */ +struct color_info bw[4]={{0,0,0,128},{127,127,127,0},{127,127,0,0}}; + +/* KT 29/01/98 added inverse greyscale */ +struct color_info inverse_bw[4]={{127,127,127,128},{0,0,0,0},{127,127,0,0}}; + +/* KT 17/07/2000 added braces for inverse_bw */ +struct +{ char name[10]; + int size; + struct color_info *p; +} all_color_scales[NUMBER_SCALES]={{"sm4",5,sm4},{"sm4test",5,sm4test}, + {"sm4green",5,sm4green},{"bw",2,bw}, + {"inverse_bw",2,inverse_bw}}; + + +/* KT 28/11/2002 heavily modified to account for TrueColor */ +int CreateColormap(Display *mydisplay, XVisualInfo my_visual_info, struct color_info *x, int size) +{ + XColor cc; + int i,j,k; + float tmp_r,tmp_g,tmp_b; +/* XWindows defines RGB values as unsigned 16-bit ints, the color scales above + assume values between 0-127, we have to convert these +*/ + const float SCX_Color_conv = 60535. / 127; + + if (my_visual_info.visual == NULL) + return 1; + + SCX_Colormap = XCreateColormap(mydisplay,DefaultRootWindow (SCX_display), + my_visual_info.visual, + AllocNone + ); + cc.flags = DoRed | DoGreen |DoBlue; + + for (i=0,k=0;ix, SCX_hint->y, + (unsigned)SCX_hint->width, (unsigned)SCX_hint->height, 5, + SCX_visual_info.depth, InputOutput, + SCX_visual_info.visual, + CWBackingStore|CWColormap|CWBorderPixel|CWBackingPixel, + &attrib); + + XSetStandardProperties (SCX_display, SCX_window, + "Display", "Display", None, 0, 0, SCX_hint); + } + + SCX_gc = XCreateGC (SCX_display, SCX_window, 0, 0); + + XMapWindow (SCX_display, SCX_window); + XSync(SCX_display, False); + + /* first set mask to everything, in case we're not in PseudoColor */ + XSetPlaneMask(SCX_display, SCX_gc, (unsigned long)-1); + SC_COLOR(SC_C_ANNOTATE); + SC_MASK(SC_M_ANNOTATE); +} + +#define SCX_hintX 800 +#define SCX_hintY 600 + +void SCX_START() +{ + XSizeHints SCX_hint; + + SCX_hint.x = 50; + SCX_hint.y = 50; + SCX_hint.width = SCX_hintX; + SCX_hint.height = SCX_hintY; + SCX_hint.flags = PPosition | PSize; + + SCX_init(&SCX_hint); +} + +void SCX_START_BIG() +{ + XSizeHints SCX_hint; + SCX_hint.x = (unsigned int) SCREEN_X_MAX/100; + SCX_hint.y = (unsigned int) SCREEN_Y_MAX/100; + SCX_hint.width = (unsigned int) SCREEN_X_MAX*9/10; + SCX_hint.height = (unsigned int) SCREEN_Y_MAX*9/10; + SCX_hint.flags = PPosition | PSize; + + SCX_init(&SCX_hint); +} + +/* Change April 1997: + changed two occurences of XLookupString(&report,...) to + XLookupString(&report.xkey,...) + It worked previously because report is a union including the correct type. +*/ +int SCX_WRITE(int *Xpos_x,int *Xpos_y,char *text) +{ /* when deleting characters, pieces of the image could disappear ?? */ + SC_MASK(SC_M_ANNOTATE); + XSelectInput (SCX_display, SCX_window, + ButtonPressMask | KeyPressMask); + while (1) + { XEvent report; + char chr[2]; + XNextEvent (SCX_display, &report); + switch (report.type) + { case ButtonPress: + if (report.xbutton.button == Button3) + { int x,y; + int stop = 0; + int nr_chr = 0; + x = *Xpos_x = report.xbutton.x ; + y = *Xpos_y = report.xbutton.y ; + while (!stop) + { XNextEvent (SCX_display, &report); + if (report.type == KeyPress) + { + XLookupString(&report.xkey, &chr[0], 1, NULL, NULL); + chr[1] = '\0'; + switch (chr[0]) + { case 13: /* CR */ + text[nr_chr+1] = '\0'; + stop = 1; + break; + case '\177': /* BS ???? change it */ + if (nr_chr ) + { chr[0] = text[--nr_chr]; + x -= SC_CHAR_SPACING; + SC_MOVE(x,y); + SC_COLOR(SC_C_BACKGROUND); + SC_TEXT(chr); + SC_COLOR(SC_C_ANNOTATE); + } + break; + case 27: /* ESC */ + while(nr_chr) + { chr[0] = text[--nr_chr]; + x -= SC_CHAR_SPACING; + SC_MOVE(x,y); + SC_COLOR(SC_C_BACKGROUND); + SC_TEXT(chr); + SC_COLOR(SC_C_ANNOTATE); + } + break; + default : + SC_MOVE(x,y); + SC_TEXT(chr); + x += SC_CHAR_SPACING; + text[nr_chr++] = chr[0]; + break; + } + } + } + } + break; + case KeyPress: + XLookupString(&report.xkey, &chr[0], 1, NULL, NULL); + if (chr[0] == 'q' || chr[0] == 'Q') + { SC_MASK(SC_M_ANNOTATE); + return (0); + } + else return(1); + break; + } + } +} + +void SCX_STOP(stop) +int stop; +{ XEvent report; + +/* KT 28/11/2002 do this only for PseudoColor visuals. For the others, it is a noop */ + if (SCX_get_class(SCX_visual_info)==PseudoColor) + { + message("To change the colormap, press mouse button 2 and\n" + "to stop the display, press a key.\n" + "Both only work while the display window is selected.\n"); + XSelectInput (SCX_display, SCX_window, KeyPressMask | ButtonPressMask); + } + else + XSelectInput (SCX_display, SCX_window, KeyPressMask); + + while (!stop) + { + XNextEvent (SCX_display, &report); + switch (report.type) + { + case KeyPress: + stop = 1; + break; + case ButtonPress: + if (report.xbutton.button != Button2) break; + CurrentColormap = (CurrentColormap+1) % NUMBER_SCALES; + + SetColormap(SCX_display, SCX_window, SCX_visual_info, + all_color_scales[CurrentColormap].p, + all_color_scales[CurrentColormap].size); + break; + + } + } + XUnmapWindow (SCX_display, SCX_window); + XFreeGC (SCX_display, SCX_gc); + XFreeColormap (SCX_display, SCX_Colormap); + XDestroyWindow (SCX_display, SCX_window); + XCloseDisplay (SCX_display); + SCX_display = NULL; +} + +unsigned SCX_X_MAX() +{ Window wdummy; +/*KT 13/10/98 use different variables to prevent conflicts*/ + int x,y; + unsigned width, height, bw, dep; + + if (SCX_display) + XGetGeometry(SCX_display, SCX_window, &wdummy, + &x, &y, &width, &height, &bw, &dep); + else + width = SCX_hintX; + return (width); +} + +unsigned SCX_Y_MAX() +{ Window wdummy; +/*KT 13/10/98 use different variables to prevent conflicts*/ + int x,y; + unsigned width, height, bw, dep; + + if (SCX_display) + XGetGeometry(SCX_display, SCX_window, &wdummy, + &x, &y, &width, &height, &bw, &dep); + else + height = SCX_hintY; + return (height); +} + +#undef SCX_hintX +#undef SCX_hintY + +/* KT 28/11/2002 heavily modified to account for TrueColor */ +void SCX_PutImg (image,x_begin,y_begin,lengthX,lengthY) +image_t *image; +int x_begin,y_begin, lengthX,lengthY; +{ + XImage * myimage; + unsigned char * local_image; + int bytes_per_line; + + if (SCX_pixmap_format.depth == 0) + return; + + bytes_per_line = + ((lengthX*SCX_pixmap_format.bits_per_pixel + + SCX_pixmap_format.scanline_pad-1 + )/SCX_pixmap_format.scanline_pad + ) * (SCX_pixmap_format.scanline_pad/8); + + if (SCX_get_class(SCX_visual_info)!=PseudoColor || bytes_per_line != lengthX ) + { + /* we'll need to copy the image somewhere else, so reserve space for it*/ + local_image =malloc(bytes_per_line*lengthY); + if (local_image==NULL) + { + message("SCX_PutImg: cannot allocate enough memory. I cannot display this bitmap\n"); + return; + } + } + else + { + local_image = (unsigned char*)image; + } + + + if (SCX_get_class(SCX_visual_info)!=PseudoColor || bytes_per_line != lengthX ) + { + int i; + + for (i=0; i< lengthX*lengthY; ++i) + { + unsigned long color; + unsigned char * current_position = + local_image + (i/lengthX)*bytes_per_line + + (i%lengthX)*(SCX_pixmap_format.bits_per_pixel/8); + assert(SCX_pixmap_format.bits_per_pixel%8 == 0 ); + assert(image[i]>=SC_C_BACKGROUND); + assert(image[i]<=SC_C_MAX); + color = SCX_color_translation[image[i]]; + + /* Now store the color in the pixmap, taking care of bits_per_pixel and byte_order. + Code adapted by KT from a very helpful example by Kip Rugger. + */ + if (SCX_pixmap_format.bits_per_pixel == 8) + ((unsigned char*)current_position)[0] = (unsigned char)color; + else if (SCX_pixmap_format.bits_per_pixel == 16) + { + if (ImageByteOrder(SCX_display)!=MSBFirst) + { + current_position[0] = color; + current_position[1] = color>>8; + } + else + { + current_position[1] = color; + current_position[0] = color>>8; + } + assert(color>>16==0); + } + else if (SCX_pixmap_format.bits_per_pixel == 24) + { + if (ImageByteOrder(SCX_display)!=MSBFirst) + { + current_position[0] = color; + current_position[1] = color>>8; + current_position[2] = color>>16; + } + else + { + current_position[2] = color; + current_position[1] = color>>8; + current_position[0] = color>>16; + } + assert(color>>24 == 0); + } + else if (SCX_pixmap_format.bits_per_pixel == 32) + { + if (ImageByteOrder(SCX_display)!=MSBFirst) + { + current_position[0] = color; + current_position[1] = color>>8; + current_position[2] = color>>16; + current_position[3] = color>>24; + } + else + { + current_position[3] = color; + current_position[2] = color>>8; + current_position[1] = color>>16; + current_position[0] = color>>24; + } + } + else + { + message("SCX_PutImg: bits_per_pixel (%d) does not match 8,16,24 nor 32\n" + "I cannot display the bitmap. Sorry\n", + SCX_pixmap_format.bits_per_pixel); + return; + } + } + free(image); + + } /* !PseudoColor */ + + myimage = XCreateImage (SCX_display, + SCX_visual_info.visual, + SCX_pixmap_format.depth, + ZPixmap, /*offset */ 0, (char *)local_image, + (unsigned)lengthX, (unsigned)lengthY, + SCX_pixmap_format.scanline_pad, bytes_per_line); + if (myimage == NULL) + { + message("XcreateImage returned 0. No bitmap displayed.\n"); + return; + } + assert(myimage->byte_order == ImageByteOrder(SCX_display)); +#if 0 + message("XImage props.:\nwidth %d\nheight %d\\n xoffset %d\nbitmap_unit %d\nbitmap_pad %d\ndepth %d\n" + "bytes_per_line %d\nbits_per_pixel %d\n" + " byte_order: %s\n", + myimage->width,myimage->height, myimage->xoffset, + myimage->bitmap_unit, myimage->bitmap_pad, myimage->depth, + myimage->bytes_per_line, myimage->bits_per_pixel, + myimage->byte_order==MSBFirst ? "MSBFirst" : "LSBFirst"); +#endif + + SC_MASK(SC_M_ALL); + XPutImage (SCX_display, SCX_window, SCX_gc, myimage, + 0, 0, x_begin, y_begin, (unsigned)lengthX, (unsigned)lengthY); + SC_MASK(SC_C_ANNOTATE); + XDestroyImage(myimage); /* Note: this deallocates local_image as well */ +} + +void SCX_SAVE_TO_FILE +(int x_begin,int y_begin,int width,int height,FILE *outfile) +{ XImage * myimage; + char *proc = "SCX_SAVE_TO_FILE"; +/* + char *dat; + + myimage = XCreateImage (SCX_display, + XDefaultVisual (SCX_display, DefaultScreen (SCX_display)), + DefaultDepthOfScreen(DefaultScreenOfDisplay(SCX_display)), + ZPixmap, 0, dat, (int) width, (int)height, 8, 0); +*/ + + myimage = XGetImage(SCX_display, SCX_window,x_begin,y_begin, + width,height, AllPlanes,ZPixmap); + fwrite_check(proc,(void *)myimage->data, + (unsigned long)sizeof(SC_pixel_t)*width*height,outfile); +} + +#endif /* SC_XWINDOWS */ + +/* change November 1997: added this function (was SCX_SCALE before) */ +/* 30/01/98 put high intensities on top of scale + 25/11/2002 try this again*/ +void SC_SCALE(pos_x,pos_y,size_x,size_y) +int pos_x, pos_y, size_x, size_y; +{ + unsigned char par; + float pos_inc; + float pos_offset; + + assert(pos_y+size_y<=SC_Y_MAX); + assert(pos_x+size_x<=SC_X_MAX); + SC_MASK(SC_M_ALL); + SC_PRMFIL(1); + SC_MOVE(pos_x,pos_y); + + /* KT 17/06/2000 condition now uses && instead of a ,*/ + /* find pos_offset and pos_inc such that y = pos_offset+par*pos_inc + varies between pos_y+size_y and pos_y for par between + SC_C_BACKGROUND and SC_C_MAX */ + pos_inc = -((float)size_y) / (SC_C_MAX-SC_C_BACKGROUND+1); + pos_offset = pos_y+size_y - pos_inc*SC_C_BACKGROUND; + for(par=SC_C_BACKGROUND; + par<=SC_C_MAX; + par++) + { SC_COLOR(par); + SC_RECT(pos_x+size_x,(int)(pos_offset+pos_inc*par+.5)); + } + SC_PRMFIL(0); + SC_MASK(SC_C_ANNOTATE); + /* change November 1997: added rectangle around the color scale */ + SC_COLOR(SC_C_ANNOTATE); + SC_MOVE(pos_x, pos_y); + SC_RECT(pos_x+size_x, pos_y+size_y); +} diff --git a/src/display/screen.h b/src/display/screen.h new file mode 100644 index 0000000000..2791ca7e84 --- /dev/null +++ b/src/display/screen.h @@ -0,0 +1,215 @@ +/*! + \file + + \brief very basic display routines for bitmaps (internal use only) + + \author Kris Thielemans + \author PARAPET project + + + This is part of a library by Kris Thielemans, mainly written in 1991. + It provides macros (and a few functions) for displaying stuff on a screen. + The files only contain the macros for XWindows. + It's fairly simplistic. No menus. Just simple display of bitmaps, + lines, points, text strings. + + \internal + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, IRSL + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +/* Change November 1997: added next 3 lines */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __STDC__ +#define ANSI +#endif + + +#ifndef SC_pixel_t +#define SC_pixel_t unsigned char + +/* Change 13/02/98 */ +#ifndef MSDOS16BIT +typedef SC_pixel_t image_t; +#else +typedef SC_pixel_t huge image_t; +#endif +#endif /* SC_pixel_t */ + + +#ifdef SC_XWINDOWS +#include +#include +#include + +#define SC_C_BACKGROUND 12 +#define SC_C_MAX 127 /* maximum color to be used */ +#define SC_C_FULL 255 /* maximum color available */ + +extern Display * SCX_display; +extern Window SCX_window; +extern GC SCX_gc; + /* KT 28/11/2002 added for TrueColor support */ +extern XVisualInfo SCX_visual_info; +extern unsigned long SCX_color_translation[SC_C_FULL+1]; + +extern int SC__curPointX, SC__curPointY, SC__filled; +extern unsigned long SC__color; +extern unsigned SCX_X_MAX(void), SCX_Y_MAX(void); + +/* define macro to access XVisualInfo.class. + This is renamed by X to c_class when compiling C++ programs. +*/ +#if defined(__cplusplus) || defined(c_plusplus) +#define SCX_get_class(vinfo) vinfo.c_class +#else +#define SCX_get_class(vinfo) vinfo.class +#endif + +extern void SCX_START(void); +/* KT 01/03/2000 added next declaration */ +extern void SCX_START_BIG(void); +extern void SCX_STOP(int stop); +extern int SCX_WRITE(int *x,int *y,char *text); +extern void SCX_PutImg (image_t *, int x_begin, int y_begin, + int lengthX, int lengthY); + +#define SCREEN_X_MAX 1024 /* VR299 max ??*/ +#define SCREEN_Y_MAX 864 /* VR299 max */ +#define SC_START() SCX_START() +#define SC_START_BIG() SCX_START_BIG() +#define SC_STOP() SCX_STOP(0) +#define SC_STOP_CLEAR() SCX_STOP(1) +#define SC_FLUSH() XSync(SCX_display, False) +#define SC_X_MAX SCX_X_MAX() +#define SC_Y_MAX SCX_Y_MAX() +#define SC_CHAR_WIDTH 10 +#define SC_CHAR_HEIGHT 10 +#define SC_CHAR_SPACING 7 +#define SC_PutImg(image,x,y,lx,ly) \ + SCX_PutImg(image,x,y,lx,ly) +#define SC_TJUST(hor,ver) +#define SC_TSTYLE(par) +#define SC_PRMFIL(par) SC__filled = par +#define SC_COLOR(par) XSetForeground(SCX_display, SCX_gc,\ + SC__color = (unsigned long)SCX_color_translation[par]) +#define SC_TSIZE(par) +#define SC_POINT() XDrawPoint(SCX_display,SCX_window,SCX_gc,\ + SC__curPointX, SC__curPointY) +#define SC_MOVE(x,y) { SC__curPointX = (int)(x); SC__curPointY = (int)(y);} +#define SC_DRAW(x,y) { XDrawLine(SCX_display,SCX_window,SCX_gc,\ + SC__curPointX, SC__curPointY, (int)(x),(int)(y));\ + SC_MOVE(x,y);\ + } +#define SC_LINE(x1,y1,x2,y2)\ + { XDrawLine(SCX_display,SCX_window,SCX_gc,\ + (int)(x1), (int)(y1),\ + SC__curPointX=(int)(x2),\ + SC__curPointY=(int)(y2));\ + } +#define SC_RECT(x,y) ( SC__filled ? \ + XFillRectangle(SCX_display, SCX_window, SCX_gc,\ + (int)Min(x,SC__curPointX), (int)Min(y,SC__curPointY),\ + (unsigned int)abs(x-SC__curPointX), (unsigned int)abs(y-SC__curPointY))\ + : XDrawRectangle(SCX_display, SCX_window, SCX_gc,\ + (int)Min(x,SC__curPointX), (int)Min(y,SC__curPointY),\ + (unsigned int)abs(x-SC__curPointX), (unsigned int)abs(y-SC__curPointY))\ + ) +#define SC_RECTR(x,y) ( SC__filled ? \ + XFillRectangle(SCX_display, SCX_window, SCX_gc,\ + (x<0 ? SC__curPointX + x : SC__curPointX),\ + (y<0 ? SC__curPointY + y : SC__curPointY),\ + abs(x), abs(y))\ + : XDrawRectangle(SCX_display, SCX_window, SCX_gc,\ + (x<0 ? SC__curPointX + x : SC__curPointX),\ + (y<0 ? SC__curPointY + y : SC__curPointY),\ + abs(x), abs(y))\ + ) +#define SC_ELLIPSE(x,y) ( SC__filled ? \ + XFillArc(SCX_display, SCX_window,SCX_gc, \ + SC__curPointX-x,SC__curPointY-y,\ + 2*x, 2*y, 0, 360*64)\ + : XDrawArc(SCX_display, SCX_window,SCX_gc, \ + SC__curPointX-x,SC__curPointY-y,\ + 2*x, 2*y, 0, 360*64)\ + ) +#define SC_CIRCLE(x) SC_ELLIPSE(x,x) +#define SC_TEXT(str) XDrawString(SCX_display, SCX_window,SCX_gc, \ + SC__curPointX, SC__curPointY, \ + str, (int)strlen(str)) + /* KT 28/11/2002 only enable mask when the visual is PseudoColor */ +#define SC_MASK(par) if (SCX_get_class(SCX_visual_info)==PseudoColor) \ + XSetPlaneMask(SCX_display, SCX_gc, \ + (unsigned long)par) +#define SC_LINFUN(par) XSetFunction(SCX_display, SCX_gc, par) +#define SC_LUTX(par,R,G,B) +#define SC_CLEARS(par) +#define SC_LUTINT(par) +#define SC_CLEAR_BLOCK(color,x_b,x_e,y_b,y_e) \ + XSetForeground(SCX_display, SCX_gc,\ + (unsigned long)SCX_color_translation[color]); \ + XFillRectangle(SCX_display, SCX_window, SCX_gc, \ + Min((x_b),(x_e)), Min((y_b),(y_e)),\ + abs((x_b)-(x_e)), abs((y_b)-(y_e))); \ + XSetForeground(SCX_display, SCX_gc,\ + (unsigned long)SC__color); +#define SC_LF_REPLACE GXcopy +#define SC_LF_XOR GXxor +#define SC_DEPTH SCX_visual_info.depth +#define SC_C_ANNOTATE (SC_C_MAX+1) +/* two definitions for masking availability */ +/* Note: On X-windows, masking works only properly for a PseudoColor visual + (i.e. 8-bit color with adjustable colormap) +*/ + /* KT 28/11/2002 changed value for TrueColor support */ +#define SC_M_ALL ((unsigned long)-1L) +#define SC_M_ANNOTATE (SC_C_MAX+1) + +#endif /* SC_XWINDOWS */ + + +/* change November 1997: added this function (was SCX_SCALE before) */ +extern void SC_SCALE(int pos_x, int pos_y, int size_x,int size_y); + +typedef struct screen_image + { image_t *image; + int sx,sy; + char *text; + } screen_image_t; +/***************************************************************************** + routines found in screengen.c +*****************************************************************************/ +/* KT 01/03/2000 added const */ +extern void put_textstr (int x, int y, const char * str); +extern int center_sc_images(int *Pscale, + int min_x,int max_x,int min_y,int max_y, + int SIZE_X,int SIZE_Y, + screen_image_t sc_image[], int nr_sc); +extern void draw_sc_images(int size_x, int size_y, + screen_image_t sc_image[], int no); + + +/* Change November 1997: added next 3 lines: end of extern "C" */ +#ifdef __cplusplus +} +#endif diff --git a/src/display/screengen.c b/src/display/screengen.c new file mode 100644 index 0000000000..489bb9645a --- /dev/null +++ b/src/display/screengen.c @@ -0,0 +1,131 @@ +/*! + \file + + \brief very basic display routines + + \author Kris Thielemans (with help from Claire Labbe) + \author PARAPET project + + + + Implementations common to all SC_x types + + \see screen.h + + \internal + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2001, IRSL + See STIR/LICENSE.txt for details +*/ +#include "gen.h" +#include +#define SCreen_compiling +#include "screen.h" + + +void put_textstr (int x, int y, const char str[]) +{ + int xx,yy; + + SC_MASK(SC_M_ANNOTATE); + SC_COLOR(SC_C_ANNOTATE); + SC_TJUST(2,1); + xx = x; + yy = y - 15; + SC_MOVE(xx,yy); + SC_TEXT(str); + SC_TJUST(1,1); + SC_MASK(SC_M_ALL); +} + +/* TODO (?) scale should be obeyed if possible, now the smallest scale is used */ +int center_sc_images(int *Pscale, + int min_x,int max_x,int min_y,int max_y, + int SIZE_X,int SIZE_Y, + screen_image_t sc_image[], int nr_sc) +{ int inc_x,inc_y,start_x,start_y; + int nr_x,nr_y,LENGTH_X,LENGTH_Y; + int nr,i,j,x,y,scale; + + /* how many times can we enlarge the images ? */ + LENGTH_X = max_x-min_x; /* size in pixels of the region */ + LENGTH_Y = max_y-min_y; + + /* KT&CL 3/12/97 changed the test if 1 image fits in the window */ + if (LENGTH_X < SIZE_X || LENGTH_Y < SIZE_Y+15) + { message("\nEven one image of this size doesn't fit in the window"); + return(0); + } + + /* Now we find the maximum scale of the images */ + scale = 1; + do + { + /* we compute the number of images of this scale that fit in the + allowed region. Place for text under the images is reserved */ + scale++; + nr_x = LENGTH_X / (scale*(SIZE_X-1) + 1); + nr_y = LENGTH_Y / (scale*(SIZE_Y-1) + 1+15); + } while (nr_x*nr_y >= nr_sc); + scale--; /* one too far */ + + nr_x = LENGTH_X / (scale*(SIZE_X-1) + 1); + nr_y = LENGTH_Y / (scale*(SIZE_Y-1) + 1+15); + /* we want to center the images in the region + eg: we have now computed that a maximum of 4x3 images fits + but we have only 7 images ... */ + /* KT 11/12/97 added first if to check if all images fit or not, and the else + case to change nr_sc */ + if (nr_x*nr_y > nr_sc) + { + if (nr_y==1) nr_x=nr_sc; + else + { + nr_y = nr_sc / nr_x; + if (nr_x*nr_y < nr_sc) nr_y++; + } + } + else + { + nr_sc = nr_x*nr_y; + } + + if (*Pscale!=0 && scale>*Pscale) + scale = *Pscale; + *Pscale = scale; + + LENGTH_X = scale*(SIZE_X-1)+1; + LENGTH_Y = scale*(SIZE_Y-1)+1; + start_x = (min_x + max_x - nr_x*LENGTH_X)/2; + start_y = (min_y + max_y - nr_y*(LENGTH_Y+15))/2; + if (start_y<15) + start_y = 15; + inc_x = (max_x-start_x) / nr_x; + inc_y = (max_y-start_y) / nr_y; + start_y += inc_y*(nr_y-1); /* begin on top of screen */ + + for(nr=0, i=0, y=start_y; i +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + + +#ifndef STIR_NO_NAMESPACES +using std::endl; +using std::ends; +#endif + +START_NAMESPACE_STIR + +void ROIValues::init() +{ + + NumericInfo float_limits; + + roi_volume = 0; + integral = 0; + integral_of_square = 0; + min_value = float_limits.max_value(); + max_value = float_limits.min_value(); + + mean_value = 0; + variance_value = 0; + std_value = 0; +} + +void ROIValues::update() +{ + if(roi_volume==0) + { + // ill_defined case... + mean_value = 0; + variance_value = 0; + std_value = 0; + } + else + { + mean_value = integral/roi_volume; + const float square_mean = square(mean_value); + + variance_value = (integral_of_square/roi_volume - square_mean); + if (fabs(variance_value) < 10E-5 * square_mean) + variance_value = 0; + std_value = sqrt(variance_value); + } +} + +string ROIValues::report() const +{ +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[3000]; + ostrstream s(str, 3000); +#else + std::ostringstream s; +#endif + s << " Volume of ROI = " << roi_volume << endl; + s << " Integral of density = " << integral << endl; + s << " Integral of square density = " << integral_of_square << endl; + s << " Min value = " << min_value << endl; + s << " Max value = " << max_value << endl; + s << " Mean = " << mean_value << endl; + s << " Variance = " << variance_value << endl; + s << " Std = " << std_value << endl; + s << ends; + return s.str(); +} + +#if 0 +ostream &operator ( ostream &stream, ROIValues val) +{ + +//stream << " Volume of ROI:"; +//stream << val.roi_volume< +#include // but also for old compilers + + +START_NAMESPACE_STIR + +void +compute_ROI_values_per_plane(VectorWithOffset& values, + const DiscretisedDensity<3,float>& density, + const Shape3D& shape, + const CartesianCoordinate3D& num_samples) +{ + const VoxelsOnCartesianGrid& image = + dynamic_cast&>(density); + + const int min_z = image.get_min_index(); + const int max_z = image.get_max_index(); + const CartesianCoordinate3D voxel_size = image.get_voxel_size(); + const float voxel_volume = voxel_size.x() * voxel_size.y() * voxel_size.z(); + + // initialise correct size + values = VectorWithOffset(min_z, max_z); + + shared_ptr > + discretised_shape_ptr(image.get_empty_voxels_on_cartesian_grid()); + + + shape.construct_volume(*discretised_shape_ptr, num_samples); + + for (int z=min_z; z<=max_z; z++) + { +#if 0 + const float volume = (*discretised_shape_ptr)[z].sum() * voxel_volume; + (*discretised_shape_ptr)[z] *= image[z]; + // TODO incorrect: picks up the values outside the ROI, which are 0 + const float ROI_min = (*discretised_shape_ptr)[z].find_min(); + const float ROI_max = (*discretised_shape_ptr)[z].find_max(); + const float integral = (*discretised_shape_ptr)[z].sum() * voxel_volume; + (*discretised_shape_ptr)[z] *= image[z]; + const float integral_square =(*discretised_shape_ptr)[z].sum() * voxel_volume; +#else + float ROI_min = std::numeric_limits::max(); + float ROI_max = std::numeric_limits::min(); + float integral = 0; + float integral_square = 0; + float volume = 0; + { + Array<2,float>::const_full_iterator + discr_shape_iter = (*discretised_shape_ptr)[z].begin_all_const(); + const Array<2,float>::const_full_iterator + discr_shape_end = (*discretised_shape_ptr)[z].end_all_const(); + Array<2,float>::const_full_iterator + image_iter = image[z].begin_all_const(); + for (; discr_shape_iter != discr_shape_end; ++discr_shape_iter, ++image_iter) + { + const float weight = *discr_shape_iter; + if (weight ==0) + continue; + volume += weight; + const float org_value = (*image_iter); + if (org_valueROI_max) ROI_max=org_value; + if (org_value==0) + continue; + const float value = weight * (*image_iter); + integral += value; + integral_square += value * (*image_iter); + } + integral *= voxel_volume; + integral_square *= voxel_volume; + volume *= voxel_volume; + } +#endif + values[z] = + ROIValues(volume, integral, integral_square, + ROI_min, ROI_max); + } + +} + +ROIValues +compute_total_ROI_values(const VectorWithOffset& values) +{ + // can't use std::accumulate, or we have to define ROIValues::operator+ + ROIValues tmp; + for(VectorWithOffset::const_iterator iter = values.begin(); + iter != values.end(); + iter++) + tmp += *iter; + return tmp; +} + +ROIValues +compute_total_ROI_values(const DiscretisedDensity<3,float>& image, + const Shape3D& shape, + const CartesianCoordinate3D& num_samples + ) +{ + VectorWithOffset values; + compute_ROI_values_per_plane(values, image, shape, num_samples); + return + compute_total_ROI_values(values); +} + + + + +// Function that calculate the totals over a certain plane-range + +/* TODO this function isn't used at present, but it's almost the same as + compare_ROI_values_per_plane(), so rewrite the latter in terms of this one + (after updating it) +*/ + +void +compute_plane_range_ROI_values_per_plane(VectorWithOffset& values, + const DiscretisedDensity<3,float>& density, + const CartesianCoordinate2D& plane_range, + const Shape3D& shape, + const CartesianCoordinate3D& num_samples) +{ + const VoxelsOnCartesianGrid& image = + dynamic_cast&>(density); + + const int min_z = image.get_min_index(); + const int max_z = image.get_max_index(); + // new range as entered, e.g end planes ignored + + int min_z_new = plane_range.x() - min_z; + int max_z_new = max_z - plane_range.y(); + + const CartesianCoordinate3D voxel_size = image.get_voxel_size(); + const float voxel_volume = voxel_size.x() * voxel_size.y() * voxel_size.z(); + + // initialise correct size + values = VectorWithOffset(min_z_new, max_z_new); + + VoxelsOnCartesianGrid discretised_shape = + (*image.get_empty_voxels_on_cartesian_grid()); + + shape.construct_volume(discretised_shape, num_samples); + + for (int z=min_z_new; z<=max_z_new; z++) + { + const float volume = discretised_shape.sum() * voxel_volume; + discretised_shape[z] *= image[z]; + const float ROI_min = discretised_shape.find_min(); + const float ROI_max = discretised_shape.find_max(); + const float integral = discretised_shape.sum() * voxel_volume; + discretised_shape[z] *= image[z]; + const float integral_square = discretised_shape.sum() * voxel_volume; + values[z] = + ROIValues(volume, integral, integral_square, + ROI_min, ROI_max); + } +} + + +float +compute_CR_hot(ROIValues& val1, ROIValues& val2) + +{ + return 1 - val1.get_mean()/val2.get_mean(); +} + +float +compute_CR_cold(ROIValues& val1, ROIValues& val2) +{ + return val1.get_mean()/val2.get_mean()- 1; +} + + +float +compute_uniformity(ROIValues& val) +{ + return val.get_stddev()/val.get_mean(); +} + +VectorWithOffset +compute_CR_hot_per_plane(VectorWithOffset& val1,VectorWithOffset& val2) +{ + + assert(val1.get_min_index()==val2.get_min_index()); + assert(val1.get_max_index()==val2.get_max_index()); + { + + VectorWithOffset temp(val1.get_min_index(), val1.get_max_index()); + for (int i =val1.get_min_index();i<=val1.get_max_index();i++) + + { + temp[i]= compute_CR_hot(val1[i],val2[i]); + } + return temp; + } +} +VectorWithOffset +compute_CR_cold_per_plane(VectorWithOffset& val1,VectorWithOffset& val2) +{ + + assert(val1.get_min_index()==val2.get_min_index()); + assert(val1.get_max_index()==val2.get_max_index()); + { + VectorWithOffset temp(val1.get_min_index(), val1.get_max_index()); + for (int i =val1.get_min_index();i<=val1.get_max_index();i++) + + { + temp[i] = compute_CR_cold(val1[i],val2[i]); + } + return temp; + } + +} +VectorWithOffset +compute_uniformity_per_plane(VectorWithOffset& val) +{ + + VectorWithOffset temp(val.get_min_index(), val.get_max_index()); + for (int i =val.get_min_index();i<=val.get_max_index();i++) + { + temp[i] = compute_uniformity(val[i]); + } + return temp; +} + + +END_NAMESPACE_STIR diff --git a/src/eval_buildblock/lib.mk b/src/eval_buildblock/lib.mk new file mode 100644 index 0000000000..e6ecd8102e --- /dev/null +++ b/src/eval_buildblock/lib.mk @@ -0,0 +1,16 @@ +# +# + +dir := eval_buildblock + +$(dir)_LIB_SOURCES = \ + compute_ROI_values.cxx \ + ROIValues.cxx + + + +#$(dir)_REGISTRY_SOURCES:= $(dir)_registries.cxx + +include $(WORKSPACE)/lib.mk + + diff --git a/src/exe.mk b/src/exe.mk new file mode 100644 index 0000000000..9cfe0002e1 --- /dev/null +++ b/src/exe.mk @@ -0,0 +1,92 @@ +# +# +# Author Kris Thielemans +# Copyright 2004- 2011 Hammersmith Imanet Ltd +# This file is part of STIR, and is distributed under the +# terms of the GNU Lesser General Public Licence (LGPL) Version 2.1. +# +# This file will/can be included by a makefile skeleton in a subdirectory +# Requirements: +# the skeleton should set the following variables +# dir must be set to the subdirectory name (relative to the location of Makefile) +# $(dir)_SOURCES must be set to a list of .cxx and/or .c files (without path) +# $(dir)_SCRIPTS must be set to a list of files (presumably shell scripts) that need +# to be installed +# Result: +# targets $(dir) clean_exes_$(dir) install_exes_$(dir), uninstall_exes_$(dir) +# and for each file in $(dir)_SOURCES there will be a (phony) target +# $(dir)/file (without extension) set to depend on $(DEST)$(dir)/file +# (see below) +# variables $(dir)_SOURCES (with $dir)/ prepended) +# $(dir)_EXES, $(dir)_EXE_FILENAMES +# +# Example for dir=SUBDIR +# +# make SUBDIR -> will compile and link all executables +# make clean_exes_SUBDIR -> will remove all generated files +# make install_exes_SUBDIR -> will install all executables +# make $(dir)/file -> will compile and link single file +# (there is no need to use the $(DEST) prefix) + +$(dir)_SOURCES:= $(addprefix $(dir)/, $($(dir)_SOURCES)) +$(dir)_EXES:= \ + $(patsubst %.cxx, $(DEST)%, $(filter %.cxx, $($(dir)_SOURCES))) \ + $(patsubst %.c, $(DEST)%, $(filter %.c, $($(dir)_SOURCES))) +$(dir)_EXES_without_DEST:= \ + $(patsubst %.cxx, %, $(filter %.cxx, $($(dir)_SOURCES))) \ + $(patsubst %.c, %, $(filter %.c, $($(dir)_SOURCES))) +$(dir)_SCRIPTS:= $(addprefix $(dir)/, $($(dir)_SCRIPTS)) + +.PHONY: $(dir) clean_exes_$(dir) install_exes_$(dir) uninstall_exes_$(dir) + +# make sure make keeps the .o files +# otherwise they will be deleted +.PRECIOUS: $(patsubst %.cxx, $(DEST)%$(O_SUFFIX), $(filter %.cxx, $($(dir)_SOURCES))) + +$(dir): $($(dir)_EXES) + +# trick (from the GNU make manual) to define a target for every file which just +# depends on $(DEST)/file. The advantage for the user is that she doesn't +# have to type $(DEST) explictly anymore + +define PROGRAM_template +$(1): $(DEST)$(1) + +.PHONY: $(1) +endef + +$(foreach prog,$($(dir)_EXES_without_DEST),$(eval $(call PROGRAM_template,$(prog)))) + + +# set up variable for clean_exes +$(dir)_EXE_FILENAMES := $(addsuffix $(EXE_SUFFIX), $($(dir)_EXES)) + + +# note: see lib.mk for explanation for the $(@:...) trick +# it really is just a way to get $(dir) at build-time +clean_exes_$(dir): + rm -f $($(@:clean_exes_%=%)_EXE_FILENAMES) + rm -f $(DEST)$(@:clean_exes_%=%)/*.[P] + rm -f $(DEST)$(@:clean_exes_%=%)/*$(O_SUFFIX) + + + +install_exes_$(dir): $(dir) + mkdir -p $(INSTALL_EXE_DIR) + if [ ! -z "$($(@:install_exes_%=%)_EXE_FILENAMES)" ]; then $(INSTALL) $($(@:install_exes_%=%)_EXE_FILENAMES) $(INSTALL_EXE_DIR); fi + if [ ! -z "$($(@:install_exes_%=%)_SCRIPTS)" ]; then $(INSTALL) $($(@:install_exes_%=%)_SCRIPTS) $(INSTALL_EXE_DIR); fi + +uninstall_exes_$(dir): + if [ ! -z "$($(@:install_exes_%=%)_EXE_FILENAMES)" ]; then $(RM) $(addprefix $(INSTALL_EXE_DIR)/, $(notdir $($(@:uninstall_exes_%=%)_EXE_FILENAMES))); fi + if [ ! -z "$($(@:install_exes_%=%)_SCRIPTS)" ]; then $(RM) $(addprefix $(INSTALL_EXE_DIR)/, $(notdir $($(@:uninstall_exes_%=%)_SCRIPTS))); fi + +install_$(dir): install_exes_$(dir) + +ifneq ($(MAKECMDGOALS:clean%=clean),clean) + -include \ + $(patsubst %.cxx, $(DEST)%.P, $(filter %.cxx, $($(dir)_SOURCES))) \ + $(patsubst %.c, $(DEST)%.P, $(filter %.c, $($(dir)_SOURCES))) +endif + +# set to some garbage such that we get an error when the next skeleton forgets to set dir +dir := dir_not_set_in_exe.mk diff --git a/src/include/Reconstruction.h b/src/include/Reconstruction.h deleted file mode 100644 index cd76054bab..0000000000 --- a/src/include/Reconstruction.h +++ /dev/null @@ -1,136 +0,0 @@ -#ifndef __RECONSTRUCTION_H__ -#define __RECONSTRUCTION_H__ - -#include "PARAPET.h" -#include "filter.h" -#include -#include "glgtime.h" -/* - reconstruction methods are also defined as classes. - use as follows: - - PROMIS recon(1,6); - PETSinogramOfVolume s; - PETImageVolume v; - - recon.reconstruct(s,v); - */ - -extern PETSinogramOfVolume& CorrectForAttenuation(PETSinogramOfVolume s, PETSinogramOfVolume a); -extern PETSegmentBySinogram& CorrectForAttenuation(PETSegmentBySinogram& s, PETSegmentBySinogram& a); - -class PETReconstruction -{ -public: - virtual string method_info() - { return ""; } - virtual string parameter_info() - { return ""; } - virtual void reconstruct(PETSinogramOfVolume, PETImageOfVolume) - = 0; - virtual void reconstruct(PETSinogramOfVolume s, - PETSinogramOfVolume a, PETImageOfVolume v) - { reconstruct(CorrectForAttenuation(s, a), v); } -}; - -class PETAnalyticReconstruction: public PETReconstruction -{ -public: - int delta_min; - int delta_max; - Filter filter; - virtual string parameter_info(); - PETAnalyticReconstruction(int min, int max, Filter f); -}; - -inline PETAnalyticReconstruction::PETAnalyticReconstruction - (int min, int max, Filter f) - : delta_min(min), delta_max(max), filter(f) -{}; - -inline string PETAnalyticReconstruction::parameter_info() -{ char str[100]; - - ostrstream s(str, 100); - - s << "delta_min " << delta_min << " delta_max" << delta_max; - return str; -} - -class PETIterativeReconstruction: public PETReconstruction -{ -public: - int max_iterations; - PETIterativeReconstruction(int max); -}; - -inline PETIterativeReconstruction::PETIterativeReconstruction - (int max) - : max_iterations(max) -{} - -class PETPROMISReconstruction : public PETAnalyticReconstruction -{ -public: - string method() - { return("PROMIS"); } - PETPROMISReconstruction(int min, int max, Filter f); - void reconstruct(PETSinogramOfVolume, PETImageOfVolume); -}; - -inline PETPROMISReconstruction::PETPROMISReconstruction(int min, int max, Filter f) - : PETAnalyticReconstruction(min, max, f) -{ -} - - -/******************* 2D reconstructions ************/ -class PETReconstruction2D -{ -public: - virtual string method_info() - { return ""; } - virtual string parameter_info() - { return ""; } - virtual void reconstruct(PETSegmentBySinogram, PETImageOfVolume) - = 0; - virtual void reconstruct(PETSegmentBySinogram s, - PETSegmentBySinogram a, PETImageOfVolume v) - { reconstruct(CorrectForAttenuation(s, a), v); } -}; - -class PETAnalyticReconstruction2D: public PETReconstruction2D -{ - Filter1D *filter; -public: - virtual string parameter_info(); - PETAnalyticReconstruction2D(Filter1D *f); -}; - -inline PETAnalyticReconstruction2D::PETAnalyticReconstruction2D - (Filter1D *f) - : filter(f) -{}; - -inline string PETAnalyticReconstruction2D::parameter_info() -{ char str[100]; - - ostrstream s(str, 100); - - //s << "delta_min " << delta_min << " delta_max" << delta_max; - return str; -} - -class Reconstruct2DFBP : public PETAnalyticReconstruction2D -{ - public: - Reconstruct2DFBP(Filter1D *f): PETAnalyticReconstruction2D(f) - {} - - // CL 27/10 Add virtual - - virtual void reconstruct(PETSegmentBySinogram segment_0, PETImageOfVolume direct_image); -}; - - -#endif diff --git a/src/include/stir/ArcCorrection.h b/src/include/stir/ArcCorrection.h new file mode 100644 index 0000000000..3d9da7bfe9 --- /dev/null +++ b/src/include/stir/ArcCorrection.h @@ -0,0 +1,171 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Declaration of class stir::ArcCorrection + + \author Kris Thielemans + + */ +#ifndef __stir_ArcCorrection_H__ +#define __stir_ArcCorrection_H__ + + +#include "stir/ProjDataInfo.h" +#include "stir/Array.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +class Succeeded; +class ProjDataInfoCylindricalArcCorr; +class ProjDataInfoCylindricalNoArcCorr; +template class Sinogram; +template class Viewgram; +template class RelatedViewgrams; +template class SegmentBySinogram; +template class SegmentByView; +class ProjData; +/*! + \ingroup projdata + \brief A class to arc-correct projection data + + Arc-correction is a common name for converting the non-uniform tangential + sampling from a cylindrical PET scanner to a uniform one. (GE terminology is + 'geometric correction'). + + This class assumes that the input projection data have already been normalised. + + For given non-arccorrected data, the data will be first multiplied by the bin-sizes, + then interpolated to the desired uniform sampling using overlap_interpolate, + and then divided by the new sampling. This ensures that the normalisation + is preserved. Also, uniform data will result in uniform output. + + \warning You have to call one of the set_up() functions + before use of any other member function. +*/ +class ArcCorrection +{ +public: + ArcCorrection(); + + //! \name set_up() functions + /*! Set-up the arc-correction object. The parameter \a proj_data_info_sptr + has to be a shared_ptr to a ProjDataInfoCylindricalNoArcCorr object. + + Different versions are available to allow using default parameters. + */ + //@{ + //! Most general version + Succeeded + set_up(const shared_ptr& proj_data_info_sptr, + const int num_arccorrected_tangential_poss, const float bin_size); + + //! Using default bin-size of the scanner + /*! If the default bin-size is 0, the tangential size of the central bin + (i.e. Bin(0,0,0,0)) of the + non-arccorrected data will be used. + */ + Succeeded + set_up(const shared_ptr& proj_data_info_sptr, + const int num_arccorrected_tangential_poss); + //! Using default bin-size of the scanner and covering the FOV + /*! If the default bin-size is 0, the tangential size of the central bin + (i.e. Bin(0,0,0,0)) of the + non-arccorrected data will be used. + + \c num_arccorrected_bins is chosen such that the new (radial) FOV + is slightly larger than the one covered by the original data. + */ + Succeeded + set_up(const shared_ptr& proj_data_info_sptr); + //@} + + /*! \name functions returning a ProjDataInfoCylindricalArcCorr + object describing to the arc-corrected data. + */ + //@{ + const ProjDataInfoCylindricalArcCorr& + get_arc_corrected_proj_data_info() const; + //! Returning a shared_ptr to the object + /*! \warning It is dangerous to change the object pointed to. Use + this function only if you are sure that this will never happen. + \todo return a shared_ptr + after switching to boost::shared_ptr. + */ + shared_ptr + get_arc_corrected_proj_data_info_sptr() const; + //@} + + /*! \name functions returning a ProjDataInfoCylindricalArcCorr + object describing to the arc-corrected data. + */ + //@{ + const ProjDataInfoCylindricalNoArcCorr& + get_not_arc_corrected_proj_data_info() const; + //! Returning a shared_ptr to the object + /*! \warning It is dangerous to change the object pointed to. Use + this function only if you are sure that this will never happen. + \todo return a shared_ptr + after switching to boost::shared_ptr. + */ + shared_ptr + get_not_arc_corrected_proj_data_info_sptr() const; + //@} + + //! \name functions to do the arc-correction + /*! Almost all these functions come in pairs (the exception being the + function that arc-corrects a whole ProjData). + The 1 argument version returns + the arc-corrected data. In the 2 argument version, the first argument + will be filled with the arc-corrected data. + \warning In the 2 argument version, the output argument has to + have a projection data info corresponding to the one returned by + get_arc_corrected_proj_data_info(). This is (only) checked + using assert(). + */ + //@{ + Sinogram do_arc_correction(const Sinogram& in) const; + void do_arc_correction(Sinogram& out, const Sinogram& in) const; + Viewgram do_arc_correction(const Viewgram& in) const; + void do_arc_correction(Viewgram& out, const Viewgram& in) const; + RelatedViewgrams do_arc_correction(const RelatedViewgrams& in) const; + void do_arc_correction(RelatedViewgrams& out, const RelatedViewgrams& in) const; + SegmentBySinogram do_arc_correction(const SegmentBySinogram& in) const; + void do_arc_correction(SegmentBySinogram& out, const SegmentBySinogram& in) const; + SegmentByView do_arc_correction(const SegmentByView& in) const; + void do_arc_correction(SegmentByView& out, const SegmentByView& in) const; + Succeeded do_arc_correction(ProjData& out, const ProjData& in) const; + //@} + +private: + shared_ptr _noarc_corr_proj_data_info_sptr; + shared_ptr _arc_corr_proj_data_info_sptr; + Array<1,float> _arccorr_coords; + Array<1,float> _noarccorr_coords; + Array<1,float> _noarccorr_bin_sizes; + float tangential_sampling; + + void do_arc_correction(Array<1,float>& out, const Array<1,float>& in) const; +}; + +END_NAMESPACE_STIR +#endif + diff --git a/src/include/stir/Array.h b/src/include/stir/Array.h new file mode 100644 index 0000000000..4bffb69cb5 --- /dev/null +++ b/src/include/stir/Array.h @@ -0,0 +1,485 @@ + +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-10-14, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_Array_H__ +#define __stir_Array_H__ + +#ifndef ARRAY_FULL +#define ARRAY_FULL +#endif + +/*! + \file + \ingroup Array + \brief defines the Array class for multi-dimensional (numeric) arrays + + \author Kris Thielemans (with help from Alexey Zverovich) + \author PARAPET project + + + Not all compilers support the full iterators, so you could disabled them by editing + the file and removing the define ARRAY_FULL. Lots of other things in the library + won't work then. +*/ +#include "stir/NumericVectorWithOffset.h" +#include "stir/ByteOrder.h" +#include "stir/IndexRange.h" + +#include + +#ifndef STIR_NO_NAMESPACES +using std::istream; +using std::ostream; +#endif + + +START_NAMESPACE_STIR +class NumericType; + +#ifdef ARRAY_FULL +#ifndef ARRAY_FULL2 +template +class FullArrayIterator; +#else +template +class FullArrayIterator; +template +class FullArrayConstIterator; +#endif + +#endif + +/*! + \ingroup Array + \brief This class defines multi-dimensional (numeric) arrays. + + This class implements multi-dimensional arrays which can have +'irregular' ranges. See IndexRange for a description of the ranges. Normal +numeric operations are defined. In addition, two types of iterators are +defined, one which iterators through the outer index, and one which +iterates through all elements of the array. + +Array inherits its numeric operators from NumericVectorWithOffset. +In particular this means that operator+= etc. potentially grow +the object. However, as grow() is a virtual function, Array::grow is +called, which initialises new elements first to 0. +*/ + +template +class Array : public NumericVectorWithOffset, elemT> +{ +#ifdef SWIG + // work-around swig problem. It gets confused when using a private (or protected) + // typedef in a definition of a public typedef/member + public: +#else + private: +#endif + typedef Array self; + typedef NumericVectorWithOffset, elemT> base_type; + +public: + //@{ + //! typedefs such that we do not need to have \c typename wherever we use these types defined in the base class + typedef typename base_type::value_type value_type; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::size_type size_type; + typedef typename base_type::iterator iterator; + typedef typename base_type::const_iterator const_iterator; + //@} +#ifdef ARRAY_FULL + /*! @name typedefs for full_iterator support + Full iterators provide a 1-dimensional view on a multi-dimensional + Array. + */ + + //@{ + typedef elemT full_value_type; + typedef full_value_type* full_pointer; + typedef const full_value_type* const_full_pointer; + typedef full_value_type& full_reference; + typedef const full_value_type& const_full_reference; +#ifndef ARRAY_FULL2 + //! This defines an iterator type that iterates through all elements. + typedef FullArrayIterator::full_iterator, elemT, full_reference, full_pointer> full_iterator; + + //! As full_iterator, but for const objects. + typedef FullArrayIterator::const_full_iterator, elemT, const_full_reference, const_full_pointer> const_full_iterator; +#else // ARRAY_FULL2 + typedef FullArrayIterator full_iterator; + + typedef FullArrayConstIterator const_full_iterator; + +#endif + //@} +#endif +public: + //! Construct an empty Array + inline Array(); + + //! Construct an Array of given range of indices, elements are initialised to 0 + inline explicit Array(const IndexRange&); + +#ifndef SWIG + //! Construct an Array from an object of its base_type + inline Array(const base_type& t); +#else + // swig 2.0.4 gets confused by base_type (due to numeric template arguments) + // therefore, we declare this constructor using the "self" type, + // i.e. it's just a copy-constructor. + // This is less powerful as in C++, but swig-generated interfaces don't need to know about the base_type anyway + inline Array(const self& t); +#endif + + //! virtual destructor, frees up any allocated memory + inline virtual ~Array(); + + /*! @name functions returning full_iterators*/ + //@{ + //! start value for iterating through all elements in the array, see full_iterator + inline full_iterator begin_all(); + //! start value for iterating through all elements in the (const) array, see full_iterator + inline const_full_iterator begin_all() const; + //! start value for iterating through all elements in the array, see full_iterator + inline const_full_iterator begin_all_const() const; + //! end value for iterating through all elements in the array, see full_iterator + inline full_iterator end_all(); + //! end value for iterating through all elements in the (const) array, see full_iterator + inline const_full_iterator end_all() const; + //! end value for iterating through all elements in the array, see full_iterator + inline const_full_iterator end_all_const() const; + //@} + + inline IndexRange get_index_range() const; + + //! return the total number of elements in this array + inline size_t size_all() const; + + /* Implementation note: grow() and resize() are inline such that they are + defined for any type you happen to use for elemT. Otherwise, we would + need instantiation in Array.cxx. + */ + //! change the array to a new range of indices, new elements are set to 0 + inline virtual void + resize(const IndexRange& range); + + //! grow the array to a new range of indices, new elements are set to 0 + virtual inline void + grow(const IndexRange& range); + + //! return sum of all elements + inline elemT sum() const ; + + //! return sum of all positive elements + inline elemT sum_positive() const ; + + //! return maximum of all the elements + inline elemT find_max() const; + + //! return minimum of all the elements + inline elemT find_min() const; + + //! Fill elements with value n (overrides VectorWithOffset::fill) + inline void fill(const elemT &n); + + //! checks if the index range is 'regular' + /*! Implementation note: this works by calling get_index_range().is_regular(). + We cannot rely on remembering if it was a regular range at construction (or + even resizing) time as resize() could have been called on an element of the + array. Checking for this would involve a performance penalty on operator[], + which is definitely not a good idea. + */ + inline bool is_regular() const; + + //! find regular range, returns \c false if the range is not regular + /*! \see class IndexRange for a definition of (ir)regular ranges */ + bool get_regular_range( + BasicCoordinate& min, + BasicCoordinate& max) const; + + //! allow array-style access, read/write + inline Array& + operator[] (int i); + + //! array access, read-only + inline const Array& + operator[] (int i) const; + + //! allow array-style access given a BasicCoordinate to specify the indices, read/write + inline elemT& + operator[](const BasicCoordinate &c) ; + + //! array access given a BasicCoordinate to specify the indices, read-only + // TODO alternative return value: elemT + inline const elemT& + operator[](const BasicCoordinate &c) const; + + //! \name indexed access with range checking (throw std:out_of_range) + //@{ + inline Array& + at (int i); + + inline const Array& + at (int i) const; + + inline elemT& + at(const BasicCoordinate &c) ; + + inline const elemT& + at(const BasicCoordinate &c) const; + //@} +}; + + + +/************************************************** + (partial) specialisation for 1 dimensional arrays + **************************************************/ + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +//! The 1-dimensional (partial) specialisation of Array. +template +class Array<1, elemT> : public NumericVectorWithOffset +#ifdef STIR_USE_BOOST + , + boost::operators, NumericVectorWithOffset >, + boost::operators >, + boost::operators, elemT> +#endif +{ +#ifdef SWIG + // work-around swig problem. It gets confused when using a private (or protected) + // typedef in a definition of a public typedef/member + public: +#else + private: +#endif + typedef NumericVectorWithOffset base_type; + typedef Array<1, elemT> self; + + +public: + //! typedefs such that we do not need to have \c typename wherever we use these types defined in the base class + //@{ + typedef typename base_type::value_type value_type; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::size_type size_type; + typedef typename base_type::iterator iterator; + typedef typename base_type::const_iterator const_iterator; + //@} + + /*! \brief Iterator type for going through all elements + + for 1D arrays, full iterators are equal to normal iterators + */ + typedef iterator full_iterator; + + //! Iterator type for going through all elements of a const object + typedef const_iterator const_full_iterator; + +public: + + //! default constructor: array of length 0 + inline Array(); + + //! constructor given an IndexRange<1>, initialising elements to 0 + inline explicit Array(const IndexRange<1>& range); + + //! constructor given first and last indices, initialising elements to 0 + inline Array(const int min_index, const int max_index); + + //! constructor from basetype + inline Array(const NumericVectorWithOffset &il); + + //! virtual destructor + inline virtual ~Array(); + + /*! @name functions returning full_iterators*/ + //@{ + //! start value for iterating through all elements in the array, see full_iterator + inline full_iterator begin_all(); + //! start value for iterating through all elements in the (const) array, see full_iterator + inline const_full_iterator begin_all() const; + //! start value for iterating through all elements in the array, see full_iterator + inline const_full_iterator begin_all_const() const; + //! end value for iterating through all elements in the array, see full_iterator + inline full_iterator end_all(); + //! end value for iterating through all elements in the (const) array, see full_iterator + inline const_full_iterator end_all() const; + //! end value for iterating through all elements in the array, see full_iterator + inline const_full_iterator end_all_const() const; + //@} + + //! return the range of indices used + inline IndexRange<1> get_index_range() const; + + //! return the total number of elements in this array + inline size_t size_all() const; + + //! Array::grow initialises new elements to 0 + inline virtual void grow(const IndexRange<1>& range); + + // Array::grow initialises new elements to 0 + inline virtual void grow(const int min_index, const int max_index); + + //! Array::resize initialises new elements to 0 + inline virtual void resize(const IndexRange<1>& range); + + // Array::resize initialises new elements to 0 + inline virtual void resize(const int min_index, const int max_index); + + //! return sum of all elements + inline elemT sum() const; + + //! add up all positive elemTs in the vector + inline elemT sum_positive() const; + + //! return maximum value of all elements + inline elemT find_max() const; + + //! return minimum value of all elements + inline elemT find_min() const; + + //! checks if the index range is 'regular' (always \c true as this is the 1D case) + inline bool is_regular() const; + + //! find regular range, returns \c false if the range is not regular + bool get_regular_range( + BasicCoordinate<1, int>& min, + BasicCoordinate<1, int>& max) const; + +#ifndef STIR_USE_BOOST + + /* KT 31/01/2000 I had to add these functions here, although they are + in NumericVectorWithOffset already. + Reason: we allow addition (and similar operations) of tensors of + different sizes. This implies that operator+= can call a 'grow' + on retval. For this to work, retval should be an Array, not + its base_type (which happens if these function are not repeated + in this class). + Complicated... + */ + //! elem by elem addition + inline self operator+ (const base_type &iv) const; + + //! elem by elem subtraction + inline self operator- (const base_type &iv) const; + + //! elem by elem multiplication + inline self operator* (const base_type &iv) const; + + //! elem by elem division + inline self operator/ (const base_type &iv) const; + + //! addition with an 'elemT' + inline self operator+ (const elemT a) const; + + //! subtraction with an 'elemT' + inline self operator- (const elemT a) const; + + //! multiplication with an 'elemT' + inline self operator* (const elemT a) const; + + //! division with an 'elemT' + inline self operator/ (const elemT a) const; + +#endif // boost + + //! allow array-style access, read/write + inline elemT& operator[] (int i); + + //! array access, read-only + inline const elemT& operator[] (int i) const; + + //! allow array-style access giving its BasicCoordinate, read/write + inline const elemT& operator[](const BasicCoordinate<1,int>& c) const; + + //! array access giving its BasicCoordinate, read-only + inline elemT& operator[](const BasicCoordinate<1,int>& c) ; + + //! \name indexed access with range checking (throw std:out_of_range) + //@{ + inline elemT& + at (int i); + + inline const elemT& + at (int i) const; + + inline elemT& + at(const BasicCoordinate<1,int> &c) ; + + inline const elemT& + at(const BasicCoordinate<1,int> &c) const; + //@} + + +}; + + +#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +/* + If the compiler does not support partial template specialisation, + we resort to multiple definitions of the class, for specific + types of elemT. + This of course means that if you want to use Array for 'elemT' + anything else then the types used defined here, you'll have to add + similar repetitions yourself... + Currently supported for signed char, float, int, short, unsigned short + */ +#define elemT signed char +#include "stir/Array1d.h" +#define elemT short +#include "stir/Array1d.h" +#define elemT unsigned short +#include "stir/Array1d.h" +#define elemT int +#include "stir/Array1d.h" +#define elemT float +#include "stir/Array1d.h" +END_NAMESPACE_STIR +#include +START_NAMESPACE_STIR +#define __stir_Array1d_no_comparisons__ +#define elemT std::complex +#include "stir/Array1d.h" +#undef elemT +#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +END_NAMESPACE_STIR + +#ifdef ARRAY_FULL +# ifndef ARRAY_FULL2 +# include "FullArrayIterator.h" +# else +# include "FullArrayIterator2.h" +# include "FullArrayConstIterator.h" +# endif +#endif + +#include "stir/Array.inl" + + +#endif // __Array_H__ diff --git a/src/include/stir/Array.inl b/src/include/stir/Array.inl new file mode 100644 index 0000000000..5cdb4d56cf --- /dev/null +++ b/src/include/stir/Array.inl @@ -0,0 +1,705 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-01-11, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief inline implementations for the stir::Array class + + \author Kris Thielemans (with help from Alexey Zverovich) + \author PARAPET project + + +*/ +// include for min,max definitions +#include +#include "stir/assign.h" + +#ifndef STIR_NO_NAMESPACES +using std::max; +using std::min; +#endif + +START_NAMESPACE_STIR + +/********************************************** + inlines for Array + **********************************************/ + +template +void +Array:: +resize(const IndexRange& range) +{ + base_type::resize(range.get_min_index(), range.get_max_index()); + typename base_type::iterator iter = this->begin(); + typename IndexRange::const_iterator range_iter = range.begin(); + for (; + iter != this->end(); + ++iter, ++range_iter) + (*iter).resize(*range_iter); +} + +template +void +Array:: +grow(const IndexRange& range) +{ + resize(range); +} + +template +Array::Array() +: base_type() +{} + +template +Array::Array(const IndexRange& range) +: base_type() +{ + grow(range); +} + +template +#ifdef SWIG +// swig-specific work-around (see Array.h) +Array::Array(const self& t) +#else +Array::Array(const base_type& t) +#endif +: base_type(t) +{} + +template +Array::~Array() +{} + + +template +typename Array::full_iterator +Array::end_all() +{ + // note this value is fixed by the current convention in full_iterator::operator++() + return full_iterator(this->end(), this->end(), + typename Array::full_iterator(0), + typename Array::full_iterator(0)); +} + +template +typename Array::const_full_iterator +Array::end_all_const() const +{ + return const_full_iterator(this->end(), this->end(), + typename Array::const_full_iterator(0), + typename Array::const_full_iterator(0)); +} + +template +typename Array::const_full_iterator +Array::end_all() const +{ + return this->end_all_const(); +} + +template +typename Array::full_iterator +Array::begin_all() +{ + if (this->begin() == this->end()) + { + // empty array + return end_all(); + } + else + return full_iterator(this->begin(), this->end(), + this->begin()->begin_all(), this->begin()->end_all()); +} + +template +typename Array::const_full_iterator +Array::begin_all_const() const +{ + if (this->begin() == this->end()) + { + // empty array + return end_all(); + } + else + return const_full_iterator(this->begin(), this->end(), + this->begin()->begin_all_const(), this->begin()->end_all_const()); +} + +template +typename Array::const_full_iterator +Array::begin_all() const +{ + return begin_all_const(); +} + +template +IndexRange +Array::get_index_range() const +{ + VectorWithOffset > + range(this->get_min_index(), this->get_max_index()); + + typename VectorWithOffset >::iterator range_iter = + range.begin(); + const_iterator array_iter = this->begin(); + + for (; + range_iter != range.end(); + range_iter++, array_iter++) + { + *range_iter = (*array_iter).get_index_range(); + } + return IndexRange(range); +} +template +size_t +Array::size_all() const +{ + this->check_state(); + size_t acc=0; + for(int i=this->get_min_index(); i<=this->get_max_index(); i++) + acc += this->num[i].size_all(); + return acc; +} + + +template +elemT +Array::sum() const +{ + this->check_state(); + elemT acc; + assign(acc,0); + for(int i=this->get_min_index(); i<=this->get_max_index(); i++) + acc += this->num[i].sum(); + return acc; +} + +template +elemT +Array::sum_positive() const +{ + this->check_state(); + elemT acc; + assign(acc,0); + for(int i=this->get_min_index(); i<=this->get_max_index(); i++) + acc += this->num[i].sum_positive(); + return acc; +} + +template +elemT +Array::find_max() const +{ + this->check_state(); + if (this->size() > 0) + { + elemT maxval= this->num[this->get_min_index()].find_max(); + for(int i=this->get_min_index()+1; i<=this->get_max_index(); i++) + { + maxval = std::max(this->num[i].find_max(), maxval); + } + return maxval; + } + else + { + //TODO we should return elemT::minimum or something + return 0; + } +} + +template +elemT +Array::find_min() const +{ + this->check_state(); + if (this->size() > 0) + { + elemT minval= this->num[this->get_min_index()].find_min(); + for(int i=this->get_min_index()+1; i<=this->get_max_index(); i++) + { +#ifndef STIR_NO_NAMESPACES + minval = std::min(this->num[i].find_min(), minval); +#else + minval = min(this->num[i].find_min(), minval); +#endif + } + return minval; + } + else + { + //TODO we should return elemT::maximum or something + return 0; + } +} + +template +void +Array::fill(const elemT &n) +{ + this->check_state(); + for(int i=this->get_min_index(); i<=this->get_max_index(); i++) + this->num[i].fill(n); + this->check_state(); +} + +template +bool +Array::is_regular() const +{ + return get_index_range().is_regular(); +} + +//TODO terribly inefficient at the moment +template +bool +Array::get_regular_range( + BasicCoordinate& min, + BasicCoordinate& max) const +{ + const IndexRange range = get_index_range(); + return range.get_regular_range(min,max); +} + +template +Array& +Array::operator[](int i) +{ + return base_type::operator[](i); +} + +template +const Array& +Array::operator[](int i) const +{ + return base_type::operator[](i); +} +template +elemT& +Array::operator[](const BasicCoordinate &c) +{ + return (*this)[c[1]][cut_first_dimension(c)]; +} +template +const elemT& +Array::operator[](const BasicCoordinate &c) const +{ + return (*this)[c[1]][cut_first_dimension(c)] ; +} + +template +Array& +Array::at(int i) +{ + return base_type::at(i); +} + +template +const Array& +Array::at(int i) const +{ + return base_type::at(i); +} +template +elemT& +Array::at(const BasicCoordinate &c) +{ + return (*this).at(c[1]).at(cut_first_dimension(c)); +} +template +const elemT& +Array::at(const BasicCoordinate &c) const +{ + return (*this).at(c[1]).at(cut_first_dimension(c)); +} + +/********************************************** + inlines for Array<1, elemT> + **********************************************/ + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +template +void +Array<1, elemT>::resize(const int min_index, const int max_index) +{ + this->check_state(); + const int oldstart = this->get_min_index(); + const size_type oldlength = this->size(); + + base_type::resize(min_index, max_index); + if (oldlength == 0) + { + for (int i=this->get_min_index(); i<=this->get_max_index(); i++) + assign(this->num[i], 0); + } + else + { + for (int i=this->get_min_index(); iget_max_index(); ++i) + assign(this->num[i], 0); + for (int i=std::max(static_cast(oldstart + oldlength), this->get_min_index()); + i<=this->get_max_index(); + ++i) + assign(this->num[i], 0); + } + this->check_state(); +} + +template +void +Array<1, elemT>::resize(const IndexRange<1>& range) +{ + resize(range.get_min_index(), range.get_max_index()); +} + +template +void +Array<1, elemT>::grow(const int min_index, const int max_index) +{ + resize(min_index, max_index); +} + +template +void +Array<1, elemT>::grow(const IndexRange<1>& range) +{ + grow(range.get_min_index(), range.get_max_index()); +} + + +template +Array<1, elemT>::Array() +: base_type() +{ } + +template +Array<1, elemT>::Array(const IndexRange<1>& range) +: base_type() +{ + grow(range); +} + +template +Array<1, elemT>::Array(const int min_index, const int max_index) +: base_type() +{ + grow(min_index, max_index); +} + + +template +Array<1, elemT>::Array(const base_type &il) +: base_type(il) +{} + +template +Array<1, elemT>::~Array() +{} + +template +typename Array<1, elemT>::full_iterator +Array<1, elemT>::begin_all() +{ + return this->begin(); +} + +template +typename Array<1, elemT>::const_full_iterator +Array<1, elemT>::begin_all() const +{ + return this->begin(); +} + +template +typename Array<1, elemT>::full_iterator +Array<1, elemT>::end_all() +{ + return this->end(); +} + + +template +typename Array<1, elemT>::const_full_iterator +Array<1, elemT>::end_all() const +{ + return this->end(); +} + +template +typename Array<1, elemT>::const_full_iterator +Array<1, elemT>::begin_all_const() const +{ + return this->begin(); +} + +template +typename Array<1, elemT>::const_full_iterator +Array<1, elemT>::end_all_const() const +{ + return this->end(); +} + +template +IndexRange<1> +Array<1, elemT>::get_index_range() const +{ + return IndexRange<1>(this->get_min_index(), this->get_max_index()); +} + +template +size_t +Array<1, elemT>::size_all() const +{ + return this->size(); +} + +template +elemT +Array<1, elemT>::sum() const +{ + this->check_state(); + elemT acc; + assign(acc,0); + for(int i=this->get_min_index(); i<=this->get_max_index(); acc+=this->num[i++]) + {} + return acc; +}; + + +template +elemT +Array<1, elemT>::sum_positive() const +{ + this->check_state(); + elemT acc; + assign(acc,0); + for(int i=this->get_min_index(); i<=this->get_max_index(); i++) + { + if (this->num[i] > 0) + acc += this->num[i]; + } + return acc; +}; + + +template +elemT +Array<1, elemT>::find_max() const +{ + this->check_state(); + if (this->size() > 0) + { +#ifndef STIR_NO_NAMESPACES + return *std::max_element(this->begin(), this->end()); +#else + return *max_element(this->begin(), this->end()); +#endif + } + else + { + // TODO return elemT::minimum or so + return 0; + } + this->check_state(); +}; + + +template +elemT +Array<1, elemT>::find_min() const +{ + this->check_state(); + if (this->size() > 0) + { +#ifndef STIR_NO_NAMESPACES + return *std::min_element(this->begin(), this->end()); +#else + return *min_element(this->begin(), this->end()); +#endif + } + else + { + // TODO return elemT::maximum or so + return 0; + } + this->check_state(); +}; + +template +bool +Array<1, elemT>::is_regular() const +{ + return true; +} + +template +bool +Array<1, elemT>::get_regular_range( + BasicCoordinate<1, int>& min, + BasicCoordinate<1, int>& max) const +{ + const IndexRange<1> range = get_index_range(); + return range.get_regular_range(min,max); +} + +#ifndef STIR_USE_BOOST + +/* KT 31/01/2000 I had to add these functions here, although they are +in NumericVectorWithOffset already. +Reason: we allow addition (and similar operations) of tensors of +different sizes. This implies that operator+= can call a 'grow' +on retval. For this to work, retval should be a Array, not +its base_type (which happens if these function are not repeated +in this class). +Complicated... +*/ +template +Array<1, elemT> +Array<1, elemT>::operator+ (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval += iv; +}; + +template +Array<1, elemT> +Array<1, elemT>::operator- (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval -= iv; +} +template +Array<1, elemT> +Array<1, elemT>::operator* (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval *= iv; +} + +template +Array<1, elemT> +Array<1, elemT>::operator/ (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval /= iv; +} + +template +Array<1, elemT> +Array<1, elemT>::operator+ (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval += a); +}; + +template +Array<1, elemT> +Array<1, elemT>::operator- (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval -= a); +}; + +template +Array<1, elemT> +Array<1, elemT>::operator* (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval *= a); +}; + +template +Array<1, elemT> +Array<1, elemT>::operator/ (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval /= a); +}; + +#endif // boost + +template +const elemT& Array<1,elemT>:: operator[] (int i) const +{ + return base_type::operator[](i); +}; + +template +elemT& Array<1,elemT>:: operator[] (int i) +{ + return base_type::operator[](i); +}; + +template +const elemT& Array<1,elemT>:: operator[] (const BasicCoordinate<1,int>& c) const +{ + return (*this)[c[1]]; +}; + +template +elemT& Array<1,elemT>::operator[] (const BasicCoordinate<1,int>& c) +{ + return (*this)[c[1]]; +}; + +template +const elemT& Array<1,elemT>:: at (int i) const +{ + return base_type::at(i); +}; + +template +elemT& Array<1,elemT>:: at (int i) +{ + return base_type::at(i); +}; + +template +const elemT& Array<1,elemT>:: at (const BasicCoordinate<1,int>& c) const +{ + return (*this).at(c[1]); +}; + +template +elemT& Array<1,elemT>::at (const BasicCoordinate<1,int>& c) +{ + return (*this).at(c[1]); +}; + + +#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +// inline definitions are in Array1d.h + +#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +END_NAMESPACE_STIR diff --git a/src/include/stir/Array1d.h b/src/include/stir/Array1d.h new file mode 100644 index 0000000000..6931e32b3b --- /dev/null +++ b/src/include/stir/Array1d.h @@ -0,0 +1,485 @@ + +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief defines the 1D specialisation of the Array class for broken compilers + + \author Kris Thielemans (with help from Alexey Zverovich) + \author PARAPET project + + +*/ + +#if !defined(__stir_Array_H__) || !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || !defined(elemT) +#error This file should only be included in Array.h for half-broken compilers +#endif + +/* Lines here should really be identical to what you find as 1D specialisation + in Array.h and Array.inl, except that template statements are dropped. + */ +template<> +class Array<1, elemT> : public NumericVectorWithOffset +#ifdef STIR_USE_BOOST + , + boost::operators, NumericVectorWithOffset >, + boost::operators >, + boost::operators, elemT> +#endif +{ +protected: + typedef NumericVectorWithOffset base_type; + typedef Array<1, elemT> self; + + public: + //! for 1D arrays, full iterators are equal to normal iterators + typedef iterator full_iterator; + + //! for 1D arrays, full iterators are equal to normal iterators + typedef const_iterator const_full_iterator; + + +public: + + + //! default constructor: array of length 0 + inline Array(); + + //! constructor given an IndexRange<1> + inline explicit Array(const IndexRange<1>& range); + + //! constructor from basetype + inline Array(const base_type &il); + + //! constructor given first and last indices + inline Array(const int min_index, const int max_index); + + //! virtual destructor + inline virtual ~Array(); + + /*! @name functions returning full_iterators*/ + //@{ + //! start value for iterating through all elements in the array, see full_iterator + inline full_iterator begin_all(); + //! start value for iterating through all elements in the (const) array, see full_iterator + inline const_full_iterator begin_all() const; + //! start value for iterating through all elements in the array, see full_iterator + inline const_full_iterator begin_all_const() const; + //! end value for iterating through all elements in the array, see full_iterator + inline full_iterator end_all(); + //! end value for iterating through all elements in the (const) array, see full_iterator + inline const_full_iterator end_all() const; + //! end value for iterating through all elements in the array, see full_iterator + inline const_full_iterator end_all_const() const; + //@} + + //! return the range of indices used + inline IndexRange<1> get_index_range() const; + + //! return the total number of elements in this array + inline size_t size_all() const; + + //! Array::grow initialises new elements to 0 + inline virtual void grow(const IndexRange<1>& range); + + // Array::grow initialises new elements to 0 + inline virtual void grow(const int min_index, const int max_index); + + //! Array::resize initialises new elements to 0 + inline virtual void resize(const IndexRange<1>& range); + + // Array::resize initialises new elements to 0 + inline virtual void resize(const int min_index, const int max_index); + + //! return sum of all elements + inline elemT sum() const; + + //! add up all positive elemTs in the vector + inline elemT sum_positive() const; + + //! return maximum value of all elements + inline elemT find_max() const; + + //! return minimum value of all elements + inline elemT find_min() const; + + //! checks if the index range is 'regular' (always \c true as this is the 1D case) + inline bool is_regular() const; + + //! find regular range, returns \c false if the range is not regular + inline bool get_regular_range( + BasicCoordinate<1, int>& min, + BasicCoordinate<1, int>& max) const; + +#ifndef STIR_USE_BOOST + + /* KT 31/01/2000 I had to add these functions here, although they are + in NumericVectorWithOffset already. + Reason: we allow addition (and similar operations) of tensors of + different sizes. This implies that operator+= can call a 'grow' + on retval. For this to work, retval should be a Array, not + its base_type (which happens if these function are not repeated + in this class). + Complicated... + */ + //! elem by elem addition + inline self operator+ (const base_type &iv) const; + + //! elem by elem subtraction + inline self operator- (const base_type &iv) const; + + //! elem by elem multiplication + inline self operator* (const base_type &iv) const; + + //! elem by elem division + inline self operator/ (const base_type &iv) const; + + //! addition with an 'elemT' + inline self operator+ (const elemT a) const; + + //! subtraction with an 'elemT' + inline self operator- (const elemT a) const; + + //! multiplication with an 'elemT' + inline self operator* (const elemT a) const; + + //! division with an 'elemT' + inline self operator/ (const elemT a) const; + +#endif // boost + + //! allow array-style access, read/write + inline elemT& operator[] (int i); + + //! array access, read-only + inline const elemT& operator[] (int i) const; + + //! allow array-style access giving its BasicCoordinate, read/write + inline const elemT& operator[](const BasicCoordinate<1,int>& c) const; + + //! array access giving its BasicCoordinate, read-only + inline elemT& operator[](const BasicCoordinate<1,int>& c) ; + + +}; + + + +void +Array<1, elemT>::resize(const int min_index, const int max_index) +{ + this->check_state(); + const int oldstart = this->get_min_index(); + const int oldlength = this->size(); + + base_type::resize(min_index, max_index); + if (oldlength == 0) + { + for (int i=this->get_min_index(); i<=this->get_max_index(); i++) + this->num[i] = elemT(0); + } + else + { + for (int i=this->get_min_index(); iget_max_index(); ++i) + this->num[i] = elemT(0); + for (int i=std::max(oldstart + oldlength, this->get_min_index()); i<=this->get_max_index(); ++i) + this->num[i] = elemT(0); + } + this->check_state(); +} + +void +Array<1, elemT>::resize(const IndexRange<1>& range) +{ + resize(range.get_min_index(), range.get_max_index()); +} + +void +Array<1, elemT>::grow(const int min_index, const int max_index) +{ + resize(min_index, max_index); +} + +void +Array<1, elemT>::grow(const IndexRange<1>& range) +{ + grow(range.get_min_index(), range.get_max_index()); +} + +Array<1, elemT>::Array() +: base_type() +{ } + + +Array<1, elemT>::Array(const IndexRange<1>& range) +: base_type() +{ + grow(range); +} + +Array<1, elemT>::Array(const int min_index, const int max_index) +: base_type() +{ + grow(min_index, max_index); +} + +Array<1, elemT>::Array(const base_type &il) +: base_type(il) +{} + +Array<1, elemT>::~Array() +{} + +Array<1, elemT>::full_iterator +Array<1, elemT>::begin_all() +{ + return this->begin(); +} + +Array<1, elemT>::const_full_iterator +Array<1, elemT>::begin_all() const +{ + return this->begin(); +} + +Array<1, elemT>::full_iterator +Array<1, elemT>::end_all() +{ + return this->end(); +} + + +Array<1, elemT>::const_full_iterator +Array<1, elemT>::end_all() const +{ + return this->end(); +} + +Array<1, elemT>::const_full_iterator +Array<1, elemT>::begin_all_const() const +{ + return this->begin(); +} + +Array<1, elemT>::const_full_iterator +Array<1, elemT>::end_all_const() const +{ + return this->end(); +} + +IndexRange<1> +Array<1, elemT>::get_index_range() const +{ + return IndexRange<1>(this->get_min_index(), this->get_max_index()); +} + +size_t +Array<1, elemT>::size_all() const +{ + return size(); +} + +elemT +Array<1, elemT>::sum() const +{ + this->check_state(); + elemT acc = 0; + for(int i=this->get_min_index(); i<=this->get_max_index(); acc+=this->num[i++]) + {} + return acc; +}; + +#ifndef __stir_Array1d_no_comparisons__ +elemT +Array<1, elemT>::sum_positive() const +{ + this->check_state(); + elemT acc=0; + for(int i=this->get_min_index(); i<=this->get_max_index(); i++) + { + if (this->num[i] > 0) + acc += this->num[i]; + } + return acc; +}; + + +elemT +Array<1, elemT>::find_max() const +{ + this->check_state(); + if (this->size() > 0) + { +#ifndef STIR_NO_NAMESPACES + return *std::max_element(this->begin(), this->end()); +#else + return *max_element(this->begin(), this->end()); +#endif + } + else + { + // TODO return elemT::minimum or so + return 0; + } + this->check_state(); +}; + +elemT +Array<1, elemT>::find_min() const +{ + this->check_state(); + if (this->size() > 0) + { +#ifndef STIR_NO_NAMESPACES + return *std::min_element(this->begin(), this->end()); +#else + return *min_element(this->begin(), this->end()); +#endif + } + else + { + // TODO return elemT::maximum or so + return 0; + } + this->check_state(); +}; + +#endif // end of __stir_Array1d_no_comparisons__ + +bool +Array<1, elemT>::is_regular() const +{ + return true; +} + +bool +Array<1, elemT>::get_regular_range( + BasicCoordinate<1, int>& min, + BasicCoordinate<1, int>& max) const +{ + const IndexRange<1> range = get_index_range(); + return range.get_regular_range(min,max); +} + +#ifndef STIR_USE_BOOST + +/* KT 31/01/2000 I had to add these functions here, although they are +in NumericVectorWithOffset already. +Reason: we allow addition (and similar operations) of tensors of +different sizes. This implies that operator+= can call a 'grow' +on retval. For this to work, retval should be a Array, not +its base_type (which happens if these function are not repeated +in this class). +Complicated... +*/ + +Array<1, elemT> +Array<1, elemT>::operator+ (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval += iv; +}; + +Array<1, elemT> +Array<1, elemT>::operator- (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval -= iv; +} + +Array<1, elemT> +Array<1, elemT>::operator* (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval *= iv; +} + + +Array<1, elemT> +Array<1, elemT>::operator/ (const base_type &iv) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return retval /= iv; +} + + +Array<1, elemT> +Array<1, elemT>::operator+ (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval += a); +}; + + +Array<1, elemT> +Array<1, elemT>::operator- (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval -= a); +}; + + +Array<1, elemT> +Array<1, elemT>::operator* (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval *= a); +}; + + +Array<1, elemT> +Array<1, elemT>::operator/ (const elemT a) const +{ + this->check_state(); + Array<1, elemT> retval(*this); + return (retval /= a); +}; + + +#endif // boost + +const elemT& Array<1,elemT>:: operator[] (int i) const +{ + return base_type::operator[](i); +}; + +elemT& Array<1,elemT>:: operator[] (int i) +{ + return base_type::operator[](i); +}; + +const elemT& Array<1,elemT>:: operator[] (const BasicCoordinate<1,int>& c) const +{ + return (*this)[c[1]]; +}; + +elemT& Array<1,elemT>::operator[] (const BasicCoordinate<1,int>& c) +{ + return (*this)[c[1]]; +}; + +#undef elemT + diff --git a/src/include/stir/ArrayFilter1DUsingConvolution.h b/src/include/stir/ArrayFilter1DUsingConvolution.h new file mode 100644 index 0000000000..8b2628d1c1 --- /dev/null +++ b/src/include/stir/ArrayFilter1DUsingConvolution.h @@ -0,0 +1,126 @@ +// +// +/*! + + \file + \ingroup Array + \brief Declaration of class stir::ArrayFilter1DUsingConvolution + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFilter1DUsingConvolution_H__ +#define __stir_ArrayFilter1DUsingConvolution_H__ + + +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" +#include "stir/BoundaryConditions.h" + +START_NAMESPACE_STIR + +template class VectorWithOffset; + +/*! + \ingroup Array + \brief This class implements convolution of a 1D array with an + arbitrary (i.e. potentially non-symmetric) kernel. + + Convolution is non-periodic: + + \f[ out_i = \sum_j kernel_j in_{i-j} \f] + + Note that for most kernels, the above convention means that the zero- + index of the kernel corresponds to the peak in the kernel. + + By default, zero boundary conditions are used, i.e. elements of the input array + that are outside its index range are considered to be 0. + + Currently, "constant" boundary conditions are also implemented, i.e. elements of the input array + that are outside its index range are considered to the same as the nearest element in the array + (i.e. first element on the "left" and last element on the "right"). + + \par Example 1 + A straightforward low-pass filter, with a symmetric kernel + \code + VectorWithOffset kernel(-1,1); + kernel[-1] = kernel[1] = .25F; kernel[0] = 0.5F; + ArrayFilter1DUsingConvolution lowpass_filter(kernel); + \endcode + \par Example 2 + A filter which shifts the output 1 index to the right, i.e. \f$ out_i = in_{i-1}\f$ + \code + VectorWithOffset kernel(1,1); + kernel[1] = 1.F; + ArrayFilter1DUsingConvolution right_shift_filter(kernel); + \endcode + + \warning 1 argument operator() currently leaves the array with the + the same index range, i.e. it does not extend it with the kernel size or so. + + \see ArrayFilter1DUsingSymmetricConvolution for an implementation + when the kernel is symmetric. (Note: it's not clear if that implementation + results in faster execution). + + \todo implement other boundary conditions + */ +template +class ArrayFilter1DUsingConvolution : + public ArrayFunctionObject_2ArgumentImplementation<1,elemT> +{ +public: + + //! Construct a trivial filter + ArrayFilter1DUsingConvolution(); + + //! Construct the filter given the kernel coefficients + /*! Currently \a bc has to be BoundaryConditions::zero or + BoundaryConditions::constant + */ + ArrayFilter1DUsingConvolution(const VectorWithOffset< elemT>& filter_kernel, const BoundaryConditions::BC bc= BoundaryConditions::zero); + //! checks if the kernel corresponds to a trivial filter operation + /*! + trivial means, either the kernel has 0 length, or length 1 and its only element is 1 + */ + bool is_trivial() const; + + virtual Succeeded + get_influencing_indices(IndexRange<1>& influencing_indices, + const IndexRange<1>& output_indices) const; + + virtual Succeeded + get_influenced_indices(IndexRange<1>& influenced_indices, + const IndexRange<1>& input_indices) const; + +private: + VectorWithOffset< elemT> filter_coefficients; + BoundaryConditions::BC _bc; + void do_it(Array<1,elemT>& out_array, const Array<1,elemT>& in_array) const; + +}; + + + +END_NAMESPACE_STIR + + +#endif //ArrayFilter1DUsingConvolution + + diff --git a/src/include/stir/ArrayFilter1DUsingConvolutionSymmetricKernel.h b/src/include/stir/ArrayFilter1DUsingConvolutionSymmetricKernel.h new file mode 100644 index 0000000000..4d96268a6d --- /dev/null +++ b/src/include/stir/ArrayFilter1DUsingConvolutionSymmetricKernel.h @@ -0,0 +1,88 @@ +// +// +/*! + + \file + \ingroup Array + \brief Declaration of class stir::ArrayFilter1DUsingConvolutionSymmetricKernel + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFilter1DUsingConvolutionSymmetricKernel_H__ +#define __stir_ArrayFilter1DUsingConvolutionSymmetricKernel_H__ + + +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" + +START_NAMESPACE_STIR + +template class VectorWithOffset; + +/*! + \ingroup Array + \brief This class implements convolution of a 1D array with a symmetric kernel. + + Convolution is non-periodic: + + \f[ out_i = \sum_j kernel_j in_{i+j} \f] + + Elements of the input array that are outside its + index range are considered to be 0. + + \warning 2 argument operator() currently requires that out_array and in_array + have the same index range + */ +template +class ArrayFilter1DUsingConvolutionSymmetricKernel : + public ArrayFunctionObject_2ArgumentImplementation<1,elemT> +{ +public: + + //! Construct the filter given the kernel coefficients + /*! + Only one half of the kernel coefficients has to be passed. The implementation + uses a kernel whose coefficients are given by + \code kernel[i] == filter_kernel[abs(i)] \endcode + + \warning filter_kernel's indices must start from 0 + */ + ArrayFilter1DUsingConvolutionSymmetricKernel(const VectorWithOffset< elemT>& filter_kernel); + //! checks if the kernel corresponds to a trivial filter operation + /*! + trivial means, either the kernel has 0 length, or length 1 and its only element is 1 + */ + bool is_trivial() const; + +private: + VectorWithOffset< elemT> filter_coefficients; + void do_it(Array<1,elemT>& out_array, const Array<1,elemT>& in_array) const; + +}; + + + +END_NAMESPACE_STIR + + +#endif //ArrayFilter1DUsingConvolutionSymmetricKernel + + diff --git a/src/include/stir/ArrayFilter2DUsingConvolution.h b/src/include/stir/ArrayFilter2DUsingConvolution.h new file mode 100644 index 0000000000..936ec35dc0 --- /dev/null +++ b/src/include/stir/ArrayFilter2DUsingConvolution.h @@ -0,0 +1,66 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Declaration of class ArrayFilter2DUsingConvolution + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2002, IRSL + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFilter2DUsingConvolution_H__ +#define __stir_ArrayFilter2DUsingConvolution_H__ + + +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" +//#include "stir/VectorWithOffset.h" + +START_NAMESPACE_STIR + +template class VectorWithOffset; + +template +class ArrayFilter2DUsingConvolution : + public ArrayFunctionObject_2ArgumentImplementation<2,elemT> +{ +public: + + //! Construct the filter given the kernel coefficients + /*! + All kernel coefficients have to be passed. + */ + ArrayFilter2DUsingConvolution(); + + ArrayFilter2DUsingConvolution(const Array <2, float>& filter_kernel); + + bool is_trivial() const; + + virtual Succeeded + get_influencing_indices(IndexRange<1>& influencing_indices, + const IndexRange<1>& output_indices) const; + + virtual Succeeded + get_influenced_indices(IndexRange<1>& influenced_indices, + const IndexRange<1>& input_indices) const; + +private: + Array <2, float> filter_coefficients; + void do_it(Array<2,elemT>& out_array, const Array<2,elemT>& in_array) const; + +}; + + + +END_NAMESPACE_STIR + + +#endif //ArrayFilter2DUsingConvolution + + diff --git a/src/include/stir/ArrayFilter3DUsingConvolution.h b/src/include/stir/ArrayFilter3DUsingConvolution.h new file mode 100644 index 0000000000..8de90336f8 --- /dev/null +++ b/src/include/stir/ArrayFilter3DUsingConvolution.h @@ -0,0 +1,67 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Declaration of class ArrayFilter3DUsingConvolution + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2002, IRSL + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFilter3DUsingConvolution_H__ +#define __stir_ArrayFilter3DUsingConvolution_H__ + + +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" +//#include "stir/VectorWithOffset.h" + +START_NAMESPACE_STIR + +template class VectorWithOffset; + +template +class ArrayFilter3DUsingConvolution : + public ArrayFunctionObject_2ArgumentImplementation<3,elemT> +{ +public: + + //! Construct the filter given the kernel coefficients + /*! + All kernel coefficients have to be passed. + */ + ArrayFilter3DUsingConvolution(); + + ArrayFilter3DUsingConvolution(const Array <3, float>& filter_kernel); + + bool is_trivial() const; + + virtual Succeeded + get_influencing_indices(IndexRange<1>& influencing_indices, + const IndexRange<1>& output_indices) const; + + virtual Succeeded + get_influenced_indices(IndexRange<1>& influenced_indices, + const IndexRange<1>& input_indices) const; + +private: + Array <3, float> filter_coefficients; + void do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const; + void do_it_2d(Array<2,elemT>& out_array, const Array<2,elemT>& in_array) const; + +}; + + + +END_NAMESPACE_STIR + + +#endif //ArrayFilter3DUsingConvolution + + diff --git a/src/include/stir/ArrayFilterUsingRealDFTWithPadding.h b/src/include/stir/ArrayFilterUsingRealDFTWithPadding.h new file mode 100644 index 0000000000..f20932193a --- /dev/null +++ b/src/include/stir/ArrayFilterUsingRealDFTWithPadding.h @@ -0,0 +1,145 @@ +/*! + \file + \ingroup Array + \brief Declaration of class stir::ArrayFilterUsingRealDFTWithPadding + + \author Kris Thielemans +*/ +/* + Copyright (C) 2004-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFilterUsingRealDFTWithPadding_H__ +#define __stir_ArrayFilterUsingRealDFTWithPadding_H__ + +#include "stir/Array.h" +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" +#include "stir/Array_complex_numbers.h" +#include "stir/IndexRange.h" +#include + +#if defined(_MSC_VER) && _MSC_VER<=1200 +/* VC 6.0 cannot overload the real and complex constructors + I just disable the complex version. + */ +#define __stir_ArrayFilterUsingRealDFTWithPadding_no_complex_kernel__ + +#endif + +START_NAMESPACE_STIR +class Succeeded; +template class Array; + +/*! + \ingroup Array + \brief This class implements convolution of an array of real numbers with an + arbitrary (i.e. potentially non-symmetric) kernel using DFTs. + + Convolution is periodic. + + Elements of the input array that are outside its + index range are considered to be 0. + + If the input and output arrays are smaller than half the length of the kernel, + then there is enough zero-padding such that aliasing cannot occur. + In this case, this class gives the same results as + ArrayFilter1DUsingConvolution. + */ +template +class ArrayFilterUsingRealDFTWithPadding : + public ArrayFunctionObject_2ArgumentImplementation +{ +public: + + //! Default constructor (trivial kernel) + ArrayFilterUsingRealDFTWithPadding(); + //! Construct the filter given the real kernel coefficients + /*! \see set_kernel(const Array&) + \warning Will call error() when sizes are not appropriate + */ + ArrayFilterUsingRealDFTWithPadding(const Array& real_filter_kernel); + +#ifndef __stir_ArrayFilterUsingRealDFTWithPadding_no_complex_kernel__ + //! Construct the filter given the complex kernel coefficients + /*! \see set_kernel(const Array >&) + \warning Will call error() when sizes are not appropriate. + \warning This function is disabled for VC 6.0 because of compiler limitations + */ + ArrayFilterUsingRealDFTWithPadding(const Array >& kernel_in_frequency_space); +#endif + + //! set the real kernel coefficients + /* + The kernel can be given with arbitrary (but regular) index range, + but will be wrapped-around, + assuming that it is periodic outside the indexrange of the kernel. So, + normally, the 0- index corresponds to the middle of the PSF. + + Input data will be zero-padded to the same range as this kernel before + DFT. If you want to avoid aliasing, make sure that the kernel is at least + twice as long as the input and output arrays. + + As this function uses fourier_for_real_data(), see there for restrictions + on the possible kernel length, but at time of writing, it has to be a power of 2. + */ + Succeeded + set_kernel(const Array& real_filter_kernel); + + //! set the complex kernel coefficients + /* The kernel has to be given with index ranges starting from 0. + So, the 0- index corresponds to the DC component of the filter. + + \see fourier_for_real_data() for more info on the range of frequencies + Input data will be zero-padded to the index range as the corresponding + 'real' kernel before DFT. If you want to avoid aliasing, make sure that the kernel is at least + twice as long as the input and output arrays. + + See fourier() for restrictions on the possible + kernel length, but at time of writing, it has to be a power of 2. + */ + Succeeded + set_kernel_in_frequency_space(const Array >& kernel_in_frequency_space); + + //! checks if the kernel corresponds to a trivial filter operation + /*! + trivial means, either the kernel has 0 length, or length 1 and its only element is 1 + */ + bool is_trivial() const; + +protected: + + Array > kernel_in_frequency_space; + + //! Performs the convolution + /*! \a in_array and \a out_array can have arbitrary (even non-regular) + index ranges. However, they will copied (if necessary) + using wrap-around to/from + an array with the same dimensions as the 'real' kernel. + */ + void do_it(Array& out_array, const Array& in_array) const; +private: + IndexRange padding_range; + BasicCoordinate padded_sizes; + Succeeded set_padding_range(); +}; + + +END_NAMESPACE_STIR + + +#endif //ArrayFilterUsingRealDFTWithPadding + + diff --git a/src/include/stir/ArrayFunction.h b/src/include/stir/ArrayFunction.h new file mode 100644 index 0000000000..c08c346442 --- /dev/null +++ b/src/include/stir/ArrayFunction.h @@ -0,0 +1,354 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + + \brief This include file provides some additional functionality for stir::Array objects. + + \author Kris Thielemans (loosely based on some earlier work by Darren Hague) + \author PARAPET project + + +
          +
        • + functions which work on all stir::Array objects, and which change every element of the + array: +
            +
          • stir::in_place_log, stir::in_place_exp (these work only well when elements are float or double) +
          • stir::in_place_abs (does not work on complex numbers) +
          • stir::in_place_apply_function +
          • stir::in_place_apply_array_function_on_1st_index +
          • stir::in_place_apply_array_functions_on_each_index +
          + All these functions return a reference to the (modified) array +
        • + Analoguous functions that take out_array and in_array +
            +
          • stir::apply_array_function_on_1st_index +
          • stir::apply_array_functions_on_each_index +
          +
        + + \warning Compilers without partial specialisation of templates are + catered for by explicit instantiations. If you need it for any other + types, you'd have to add them by hand. + */ + +/* History: + + KT 21/05/2001 + added in_place_apply_array_function_on_1st_index, + in_place_apply_array_function_on_each_index + + KT 06/12/2001 + added apply_array_function_on_1st_index, + apply_array_function_on_each_index +*/ + +#ifndef __stir_ArrayFunction_H__ +#define __stir_ArrayFunction_H__ + +#include "stir/Array.h" +#include "stir/shared_ptr.h" +#include "stir/ArrayFunctionObject.h" + +START_NAMESPACE_STIR + +//---------------------------------------------------------------------- +// element wise and in place numeric functions +//---------------------------------------------------------------------- + +//! Replace elements by their logarithm, 1D version +/*! \ingroup Array */ +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline Array<1,elemT>& +in_place_log(Array<1,elemT>& v); +#else +inline Array<1,float>& +in_place_log(Array<1,float>& v); +#endif + + +//! apply log to each element of the multi-dimensional array +/*! \ingroup Array */ +template +inline Array& +in_place_log(Array& v); + +//! Replace elements by their exponentiation, 1D version +/*! \ingroup Array */ +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline Array<1,elemT>& +in_place_exp(Array<1,elemT>& v); +#else +inline Array<1,float>& +in_place_exp(Array<1,float>& v); +#endif + +//! apply exp to each element of the multi-dimensional array +/*! \ingroup Array */ +template +inline Array& +in_place_exp(Array& v); + +//! Replace elements by their absolute value, 1D version +/*! \ingroup Array + \warning The implementation does not work with complex numbers. +*/ +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline Array<1,elemT>& +in_place_abs(Array<1,elemT>& v); +#else +inline Array<1,float>& +in_place_abs(Array<1,float>& v); +#endif + +//! store absolute value of each element of the multi-dimensional array +/*! \ingroup Array + \warning The implementation does not work with complex numbers. +*/ +template +inline Array& +in_place_abs(Array& v); + + +//! apply any function(object) to each element of the multi-dimensional array +/*! \ingroup Array + Each element will be replaced by + \code + elem = f(elem); + \endcode + + Requires that type \c T has \c begin_all() and \c end_all() functions. + +*/ +template +inline T& +in_place_apply_function(T& v, FUNCTION f); + +//! Apply a function object on all possible 1d arrays extracted by keeping all indices fixed, except the first one +/*! \ingroup Array + + For the 2d case, this amounts to applying a function on all columns + of the matrix. + + For a 3d case, the following pseudo-code illustrates what happens. + \code + for all i2,i3 + { + for all i + { + a[i] = array[i][i2][i3]; + } + (*f)(a); + for all i + { + array[i][i2][i3] = a[i]; + } + } + \endcode + + \warning The array has to be regular. + \todo Add a 1D specialisation as the current implementation would be really + inefficient in this case. + \todo Add a specialisation such that this function would handle function + objects and (smart) pointers to function objects. At the moment, it's only the latter. +*/ +template +inline void +in_place_apply_array_function_on_1st_index(Array& array, FunctionObjectPtr f); + + +//! apply any function(object) to each element of the multi-dimensional array, storing results in a different array +/*! \ingroup Array + \warning Both in_array and out_array have to have regular ranges. Moreover, they have to + have matching ranges except for the outermost level. The (binary) function is applied as + \code + (*f)(out_array1d, in_array1d) + \endcode + \a f should not modify the index range of the output argument. + */ +template +inline void +apply_array_function_on_1st_index(Array& out_array, + const Array& in_array, + FunctionObjectPtr f); + +/* local #define used for 2 purposes: + - in partial template specialisation that uses ArrayFunctionObject types + - in complete template specialisation for deficient compilers + + This is done with a #define to keep code reasonably clean. Also, it allows + adjusting the type according to what you need. + Still, it's terribly ugly. Sorry. + + Note that you shouldn't/cannot use this define outside of this include file + (and its .inl) partner. + + Ideally, the code should be rewritten to work with any kind of (smart) ptr. TODO +*/ +#if !defined(__GNUC__) && !defined(_MSC_VER) +#define ActualFunctionObjectPtrIter \ + VectorWithOffset< shared_ptr > >::const_iterator +#else +/* + Puzzlingly, although the code is actually called with iterators of the type above, + gcc 3.0 (and others?) gets confused and refuses to compile the + partial template specialisation (it says it's ambiguous). + VC also refuses to compile it. + A work-around is to use the following type +*/ +#define ActualFunctionObjectPtrIter shared_ptr > const* +#endif + +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +// silly business for deficient compilers (including VC 6.0) +#define elemT float +#define FunctionObjectPtrIter ActualFunctionObjectPtrIter +#endif + + +//! Apply a sequence of 1d array-function objects on every dimension of the input array +/*! \ingroup Array + The sequence of function object pointers is specified by iterators. There must be + num_dim function objects in the sequence, i.e. stop-start==num_dim. + + The n-th function object (**(start+n)) is applied on the n-th index of the + array. So, (*start) is applied using + in_place_apply_array_function_on_1st_index(array, *start). + Similarly, (*(start+1) is applied using + in_place_apply_array_function_on_1st_index(array[i], *(start+1)) + for every i. And so on. + \todo Add a specialisation such that this function would handle function + objects and (smart) pointers to function objects. At the moment, it's only the latter. +*/ +// TODO add specialisation that uses ArrayFunctionObject::is_trivial +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +#else +template +#endif +inline void +in_place_apply_array_functions_on_each_index(Array& array, + FunctionObjectPtrIter start, + FunctionObjectPtrIter stop); + +//! 1d specialisation of the above. +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +#endif +inline void +in_place_apply_array_functions_on_each_index(Array<1, elemT>& array, + FunctionObjectPtrIter start, + FunctionObjectPtrIter stop); + + + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +//! Apply a sequence of 1d array-function objects on every dimension of the input array, store in output array +/*! \ingroup Array + + The sequence of function object pointers is specified by iterators. There must be + num_dim function objects in the sequence, i.e. stop-start==num_dim. + + The n-th function object (**(start+n)) is applied on the n-th indices of the + arrays. So, (*start) is applied using + \code + apply_array_function_on_1st_index(out_array, in_array, *start). + \endcode + and so on. + \todo Add a specialisation such that this function would handle iterators of function + objects and (smart) pointers to function objects. At the moment, it's only the latter. +*/ +template +inline void +apply_array_functions_on_each_index(Array& out_array, + const Array& in_array, + FunctionObjectPtrIter start, + FunctionObjectPtrIter stop); +#endif + +//! Apply a sequence of 1d array-function objects of a specific type on every dimension of the input array, store in output array +/*! \ingroup Array + + This function uses optimisations possible because ArrayFunctionObject gives information + on sizes etc. + \todo Modify such that this function would handle function + objects and (smart) pointers to ArrayFunctionObject objects. At the moment, it's only the latter. +*/ +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +#else +template +#endif +inline void +apply_array_functions_on_each_index(Array& out_array, + const Array& in_array, + ActualFunctionObjectPtrIter start, + ActualFunctionObjectPtrIter stop); + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +//! 1d specialisation of above +/*! \ingroup Array +*/ +// has to be here to get general 1D specialisation to compile +template +#endif +inline void +apply_array_functions_on_each_index(Array<1, elemT>& out_array, + const Array<1, elemT>& in_array, + ActualFunctionObjectPtrIter start, + ActualFunctionObjectPtrIter stop); + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +//! 1d specialisation for general function objects +/*! \ingroup Array + */ +inline void +apply_array_functions_on_each_index(Array<1, elemT>& out_array, + const Array<1, elemT>& in_array, + FunctionObjectPtrIter start, FunctionObjectPtrIter stop); +#endif + +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#undef elemT +#undef FunctionObjectPtrIter +#endif + + +template +inline void +transform_array_to_periodic_indices(Array& out_array, + const Array& in_array); +template +inline void +transform_array_from_periodic_indices(Array& out_array, + const Array& in_array); + +END_NAMESPACE_STIR + +#include "stir/ArrayFunction.inl" +#undef ActualFunctionObjectPtrIter + +#endif + diff --git a/src/include/stir/ArrayFunction.inl b/src/include/stir/ArrayFunction.inl new file mode 100644 index 0000000000..4a4eb0b3d5 --- /dev/null +++ b/src/include/stir/ArrayFunction.inl @@ -0,0 +1,443 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + + \brief Implementations for ArrayFunction.h + + \author Kris Thielemans (some functions based on some earlier work by Darren Hague) + \author PARAPET project + + + \warning Compilers without partial specialisation of templates are + catered for by explicit instantiations. If you need it for any other + types, you'd have to add them by hand. + */ +#include "stir/BasicCoordinate.h" +#include "stir/array_index_functions.h" +#include "stir/modulo.h" + +#include +#include +# ifdef BOOST_NO_STDC_NAMESPACE + namespace std { using ::log; using ::exp; } +# endif + + +START_NAMESPACE_STIR + +//---------------------------------------------------------------------- +// element wise and in place numeric functions +//---------------------------------------------------------------------- + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline Array<1,elemT>& +in_place_log(Array<1,elemT>& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + v[i] = std::log(v[i]); + return v; +} + +#else +inline Array<1,float>& +in_place_log(Array<1,float>& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + v[i] = std::log(v[i]); + return v; +} +#endif + + +template +inline Array& +in_place_log(Array& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + in_place_log(v[i]); + return v; +} + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline Array<1,elemT>& +in_place_exp(Array<1,elemT>& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + v[i] = std::exp(v[i]); + return v; +} +#else +inline Array<1,float>& +in_place_exp(Array<1,float>& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + v[i] = std::exp(v[i]); + return v; +} +#endif + +template +inline Array& +in_place_exp(Array& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + in_place_exp(v[i]); + return v; +} + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline Array<1,elemT>& +in_place_abs(Array<1,elemT>& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + if (v[i] < 0) + v[i] = -v[i]; + return v; +} +#else +inline Array<1,float>& +in_place_abs(Array<1,float>& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + if (v[i] < 0) + v[i] = -v[i]; + return v; +} +#endif + + +template +inline Array& +in_place_abs(Array& v) +{ + for(int i=v.get_min_index(); i<=v.get_max_index(); i++) + in_place_abs(v[i]); + return v; +} + + +template +inline T& +in_place_apply_function(T& v, FUNCTION f) +{ + typename T::full_iterator iter = v.begin_all(); + const typename T::full_iterator end_iter = v.end_all(); + while (iter != end_iter) + { + *iter = f(*iter); + ++iter; + } + return v; +} + + +template +inline void +in_place_apply_array_function_on_1st_index(Array& array, FunctionObjectPtr f) +{ + assert(array.is_regular()); + const int outer_min_index = array.get_min_index(); + const int outer_max_index = array.get_max_index(); + + // construct a vector with a full_iterator for every array[i] + VectorWithOffset< +#ifndef _MSC_VER + typename +#endif + Array::full_iterator > + full_iterators (outer_min_index, outer_max_index); + for (int i=outer_min_index; i<=outer_max_index; ++i) + full_iterators[i] = array[i].begin_all(); + + // allocate 1d array + Array<1, elemT> array1d (outer_min_index, outer_max_index); + + while (full_iterators[outer_min_index] != array[outer_min_index].end_all()) + { + // copy elements into 1d array + for (int i=outer_min_index; i<=outer_max_index; ++i) + array1d[i] = *full_iterators[i]; + + // apply function + (*f)(array1d); + + // put results back + // and increment full_iterators to do next index + for (int i=outer_min_index; i<=outer_max_index; ++i) + *full_iterators[i]++ = array1d[i]; + } + +} + +template +inline void +apply_array_function_on_1st_index(Array& out_array, + const Array& in_array, + FunctionObjectPtr f) +{ + assert(in_array.is_regular()); + assert(out_array.is_regular()); + const int in_min_index = in_array.get_min_index(); + const int in_max_index = in_array.get_max_index(); + const int out_min_index = out_array.get_min_index(); + const int out_max_index = out_array.get_max_index(); + + // construct a vector with a full_iterator for every in_array[i] + VectorWithOffset< typename Array::const_full_iterator > + in_full_iterators (in_min_index, in_max_index); + for (int i=in_min_index; i<=in_max_index; ++i) + in_full_iterators[i] = in_array[i].begin_all(); + // same for out_array[i] + VectorWithOffset::full_iterator > + out_full_iterators (out_min_index, out_max_index); + for (int i=out_min_index; i<=out_max_index; ++i) + out_full_iterators[i] = out_array[i].begin_all(); + + // allocate 1d array + Array<1, elemT> in_array1d (in_min_index, in_max_index); + Array<1, elemT> out_array1d (out_min_index, out_max_index); + + while (in_full_iterators[in_min_index] != in_array[in_min_index].end_all()) + { + assert(out_full_iterators[out_min_index] != out_array[out_min_index].end_all()); + // copy elements into 1d array + // increment in_full_iterators for next index + for (int i=in_min_index; i<=in_max_index; ++i) + in_array1d[i] = *(in_full_iterators[i]++); + + // apply function + (*f)(out_array1d, in_array1d); + assert(out_array1d.get_min_index() == out_min_index); + assert(out_array1d.get_max_index() == out_max_index); + + // put results back + // increment out_full_iterators for next index + for (int i=out_min_index; i<=out_max_index; ++i) + *(out_full_iterators[i]++) = out_array1d[i]; + } + assert(out_full_iterators[out_min_index] == out_array[out_min_index].end_all()); + +} + +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +// silly business for deficient compilers (including VC 6.0) +#define elemT float +#define FunctionObjectPtrIter ActualFunctionObjectPtrIter +#endif + +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +#else +template +#endif +inline void +in_place_apply_array_functions_on_each_index(Array& array, + FunctionObjectPtrIter start, + FunctionObjectPtrIter stop) +{ + assert(start+num_dim == stop); + assert(num_dim > 1); + in_place_apply_array_function_on_1st_index(array, *start); + + ++start; + for (typename Array::iterator restiter = array.begin(); restiter != array.end(); ++restiter) + in_place_apply_array_functions_on_each_index(*restiter, start, stop); +} + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +#endif +inline void +in_place_apply_array_functions_on_each_index(Array<1, elemT>& array, FunctionObjectPtrIter start, FunctionObjectPtrIter stop) +{ + assert(start+1 == stop); + (**start)(array); +} + + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline void +apply_array_functions_on_each_index(Array& out_array, + const Array& in_array, + FunctionObjectPtrIter start, + FunctionObjectPtrIter stop) +{ + assert(start+num_dim == stop); + assert(num_dim > 1); + + assert(out_array.is_regular()); + BasicCoordinate tmp_out_min_indices, tmp_out_max_indices; + out_array.get_regular_range(tmp_out_min_indices, tmp_out_max_indices); + tmp_out_min_indices[1] = in_array.get_min_index(); + tmp_out_max_indices[1] = in_array.get_max_index(); + Array tmp_out_array(IndexRange(tmp_out_min_indices, tmp_out_max_indices)); + + for (int i=in_array.get_min_index(); i<=in_array.get_max_index(); ++i) + apply_array_functions_on_each_index(tmp_out_array[i], in_array[i], start+1, stop); + + apply_array_function_on_1st_index(out_array, tmp_out_array, *start); + +} +#endif + +// specialisation that uses ArrayFunctionObject::is_trivial etc +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +#else +template +#endif +inline void +apply_array_functions_on_each_index(Array& out_array, + const Array& in_array, + ActualFunctionObjectPtrIter start, + ActualFunctionObjectPtrIter stop) +{ + assert(start+num_dim == stop); + assert(num_dim > 1); + + + //cerr << "apply_array_functions_on_each_index dim " << num_dim << std::endl; + if ((**start).is_trivial()) + { + for (int i=max(out_array.get_min_index(), in_array.get_min_index()); + i<=min(out_array.get_max_index(),in_array.get_max_index()); + ++i) + apply_array_functions_on_each_index(out_array[i], in_array[i], start+1, stop); + } + else + { + assert(out_array.is_regular()); + + IndexRange<1> influencing_indices; + if ((**start).get_influencing_indices(influencing_indices, + IndexRange<1>(out_array.get_min_index(), + out_array.get_max_index())) + == Succeeded::no) + influencing_indices = IndexRange<1>(influencing_indices.get_min_index(), + in_array.get_max_index()); + else + { + influencing_indices = + IndexRange<1>(max(influencing_indices.get_min_index(), + in_array.get_min_index()), + min(influencing_indices.get_max_index(), + in_array.get_max_index())); + } + BasicCoordinate tmp_out_min_indices, tmp_out_max_indices; + out_array.get_regular_range(tmp_out_min_indices, tmp_out_max_indices); + tmp_out_min_indices[1] = influencing_indices.get_min_index(); + tmp_out_max_indices[1] = influencing_indices.get_max_index(); + Array tmp_out_array(IndexRange(tmp_out_min_indices, tmp_out_max_indices)); + + for (int i=influencing_indices.get_min_index(); i<=influencing_indices.get_max_index(); ++i) + apply_array_functions_on_each_index(tmp_out_array[i], in_array[i], start+1, stop); + + apply_array_function_on_1st_index(out_array, tmp_out_array, *start); + } + +} + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +// has to be here to get general 1D specialisation to compile +template +#endif +inline void +apply_array_functions_on_each_index(Array<1, elemT>& out_array, + const Array<1, elemT>& in_array, + ActualFunctionObjectPtrIter start, + ActualFunctionObjectPtrIter stop) +{ + assert(start+1 == stop); + (**start)(out_array, in_array); +} + + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +inline void +apply_array_functions_on_each_index(Array<1, elemT>& out_array, + const Array<1, elemT>& in_array, + FunctionObjectPtrIter start, FunctionObjectPtrIter stop) +{ + assert(start+1 == stop); + (**start)(out_array, in_array); +} +#endif + +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#undef elemT +#undef FunctionObjectPtrIter +#endif + + + +/******************* functions that copy arrays using transformed indices *****/ + +template +inline void +transform_array_to_periodic_indices(Array& out_array, + const Array& in_array) +{ + assert(norm(get_min_indices(out_array))<.01);// check out_array is 0-based + + BasicCoordinate min_indices, max_indices; + + assert(out_array.get_regular_range(min_indices, max_indices)); + out_array.get_regular_range(min_indices, max_indices); + const BasicCoordinate out_sizes = max_indices - min_indices +1; + { + BasicCoordinate index = get_min_indices(in_array); + do + { + out_array[modulo(index, out_sizes)] = in_array[index]; + } + while(next(index, in_array)); + } +} + + +template +inline void +transform_array_from_periodic_indices(Array& out_array, + const Array& in_array) +{ + assert(norm(get_min_indices(in_array))<.01);// check in_array is 0-based + + BasicCoordinate min_indices, max_indices; + + assert(in_array.get_regular_range(min_indices, max_indices)); + in_array.get_regular_range(min_indices, max_indices); + const BasicCoordinate in_sizes = max_indices - min_indices +1; + + BasicCoordinate index = get_min_indices(out_array); + do + { + out_array[index] = in_array[modulo(index, in_sizes)]; + } + while(next(index, out_array)); +} + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/ArrayFunctionObject.h b/src/include/stir/ArrayFunctionObject.h new file mode 100644 index 0000000000..6af2e63800 --- /dev/null +++ b/src/include/stir/ArrayFunctionObject.h @@ -0,0 +1,100 @@ +// +// +/*! + + \file + \ingroup Array + \brief Declaration of class stir::ArrayFunctionObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFunctionObject_H__ +#define __stir_ArrayFunctionObject_H__ + + +#include "stir/Succeeded.h" + + + +START_NAMESPACE_STIR + +template class Array; +template class IndexRange; +/*! + \ingroup Array + \brief A class for operations on n-dimensional Arrays +*/ +template +class ArrayFunctionObject +{ +public: + virtual ~ArrayFunctionObject() {} + //! in-place modification + /*! \warning Not all derived classes will be able to handle arbitrary index ranges + for \a in_array. + */ + virtual void operator() (Array& array) const = 0; + //! result stored in another array + /*! \warning Not all derived classes will be able to handle arbitrary index ranges + in \a out_array and \a in_array. + */ + virtual void operator() (Array& out_array, + const Array& in_array) const = 0; + //! Should return true when the operations won't modify the object at all + /*! For the 2 argument version, elements in \a out_array will be set to + corresponding elements in \a in_array. Elements in \a out_array that do not + occur in \a in_array will be set to 0. + */ + virtual bool is_trivial() const = 0; + + //! sets the range of indices that influences the result in a set of coordinates \a output_indices + /*! For linear filters, these are the indices such that the support of their PSF + overlaps with output_indices. + \return Succeeded::yes if this is a meaningful concept for the current object. + Presumably, Succeeded::no would be returned if the whole array is always + going to affect the \a output_indices (independent of the size of the input array) or + of it is too difficult for the derived class to return a sensible index range. + */ + virtual Succeeded + get_influencing_indices(IndexRange& influencing_indices, + const IndexRange& output_indices) const + { return Succeeded::no; } + + //! sets the range of indices that gets influenced by a set of coordinate \a input_indices + /*! For linear filters, this is the union of the supports of the PSF for all \a output_indices. + \return Succeeded::yes if this is a meaningful concept for the current object. + Presumably, Succeeded::no would be returned if the whole array is always + going to be affected by the \a input_indices (independent of the size of the output array) or + of it is too difficult for the derived class to return a sensible index range. + */ + virtual Succeeded + get_influenced_indices(IndexRange& influenced_indices, + const IndexRange& input_indices) const + { return Succeeded::no; } +}; + + + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/ArrayFunctionObject_1ArgumentImplementation.h b/src/include/stir/ArrayFunctionObject_1ArgumentImplementation.h new file mode 100644 index 0000000000..07a738ab89 --- /dev/null +++ b/src/include/stir/ArrayFunctionObject_1ArgumentImplementation.h @@ -0,0 +1,77 @@ +// +// +/*! + + \file + \ingroup Array + \brief Declaration of class stir::ArrayFunctionObject_1ArgumentImplementation + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFunctionObject_1ArgumentImplementation_H__ +#define __stir_ArrayFunctionObject_1ArgumentImplementation_H__ + + +#include "stir/ArrayFunctionObject.h" +#include "stir/Array.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Array + \brief A convenience class for children of ArrayFunctionObject. It + implements the 2 argument operator() in terms of the in-place version. + + Sadly, we need to introduce another virtual function for this, as + redefining an overloaded function in a derived class, hides all other + overladed versions. So, we cannot simply leave the 1 arg operator() + undefined here. Similarly, we could not only define the 1 arg operator() + in a derived class. + + \see ArrayFunctionObject_2ArgumentImplementation +*/ +template +class ArrayFunctionObject_1ArgumentImplementation : + public ArrayFunctionObject +{ +public: + virtual void operator() (Array& array) const + { + do_it(array); + } + + //! result stored in another array, implemented inline + virtual void inline operator() (Array& out_array, + const Array& in_array) const + { + assert(out_array.get_index_range() == in_array.get_index_range()); + out_array = in_array; + do_it(out_array); + } +protected: + virtual void do_it(Array& array) const = 0; +}; + + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/ArrayFunctionObject_2ArgumentImplementation.h b/src/include/stir/ArrayFunctionObject_2ArgumentImplementation.h new file mode 100644 index 0000000000..5c7e00a419 --- /dev/null +++ b/src/include/stir/ArrayFunctionObject_2ArgumentImplementation.h @@ -0,0 +1,75 @@ +// +// +/*! + \file + \ingroup Array + \brief Declaration of class stir::ArrayFunctionObject_2ArgumentImplementation + + \author Kris Thielemans +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_ArrayFunctionObject_2ArgumentImplementation_H__ +#define __stir_ArrayFunctionObject_2ArgumentImplementation_H__ + + +#include "stir/ArrayFunctionObject.h" +#include "stir/Array.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Array + \brief A convenience class for children of ArrayFunctionObject. It + implements the in-place operator() in terms of the 2 argument version. + + Sadly, we need to introduce another virtual function for this, as + redefining an overloaded function in a derived class, hides all other + overladed versions. So, we cannot simply leave the 2 arg operator() + undefined here. Similarly, we could not only define the 2 arg operator() + in a derived class. + + \see ArrayFunctionObject_1ArgumentImplementation +*/ +template +class ArrayFunctionObject_2ArgumentImplementation : + public ArrayFunctionObject +{ +public: + //! in-place modification of array, implemented inline + virtual inline void operator() (Array& array) const + { + Array copy_array( array); + (*this)(array, copy_array); + } + + virtual void operator() (Array& out_array, + const Array& in_array) const + { + do_it(out_array, in_array); + } +protected: + virtual void do_it(Array& out_array, + const Array& in_array) const = 0; +}; + + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/Array_complex_numbers.h b/src/include/stir/Array_complex_numbers.h new file mode 100644 index 0000000000..5e811f2542 --- /dev/null +++ b/src/include/stir/Array_complex_numbers.h @@ -0,0 +1,96 @@ + + +#ifndef __Array_complex_numbers_H__ +#define __Array_complex_numbers_H__ + +/*! + \file + \ingroup Array + \brief defines additional numerical operations for arrays of complex numbers + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/Array.h" +#include + +START_NAMESPACE_STIR + +/*! @name numerical operations for arrays of complex numbers + \ingroup Array +*/ +//@{ + +template +Array >& +operator *= (Array >& lhs, const elemT& rhs) +{ + typename Array >::iterator iter1= lhs.begin(); + while (iter1!= lhs.end()) + *iter1++ *= rhs; + return lhs; +} + +template +Array >& +operator /= (Array >& lhs, const elemT& rhs) +{ + typename Array >::iterator iter1= lhs.begin(); + while (iter1!= lhs.end()) + *iter1++ /= rhs; + return lhs; +} + +template +Array >& +operator += (Array >& lhs, const elemT& rhs) +{ + typename Array >::iterator iter1= lhs.begin(); + while (iter1!= lhs.end()) + *iter1++ += rhs; + return lhs; +} + +template +Array >& +operator -= (Array >& lhs, const elemT& rhs) +{ + typename Array >::iterator iter1= lhs.begin(); + while (iter1!= lhs.end()) + *iter1++ -= rhs; + return lhs; +} + + +// a few common cases given explictly here such that we don't get conversion warnings all the time. +inline +void assign(std::complex& x, const int y) +{ + x=static_cast >(y); +} + +inline +void assign(std::complex& x, const int y) +{ + x=static_cast(y); +} +//@} +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/BasicCoordinate.h b/src/include/stir/BasicCoordinate.h new file mode 100644 index 0000000000..cdfce29592 --- /dev/null +++ b/src/include/stir/BasicCoordinate.h @@ -0,0 +1,320 @@ +#ifndef __stir_BasicCoordinate_H__ +#define __stir_BasicCoordinate_H__ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-01-04, Hammersmith Imanet Ltd + Copyright (C) 2012-06-01 - 2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup Coordinate + + \brief This file declares class stir::BasicCoordinate and + some functions acting on stir::BasicCoordinate objects. + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + + + \todo The arithmetic operations might at some point be moved to a + derived class stir::CartesianCoordinate. + +*/ + + +#include "stir/common.h" +#include +#include + +START_NAMESPACE_STIR +/*! + \ingroup Coordinate + \brief class BasicCoordinate\<\c int \c num_dimensions, \c typename \c coordT\> defines \c num_dimensions -dimensional coordinates. + + + A BasicCoordinate\<\c num_dimensions, \c coordT\> is essentially a vector of size \c num_dimensions, but + as the dimension is templated, it has better performance. + + Access to the individual coordinates is through operator[]. + + \warning Indices run from 1 to \c num_dimensions + +*/ +template + class BasicCoordinate : + boost::partially_ordered, // have operator>, <= etc for free + boost::equality_comparable // have operator!= for free + > > +{ + +public: + //! \name typedefs for iterator support + //@{ + typedef std::random_access_iterator_tag iterator_category; + typedef coordT value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* iterator; + typedef value_type* pointer; + typedef const value_type* const_iterator; + typedef std::ptrdiff_t difference_type; + typedef std::size_t size_type; + //@} + + //! default constructor. NO initialisation + inline BasicCoordinate(); + //! constructor that sets all elements equal to \a value. + explicit inline BasicCoordinate(const coordT&); +#if 0 + /* disabled. It overlaps with the constructor below and VC 6.0 can't sort it out. + We don't seem to need it anyway + */ + //! copy constructor + inline BasicCoordinate(const BasicCoordinate& c); +#endif + //! constructor from different type of \c coordT + /*! Uses assignment after
        static_cast
        */ + // Note implementation here for VC 6.0 + template + explicit inline + BasicCoordinate(const BasicCoordinate& c) + { + for (int i=1; i<=num_dimensions;++ i) + (*this)[i] = static_cast(c[i]); + } + // virtual destructor, not implemented at the moment + // It's only needed whenever there is a chance that an object will be deleted + // through a pointer to its base class and derived classes have extra + // data members + // virtual ~BasicCoordinate() {} + + //! assignment + inline BasicCoordinate & operator=(const BasicCoordinate& c); + + //! comparison + inline bool operator==(const BasicCoordinate& c) const; + +#if !defined(_MSC_VER) || _MSC_VER>1200 + //! less-than (using lexical ordering) + inline bool operator<(const BasicCoordinate& c) const; +#else + // needs to be a global function to have the overloading to work. sigh. +#endif + + // access to elements + //! Return value at index \c t (which is 1-based) + inline coordT& operator[](const int d); + //! Return value at index \c t (which is 1-based) if the BasicCoordinate object is const + /*! Note that the return type is not simply \c coordT. This mimics the design of + std::vector. One can argue about this (see e.g. +http://groups.google.com/group/comp.lang.c%2B%2B.moderated/browse_thread/thread/e5c4898a5c259cc1/434f5a25df51781f%23434f5a25df51781f?sa=X&oi=groupsr&start=2&num=3), + However, this alternative can have severe performance penalties if \c coordT + is a type for large objects. + */ + inline coordT const& operator[](const int d) const; + + //! Return value at index \c t (which is 1-based), but with range checking (throws std::out_of_range) + inline coordT& at(const int d); + //! Return value at index \c t (which is 1-based) if the BasicCoordinate object is const, but with range checking (throws std::out_of_range) + inline coordT const& at(const int d) const; + + // check if the coordinate is empty (always returns false) + inline bool empty() const { return false; } + + //! \name Functions as in VectorWithOffset + //@{ + inline static int get_min_index(); + inline static int get_max_index(); + inline static unsigned size(); + //! fill elements with value + inline void fill(const coordT&); + //@} + + //! \name arithmetic assignment operators + //@{ + inline BasicCoordinate & operator+= (const BasicCoordinate& c); + inline BasicCoordinate & operator-= (const BasicCoordinate& c); + inline BasicCoordinate & operator*= (const BasicCoordinate& c); + inline BasicCoordinate & operator/= (const BasicCoordinate& c); + + inline BasicCoordinate & operator+= (const coordT& a); + inline BasicCoordinate & operator-= (const coordT& a); + inline BasicCoordinate & operator*= (const coordT& a); + inline BasicCoordinate & operator/= (const coordT& a); + //@} + + //! \name arithmetic operations with a BasicCoordinate, combining element by element + //@{ + inline BasicCoordinate operator+ (const BasicCoordinate& c) const; + inline BasicCoordinate operator- (const BasicCoordinate& c) const; + inline BasicCoordinate operator* (const BasicCoordinate& c) const; + inline BasicCoordinate operator/ (const BasicCoordinate& c) const; + //@} + + //! \name arithmetic operations with a coordT + //@{ + inline BasicCoordinate operator+ (const coordT& a) const; + inline BasicCoordinate operator- (const coordT& a) const; + inline BasicCoordinate operator* (const coordT& a) const; + inline BasicCoordinate operator/ (const coordT& a) const; + //@} + + //! \name basic iterator support + //@{ + inline iterator begin(); + inline const_iterator begin() const; + inline iterator end(); + inline const_iterator end() const; + //@} + + private: + //! storage + /*! \warning 0-based */ + coordT coords[num_dimensions]; + +}; + +/*! + \ingroup Coordinate + \name Utility functions to make BasicCoordinate objects. + + \warning Because of template rules of C++, all arguments of the + make_coordinate function have to have exactly the same type. For instance, + \code + const BasicCoordinate<3,float> a = make_coordinate(1.F,2.F,0.F); + \endcode +*/ +//@{ + +template +inline BasicCoordinate<1,T> + make_coordinate(const T& a1); + +template +inline BasicCoordinate<2,T> + make_coordinate(const T& a1, const T& a2); + +template +inline BasicCoordinate<3,T> + make_coordinate(const T& a1, const T& a2, const T& a3); + +template +inline BasicCoordinate<4,T> + make_coordinate(const T& a1, const T& a2, const T& a3, const T& a4); + +template +inline BasicCoordinate<5,T> + make_coordinate(const T& a1, const T& a2, const T& a3, const T& a4, const T& a5); + +template +inline BasicCoordinate<6,T> +make_coordinate(const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, + const T& a6); + +//@} + +/* + General functions on BasicCoordinate objects, like in ArrayFunction.h +*/ + +//! compute sum_i p1[i] * p2[i] +/*! + \ingroup Coordinate + \todo move to a new CartesianCoordinate class */ +template +inline coordT +inner_product (const BasicCoordinate& p1, + const BasicCoordinate& p2); +//! compute (inner_product(p1,p1)) +/*! + \ingroup Coordinate + \todo move to a new CartesianCoordinate class */ +template +inline double +norm_squared (const BasicCoordinate& p1); +//! compute sqrt(inner_product(p1,p1)) +/*! + \ingroup Coordinate + \todo move to a new CartesianCoordinate class */ +template +inline double +norm (const BasicCoordinate& p1); +//! compute angle between 2 directions +/*! \ingroup Coordinate + Implemented in terms of acos(cos_angle(p1,p2)). + \todo move to a new CartesianCoordinate class */ +template +inline double +angle (const BasicCoordinate& p1, + const BasicCoordinate& p2); + +//! compute cos of the angle between 2 directions +/*! \ingroup Coordinate + \todo move to a new CartesianCoordinate class +*/ +template +inline double +cos_angle (const BasicCoordinate& p1, + const BasicCoordinate& p2); + +// Note: gcc 2.8.1 bug: +// It cannot call 'join' (it generates a bad mangled name for the function) +//! make a longer BasicCoordinate, by prepending \c c with the single \c coordT +/*! \ingroup Coordinate */ +template +inline BasicCoordinate +join(const coordT& a, + const BasicCoordinate& c); + +//! make a longer BasicCoordinate, by appending the \c coordT to \c c +/*! \ingroup Coordinate */ +template +inline BasicCoordinate + join(const BasicCoordinate& c, const coordT& a); + +//! make a shorter BasicCoordinate, by cutting the last element from \c c +/*! \ingroup Coordinate */ +template +inline BasicCoordinate + cut_last_dimension(const BasicCoordinate& c); + + +//! make a shorter BasicCoordinate, by cutting the first element from \c c +/*! \ingroup Coordinate */ +template +inline BasicCoordinate +cut_first_dimension(const BasicCoordinate& c) ; + +//! converts a BasicCoordinate to BasicCoordinate +/*! \ingroup Coordinate */ +template +inline +BasicCoordinate +convert_int_to_float(const BasicCoordinate& cint); + + +END_NAMESPACE_STIR + +#include "stir/BasicCoordinate.inl" + + + +#endif + diff --git a/src/include/stir/BasicCoordinate.inl b/src/include/stir/BasicCoordinate.inl new file mode 100644 index 0000000000..481c78955a --- /dev/null +++ b/src/include/stir/BasicCoordinate.inl @@ -0,0 +1,621 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Coordinate + + \brief (inline) implementations for stir::BasicCoordinate + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + +*/ + +#include "stir/detail/test_if_1d.h" +// for std::inner_product +#include +// for sqrt and acos +#include +// for equal and fill +#include +#include + +#ifndef STIR_NO_NAMESPACES +# ifndef BOOST_NO_STDC_NAMESPACE +using std::acos; +using std::sqrt; +# endif +#endif + +START_NAMESPACE_STIR + +/* + iterators +*/ +template +typename BasicCoordinate::iterator +BasicCoordinate::begin() +{ + return coords; +} + +template +typename BasicCoordinate::const_iterator +BasicCoordinate::begin() const +{ + return coords; +} + +template +typename BasicCoordinate::iterator +BasicCoordinate::end() +{ + return coords + num_dimensions; +} + +template +typename BasicCoordinate::const_iterator +BasicCoordinate::end() const +{ + return coords + num_dimensions; +} + + +/* + operator[] and at +*/ +template +coordT& +BasicCoordinate::operator[](const int d) +{ + assert(d>0); + assert(d<=num_dimensions); + return coords[d-1]; +} + +template +coordT const& +BasicCoordinate::operator[](const int d) const +{ + assert(d>0); + assert(d<=num_dimensions); + return coords[d-1]; +} + +template +coordT& +BasicCoordinate::at(const int d) +{ + if (d<=0 || d>num_dimensions) + throw std::out_of_range("index out of range"); + return coords[d-1]; +} + +template +coordT const& +BasicCoordinate::at(const int d) const +{ + if (d<=0 || d>num_dimensions) + throw std::out_of_range("index out of range"); + return coords[d-1]; +} + +/* + comparison + */ +template +bool +BasicCoordinate::operator==(const BasicCoordinate& c) const +{ + return + std::equal(begin(), end(), c.begin()); +} + +/* + assignments and onstructors +*/ +template +BasicCoordinate& +BasicCoordinate::operator=(const BasicCoordinate& c) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] = c[i]; + return *this; +} + +template +void +BasicCoordinate:: +fill(const coordT& c) +{ + std::fill(this->begin(), this->end(), c); +} + +template +BasicCoordinate::BasicCoordinate() +{} + +template +BasicCoordinate:: +BasicCoordinate(const coordT& c) +{ + this->fill(c); +} + +#if 0 +template +BasicCoordinate::BasicCoordinate(const BasicCoordinate& c) +{ + operator=(c); +} +#endif + +template +int +BasicCoordinate:: +get_min_index() +{ return 1; } + +template +int +BasicCoordinate:: +get_max_index() +{ return num_dimensions; } + +template +unsigned +BasicCoordinate:: +size() +{ return num_dimensions; } + +/* + numerical assignments +*/ +template +BasicCoordinate& +BasicCoordinate:: +operator+=(const BasicCoordinate& c) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] += c[i]; + return *this; +} + +template +BasicCoordinate& +BasicCoordinate:: +operator-=(const BasicCoordinate& c) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] -= c[i]; + return *this; +} + +template +BasicCoordinate& +BasicCoordinate:: +operator*=(const BasicCoordinate& c) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] *= c[i]; + return *this; +} + +template +BasicCoordinate& +BasicCoordinate:: +operator/=(const BasicCoordinate& c) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] /= c[i]; + return *this; +} + +template +BasicCoordinate& +BasicCoordinate:: +operator+=(const coordT& a) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] += a; + return *this; +} + +template +BasicCoordinate& +BasicCoordinate:: +operator-=(const coordT& a) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] -= a; + return *this; +} + +template +BasicCoordinate& +BasicCoordinate:: +operator*=(const coordT& a) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] *= a; + return *this; +} + +template +BasicCoordinate& +BasicCoordinate:: +operator/=(const coordT& a) +{ + for (int i=1; i<=num_dimensions; i++) + (*this)[i] /= a; + return *this; +} + + +/* + numerical operators +*/ +template +BasicCoordinate BasicCoordinate::operator+(const BasicCoordinate& c) const +{ + BasicCoordinate tmp(*this); + tmp += c; + return tmp; +} + + +template +BasicCoordinate BasicCoordinate::operator-(const BasicCoordinate& c) const +{ + BasicCoordinate tmp(*this); + tmp -= c; + return tmp; +} + +template +BasicCoordinate BasicCoordinate::operator*(const BasicCoordinate& c) const +{ + BasicCoordinate tmp(*this); + tmp *= c; + return tmp; +} + +template +BasicCoordinate BasicCoordinate::operator/(const BasicCoordinate& c) const +{ + BasicCoordinate tmp(*this); + tmp /= c; + return tmp; +} + +template +BasicCoordinate BasicCoordinate::operator+(const coordT& a) const +{ + BasicCoordinate tmp(*this); + tmp += a; + return tmp; +} + + +template +BasicCoordinate BasicCoordinate::operator-(const coordT& a) const +{ + BasicCoordinate tmp(*this); + tmp -= a; + return tmp; +} + + +template +BasicCoordinate BasicCoordinate::operator*(const coordT& a) const +{ + BasicCoordinate tmp(*this); + tmp *= a; + return tmp; +} + + +template +BasicCoordinate BasicCoordinate::operator/(const coordT& a) const +{ + BasicCoordinate tmp(*this); + tmp /= a; + return tmp; +} + + + +/* + External functions +*/ + + +template +BasicCoordinate<1,T> +make_coordinate(const T& a1) +{ + BasicCoordinate<1,T> a; + a[1]=a1; + return a; +} + +template +BasicCoordinate<2,T> +make_coordinate(const T& a1, const T& a2) +{ + BasicCoordinate<2,T> a; + a[1]=a1; a[2]=a2; + return a; +} + +template +BasicCoordinate<3,T> +make_coordinate(const T& a1, const T& a2, const T& a3) +{ + BasicCoordinate<3,T> a; + a[1]=a1; a[2]=a2; a[3]=a3; + return a; +} + +template +BasicCoordinate<4,T> +make_coordinate(const T& a1, const T& a2, const T& a3, const T& a4) +{ + BasicCoordinate<4,T> a; + a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; + return a; +} + +template +BasicCoordinate<5,T> +make_coordinate(const T& a1, const T& a2, const T& a3, const T& a4, const T& a5) +{ + BasicCoordinate<5,T> a; + a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; a[5]=a5; + return a; +} + +template +BasicCoordinate<6,T> +make_coordinate(const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, + const T& a6) +{ + BasicCoordinate<6,T> a; + a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; a[5]=a5; a[6]=a6; + return a; +} + + +template +coordT +inner_product (const BasicCoordinate& p1, + const BasicCoordinate& p2) +{ +#ifdef STIR_NO_NAMESPACES + return inner_product(p1.begin(), p1.end(), p2.begin(), coordT(0)); +#else + return std::inner_product(p1.begin(), p1.end(), p2.begin(), coordT(0)); +#endif +} +// TODO specialise for complex coordTs if you need them +template +double +norm_squared (const BasicCoordinate& p1) +{ +#ifdef _MSC_VER + return static_cast(std::inner_product(p1.begin(), p1.end(), p1.begin(), coordT(0))); +#else + return static_cast(inner_product(p1,p1)); +#endif +} +// TODO specialise for complex coordTs if you need them +template +double +norm (const BasicCoordinate& p1) +{ + return sqrt(norm_squared(p1)); +} + +template +double +cos_angle (const BasicCoordinate& p1, + const BasicCoordinate& p2) +{ + return inner_product(p1,p2)/sqrt(norm_squared(p1)*norm_squared(p2)) ; +} + +template +double +angle (const BasicCoordinate& p1, + const BasicCoordinate& p2) +{ + return acos(cos_angle(p1,p2)); +} + +template +inline BasicCoordinate +join(const coordT& a, + const BasicCoordinate& c) +{ + BasicCoordinate retval; + + *retval.begin() = a; + std::copy(c.begin(), c.end(), retval.begin()+1); + return retval; +} + +template +BasicCoordinate +cut_last_dimension(const BasicCoordinate& c) +{ + BasicCoordinate retval; + std::copy(c.begin(), c.end()-1, retval.begin()); + return retval; +} +template +inline BasicCoordinate +join(const BasicCoordinate& c, const coordT& a) +{ + BasicCoordinate retval; + + retval[num_dimensions+1] = a; + std::copy(c.begin(), c.end(), retval.begin()); + return retval; +} + +template +BasicCoordinate +cut_first_dimension(const BasicCoordinate& c) +{ + BasicCoordinate retval; + + std::copy(c.begin()+1, c.end(), retval.begin()); + return retval; +} +template +inline +BasicCoordinate convert_int_to_float(const BasicCoordinate& cint) +{ + BasicCoordinate cfloat; + for(int i=1;i<=num_dimensions;++i) + cfloat[i]=(float)cint[i]; + return cfloat; +} + +// helper functions for operator<() +namespace detail +{ + + template + inline + bool + coordinate_less_than_help(is_1d, + const BasicCoordinate<1, coordT>& c1, + const BasicCoordinate<1, coordT>& c2) + { + return c1[1] + inline + bool + coordinate_less_than_help(is_not_1d, + const BasicCoordinate<2, coordT>& c1, + const BasicCoordinate<2, coordT>& c2) + { + return + c1[1] + inline + bool + coordinate_less_than_help(is_not_1d, + const BasicCoordinate<3, coordT>& c1, + const BasicCoordinate<3, coordT>& c2) + { + return + c1[1]1200 + // generic code + template + inline + bool + coordinate_less_than_help(is_not_1d, + const BasicCoordinate& c1, + const BasicCoordinate& c2) + { + return + c1[1] + inline + bool + coordinate_less_than_help(is_not_1d, + const BasicCoordinate<4, coordT>& c1, + const BasicCoordinate<4, coordT>& c2) + { + return + c1[1]1200 + +// generic definition +template +bool +BasicCoordinate:: +operator<(const BasicCoordinate& c) const +{ + return detail::coordinate_less_than_help(detail::test_if_1d(), + *this, c); +} + +#else + +// VC 6.0 cannot compile the above. So we list them one by one (sigh!) + +template +bool +inline operator<(const BasicCoordinate<1, coordT>& c1, const BasicCoordinate<1, coordT>& c) +{ + return detail::coordinate_less_than_help(detail::is_1d(), + c1, c); +} +#define DEFINE_OPERATOR_LESS(num_dimensions) \ +template \ +inline bool \ +operator<(const BasicCoordinate& c1,const BasicCoordinate& c)\ +{ \ + return detail::coordinate_less_than_help(detail::is_not_1d(), \ + c1, c); \ +} + +DEFINE_OPERATOR_LESS(2) +DEFINE_OPERATOR_LESS(3) +DEFINE_OPERATOR_LESS(4) +#undef DEFINE_OPERATOR_LESS + +#endif + +END_NAMESPACE_STIR + + diff --git a/src/include/stir/Bin.h b/src/include/stir/Bin.h new file mode 100644 index 0000000000..d766257696 --- /dev/null +++ b/src/include/stir/Bin.h @@ -0,0 +1,106 @@ +// +// + +/*! + \file + \ingroup projdata + + \brief Declaration of class stir::Bin + + + \author Sanida Mustafovic + \author Kris Thielemans + \author Mustapha Sadki + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_Bin_H__ +#define __stir_Bin_H__ + + +#include "stir/common.h" + + +START_NAMESPACE_STIR +/*! \ingroup projdata + \brief + A class for storing coordinates and value of a single projection bin. + +*/ + +class Bin +{ +public: + //! default constructor + inline Bin(); + + //! A constructor : constructs a bin with value (defaulting to 0) + inline Bin(int segment_num,int view_num, int axial_pos_num, + int tangential_pos_num,float bin_value=0); + + //!get axial position number + inline int axial_pos_num()const; + //! get segmnet number + inline int segment_num()const; + //! get tangential position number + inline int tangential_pos_num() const; + //! get view number + inline int view_num() const; + + inline int& axial_pos_num(); + inline int& segment_num(); + inline int& tangential_pos_num(); + inline int& view_num(); + + //! get an empty copy + inline Bin get_empty_copy() const; + + //! get the value after forward projection + inline float get_bin_value()const; + //! set the value to be back projected + inline void set_bin_value( float v ); + + //! accumulate voxel's contribution during forward projection + inline Bin& operator+=(const float dx); + + //! comparison operators + inline bool operator==(const Bin&) const; + inline bool operator!=(const Bin&) const; + +private : + // shared_ptr proj_data_info_ptr; + + int segment; + int view; + int axial_pos; + int tangential_pos; + float bin_value; + + +}; + + + +END_NAMESPACE_STIR + + +#include "stir/Bin.inl" + +#endif //__Bin_H__ diff --git a/src/include/stir/Bin.inl b/src/include/stir/Bin.inl new file mode 100644 index 0000000000..c4607bade6 --- /dev/null +++ b/src/include/stir/Bin.inl @@ -0,0 +1,123 @@ +// +// +/*! + + \file + \ingroup projdata + + \brief Implementations of inline functions of class stir::Bin + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +Bin::Bin() +{} + + +Bin::Bin(int segment_num,int view_num, int axial_pos_num,int tangential_pos_num,float bin_value) + :segment(segment_num),view(view_num), + axial_pos(axial_pos_num),tangential_pos(tangential_pos_num),bin_value(bin_value) + {} + + +int + Bin:: axial_pos_num()const +{ return axial_pos;} + +int + Bin::segment_num()const +{return segment;} + +int + Bin::tangential_pos_num() const +{ return tangential_pos;} + +int + Bin::view_num() const +{ return view;} + +int& + Bin::axial_pos_num() +{ return axial_pos;} + +int& + Bin:: segment_num() +{return segment;} + +int& + Bin::tangential_pos_num() +{ return tangential_pos;} + +int& + Bin:: view_num() +{ return view;} + +#if 0 +const ProjDataInfo * +Bin::get_proj_data_info_ptr() const +{ + return proj_data_info_ptr.get(); +} +#endif + +Bin +Bin::get_empty_copy() const +{ + + Bin copy(segment_num(),view_num(),axial_pos_num(),tangential_pos_num(),0); + + return copy; +} + +float +Bin::get_bin_value()const +{ return bin_value;} + +void +Bin::set_bin_value( float v ) +{ bin_value = v ;} + +Bin& +Bin::operator+=(const float dx) +{ bin_value+=dx; + return *this;} + + +bool +Bin::operator==(const Bin& bin2) const +{ + return + segment == bin2.segment && view == bin2.view && + axial_pos == bin2.axial_pos && tangential_pos == bin2.tangential_pos && + bin_value == bin2.bin_value; +} + +bool +Bin::operator!=(const Bin& bin2) const +{ + return !(*this==bin2); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/BoundaryConditions.h b/src/include/stir/BoundaryConditions.h new file mode 100644 index 0000000000..9cd417e38b --- /dev/null +++ b/src/include/stir/BoundaryConditions.h @@ -0,0 +1,41 @@ +// +// +/*! + + \file + \ingroup Array + \brief Declaration of class stir::BoundaryConditions + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2009- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +/*! \ingroup Array + \brief Preliminary class to specify boundary conditions for filters +*/ +class BoundaryConditions{ + public: + enum BC {zero, constant, periodic}; +}; + +END_NAMESPACE_STIR diff --git a/src/include/stir/ByteOrder.h b/src/include/stir/ByteOrder.h new file mode 100644 index 0000000000..7e14551154 --- /dev/null +++ b/src/include/stir/ByteOrder.h @@ -0,0 +1,178 @@ +#ifndef __stir_ByteOrder_H__ +#define __stir_ByteOrder_H__ + +/*! + \file + \ingroup buildblock + \brief This file declares the stir::ByteOrder class. + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009 Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + Modification History: + + - First version by KT + + - AZ&KT 15/12/99 rewrote swap_order using revert_region +*/ + +#include "stir/common.h" +// for swap +#include + +START_NAMESPACE_STIR + +/*! + \class ByteOrder + \ingroup buildblock + \brief This class provides member functions to + find out what byte-order your machine is and to swap numbers. + + \par Some machine architectures: + -Little endian processors: Intel, Alpha, VAX, PDP-11, ... + -Big endian processors: Sparc, PowerPC, Motorola 68???, ... + + In a little-endian architecture, within a given 16- or 32-bit word, + bytes at lower addresses have lower significance + (the word is stored `little-end-first'). + (Quoted from http://www.techfak.uni-bielefeld.de/~joern/jargon/) +*/ + +/* + \brief Internal class to swap bytes. + + This defines a revert function that swaps the outer elements of an + array, and then calls itself recursively. + Due to the use of templates, the recursion gets resolved at compile + time. + (We have to use a class for this, as we rely on + template specialisation, which is unavailable for functions). + + \warning This class should not be used anywhere, except in the + ByteOrder::swap_order implementation. + + \internal +*/ +/* + It really shouldn't be in this include file, but we have to because + of a compiler bug in VC++ (member templates have to be defined in the + class). +*/ +//TODO put revert_region in own namespace or as private class of ByteOrder + + +template +class revert_region +{ +public: + inline static void revert(unsigned char* ptr) + { +#ifndef STIR_NO_NAMESPACES + std::swap(ptr[0], ptr[size - 1]); +#else + swap(ptr[0], ptr[size - 1]); +#endif + revert_region::revert(ptr + 1); + } +}; + +template <> +class revert_region<1> +{ +public: + inline static void revert(unsigned char* ptr) + {} +}; + +template <> +class revert_region<0> +{ +public: + inline static void revert(unsigned char* ptr) + {} +}; + + +class ByteOrder +{ +public: + //! enum for specifying the byte-order + enum Order { + little_endian, /*!< is like x86, MIPS*/ + big_endian, /*!< is like PowerPC, Sparc.*/ + native, /*!< means the same order as the machine the programme is running on*/ + swapped /*!< means the opposite order of \e native*/ + }; + + //******* static members (i.e. not using 'this') + + //! returns the byte-order native to the machine the programme is running on. + inline static Order get_native_order(); + + // Note: this uses member templates. If your compiler cannot handle it, + // you will have to write lots of lines for the built-in types + // Note: Implementation has to be inside the class definition to get + // this compiled by VC++ 5.0 and 6.0 + //! swap the byteorder of the argument + template + inline static void swap_order(NUMBER& value) + { + revert_region::revert(reinterpret_cast(&value)); + } + + //********* non-static members + + //! constructor, defaulting to 'native' byte order + inline ByteOrder(Order byte_order = native); + + //! comparison operator + inline bool operator==(const ByteOrder order2) const; + inline bool operator!=(const ByteOrder order2) const; + + //! check if the object refers to the native order. + inline bool is_native_order() const; + + // Note: this uses member templates. If your compiler cannot handle it, + // you will have to write lots of lines for the built-in types + // Note: Implementation has to be inside the class definition to get + // this compiled by VC++ 5.0 and 6.0 + //! this swaps only when the order != native order + template inline void swap_if_necessary(NUMBER& a) const + { + if (!is_native_order()) + swap_order(a); + } + + +private: + // This static member has to be initialised somewhere (in file scope). + static const Order native_order ; + + Order byte_order; + +}; + +END_NAMESPACE_STIR + +#include "stir/ByteOrder.inl" + +#endif diff --git a/src/include/stir/ByteOrder.inl b/src/include/stir/ByteOrder.inl new file mode 100644 index 0000000000..115a07f158 --- /dev/null +++ b/src/include/stir/ByteOrder.inl @@ -0,0 +1,67 @@ +// +// +/*! + \file + + \brief This file declares the stir::ByteOrder class. + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +ByteOrder::ByteOrder(Order byte_order) + : byte_order(byte_order) +{} + +/*! for efficiency, this refers to the static member native_order.*/ +inline ByteOrder::Order ByteOrder::get_native_order() +{ + return native_order; +} + +inline bool ByteOrder::is_native_order() const +{ + return + byte_order == native || + byte_order == get_native_order(); +} + +/*! This takes care of interpreting 'native' and 'swapped'. */ +bool ByteOrder::operator==(const ByteOrder order2) const +{ + // Simple comparison (byte_order == order2.byte_order) + // does not work because of 4 possible values of the enum. + return + (is_native_order() && order2.is_native_order()) || + (!is_native_order() && !order2.is_native_order()); +} + +bool ByteOrder::operator!=(const ByteOrder order2) const +{ +return !(*this == order2); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/ByteOrderDefine.h b/src/include/stir/ByteOrderDefine.h new file mode 100644 index 0000000000..492ed583da --- /dev/null +++ b/src/include/stir/ByteOrderDefine.h @@ -0,0 +1,90 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Definition of STIRIsNativeByteOrderBigEndian and STIRIsNativeByteOrderLittleEndian preprocessor symbols + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +// currently checked by asserts() +#if !defined(__alpha) && (!defined(_WIN32) || defined(_M_PPC) || defined(_M_MPPC)) && !defined(__i386__) && !defined(__i486__) && !defined(__i586__) && !defined(__i686__) && !defined(__i786__)&& !defined(__i886__) && !defined(__k6__) && !defined(__athlon__) && !defined(__x86_64__) && !defined(__k6__) || (defined(__MSL__) && !defined(__LITTLE_ENDIAN)) +#define STIRIsNativeByteOrderBigEndian 1 +#define STIRIsNativeByteOrderLittleEndian 0 +#else +#define STIRIsNativeByteOrderBigEndian 0 +#define STIRIsNativeByteOrderLittleEndian 1 +#endif + +/*! + \def STIRIsNativeByteOrderBigEndian + \ingroup buildblock + \brief A macro that is defined to 1 when the compilation is on + a big endian machine, otherwise it is set to 0. + + \par Usage + \code + #if STIRIsNativeByteOrderBigEndian + // code specific for big endian machines + #else + // code for little endian machines + #endif + \endcode + + \par Relation to the ByteOrder class. + + This should be used only in the case that you really need to know this + at compilation time. Try to use class ByteOrder instead. + + The definition of class ByteOrder is independent of this macro. + + \warning It is recommended to check these settings by comparing with class + ByteOrder. This is done by the ByteOrderTests class. + + \warning This macro depends on preprocessor defines set by your compiler. + The list of defines is bound to be incomplete though. The current list sets + LittleEndian for alpha, x86 or PowerPC processors or Windows using some + macros which are known to work with gcc and Visual Studio (at some point also + with CodeWarrior). Otherwise, the + architecture is assumed to be big endian. ByteOrder does not rely on + this type of conditionals. + \warning The value of the macro in the doxygen documentation depends on + what type of machine doxygen was run. + +*/ + +/*! + \def STIRIsNativeByteOrderLittleEndian + \ingroup buildblock + \brief A macro that is defined to 1 when the compilation is on + a little endian machine, and to 0 otherwise. + + \see STIRIsNativeByteOrderBigEndian for details. +*/ + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/CPUTimer.h b/src/include/stir/CPUTimer.h new file mode 100644 index 0000000000..847c7bbeec --- /dev/null +++ b/src/include/stir/CPUTimer.h @@ -0,0 +1,117 @@ +// +// +/*! + + \file + \ingroup buildblock + + \brief declares the stir::CPUTimer class. + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __CPUTimer_H__ +#define __CPUTimer_H__ + +#include "stir/Timer.h" +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief A class for measuring elapsed CPU time. + + CPUTimer is derived from Timer, and hence has the same interface. It + returns the amount of CPU time (in secs) used by the current process and its + children. + \warning If too long CPU times are measured, wrap-around will occur. + \warning Currently, CPUTimer returns garbage on Win95 (and probably Win98). It does + work fine on NT, XP etc though. + + \par Implementation details + + For most systems, CPUTimer::value() returns elapsed CPU time using the + ANSI clock() function. From the man page: + \verbatim + The reported time is the sum + of the CPU time of the calling process and its terminated child + processes for which it has executed wait, system, or pclose + subroutines. + \endverbatim + clock() has a possible problem of wrap-around. For many Unix systems this + occurs very soon. For a SUN, the man page states this is every 2147 secs + of CPU time (36 minutes !). AIX should be similar, as both have + CLOCKS_PER_SEC = 10e6, and clock_t == int == 32 bit. + + So, since version 1.2 the times() function (with the rms_utime field) + is used if defined(__OS_UNIX__). The man page for times() states something + very similar to clock(): + + + tms_utime : The CPU time used for executing instructions in the user + space of the calling process. + + This information is read from the calling process as well as from + each completed child process for which the calling process executed + a wait subroutine. + + + As times() returns results measured in clock interrupt clicks (on AIX + 100 per second), wrap around occurs much later. + + + Finally, VC++ 5.0 seems to have a bug in clock() that makes its results + dependent on the load of the system (i.e. it is more like 'wall clock + time'). + We now use GetProcessTimes() (with the lpUserTime variable) instead. + The documentation states: + + + ... the amount of time that the process has executed in user mode. + The time that each of the threads of the process has executed in user + mode is determined, and then all of those times are summed together to + obtain this value. + + + Warning: this only works for NT, not for Win95 +*/ +// TODO do Win95 test +/* + History: + 1.0 by Kris Thielemans + 1.1 by Kris Thielemans + use times() and GetProcessTimes() + 1.2 by Kris Thielemans + moved inlines to separate file +*/ +class CPUTimer : public Timer +{ +private: + virtual inline double get_current_value() const; +}; + + + +END_NAMESPACE_STIR + +#include "stir/CPUTimer.inl" + +#endif // __CPUTimer_H__ + diff --git a/src/include/stir/CPUTimer.inl b/src/include/stir/CPUTimer.inl new file mode 100644 index 0000000000..f0c7dd1bf8 --- /dev/null +++ b/src/include/stir/CPUTimer.inl @@ -0,0 +1,117 @@ +// +// +/*! + \file + \ingroup buildblock + + \brief inline implementations for stir::CPUTimer + + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/* + History: + 1.0 by Kris Thielemans + 1.1 by Kris Thielemans + use times() and GetProcessTimes() + 1.2 by Kris Thielemans + moved inlines to separate file +*/ + + +#if defined(__OS_UNIX__) && !defined(STIR_CPUTimer_use_clock) +// use times() instead of clock() for Unix. (Higher resolution) +// Only tested for AIX, sun, OSF, but it is probably POSIX +// If does not work for your OS, use the version with clock() below + +#include +#include + +START_NAMESPACE_STIR + +double CPUTimer::get_current_value() const +{ + struct tms t; + times(&t); + return double( t.tms_utime ) / sysconf(_SC_CLK_TCK); +} + + + +#elif defined(__OS_WIN__) && !defined(STIR_CPUTimer_use_clock) + +// VC++ 5.0 needs GetProcessTimes(), due to a bug in clock() +// This breaks on Win95 though +#include + +START_NAMESPACE_STIR + +// undefine the min,max macros again (we did this already in Tomography_common.h) +#ifdef max +#undef max +#endif +#ifdef min +#undef min +#endif + + +double CPUTimer::get_current_value() const +{ + FILETIME CreationTime; // when the process was created + FILETIME ExitTime; // when the process exited + FILETIME KernelTime; // time the process has spent in kernel mode + FILETIME UserTime; // time the process has spent in user mode + + GetProcessTimes(GetCurrentProcess(), + &CreationTime, &ExitTime, &KernelTime, &UserTime); + // gcc still has problems with LARGE_INTEGER +#ifndef __GNUG__ + LARGE_INTEGER ll; + ll.LowPart = UserTime.dwLowDateTime; + ll.HighPart = UserTime.dwHighDateTime; + + return static_cast(ll.QuadPart ) / 1E7; +#else + // can't use LONGLONG in cygwin B20.1 + const long long value = + (static_cast(UserTime.dwHighDateTime) << 32) + + UserTime.dwLowDateTime; + return static_cast(value)/ 1E7; +#endif +} + +#else // all other systems + +#include + +START_NAMESPACE_STIR + +double CPUTimer::get_current_value() const +{ + return double( clock() ) / CLOCKS_PER_SEC; +} +#endif + + +END_NAMESPACE_STIR diff --git a/src/include/stir/CartesianCoordinate2D.h b/src/include/stir/CartesianCoordinate2D.h new file mode 100644 index 0000000000..9189507bf9 --- /dev/null +++ b/src/include/stir/CartesianCoordinate2D.h @@ -0,0 +1,78 @@ +#ifndef __stir_CartesianCoordinate2D_H__ +#define __stir_CartesianCoordinate2D_H__ +// +// +/*! + \file + \ingroup Coordinate + \brief defines the stir::CartesianCoordinate2D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2012-06-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/Coordinate2D.h" + + +START_NAMESPACE_STIR + +/*! + \ingroup Coordinate + \brief a templated class for 2-dimensional coordinates. + + It is derived from Coordinate2D. The only new methods are + y(),x(), corresponding resp. to + operator[](1), operator[](2) + + \warning The constructor uses the order CartesianCoordinate2D(y,x) +*/ + +template +class CartesianCoordinate2D : public Coordinate2D +{ +protected: + typedef Coordinate2D base_type; + typedef typename base_type::base_type basebase_type; + +public: + inline CartesianCoordinate2D(); + inline CartesianCoordinate2D(const coordT&, const coordT&); + inline CartesianCoordinate2D(const BasicCoordinate<2,coordT>& c); + inline CartesianCoordinate2D& operator=(const BasicCoordinate<2,coordT>& c); + + inline coordT& y(); + inline coordT y() const; + inline coordT& x(); + inline coordT x() const; + +}; + +END_NAMESPACE_STIR + +#include "stir/CartesianCoordinate2D.inl" + +#endif + diff --git a/src/include/stir/CartesianCoordinate2D.inl b/src/include/stir/CartesianCoordinate2D.inl new file mode 100644 index 0000000000..1010d98d74 --- /dev/null +++ b/src/include/stir/CartesianCoordinate2D.inl @@ -0,0 +1,96 @@ +// +// + +/*! + \file + \ingroup Coordinate + + \brief inline implementations for the stir::CartesianCoordinate2D class + + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +template +CartesianCoordinate2D::CartesianCoordinate2D() + : Coordinate2D() +{} + +template +CartesianCoordinate2D::CartesianCoordinate2D(const coordT& y, + const coordT& x) + : Coordinate2D(y,x) +{} + + +template +CartesianCoordinate2D::CartesianCoordinate2D(const BasicCoordinate<2,coordT>& c) + : base_type(c) +{} + + + +template +CartesianCoordinate2D& +CartesianCoordinate2D:: operator=(const BasicCoordinate<2,coordT>& c) +{ + basebase_type::operator=(c); + return *this; +} + + +template +coordT& +CartesianCoordinate2D::y() +{ + return this->operator[](1); +} + + +template +coordT +CartesianCoordinate2D::y() const +{ + return this->operator[](1); +} + + +template +coordT& +CartesianCoordinate2D::x() +{ + return this->operator[](2); +} + + +template +coordT +CartesianCoordinate2D::x() const +{ + return this->operator[](2); +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/CartesianCoordinate3D.h b/src/include/stir/CartesianCoordinate3D.h new file mode 100644 index 0000000000..3d28c35759 --- /dev/null +++ b/src/include/stir/CartesianCoordinate3D.h @@ -0,0 +1,94 @@ +#ifndef __CartesianCoordinate3D_H__ +#define __CartesianCoordinate3D_H__ +// +// +/*! + \file + \ingroup Coordinate + \brief defines the stir::CartesianCoordinate3D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/Coordinate3D.h" + +#ifdef STIR_USE_NO_TYPENAME +/* horrible work-around for compilers that do not handle 'typename' + correctly. + This work-around relies on the fact that you do not use 'typename' + in the template parameters (use 'class' instead) +*/ +#define typename +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup Coordinate + \brief a templated class for 3-dimensional coordinates. + + It is derived from Coordinate3D. The only new methods are + z(),y(),x(), corresponding resp. to + operator[](1), operator[](2), operator[](3) + + \warning The constructor uses the order CartesianCoordinate3D(z,y,x) +*/ + + +template +class CartesianCoordinate3D : public Coordinate3D +{ +protected: + typedef Coordinate3D base_type; + typedef typename base_type::base_type basebase_type; + +public: + inline CartesianCoordinate3D(); + inline CartesianCoordinate3D(const coordT&, const coordT&, const coordT&); + inline CartesianCoordinate3D(const BasicCoordinate<3, coordT>& c); + inline CartesianCoordinate3D& operator=(const BasicCoordinate<3, coordT>& c); +#ifdef OLDDESIGN + inline CartesianCoordinate3D(const Point3D& p); +#endif + + inline coordT& z(); + inline coordT z() const; + inline coordT& y(); + inline coordT y() const; + inline coordT& x(); + inline coordT x() const; + +}; + +END_NAMESPACE_STIR + +#include "stir/CartesianCoordinate3D.inl" + +#endif + +#ifdef STIR_USE_NO_TYPENAME +#undef typename +#endif diff --git a/src/include/stir/CartesianCoordinate3D.inl b/src/include/stir/CartesianCoordinate3D.inl new file mode 100644 index 0000000000..d781fc6d5a --- /dev/null +++ b/src/include/stir/CartesianCoordinate3D.inl @@ -0,0 +1,125 @@ +// +// + +/*! + \file + \ingroup Coordinate + \brief inline implementations for the stir::CartesianCoordinate3D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +START_NAMESPACE_STIR + +template +CartesianCoordinate3D::CartesianCoordinate3D() + : Coordinate3D() +{} + +template +CartesianCoordinate3D::CartesianCoordinate3D(const coordT& z, + const coordT& y, + const coordT& x) + : Coordinate3D(z,y,x) +{} + + +template +CartesianCoordinate3D::CartesianCoordinate3D(const BasicCoordinate<3, coordT>& c) + : base_type(c) +{} + + + +template +CartesianCoordinate3D& +CartesianCoordinate3D:: operator=(const BasicCoordinate<3, coordT>& c) +{ + basebase_type::operator=(c); + return *this; +} + +#ifdef OLDDESIGN +template +CartesianCoordinate3D ::CartesianCoordinate3D(const Point3D& p) + +{ + x() = p.x; + y() = p.y; + z() = p.z; +} +#endif + +template +coordT& +CartesianCoordinate3D::z() +{ + return this->operator[](1); +} + + +template +coordT +CartesianCoordinate3D::z() const +{ + return this->operator[](1); +} + + +template +coordT& +CartesianCoordinate3D::y() +{ + return this->operator[](2); +} + + +template +coordT +CartesianCoordinate3D::y() const +{ + return this->operator[](2); +} + + +template +coordT& +CartesianCoordinate3D::x() +{ + return this->operator[](3); +} + + +template +coordT +CartesianCoordinate3D::x() const +{ + return this->operator[](3); +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/ChainedDataProcessor.h b/src/include/stir/ChainedDataProcessor.h new file mode 100644 index 0000000000..eb4d4512a4 --- /dev/null +++ b/src/include/stir/ChainedDataProcessor.h @@ -0,0 +1,118 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup DataProcessor + \brief Declaration of class stir::ChainedDataProcessor + + \author Kris Thielemans + +*/ +#ifndef __stir_ChainedDataProcessor_H__ +#define __stir_ChainedDataProcessor_H__ + + +#include "stir/RegisteredParsingObject.h" +#include "stir/DataProcessor.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + + +/*! + \ingroup DataProcessor + \brief A class in the DataProcessor hierarchy that calls + 2 DataProcessors in sequence. + + As it is derived from RegisteredParsingObject, it implements all the + necessary things to parse parameter files etc. + \warning The 2 argument version of ChainedDataProcessor::apply + calls the first data processor with a temporary output data with + the same characteristics as the input data. + + + \warning ChainedDataProcessor::set_up builds only the data + processor of the first in the data processor chain. This + is because at this point, we do not really know what the first + data processor will do to the data (it might change index + ranges or so), so it is impossible to build the 2nd data + processor without actually letting the first data processor + process the data (which might be far too expensive). This is not a real + problem however, as ChainedDataProcessor::apply is + fine as it will call virtual_set_up for the 2nd + data processor anyway. + + \par Parameters used for parsing + \verbatim + Chained Data Processor Parameters:= + Data Processor to apply first:= + Data Processor to apply second:= + END Chained Data Processor Parameters:= + \endverbatim + */ + +template +class ChainedDataProcessor : + public + RegisteredParsingObject< + ChainedDataProcessor, + DataProcessor, + DataProcessor + > +{ +private: + typedef + RegisteredParsingObject< + ChainedDataProcessor, + DataProcessor, + DataProcessor + > + base_type; +public: + static const char * const registered_name; + + //! Construct given DataProcessor parameters + explicit + ChainedDataProcessor(shared_ptr > apply_first= + shared_ptr >(), + shared_ptr > apply_second= + shared_ptr >()); + +private: + + shared_ptr > apply_first; + shared_ptr > apply_second; + + virtual void set_defaults(); + virtual void initialise_keymap(); + + Succeeded virtual_set_up(const DataT& data); + + void virtual_apply(DataT& out_data, const DataT& in_data) const; + void virtual_apply(DataT& data) const ; + +}; + + +END_NAMESPACE_STIR + +#endif + + diff --git a/src/include/stir/Coordinate2D.h b/src/include/stir/Coordinate2D.h new file mode 100644 index 0000000000..ffaf92c780 --- /dev/null +++ b/src/include/stir/Coordinate2D.h @@ -0,0 +1,67 @@ +// +// +#ifndef __Coordinate2D_H__ +#define __Coordinate2D_H__ +/*! + \file + \ingroup Coordinate + \brief defines the stir::Coordinate2D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR + + +/*! + \ingroup Coordinate + \brief a templated class for 2-dimensional coordinates. + + The only new method is a constructor Coordinate2D(c1,c2) + + \warning Indices run from 1 to 2. + +*/ + +template +class Coordinate2D : public BasicCoordinate<2, coordT> +{ +protected: + typedef BasicCoordinate<2, coordT> base_type; + +public: + inline Coordinate2D(); + inline Coordinate2D(const coordT&, const coordT&); + inline Coordinate2D(const BasicCoordinate<2,coordT>& c); + inline Coordinate2D& operator=(const BasicCoordinate<2, coordT>& c); +}; + +END_NAMESPACE_STIR + +#include "stir/Coordinate2D.inl" + +#endif + diff --git a/src/include/stir/Coordinate2D.inl b/src/include/stir/Coordinate2D.inl new file mode 100644 index 0000000000..8157727d8c --- /dev/null +++ b/src/include/stir/Coordinate2D.inl @@ -0,0 +1,61 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + + \brief inline implementations for the stir::Coordinate2D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ + +START_NAMESPACE_STIR + +template +Coordinate2D::Coordinate2D() + : base_type() +{} + +template +Coordinate2D::Coordinate2D(const coordT& c1, + const coordT& c2) + : base_type() +{ + (*this)[1] = c1; + (*this)[2] = c2; +} + +template +Coordinate2D::Coordinate2D(const base_type& c) + : base_type(c) +{} + +template +Coordinate2D& +Coordinate2D::operator=(const base_type& c) +{ + base_type::operator=(c); + return *this; +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/Coordinate3D.h b/src/include/stir/Coordinate3D.h new file mode 100644 index 0000000000..ba9ca39357 --- /dev/null +++ b/src/include/stir/Coordinate3D.h @@ -0,0 +1,68 @@ +#ifndef __Coordinate3D_H__ +#define __Coordinate3D_H__ +// +// +/*! + \file + \ingroup Coordinate + \brief defines the stir::Coordinate3D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR + +/*! \ingroup Coordinate + \brief a templated class for 3-dimensional coordinates. + + The only new method is a constructor Coordinate3D(c1,c2,c3) + + \warning Indices run from 1 to 3. + +*/ + +template +class Coordinate3D : public BasicCoordinate<3, coordT> +{ +protected: + typedef BasicCoordinate<3, coordT> base_type; + +public: + inline Coordinate3D(); + inline Coordinate3D(const coordT&, const coordT&, const coordT&); + inline Coordinate3D(const BasicCoordinate<3, coordT>& c); + inline Coordinate3D& operator=(const BasicCoordinate<3, coordT>& c); +}; + +END_NAMESPACE_STIR + +#include "stir/Coordinate3D.inl" + +#endif + diff --git a/src/include/stir/Coordinate3D.inl b/src/include/stir/Coordinate3D.inl new file mode 100644 index 0000000000..d884547f4c --- /dev/null +++ b/src/include/stir/Coordinate3D.inl @@ -0,0 +1,64 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Coordinate + \brief inline implementations for the stir::Coordinate3D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ + +START_NAMESPACE_STIR + +template +Coordinate3D::Coordinate3D() + : base_type() +{} + +template +Coordinate3D::Coordinate3D(const coordT& c1, + const coordT& c2, + const coordT& c3) + : base_type() +{ + (*this)[1] = c1; + (*this)[2] = c2; + (*this)[3] = c3; +} + +template +Coordinate3D::Coordinate3D(const BasicCoordinate<3, coordT>& c) + : base_type(c) +{} + +template +Coordinate3D& +Coordinate3D::operator=(const BasicCoordinate<3, coordT>& c) +{ + base_type::operator=(c); + return *this; +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/Coordinate4D.h b/src/include/stir/Coordinate4D.h new file mode 100644 index 0000000000..b380265941 --- /dev/null +++ b/src/include/stir/Coordinate4D.h @@ -0,0 +1,67 @@ +// +// +#ifndef __Coordinate4D_H__ +#define __Coordinate4D_H__ +/*! + \file + \ingroup Coordinate + \brief defines the stir::Coordinate4D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + + +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR +/*! + \ingroup Coordinate + \brief a templated class for 4-dimensional coordinates. + + The only new method is a constructor Coordinate4D(c1,c2,c3,c4) + + \warning Indices run from 1 to 4. + +*/ +template +class Coordinate4D : public BasicCoordinate<4, coordT> +{ +protected: + typedef BasicCoordinate<4, coordT> base_type; + +public: + inline Coordinate4D(); + inline Coordinate4D(const coordT&, const coordT&, const coordT&, const coordT&); + inline Coordinate4D(const base_type& c); + inline Coordinate4D& operator=(const base_type& c); +}; + +END_NAMESPACE_STIR + +#include "stir/Coordinate4D.inl" + +#endif + diff --git a/src/include/stir/Coordinate4D.inl b/src/include/stir/Coordinate4D.inl new file mode 100644 index 0000000000..6c39c4b8b9 --- /dev/null +++ b/src/include/stir/Coordinate4D.inl @@ -0,0 +1,66 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Coordinate + \brief inline implementations for the stir::Coordinate4D class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ + +START_NAMESPACE_STIR + +template +Coordinate4D::Coordinate4D() + : base_type() +{} + +template +Coordinate4D::Coordinate4D(const coordT& c1, + const coordT& c2, + const coordT& c3, + const coordT& c4) + : base_type() +{ + (*this)[1] = c1; + (*this)[2] = c2; + (*this)[3] = c3; + (*this)[4] = c4; +} + +template +Coordinate4D::Coordinate4D(const base_type& c) + : base_type(c) +{} + +template +Coordinate4D& +Coordinate4D::operator=(const base_type& c) +{ + base_type::operator=(c); + return *this; +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/DataProcessor.h b/src/include/stir/DataProcessor.h new file mode 100644 index 0000000000..3ef82e87c1 --- /dev/null +++ b/src/include/stir/DataProcessor.h @@ -0,0 +1,147 @@ +// +// +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup DataProcessor + \brief Declaration of class stir::DataProcessor + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +#ifndef __stir_DataProcessor_H__ +#define __stir_DataProcessor_H__ + + +#include "stir/RegisteredObject.h" +#include "stir/ParsingObject.h" +#include "stir/TimedObject.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +/*! + \ingroup DataProcessor + \brief + Base class that defines an interface for classes that do data processing. + + Classes at the end of the DataProcessor hierarchy have to be able + to parse parameter files etc. Moreover, + it has to be possible to construct an DataProcessor object while + parsing, where the actual type of derived class is determined at + run-time. + Luckily, this is exactly the situation that RegisteredObject and + RegisteredParsingObject are supposed to handle. So, all this + functionality is achieved by deriving DataProcessor from the + appropriate RegisteredObject class, and deriving the 'leaves' + from Registered ParsingObject. + */ +template +class DataProcessor : +public RegisteredObject >, +public ParsingObject, +public TimedObject +{ +public: + inline DataProcessor(); + + //! Initialises any internal data (if necessary) using \a data as a template for sizes, sampling distances etc. + /*! + \warning DataProcessor does NOT check if the input data for apply() + actually corresponds to the template. So, most derived classes will + \b not call set_up again if the input data does + not correspond to the template, potentially resulting in erroneous output. + + The reason that DataProcessor does not perform this check is that + it does not know what the requirements are to call the 2 densities + 'compatible'. + */ + inline Succeeded + set_up(const DataT& data); + + //! Makes sure we will ignore any previous call to set-up() + /*! If you change any internal variables of the data-processor, or are calling + it on data if different size or so, you first have to call reset() such that + the data-processor will call set_up() when necessary. + + A derived class could overload reset() to re-initialise any internal variables, + but this is not required. + */ + inline virtual void + reset(); + + //! Calls set_up() (if not already done before) and process \a data in-place + /*! If set_up() returns Succeeded::false, a warning message is written, + and the \a data is not changed. + */ + inline Succeeded + apply(DataT& data); + + /*! + \brief + Calls set_up() (if not already done before) and process \a in_data, + putting the result in \a out_data. + + If set_up() returns Succeeded::false, a warning message is written, + and the \a out_data is not changed. + + \warning Most derived classes will assume that out_data is already + initialised appropriately (e.g. has correct dimensions, voxel sizes etc.). + */ + inline Succeeded apply + (DataT& out_data, + const DataT& in_data); + + /*! \name parsing functions + + parse() returns false if there is some error, true otherwise. + + These call reset() first, and then ParsingObject::parse + */ + //@{ + inline bool parse(istream& f); + bool parse(const char * const filename); + //@} + + // Check if filtering images with this dimensions, sampling_distances etc actually makes sense + //virtual inline Succeeded consistency_check( const DataT& image ) const; + + +protected: + //! Will be called to build any internal parameters + virtual Succeeded virtual_set_up(const DataT&) = 0; + //! Performs actual operation (virtual_set_up is called before this function) + //*! \todo should return Succeeded */ + virtual void virtual_apply(DataT& data, + const DataT& in_data) const = 0; + //! Performs actual operation (in-place) + //*! \todo should return Succeeded */ + virtual void virtual_apply(DataT& data) const =0; +private: + bool is_set_up_already; + +}; + + + +END_NAMESPACE_STIR + +#include "stir/DataProcessor.inl" + +#endif diff --git a/src/include/stir/DataProcessor.inl b/src/include/stir/DataProcessor.inl new file mode 100644 index 0000000000..7ea33b51ab --- /dev/null +++ b/src/include/stir/DataProcessor.inl @@ -0,0 +1,126 @@ +// +// +/*! + \file + \ingroup DataProcessor + \brief Inline implementations for class stir::DataProcessor + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + + +template +DataProcessor:: +DataProcessor() +: is_set_up_already(false) +{} + +template +Succeeded +DataProcessor:: +set_up(const DataT& image) +{ + start_timers(); + Succeeded result = virtual_set_up(image); + is_set_up_already = (result == Succeeded::yes); + stop_timers(); + return result; +} + +template +void +DataProcessor:: +reset() +{ + this->is_set_up_already = false; +} + +template +bool +DataProcessor:: +parse(istream& f) +{ + this->reset(); + return ParsingObject::parse(f); +} + +template +bool +DataProcessor:: +parse(const char * const filename) +{ + this->reset(); + return ParsingObject::parse(filename); +} + + + +template +Succeeded +DataProcessor:: +apply(DataT& data) +{ + start_timers(); + //assert(consistency_check(data) == Succeeded::yes); + if (!is_set_up_already ) + if (set_up(data) == Succeeded::no) + { + warning("DataProcessor::apply: Building was unsuccesfull. No processing done.\n"); + return Succeeded::no; + } + virtual_apply(data); + stop_timers(); + return Succeeded::yes; +} + + +template +Succeeded +DataProcessor:: +apply(DataT& data, + const DataT& in_data) +{ + start_timers(); + //assert(consistency_check(in_data) == Succeeded::yes); + if (!is_set_up_already ) + if (set_up(in_data) == Succeeded::no) + { + warning("DataProcessor::apply: Building was unsuccesfull. No processing done.\n"); + return Succeeded::no; + } + virtual_apply(data, in_data); + stop_timers(); + return Succeeded::yes; +} + +#if 0 +template +Succeeded +DataProcessor:: +consistency_check( const DataT& image) const +{ + return Succeeded::yes; +} +#endif + +END_NAMESPACE_STIR diff --git a/src/include/stir/DataSymmetriesForViewSegmentNumbers.h b/src/include/stir/DataSymmetriesForViewSegmentNumbers.h new file mode 100644 index 0000000000..79ac90c389 --- /dev/null +++ b/src/include/stir/DataSymmetriesForViewSegmentNumbers.h @@ -0,0 +1,119 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + + \brief Declaration of class stir::DataSymmetriesForViewSegmentNumbers + + \author Kris Thielemans + \author PARAPET project + +*/ +#ifndef __DataSymmetriesForViewSegmentNumbers_H__ +#define __DataSymmetriesForViewSegmentNumbers_H__ + +#include "stir/common.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#endif + +START_NAMESPACE_STIR + +class ViewSegmentNumbers; + +#if 0 +class ViewSegmentIndexRange; +#endif + + +/*! + \ingroup projdata + \brief A class for encoding/finding symmetries. Works only on + ViewSegmentNumbers (instead of Bin). + + This class (mainly used in RelatedViewgrams and the projectors) + is useful to store and use all information on symmetries + common between the image representation and the projection data. + + The class mainly defines members to find \c basic ViewSegmentNumbers. These form a + 'basis' for all ViewSegmentNumbers in the sense that all ViewSegmentNumbers + can be obtained by using symmetry operations on the 'basic' ones. +*/ +class DataSymmetriesForViewSegmentNumbers +{ +public: + + virtual ~DataSymmetriesForViewSegmentNumbers(); + + virtual DataSymmetriesForViewSegmentNumbers * clone() const = 0; + + //! Check equality + /*! Implemented in terms of blindly_equals, after checking the type */ + bool operator ==(const DataSymmetriesForViewSegmentNumbers&) const; + + //! Check inequality + /*! Implemented in terms of operator==() */ + bool operator !=(const DataSymmetriesForViewSegmentNumbers&) const; + +#if 0 + // TODO + //! returns the range of the indices for basic view/segments + virtual ViewSegmentIndexRange + get_basic_view_segment_index_range() const = 0; +#endif + + //! fills in a vector with all the view/segments that are related to 'v_s' (including itself) + virtual void + get_related_view_segment_numbers(vector&, const ViewSegmentNumbers& v_s) const = 0; + + //! returns the number of view_segment_numbers related to 'v_s' + /*! The default implementation is in terms of get_related_view_segment_numbers, which will be + slow of course */ + virtual int + num_related_view_segment_numbers(const ViewSegmentNumbers& v_s) const; + + /*! \brief given an arbitrary view/segment, find the basic view/segment + + sets 'v_s' to the corresponding 'basic' view/segment and returns true if + 'v_s' is changed (i.e. it was NOT a basic view/segment). + */ + virtual bool + find_basic_view_segment_numbers(ViewSegmentNumbers& v_s) const = 0; + + /*! \brief test if a view/segment is 'basic' + + The default implementation uses find_basic_view_segment_numbers + */ + virtual bool + is_basic(const ViewSegmentNumbers& v_s) const; + + protected: + typedef DataSymmetriesForViewSegmentNumbers root_type; + + virtual bool blindly_equals(const root_type * const) const = 0; +}; + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/Densel.h b/src/include/stir/Densel.h new file mode 100644 index 0000000000..67122e5c16 --- /dev/null +++ b/src/include/stir/Densel.h @@ -0,0 +1,48 @@ +// +// +/*! + \file + \ingroup densitydata + + \brief Declaration of typedef stir::Densel + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_Densel__H_ +#define __stir_Densel__H_ +//TODO +#include "stir/Coordinate3D.h" + +START_NAMESPACE_STIR + +/*! \ingroup densitydata +\brief a typedef used for an element of a DiscretisedDensity + +The name is a generalisation of pixel/voxel. + +\todo This might at some point evolve into a class, similar to Bin. +\warning At the moment, +Bin includes a value, while Densel does not. + +*/ +typedef Coordinate3D Densel; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/DetectionPosition.h b/src/include/stir/DetectionPosition.h new file mode 100644 index 0000000000..dd2c3070b2 --- /dev/null +++ b/src/include/stir/DetectionPosition.h @@ -0,0 +1,94 @@ +// +// +/* + Copyright (C) 2002- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Declaration of class stir::DetectionPosition + \author Kris Thielemans +*/ +#ifndef __stir_DetectionPosition_H__ +#define __stir_DetectionPosition_H__ + +#include "stir/common.h" + +START_NAMESPACE_STIR +/*! \ingroup projdata + \brief + A class for storing coordinates of a detection. + + This encodes where + a gamma photon was detected on a detector array. For example, in a + cylindrical PET scanner, this class stores the crystal where a gamma + was detected. + + The scanner might have more + than 1 detector array (for example a dual-headed system), but this info is + (currently) not in this class. Also, the detector array might be rotating + during acquisition. The corresponding angle is also not in the class. + + This is essentially a collection of 3 numbers: +
          +
        1. \c tangential_coord: a coordinate running tangentially to the + scanner cylinder, and orthogonal to the scanner axis. For a + cylindrical PET scanner, this would be the Detection number in a ring. +
        2. \c axial_coord: a coordinate running along the scanner axis. + For a cylindrical PET scanner, it would correspond to the ring number. +
        3. \c radial_coord: a coordinate 'orthogonal' to the 2 previous ones. This + is only used for scanners with multiple layers of detectors (which would + give Depth Of Interaction information). radial_coord==0 corresponds to + the layer closest to the centre of the scanner. +
        + All 3 coordinates are normally positive, and start with 0. + \todo document directions + + For scanners that do not need 3 coordinates, there is a space overhead + but no performance overhead, except in the comparison functions. + The class is templated to allow for systems with continuous detection. +*/ +template +class DetectionPosition +{ +public: + inline explicit + DetectionPosition(const coordT tangential_coord=0, + const coordT axial_coord=0, + const coordT radial_coord=0); + + inline coordT tangential_coord() const; + inline coordT axial_coord()const; + inline coordT radial_coord()const; + inline coordT& tangential_coord(); + inline coordT& axial_coord(); + inline coordT& radial_coord(); + //! \name comparison operators + //@{ + inline bool operator==(const DetectionPosition&) const; + inline bool operator!=(const DetectionPosition&) const; + //@} +private : + coordT tangential; + coordT axial; + coordT radial; +}; + +END_NAMESPACE_STIR + +#include "stir/DetectionPosition.inl" + +#endif //__DetectionPosition_H__ diff --git a/src/include/stir/DetectionPosition.inl b/src/include/stir/DetectionPosition.inl new file mode 100644 index 0000000000..4dc5a762fa --- /dev/null +++ b/src/include/stir/DetectionPosition.inl @@ -0,0 +1,93 @@ +// +// + +/*! + \file + \ingroup projdata + \brief Implementation of inline methods of class stir::DetectionPosition + \author Kris Thielemans +*/ +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR +template +DetectionPosition:: +DetectionPosition(const coordT tangential_coord, + const coordT axial_coord, + const coordT radial_coord) + : tangential(tangential_coord), + axial(axial_coord), + radial(radial_coord) +{} + +template +coordT +DetectionPosition:: +tangential_coord() const +{ return tangential; } + +template +coordT +DetectionPosition:: +axial_coord()const +{ return axial;} + +template +coordT +DetectionPosition:: +radial_coord()const +{ return radial;} + +template +coordT& +DetectionPosition:: +tangential_coord() +{ return tangential;} + +template +coordT& +DetectionPosition:: +axial_coord() +{ return axial;} + +template +coordT& +DetectionPosition:: +radial_coord() +{ return radial;} + + //! comparison operators +template +bool +DetectionPosition:: +operator==(const DetectionPosition& d) const +{ + return + tangential == d.tangential && + axial == d.axial && + radial == d.radial; +} + +template +bool +DetectionPosition:: +operator!=(const DetectionPosition& d) const +{ return !(*this==d); } + +END_NAMESPACE_STIR + diff --git a/src/include/stir/DetectionPositionPair.h b/src/include/stir/DetectionPositionPair.h new file mode 100644 index 0000000000..b3359bb8f2 --- /dev/null +++ b/src/include/stir/DetectionPositionPair.h @@ -0,0 +1,66 @@ +// +// + +/*! + \file + \ingroup projdata + \brief Declaration of class stir::DetectionPositionPair + \author Kris Thielemans +*/ +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_DetectionPositionPair_H__ +#define __stir_DetectionPositionPair_H__ + +#include "stir/DetectionPosition.h" + +START_NAMESPACE_STIR +/*! + \ingroup projdata + \brief + A class for storing 2 coordinates-sets of a detection, as suitable for PET. + + \see DetectionPosition for details on what we mean with a Detector Position +*/ + +template +class DetectionPositionPair +{ +public: + inline DetectionPositionPair(); + + inline DetectionPositionPair(const DetectionPosition&, + const DetectionPosition&); + + inline const DetectionPosition& pos1() const; + inline const DetectionPosition& pos2() const; + inline DetectionPosition& pos1(); + inline DetectionPosition& pos2(); + //! comparison operators + inline bool operator==(const DetectionPositionPair&) const; + inline bool operator!=(const DetectionPositionPair&) const; + +private : + DetectionPosition p1; + DetectionPosition p2; +}; + +END_NAMESPACE_STIR + +#include "stir/DetectionPositionPair.inl" + +#endif //__DetectionPositionPairPair_H__ diff --git a/src/include/stir/DetectionPositionPair.inl b/src/include/stir/DetectionPositionPair.inl new file mode 100644 index 0000000000..73b0776715 --- /dev/null +++ b/src/include/stir/DetectionPositionPair.inl @@ -0,0 +1,82 @@ +// +// + +/*! + \file + \ingroup projdata + \brief Implementation of inline methods of class stir::DetectionPositionPair + \author Kris Thielemans +*/ +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR +template +DetectionPositionPair:: +DetectionPositionPair() +{} + +template +DetectionPositionPair:: +DetectionPositionPair(const DetectionPosition& pos1, + const DetectionPosition& pos2) + : p1(pos1), p2(pos2) +{} + +template +const DetectionPosition& +DetectionPositionPair:: +pos1() const +{ return p1; } + +template +const DetectionPosition& +DetectionPositionPair:: +pos2() const +{ return p2; } + +template +DetectionPosition& +DetectionPositionPair:: +pos1() +{ return p1; } + +template +DetectionPosition& +DetectionPositionPair:: +pos2() +{ return p2; } + + //! comparison operators +template +bool +DetectionPositionPair:: +operator==(const DetectionPositionPair& p) const +{ + return + (pos1() == p.pos1() && pos2() == p.pos2()) || + (pos1() == p.pos2() && pos2() == p.pos1()) ; +} + +template +bool +DetectionPositionPair:: +operator!=(const DetectionPositionPair& d) const +{ return !(*this==d); } + +END_NAMESPACE_STIR + diff --git a/src/include/stir/DiscretisedDensity.h b/src/include/stir/DiscretisedDensity.h new file mode 100644 index 0000000000..f1886eee6e --- /dev/null +++ b/src/include/stir/DiscretisedDensity.h @@ -0,0 +1,287 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009-07-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_DiscretisedDensity_H__ +#define __stir_DiscretisedDensity_H__ + +/*! + \file + \ingroup densitydata + \brief defines the stir::DiscretisedDensity class + + \author Sanida Mustafovic + \author Kris Thielemans + \author (help from Alexey Zverovich) + \author PARAPET project + + + +*/ + +#include "stir/CartesianCoordinate3D.h" +#include "stir/Array.h" +#include "stir/shared_ptr.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup densitydata + \brief This abstract class is the basis for all image representations. + + This class is templated with the number of dimensions (should be 1, 2 or 3) + and the type of the data. + + It defines functionality common to all discretised densities: the + data structure itself (Array) and an origin. + + \warning The origin is always a CartesianCoordinate3D, + independent of what coordinate system (or even dimension) this + class represents. Similarly, the functions that translate from + indices to physical coordinates assume that the later is 3D. + + Iterative algorithms generally assume that the activity density can + be discretised in some way. That is, the continuous density can be + approximated by having a linear combination of some + basis-functions. The reconstruction problem will try to estimate the + coefficients \f$\lambda_{ijk}\f$ of the discretised density + + \f[ \sum_{ijk} \lambda_{ijk} b_{ijk}({\bar x}) \f] + + The base class corresponding to this kind of data is + DiscretisedDensity. We assume that the set of basisfunctions can be + characterised by 3 indices (ijk) such that i runs over a range of + integers i1..i2, j runs over a similar range that can however depend + on i, and k runs over a similar range that can depend on i and + j. This concept of ranges is embodied in the IndexRange + class. Multi-dimensional arrays which have such ranges are encoded + by the Array class. This forms the data structure for the set of + coefficients of the basisfunctions, hence DiscretisedDensity is + derived from the Array class. + + In most useful cases, the basisfunctions will be translations of a + single function b(x) (although scaling etc could occur depending on + ijk). This means that the discretisation has a certain grid, + corresponding to the centre of the basisfunctions. This structure is + the next level in the image hierarchy. Currently we have the class + DiscretisedDensityOnCartesianGrid to implement the case where the + grid is formed by an orthogonal set of vectors. Another case would + be e.g. DiscretisedDensityOnCylindricalGrid, but we have not + implemented this yet. + + The next level in the hierarchy is then finally the specification of + the basis functions themselves. We currently have only voxels and + pixels, but another useful case would be to use Kaiser-Bessel + functions (so called Blobs). This leads us to the image + hierarchy as shown in the class diagram. + +*/ + +template +class DiscretisedDensity : public Array + +{ +#ifdef SWIG + // work-around swig problem. It gets confused when using a private (or protected) + // typedef in a definition of a public typedef/member + public: +#else + private: +#endif + typedef Array base_type; + typedef DiscretisedDensity self_type; +public: + //! A static member to read an image from file + static DiscretisedDensity * read_from_file(const string& filename); + + //! Construct an empty DiscretisedDensity + inline DiscretisedDensity(); + + //! Construct DiscretisedDensity of a given range of indices & origin + inline DiscretisedDensity(const IndexRange& range, + const CartesianCoordinate3D& origin); + + //! Return the origin + inline const CartesianCoordinate3D& get_origin() const; + + //! Set the origin + inline void set_origin(const CartesianCoordinate3D &origin); + + //! \name Translation between indices and physical coordinates + /*! We distinguish between physical coordinates, relative coordinates (which are + physical coordinates relative to the origin) and index coordinates (which run + over the index range (but are allowed to have float values). + + This class provides 3-way conversion functions. The derived classes have to implement + the actual conversion between relative and index coordinates. + */ + //@{ + //! Return the coordinates of the centre of the basis-function corresponding to \c indices. + /*! The return value is in the same coordinate system as get_origin(). + Implemented as + \code + get_relative_coordinates_for_indices(indices)+get_origin() + \endcode + */ + inline + CartesianCoordinate3D + get_physical_coordinates_for_indices(const BasicCoordinate& indices) const; + + //! Return the coordinates of the centre of the basis-function corresponding to non-integer coordinate in 'index' coordinates. + /*! \see get_physical_coordinates_for_indices(const BasicCoordinate&) + */ + inline + CartesianCoordinate3D + get_physical_coordinates_for_indices(const BasicCoordinate& indices) const; + + //! Return the relative coordinates of the centre of the basis-function corresponding to \c indices. + /*! Implementation uses actual_get_relative_coordinates_for_indices + */ + inline + CartesianCoordinate3D + get_relative_coordinates_for_indices(const BasicCoordinate& indices) const; + + //! Return the relative coordinates of the centre of the basis-function corresponding to the non-integer coordinates in 'index' coordinates. + /*! The return value is relative to the origin. + + Implementation uses actual_get_relative_coordinates_for_indices + \see get_physical_coordinates_for_indices() + */ + inline + CartesianCoordinate3D + get_relative_coordinates_for_indices(const BasicCoordinate& indices) const; + + //! Return the indices of the basis-function closest to the given point. + /*! The input argument should be in the same coordinate system as get_origin(). + Implemented as + \code + get_indices_closest_to_relative_coordinates(coords-get_origin()) + \endcode + */ + inline + BasicCoordinate + get_indices_closest_to_physical_coordinates(const CartesianCoordinate3D& coords) const; + + //! Return the indices of the basis-function closest to the given point. + /*! The input argument should be in 'physical' coordinates relative to the origin. + Implementation uses + stir::round on the result of get_index_coordinates_for_relative_coordinates. + */ + inline + BasicCoordinate + get_indices_closest_to_relative_coordinates(const CartesianCoordinate3D& coords) const; + + //! Return the indices of the basis-function closest to the given point. + /*! The input argument should be in 'physical' coordinates. + Implementation uses get_index_coordinates_for_relative_coordinates. + */ + inline + BasicCoordinate + get_index_coordinates_for_physical_coordinates(const CartesianCoordinate3D& coords) const; + + //! Return the index-coordinates of the basis-function closest to the given point. + /*! The input argument should be in 'physical' coordinates relative to the origin. + Implementation uses actual_get_index_coordinates_for_relative_coordinates. + */ + inline + BasicCoordinate + get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D& coords) const; + + //@} + + //! Allocate a new DiscretisedDensity object with same characteristics as the current one. + virtual DiscretisedDensity* get_empty_copy() const = 0; + + //! Allocate a new DiscretisedDensity object which is a copy of the current one. + virtual DiscretisedDensity* clone() const = 0; + + //! Allocate a new DiscretisedDensity object with same characteristics as the current one. + //*! \deprecated Use get_empty_copy() instead + DiscretisedDensity* get_empty_discretised_density() const + { return get_empty_copy(); } + + //! \name Equality + //@{ + //! Checks if the 2 objects have the same type, index range, origin etc + /*! If they do \c not have the same characteristics, the string \a explanation + explains why. + */ + inline bool + has_same_characteristics(self_type const&, + string& explanation) const; + + //! Checks if the 2 objects have the same type, index range, origin etc + /*! Use this version if you do not need to know why they do not match. + */ + inline bool + has_same_characteristics(self_type const&) const; + + //! check equality (data has to be identical) + /*! Uses has_same_characteristics() and Array::operator==. + \warning This function uses \c ==, which might not be what you + need to check when \c elemT has data with float or double numbers. + */ + inline bool operator ==(const self_type&) const; + + //! negation of operator== + inline bool operator !=(const self_type&) const; + //@} + + protected: + //! Implementation used by has_same_characteristics + /*! \warning Has to be overloaded by the derived classes to check for other + parameters. Also, the overloaded function has to call the current one. + + \par Developer's note + + We need this function as C++ rules say that if you overload a function, you hide all + functions of the same name. + */ + virtual bool + actual_has_same_characteristics(DiscretisedDensity const&, + string& explanation) const; + + //! Implementation used by get_relative_coordinates_for_indices + /*! \par Developer's note + + We need this function as C++ rules say that if you overload a function, you hide all + functions of the same name. + */ + virtual + CartesianCoordinate3D + actual_get_relative_coordinates_for_indices(const BasicCoordinate& indices) const = 0; + + virtual + BasicCoordinate + actual_get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D& coords) const = 0; + +private: + CartesianCoordinate3D origin; + +}; + +END_NAMESPACE_STIR + +#include "stir/DiscretisedDensity.inl" +#endif diff --git a/src/include/stir/DiscretisedDensity.inl b/src/include/stir/DiscretisedDensity.inl new file mode 100644 index 0000000000..b38dcd3dfb --- /dev/null +++ b/src/include/stir/DiscretisedDensity.inl @@ -0,0 +1,205 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009-07-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup densitydata + \brief inline implementation for stir::DiscretisedDensity + + \author Sanida Mustafovic + \author Kris Thielemans + \author (help from Alexey Zverovich) + \author PARAPET project + + +*/ +#include "stir/round.h" +#include +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif +#include + +START_NAMESPACE_STIR + +template +DiscretisedDensity::DiscretisedDensity() +{} + +template +DiscretisedDensity:: +DiscretisedDensity(const IndexRange& range_v, + const CartesianCoordinate3D& origin_v) + : Array(range_v), + origin(origin_v) +{} + +template +void +DiscretisedDensity:: +set_origin(const CartesianCoordinate3D &origin_v) +{ + origin = origin_v; +} + +template +const CartesianCoordinate3D& +DiscretisedDensity:: +get_origin() const +{ return origin; } + + +template +bool +DiscretisedDensity:: +actual_has_same_characteristics(DiscretisedDensity const& other, + string& explanation) const +{ + if (typeid(other) != typeid(*this)) + { + explanation = "Different type of data"; + return false; + } + + if (norm(other.get_origin() - this->get_origin()) > 1.E-2) + { + explanation = "Not the same origin."; + return false; + } + if (other.get_index_range() != this->get_index_range()) + { + explanation = "Not the same index ranges."; + return false; + } + return true; +} + +template +bool +DiscretisedDensity:: +has_same_characteristics(DiscretisedDensity const& other, + string& explanation) const +{ + return this->actual_has_same_characteristics(other, explanation); +} + +template +bool +DiscretisedDensity:: +has_same_characteristics(DiscretisedDensity const& other) const +{ + std::string explanation; + return this->actual_has_same_characteristics(other, explanation); +} + +template +bool +DiscretisedDensity:: +operator ==(const self_type& that) const +{ + return + this->has_same_characteristics(that) && + base_type::operator==(that); +} + +template +bool +DiscretisedDensity:: +operator !=(const self_type& that) const +{ + return !((*this) == that); +} + +template +CartesianCoordinate3D +DiscretisedDensity:: +get_relative_coordinates_for_indices(const BasicCoordinate& indices) const +{ + return + this-> + actual_get_relative_coordinates_for_indices(BasicCoordinate(indices)); +} + +template +CartesianCoordinate3D +DiscretisedDensity:: +get_relative_coordinates_for_indices(const BasicCoordinate& indices) const +{ + return + this-> + actual_get_relative_coordinates_for_indices(indices); +} + +template +BasicCoordinate +DiscretisedDensity:: +get_index_coordinates_for_physical_coordinates(const CartesianCoordinate3D& coords) const +{ + return + this->actual_get_index_coordinates_for_relative_coordinates(coords - this->get_origin()); +} + +template +BasicCoordinate +DiscretisedDensity:: +get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D& coords) const +{ + return + this->actual_get_index_coordinates_for_relative_coordinates(coords); +} + +template +BasicCoordinate +DiscretisedDensity:: +get_indices_closest_to_relative_coordinates(const CartesianCoordinate3D& coords) const +{ + return + round(this->actual_get_index_coordinates_for_relative_coordinates(coords)); +} + +template +CartesianCoordinate3D +DiscretisedDensity:: +get_physical_coordinates_for_indices(const BasicCoordinate& indices) const +{ + return + this->get_relative_coordinates_for_indices(indices) + this->get_origin(); +} + +template +CartesianCoordinate3D +DiscretisedDensity:: +get_physical_coordinates_for_indices(const BasicCoordinate& indices) const +{ + return + this->get_relative_coordinates_for_indices(indices) + this->get_origin(); +} + + +template +BasicCoordinate +DiscretisedDensity:: +get_indices_closest_to_physical_coordinates(const CartesianCoordinate3D& coords) const +{ + return + this->get_indices_closest_to_relative_coordinates(coords - this->get_origin()); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/DiscretisedDensityOnCartesianGrid.h b/src/include/stir/DiscretisedDensityOnCartesianGrid.h new file mode 100644 index 0000000000..0c52f94e33 --- /dev/null +++ b/src/include/stir/DiscretisedDensityOnCartesianGrid.h @@ -0,0 +1,111 @@ +// +// +#ifndef __stir_DiscretisedDensityOnCartesianGrid_H__ +#define __stir_DiscretisedDensityOnCartesianGrid_H__ +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + Copyright (C) 2000 PARAPET partners + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup densitydata + + \brief defines the stir::DiscretisedDensityOnCartesianGrid class + + \author Sanida Mustafovic + \author Kris Thielemans + \author (help from Alexey Zverovich) + \author PARAPET project + + +*/ +#include "stir/DiscretisedDensity.h" + +START_NAMESPACE_STIR + +/*! + \ingroup densitydata + \brief This abstract class is the basis for images on a Cartesian grid. + + The only new information compared to DiscretisedDensity is the grid_spacing. + This is currently a BasicCoordinate object. + It really should be CartesianCoordinate object, but + we don't have such a class (as we can't provide names for the coordinates + in the n-dimensional case.) +*/ + +template +class DiscretisedDensityOnCartesianGrid:public DiscretisedDensity +{ +private: + typedef + DiscretisedDensity + base_type; +public: + //! Construct an empty DiscretisedDensityOnCartesianGrid + inline DiscretisedDensityOnCartesianGrid(); + + //! Constructor given range, grid spacing and origin + inline DiscretisedDensityOnCartesianGrid(const IndexRange& range, + const CartesianCoordinate3D& origin, + const BasicCoordinate& grid_spacing); + + //! Return the grid_spacing + inline const BasicCoordinate& get_grid_spacing() const; + + //! Set the grid_spacing + inline void set_grid_spacing(const BasicCoordinate& grid_spacing_v); + + +protected: + virtual inline bool + actual_has_same_characteristics(DiscretisedDensity const&, + string& explanation) const; + + //! Return the relative coordinates of the centre of the basis-function corresponding to \c indices. + /*! The return value is relative to the origin. + \see get_relative_coordinates_for_indices + + If \c num_dimensions is not 3, then the indices are assumed to correspond + to the lowest dimensions. + + \todo cope with non-standard orientations + */ + virtual inline + CartesianCoordinate3D + actual_get_relative_coordinates_for_indices(const BasicCoordinate& indices) const; + + //! Return the indices of the basis-function closest to the given point. + /*! The input argument should be relative to the origin. + \see get_index_coordinates_for_relative_coordinates + + If \c num_dimensions is not 3, then the indices coordinates are assumed to correspond + to the lowest dimensions. + + \todo cope with non-standard orientations + */ + virtual inline + BasicCoordinate + actual_get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D& coords) const; + +private: + BasicCoordinate grid_spacing; +}; + +END_NAMESPACE_STIR + +#include "stir/DiscretisedDensityOnCartesianGrid.inl" +#endif diff --git a/src/include/stir/DiscretisedDensityOnCartesianGrid.inl b/src/include/stir/DiscretisedDensityOnCartesianGrid.inl new file mode 100644 index 0000000000..8e768d7468 --- /dev/null +++ b/src/include/stir/DiscretisedDensityOnCartesianGrid.inl @@ -0,0 +1,134 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup densitydata + \brief inline implementations for stir::DiscretisedDensityOnCartesianGrid + + \author Sanida Mustafovic + \author Kris Thielemans + \author (help from Alexey Zverovich) + \author PARAPET project + + +*/ +#include "stir/round.h" + +START_NAMESPACE_STIR + +template +DiscretisedDensityOnCartesianGrid:: +DiscretisedDensityOnCartesianGrid() +: DiscretisedDensity(),grid_spacing() +{ +#ifndef STIR_NO_NAMESPACES + std::fill(grid_spacing.begin(), grid_spacing.end(), 0.F); +#else + // hopefully your compiler understands this. + // It attempts to avoid conflicts with Array::fill + ::fill(grid_spacing.begin(), grid_spacing.end(), 0.F); +#endif +} + +template +DiscretisedDensityOnCartesianGrid:: +DiscretisedDensityOnCartesianGrid +(const IndexRange& range_v, + const CartesianCoordinate3D& origin_v, + const BasicCoordinate& grid_spacing_v) + : DiscretisedDensity(range_v,origin_v), + grid_spacing(grid_spacing_v) +{} + +template +const BasicCoordinate& +DiscretisedDensityOnCartesianGrid:: +get_grid_spacing() const +{ return grid_spacing; } + +template +void +DiscretisedDensityOnCartesianGrid:: +set_grid_spacing(const BasicCoordinate& grid_spacing_v) +{ + grid_spacing = grid_spacing_v; +} + +template +bool +DiscretisedDensityOnCartesianGrid:: +actual_has_same_characteristics(DiscretisedDensity const& other_of_base_type, + string& explanation) const +{ + if (!base_type::actual_has_same_characteristics(other_of_base_type, explanation)) + return false; + + DiscretisedDensityOnCartesianGrid const& other = + dynamic_cast const&> + (other_of_base_type); + + // we can now check on grid_spacing + if (norm(other.get_grid_spacing() - this->get_grid_spacing()) > 1.E-4F*norm(this->get_grid_spacing())) + { + char tmp[2000]; + sprintf(tmp, "Not the same grid spacing: (%g,%g,%g) and (%g,%g,%g)", + other.get_grid_spacing()[1], + num_dimensions>1?other.get_grid_spacing()[2]:0., + num_dimensions>2?other.get_grid_spacing()[3]:0., + this->get_grid_spacing()[1], + num_dimensions>1?this->get_grid_spacing()[2]:0., + num_dimensions>2?this->get_grid_spacing()[3]:0.); + return false; + } + + return true; +} + +template +CartesianCoordinate3D +DiscretisedDensityOnCartesianGrid:: +actual_get_relative_coordinates_for_indices(const BasicCoordinate& indices) const +{ + const BasicCoordinate coord = + this->get_grid_spacing() * indices; + + return + CartesianCoordinate3D(num_dimensions>2?coord[num_dimensions-2]:0, + num_dimensions>1?coord[num_dimensions-1]:0, + coord[num_dimensions]); +} + +template +BasicCoordinate +DiscretisedDensityOnCartesianGrid:: +actual_get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D& coords) const +{ + BasicCoordinate float_indices; + // make sure that float_indices[d] = coords[d3=d+inc], with + // with inc such that if d=num_dimensions, d+inc=3, + // so inc=3-num_dimensions and hence d3=d+3-num_dimensions + for (int d=1, d3=4-num_dimensions; d<= num_dimensions; ++d, ++d3) + { + float_indices[d] = d3>0 ? coords[d3]:0; + } + return float_indices / this->get_grid_spacing(); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/DynamicDiscretisedDensity.h b/src/include/stir/DynamicDiscretisedDensity.h new file mode 100644 index 0000000000..e9715d6601 --- /dev/null +++ b/src/include/stir/DynamicDiscretisedDensity.h @@ -0,0 +1,233 @@ +// +// +/*! + \file + \ingroup densitydata + \brief Declaration of class stir::DynamicDiscretisedDensity + \author Kris Thielemans + \author Charalampos Tsoumpas + \author Nicolas Karakatsanis + +*/ +/* + Copyright (C) 2005 - 2011-01-12, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_DynamicDiscretisedDensity_H__ +#define __stir_DynamicDiscretisedDensity_H__ + +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/Scanner.h" +#include "stir/NestedIterator.h" +#include +#include + +START_NAMESPACE_STIR + +class Succeeded; + +/*! \ingroup buildblock + \brief Class of multiple image frames, one for each time frame + Each time frame is a DiscretisedDensity<3,float> + + \todo template in \c elemT and numDimensions? + */ +class DynamicDiscretisedDensity +{ + public: + typedef DiscretisedDensity<3,float> singleDiscDensT; + private: + //! typedef for the private member that stores the densities (one for each time frame) + typedef std::vector > DensitiesT; + public: + //! typedef for iterator that runs over all densels in all frames + typedef NestedIterator > full_iterator; + //! typedef for const iterator that runs over all densels in all frames + typedef NestedIterator > const_full_iterator; + + static + DynamicDiscretisedDensity* + read_from_file(const std::string& filename); + + DynamicDiscretisedDensity() {} + + DynamicDiscretisedDensity(const DynamicDiscretisedDensity&argument); + + DynamicDiscretisedDensity(const TimeFrameDefinitions& time_frame_definitions, + const double scan_start_time_in_secs_since_1970, + const shared_ptr& scanner_sptr) + { + _densities.resize(time_frame_definitions.get_num_frames()); + _time_frame_definitions=time_frame_definitions; + _start_time_in_secs_since_1970=scan_start_time_in_secs_since_1970; + _calibration_factor=-1.F; + _isotope_halflife=-1.F; + _scanner_sptr=scanner_sptr; + } + //! Construct an empty DynamicDiscretisedDensity based on a shared_ptr > + DynamicDiscretisedDensity(const TimeFrameDefinitions& time_frame_definitions, + const double scan_start_time_in_secs_since_1970, + const shared_ptr& scanner_sptr, + const shared_ptr& density_sptr) + { + _densities.resize(time_frame_definitions.get_num_frames()); + _time_frame_definitions=time_frame_definitions; + _start_time_in_secs_since_1970=scan_start_time_in_secs_since_1970; + _calibration_factor=-1.F; + _isotope_halflife=-1.F; + _scanner_sptr=scanner_sptr; + + for (unsigned int frame_num=0; frame_num_densities[frame_num].reset(density_sptr->get_empty_discretised_density()); + } + + //! Construct an empty DynamicDiscretisedDensity based on a shared_ptr > + DynamicDiscretisedDensity(const TimeFrameDefinitions& time_frame_definitions, + const unsigned int& num_conv_params, + const double scan_start_time_in_secs_since_1970, + const shared_ptr& scanner_sptr, + const shared_ptr& density_sptr) + { + _densities.resize(num_conv_params); + _time_frame_definitions=time_frame_definitions; + _start_time_in_secs_since_1970=scan_start_time_in_secs_since_1970; + _calibration_factor=-1.F; + _isotope_halflife=-1.F; + _scanner_sptr=scanner_sptr; + + for (unsigned int conv_point=0; conv_point_densities[conv_point].reset(density_sptr->get_empty_discretised_density()); + } + + + DynamicDiscretisedDensity& + operator=(const DynamicDiscretisedDensity& argument); + + /*! @name functions returning full_iterators + These return iterators that run through all elements in all time frames. + */ + //@{ + inline full_iterator begin_all(); + inline const_full_iterator begin_all() const; + inline const_full_iterator begin_all_const() const; + inline full_iterator end_all(); + inline const_full_iterator end_all() const; + inline const_full_iterator end_all_const() const; + //@} + + /*! \name get/set the densities + \warning The frame_num starts from 1 + */ + //@{ + /*! + \warning This function is likely to disappear later, and is dangerous to use. + */ + void + set_density_sptr(const shared_ptr& density_sptr, + const unsigned int frame_num); + /* + DynamicDiscretisedDensity( TimeFrameDefinitions time_frame_defintions,shared_ptr, + std::vector > _densities); + */ + + const std::vector > & + get_densities() const ; + + const singleDiscDensT & + get_density(const unsigned int frame_num) const ; + + const singleDiscDensT & + operator[](const unsigned int frame_num) const + { return this->get_density(frame_num); } + + singleDiscDensT & + get_density(const unsigned int frame_num); + + singleDiscDensT & + operator[](const unsigned int frame_num) + { return this->get_density(frame_num); } + //@} + + const float get_isotope_halflife() const; + + const float get_calibration_factor() const; + + //! Return time of start of scan + /*! \return the time in seconds since 1 Jan 1970 00:00 UTC, i.e. independent + of your local time zone. + + Note that the return type is a \c double. This allows for enough accuracy + for a long time to come. It also means that the start time can have fractional + seconds. + + The time frame definitions should be relative to this time. + */ + const double get_start_time_in_secs_since_1970() const; + + const float get_scanner_default_bin_size() const; + + void set_time_frame_definitions(const TimeFrameDefinitions& time_frame_definitions) + {this->_time_frame_definitions=time_frame_definitions;} + + void resize_densities(const TimeFrameDefinitions& time_frame_definitions) + { + this->set_time_frame_definitions(time_frame_definitions); + unsigned int num_densities=this->_time_frame_definitions.get_num_time_frames(); + this->_densities.resize(num_densities); + } + + const TimeFrameDefinitions & + get_time_frame_definitions() const ; + + unsigned get_num_time_frames() const + { + return this->get_time_frame_definitions().get_num_time_frames(); + } + + /*! \brief write data to file + Currently only in ECAT7 format. + \warning write_time_frame_definitions() is not yet implemented, so time information is missing. + */ + Succeeded + write_to_ecat7(const std::string& filename) const; + + void calibrate_frames() const ; + /*! + \warning This function should be used only if the _decay_corrected is false. Time of a frame is taken as the mean time for each frame which is an accurate approximation only if frame_duration <<< isotope_halflife. + */ + void decay_correct_frames() ; + void set_if_decay_corrected(const bool is_decay_corrected) ; + void set_isotope_halflife(const float isotope_halflife); + void set_calibration_factor(const float calibration_factor) ; + private: + // warning: if adding any new members, you have to change the copy constructor as well. + TimeFrameDefinitions _time_frame_definitions; + DensitiesT _densities; + shared_ptr _scanner_sptr; + float _calibration_factor; + float _isotope_halflife; + bool _is_decay_corrected; + double _start_time_in_secs_since_1970; +}; + +END_NAMESPACE_STIR + +#include "stir/DynamicDiscretisedDensity.inl" + +#endif //__stir_DynamicDiscretisedDensity_H__ diff --git a/src/include/stir/DynamicDiscretisedDensity.inl b/src/include/stir/DynamicDiscretisedDensity.inl new file mode 100644 index 0000000000..74bd35378d --- /dev/null +++ b/src/include/stir/DynamicDiscretisedDensity.inl @@ -0,0 +1,61 @@ +// +// +/*! + \file + \ingroup densitydata + \brief Inline implementations of class stir::DynamicDiscretisedDensity + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ +/* + Copyright (C) 2005- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +START_NAMESPACE_STIR + +DynamicDiscretisedDensity::full_iterator DynamicDiscretisedDensity::begin_all() +{ + return full_iterator(this->_densities.begin(), this->_densities.end()); +} + +DynamicDiscretisedDensity::const_full_iterator DynamicDiscretisedDensity::begin_all() const +{ + return const_full_iterator(this->_densities.begin(), this->_densities.end()); +} + +DynamicDiscretisedDensity::const_full_iterator DynamicDiscretisedDensity::begin_all_const() const +{ + return const_full_iterator(this->_densities.begin(), this->_densities.end()); +} + +DynamicDiscretisedDensity::full_iterator DynamicDiscretisedDensity::end_all() +{ + return full_iterator(this->_densities.end(), this->_densities.end()); +} + +DynamicDiscretisedDensity::const_full_iterator DynamicDiscretisedDensity::end_all() const +{ + return const_full_iterator(this->_densities.end(), this->_densities.end()); +} + +DynamicDiscretisedDensity::const_full_iterator DynamicDiscretisedDensity::end_all_const() const +{ + return const_full_iterator(this->_densities.end(), this->_densities.end()); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/DynamicProjData.h b/src/include/stir/DynamicProjData.h new file mode 100644 index 0000000000..8760731672 --- /dev/null +++ b/src/include/stir/DynamicProjData.h @@ -0,0 +1,130 @@ +/* + Copyright (C) 2005 - 2011-01-04, Hammersmith Imanet Ltd + Copyright (C) 2013, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir__DynamicProjData__H__ +#define __stir__DynamicProjData__H__ +/*! + \file + \ingroup data_buildblock + \brief Declaration of class stir::DynamicProjData + \author Kris Thielemans +*/ +#include "stir/MultipleProjData.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/SegmentByView.h" +#include "stir/Succeeded.h" +#include + +START_NAMESPACE_STIR + +class Succeeded; +//! Dynamic projection data +/*! \ingroup buildblock + Somewhat preliminary + + \todo Move read_from_file, write_to_ecat7 to usual registry methods + \todo Interfile support currently doesn't set start_time_in_secs_since_1970 +*/ +class DynamicProjData : + public MultipleProjData +{ +public: + static + DynamicProjData* + read_from_file(const std::string& filename); + + DynamicProjData() {} + + DynamicProjData(const shared_ptr& exam_info_sptr) + : MultipleProjData(exam_info_sptr) + { + } + + //! Return time of start of scan + /*! \return the time in seconds since 1 Jan 1970 00:00 UTC, i.e. independent + of your local time zone. + + Note that the return type is a \c double. This allows for enough accuracy + for a long time to come. It also means that the start time can have fractional + seconds. + + The time frame definitions should be relative to this time. + */ + const double get_start_time_in_secs_since_1970() const; + + //! set start of scan + /*! \see get_start_time_in_secs_since_1970() + */ + void set_start_time_in_secs_since_1970(const double start_time); + unsigned int get_num_frames() const + { + return this->get_num_proj_data(); + } + + Succeeded + write_to_ecat7(const std::string& filename) const; + + void set_time_frame_definitions(const TimeFrameDefinitions& time_frame_definitions); + + const TimeFrameDefinitions& get_time_frame_definitions() const; + + //! multiply data with a constant factor + /*! \warning for most types of data, this will modify the data on disk */ + void + calibrate_frames(const float cal_factor) + { + for ( unsigned int frame_num = 1 ; frame_num<=this->get_time_frame_definitions().get_num_frames() ; ++frame_num ) + for (int segment_num = (this->_proj_datas[frame_num-1])->get_min_segment_num(); + segment_num <= (this->_proj_datas[frame_num-1])->get_max_segment_num(); ++segment_num) + { + SegmentByView segment_by_view + ((*(this->_proj_datas[frame_num-1])).get_segment_by_view(segment_num)); + segment_by_view *= cal_factor; + if ((*(this->_proj_datas[frame_num-1])).set_segment(segment_by_view) + ==Succeeded::no) + { + error("DynamicProjData:calibrate_frames failed because set_segment_by_view failed"); + } + } + } + + //! divide data with the corresponding frame duration + /*! \warning for most types of data, this will modify the data on disk */ + void + divide_with_duration() + { + // do reading/writing in a loop over segments + for(unsigned int frame_num=1;frame_num<=this->get_time_frame_definitions().get_num_frames();++frame_num) + for (int segment_num = (this->_proj_datas[frame_num-1])->get_min_segment_num(); + segment_num <= (this->_proj_datas[frame_num-1])->get_max_segment_num(); ++segment_num) + { + SegmentByView segment_by_view = + (*(this->_proj_datas[frame_num-1])).get_segment_by_view(segment_num); + segment_by_view /= static_cast(this->get_time_frame_definitions().get_duration(frame_num)); + if ((*(this->_proj_datas[frame_num-1])).set_segment(segment_by_view) + ==Succeeded::no) + { + error("DynamicProjData:calibrate_frames failed because set_segment_by_view failed"); + } + + } + } +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/ExamInfo.h b/src/include/stir/ExamInfo.h new file mode 100644 index 0000000000..2b3a0f60ea --- /dev/null +++ b/src/include/stir/ExamInfo.h @@ -0,0 +1,74 @@ +/* + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief This file declares the class stir::ExamInfo + \author Kris Thielemans +*/ + + +#ifndef __stir_ExamInfo_H__ +#define __stir_ExamInfo_H__ + +#include "stir/PatientPosition.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/ImagingModality.h" + +START_NAMESPACE_STIR + + +/*! + \brief a class for storing information about 1 exam (or scan) + \ingroup buildblock + \todo this is very incomplete at the moment. Things like bed positions, gating, isotopes etc etc are all missing + */ +class ExamInfo +{ + +public : + + //! Default constructor + /*! Most fields take there default values (much might be invalid). + \a start_time_in_secs_since_1970 is set to zero to + indicate that it is not initialised. + */ + + ExamInfo() + : start_time_in_secs_since_1970(0.) + {} + + std::string originating_system; + + ImagingModality imaging_modality; + + PatientPosition patient_position; + + TimeFrameDefinitions time_frame_definitions; + + double start_time_in_secs_since_1970; + + + void set_time_frame_definitions(const TimeFrameDefinitions& new_time_frame_definitions) + { + time_frame_definitions = new_time_frame_definitions; + } +}; + +END_NAMESPACE_STIR + +#endif // __stir_ExamInfo_H__ diff --git a/src/include/stir/FactoryRegistry.h b/src/include/stir/FactoryRegistry.h new file mode 100644 index 0000000000..e48522aecb --- /dev/null +++ b/src/include/stir/FactoryRegistry.h @@ -0,0 +1,119 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Declaration of class stir::FactoryRegistry + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2001- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_FactoryRegistry_H__ +#define __stir_FactoryRegistry_H__ + + +#include "stir/common.h" +#include +#include +#include + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief This class can be used to store 'factories' and their corresponding + keys. It is essentially a map, but with some extra embelishments. + + A factory is supposed to be an object which can create another object, + although this is not really enfored by the implementation of + FactoryRegistry. + + \par Type requirements + + Key,Factory,Compare must be suitable as defined for std::map. In addition, + FactoryRegistry::list_keys() requires that operator<<(ostream&, const Key&) + is defined. + + \todo Probably it would be better to store pointers to factories. However, + in that case, the destructor of FactoryRegistry would have to deallocate + these factory objects. This would mean that factories have to be allocated + with new, and hence would prevent using simple function pointers. +*/ +template > +class FactoryRegistry +{ + +public: + // sadly, all of these have to be inline to prevent problems + // with instantiation + + + //! Default constructor without defaults (see find_factory()) + inline FactoryRegistry(); + /*! \brief + constructor with default values which will be returned when no + match is found (see find_factory()) + */ + inline FactoryRegistry(const Key& default_key, + const Factory& default_factory); + + inline ~FactoryRegistry(); + + + /*! \brief + Add a pair to the registry + + Adding the same key twice will overwrite the first value. + */ + inline void add_to_registry(const Key& key,Factory const & factory); + + //! Remove a pair from the registry + inline void remove_from_registry(const Key& key); + + //! List all keys to an ostream, separated by newlines. + inline void list_keys(std::ostream& s) const; + + //! Find a factory corresponding to a key + /*! If the key is not found, the behaviour depends on which constructor + was used. If the (default) no-argument constructor is used, an + error message is printed, and the program aborts. + If the 2nd constructor with default values, the default_factory is + returned. + */ + inline Factory const & find_factory(const Key& key) const; + +private: + typedef std::map FactoryMap; + FactoryMap m; + const bool has_defaults; + const Key default_key; + const Factory default_factory; + +}; + + +END_NAMESPACE_STIR + +#include "stir/FactoryRegistry.inl" + + +#endif diff --git a/src/include/stir/FactoryRegistry.inl b/src/include/stir/FactoryRegistry.inl new file mode 100644 index 0000000000..bfa8e84830 --- /dev/null +++ b/src/include/stir/FactoryRegistry.inl @@ -0,0 +1,140 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Inline implementations for stir::FactoryRegistry + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2001- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include +#include + +START_NAMESPACE_STIR + +template +FactoryRegistry::FactoryRegistry() +: has_defaults(false) +{} + + +template +FactoryRegistry::FactoryRegistry(const Key& default_key, + const Factory& default_factory) +: has_defaults(true), + default_key(default_key), + default_factory(default_factory) +{ + add_to_registry(default_key, default_factory); +} + +template +FactoryRegistry::~FactoryRegistry() +{ +// TODO not so sure how to get rid of them +// we can only use delete if the factories are allocated with new +// and that's currently not the case +// for (FactoryMap::iterator i = m.begin(); i != m.end(); ++i) +// delete i->second; +} + +template +void +FactoryRegistry:: +add_to_registry(const Key& key, Factory const & factory) +{ + //cerr << "Adding "<< key << "to registry\n"; +#ifndef NDEBUG + typename FactoryMap::iterator iter = m.find(key); + if (iter != m.end()) + { + warning(boost::format("FactoryRegistry:: overwriting previous value of key in registry.\n" + " key: %1%") % key); + } + +#endif + m.insert(std::pair(key, factory)); +} + +template +void +FactoryRegistry:: +remove_from_registry(const Key& key) +{ + //cerr << "Removing "<< key << "to registry\n"; + typename FactoryMap::iterator iter = m.find(key); + if (iter == m.end()) + { +#ifndef _NDEBUG + // TODO don't output to cerr, but use only warning() + warning(boost::format("FactoryRegistry:: Attempt to remove key from registry, but it's not in there...\n" + " key: %1%") % key); +#endif + } + else + m.erase(iter); + +} + +template +void +FactoryRegistry:: +list_keys(std::ostream& s) const +{ + for (typename FactoryMap::const_iterator i = m.begin(); i != m.end(); ++i) + s << i->first << '\n'; +} + +template +Factory const & +FactoryRegistry:: +find_factory(const Key& key) const /*throw(unknown_typename)*/ +{ + typename FactoryMap::const_iterator i = m.find(key); + if (i != m.end()) + return i->second; + + // key not found + + // throw(unknown_typename(key)); + // TODO don't output to cerr, but use only error() + std::cerr << "FactoryRegistry: key " << key << " not found in current registry\n" + << m.size() << " possible values are:\n"; + list_keys(std::cerr); + std::cerr << '\n'; + if (has_defaults) + { + std::cerr << "Using value corresponding to key \"" << default_key << "\""< + +START_NAMESPACE_STIR + +/*! + \ingroup Array + \brief Class FullArrayIterator implements (forward) iterators that go + through all elements of an Array. + + \warning This class should never be used explicitly, but only through + the typedefs Array::full_iterator et al. + + \warning This class is effectively superseded by NestedIterator, although Array still uses FullArrayIterator. + + This implementation assumes that \a restiterT has begin_all() and end_all() members. + Moreover, for the usual \c for loops to work, there is a requirement on how the + class that uses FullArrayIterator implements end_all(). See the implementation of + Array::end_all(). + + \internal +*/ +template +class FullArrayIterator +{ +public: + typedef std::forward_iterator_tag iterator_category; + typedef std::ptrdiff_t difference_type; + + typedef elemT value_type; + typedef _Ref reference; + typedef _Ptr pointer; + +public: + //! default constructor + inline FullArrayIterator(); + + //! copy constructor + inline FullArrayIterator(const FullArrayIterator&); + + //! constructor to initialise the members + inline FullArrayIterator(const topleveliterT& top_level_iter, + const topleveliterT& last_top_level_iter, + const restiterT& rest_iter, + const restiterT& last_rest_iter); + + //! some magic trickery to be able to assign iterators to const iterators etc, but not to incompatible types + /*! Ignore the 2nd and 3rd argument. They are there to let the compiler check if the types are + convertible (using the SFINAE principle). + */ + template + FullArrayIterator( + FullArrayIterator const& other, + typename boost::enable_if_convertible::type* = 0, + typename boost::enable_if_convertible::type* = 0) + : current_top_level_iter(other.current_top_level_iter), + last_top_level_iter(other.last_top_level_iter), + current_rest_iter(other.current_rest_iter), + last_rest_iter(other.last_rest_iter) + {} + + + //! constructor with 0 (only 0, not another number) + /*! This is necessary to be able to set \a current_rest_iter in the case of + an empty range. This should be used by Array::begin_all() and Array::end_all() + such that for an empty array, these 2 (full)iterators are guaranteed to be equal. + + Ideally, Array::end_all() would just call restiterT(). + However, when going down the recursion, you will end up with the '1D' case + where restiterT is an ordinary iterator, which in the case of Array<1,elemT> + is just an elemT*. Its default constructor does nothing. + + All these complications could be avoided by rewriting operator== as + indicated in the code there, but at the expense of worse performance. + */ + inline FullArrayIterator(unsigned); + + // assignment is generated by compiler + //inline FullArrayIterator& operator=(const FullArrayIterator&); + + //! prefix increment + inline FullArrayIterator& operator++(); + + //! postfix increment + inline FullArrayIterator operator++(int); + + //! comparison operator + inline bool operator==(const FullArrayIterator&) const; + inline bool operator!=(const FullArrayIterator&) const; + + //! dereferencing operator + inline reference operator*() const; + + //! member-selection operator + inline pointer operator->() const; + +# ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS +public: +#else +private: + // needed for conversion constructor + template friend class FullArrayIterator; +#endif + + //! the \c topleveliterT iterator pointing to the current \a row + topleveliterT current_top_level_iter; + + //! a \c topleveliterT iterator marking the end of the \a column + topleveliterT last_top_level_iter; + + //! a \c restiterT iterator pointing to the current \a element in the \a row + restiterT current_rest_iter; + + //! a \c restiterT iterator pointing to the end of the current \a row + restiterT last_rest_iter; + +}; + +END_NAMESPACE_STIR + +#include "stir/FullArrayIterator.inl" + +#endif diff --git a/src/include/stir/FullArrayIterator.inl b/src/include/stir/FullArrayIterator.inl new file mode 100644 index 0000000000..4de3ace9e4 --- /dev/null +++ b/src/include/stir/FullArrayIterator.inl @@ -0,0 +1,162 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup Array + \brief inline implementations for stir::FullArrayIterator. + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + + + +*/ + +START_NAMESPACE_STIR + +template +FullArrayIterator:: + FullArrayIterator() + : current_top_level_iter(0), + last_top_level_iter(0), + current_rest_iter(), + last_rest_iter() +{} + +template +FullArrayIterator:: + FullArrayIterator(unsigned +#ifndef NDEBUG + param // only give the parameter a name in debug mode to avoid compiler warning +#endif + ) + : current_top_level_iter(0), + last_top_level_iter(0), + current_rest_iter(0), + last_rest_iter(0) +{ + assert(param==0); +} + +template +FullArrayIterator:: + FullArrayIterator(const topleveliterT& top_level_iter, + const topleveliterT& last_top_level_iter, + const restiterT& rest_iter, + const restiterT& last_rest_iter) + : current_top_level_iter(top_level_iter), + last_top_level_iter(last_top_level_iter), + current_rest_iter(rest_iter), + last_rest_iter(last_rest_iter) +{} + +template +FullArrayIterator:: +FullArrayIterator(const FullArrayIterator& iter2) + : current_top_level_iter(iter2.current_top_level_iter), + last_top_level_iter(iter2.last_top_level_iter), + current_rest_iter(iter2.current_rest_iter), + last_rest_iter(iter2.last_rest_iter) +{} + + +template +bool +FullArrayIterator + ::operator==(const FullArrayIterator& iter2) const +{ + return + current_top_level_iter == iter2.current_top_level_iter && + current_rest_iter == iter2.current_rest_iter; + + /* alternative: + comparing rest_iter is only necessary when the first iterator is not + at the end. However, this is the most common case, so the + implementation above is faster as it has one test less. + However, the above relies on the fact that incrementing the iterator + ends up exactly in end_all(). + + current_top_level_iter == iter2.current_top_level_iter && + ( current_top_level_iter != last_top_level_iterator && + current_rest_iter == iter2.current_rest_iter); + */ +} +template +bool +FullArrayIterator + ::operator!=(const FullArrayIterator& iter2) const +{ + return !(*this == iter2); +} + +template +typename FullArrayIterator::reference +FullArrayIterator::operator*() const +{ + return *current_rest_iter; +} + +template +typename FullArrayIterator::pointer +FullArrayIterator::operator->() const +{ + return &(operator*()); +} + +/*! We make sure that incrementing the full_iterator ends up in + (last_top_level_iter, last_top_level_iter, 0, 0). + This has to represent \c end_all() of this full_iterator. +*/ +template +FullArrayIterator& +FullArrayIterator::operator++() +{ + assert(current_top_level_iter < last_top_level_iter); + ++current_rest_iter; + if (current_rest_iter == last_rest_iter) + { + ++current_top_level_iter; + if (current_top_level_iter != (last_top_level_iter)) + { + current_rest_iter = (*current_top_level_iter).begin_all(); + last_rest_iter = (*current_top_level_iter).end_all(); + } + else + { + current_rest_iter = restiterT(0); + last_rest_iter = restiterT(0); + } + } + return *this; +} + +template +FullArrayIterator +FullArrayIterator::operator++(int) +{ + FullArrayIterator was = *this; + ++(*this); + return was; +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/GatedDiscretisedDensity.h b/src/include/stir/GatedDiscretisedDensity.h new file mode 100644 index 0000000000..4778292898 --- /dev/null +++ b/src/include/stir/GatedDiscretisedDensity.h @@ -0,0 +1,167 @@ +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + Copyright (C) 2009- 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup data_buildblock + \brief Implementation of class stir::GatedDiscretisedDensity + \author Charalampos Tsoumpas + \author Kris Thielemans + */ +#ifndef __stir_GatedDiscretisedDensity_H__ +#define __stir_GatedDiscretisedDensity_H__ + +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/TimeGateDefinitions.h" +#include +#include + +START_NAMESPACE_STIR + +class Succeeded; + +/*! \ingroup data_buildblock + \brief Class of multiple image gates. +*/ +class GatedDiscretisedDensity +{ + public: + static + GatedDiscretisedDensity* + read_from_file(const std::string& filename); + + static + GatedDiscretisedDensity* + read_from_files(const std::string& filename); + + static + GatedDiscretisedDensity* + read_from_files(const std::string& filename,const std::string& suffix); + + GatedDiscretisedDensity() {} + + GatedDiscretisedDensity(const GatedDiscretisedDensity&argument); + GatedDiscretisedDensity(const string& filename); + + GatedDiscretisedDensity(const TimeGateDefinitions& time_gate_definitions) + { + _densities.resize(time_gate_definitions.get_num_gates()); + _time_gate_definitions=time_gate_definitions; + } + + GatedDiscretisedDensity(const shared_ptr >& density_sptr, + const unsigned int num_gates); + + + //! Construct an empty GatedDiscretisedDensity based on a shared_ptr > + GatedDiscretisedDensity(const TimeGateDefinitions& time_gate_definitions, + const shared_ptr >& density_sptr) + { + _densities.resize(time_gate_definitions.get_num_gates()); + _time_gate_definitions=time_gate_definitions; + + for (unsigned int gate_num=0; gate_num_densities[gate_num].reset(density_sptr->get_empty_discretised_density()); + } + +#if 0 + //! Construct an empty GatedDiscretisedDensity based on another GatedDiscretisedDensity + GatedDiscretisedDensity(const GatedDiscretisedDensity gated_density) + { + _densities.resize(gated_density.get_num_gates()); + _time_gate_definitions=gated_density.get_time_gate_definitions(); + for (unsigned int gate_num=0; gate_num_densities[gate_num] = (gated_density.get_densities[0])->get_empty_discretised_density(); + } +#endif + + GatedDiscretisedDensity& + operator=(const GatedDiscretisedDensity& argument); + + /*! \name get/set the densities + \warning The gate_num starts from 1 + */ + //@{ + /*! + \warning This function is likely to disappear later, and is dangerous to use. + */ + void + set_density_sptr(const shared_ptr >& density_sptr, + const unsigned int gate_num); + + void resize_densities(const TimeGateDefinitions& time_gate_definitions) + { + _densities.resize(time_gate_definitions.get_num_gates()); + _time_gate_definitions=time_gate_definitions; + } + + /* + GatedDiscretisedDensity( TimeGateDefinitions time_gate_defintions, + std::vector > _densities); + */ + + const std::vector > > & + get_densities() const ; + + const DiscretisedDensity<3,float> & + get_density(const unsigned int gate_num) const ; + + const DiscretisedDensity<3,float> & + operator[](const unsigned int gate_num) const + { return this->get_density(gate_num); } + + DiscretisedDensity<3,float> & + get_density(const unsigned int gate_num); + + DiscretisedDensity<3,float> & + operator[](const unsigned int gate_num) + { return this->get_density(gate_num); } + //@} + + void set_time_gate_definitions(TimeGateDefinitions time_gate_definitions) + {this->_time_gate_definitions=time_gate_definitions;} + + const TimeGateDefinitions & + get_time_gate_definitions() const ; + + unsigned get_num_gates() const + { + return this->get_time_gate_definitions().get_num_time_gates(); + } + void fill_with_zero(); + + /*! \brief write data to file + Currently only in format. + \warning write_time_gate_definitions() is not yet implemented, so time information is missing. + */ + Succeeded + write_to_files(const std::string& filename) const; + Succeeded + write_to_files(const string& filename,const string& suffix) const; + + + private: + // warning: if adding any new members, you have to change the copy constructor as well. + TimeGateDefinitions _time_gate_definitions; + std::vector > > _densities; +}; + +END_NAMESPACE_STIR + +#endif //__stir_GatedDiscretisedDensity_H__ diff --git a/src/include/stir/GatedProjData.h b/src/include/stir/GatedProjData.h new file mode 100644 index 0000000000..c9f1f5dc7c --- /dev/null +++ b/src/include/stir/GatedProjData.h @@ -0,0 +1,69 @@ +// +// +/* + Copyright (C) 2005-2009, Hammersmith Imanet Ltd + Copyright (C) 2010-2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup data_buildblock + \brief Declaration of class stir::GatedProjData + \author Kris Thielemans + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + +*/ +// Header guards were added by Nicolas K. to avoid multiple definition of the class from multiple obj functions +// (e.g. when motion is corrected in non-nested and nested implementation) +#ifndef __stir_GatedProjData_H__ +#define __stir_GatedProjData_H__ + +#include "stir/MultipleProjData.h" +#include "stir/TimeGateDefinitions.h" +#include + +START_NAMESPACE_STIR + +class Succeeded; + +class GatedProjData : + public MultipleProjData +{ +public: + static + GatedProjData* + read_from_file(const std::string& filename); + + GatedProjData() {}; + + unsigned int get_num_gates() const + { + return this->get_num_proj_data(); + } + + Succeeded + write_to_ecat7(const std::string& filename) const; + //Succeeded + // write_to_files(const std::string& filename) const; + + private: + TimeGateDefinitions _time_gate_definitions; + static GatedProjData* read_from_gdef(const string& filename); +}; + +END_NAMESPACE_STIR + +#endif //__stir_GatedProjData_H__ \ No newline at end of file diff --git a/src/include/stir/HighResWallClockTimer.h b/src/include/stir/HighResWallClockTimer.h new file mode 100644 index 0000000000..316e23c340 --- /dev/null +++ b/src/include/stir/HighResWallClockTimer.h @@ -0,0 +1,484 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + + \brief High-resolution wall-clock timer stir::HighResWallClockTimer + + \author Alexey Zverovich + \author PARAPET project + + + Modification history: + + + May 2008 -- Kris Thielemans -- renamed PTimer to HighResWallClockTimer and renamed functions to by compatible with stir::Timer + 18 Aug 99 -- Mustapha Sadki -- corrected the formula for HighResWallClockTimer::stop() & HighResWallClockTimer::GetTime() for WIN32\n + 08 Jul 99 -- Mustapha Sadki -- added global Ptimers and #define manipulations\n + 10 Apr 99 -- Alexey Zverovich -- Ported to Linux\n + 19 Oct 98 -- Alexey Zverovich -- Ported to Win32;\n + 19 Oct 98 -- Alexey Zverovich -- Slightly reorganised HighResWallClockTimer::start() to reduce overhead\n + 16 Oct 98 -- Alexey Zverovich -- created + + +*/ + +#ifndef __stir_HIGHRESWALLCLOCKTIMER_H__ +#define __stir_HIGHRESWALLCLOCKTIMER_H__ + +#if defined(WIN32) +# include +#else +# include +#endif + +#include + +#if defined(_MSC_VER) && (_MSC_VER < 1100) && !defined(bool) + +enum bool +{ + false = 0, + true = (!false) +}; + +#define bool bool + +#endif + +namespace stir { + + /*! \brief High-resolution timer + + This timer measures wall-clock time. Implementation is OS specific to try to use + high-resolution timers. It is \b not derived from stir::Timer to avoid the + overhead of calling a virtual function. + + \par Typical usage: + + \code + HighResWallClockTimer t; + t.start(); + do_something(); + t.stop(); + cout << "do_something took " << t.value() << " seconds" << endl; + \endcode + + You have to call reset() if you wish to use the same timer to measure + several separate time intervals, otherwise the time will be accumulated. + */ + + class HighResWallClockTimer + { + public: + + //! Create a timer + inline HighResWallClockTimer(void); + //! Destroy a timer + inline virtual ~HighResWallClockTimer(void); + + // Default copy ctor & assignment op are just fine + + //! Start a timer + inline void start(bool bReset = false); + //! Stop a running timer + inline void stop(void); + //! Reset a timer + inline void reset(void); + //! Check if a timer is running + inline bool is_running(void); + + //! Returns the number of whole seconds elapsed + inline int get_sec(void); + //! Returns the number of nanoseconds that elapsed on top of whatever get_sec() returned + inline int get_nanosec(void); + //! Returns the elapsed time (in seconds) + inline double value(void); + + //! Attempts to \e guess the timer resolution + static int get_resolution_in_nanosecs(void); // in nanoseconds + + protected: + private: + + bool m_bRunning; + int m_Secs; + int m_Nanosecs; + +#if defined(_AIX) + timebasestruct_t m_Start; + timebasestruct_t m_Finish; +#elif defined(__sun) + hrtime_t m_Start; + hrtime_t m_Finish; +#elif defined(WIN32) + LARGE_INTEGER m_Start; + LARGE_INTEGER m_Finish; +#else + //default to using gettimeofday which is on most unix (and all Linux) systems + #define STIR_HRWCT_Use_gettimeofday + timeval m_Start; + timeval m_Finish; +#endif + + }; + + + /*! The timer is not started, and elapsed time is set to zero. */ + inline HighResWallClockTimer::HighResWallClockTimer(void) + : m_bRunning(false) + { + reset(); + }; + + /*! The timer must not be running. */ + inline HighResWallClockTimer::~HighResWallClockTimer(void) + { + assert(!m_bRunning); + }; + + /*! + \param bReset indicates whether the elapsed time should be reset before the timer is started. + The timer must not be running. + */ + inline void HighResWallClockTimer::start(bool bReset /* = false */) + { + assert(!m_bRunning); + if (bReset) reset(); + m_bRunning = true; +#if defined(_AIX) + read_real_time(&m_Start, TIMEBASE_SZ); +#elif defined(__sun) + m_Start = gethrtime(); +#elif defined(WIN32) +#ifndef NDEBUG + BOOL Result = +#endif + QueryPerformanceCounter(&m_Start); + assert(Result); // if failed, high-resolution timers are not supported by this hardware +#elif defined(STIR_HRWCT_Use_gettimeofday) + // TODO: what will happen if the time gets changed? +#ifndef NDEBUG + int Result = +#endif + gettimeofday(&m_Start, NULL); + assert(Result == 0); +#endif + }; + + /*! + When a timer is stopped (=not running), get_sec(), get_nanosec(), and value() can be + used to obtain elapsed time. + */ + inline void HighResWallClockTimer::stop(void) + { + assert(m_bRunning); + +#if defined(_AIX) + + read_real_time(&m_Finish, TIMEBASE_SZ); + + time_base_to_time(&m_Start, TIMEBASE_SZ); + time_base_to_time(&m_Finish, TIMEBASE_SZ); + + int Secs = m_Finish.tb_high - m_Start.tb_high; + int Nanosecs = m_Finish.tb_low - m_Start.tb_low; + + // If there was a carry from low-order to high-order during + // the measurement, we may have to undo it. + + if (Nanosecs < 0) + { + Secs--; + Nanosecs += 1000000000; + }; + + m_Secs += Secs; + m_Nanosecs += Nanosecs; + if (m_Nanosecs >= 1000000000) + { + m_Secs++; + m_Nanosecs -= 1000000000; + }; + +#elif defined(__sun) + + m_Finish = gethrtime(); + + m_Secs += (m_Finish - m_Start) / 1000000000; + m_Nanosecs += (m_Finish - m_Start) % 1000000000; + if (m_Nanosecs >= 1000000000) + { + m_Secs++; + m_Nanosecs -= 1000000000; + }; + +#elif defined(WIN32) + + BOOL Result = QueryPerformanceCounter(&m_Finish); + assert(Result); // if failed, high-resolution timers are not supported by this hardware + + LONGLONG Delta = m_Finish.QuadPart - m_Start.QuadPart; + + // MS 18-8-99 inserted this scope to correct the formula + { + LARGE_INTEGER Freq; + BOOL Result; + Result = QueryPerformanceFrequency(&Freq); + + assert(Result); // if failed, high-resolution timers are not supported by this hardware,//TODO: use GetTickCount() + + m_Secs += static_cast( Delta / Freq.QuadPart); + m_Nanosecs += static_cast(Delta % Freq.QuadPart); + + if (m_Nanosecs >= (int)Freq.QuadPart ) + { + m_Secs++; + m_Nanosecs -= (int)Freq.QuadPart; + }; + assert(m_Nanosecs >= 0 && m_Nanosecs < (int)Freq.QuadPart); + + } + // and commented out + /* + int Resolution = get_resolution_in_nanosecs(); + + m_Secs += static_cast(Delta / Resolution); + m_Nanosecs += static_cast(Delta % Resolution); + if (m_Nanosecs >= 1000000000) + { + m_Secs++; + m_Nanosecs -= 1000000000; + }; + */ +#elif defined(STIR_HRWCT_Use_gettimeofday) + +#ifndef NDEBUG + int Result = +#endif + gettimeofday(&m_Finish, NULL); + assert(Result == 0); + + m_Secs += (m_Finish.tv_sec - m_Start.tv_sec); + int Microsecs = (m_Finish.tv_usec - m_Start.tv_usec); + if (Microsecs < 0) + { + m_Secs--; + Microsecs += 1000000; + }; + + m_Nanosecs += (Microsecs * 1000); + +#endif + + assert(m_Secs >= 0); + assert(m_Nanosecs >= 0 && m_Nanosecs < 1000000000); + + m_bRunning = false; + }; + + /*! Sets the elapsed time to zero. The timer must not be running. */ + inline void HighResWallClockTimer::reset(void) + { + assert(!m_bRunning); + m_Secs = m_Nanosecs = 0; + }; + + /*! Returns true if the timer is running, or false otherwise */ + inline bool HighResWallClockTimer::is_running(void) + { + return m_bRunning; + }; + + /*! The timer must not be running */ + inline int HighResWallClockTimer::get_sec(void) + { + assert(!m_bRunning); + return m_Secs; + }; + + /*! The timer must not be running */ + inline int HighResWallClockTimer::get_nanosec(void) + { + assert(!m_bRunning); + return m_Nanosecs; + }; + + /*! The timer must not be running */ + inline double HighResWallClockTimer::value(void) + { + // MS 18-8-99 added +#ifdef WIN32 + LARGE_INTEGER Freq; + BOOL Result; + Result = QueryPerformanceFrequency(&Freq); + return get_sec() + double(get_nanosec()) / (double)Freq.QuadPart; + +#else + return get_sec() + double(get_nanosec()) / 1e9; +#endif + }; + + // HighResWallClockTimer.cxx -- high-resolution timers implementation + + // Modification history: + // + // 19 Oct 98 -- Alexey Zverovich -- created + + /*! + get_resolution_in_nanosecs() is by no means accurate. + The only thing that is guranteed is that timer resolution + is not less than the value returned by get_resolution_in_nanosecs(). + + On Win32, returns more or less precise resolution (can be + slightly rounded if the actual resolution can't be expressed + as an integer number of nanoseconds) + + \return Estimated timer resolution (in nanoseconds) + */ + + inline int HighResWallClockTimer::get_resolution_in_nanosecs(void) + { + + /*static*/ int Resolution = -1; // cached resolution + + if (Resolution > 0) return Resolution; + +#if defined(_AIX) + + timebasestruct_t Start; + timebasestruct_t Current; + + read_real_time(&Start, TIMEBASE_SZ); + time_base_to_time(&Start, TIMEBASE_SZ); + + int MinSecs = -1; // no minimum yet + int MinNanosecs = -1; + int SecondsElapsed = 0; + + do + { + timebasestruct_t Times[2]; + + read_real_time(&Times[0], TIMEBASE_SZ); + do + { + read_real_time(&Times[1], TIMEBASE_SZ); + assert(Times[1].flag == Times[0].flag); + } + while (Times[1].tb_high == Times[0].tb_high && + Times[1].tb_low == Times[0].tb_low); + + time_base_to_time(&Times[0], TIMEBASE_SZ); + time_base_to_time(&Times[1], TIMEBASE_SZ); + + int Secs = Times[1].tb_high - Times[0].tb_high; + int Nanosecs = Times[1].tb_low - Times[0].tb_low; + + // If there was a carry from low-order to high-order during + // the measurement, we may have to undo it. + + if (Nanosecs < 0) + { + Secs--; + Nanosecs += 1000000000; + }; + + assert(Secs >= 0 && Nanosecs >= 0 && Nanosecs < 1000000000); + assert(Secs != 0 || Nanosecs != 0); // shouldn't be the same as we checked in the 'do' loop + + // cout << "[" << Secs << " " << Nanosecs << "]" << endl; + + if (MinSecs < 0 || Secs < MinSecs || (Secs == MinSecs && Nanosecs < MinNanosecs)) + { + MinSecs = Secs; + MinNanosecs = Nanosecs; + }; + + read_real_time(&Current, TIMEBASE_SZ); + time_base_to_time(&Current, TIMEBASE_SZ); + + SecondsElapsed = Current.tb_high - Start.tb_high; + if (Current.tb_low < Start.tb_low) SecondsElapsed--; + } + while (SecondsElapsed < 1); + + assert(MinSecs < 2); // otherwise it's too coarse for this measurement + + Resolution = MinSecs * 1000000000 + MinNanosecs; + +#elif defined(__sun) + + hrtime_t Start = gethrtime(); + hrtime_t Current; + + hrtime_t MinNanosecs = -1; + + do + { + hrtime_t Times[2]; + + Times[0] = gethrtime(); + + while ((Times[1] = gethrtime()) == Times[0]) /* do nothing */; + + hrtime_t Nanosecs = Times[1] - Times[0]; + + assert(Nanosecs > 0); + + if (MinNanosecs < 0 || Nanosecs < MinNanosecs) + { + MinNanosecs = Nanosecs; + }; + + Current = gethrtime(); + } + while (Current - Start < 1000000000); // 1 second + + assert(MinNanosecs < 2000000000); // otherwise it's too coarse for this measurement + + Resolution = static_cast(MinNanosecs); + +#elif defined(WIN32) + + LARGE_INTEGER Freq; + BOOL Result; + + Result = QueryPerformanceFrequency(&Freq); + assert(Result); // if failed, high-resolution timers are not supported by this hardware + + Resolution = static_cast(1000000000 / Freq.QuadPart); + +#elif defined(STIR_HRWCT_Use_gettimeofday) + + //TODO + +#endif + + assert(Resolution > 0); + + return Resolution; + + }; + +} + + +#endif // __HIGHRESWALLCLOCKTIMER_H__ + diff --git a/src/include/stir/IO/ECAT6ImageInputFileFormat.h b/src/include/stir/IO/ECAT6ImageInputFileFormat.h new file mode 100644 index 0000000000..3e2cddc427 --- /dev/null +++ b/src/include/stir/IO/ECAT6ImageInputFileFormat.h @@ -0,0 +1,120 @@ +#ifndef __stir_IO_ECAT6ImageInputFileFormat_h__ +#define __stir_IO_ECAT6ImageInputFileFormat_h__ +/* + Copyright (C) 2006, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat6::ECAT6ImageInputFileFormat + + \author Kris Thielemans +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/utilities.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include +#include +#include "stir/IO/stir_ecat6.h" +#include "stir/IO/ecat6_utils.h" +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 +//! Class for reading images in ECAT6 file-format. +/*! \ingroup ECAT + \preliminary + +*/ +class ECAT6ImageInputFileFormat : +public InputFileFormat > +{ + public: + virtual const std::string + get_name() const + { return "ECAT6"; } + + protected: + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const + { + return false; + } + + bool + can_read(const FileSignature& signature, + std::istream& input) const + { + return false; // cannot read from istream + } + + bool + can_read(const FileSignature&, + const std::string& filename) const + { + return is_ECAT6_image_file(filename); + } + + virtual std::auto_ptr + read_from_file(std::istream& input) const + { + //TODO + error("read_from_file for ECAT6 with istream not implemented %s:%d. Sorry", + __FILE__, __LINE__); + return + std::auto_ptr + (0); + } + virtual std::auto_ptr + read_from_file(const std::string& filename) const + { + if (is_ECAT6_image_file(filename)) + { + ECAT6_Main_header mhead; + FILE * cti_fptr=fopen(filename.c_str(), "rb"); + if(cti_read_ECAT6_Main_header(cti_fptr, &mhead)!=EXIT_SUCCESS) + { + if (cti_fptr!=NULL) + fclose(cti_fptr); + error ("error reading main header in ECAT 6 file %s\n", filename.c_str()); + } + + warning("\nReading frame 1, gate 1, data 0, bed 0 from file %s\n", + filename.c_str()); + VoxelsOnCartesianGrid * tmp = + ECAT6_to_VoxelsOnCartesianGrid(/*frame_num, gate_num, data_num, bed_num*/1,1,0,0, + cti_fptr, mhead); + fclose(cti_fptr); + return std::auto_ptr(tmp); + } + else + { + error("ECAT6ImageInputFileFormat: file '%s' does not look like an ECAT6 image.", + filename.c_str()); + // add return to avoid compiler warnings + return std::auto_ptr(0); + } + + } + }; + +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT6 +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/IO/ECAT6OutputFileFormat.h b/src/include/stir/IO/ECAT6OutputFileFormat.h new file mode 100644 index 0000000000..60af1bfe4b --- /dev/null +++ b/src/include/stir/IO/ECAT6OutputFileFormat.h @@ -0,0 +1,102 @@ +// +// +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT6OutputFileFormat + + \author Kris Thielemans + +*/ + +#ifndef __stir_IO_ECAT6OutputFileFormat_H__ +#define __stir_IO_ECAT6OutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" +// include for namespace macros +#include "stir/IO/stir_ecat_common.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR +template class DiscretisedDensity; + +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 + + +/*! + \ingroup ECAT + \brief + Implementation of OutputFileFormat paradigm for the ECAT6 format. + + \warning Currently output always uses 2-byte signed integers in + little-endian byte order. + */ +class ECAT6OutputFileFormat : + public RegisteredParsingObject< + ECAT6OutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +{ +private: + typedef + RegisteredParsingObject< + ECAT6OutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > + base_type; + +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + ECAT6OutputFileFormat(const NumericType& = NumericType::SHORT, + const ByteOrder& = ByteOrder::native); + + //! Set type of numbers to be used for output + /*! Currently the return value will always be NumericType::SHORT */ + virtual NumericType set_type_of_numbers(const NumericType&, const bool warn = false); + //! Set byte order to be used for output + /*! Currently the return value will always be ByteOrder::LITTLEENDIAN */ + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + +public: + string default_scanner_name; +protected: + virtual Succeeded + actual_write_to_file(string& output_filename, + const DiscretisedDensity<3,float>& density) const; + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_ECAT6 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.h b/src/include/stir/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.h new file mode 100644 index 0000000000..8e2657b4aa --- /dev/null +++ b/src/include/stir/IO/ECAT7DynamicDiscretisedDensityInputFileFormat.h @@ -0,0 +1,78 @@ +// +// +#ifndef __stir_IO_ECAT7DynamicDiscretisedDensityInputFileFormat_h__ +#define __stir_IO_ECAT7DynamicDiscretisedDensityInputFileFormat_h__ +/* + Copyright (C) 2006 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT7DynamicDiscretisedDensityInputFileFormat + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/DynamicDiscretisedDensity.h" +#include +#include + + +#ifndef HAVE_LLN_MATRIX +#error HAVE_LLN_MATRIX not defined: you need the lln ecat library. +#endif + +#include "stir/IO/stir_ecat7.h" +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +//! Class for reading images in ECAT7 file-format. +/*! \ingroup ECAT + \preliminary + +*/ +class ECAT7DynamicDiscretisedDensityInputFileFormat : +public InputFileFormat +{ + public: + virtual const std::string + get_name() const + { return "ECAT7"; } + + protected: + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const; + + //! This always fails + virtual std::auto_ptr + read_from_file(std::istream& input) const; + + //! read data given a filename + virtual std::auto_ptr + read_from_file(const std::string& filename) const; +}; + +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT7 +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.h b/src/include/stir/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.h new file mode 100644 index 0000000000..b8238d8f5c --- /dev/null +++ b/src/include/stir/IO/ECAT7DynamicDiscretisedDensityOutputFileFormat.h @@ -0,0 +1,107 @@ +// +// +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT7DynamicDiscretisedDensityOutputFileFormat + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_IO_ECAT7DynamicDiscretisedDensityOutputFileFormat_H__ +#define __stir_IO_ECAT7DynamicDiscretisedDensityOutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" +// include for namespace macros +#include "stir/IO/stir_ecat_common.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +class DynamicDiscretisedDensity; + +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + + +/*! + \ingroup ECAT + \brief + Implementation of OutputFileFormat paradigm for the ECAT7 format. + + \warning Currently output always uses 2-byte signed integers in + big-endian byte order. + */ + +class ECAT7DynamicDiscretisedDensityOutputFileFormat : + public RegisteredParsingObject< + ECAT7DynamicDiscretisedDensityOutputFileFormat, + OutputFileFormat, + OutputFileFormat > +{ +private: + typedef + RegisteredParsingObject< + ECAT7DynamicDiscretisedDensityOutputFileFormat, + OutputFileFormat, + OutputFileFormat > + base_type; + +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + ECAT7DynamicDiscretisedDensityOutputFileFormat(const NumericType& = NumericType::SHORT, + const ByteOrder& = ByteOrder::native); + + //! Set type of numbers to be used for output + /*! Currently the return value will always be NumericType::SHORT */ + virtual NumericType set_type_of_numbers(const NumericType&, const bool warn = false); + //! Set byte order to be used for output + /*! Currently the return value will always be ByteOrder::BIGENDIAN */ + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + //virtual ByteOrder set_byte_order_and_type_of_numbers(ByteOrder&, NumericType&, const bool warn = false); +public: + string default_scanner_name; + +protected: + + virtual Succeeded + actual_write_to_file(string& output_filename, + const DynamicDiscretisedDensity & density) const; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/ECAT7ImageInputFileFormat.h b/src/include/stir/IO/ECAT7ImageInputFileFormat.h new file mode 100644 index 0000000000..01c678f2d1 --- /dev/null +++ b/src/include/stir/IO/ECAT7ImageInputFileFormat.h @@ -0,0 +1,107 @@ +// +// +#ifndef __stir_IO_ECAT7ImageInputFileFormat_h__ +#define __stir_IO_ECAT7ImageInputFileFormat_h__ +/* + Copyright (C) 2006- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT7ImageInputFileFormat + + \author Kris Thielemans + +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/utilities.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include +#include + + +#ifndef HAVE_LLN_MATRIX +#error HAVE_LLN_MATRIX not define: you need the lln ecat library. +#endif + +#include "stir/IO/stir_ecat7.h" +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +//! Class for reading images in ECAT7 file-format. +/*! \ingroup ECAT + \preliminary + +*/ +class ECAT7ImageInputFileFormat : +public InputFileFormat > +{ + public: + virtual const std::string + get_name() const + { return "ECAT7"; } + + protected: + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const + { + if (strncmp(signature.get_signature(), "MATRIX", 6) != 0) + return false; + + // TODO + // return (is_ECAT7_image_file(filename)) + return true; + } + + virtual std::auto_ptr + read_from_file(std::istream& input) const + { + //TODO + error("read_from_file for ECAT7 with istream not implemented %s:%d. Sorry", + __FILE__, __LINE__); + return + std::auto_ptr + (0); + } + virtual std::auto_ptr + read_from_file(const std::string& filename) const + { + + if (is_ECAT7_image_file(filename)) + { + warning("\nReading frame 1, gate 1, data 0, bed 0 from file %s\n", + filename.c_str()); + return std::auto_ptr + ( + ECAT7_to_VoxelsOnCartesianGrid(filename, + /*frame_num, gate_num, data_num, bed_num*/1,1,0,0)); + } + else + { + warning("ECAT7 file %s is not an image file", filename.c_str()); + return std::auto_ptr(0); + } + } +}; + +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT7 +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/ECAT7OutputFileFormat.h b/src/include/stir/IO/ECAT7OutputFileFormat.h new file mode 100644 index 0000000000..6814d8efd1 --- /dev/null +++ b/src/include/stir/IO/ECAT7OutputFileFormat.h @@ -0,0 +1,105 @@ +// +// +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT7OutputFileFormat + + \author Kris Thielemans + +*/ + +#ifndef __stir_IO_ECAT7OutputFileFormat_H__ +#define __stir_IO_ECAT7OutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" +// include for namespace macros +#include "stir/IO/stir_ecat_common.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +template class DiscretisedDensity; + +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + + +/*! + \ingroup ECAT + \brief + Implementation of OutputFileFormat paradigm for the ECAT7 format. + + \warning Currently output always uses 2-byte signed integers in + big-endian byte order. + */ +class ECAT7OutputFileFormat : + public RegisteredParsingObject< + ECAT7OutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +{ +private: + typedef + RegisteredParsingObject< + ECAT7OutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > + base_type; + +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + ECAT7OutputFileFormat(const NumericType& = NumericType::SHORT, + const ByteOrder& = ByteOrder::native); + + //! Set type of numbers to be used for output + /*! Currently the return value will always be NumericType::SHORT */ + virtual NumericType set_type_of_numbers(const NumericType&, const bool warn = false); + //! Set byte order to be used for output + /*! Currently the return value will always be ByteOrder::BIGENDIAN */ + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + //virtual ByteOrder set_byte_order_and_type_of_numbers(ByteOrder&, NumericType&, const bool warn = false); +public: + string default_scanner_name; + +protected: + + virtual Succeeded + actual_write_to_file(string& output_filename, + const DiscretisedDensity<3,float>& density) const; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/ECAT7ParametricDensityOutputFileFormat.h b/src/include/stir/IO/ECAT7ParametricDensityOutputFileFormat.h new file mode 100644 index 0000000000..3b86efad74 --- /dev/null +++ b/src/include/stir/IO/ECAT7ParametricDensityOutputFileFormat.h @@ -0,0 +1,109 @@ +// +// +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT7ParametricDensityOutputFileFormat + + \author Kris Thielemans + +*/ + +#ifndef __stir_IO_ECAT7ParametricDensityOutputFileFormat_H__ +#define __stir_IO_ECAT7ParametricDensityOutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" +// include for namespace macros +#include "stir/IO/stir_ecat_common.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +template class DiscretisedDensity; + +template +class ParametricDiscretisedDensity; + +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + + +/*! + \ingroup ECAT + \brief + Implementation of OutputFileFormat paradigm for the ECAT7 format. + + \warning Currently output always uses 2-byte signed integers in + big-endian byte order. + */ +template +class ECAT7ParametricDensityOutputFileFormat : + public RegisteredParsingObject< + ECAT7ParametricDensityOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +{ +private: + typedef + RegisteredParsingObject< + ECAT7ParametricDensityOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > + base_type; + +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + ECAT7ParametricDensityOutputFileFormat(const NumericType& = NumericType::SHORT, + const ByteOrder& = ByteOrder::native); + + //! Set type of numbers to be used for output + /*! Currently the return value will always be NumericType::SHORT */ + virtual NumericType set_type_of_numbers(const NumericType&, const bool warn = false); + //! Set byte order to be used for output + /*! Currently the return value will always be ByteOrder::BIGENDIAN */ + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + //virtual ByteOrder set_byte_order_and_type_of_numbers(ByteOrder&, NumericType&, const bool warn = false); +public: + string default_scanner_name; + +protected: + + virtual Succeeded + actual_write_to_file(string& output_filename, + const ParametricDiscretisedDensity& density) const; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/ECAT962ListmodeInputFileFormat.h b/src/include/stir/IO/ECAT962ListmodeInputFileFormat.h new file mode 100644 index 0000000000..76420b6d31 --- /dev/null +++ b/src/include/stir/IO/ECAT962ListmodeInputFileFormat.h @@ -0,0 +1,124 @@ +// +// +#ifndef __stir_IO_ECAT962ListmodeInputFileFormat_h__ +#define __stir_IO_ECAT962ListmodeInputFileFormat_h__ +/* + Copyright (C) 2006- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT962ListmodeInputFileFormat + + \author Kris Thielemans + +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/listmode/CListModeDataECAT.h" +#include "stir/listmode/CListRecordECAT962.h" + +#include "stir/utilities.h" +#include + + +#ifndef HAVE_LLN_MATRIX +#error HAVE_LLN_MATRIX not define: you need the lln ecat library. +#endif + +#include "stir/IO/stir_ecat7.h" +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +//! Class for reading list mode data from the ECAT 962 scanner +/*! \ingroup ECAT + \ingroup listmode +*/ +class ECAT962ListmodeInputFileFormat : +public InputFileFormat +{ + public: + virtual const std::string + get_name() const + { return "ECAT962"; } + + virtual bool + can_read(const FileSignature& signature, + std::istream& input) const + { + return this->actual_can_read(signature, input); + } + virtual bool + can_read(const FileSignature& signature, + const std::string& listmode_filename_prefix) const + { + const string singles_filename = listmode_filename_prefix + "_1.sgl"; + std::ifstream singles_file(singles_filename.c_str(), ios::binary); + char buffer[sizeof(Main_header)]; + Main_header singles_main_header; + singles_file.read(buffer, + sizeof(singles_main_header)); + if (!singles_file) + return false; + unmap_main_header(buffer, &singles_main_header); + shared_ptr scanner_sptr; + ecat::ecat7::find_scanner(scanner_sptr, singles_main_header); + if (scanner_sptr->get_type() == Scanner::E962) + return false; + + return true; + } + + protected: + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const + { + warning("can_read for ECAT962 listmode data with istream not implemented %s:%d. Sorry", + __FILE__, __LINE__); + return false; + + if (strncmp(signature.get_signature(), "MATRIX", 6) != 0) + return false; + + // TODO + // return (is_ECAT7_image_file(filename)) + return true; + } + public: + virtual std::auto_ptr + read_from_file(std::istream& input) const + { + // cannot do this as need both .sgl and .lm + warning("read_from_file for ECAT962 listmode data with istream not implemented %s:%d. Sorry", + __FILE__, __LINE__); + return + std::auto_ptr + (0); + } + virtual std::auto_ptr + read_from_file(const std::string& filename) const + { + return std::auto_ptr(new ecat::ecat7::CListModeDataECAT(filename)); + } +}; + +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT7 +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/ECAT966ListmodeInputFileFormat.h b/src/include/stir/IO/ECAT966ListmodeInputFileFormat.h new file mode 100644 index 0000000000..0f3c0b3f96 --- /dev/null +++ b/src/include/stir/IO/ECAT966ListmodeInputFileFormat.h @@ -0,0 +1,151 @@ +#ifndef __stir_IO_ECAT966ListmodeInputFileFormat_h__ +#define __stir_IO_ECAT966ListmodeInputFileFormat_h__ +/* + Copyright (C) 2011, Hammersmith Imanet Ltd + Copyright (C) 2013-2014, University College London + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ECAT + \brief Declaration of class stir::ecat::ecat7::ECAT966ListmodeInputFileFormat + + \author Kris Thielemans +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/listmode/CListModeDataECAT.h" +#include "stir/listmode/CListRecordECAT966.h" + +#include "stir/utilities.h" +#include "stir/info.h" +#include +#include + +#ifndef HAVE_LLN_MATRIX +#error HAVE_LLN_MATRIX not define: you need the lln ecat library. +#endif + +#include "stir/IO/stir_ecat7.h" +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +//! Class for reading list mode data from the ECAT 966 scanner +/*! \ingroup ECAT + \ingroup listmode + + ECAT7 list mode data are recorded in the following files: + - PREFIX_1.sgl: contains an ECAT7 main header and the singles counts + - PREFIX_1.lm: contains the coincidence events (max size is 2GB) + - PREFIX_1.sgl: contains the next chunk of coincidence events + - ... + + This class expects to be passed the name of the .sgl file. +*/ +class ECAT966ListmodeInputFileFormat : +public InputFileFormat +{ + public: + virtual const std::string + get_name() const + { return "ECAT966"; } + + //! Always return false as ECAT7 IO cannot read from stream + virtual bool + can_read(const FileSignature& signature, + std::istream& input) const + { + return this->actual_can_read(signature, input); + } + + //! Checks if it's an ECAT7 file by reading the main header and if the scanner is supported. */ + virtual bool + can_read(const FileSignature& signature, + const std::string& singles_filename) const + { + if (strncmp(signature.get_signature(), "MATRIX", 6) != 0) + return false; + + //const string singles_filename = listmode_filename_prefix + "_1.sgl"; + std::ifstream singles_file(singles_filename.c_str(), ios::binary); + char buffer[sizeof(Main_header)]; + Main_header singles_main_header; + singles_file.read(buffer, + sizeof(singles_main_header)); + if (!singles_file) + return false; + unmap_main_header(buffer, &singles_main_header); + shared_ptr scanner_sptr; + ecat::ecat7::find_scanner(scanner_sptr, singles_main_header); + if (scanner_sptr->get_type() == Scanner::E966) + return true; + + return false; + } + + protected: + //! Always return false as ECAT7 IO cannot read from stream + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const + { + warning("can_read for ECAT966 listmode data with istream not implemented %s:%d. Sorry", + __FILE__, __LINE__); + return false; + + if (strncmp(signature.get_signature(), "MATRIX", 6) != 0) + return false; + + // TODO + // return (is_ECAT7_image_file(filename)) + return true; + } + public: + virtual std::auto_ptr + read_from_file(std::istream& input) const + { + // cannot do this as need both .sgl and .lm + warning("read_from_file for ECAT966 listmode data with istream not implemented %s:%d. Sorry", + __FILE__, __LINE__); + return + std::auto_ptr + (0); + } + //! read the data via the .sgl file + /*! We first remove the suffix (either .sgl or _1.sgl) and then call ecat::ecat7::CListModeDataECAT::CListModeDataECAT(const std::string&) + */ + virtual std::auto_ptr + read_from_file(const std::string& filename) const + { + // filename points to the .sgl file, but we need the prefix + std::string::size_type pos = find_pos_of_extension(filename); + // also remove _1 at the end (if present) + if (pos != std::string::npos && pos>2 && filename.substr(pos-2,2)=="_1") + { + pos-=2; + } + const std::string filename_prefix = filename.substr(0, pos); + info(boost::format("Reading ECAT listmode file with prefix %1%") % filename_prefix); + + return std::auto_ptr(new ecat::ecat7::CListModeDataECAT(filename_prefix)); + } +}; + +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT7 +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/FileSignature.h b/src/include/stir/IO/FileSignature.h new file mode 100644 index 0000000000..86eb9f9c7c --- /dev/null +++ b/src/include/stir/IO/FileSignature.h @@ -0,0 +1,90 @@ +/* + Copyright (C) 2006-2010, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_IO_FileSignature_h__ +#define __stir_IO_FileSignature_h__ +/*! + \file + \ingroup IO + \brief Declaration of class stir::FileSignature + + \author Kris Thielemans +*/ +#include "stir/utilities.h" +#include +#include +#include + +START_NAMESPACE_STIR + +//! A class to read/store the file signature +/*! \ingroup IO + Most file formats have a 'magic number' at the start, which allows easy + recognition. This class provides an interface to reading and storing that + signature. + + The current implementation reads a signature of maximum 1024 bytes. The buffer + is initialised to zero before reading. +*/ +class FileSignature +{ + public: + + //! read signature + /*! The signature will be read from the current point in the stream. The seekg pointer + will be advanced by max 1024. + */ + explicit FileSignature(std::istream& input) + { + this->_read_signature(input); + } + //! open file and read signature + explicit FileSignature(const std::string& filename) + { + std::ifstream input; + open_read_binary(input, filename); + this->_read_signature(input); + } + + //! get access to the signature + /*! Data is only valid up to size() (currently max 1024) */ + const char * get_signature() const + { + return this->_signature; + } + + //! return size of valid signature read from the file + std::size_t size() const + { + return this->_size; + } + private: + static const std::size_t _max_signature_size = 1024U; + char _signature[_max_signature_size]; + std::size_t _size; + + void _read_signature(std::istream& input) + { + // first initialise to zero, just in case the whole buffer isn't set + std::fill(this->_signature, this->_signature + this->_max_signature_size, '\0'); + input.read(this->_signature, this->_max_signature_size); + this->_signature[this->_max_signature_size-1]='\0'; + this->_size = static_cast(input.gcount()); + } +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/IO/GIPL_ImageFormat.h b/src/include/stir/IO/GIPL_ImageFormat.h new file mode 100644 index 0000000000..ddc2c39607 --- /dev/null +++ b/src/include/stir/IO/GIPL_ImageFormat.h @@ -0,0 +1,202 @@ +// +/* + Copyright (C) 2012 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup IO + \brief Applies the dilation filter (i.e. voxel=max(neighbours)) + \author Charalampos Tsoumpas [extension of original by Buerger, see below] + + */ + +/*----- + Original Copyright (c) 2012, Division of Imaging Sciences & Biomedical Engineering, +King's College London + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----*/ + +// ------------------------------------------------------------------------- +/** +* \class Image +* \brief Reading and writing gipl files +* +* \date 2010 +* \author Colin Studholme, (original VoxObj concept) +* Derek Hill, +* Jason Zhao, +* Cliff Ruff, +* Abhir H. Bhalerao, +* modified by Christian Buerger +* adapted for STIR by Charalampos Tsoumpas +* \note Copyright (c) King's College London, The Rayne Institute. +* Division of Imaging Sciences, 4th floow Lambeth Wing, St Thomas' Hospital. +* All rights reserved. +*/ +// ------------------------------------------------------------------------- + +#ifndef __GIPL_IMAGE_H +#define __GIPL_IMAGE_H + +#include +#include +#include + +#define _SHORT 0 +#define _FLOAT 1 + +//#include "ByteSwap.h" + +// ------------------------------------------------------------------------- +// Image class +// ------------------------------------------------------------------------- + +class Image +{ +public: + + Image(); + Image(const int num_voxels, const short data_type_case); + + ~Image(); + + // Image data types + short* vData; + float* vData_f; + + // Dimensions of image in voxels and time (x,y,z,t). Bytes: 0 to 7. + short m_dim[4]; + + // Image data type (binary, char, short etc). Bytes: 8 and 9. + short m_image_type; + + // Dimensions of individual image voxels (x,y,z,t). Bytes: 10 to 25. + float m_pixdim[4]; + + // Patient description string. Bytes: 26 to 105. + char m_patDesc[80]; + + // Matrix (transformation?) stored with image. Bytes: 106 to 153. + float m_matrixElements[12]; + + // Image identification number. Bytes: 154 to 157. + int m_identifier; + + // Spare storage string. Bytes: 158 to 185. + char m_spare[28]; + + // Orientation of the image (AP, lateral, axial etc). Byte 186. + char m_orientationFlag; + + // GIPL version number. Byte 187. + char m_flag1; + + // Minimum data value. Bytes: 188 to 195. + double m_min; + + // Maximum data value. Bytes: 196 to 203. + double m_max; + + // Image origin in mm. Bytes: 204 to 235. + double m_origin[4]; + + // Pixel value offset. Bytes: 236 to 239. + float m_pixval_offset; + + // Pixel value calibration. Bytes: 240 to 243. + float m_pixval_cal; + + // User defined float 1. Bytes: 244 to 247. + float m_user_def1; + + // User defined float 2. Bytes: 248 to 251. + float m_user_def2; + + // GIPL magic number. Bytes: 252 to 255. + unsigned int m_magic_number; + + // Data dimension + int ImageDimension; + + // Parameter dimension + int ParametersDimension; + + // Data vector length + int MaxLength; + + // Max and min gray value + float iMax; + float iMin; + + // Offset vector + int ImageOffset[2]; + + // Center of rotation + float vCenter[4]; + + // Downscaling properties + short vDownsample[3]; + + // Input output functions + void GiplRead(char* filename); + void ReadGiplHeader(std::fstream* myFile); + void GiplWrite(const char* filename); + void WriteGiplHeader(std::fstream* myFile); + void ByteSwapHeader(); + + // Get minimum and maximum gray values + void GetMinMaxValue(); + + // Initialize and copy images + void Initialize(Image* Input, short type); + void Initialize(Image* Input); + void Zeros(Image* Input, short type); + void Zeros(); + void Ones(Image* Input, short type); + void Copy(Image* Input, short type); + + // Swap bytes if necessary + void ByteSwap(int *i); + void ByteSwap(short *s); + void ByteSwap(float *f); + void ByteSwap(double *d); +}; + +#endif + +// ------------------------------------------------------------------------- +// EOF +// ------------------------------------------------------------------------- diff --git a/src/include/stir/IO/ITKImageInputFileFormat.h b/src/include/stir/IO/ITKImageInputFileFormat.h new file mode 100644 index 0000000000..f692e79fa0 --- /dev/null +++ b/src/include/stir/IO/ITKImageInputFileFormat.h @@ -0,0 +1,85 @@ +#ifndef __stir_IO_ITKInputFileFormat_h__ +#define __stir_IO_ITKInputFileFormat_h__ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) 2014, University College London + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Declaration of class stir::ITKInputFileFormat + + \author Berta Marti Fuster + \author Kris Thielemans +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/DiscretisedDensity.h" +#include "stir/VoxelsOnCartesianGrid.h" + +START_NAMESPACE_STIR + +//! Class for reading images using ITK. +/*! \ingroup IO + + ITK (http://www.itk.org) has its own registry of file formats, so the current class + provides an interface to that code. We use ITK for reading, and then translate the ITK + data and meta-info to STIR. + + ITK can read many file formats, see http://www.itk.org/Wiki/ITK/File_Formats for some info. + + This STIR class has special handling for DICOM images. For many modalities, DICOM stores + each slice in a different file. Normally, ITK reads only a single DICOM file, and hence a single slice. + As this is not useful for STIR, we use \c itk::GDCMSeriesFileNames to find + other slices belonging to the same series/time frame/gate as the input filename to read_from_file(). + + \warning This translation currently ignores orientation and direction (e.g. of slice order). +*/ +class ITKImageInputFileFormat : +public InputFileFormat > +{ + + public: + + //! This function always returns \c false as ITK cannot read from istream + virtual bool + can_read(const FileSignature& signature, + std::istream& input) const; + //! Use ITK reader to check if it can read the file (by seeing if it throws an exception or not) + virtual bool + can_read(const FileSignature& signature, + const std::string& filename) const; + + virtual const std::string + get_name() const + { return "ITK"; } + + protected: + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const; + + //! This function always calls error() as ITK cannot read from istream + virtual std::auto_ptr + read_from_file(std::istream& input) const; + + //! This function uses ITK for reading and does the translation to STIR + virtual std::auto_ptr + read_from_file(const std::string& filename) const; + +}; +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/ITKOutputFileFormat.h b/src/include/stir/IO/ITKOutputFileFormat.h new file mode 100644 index 0000000000..344dc69af3 --- /dev/null +++ b/src/include/stir/IO/ITKOutputFileFormat.h @@ -0,0 +1,102 @@ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup IO + \brief Declaration of class stir::ITKOutputFileFormat + + \author Berta Marti Fuster +*/ + +#ifndef __stir_IO_ITKOutputFileFormat_H__ +#define __stir_IO_ITKOutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +template class DiscretisedDensity; + +/*! + \ingroup IO + \brief Implementation of OutputFileFormat paradigm using the ITK library for writing. + + ITK (http://www.itk.org) has its own registry of file formats, so the current class + provides an interface to that code. We translate the STIR data to ITK and then use its + writing code. This translation is currently incomplete however. + + ITK chooses the file format based on the extension of the filename. This is currently + different from STIR. Therefore, this class can be used to write Nifti (.nii), Teem (.nhdr), + MetaIO (.mhdr), etc. + + In this class, we provide a default extension that will be + appended if a filename without extension is used. + + \par Parameters + \verbatim + ITK Output File Format Parameters:= + default extension:= .nhdr ; current default value + End ITK Output File Format Parameters:= + \endverbatim + + */ +class ITKOutputFileFormat : + public RegisteredParsingObject< + ITKOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +{ + private: + typedef + RegisteredParsingObject< + ITKOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > + base_type; +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + //! default extension to use if none present + /*! This will determine the file format used if passing a filename without extension. */ + std::string default_extension; + + ITKOutputFileFormat(const NumericType& = NumericType::FLOAT, + const ByteOrder& = ByteOrder::native); + + + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + protected: + virtual Succeeded + actual_write_to_file(string& output_filename, + const DiscretisedDensity<3,float>& density) const; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/IO/InputFileFormat.h b/src/include/stir/IO/InputFileFormat.h new file mode 100644 index 0000000000..c28a04636a --- /dev/null +++ b/src/include/stir/IO/InputFileFormat.h @@ -0,0 +1,93 @@ +// +// +#ifndef __stir_IO_InputFileFormat_h__ +#define __stir_IO_InputFileFormat_h__ +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Declaration of class stir::InputFileFormat + + \author Kris Thielemans + +*/ +#include "stir/IO/FileSignature.h" +#include "stir/utilities.h" +#include // for auto_ptr +#include +#include + + +START_NAMESPACE_STIR + +//! Base-class for file-formats for reading +/*! \ingroup IO + \preliminary + + \todo should be able to open for input-output maybe + \todo there is overlap between function having filenames or istreams. + This is a bit of a mess. Also, some file formats we might only have an API for + using C-style FILE. +*/ +template +class InputFileFormat +{ + public: + typedef DataT data_type; + virtual ~InputFileFormat() {} + + virtual bool + can_read(const FileSignature& signature, + std::istream& input) const + { + return this->actual_can_read(signature, input); + } + virtual bool + can_read(const FileSignature& signature, + const std::string& filename) const + { + std::ifstream input; + open_read_binary(input, filename); + return this->actual_can_read(signature, input); + } + + virtual std::auto_ptr + read_from_file(std::istream& input) const = 0; + + // note: need to have 2 for header-based file-formats which might need directory info + virtual + std::auto_ptr + read_from_file(const std::string& filename) const + { + std::ifstream input; + open_read_binary(input, filename); + return read_from_file(input); + } + + virtual const std::string + get_name() const = 0; + + protected: + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const = 0; +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/InputFileFormatRegistry.h b/src/include/stir/IO/InputFileFormatRegistry.h new file mode 100644 index 0000000000..a9c19491eb --- /dev/null +++ b/src/include/stir/IO/InputFileFormatRegistry.h @@ -0,0 +1,189 @@ +#ifndef __stir_IO_InputFileFormatRegistry_h__ +#define __stir_IO_InputFileFormatRegistry_h__ +/* + Copyright (C) 2006-2008, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Declaration of class stir::InputFileFormatRegistry, stir::RegisterInputFileFormat. + + \author Kris Thielemans +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/shared_ptr.h" +#include +#include +#include +#include + +START_NAMESPACE_STIR + +class FileSignature; + +//! A class for registering (and finding) all input file formats +/*! \ingroup IO + \preliminary + + This class stores 'factories' that take a file as argument to produce a new object. + + \see RegisterInputFileFormat on a convenient way to add InputFileFormat objects to + the default registry. + + \par terminology + + 'Factory' is terminology often used in C++ for an object that can make another object. +*/ +template +class InputFileFormatRegistry +{ + public: + typedef DataT data_type; + // In the future, maybe we'll have a factory type, and let InputFileFormat be derived from it + // So we will use a typedef to prepare for that. + typedef InputFileFormat Factory; + typedef shared_ptr FactorySPtr; + typedef InputFileFormatRegistry self_type; + + //! A function to return the default registry + /*! This default registry will be created when this function called the first + time.It will then be empty. + + \warning This function returns a reference to the default registry. This can be + used to assign your own registry to make it the default for all other + subsequent calls. This might lead to unexpected behaviour if your registry does + not contain the expected factories. + */ + static + shared_ptr& default_sptr(); + + //! Default constructor without defaults (see find_factory()) + inline InputFileFormatRegistry() {} + + inline ~InputFileFormatRegistry() {} + + + /*! \brief Add a file-format to the registry with given ranking + Ranking 0 is the 'highest', so will be found first. + */ + void add_to_registry(FactorySPtr const & factory, const unsigned ranking); + + //! Remove a pair from the registry + void remove_from_registry(const Factory& factory); + + //! Find a factory that can handle a particular stream + /*! The \c signature and \c input arguments are supposed to correspond to the same file. + + The function will loop through all factories in the registry, in order of decreasing + \c ranking, and return the first factory found that can handle the data. + + If no matching factory is found, we call error(). + */ + Factory const & + find_factory(const FileSignature& signature, + std::istream& input) const; + + //! Find a factory that can handle a particular filename + /*! The \c signature and \c input arguments are supposed to correspond to the same file. + + The function will loop through all factories in the registry, in order of decreasing + \c ranking, and return the first factory found that can handle the data. + + If no matching factory is found, we call error(). + */ + Factory const & + find_factory(const FileSignature& signature, + const std::string& filename) const; + + //! Find a factory that can handle a particular filename + Factory const & + find_factory(const std::string& filename) const; + + //! Find a factory that can handle a particular stream + Factory const & + find_factory(std::istream& input) const; + + //! List all possible registered names to the stream + /*! Names are separated with newlines. */ + void + list_registered_names(std::ostream& stream) const; + + private: + typedef typename std::multimap _registry_type; + typedef typename _registry_type::const_iterator const_iterator; + typedef typename _registry_type::iterator iterator; + + _registry_type _registry; + + bool _valid(const_iterator iter) const + { return iter != this->_registry.end(); } + + // File can be either string or istream + template + inline + const_iterator + _actual_find_factory(const FileSignature& signature, + File& input) const + { + const_iterator iter = this->_registry.begin(); + const_iterator const end = this->_registry.end(); + while (iter != end) + { + if (iter->second->can_read(signature, input)) + return iter; + ++iter; + } + return end; + } + +}; + +//! A helper class to allow automatic registration to the default InputFileFormatRegistry +/*! \ingroup IO + If you have a variable of type + RegisterInputFileFormat\, \c MyInputFileFormat will be added to the + default registry, as long as that variable is not destructed. + + This is used in STIR in the IO/IO_registries.cxx file. +*/ +template +struct RegisterInputFileFormat +{ + typedef typename Format::data_type data_type; + //! constructor adds the \c Format to the registry with the given \c ranking. + explicit RegisterInputFileFormat(const unsigned ranking) + { + shared_ptr > format_sptr(new Format); + InputFileFormatRegistry::default_sptr()-> + add_to_registry(format_sptr, ranking); + } + + /*! \brief Destructor remove the format from the registry. + */ + ~RegisterInputFileFormat() + { + Format format; + InputFileFormatRegistry::default_sptr()-> + remove_from_registry(format); + } +}; + + + +END_NAMESPACE_STIR + +//#include "stir/IO/InputFileFormatRegistry.inl" + +#endif diff --git a/src/include/stir/IO/InputFileFormatRegistry.txx b/src/include/stir/IO/InputFileFormatRegistry.txx new file mode 100644 index 0000000000..95e5985105 --- /dev/null +++ b/src/include/stir/IO/InputFileFormatRegistry.txx @@ -0,0 +1,161 @@ +// +// +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Implementation of class stir::InputFileFormatRegistry + + This file provides the implementations of the template class + stir::InputFileFormatRegistry. It has to be included by a .cxx + file that needs to instantiate this class. + + \author Kris Thielemans + +*/ + +#include "stir/IO/InputFileFormatRegistry.h" +#include "stir/IO/FileSignature.h" +#include "stir/utilities.h" // for open_read_binary +#include // for make_pair +#include + +START_NAMESPACE_STIR + +template +shared_ptr >& +InputFileFormatRegistry::default_sptr() +{ + /* Implementation note: + It is safer to have a static member inside this function than + to have a static member of the class. The reason for this is + that there is no guarantee on the order in which static + class members are initialised. So, if other static initialisers + would call default_sptr(), we wouldn't be sure if the current + _default_sptr is already initialised. + With the current implementation, there is no such problem + (except potentially in threaded cases. You have to make sure + that this function is called once before starting any threads). + + Note that this function cannot be inline because the static member + should be initialised in one translation unit only. + */ + static shared_ptr > + _default_sptr(new InputFileFormatRegistry); + + // std::cerr<< "\ndefault_sptr value " << _default_sptr.get() << std::endl; + return _default_sptr; +} + +template +void +InputFileFormatRegistry:: +add_to_registry(FactorySPtr const & factory, const unsigned ranking) +{ + this->_registry.insert(std::make_pair(ranking, factory)); +} + +template +void +InputFileFormatRegistry:: +remove_from_registry(const Factory& factory) +{ + iterator iter = this->_registry.begin(); + iterator const end = this->_registry.end(); + while (iter != end) + { + if (typeid(*iter->second) == typeid(factory)) + { + this->_registry.erase(iter); + return; + } + ++iter; + } +} + +template +typename InputFileFormatRegistry::Factory const & +InputFileFormatRegistry:: +find_factory(const FileSignature& signature, + std::istream& input) const +{ + const_iterator iter= this->_actual_find_factory(signature, input); + if (this->_valid(iter)) + return *(iter->second); + else + { + std::cerr << "Available input file formats:\n"; + this->list_registered_names(std::cerr); + error("no file format found that can read this data"); + } + // we never get here, but most compilers will complain here + // so we 'return' a bogus factory + return (*iter->second); +} + +template +typename InputFileFormatRegistry::Factory const & +InputFileFormatRegistry:: +find_factory(const FileSignature& signature, + const std::string& filename) const +{ + const_iterator iter= this->_actual_find_factory(signature, filename); + if (this->_valid(iter)) + return *(iter->second); + else + { + std::cerr << "Available input file formats:\n"; + this->list_registered_names(std::cerr); + error("no file format found that can read file '%s'", filename.c_str()); + } + // we never get here, but most compilers will complain here + // so we 'return' a bogus factory + return (*iter->second); +} + +template +typename InputFileFormatRegistry::Factory const & +InputFileFormatRegistry:: +find_factory(const std::string& filename) const +{ + return this->find_factory(FileSignature(filename), filename); +} + +template +typename InputFileFormatRegistry::Factory const & +InputFileFormatRegistry:: +find_factory(std::istream& input) const +{ + return this->find_factory(FileSignature(input), input); +} + +template +void +InputFileFormatRegistry:: +list_registered_names(std::ostream& stream) const +{ + const_iterator iter = this->_registry.begin(); + const_iterator const end = this->_registry.end(); + while (iter != end) + { + stream << iter->second->get_name() << '\n'; + ++iter; + } +} + +END_NAMESPACE_STIR + diff --git a/src/include/stir/IO/InputStreamWithRecords.h b/src/include/stir/IO/InputStreamWithRecords.h new file mode 100644 index 0000000000..6150797125 --- /dev/null +++ b/src/include/stir/IO/InputStreamWithRecords.h @@ -0,0 +1,150 @@ +// +// +/*! + \file + \ingroup IO + \brief Declaration of class stir::InputStreamWithRecords + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_IO_InputStreamWithRecords_H__ +#define __stir_IO_InputStreamWithRecords_H__ + +#include "stir/shared_ptr.h" +#include "stir/Succeeded.h" + +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::istream; +using std::string; +using std::streampos; +using std::vector; +#endif + +START_NAMESPACE_STIR + +//! A helper class to read data from a (presumably binary) stream +/*! \ingroup IO + This class is really a helper class for reading different records from a stream. + It is useful when all types of records have some kind of signature to allow + the function to find out what the size of the record is. In that case, all IO + handling is completely generic and is implemented in this class. + + Current implementation needs a \c max_size_of_record to allocate enough memory + (on the stack) before reading. This is efficient in many cases, but impractical + in others. + + \par Requirements + \c RecordT needs to have the following member functions + \code + std::size_t + size_of_record_at_ptr(const char * const buffer, const std::size_t size_available_in_buffer, + const OptionsT options) const; + + Succeeded + init_from_data_ptr(const char * const buffer, + const std::size_t size_of_record, + const OptionsT options); + \endcode + + \todo Allow choosing between allocation with \c new or on the stack. +*/ +template +class InputStreamWithRecords +{ +public: + typedef vector::size_type SavedPosition; + //! Constructor taking a stream + /*! Data will be assumed to start at the current position reported by seekg(). + If reset() is used, it will go back to this starting position.*/ + inline + InputStreamWithRecords(const shared_ptr& stream_ptr, + const std::size_t size_of_record_signature, + const std::size_t max_size_of_record, + const OptionsT& options); + + //! Constructor taking a filename + /*! File will be opened in binary mode. Data will be assumed to + start at \a start_of_data. + */ + inline + InputStreamWithRecords(const string& filename, + const std::size_t size_of_record_signature, + const std::size_t max_size_of_record, + const OptionsT& options, + const streampos start_of_data = 0); + + inline + virtual + Succeeded get_next_record(RecordT& record) const; + + //! go back to starting position + inline + Succeeded reset(); + + //! save current "get" position in an internal array + /*! \return an "index" into the array that allows you to go back. + \see set_get_position + */ + inline + SavedPosition save_get_position(); + + //! set current "get" position to previously saved value + inline + Succeeded set_get_position(const SavedPosition&); + + //! Function that enables the user to store the saved get_positions + /*! Together with set_saved_get_positions(), this allows + reinstating the saved get_positions when + reopening the same stream. + */ + inline + vector get_saved_get_positions() const; + //! Function that sets the saved get_positions + /*! Normally, the argument results from a call to + get_saved_get_positions() on the same stream. + \warning There is no check if the argument actually makes sense + for the current stream. + */ + inline + void set_saved_get_positions(const vector& ); + +private: + + const string filename; + shared_ptr stream_ptr; + streampos starting_stream_position; + vector saved_get_positions; + + const std::size_t size_of_record_signature; + const std::size_t max_size_of_record; + + const OptionsT options; +}; + +END_NAMESPACE_STIR + +#include "stir/IO/InputStreamWithRecords.inl" + +#endif diff --git a/src/include/stir/IO/InputStreamWithRecords.inl b/src/include/stir/IO/InputStreamWithRecords.inl new file mode 100644 index 0000000000..38ccefe479 --- /dev/null +++ b/src/include/stir/IO/InputStreamWithRecords.inl @@ -0,0 +1,195 @@ +/*! + \file + \ingroup IO + \brief Implementation of class stir::InputStreamWithRecords + + \author Kris Thielemans +*/ +/* + Copyright (C) 2003-2011, Hammersmith Imanet Ltd + Copyright (C) 2012-2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/utilities.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/shared_ptr.h" +#include "boost/shared_array.hpp" +#include + +#ifndef STIR_NO_NAMESPACES +using std::fstream; +using std::streamsize; +using std::streampos; +#endif + +START_NAMESPACE_STIR +template +InputStreamWithRecords:: +InputStreamWithRecords(const shared_ptr& stream_ptr, + const std::size_t size_of_record_signature, + const std::size_t max_size_of_record, + const OptionsT& options) + : stream_ptr(stream_ptr), + size_of_record_signature(size_of_record_signature), + max_size_of_record(max_size_of_record), + options(options) +{ + assert(size_of_record_signature<=max_size_of_record); + if (is_null_ptr(stream_ptr)) + return; + starting_stream_position = stream_ptr->tellg(); + if (!stream_ptr->good()) + error("InputStreamWithRecords: error in tellg()\n"); +} + +template +InputStreamWithRecords:: +InputStreamWithRecords(const string& filename, + const std::size_t size_of_record_signature, + const std::size_t max_size_of_record, + const OptionsT& options, + const streampos start_of_data) + : filename(filename), + starting_stream_position(start_of_data), + size_of_record_signature(size_of_record_signature), + max_size_of_record(max_size_of_record), + options(options) +{ + assert(size_of_record_signature<=max_size_of_record); + fstream* s_ptr = new fstream; + open_read_binary(*s_ptr, filename.c_str()); + stream_ptr.reset(s_ptr); + if (reset() == Succeeded::no) + error("InputStreamWithRecords: error in reset() for filename %s\n", + filename.c_str()); +} + +template +Succeeded +InputStreamWithRecords:: +get_next_record(RecordT& record) const +{ + if (is_null_ptr(stream_ptr)) + return Succeeded::no; + + // rely on file caching by the C++ library or the OS + assert(this->size_of_record_signature <= this->max_size_of_record); + boost::shared_array data_sptr(new char[this->max_size_of_record]); + char * data_ptr = data_sptr.get(); + stream_ptr->read(data_ptr, this->size_of_record_signature); + if (stream_ptr->gcount()(this->size_of_record_signature)) + return Succeeded::no; + const std::size_t size_of_record = record.size_of_record_at_ptr(data_ptr, this->size_of_record_signature,options); + assert(size_of_record <= this->max_size_of_record); + if (size_of_record > this->size_of_record_signature) + stream_ptr->read(data_ptr + this->size_of_record_signature, + size_of_record - this->size_of_record_signature); + if (stream_ptr->eof()) + return Succeeded::no; + else if (stream_ptr->bad()) + { + warning("Error after reading from list mode stream in get_next_record"); + return Succeeded::no; + } + return + record.init_from_data_ptr(data_ptr, size_of_record,options); +} + + + +template +Succeeded +InputStreamWithRecords:: +reset() +{ + if (is_null_ptr(stream_ptr)) + return Succeeded::no; + + // Strangely enough, once you read past EOF, even seekg(0) doesn't reset the eof flag + if (stream_ptr->eof()) + stream_ptr->clear(); + stream_ptr->seekg(starting_stream_position, std::ios::beg); + if (stream_ptr->bad()) + return Succeeded::no; + else + return Succeeded::yes; +} + + +template +typename InputStreamWithRecords::SavedPosition +InputStreamWithRecords:: +save_get_position() +{ + assert(!is_null_ptr(stream_ptr)); + // TODO should somehow check if tellg() worked and return an error if it didn't + streampos pos; + if (!stream_ptr->eof()) + { + pos = stream_ptr->tellg(); + if (!stream_ptr->good()) + error("InputStreamWithRecords::save_get_position\n" + "Error after getting position in file"); + } + else + { + // use -1 to signify eof + // (this is probably the behaviour of tellg anyway, but this way we're sure). + pos = streampos(-1); + } + saved_get_positions.push_back(pos); + return saved_get_positions.size()-1; +} + +template +Succeeded +InputStreamWithRecords:: +set_get_position(const typename InputStreamWithRecords::SavedPosition& pos) +{ + if (is_null_ptr(stream_ptr)) + return Succeeded::no; + + assert(pos < saved_get_positions.size()); + if (saved_get_positions[pos] == streampos(-1)) + stream_ptr->seekg(0, std::ios::end); // go to eof + else + stream_ptr->seekg(saved_get_positions[pos]); + + if (!stream_ptr->good()) + return Succeeded::no; + else + return Succeeded::yes; +} + +template +vector +InputStreamWithRecords:: +get_saved_get_positions() const +{ + return saved_get_positions; +} + +template +void +InputStreamWithRecords:: +set_saved_get_positions(const vector& poss) +{ + saved_get_positions = poss; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.h b/src/include/stir/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.h new file mode 100644 index 0000000000..6b57405a79 --- /dev/null +++ b/src/include/stir/IO/InterfileDynamicDiscretisedDensityOutputFileFormat.h @@ -0,0 +1,82 @@ +// +// +/* + Copyright (C) 2006-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup InterfileIO + \brief Declaration of class stir::InterfileDynamicDiscretisedDensityOutputFileFormat + + \author Kris Thielemans + +*/ + +#ifndef __stir_IO_InterfileDynamicDiscretisedDensityOutputFileFormat_H__ +#define __stir_IO_InterfileDynamicDiscretisedDensityOutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +class DynamicDiscretisedDensity; + +/*! + \ingroup InterfileIO + \brief + Implementation of OutputFileFormat paradigm for the Interfile format. + */ + +class InterfileDynamicDiscretisedDensityOutputFileFormat : + public RegisteredParsingObject< + InterfileDynamicDiscretisedDensityOutputFileFormat, + OutputFileFormat, + OutputFileFormat > +{ + private: + typedef + RegisteredParsingObject< + InterfileDynamicDiscretisedDensityOutputFileFormat, + OutputFileFormat, + OutputFileFormat > base_type; +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + InterfileDynamicDiscretisedDensityOutputFileFormat(const NumericType& = NumericType::FLOAT, + const ByteOrder& = ByteOrder::native); + + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + protected: + virtual Succeeded + actual_write_to_file(string& output_filename, + const DynamicDiscretisedDensity& density) const; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/IO/InterfileHeader.h b/src/include/stir/IO/InterfileHeader.h new file mode 100644 index 0000000000..eb9f6e295e --- /dev/null +++ b/src/include/stir/IO/InterfileHeader.h @@ -0,0 +1,234 @@ +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup InterfileIO + \brief This file declares the classes stir::InterfileHeader, + stir::InterfileImageHeader, stir::InterfilePDFSHeader + + \author Kris Thielemans + \author Sanida Mustafovic + \author Nicolas A Karakatsanis + \author PARAPET project + + See http://stir.sourceforge.net for a description of the full + proposal for Interfile headers for 3D PET. +*/ + + +#ifndef __stir_INTERFILEHEADER_H__ +#define __stir_INTERFILEHEADER_H__ + +#include "stir/ByteOrder.h" +#include "stir/NumericInfo.h" +#include "stir/KeyParser.h" +#include "stir/ProjDataFromStream.h" +#include "stir/ExamInfo.h" +#include "stir/TimeFrameDefinitions.h" + +START_NAMESPACE_STIR + +class ProjDataInfo; + +/*! + \brief a class for Interfile keywords (and parsing) common to + all types of data + \ingroup InterfileIO + */ +class InterfileHeader : public KeyParser +{ +public: + //! A value that can be used to signify that a variable has not been set during parsing. + static const double double_value_not_set; + + InterfileHeader(); + + virtual ~InterfileHeader() {} + +protected: + // Returns false if OK, true if not. + virtual bool post_processing(); + + shared_ptr exam_info_sptr; + +private: + + // TODO the next few ones should be made static members + // Lists of possible values for some keywords + ASCIIlist_type number_format_values; + ASCIIlist_type byte_order_values; + ASCIIlist_type patient_orientation_values; + ASCIIlist_type patient_rotation_values; + + // Corresponding variables here + + int number_format_index; + int byte_order_index; + int patient_orientation_index; + int patient_rotation_index; + + // Extra private variables which will be translated to something more useful + string imaging_modality_as_string; + void set_imaging_modality(); + + void set_type_of_data(); + + int num_time_frames; + std::vector image_relative_start_times; + std::vector image_durations; + + int bytes_per_pixel; + + // Louvain la Neuve style of 'image scaling factors' + double lln_quantification_units; + protected: + virtual void read_matrix_info(); + void read_frames_info(); + +public : + //! Get a pointer to the exam information + const ExamInfo* + get_exam_info_ptr() const; + + //! Get a shared pointer to the exam information + shared_ptr + get_exam_info_sptr() const; + + string version_of_keys; + + ASCIIlist_type type_of_data_values; + int type_of_data_index; + + ASCIIlist_type PET_data_type_values; + int PET_data_type_index; + + ASCIIlist_type process_status_values; + int process_status_index; + + // 'Final' variables + + string data_file_name; + + //! This will be determined from number_format_index and bytes_per_pixel + NumericType type_of_numbers; + //! This will be determined from byte_order_index, or just keep its default value; + ByteOrder file_byte_order; + + int num_dimensions; + std::vector matrix_labels; + std::vector > matrix_size; + std::vector pixel_sizes; + std::vector > image_scaling_factors; + std::vector data_offset_each_dataset; + + //Added for old implementations relying on time_frame_definitions variable + TimeFrameDefinitions time_frame_definitions; + + protected: + // version 3.3 had only a single offset. we'll internally replace it with data_offset_each_dataset + unsigned long data_offset; +}; + + +/*! + \brief a class for Interfile keywords (and parsing) specific to images + \ingroup InterfileIO + */ +class InterfileImageHeader : public InterfileHeader +{ + private: + typedef InterfileHeader base_type; + +public: + InterfileImageHeader(); + std::vector first_pixel_offsets; + +protected: + virtual void read_matrix_info(); + //! Returns false if OK, true if not. + virtual bool post_processing(); + +}; + +/*! + \brief a class for Interfile keywords (and parsing) specific to + projection data (i.e. ProjDataFromStream) + \ingroup InterfileIO + */ +class InterfilePDFSHeader : public InterfileHeader +{ +public: + InterfilePDFSHeader(); + +protected: + + //! Returns false if OK, true if not. + virtual bool post_processing(); + +public: + + vector segment_sequence; + vector min_ring_difference; + vector max_ring_difference; + vector num_rings_per_segment; + + vector applied_corrections; + + // derived values + int num_segments; + int num_views; + int num_bins; + ProjDataFromStream::StorageOrder storage_order; + ProjDataInfo* data_info_ptr; + +private: + void resize_segments_and_set(); + int find_storage_order(); + + // members that will be used to set Scanner + // TODO parsing should be moved to Scanner + int num_rings; + int num_detectors_per_ring; + + double transaxial_FOV_diameter_in_cm; + double inner_ring_diameter_in_cm; + double average_depth_of_interaction_in_cm; + double distance_between_rings_in_cm; + double default_bin_size_in_cm; + // this intrinsic tilt + double view_offset_in_degrees; + int max_num_non_arccorrected_bins; + int default_num_arccorrected_bins; + + + int num_axial_blocks_per_bucket; + int num_transaxial_blocks_per_bucket; + int num_axial_crystals_per_block; + int num_transaxial_crystals_per_block; + int num_axial_crystals_per_singles_unit; + int num_transaxial_crystals_per_singles_unit; + int num_detector_layers; + // end scanner parameters + + double effective_central_bin_size_in_cm; + bool is_arccorrected; +}; + +END_NAMESPACE_STIR + +#endif // __stir_INTERFILEHEADER_H__ diff --git a/src/include/stir/IO/InterfileImageInputFileFormat.h b/src/include/stir/IO/InterfileImageInputFileFormat.h new file mode 100644 index 0000000000..ab0a91031c --- /dev/null +++ b/src/include/stir/IO/InterfileImageInputFileFormat.h @@ -0,0 +1,84 @@ +// +// +#ifndef __stir_IO_InterfileInputFileFormat_h__ +#define __stir_IO_InterfileInputFileFormat_h__ +/* + Copyright (C) 2006 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013-01-01 - 2013, Kris Thielemans + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Declaration of class stir::InterfileInputFileFormat + + \author Kris Thielemans + +*/ +#include "stir/IO/InputFileFormat.h" +#include "stir/IO/interfile.h" +#include "stir/utilities.h" +#include "stir/DiscretisedDensity.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/error.h" +#include "stir/is_null_ptr.h" + +START_NAMESPACE_STIR + +//! Class for reading images in Interfile file-format. +/*! \ingroup IO + +*/ +class InterfileImageInputFileFormat : +public InputFileFormat > +{ + public: + virtual const std::string + get_name() const + { return "Interfile"; } + + protected: + virtual + bool + actual_can_read(const FileSignature& signature, + std::istream& input) const + { + //. todo should check if it's an image + return is_interfile_signature(signature.get_signature()); + } + + virtual std::auto_ptr + read_from_file(std::istream& input) const + { + std::auto_ptr ret(read_interfile_image(input)); + if (is_null_ptr(ret)) + { + error("failed to read an Interfile image from stream"); + } + return ret; + } + virtual std::auto_ptr + read_from_file(const std::string& filename) const + { + std::auto_ptr ret(read_interfile_image(filename)); + if (is_null_ptr(ret)) + { + error("failed to read an Interfile image from file \"%s\"", filename.c_str()); + } + return ret; + } +}; +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/InterfileOutputFileFormat.h b/src/include/stir/IO/InterfileOutputFileFormat.h new file mode 100644 index 0000000000..706b9a899b --- /dev/null +++ b/src/include/stir/IO/InterfileOutputFileFormat.h @@ -0,0 +1,83 @@ +// +// +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup InterfileIO + \brief Declaration of class stir::InterfileOutputFileFormat + + \author Kris Thielemans + +*/ + +#ifndef __stir_IO_InterfileOutputFileFormat_H__ +#define __stir_IO_InterfileOutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +template class DiscretisedDensity; + +/*! + \ingroup InterfileIO + \brief + Implementation of OutputFileFormat paradigm for the Interfile format. + */ +class InterfileOutputFileFormat : + public RegisteredParsingObject< + InterfileOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +{ + private: + typedef + RegisteredParsingObject< + InterfileOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > + base_type; +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + InterfileOutputFileFormat(const NumericType& = NumericType::FLOAT, + const ByteOrder& = ByteOrder::native); + + + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + protected: + virtual Succeeded + actual_write_to_file(string& output_filename, + const DiscretisedDensity<3,float>& density) const; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/IO/InterfilePDFSHeaderSPECT.h b/src/include/stir/IO/InterfilePDFSHeaderSPECT.h new file mode 100644 index 0000000000..a39a0fa3a5 --- /dev/null +++ b/src/include/stir/IO/InterfilePDFSHeaderSPECT.h @@ -0,0 +1,81 @@ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup InterfileIO + \brief This file declares the class stir::InterfilePDFSHeaderSPECT + + \author Berta Marti Fuster + \author Kris Thielemans +*/ + + +#ifndef __stir_INTERFILEPDFSHEADERSPECT_H__ +#define __stir_INTERFILEPDFSHEADERSPECT_H__ + +#include "stir/IO/InterfileHeader.h" + + +START_NAMESPACE_STIR + +class ProjDataInfo; + +/*! + \brief a class for Interfile keywords (and parsing) specific to + SPECT projection data + \ingroup InterfileIO + */ +class InterfilePDFSHeaderSPECT : public InterfileHeader +{ +public: + InterfilePDFSHeaderSPECT(); + +protected: + + //! Returns false if OK, true if not. + virtual bool post_processing(); + + private: + + //! in mm + std::vector radii_of_rotation; + + int num_views; + int num_bins; + int start_angle; + string direction_of_rotation; + double extent_of_rotation; + string orbit; +public: + ProjDataFromStream::StorageOrder storage_order; + shared_ptr data_info_sptr; + +private: + int num_segments; + // ! for circular orbits (in mm ) + double radius_of_rotation; + + double bin_size_in_cm; + int num_axial_poss; + +}; + + +END_NAMESPACE_STIR + +#endif // __stir_INTERFILEHEADERSPECT_H__ diff --git a/src/include/stir/IO/InterfileParametricDensityOutputFileFormat.h b/src/include/stir/IO/InterfileParametricDensityOutputFileFormat.h new file mode 100644 index 0000000000..7efe77cb1e --- /dev/null +++ b/src/include/stir/IO/InterfileParametricDensityOutputFileFormat.h @@ -0,0 +1,101 @@ +// +// +/* + Copyright (C) 2002-2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup InterfileIO + \brief Declaration of class stir::InterfileParametricDensityOutputFileFormat + + \author Kris Thielemans + +*/ + +#ifndef __stir_IO_InterfileParametricDensityOutputFileFormat_H__ +#define __stir_IO_InterfileParametricDensityOutputFileFormat_H__ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +//template class ParametricDiscretisedDensity; +template class ParametricDiscretisedDensity; + +/*! + \ingroup InterfileIO + \brief + Implementation of OutputFileFormat paradigm for the Interfile format. + */ +#if 0 +template +class InterfileParametricDensityOutputFileFormat : + public RegisteredParsingObject< + InterfileParametricDensityOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +#else +template +class InterfileParametricDensityOutputFileFormat : + public RegisteredParsingObject< + InterfileParametricDensityOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +#endif +{ + private: + typedef +#if 0 + RegisteredParsingObject< + InterfileParametricDensityOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +#else + RegisteredParsingObject< + InterfileParametricDensityOutputFileFormat, + OutputFileFormat >, + OutputFileFormat > > +#endif + base_type; +public : + //! Name which will be used when parsing an OutputFileFormat object + static const char * const registered_name; + + InterfileParametricDensityOutputFileFormat(const NumericType& = NumericType::FLOAT, + const ByteOrder& = ByteOrder::native); + + + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + protected: + virtual Succeeded + actual_write_to_file(string& output_filename, + const ParametricDiscretisedDensity& density) const; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/IO/OutputFileFormat.h b/src/include/stir/IO/OutputFileFormat.h new file mode 100644 index 0000000000..313ac2669c --- /dev/null +++ b/src/include/stir/IO/OutputFileFormat.h @@ -0,0 +1,214 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup IO + \brief Declaration of class stir::OutputFileFormat + + \author Kris Thielemans + +*/ + +#ifndef __stir_IO_OutputFileFormat_H__ +#define __stir_IO_OutputFileFormat_H__ + +#include "stir/RegisteredObject.h" +#include "stir/ParsingObject.h" +#include "stir/NumericType.h" +#include "stir/ByteOrder.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +class Succeeded; + + +/*! + \ingroup IO + \brief + Base class for classes that create output files. + + \par Parsing + The following keywords can be parsed (defaults indicated). + \verbatim + ; byte order defaults to native order + byte order := littleendian + ; type specification as in Interfile + number format:=float + number of bytes per pixel:=4 + + scale_to_write_data:=0 + \endverbatim + \todo Support projection data + \todo Provide functions that enable the user to inquire about + capabilities. For instance, supports_multi_time_frames(), + supports_different_xy_pixel_size() etc. + */ +template +class OutputFileFormat : + public RegisteredObject >, + public ParsingObject +{ +public: + //! A function to return a default output file format + static + shared_ptr > + default_sptr(); + + OutputFileFormat(const NumericType& = NumericType::FLOAT, + const ByteOrder& = ByteOrder::native); + + //! Write a single image to file + /*! + \param filename desired output filename. If it does not have an extension, + a default extension will/should be added by the derived class. + If there is an extension, the derived class should try to honour it. + On return, the parameter will be overwritten with the actual filename + used, such that the file can be read back using this string. + \param data the data to write to file. + \return Succeeded::yes if the file was successfully written. + + \warning In the case of file formats that use a separate header file, the \a + filename argument at input is/should be used as a filename for the file + with the actual data. At output however, the name of the header file + will/should be returned. This is all a bit messy, so it's + recommended to + not use an extension for the output filename. + */ + Succeeded + write_to_file(string& filename, + const DataT& data) const; + + //! write a single image to file + /*! See the version with non-const \a filename. This version does not return the + filename used. + */ + Succeeded + write_to_file(const string& filename, + const DataT& density) const; + + + //! get type used for outputting numbers + NumericType get_type_of_numbers() const; + //! get byte order used for output + ByteOrder get_byte_order(); + //! get scale to write the data + /*! \see set_scale_to_write_data + */ + float get_scale_to_write_data() const; + + + //! set type used for outputting numbers + /*! Returns type actually used. + Calls warning() with some text if the requested type is not supported. + + Default implementation accepts any type. + */ + virtual NumericType set_type_of_numbers(const NumericType&, const bool warn = false); + //! set byte order used for output + /*! Returns type actually used. + Calls warning() with some text if the requested type is not supported. + + Default implementation accepts any byte order. + */ + virtual ByteOrder set_byte_order(const ByteOrder&, const bool warn = false); + //! set byte order and data type used for output + /*! Changes parameters to the types actually used. + Calls warning() with some text if the requested type is not supported. + + This function is necessary in case a byte order for a particular data type is not supported. + + Default implementation calls set_byte_order() and set_type_of_numbers(). + */ + virtual void set_byte_order_and_type_of_numbers(ByteOrder&, NumericType&, const bool warn = false); + + //! set scale outputting numbers + /*! Returns scale actually used. + Calls warning() with some text if the requested scale is not supported. + + If \a scale_to_write_data is 0 (which is the default), the output will + be rescaled such that the maximum range of the output type of numbers is used, + except for floats and doubles in which case no rescaling occurs. + + Default implementation accepts any scale. + */ + virtual float set_scale_to_write_data(const float new_scale_to_write_data, const bool warn=false); + +protected: + //! type used for outputting numbers + NumericType type_of_numbers; + //! byte order used for output + ByteOrder file_byte_order; + //! scale to write the data + /*! \see set_scale_to_write_data + */ + float scale_to_write_data; + + //! virtual function called by write_to_file() + /*! This function has to be overloaded by the derived class. + + The reason we do not simply make write_to_file() virtual is that we have + 2 versions of write_to_file. C++ rules are such that overloading the virtual + function in a derived class means that the other version gets hidden. Having + the non-virtual write_to_file() call the virtual actual_write_to_file() solves + this problem. + */ + virtual Succeeded + actual_write_to_file(string& filename, + const DataT& density) const = 0; + + // parsing stuff + + //! sets value for output data type + /*! Has to be called by set_defaults() in the leaf-class */ + virtual void set_defaults(); + //! sets keys for output data type for parsing + /*! Has to be called by initialise_keymap() in the leaf-class */ + virtual void initialise_keymap(); + //! Checks if parameters have sensible values after parsing + /*! Has to be called by post_processing() in the leaf-class */ + virtual bool post_processing(); + //! overloaded member for ParsingObject::set_key_values() + /*! Has to be called by set_key_values() in the leaf-class (if it redefines it) */ + virtual void set_key_values(); + +private: + static shared_ptr > _default_sptr; + // Lists of possible values for some keywords + static ASCIIlist_type number_format_values; + static ASCIIlist_type byte_order_values; + + // Corresponding variables here + + int number_format_index; + int byte_order_index; + int bytes_per_pixel; +}; + + + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/IO/OutputFileFormat.txx b/src/include/stir/IO/OutputFileFormat.txx new file mode 100644 index 0000000000..9833042d48 --- /dev/null +++ b/src/include/stir/IO/OutputFileFormat.txx @@ -0,0 +1,237 @@ +// +// +/* + Copyright (C) 2003- 2009-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + + \brief implementation of the stir::OutputFileFormat class + \author Kris Thielemans + +*/ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +template +ASCIIlist_type +OutputFileFormat::number_format_values; + +template +ASCIIlist_type +OutputFileFormat::byte_order_values; + +template +shared_ptr > +OutputFileFormat:: +default_sptr() +{ + return OutputFileFormat::_default_sptr; +} + +template +OutputFileFormat:: +OutputFileFormat(const NumericType& type, + const ByteOrder& byte_order) + : type_of_numbers(type), file_byte_order(byte_order) +{ +} + +template +void +OutputFileFormat:: +set_defaults() +{ + file_byte_order = ByteOrder::native; + type_of_numbers = NumericType::FLOAT; + scale_to_write_data = 0.F; + + set_key_values(); +} + +template +void +OutputFileFormat:: +initialise_keymap() +{ + + if (number_format_values.size()==0) + { + number_format_values.push_back("bit"); + number_format_values.push_back("ascii"); + number_format_values.push_back("signed integer"); + number_format_values.push_back("unsigned integer"); + number_format_values.push_back("float"); + + assert(byte_order_values.size()==0); + byte_order_values.push_back("LITTLEENDIAN"); + byte_order_values.push_back("BIGENDIAN"); + } + parser.add_key("byte order", + &byte_order_index, + &byte_order_values); + parser.add_key("number format", + &number_format_index, + &number_format_values); + parser.add_key("number of bytes per pixel", + &bytes_per_pixel); + parser.add_key("scale_to_write_data", + &scale_to_write_data); +} + +template +void +OutputFileFormat:: +set_key_values() +{ + byte_order_index = + file_byte_order == ByteOrder::little_endian ? + 0 : 1; + + string number_format; + size_t bytes_per_pixel_in_size_t; + type_of_numbers.get_Interfile_info(number_format, + bytes_per_pixel_in_size_t); + bytes_per_pixel = static_cast(bytes_per_pixel_in_size_t); + number_format_index = + parser.find_in_ASCIIlist(number_format, number_format_values); + +} + +template +bool +OutputFileFormat:: +post_processing() +{ + if (number_format_index<0 || + static_cast(number_format_index)>= + number_format_values.size()) + { + warning("OutputFileFormat parser internal error: " + "'number_format_index' out of range\n"); + return true; + } + // check if bytes_per_pixel is set if the data type is not 'bit' + if (number_format_index!=0 && bytes_per_pixel<=0) + { + warning("OutputFileFormat parser: " + "'number_of_bytes_per_pixel' should be > 0\n"); + return true; + } + + type_of_numbers = NumericType(number_format_values[number_format_index], + bytes_per_pixel); + + if (type_of_numbers == NumericType::UNKNOWN_TYPE) + { + warning("OutputFileFormat parser: " + "unrecognised data type. Check either " + "'number_of_bytes_per_pixel' or 'number format'\n"); + return true; + } + + switch(byte_order_index) + { + case -1: + file_byte_order = ByteOrder::native; break; + case 0: + file_byte_order = ByteOrder::little_endian; break; + case 1: + file_byte_order = ByteOrder::big_endian; break; + default: + warning("OutputFileFormat parser internal error: " + "'byte_order_index' out of range\n"); + return true; + } + + set_byte_order(file_byte_order, true); + set_type_of_numbers(type_of_numbers, true); + + return false; +} + +template +NumericType +OutputFileFormat:: +get_type_of_numbers() const +{ return type_of_numbers; } + +template +ByteOrder +OutputFileFormat:: +get_byte_order() +{ return file_byte_order; } + +template +float +OutputFileFormat:: +get_scale_to_write_data() const +{ return scale_to_write_data; } + +template +NumericType +OutputFileFormat:: +set_type_of_numbers(const NumericType& new_type, const bool warn) +{ return type_of_numbers = new_type; } + +template +ByteOrder +OutputFileFormat:: +set_byte_order(const ByteOrder& new_byte_order, const bool warn) +{ return file_byte_order = new_byte_order; } + +template +float +OutputFileFormat:: +set_scale_to_write_data(const float new_scale_to_write_data, const bool warn) +{ return scale_to_write_data = new_scale_to_write_data; } + +template +void +OutputFileFormat:: +set_byte_order_and_type_of_numbers(ByteOrder& new_byte_order, NumericType& new_type, const bool warn) +{ + new_byte_order = set_byte_order(new_byte_order, warn); + new_type = set_type_of_numbers(new_type, warn); +} + +template +Succeeded +OutputFileFormat:: +write_to_file(string& filename, + const DataT& density) const +{ + return actual_write_to_file(filename, density); +} + +template +Succeeded +OutputFileFormat:: +write_to_file(const string& filename, + const DataT& density) const +{ + string filename_to_use = filename; + return + write_to_file(filename_to_use, density); +}; + +END_NAMESPACE_STIR + diff --git a/src/include/stir/IO/ecat6_types.h b/src/include/stir/IO/ecat6_types.h new file mode 100644 index 0000000000..8c5f852fc1 --- /dev/null +++ b/src/include/stir/IO/ecat6_types.h @@ -0,0 +1,121 @@ +// +// + +/*! + \file + \ingroup ECAT + \brief ECAT 6 CTI matrix parameters + \author Larry Byars + \author PARAPET project + + Enumerations of the data type and format. + + Structures:
        + - scanner parameters
        + - matrix blocks and parameters
        + - main header, scan and image subheaders +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +#ifndef __stir_IO_ecat6_types_h +#define __stir_IO_ecat6_types_h + +// include this for namespace macros +#include "stir/IO/stir_ecat_common.h" +// define to use the original version of the code +//#define STIR_ORIGINAL_ECAT6 + +#ifndef STIR_ORIGINAL_ECAT6 +#ifdef STIR_NO_NAMESPACES +// terrible trick to avoid conflict between stir::Sinogram and Sinogram defined in matrix.h +// when we do have namespaces, the conflict can be resolved by using ::Sinogram +#define Sinogram CTISinogram +#else +#define CTISinogram ::Sinogram +#endif + +#include "matrix.h" + +#ifdef STIR_NO_NAMESPACES +#undef Sinogram +#endif + +#endif // STIR_ORIGINAL_ECAT6 + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 + +// matrix.h defines MatBLKSIZE and MatFirstDirBlk. we undefine them here to avoid conflicts +#ifdef MatBLKSIZE +#undef MatBLKSIZE +#endif +#ifdef MatFirstDirBlk +#undef MatFirstDirBlk +#endif +const int MatBLKSIZE = 512; +const int MatFirstDirBlk = 2; + +// MatFileType +typedef enum { + matScanFile = 1, // sinogram data + matImageFile = 2, // image file + matAttenFile = 3, // attenuation correction file + matNormFile = 4 // normalization file +} MatFileType; + + + +//#define matScanData matI2Data +//#define matImageData matI2Data + +typedef short word; +typedef unsigned char byte; + +/*! + \struct ScanInfoRec + \brief ECAT 6 CTI scanner parameters + \ingroup ECAT + \param nprojs number of projections + \param nviews number of views + \param nblks number of blocks (planes) + \param strtblk first block + \param data_type type of data (float, short, ...) +*/ +typedef struct ScanInfoRec { + int nprojs, + nviews, + nblks, + strtblk; + word data_type; +} ScanInfoRec; + +#ifndef STIR_ORIGINAL_ECAT6 +typedef Main_header ECAT6_Main_header; +typedef struct Matval Matval; + +#else // STIR_ORIGINAL_ECAT6 + +#error STIR_ORIGINAL_ECAT6 no longer supported + +#endif // STIR_ORIGINAL_ECAT6 + +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT6 +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/IO/ecat6_utils.h b/src/include/stir/IO/ecat6_utils.h new file mode 100644 index 0000000000..a43d650202 --- /dev/null +++ b/src/include/stir/IO/ecat6_utils.h @@ -0,0 +1,402 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup ECAT + \brief Declaration of ECAT 6 CTI functions to access data + \author Damien Sauge + \author Kris Thielemans + \author PARAPET project +*/ +/* History: + KT 18/08/2000 added file_data_to_host, get_attnheaders + KT 11/01/2002 added normalisation file things, removed get_attndata + KT 13/01/2008 replace original CTI code with calls to LLN matrix library: + introduced mhead_ptr in various functions + have #define STIR_ORIGINAL_ECAT6 to be able to switch between old and new version +*/ + +#ifndef __stir_IO_ecat6_utils_h +#define __stir_IO_ecat6_utils_h + +#include "stir/IO/ecat6_types.h" + +#include + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 + +// CTI UTILITIES + +/*! \brief Encode scan information into a single, incomprehensible number. + \ingroup ECAT +*/ +long cti_numcod (int frame, int plane, int gate, int data, int bed); +/*! + \brief Unpack encoded data into a nice struct. Reverse of cti_numcod (). + \ingroup ECAT + + \param matnum the thingy to decode + \param matval struct containing the decoded values from matnum +*/ +void cti_numdoc (long matnum, Matval *matval); +/*! + \brief Get sinogram plane from ring pair. + \ingroup ECAT + + \param ring0 first ring in ring pair + \param ring1 second ring in ring pair +*/ +int cti_rings2plane (short nrings, short ring0, short ring1); + +// FILE ACCESS + +/*! + \brief Open a file and write main header to it. Returns a pointer to the file, or 0 if unsuccessful. + \ingroup ECAT + + \param fname name of file to open + \param mhead pointer to main header struct to copy into the file +*/ +FILE *cti_create (const char *fname, const ECAT6_Main_header *mhead); + +/*! + \brief Read from a matrix file starting at the given block. Returns EXIT_SUCCESS if all went well. + \ingroup ECAT + + \param fptr file pointer + \param blkno first block to read + \param nblks number of blocks to read +*/ +int cti_rblk (FILE *fptr, int blkno, void *bufr, int nblks); +/*! + \brief Write blocks from buffer into file. Returns EXIT_SUCCESS if successful. + \ingroup ECAT + + \param fptr pointer to file. + \param blkno position in file of first block to write. + \param nblks number of blocks to write. +*/ +int cti_wblk (FILE *fptr, int blkno, void *bufr, int nblks); +/*! + \brief Read header data from a file and place it into a ECAT6_Main_header struct. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr file containing the header data + \param h struct to fill with header info +*/ +int cti_read_ECAT6_Main_header (FILE *fptr, ECAT6_Main_header *h); +/*! + \brief Read header data from a file and place it into a Scan_subheader + struct. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr file containing the header data + \param blknum block number at which to begin reading + \param h struct to fill +*/ +int cti_read_scan_subheader (FILE *fptr, const ECAT6_Main_header *, int blknum, Scan_subheader *); + + +/*! + \brief Read header data from a file and place it into a Attn_subheader + struct. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr file containing the header data + \param blknum block number at which to begin reading + \param header_ptr struct to fill +*/ +int cti_read_attn_subheader(FILE* fptr, const ECAT6_Main_header *h, int blknum, Attn_subheader *header_ptr); + + +/*! + \brief Read header data from a file and place it into a Norm_subheader + struct. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr file containing the header data + \param blknum block number at which to begin reading + \param header_ptr struct to fill +*/ +int cti_read_norm_subheader(FILE* fptr, const ECAT6_Main_header *h, int blknum, Norm_subheader *header_ptr); + +/*! + \brief Read header data from a file and place it into an Image_subheader + struct. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr file containing the header data + \param blknum block number at which to begin reading + \param header_ptr struct to fill +*/ +int cti_read_image_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, Image_subheader *header_ptr); + +/*! + \brief Create entry in file corresponding to matnum, and return offset of + next block. Or some such. Returns 0 if there was an error. + \ingroup ECAT + + \param fptr pointer to file. + \param mhead_ptr pointer to a main header + \param matnum desired matnum. + \param nblks number of blocks +*/ +int cti_enter (FILE *fptr, const ECAT6_Main_header* mhead_ptr, long matnum, int nblks); +/*! + \brief Look up a "matrix number" in the file and return the MatDir entry + for it. Returns 0 if the lookup was NOT successful. + \ingroup ECAT + + \param fptr file containing all the tabulated information. + \param mhead_ptr pointer to a main header + \param matnum index. + \param entry where to put the result. +*/ +int cti_lookup (FILE *fptr, const ECAT6_Main_header* mhead_ptr, long matnum, MatDir *entry); +/*! + \brief Write data in blocks from buffer into file. + \ingroup ECAT + \internal + \param fptr pointer to file. + \param blk offset (in blocks) in file of first block to write. + \param data buffer to write + \param isize number of bytes to write. (should be multiple of MatBLKSIZE) +*/ +int cti_write_idata (FILE *fptr, int blk, const short *data, int isize); +/*! + \brief Write an image subheader into a matrix file. Returns 0 if successful. + \ingroup ECAT + + \param fptr pointer to file. + \param blknum offset (in blocks) in file of first block to write. + \param header_ptr header to write +*/ +int cti_write_image_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, const Image_subheader *header_ptr); +/*! + \brief Write an image main header into a matrix file. Returns 0 if successful. + \ingroup ECAT + + \param fptr pointer to file. + \param header_ptr header to write +*/ +int cti_write_ECAT6_Main_header (FILE *fptr, const ECAT6_Main_header *header_ptr); +/*! + \brief Write a scan subheader into a matrix file. + \ingroup ECAT + + \param fptr pointer to file. + \param blknum block offset at which to begin writing + \param header_ptr header to write +*/ +int cti_write_scan_subheader (FILE *fptr, const ECAT6_Main_header *h, int blknum, const Scan_subheader *header_ptr); + +/*! + \brief Write an image, including headers, into a matrix file. + \ingroup ECAT + \internal + + \param fptr pointer to file. + \param mhead_ptr pointer to main header + \param matnum matnum to use + \param header_ptr header to write + \param data data buffer containing image + \param data_size number of bytes in image + + \warning \a data_size has to be a multiple of MatBLKSIZE, even if there is + actually less data in the sinogram. Similarly, the buffer has to be + allocated to accomodate for this size. +*/ +int cti_write_image (FILE *fptr, long matnum, const ECAT6_Main_header *mhead_ptr, const Image_subheader *header_ptr, + const short *data, int data_size); +/*! + \brief Write a scan, including headers, into a matrix file. + \ingroup ECAT + \internal + + \param fptr pointer to file. + \param mhead_ptr pointer to main header + \param matnum matnum to use + \param header_ptr header to write + \param data data buffer containing sinogram + \param data_size number of bytes in sinogram + + \warning \a data_size has to be a multiple of MatBLKSIZE, even if there is + actually less data in the sinogram. Similarly, the buffer has to be + allocated to accomodate for this size. +*/ +int cti_write_scan (FILE *fptr, long matnum, const ECAT6_Main_header *mhead_ptr, const Scan_subheader *header_ptr, + const short *data, int data_size); +/*! + \brief Read main header and subheader from scan file. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr pointer to scan file + \param matnum matnum for scan + \param mhead where to put the main header + \param shead where to put the subheader + \param scanParams where to put the scan parameters +*/ +int get_scanheaders (FILE *fptr, long matnum, ECAT6_Main_header *mhead, + Scan_subheader *shead, ScanInfoRec *scanParams); +/*! + \brief Read scan data from file. Returns EXIT_FAILURE if the data could not be read. + \ingroup ECAT + + \param fptr scan file + \param scan buffer for the data, must be preallocated + \param scanParams data parameters + + The data will be stored according to the data_type in scanParams, but + converted (i.e. byte-swapped etc.) to the hosts native format. + + \warning the \a scan buffer has to be allocated with size a multiple of + MatBLKSIZE, even if there is actually less data in the sinogram. +*/ +// KT 18/05/2000 changed type from short to char + +int get_scandata (FILE *fptr, char *scan, ScanInfoRec *scanParams); + + +/*! + \brief Read main header and subheader from attn file. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr pointer to attn file + \param matnum matnum for attn + \param mhead where to put the main header + \param shead where to put the subheader + \param attnParams where to put the attn parameters +*/ +int get_attnheaders (FILE *fptr, long matnum, ECAT6_Main_header *mhead, + Attn_subheader *shead, ScanInfoRec *attnParams); + + +/*! + \brief Read main header and subheader from normalisation file. Returns EXIT_SUCCESS if no error. + \ingroup ECAT + + \param fptr pointer to nrm file + \param matnum matnum for nrm + \param mhead where to put the main header + \param shead where to put the subheader + \param nrmParams where to put the nrm parameters +*/ +int get_normheaders (FILE *fptr, long matnum, ECAT6_Main_header *mhead, + Norm_subheader *shead, ScanInfoRec *nrmParams); + +// OTHER UTILITIES + +//! Convert data in buffer dptr to native host format +int file_data_to_host(char *dptr, int nblks, int dtype); + +#ifdef STIR_ORIGINAL_ECAT6 + +/* + \brief Find minimum and maximum values in a buffer of floats + \ingroup ECAT + + \param buf array of count floats + \param min will be set to the smallest positive float in buf + \param max will be set to the largest float contained in buf + \param count number of elements in buf +*/ +void ffind_minmax (float *buf, float *min, float *max, int bufsize); +/* + \brief Find minimum and maximum values in a buffer of shorts + + \param buf array of bufsize shorts + \param min will be set to the smallest positive short in buf + \param max will be set to the largest short contained in buf + \param bufsize number of elements in array +*/ +void sfind_minmax (short *buf, short *min, short *max, int bufsize); +/* + \brief Copy array, swapping bytes as we go + + \param from input array + \param to output array (may be same as input array)ibytes + \param length total number of bytes to copy +*/ +void swab (char *from, char *to, int length); +/* + \brief Copy array, swapping 16-bit words as we go. + + \param from data buffer to copy. + \param to where to copy the data. may be same as (or overlap) from. + \param length number of 16-bit words to swap +*/ +void swaw (short *from, short *to, int length); +/* + \brief Get indexed value from buffer, a vax float, and return it as an IEEE float. + (a swab has to be performed first on bigendian machines) + + \param bufr input data buffer. + \param off offset into buffer of first 16-bit half of the 32-bit value to convert. +*/ +float get_vax_float (const unsigned short *bufr, int off); +/* + \brief Get the indexed value from a buffer, a 32-bit vax long, and convert it by swapping the words. + (a swab has to be performed first on bigendian machines) + + \param bufr input data buffer. + \param off index into buffer of first 16-bit word of the 32-bit value to convert. +*/ +long get_vax_long (const unsigned short *bufr, int off); +/*! + \brief Dump various parts of a main subheader into file + + \param fptr file to write into + \param mhead header to view +*/ +void dump_ECAT6_Main_header (FILE *fptr, const ECAT6_Main_header *mhead); +/* + \brief Convert a sun long int to a vax long int, i.e. swap the 16-bit words of the 32-bit long. + (sun long = sun int = 32 bits) + (a swab has to be performed afterwards on bigendian machines) + + \param in value to convert. + \param out result. +*/ +void hostltovaxl (const long in, unsigned short out [2]); +/* + \brief Convert a host float to a vax float + (a swab has to be performed afterwards on bigendian machines) + + \param in value to convert. + \param out result. +*/ +void hostftovaxf (const float in, unsigned short out [2]); + + +/*! \brief Fill main header with negative or default values.*/ +ECAT6_Main_header main_zero_fill(); +#endif // STIR_ORIGINAL_ECAT6 +/*! \brief Fill scan subheader with negative or default values.*/ +Scan_subheader scan_zero_fill(); +/*! \brief Fill image subheader with negative or default values.*/ +Image_subheader img_zero_fill(); + +END_NAMESPACE_ECAT6 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/IO/interfile.h b/src/include/stir/IO/interfile.h new file mode 100644 index 0000000000..e7b860bbe9 --- /dev/null +++ b/src/include/stir/IO/interfile.h @@ -0,0 +1,321 @@ +// +// $Id: interfile.h,v 1.27 2011-12-31 16:42:44 kris Exp $ +// +#ifndef __stir_Interfile_h__ +#define __stir_Interfile_h__ + +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- $Date: 2011-12-31 16:42:44 $, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup InterfileIO + + \brief Declarations of functions which read/write Interfile data + + \author Kris Thielemans + \author Sanida Mustafovic + \author Nicolas A Karakatsanis + \author PARAPET project + + $Date: 2011-12-31 16:42:44 $ + $Revision: 1.27 $ +*/ + +#include "stir/NumericType.h" +// note that I had to include Succeeded.h instead of just forward +// declaring the class. Otherwise every file that used write_*interfile* +// has to include Succeeded.h (even if it doesn't use the return value). +#include "stir/Succeeded.h" +#include "stir/ByteOrder.h" +#include "stir/IO/InterfileHeader.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::istream; +using std::ios; +#endif + + +START_NAMESPACE_STIR + +template class IndexRange; +template class Array; +template class DiscretisedDensity; +template class VectorWithOffset; +template class CartesianCoordinate3D; +template class Coordinate3D; +template class VoxelsOnCartesianGrid; +class ProjDataFromStream; + +//! Checks if the signature corresponds to the start of an interfile header +/*! + \ingroup InterfileIO + The first line of an Interfile header should contain the + \verbatim + INTERFILE := + \endverbatim + (potentially preceded by an exclamation mark, and maybe in + mixed or lower case). + This function checks if the list of characters pointed to by + \a signature satifies these requirements. + + \warning The parameter \a signature should be 0 terminated. +*/ +bool is_interfile_signature(const char * const signature); + +//! This reads the first 3d image in an Interfile header file, given as a stream +/*! + \ingroup InterfileIO + If there is trouble interpreting the header, + VoxelsOnCartesianGrid::ask_parameters() is called instead + If the name for the data file is not an absolute pathname, + \a directory_for_data is prepended (if not NULL). + + \warning it is up to the caller to deallocate the image + + This should normally never be used. Use read_from_file >() instead. + */ +VoxelsOnCartesianGrid* read_interfile_image(std::istream& input, + const string& directory_for_data = ""); + + + + +//! This reads the first 3d image in an Interfile header file, given as a filename. +/*! + \ingroup InterfileIO + The function first opens a stream from 'filename' and then calls the previous function + with 'directory_for_data' set to the directory part of 'filename'. + + \warning it is up to the caller to deallocate the image + + This should normally never be used. Use read_from_file >() instead. +*/ +VoxelsOnCartesianGrid* read_interfile_image(const string& filename); + + +//! This reads one of the 3d images out of a single binary file containing +//! a collection of dynamic/parametric images given as a stream. +//! An Interfile header file points to the single data file. +//! The data_offset parameter determines (provided it has been calculated correctly) +//! which frame/parametric image is picked +/*! + \ingroup InterfileIO + If there is trouble interpreting the header, + VoxelsOnCartesianGrid::ask_parameters() is called instead + If the name for the data file is not an absolute pathname, + \a directory_for_data is prepended (if not NULL). + + \warning it is up to the caller to deallocate the image + + This should normally never be used. Use read_from_file >() instead. + */ +VoxelsOnCartesianGrid* read_interfile_frame_image(std::istream& input, + const unsigned int data_offset, + InterfileImageHeader& ifheader, + const string& directory_for_data = ""); + +//! Same as previous function, except here the filename and the data offset are provided as parameters instead. +//! From the filename, the collection data stream is derived and then the previous function is called. +VoxelsOnCartesianGrid* read_interfile_frame_image(const string& filename, + const unsigned int frame_num); + + + +//! This outputs an Interfile header for an image. +/*! + \ingroup InterfileIO + A .hv extension will be added to the header_file_name if none is present. + \return Succeeded::yes when succesful, Succeeded::no otherwise. + + In fact, at the moment 2 headers are output: +
          +
        • 'header_file_name' is 'new-style' (suitable for Mediman for instance), +
        • *.ahv is 'old-style' (Interfile version 3.3) (suitable for Analyze for instance) +
        + They both point to the same file with binary data. + + \warning The .ahv file contains a fix such that Analyze reads the data + with the correct voxel size (in z), which is probably non-confirming, and + so will get other programs to read the voxel size incorrectly. + A relevant comment is written in each .ahv file. + */ + +Succeeded +write_basic_interfile_image_header(const string& header_file_name, + const string& image_file_name, + const IndexRange<3>& index_range, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& origin, + const NumericType output_type, + const ByteOrder byte_order, + const VectorWithOffset& scaling_factors, + const VectorWithOffset& file_offsets); + + +//! a utility function that computes the file offsets of subsequent images +/*! + \ingroup InterfileIO +*/ +const VectorWithOffset +compute_file_offsets(int number_of_time_frames, + const NumericType output_type, + const Coordinate3D& dim, + unsigned long initial_offset = 0); + + +//! This outputs an Interfile header and data for a Array<3,elemT> object. +/*! + \ingroup InterfileIO + Extension .v will be added to the parameter 'filename' (if no extension present). + Extensions .hv (and .ahv) will be used for the header filename. +*/ + +template +Succeeded +write_basic_interfile(const string&filename, + const Array<3,elemT>& image, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& origin, + const NumericType output_type = NumericType::FLOAT, + const float scale= 0, + const ByteOrder byte_order=ByteOrder::native); + +//! This outputs an Interfile header and data for a Array<3,elemT> object, assuming unit voxel sizes +/*! + \ingroup InterfileIO + Extension .v will be added to the parameter 'filename' (if no extension present). + Extensions .hv (and .ahv) will be used for the header filename. + + \warning For Visual Studio 7.0 or earlier, only the float version is defined + to work around a + compiler bug. (Otherwise, the float version is not instantiated for some reason). +*/ + +#if !defined(_MSC_VER) || (_MSC_VER > 1300) +template +#else +#define elemT float +#endif +Succeeded +write_basic_interfile(const string& filename, + const Array<3,elemT>& image, + const NumericType output_type = NumericType::FLOAT, + const float scale= 0, + const ByteOrder byte_order=ByteOrder::native); +#if defined(_MSC_VER) && (_MSC_VER <= 1300) +#undef elemT +#endif + +//! This outputs an Interfile header and data for a VoxelsOnCartesianGrid object +/*! + \ingroup InterfileIO + Extension .v will be added to the parameter 'filename' (if no extension present). + Extensions .hv (and .ahv) will be used for the header filename. +*/ +Succeeded +write_basic_interfile(const string& filename, + const VoxelsOnCartesianGrid& image, + const NumericType output_type = NumericType::FLOAT, + const float scale= 0, + const ByteOrder byte_order=ByteOrder::native); + + +//! This outputs an Interfile header and data for a DiscretisedDensity<3,float> object +/*! + \ingroup InterfileIO + Extension .v will be added to the parameter 'filename' (if no extension present). + Extensions .hv (and .ahv) will be used for the header filename. + + Currently the DiscretisedDensity<3,float>& object has to be a reference to a + VoxelsOnCartesianGrid object. +*/ +Succeeded +write_basic_interfile(const string& filename, + const DiscretisedDensity<3,float>& image, + const NumericType output_type = NumericType::FLOAT, + const float scale= 0, + const ByteOrder byte_order=ByteOrder::native); + +// Nicolas A Karakatsanis +// This outputs an Interfile header and data for a DiscretisedDensity<3,float> object after +// modifying the filename to denote a particular frame/type of image +Succeeded +write_basic_interfile(string& filename, + const DiscretisedDensity<3,float>& image, + const unsigned int param_num, + const NumericType output_type = NumericType::FLOAT, + const float scale= 0, + const ByteOrder byte_order=ByteOrder::native); + +//! This reads the first 3D sinogram from an Interfile header, given as a stream +/*! + \ingroup InterfileIO + If there is trouble interpreting the header, + ProjDataFromStream::ask_parameters() is called instead + + \param input A stream giving the Interfile header. + + \param directory_for_data If the name for the data file is not an absolute pathname, + this string is prepended. + + \param openmode Mode for opening the data file. ios::binary will be added by the code. + + \warning it is up to the caller to deallocate the object +*/ +ProjDataFromStream* read_interfile_PDFS(istream& input, + const string& directory_for_data = "", + const ios::openmode openmode = ios::in); + +//! This reads the first 3D sinogram from an Interfile header, given as a filename +/*! + \ingroup InterfileIO + This first opens a stream and then calls the previous function + with 'directory_for_data' set to the directory part of 'filename'. + + \warning it is up to the caller to deallocate the object + + This should normally never be used. Use ProjData::read_from_file() instead. +*/ +ProjDataFromStream* read_interfile_PDFS(const string& filename, + const ios::openmode open_mode); + +//! This writes an Interfile header appropriate for the ProjDataFromStream object. +/*! + \ingroup InterfileIO + A .hs extension will be added to the header_file_name if none is present. + \return Succeeded::yes when succesful, Succeeded::no otherwise. +*/ + Succeeded write_basic_interfile_PDFS_header(const string& header_filename, + const string& data_filename, + const ProjDataFromStream& pdfs); + +//! This function writes an Interfile header for the pdfs object. +/*! + \ingroup InterfileIO + The header_filename is found by replacing the extension in the + data_filename with .hs + \return Succeeded::yes when succesful, Succeeded::no otherwise. + */ +Succeeded write_basic_interfile_PDFS_header(const string& data_filename, + const ProjDataFromStream& pdfs); + +END_NAMESPACE_STIR + +#endif // __Interfile_h__ diff --git a/src/include/stir/IO/read_data.h b/src/include/stir/IO/read_data.h new file mode 100644 index 0000000000..d16944e407 --- /dev/null +++ b/src/include/stir/IO/read_data.h @@ -0,0 +1,103 @@ +#ifndef __stir_IO_read_data_H__ +#define __stir_IO_read_data_H__ +/* + Copyright (C) 2004- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array_IO + \brief declarations of stir::read_data() functions for reading Arrays from file + + \author Kris Thielemans + +*/ + +#include "stir/ByteOrder.h" + +START_NAMESPACE_STIR + +class Succeeded; +class NumericType; +template class NumericInfo; +template class Array; + +#if defined(_MSC_VER) && _MSC_VER==1200 +// VC 6.0 cannot compile this when the templates are declared first, +// and defined in the .inl +# define __STIR_WORKAROUND_TEMPLATES 1 +#endif + +#ifndef __STIR_WORKAROUND_TEMPLATES + +/*! \ingroup Array_IO + \brief Read the data of an Array from file. + + Only the data will be written, not the dimensions, start indices, nor byte-order. + Hence, this should only used for low-level IO. + + \a IStreamT is supposed to be stream or file type (see implementations for + read_data_1d()). + + \warning When an error occurs, the function immediately returns. + However, the data might have been partially read from \a s. +*/ +template +inline Succeeded +read_data(IStreamT& s, Array& data, + const ByteOrder byte_order=ByteOrder::native); + +/*! \ingroup Array_IO + \brief Read the data of an Array from file as a different type. + + This function essentially first calls convert_data() to construct + an array with elements of type \a InputType, and then calls + read_data(IStreamT&, const Array&, + const ByteOrder, const bool). + \see read_data(IStreamT&, const Array&, + const ByteOrder, const bool) + + \see find_scale_factor() for the meaning of \a scale_factor. +*/ +template +inline Succeeded +read_data(IStreamT& s, Array& data, + NumericInfo input_type, + ScaleT& scale_factor, + const ByteOrder byte_order=ByteOrder::native); + +/*! \ingroup Array_IO + \brief Read the data of an Array from file as a different type. + + \see read_data(IStreamT&, const Array&, + NumericInfo, + ScaleT&, + const ByteOrder, + const bool) + The only difference is that the input type is now specified using NumericType. +*/ +template +inline Succeeded +read_data(IStreamT& s, + Array& data, + NumericType type, ScaleT& scale, + const ByteOrder byte_order=ByteOrder::native); +#endif + +END_NAMESPACE_STIR + +#include "stir/IO/read_data.inl" + +#endif diff --git a/src/include/stir/IO/read_data.inl b/src/include/stir/IO/read_data.inl new file mode 100644 index 0000000000..53901a5717 --- /dev/null +++ b/src/include/stir/IO/read_data.inl @@ -0,0 +1,179 @@ +/* + Copyright (C) 2004- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array_IO + \brief Implementation of stir::read_data() functions for reading stir::Array's from file + + \author Kris Thielemans + +*/ +#include "stir/Array.h" +#include "stir/convert_array.h" +#include "stir/NumericType.h" +#include "stir/NumericInfo.h" +#include "stir/Succeeded.h" +#include "stir/ByteOrder.h" +#include "stir/detail/test_if_1d.h" +#include "stir/IO/read_data_1d.h" +#include + +START_NAMESPACE_STIR + +/* This file is made a bit more complicated because of various + work-arounds for older compilers. + + __STIR_WORKAROUND_TEMPLATES==1 + The first is probably specific for VC 6.0 where we need to define + parameters for byte_order etc. in these definitions. + In contrast, for the normal case, the defaults are in the .h file, + and cannot be repeated here. + I do this with some more preprocessor macros. Sigh. + + Note that write_data.inl has + __STIR_WORKAROUND_TEMPLATES==2 + for even more broken compilers. I didn't bother to put this in here. + You should be able to do this yourself (and then contribute the code). +*/ + +#ifndef __STIR_WORKAROUND_TEMPLATES +/* the normal case */ + +# define ___BYTEORDER_DEFAULT + +#else + +# define ___BYTEORDER_DEFAULT =ByteOrder::native + +#endif + +namespace detail +{ + /* Generic implementation of read_data(). See test_if_1d.h for info why we do this.*/ + template + inline Succeeded + read_data_help(is_not_1d, + IStreamT& s, Array& data, + const ByteOrder byte_order) + { + for (typename Array::iterator iter= data.begin(); + iter != data.end(); + ++iter) + { + if (read_data(s, *iter, byte_order)== + Succeeded::no) + return Succeeded::no; + } + return Succeeded::yes; + } + + /* 1D implementation of read_data(). See test_if_1d.h for info why we do this.*/ + // specialisation for 1D case + template + inline Succeeded + read_data_help(is_1d, + IStreamT& s, Array<1,elemT>& data, + const ByteOrder byte_order) + { + return + read_data_1d(s, data, byte_order); + } + +} // end of namespace detail + +template +inline Succeeded +read_data(IStreamT& s, Array& data, + const ByteOrder byte_order ___BYTEORDER_DEFAULT) +{ + return + detail::read_data_help(detail::test_if_1d(), + s, data, byte_order); +} + + +template +inline Succeeded +read_data(IStreamT& s, Array& data, + NumericInfo input_type, + ScaleT& scale_factor, + const ByteOrder byte_order ___BYTEORDER_DEFAULT) +{ + if (typeid(InputType) == typeid(elemT)) + { + // TODO? you might want to use the scale even in this case, + // but at the moment we don't + scale_factor = ScaleT(1); + return read_data(s, data, byte_order); + } + else + { + Array in_data(data.get_index_range()); + Succeeded success = read_data(s, in_data, byte_order); + if (success == Succeeded::no) + return Succeeded::no; + convert_array(data, scale_factor, in_data); + return Succeeded::yes; + } +} + +template +inline Succeeded +read_data(IStreamT& s, + Array& data, + NumericType type, ScaleT& scale, + const ByteOrder byte_order ___BYTEORDER_DEFAULT) +{ + switch(type.id) + { + // define macro what to do with a specific NumericType +#if !defined(_MSC_VER) || _MSC_VER>1300 +#define TYPENAME typename +#else +#define TYPENAME +#endif +#define CASE(NUMERICTYPE) \ + case NUMERICTYPE : \ + return \ + read_data(s, data, \ + NumericInfo::type>(), \ + scale, byte_order) + + // now list cases that we want + CASE(NumericType::SCHAR); + CASE(NumericType::UCHAR); + CASE(NumericType::SHORT); + CASE(NumericType::USHORT); + CASE(NumericType::INT); + CASE(NumericType::UINT); + CASE(NumericType::LONG); + CASE(NumericType::ULONG); + CASE(NumericType::FLOAT); + CASE(NumericType::DOUBLE); +#undef CASE +#undef TYPENAME + default: + warning("read_data : type not yet supported\n, at line %d in file %s", + __LINE__, __FILE__); + return Succeeded::no; + + } + +} + +END_NAMESPACE_STIR + diff --git a/src/include/stir/IO/read_data_1d.h b/src/include/stir/IO/read_data_1d.h new file mode 100644 index 0000000000..bffed210e3 --- /dev/null +++ b/src/include/stir/IO/read_data_1d.h @@ -0,0 +1,63 @@ +#ifndef __stir_IO_read_data_1d_H__ +#define __stir_IO_read_data_1d_H__ +/*! + \file + \ingroup Array_IO_detail + \brief Declaration of stir::read_data_1d() functions for reading 1D stir::Array objects from file + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/common.h" +#include +#include + +START_NAMESPACE_STIR +class Succeeded; +class ByteOrder; +template class Array; + +namespace detail { +/*! \ingroup Array_IO_detail + \brief This is an internal function called by \c read_data(). It does the actual reading + to \c std::istream. + + This function might propagate any exceptions by std::istream::read. + */ +template +inline Succeeded +read_data_1d(std::istream& s, Array<1, elemT>& data, + const ByteOrder byte_order); + + +/* \ingroup Array_IO_detail + \brief This is the (internal) function that does the actual reading from a FILE*. + \internal + */ +template +inline Succeeded +read_data_1d(FILE*& , Array<1, elemT>& data, + const ByteOrder byte_order); + +} // end namespace detail +END_NAMESPACE_STIR + +#include "stir/IO/read_data_1d.inl" + +#endif diff --git a/src/include/stir/IO/read_data_1d.inl b/src/include/stir/IO/read_data_1d.inl new file mode 100644 index 0000000000..1e7b64f241 --- /dev/null +++ b/src/include/stir/IO/read_data_1d.inl @@ -0,0 +1,101 @@ +/*! + \file + \ingroup Array_IO_detail + \brief Implementation of stir::read_data_1d() functions + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/Array.h" +#include "stir/Succeeded.h" +#include "stir/ByteOrder.h" +#include + +START_NAMESPACE_STIR + +namespace detail { + +/***************** version for istream *******************************/ + +template +Succeeded +read_data_1d(std::istream& s, Array<1, elemT>& data, + const ByteOrder byte_order) +{ + if (!s || + (dynamic_cast(&s)!=0 && !dynamic_cast(&s)->is_open()) || + (dynamic_cast(&s)!=0 && !dynamic_cast(&s)->is_open())) + { warning("read_data: error before reading from stream.\n"); return Succeeded::no; } + + // note: find num_to_read (using size()) outside of s.read() function call + // otherwise Array::check_state() in size() might abort if + // get_data_ptr() is called before size() (which is compiler dependent) + const std::streamsize num_to_read = + static_cast(data.size())* sizeof(elemT); + s.read(reinterpret_cast(data.get_data_ptr()), num_to_read); + data.release_data_ptr(); + + if (!s) + { warning("read_data: error after reading from stream.\n"); return Succeeded::no; } + + if (!byte_order.is_native_order()) + { + for(int i=data.get_min_index(); i<=data.get_max_index(); ++i) + ByteOrder::swap_order(data[i]); + } + + return Succeeded::yes; +} + +/***************** version for FILE *******************************/ +// largely a copy of above, but with calls to stdio function + +template +Succeeded +read_data_1d(FILE* & fptr_ref, Array<1, elemT>& data, + const ByteOrder byte_order) +{ + FILE *fptr = fptr_ref; + if (fptr==NULL || ferror(fptr)) + { warning("read_data: error before reading from FILE.\n"); return Succeeded::no; } + + // note: find num_to_read (using size()) outside of s.read() function call + // otherwise Array::check_state() in size() might abort if + // get_data_ptr() is called before size() (which is compiler dependent) + const std::size_t num_to_read = + static_cast(data.size()); + const std::size_t num_read = + fread(reinterpret_cast(data.get_data_ptr()), sizeof(elemT), num_to_read, fptr); + data.release_data_ptr(); + + if (ferror(fptr) || num_to_read!=num_read) + { warning("read_data: error after reading from FILE.\n"); return Succeeded::no; } + + if (!byte_order.is_native_order()) + { + for(int i=data.get_min_index(); i<=data.get_max_index(); ++i) + ByteOrder::swap_order(data[i]); + } + + return Succeeded::yes; +} + + +} // end of namespace detail +END_NAMESPACE_STIR diff --git a/src/include/stir/IO/read_from_file.h b/src/include/stir/IO/read_from_file.h new file mode 100644 index 0000000000..3e62df4f8f --- /dev/null +++ b/src/include/stir/IO/read_from_file.h @@ -0,0 +1,85 @@ +// +// +#ifndef __stir_IO_read_from_file_H__ +#define __stir_IO_read_from_file_H__ +/* + Copyright (C) 2006 - 2008-10-01, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup IO + \brief Declaration of stir::read_from_file functions (providing + easy access to class stir::InputFileFormatRegistry) + + \author Kris Thielemans + +*/ +#include "stir/IO/InputFileFormatRegistry.h" + +START_NAMESPACE_STIR + +//! Function that reads data from file using the default InputFileFormatRegistry, using the provided FileSignature to find the matching file format +/*! \ingroup IO + This is a convenience function that uses InputFileFormatRegistry::find_factory() to find the + InputFileFormat factory, and uses it to create the \c DataT object. + + Note that (at the time of writing) InputFileFormatRegistry::find_factory() calls + error() if no matching file format was found. + + You probably want to use read_from_file(filename); + */ +template +inline +std::auto_ptr +read_from_file(const FileSignature& signature, FileT file) +{ + const InputFileFormat& factory = + InputFileFormatRegistry::default_sptr()-> + find_factory(signature, file); + return factory.read_from_file(file); +} + +//! Function that reads data from file using the default InputFileFormatRegistry +/*! \ingroup IO + This is a convenience function that first reads the FileSignature, then uses + InputFileFormatRegistry::find_factory() to find the factory, which then is used + to create the object. + + Note that (at the time of writing) InputFileFormatRegistry::find_factory() calls + error() if no matching file format was found. + + \see read_from_file(const FileSignature&, FileT) + \par Example + + \code + typedef DiscretisedDensity<3,float> DataType ; + std::auto_ptr density_aptr(read_from_file("my_file.hv")); + shared_ptr density_sptr(read_from_file("another_file.hv")); + \endcode +*/ +template +inline +std::auto_ptr +read_from_file(FileT file) +{ + const FileSignature signature(file); + return read_from_file(signature, file); +} + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/IO/stir_AVW.h b/src/include/stir/IO/stir_AVW.h new file mode 100644 index 0000000000..d7fd7d758b --- /dev/null +++ b/src/include/stir/IO/stir_AVW.h @@ -0,0 +1,56 @@ +// +// +#ifndef __stir_IO_stir_AVW__H__ +#define __stir_IO_stir_AVW__H__ +/* + Copyright (C) 2001- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ + +/*! +\file +\ingroup IO +\brief routines to convert AVW data structures to STIR +\author Kris Thielemans + +*/ + + +#ifdef HAVE_AVW + +#include "AVW.h" +#include "stir/common.h" + +START_NAMESPACE_STIR + +template class VoxelsOnCartesianGrid; + +namespace AVW +{ + + //! A routine that converts AVW volume to ::stir::VoxelsOnCartesianGrid + /*! Will return a null pointer if the convertion failed for some reason. + */ + VoxelsOnCartesianGrid * + AVW_Volume_to_VoxelsOnCartesianGrid(AVW_Volume const* const avw_volume, + const bool flip_z = false); + +} // end namespace AVW + +END_NAMESPACE_STIR + +#endif // HAVE_AVW + +#endif //__stir_IO_stir_AVW__H__ diff --git a/src/include/stir/IO/stir_ecat6.h b/src/include/stir/IO/stir_ecat6.h new file mode 100644 index 0000000000..929a41ef91 --- /dev/null +++ b/src/include/stir/IO/stir_ecat6.h @@ -0,0 +1,210 @@ +// +// +/*! + \file + \ingroup ECAT + + \brief Declaration of routines which convert ECAT6 things into our + building blocks and vice versa. + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_IO_stir_ecat6_H__ +#define __stir_IO_stir_ecat6_H__ + +#include "stir/IO/stir_ecat_common.h" +#include "stir/IO/ecat6_types.h" +#include +#include +#include "stir/shared_ptr.h" + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + + +START_NAMESPACE_STIR + +class Succeeded; +class NumericType; +class ByteOrder; +class Scanner; +template class DiscretisedDensity; +template class VoxelsOnCartesianGrid; +template class Sinogram; +class ProjData; +class ProjDataInfo; + +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT6 + + +/*! + \brief checks if the file is in ECAT6 format + \ingroup ECAT + + As ECAT6 doesn't have a 'magic number' this check is somewhat heuristic. + Checks are only on the main header. Current checks are: +
          +
        1. sw_version field between 0 and 69 +
        2. file_type field one of the values in the enum MatFileType +
        3. num_frames field > 0 +
        +*/ +bool is_ECAT6_file(const string& filename); +/*! + \brief checks if the file is in ECAT6 format and if the file contains images + \ingroup ECAT +*/ +bool is_ECAT6_image_file(const string& filename); +/*! + \brief checks if the file is in ECAT6 format and + if the file contains emission sinograms (or blank/transmision) + \ingroup ECAT +*/ + bool is_ECAT6_emission_file(const string& filename); +/*! + \brief checks if the file is in ECAT6 format and + if the file contains attenuation correction factors + \ingroup ECAT +*/ +bool is_ECAT6_attenuation_file(const string& filename); + +/* + \brief Convert image data + \ingroup ECAT + \param cti_fptr a FILE pointer to the ECAT6 file. + \param mhead the ECAT6 main header. Note that this parameter will be used + to get system and size info, not the main header in the file. +*/ +VoxelsOnCartesianGrid * +ECAT6_to_VoxelsOnCartesianGrid(const int frame_num, const int gate_num, const int data_num, const int bed_num, + FILE *cti_fptr, const ECAT6_Main_header & mhead); +/* + \brief Convert sinogram data + \ingroup ECAT + \param max_ring_diff if less than 0, the maximum is used (i.e. num_rings-1) + \param arccorrected tells the function if the data is (assumed to be) arc-corrected. Note + that the ECAT6 file format does not have any flag to indicate this. + \param output_file_name filename for output. A .s extension will be added (for the + binary file) if no extension is present. + \param cti_fptr a FILE pointer to the ECAT6 file. + \param mhead the ECAT6 main header. Note that this parameter will be used + to get system and size info, not the main header in the file. + \warning multiplies the data with the loss_correction_factor in the subheader. +*/ +void ECAT6_to_PDFS(const int frame_num, const int gate_num, const int data_num, const int bed_num, + int max_ring_diff, bool arccorrected, + const string& output_file_name, + FILE *cti_fptr, const ECAT6_Main_header & mhead); + +//! determine scanner type from the ECAT6_Main_header +/*! + \ingroup ECAT + Returns a Unknown_Scanner if it does not recognise it. */ +Scanner * find_scanner_from_ECAT6_Main_header(const ECAT6_Main_header& mhead); + +//! Create a new ECAT6 image file and write the data in there +/*! \ingroup ECAT*/ +Succeeded +DiscretisedDensity_to_ECAT6(DiscretisedDensity<3,float> const & density, + string const & cti_name, string const& orig_name, + const Scanner& scanner, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0); + +//! Write an (extra) image to an existing ECAT6 file +/*! + \ingroup ECAT + Some consistency checks are performed between the image and the data in the main header + \warning This does NOT write the main header. + */ +Succeeded +DiscretisedDensity_to_ECAT6(FILE *fptr, + DiscretisedDensity<3,float> const & density, + const ECAT6_Main_header& mhead, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0); + +//! Create a new ECAT6 sinogram file and write the data in there +/*! + \ingroup ECAT + \warning Only data without axial compression can be handled by the ECAT6 3D + sinogram format, and hence also by this function (CTI span==1), except + when write_2D_sinograms==true + */ +Succeeded ProjData_to_ECAT6(ProjData const& proj_data, + string const & cti_name, string const & orig_name, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0, + const bool write_2D_sinograms = false); + +//! Write an (extra) set of sinograms to an existing ECAT6 file +/*! + \ingroup ECAT + Some consistency checks are performed between the proj_data and the data in the main header + \warning Only data without axial compression can be handled by the ECAT6 3D + sinogram format, and hence also by this function (CTI span==1), except + when write_2D_sinograms==true + \warning This does NOT write the main header. +*/ +Succeeded +ProjData_to_ECAT6(FILE *fptr, ProjData const& proj_data, + const ECAT6_Main_header& mhead, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0, + const bool write_2D_sinograms = false); + + +//! Fill in most of the main header given a Scanner object and orig_name. +/*! + \ingroup ECAT +*/ +void make_ECAT6_Main_header(ECAT6_Main_header&, + const Scanner&, + const string& orig_name + ); + +//! Fill in most of the main header given a Scanner object and orig_name and an image +/*! + \ingroup ECAT + Sets file_type, num_planes, plane_separation as well*/ +void make_ECAT6_Main_header(ECAT6_Main_header& mhead, + Scanner const& scanner, + const string& orig_name, + DiscretisedDensity<3,float> const & density + ); + +//! Fill in most of the main header given an orig_name and a proj_data_info +/*! + \ingroup ECAT + It gets the scanner from the proj_data_info object. + Sets file_type, num_planes, plane_separation as well*/ +void make_ECAT6_Main_header(ECAT6_Main_header& mhead, + const string& orig_name, + ProjDataInfo const & proj_data_info + ); +END_NAMESPACE_ECAT +END_NAMESPACE_ECAT6 +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/IO/stir_ecat7.h b/src/include/stir/IO/stir_ecat7.h new file mode 100644 index 0000000000..eda33fd154 --- /dev/null +++ b/src/include/stir/IO/stir_ecat7.h @@ -0,0 +1,316 @@ +/*! + \file + \ingroup ECAT + + \brief Declaration of routines which convert CTI things into our + building blocks and vice versa. + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-12-31, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_IO_stir_ecat7_H__ +#define __stir_IO_stir_ecat7_H__ + + +#include "stir/IO/stir_ecat_common.h" +#include "stir/NumericType.h" + +#ifdef HAVE_LLN_MATRIX +#ifdef STIR_NO_NAMESPACES +// terrible trick to avoid conflict between stir::Sinogram and Sinogram defined in matrix.h +// when we do have namespaces, the conflict can be resolved by using ::Sinogram +#define Sinogram CTISinogram +#else +#define CTISinogram ::Sinogram +#endif + +#include "matrix.h" +extern "C" { + int map_main_header(char *bufr, Main_header *header); + int mh_update(MatrixFile*); +} + +#ifdef STIR_NO_NAMESPACES +#undef Sinogram +#endif + +#include +#include +#include "stir/shared_ptr.h" + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::iostream; +#endif + +START_NAMESPACE_STIR + +class Succeeded; +class ByteOrder; +class Scanner; +template class DiscretisedDensity; +template class VoxelsOnCartesianGrid; +template class Sinogram; +class ExamInfo; +class ProjData; +class ProjDataInfo; +class ProjDataFromStream; + +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +/*! + \brief checks if the file is in ECAT7 format + \ingroup ECAT + This partly relies on the implementation of matrix_open in the LLN matrix library. + Additional checks are made on the main header. Current checks are: +
          +
        1. sw_version field between 70 and 79 +
        2. file_type field one of the values in the enum MatFileType +
        3. num_frames field > 0 +
        + \warning When the file is not readable, error() is called. +*/ +bool is_ECAT7_file(const string& filename); +/*! + \brief checks if the file is in ECAT6 format and if the file contains images + \ingroup ECAT +*/ +bool is_ECAT7_image_file(const string& filename); +/*! + \brief checks if the file is in ECAT6 format and + if the file contains emission sinograms (or blank/transmision) + \ingroup ECAT +*/ +bool is_ECAT7_emission_file(const string& filename); +/*! + \brief checks if the file is in ECAT6 format and + if the file contains attenuation correction factors + \ingroup ECAT +*/ +bool is_ECAT7_attenuation_file(const string& filename); + +/*! + \brief read an ECAT7 main header from a file +*/ +Succeeded read_ECAT7_main_header(Main_header& mhead, const string& filename); + +//! determine scanner type from the main_header +/*! + \ingroup ECAT + Returns a Unknown_Scanner if it does not recognise it. */ +void find_scanner(shared_ptr & scanner_ptr,const Main_header& mhead); + + +//! Create a new ECAT7 image file and write the data in there +/*! + \ingroup ECAT +*/ +Succeeded +DiscretisedDensity_to_ECAT7(DiscretisedDensity<3,float> const & density, + string const & cti_name, string const& orig_name, + const Scanner& scanner, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0); + +//! Write an (extra) image to an existing ECAT7 file +/*! + \ingroup ECAT + Some consistency checks are performed between the image and the data in the main header + \warning This does NOT write the main header. + */ +Succeeded +DiscretisedDensity_to_ECAT7(MatrixFile *mptr, + DiscretisedDensity<3,float> const & density, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0); + +//! Create a new ECAT7 sinogram file and write the data in there +/*! + \ingroup ECAT + Note that not all \a output_type are supported by the ECAT7 format. + If a wrong type is used, it will be forced to floats. +*/ +Succeeded +ProjData_to_ECAT7(ProjData const& proj_data, NumericType output_type, + string const & cti_name, string const & orig_name, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0, + const bool write_as_attenuation = false, + float scale_factor = 0.0F); + +//! Write an (extra) set of sinograms to an existing ECAT7 file +/*! + \ingroup ECAT + Some consistency checks are performed between the proj_data and the data + in the main header pointer of \a mptr. + + For ECAT7, the data type for the output is determined by the \c file_type field + of the main header. + + \warning This does NOT write the main header. +*/ +Succeeded +ProjData_to_ECAT7(MatrixFile *mptr, + ProjData const& proj_data, + const int frame_num = 1, const int gate_num = 1, + const int data_num = 0, const int bed_num = 0, + float scale_factor = 0.0F); + +//! read ExamInfo from an ECAT7 MatrixFile object +/*! This includes time frame definitions, patient_position and scan_start. */ +shared_ptr +read_ECAT7_exam_info(MatrixFile *mptr); + +//! read ExamInfo from an ECAT7 file +/*! open the file and calls read_ECAT7_exam_info(MatrixFile*) */ +shared_ptr +read_ECAT7_exam_info(const std::string& filename); + +//! Fill in most of the main header given a Scanner object and orig_name. +/*! + \ingroup ECAT +*/ +void make_ECAT7_main_header(Main_header&, + const Scanner&, + const string& orig_name + ); + +//! Fill in most of the main header given a Scanner object and orig_name and an image +/*! + \ingroup ECAT + Sets num_planes, plane_separation as well*/ +void make_ECAT7_main_header(Main_header& mhead, + Scanner const& scanner, + const string& orig_name, + DiscretisedDensity<3,float> const & density + ); + +//! Fill in most of the main header given an orig_name and a proj_data_info +/*! + \ingroup ECAT + It gets the scanner from the proj_data_info object. + Sets num_planes, plane_separation as well and attempts septa_state. + + \return the actual NumericType that should be used for further IO. + This is necessary because the file_type in the ECAT7 main header + depends on the \a output_type (sign). + + Defaults mean that it will set to file_type Float3dSinogram. + + \warning Note that not all \a output_type are supported by the ECAT7 format. + If a wrong type is used, it will be forced to floats. + \warning The \c acquisition_type field will be set to either + \c TransmissionScan or \c StaticEmission, depending on \a write_as_attenuation. This is not necessarily correct. + +*/ +NumericType +make_ECAT7_main_header(Main_header& mhead, + const string& orig_name, + ExamInfo const & exam_info, + ProjDataInfo const & proj_data_info, + const bool write_as_attenuation = false, + NumericType output_type = NumericType::FLOAT + ); + +//! Fill in most of the subheader +/*! + \ingroup ECAT + \warning data_type and volume_mode has still to be set */ +void +make_subheader_for_ECAT7(Attn_subheader& shead, + const Main_header& mhead, + const ProjDataInfo& proj_data_info + ); +//! Fill in most of the subheader +/*! + \ingroup ECAT + \warning data_type and volume_mode has still to be set */ +void +make_subheader_for_ECAT7(Scan3D_subheader& shead, + const Main_header& mhead, + const ProjDataInfo& proj_data_info + ); + +//! Make a ProjDataFromStream object that 'points' into an ECAT7 file +/*! + \ingroup ECAT + \arg mptr is the LLN structure that has the file pointer etc for the ECAT7 file + \arg matrix encodes frame, gate, data, bed numbers + \arg stream_ptr is a pointer to a stream object corresponding to the SAME file as the + ECAT7 file. This argument is necessary as it isn't possible to make a stream from + a FILE pointer. + \return NULL when it is an unsupported data type + + Only data types AttenCor, Byte3dSinogram, Short3dSinogram, Float3dSinogram can be handled. + Other sinogram formats have subheaders interleaved with the data which makes it + impossible to have a corresponding ProjDataFromStream +*/ +ProjDataFromStream * +make_pdfs_from_matrix(MatrixFile * const mptr, + MatrixData * const matrix, + const shared_ptr& stream_ptr); + +//! Writes an Interfile header that 'points' into an ECAT7 file +/*! + \ingroup ECAT + Only data types AttenCor, Byte3dSinogram, Short3dSinogram, Float3dSinogram, + ByteVolume, PetVolume can be handled. + + \a interfile_header_name will be set to the header name used. It will be of the form + ECAT7_filename_extension_f1g1d0b0.hs or .hv. For example, for ECAT7_filename test.S, and + frame=2, gate=3, data=4, bed=5, the header name will be test_S_f2g3d4b5.hs +*/ +Succeeded +write_basic_interfile_header_for_ECAT7(string& interfile_header_name, + const string& ECAT7_filename, + const int frame_num, const int gate_num, const int data_num, const int bed_num); + +/* + \brief Read an image from an ECAT7 file. + \ingroup ECAT + \warning do not use directly, but use read_from_file >(). + + \return a pointer to a newly allocated image, or 0 if it failed. +*/ +VoxelsOnCartesianGrid * +ECAT7_to_VoxelsOnCartesianGrid(const string& ECAT7_filename, + const int frame_num, const int gate_num, const int data_num, const int bed_num); +/* + \brief Read projection data from an ECAT7 file + \ingroup ECAT + \warning do not use directly, but use ProjData::read_from_file(). + + \return a pointer to a newly allocated ProjDataFromStream object, or 0 if it failed. +*/ +ProjDataFromStream* +ECAT7_to_PDFS(const string& ECAT7_filename, + const int frame_num, const int gate_num, const int data_num, const int bed_num); + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif + +#endif diff --git a/src/include/stir/IO/stir_ecat_common.h b/src/include/stir/IO/stir_ecat_common.h new file mode 100644 index 0000000000..199117118c --- /dev/null +++ b/src/include/stir/IO/stir_ecat_common.h @@ -0,0 +1,121 @@ +// +// +/*! + \file + \ingroup ECAT + + \brief Declaration of routines which convert ECAT things into our + building blocks and vice versa. + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_IO_stir_ecat_common_H__ +#define __stir_IO_stir_ecat_common_H__ + +#include "stir/common.h" + +//*************** namespace macros +#if !defined(STIR_NO_NAMESPACE) +# define START_NAMESPACE_ECAT namespace ecat { +# define END_NAMESPACE_ECAT } +# define USING_NAMESPACE_ECAT using namespace ecat; + +# define START_NAMESPACE_ECAT6 namespace ecat6 { +# define END_NAMESPACE_ECAT6 } +# define USING_NAMESPACE_ECAT6 using namespace ecat6; + +# define START_NAMESPACE_ECAT7 namespace ecat7 { +# define END_NAMESPACE_ECAT7 } +# define USING_NAMESPACE_ECAT7 using namespace ecat7; + +#else + +# define START_NAMESPACE_ECAT +# define END_NAMESPACE_ECAT +# define USING_NAMESPACE_ECAT + +# define START_NAMESPACE_ECAT6 +# define END_NAMESPACE_ECAT6 +# define USING_NAMESPACE_ECAT6 + +# define START_NAMESPACE_ECAT7 +# define END_NAMESPACE_ECAT7 +# define USING_NAMESPACE_ECAT7 +#endif + +START_NAMESPACE_STIR + +class NumericType; +class ByteOrder; +class Scanner; + +START_NAMESPACE_ECAT + +//! Possible values for the data_type field in ECAT headers +/*! + \ingroup ECAT + The data_type field is used to indicate how the data are written. + Note that the VAX_float type is not the same as + IEEE float with little_endian byte order. +*/ +typedef enum { + ECAT_unknown_data_type = 0, + ECAT_Byte_data_type = 1, + ECAT_I2_little_endian_data_type = 2, + ECAT_I4_little_endian_data_type = 3, + ECAT_R4_VAX_data_type = 4, + ECAT_R4_IEEE_big_endian_data_type = 5, + ECAT_I2_big_endian_data_type = 6, + ECAT_I4_big_endian_data_type = 7 +} ECATDataType; + + +//! Find out which NumericType and ByteOrder corresponds to a ECAT data type +/*! + \ingroup ECAT +*/ +void find_type_from_ECAT_data_type(NumericType& type, ByteOrder& byte_order, const short data_type); + +//! Find out which ECAT data type corresponds to a certain NumericType and ByteOrder +/*! + \ingroup ECAT + Returns 0 when it does not recognise it */ +short find_ECAT_data_type(const NumericType& type, const ByteOrder& byte_order); + + +//! Find the value used in the ECAT Main header for a given scanner +/*! + \ingroup ECAT + Returns 0 if the scanner is not recognised */ +short find_ECAT_system_type(const Scanner& scanner); + +//! Find the scanner corresponding to the system type in the main header +/*! + \ingroup ECAT + Returns a Scanner(Scanner::Unknown_Scanner) object when the scanner is not recognised. */ +Scanner* find_scanner_from_ECAT_system_type(const short system_type); + +END_NAMESPACE_ECAT + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/IO/write_data.h b/src/include/stir/IO/write_data.h new file mode 100644 index 0000000000..e5efc00210 --- /dev/null +++ b/src/include/stir/IO/write_data.h @@ -0,0 +1,186 @@ +#ifndef __stir_IO_write_data_H__ +#define __stir_IO_write_data_H__ +/* + Copyright (C) 2004- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array_IO + \brief declarations of stir::write_data() functions for writing Arrays to file + + \author Kris Thielemans + +*/ + +#include "stir/ByteOrder.h" +START_NAMESPACE_STIR + +class Succeeded; +class NumericType; +template class NumericInfo; +template class Array; + +#if defined(_MSC_VER) && _MSC_VER==1200 +// VC 6.0 cannot compile this when the templates are declared first, +// and defined in the .inl +# define __STIR_WORKAROUND_TEMPLATES 1 +#endif + + +/* + If your still compiler cannot handle this code, you can try to put + +# define __STIR_WORKAROUND_TEMPLATES 2 + + This enables a horrible work-around where the functions are + not templated in terms of num_dimensions. Instead, some + preprocessor trickery is used. + See the end of this file and write_data.inl for more info. +*/ + +#ifndef __STIR_WORKAROUND_TEMPLATES +/*! \ingroup Array_IO + \brief Write the data of an Array to file. + + Only the data will be written, not the dimensions, start indices, nor byte-order. + Hence, this should only used for low-level IO. + + \a OStreamT is supposed to be stream or file type (see implementations for + detail::write_data_1d()). + + If \a can_corrupt_data = \c true, the data in the array can be + byte-swapped after writing, and hence should no longer be used. + This is useful for saving (a little bit of) time. + + \warning When an error occurs, the function immediately returns. + However, the data might have been partially written to \a s. + + \warning For deficient compilers (e.g. VC 6.0), work-arounds are + necessary to get this to compile. In particular, this function + is then not templated in \c num_dimensions, but explicitly + defined for a few dimensions (see the source). +*/ +template +inline Succeeded +write_data(OStreamT& s, const Array& data, + const ByteOrder byte_order=ByteOrder::native, + const bool can_corrupt_data=false); +/*! \ingroup Array_IO + \brief Write the data of an Array to file as a different type. + + This function essentially first calls convert_data() to construct + an array with elements of type \a OutputType, and then calls + write_data(OstreamT&, const Array&, + const ByteOrder, const bool). + \see write_data(OstreamT&, const Array&, + const ByteOrder, const bool) + + \see find_scale_factor() for the meaning of \a scale_factor. + \warning For deficient compilers (e.g. VC 6.0), work-arounds are + necessary to get this to compile. In particular, this function + is then not templated in \c num_dimensions, but explicitly + defined for a few dimensions (see the source). +*/ +template +inline Succeeded +write_data(OStreamT& s, const Array& data, + NumericInfo output_type, + ScaleT& scale_factor, + const ByteOrder byte_order=ByteOrder::native, + const bool can_corrupt_data=false); + +/*! \ingroup Array_IO + \brief Write the data of an Array to file as a different type but using a given scale factor. + + If \a scale_factor is such that the data/scale_factor does not fit in the + range for \a OutputType, the writing will fail. However, data might have been + partially written to file anyway. + + \see write_data(OStreamT&, const Array&, + NumericInfo, + ScaleT&, + const ByteOrder, + const bool) + \warning For deficient compilers (e.g. VC 6.0), work-arounds are + necessary to get this to compile. In particular, this function + is then not templated in \c num_dimensions, but explicitly + defined for a few dimensions (see the source). +*/ +template +inline Succeeded +write_data_with_fixed_scale_factor(OStreamT& s, const Array& data, + NumericInfo output_type, + const ScaleT scale_factor, + const ByteOrder byte_order=ByteOrder::native, + const bool can_corrupt_data=false); + +/*! \ingroup Array_IO + \brief Write the data of an Array to file as a different type. + + \see write_data(OStreamT&, const Array&, + NumericInfo, + ScaleT&, + const ByteOrder, + const bool) + The only difference is that the output type is now specified using NumericType. + + \warning For deficient compilers (e.g. VC 6.0), work-arounds are + necessary to get this to compile. In particular, this function + is then not templated in \c num_dimensions, but explicitly + defined for a few dimensions (see the source). +*/ + +template +inline Succeeded +write_data(OStreamT& s, + const Array& data, + NumericType type, ScaleT& scale, + const ByteOrder byte_order=ByteOrder::native, + const bool can_corrupt_data=false); + +#endif //__STIR_WORKAROUND_TEMPLATES + + + +END_NAMESPACE_STIR + + +#if !defined(__STIR_WORKAROUND_TEMPLATES) || __STIR_WORKAROUND_TEMPLATES<2 + +#include "stir/IO/write_data.inl" + +#else + +#define num_dimensions 1 +#include "stir/IO/write_data.inl" +#undef num_dimensions +#define num_dimensions 2 +#include "stir/IO/write_data.inl" +#undef num_dimensions +#define num_dimensions 3 +#include "stir/IO/write_data.inl" +#undef num_dimensions +//#define num_dimensions 4 +//#include "stir/IO/write_data.inl" +//#undef num_dimensions + +#endif + +#ifdef __STIR_WORKAROUND_TEMPLATES +# undef __STIR_WORKAROUND_TEMPLATES +#endif + +#endif diff --git a/src/include/stir/IO/write_data.inl b/src/include/stir/IO/write_data.inl new file mode 100644 index 0000000000..28a6702eb2 --- /dev/null +++ b/src/include/stir/IO/write_data.inl @@ -0,0 +1,260 @@ +/* + Copyright (C) 2004 - 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array_IO + \brief Implementation of stir::write_data() functions for writing stir::Array's to file + + \author Kris Thielemans + +*/ +#include "stir/Array.h" +#include "stir/convert_array.h" +#include "stir/NumericType.h" +#include "stir/NumericInfo.h" +#include "stir/ByteOrder.h" +#include "stir/Succeeded.h" +#include "stir/detail/test_if_1d.h" +#include "stir/IO/write_data_1d.h" +#include + +START_NAMESPACE_STIR + +/* This file is made a bit more complicated because of various + work-arounds for older compilers. + + __STIR_WORKAROUND_TEMPLATES==1 + The first is probably specific for VC 6.0 where we need to define + parameters for byte_order etc. in these definitions. + In contrast, for the normal case, the defaults are in the .h file, + and cannot be repeated here. + I do this with some more preprocessor macros. Sigh. + + __STIR_WORKAROUND_TEMPLATES==2 + The 2nd work-around no longer templates in num_dimensions. + For the least amount of pain, we also make the inlines here serve as + declarations, so use the first work-around for this. +*/ + +#ifndef __STIR_WORKAROUND_TEMPLATES +/* the normal case */ + +# define ___BYTEORDER_DEFAULT +# define ___CAN_CORRUPT_DATA_DEFAULT +# define INT_NUM_DIMENSIONS int num_dimensions, + +#else + +# define ___BYTEORDER_DEFAULT =ByteOrder::native +# define ___CAN_CORRUPT_DATA_DEFAULT =false + +# if __STIR_WORKAROUND_TEMPLATES==1 + +# define INT_NUM_DIMENSIONS int num_dimensions, + /* This case is for VC 6.0. + Note that the order of the template arguments is important for VC 6.0. + The "int num_dimensions" template argument has to be first in the + template list, otherwise it chokes on it. + */ +# else +/* horrible work-around for very deficient compilers + We disable the num_dimensions template, and replace it by #defines. +*/ + +# ifndef num_dimensions +# error num_dimensions should be defined +# endif + +# define INT_NUM_DIMENSIONS +# endif +#endif + +namespace detail +{ + /* Generic implementation of write_data_with_fixed_scale_factor(). + See test_if_1d.h for info why we do this this way. + */ +#if !defined(__STIR_WORKAROUND_TEMPLATES) || __STIR_WORKAROUND_TEMPLATES<2 || num_dimensions!=1 + + template < INT_NUM_DIMENSIONS class OStreamT, + class elemT, class OutputType, class ScaleT> + inline Succeeded + write_data_with_fixed_scale_factor_help( + is_not_1d, + OStreamT& s, const Array& data, + NumericInfo output_type, + const ScaleT scale_factor, + const ByteOrder byte_order, + const bool can_corrupt_data) + { + for (typename Array::const_iterator iter= data.begin(); + iter != data.end(); + ++iter) + { + if (write_data_with_fixed_scale_factor(s, *iter, output_type, + scale_factor, byte_order, + can_corrupt_data) == + Succeeded::no) + return Succeeded::no; + } + return Succeeded::yes; + } +#endif + +#if !defined(__STIR_WORKAROUND_TEMPLATES) || __STIR_WORKAROUND_TEMPLATES<2 || num_dimensions==1 + // specialisation for 1D case + template + inline Succeeded + write_data_with_fixed_scale_factor_help( + is_1d, + OStreamT& s, const Array<1,elemT>& data, + NumericInfo, + const ScaleT scale_factor, + const ByteOrder byte_order, + const bool can_corrupt_data) + { + if (typeid(OutputType) != typeid(elemT) || + scale_factor!=1) + { + ScaleT new_scale_factor=scale_factor; + Array<1,OutputType> data_tmp = + convert_array(new_scale_factor, data, NumericInfo()); + if (std::fabs(new_scale_factor-scale_factor)> scale_factor*.001) + return Succeeded::no; + return + write_data_1d(s, data_tmp, byte_order, /*can_corrupt_data*/ true); + } + else + { + return + write_data_1d(s, data, byte_order, can_corrupt_data); + } + } +#endif + +} // end of namespace detail + +template < INT_NUM_DIMENSIONS class OStreamT, + class elemT, class OutputType, class ScaleT> +Succeeded +write_data_with_fixed_scale_factor(OStreamT& s, const Array& data, + NumericInfo output_type, + const ScaleT scale_factor, + const ByteOrder byte_order ___BYTEORDER_DEFAULT, + const bool can_corrupt_data ___CAN_CORRUPT_DATA_DEFAULT) +{ + return + detail:: + write_data_with_fixed_scale_factor_help( + detail::test_if_1d(), + s, data, + output_type, + scale_factor, byte_order, + can_corrupt_data); +} + +template < INT_NUM_DIMENSIONS class OStreamT, + class elemT, class OutputType, class ScaleT> +Succeeded +write_data(OStreamT& s, const Array& data, + NumericInfo output_type, + ScaleT& scale_factor, + const ByteOrder byte_order ___BYTEORDER_DEFAULT, + const bool can_corrupt_data ___CAN_CORRUPT_DATA_DEFAULT) +{ + find_scale_factor(scale_factor, + data, + NumericInfo()); + return + write_data_with_fixed_scale_factor(s, data, output_type, + scale_factor, byte_order, + can_corrupt_data); +} + +template < INT_NUM_DIMENSIONS class OStreamT, + class elemT> +inline Succeeded +write_data(OStreamT& s, const Array& data, + const ByteOrder byte_order ___BYTEORDER_DEFAULT, + const bool can_corrupt_data ___CAN_CORRUPT_DATA_DEFAULT) +{ + return + write_data_with_fixed_scale_factor(s, data, NumericInfo(), + 1.F, byte_order, + can_corrupt_data); +} + +template < INT_NUM_DIMENSIONS class OStreamT, + class elemT, class ScaleT> +Succeeded +write_data(OStreamT& s, + const Array& data, + NumericType type, ScaleT& scale, + const ByteOrder byte_order ___BYTEORDER_DEFAULT, + const bool can_corrupt_data ___CAN_CORRUPT_DATA_DEFAULT) +{ + if (NumericInfo().type_id() == type) + { + // you might want to use the scale even in this case, + // but at the moment we don't + scale = ScaleT(1); + return + write_data(s, data, byte_order, can_corrupt_data); + } + switch(type.id) + { + // define macro what to do with a specific NumericType +#if !defined(_MSC_VER) || _MSC_VER>1300 +#define TYPENAME typename +#else +#define TYPENAME +#endif +#define CASE(NUMERICTYPE) \ + case NUMERICTYPE : \ + return \ + write_data(s, data, \ + NumericInfo::type>(), \ + scale, byte_order, can_corrupt_data) + + // now list cases that we want + CASE(NumericType::SCHAR); + CASE(NumericType::UCHAR); + CASE(NumericType::SHORT); + CASE(NumericType::USHORT); + CASE(NumericType::INT); + CASE(NumericType::UINT); + CASE(NumericType::LONG); + CASE(NumericType::ULONG); + CASE(NumericType::FLOAT); + CASE(NumericType::DOUBLE); +#undef CASE +#undef TYPENAME + default: + warning("write_data : type not yet supported\n, at line %d in file %s", + __LINE__, __FILE__); + return Succeeded::no; + + } + +} + +#undef ___BYTEORDER_DEFAULT +#undef ___CAN_CORRUPT_DATA_DEFAULT +#undef INT_NUM_DIMENSIONS + +END_NAMESPACE_STIR + diff --git a/src/include/stir/IO/write_data_1d.h b/src/include/stir/IO/write_data_1d.h new file mode 100644 index 0000000000..7c396cf58c --- /dev/null +++ b/src/include/stir/IO/write_data_1d.h @@ -0,0 +1,67 @@ +#ifndef __stir_IO_write_data_1d_H__ +#define __stir_IO_write_data_1d_H__ +/*! + \file + \ingroup Array_IO_detail + \brief Declaration of stir::write_data_1d() functions for writing 1D stir::Array objects to file + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/common.h" +#include +#include + +START_NAMESPACE_STIR +class Succeeded; +class ByteOrder; +template class Array; + +namespace detail { +/*! \ingroup Array_IO_detail + \brief This is an internal function called by \c write_data(). It does the actual writing + to \c std::ostream. + + This function does not throw any exceptions. Exceptions thrown by std::ostream::write + are caught. + */ +template +inline Succeeded +write_data_1d(std::ostream& s, const Array<1, elemT>& data, + const ByteOrder byte_order, + const bool can_corrupt_data); +/*! \ingroup Array_IO_detail + \brief This is an internal function called by \c write_data(). It does the actual writing + to \c FILE* using stdio functions. + + This function does not throw any exceptions. + + */ +template +inline Succeeded +write_data_1d(FILE* & fptr_ref, const Array<1, elemT>& data, + const ByteOrder byte_order, + const bool can_corrupt_data); +} + +END_NAMESPACE_STIR + +#include "stir/IO/write_data_1d.inl" + +#endif diff --git a/src/include/stir/IO/write_data_1d.inl b/src/include/stir/IO/write_data_1d.inl new file mode 100644 index 0000000000..0e76b1bc5a --- /dev/null +++ b/src/include/stir/IO/write_data_1d.inl @@ -0,0 +1,157 @@ +/*! + \file + \ingroup Array_IO_detail + \brief Implementation of stir::write_data_1d() functions + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/Array.h" +#include "stir/Succeeded.h" +#include "stir/ByteOrder.h" +#include + +START_NAMESPACE_STIR + +namespace detail { + +/***************** version for ostream *******************************/ + +template +inline Succeeded +write_data_1d(std::ostream& s, const Array<1, elemT>& data, + const ByteOrder byte_order, + const bool can_corrupt_data) +{ + if (!s || + (dynamic_cast(&s)!=0 && !dynamic_cast(&s)->is_open()) || + (dynamic_cast(&s)!=0 && !dynamic_cast(&s)->is_open())) + { warning("write_data: error before writing to stream.\n"); return Succeeded::no; } + + // While writing, the array is potentially byte-swapped. + // We catch exceptions to prevent problems with this. + // Alternative and safe way: (but involves creating an extra copy of the data) + /* + if (!byte_order.is_native_order()) + { + Array<1, elemT> a_copy(data); + for(int i=data.get_min_index(); i<=data.get_max_index(); i++) + ByteOrder::swap_order(a_copy[i]); + return write_data(s, a_copy, ByteOrder::native, true); + } + */ + if (!byte_order.is_native_order()) + { + Array<1,elemT>& data_ref = + const_cast&>(data); + for(int i=data.get_min_index(); i<=data.get_max_index(); ++i) + ByteOrder::swap_order(data_ref[i]); + } + + // note: find num_to_write (using size()) outside of s.write() function call + // otherwise Array::check_state() in size() might abort if + // get_const_data_ptr() is called before size() (which is compiler dependent) + const std::streamsize num_to_write = + static_cast(data.size())* sizeof(elemT); + bool writing_ok=true; + try + { + s.write(reinterpret_cast(data.get_const_data_ptr()), num_to_write); + } + catch(...) + { + writing_ok=false; + } + + data.release_const_data_ptr(); + + if (!can_corrupt_data && !byte_order.is_native_order()) + { + Array<1,elemT>& data_ref = + const_cast&>(data); + for(int i=data.get_min_index(); i<=data.get_max_index(); ++i) + ByteOrder::swap_order(data_ref[i]); + } + + if (!writing_ok || !s) + { warning("write_data: error after writing to stream.\n"); return Succeeded::no; } + + return Succeeded::yes; +} + +/***************** version for FILE *******************************/ +// largely a copy of above, but with calls to stdio function + +template +inline Succeeded +write_data_1d(FILE* & fptr_ref, const Array<1, elemT>& data, + const ByteOrder byte_order, + const bool can_corrupt_data) +{ + FILE *fptr = fptr_ref; + if (fptr==0|| ferror(fptr)) + { warning("write_data: error before writing to FILE.\n"); return Succeeded::no; } + + // While writing, the array is potentially byte-swapped. + // We catch exceptions to prevent problems with this. + // Alternative and safe way: (but involves creating an extra copy of the data) + /* + if (!byte_order.is_native_order()) + { + Array<1, elemT> a_copy(data); + for(int i=data.get_min_index(); i<=data.get_max_index(); i++) + ByteOrder::swap_order(a_copy[i]); + return write_data(s, a_copy, ByteOrder::native, true); + } + */ + if (!byte_order.is_native_order()) + { + Array<1,elemT>& data_ref = + const_cast&>(data); + for(int i=data.get_min_index(); i<=data.get_max_index(); ++i) + ByteOrder::swap_order(data_ref[i]); + } + + // note: find num_to_write (using size()) outside of s.write() function call + // otherwise Array::check_state() in size() might abort if + // get_const_data_ptr() is called before size() (which is compiler dependent) + const std::size_t num_to_write = + static_cast(data.size()); + const std::size_t num_written = + fwrite(reinterpret_cast(data.get_const_data_ptr()), sizeof(elemT), num_to_write, fptr); + + data.release_const_data_ptr(); + + if (!can_corrupt_data && !byte_order.is_native_order()) + { + Array<1,elemT>& data_ref = + const_cast&>(data); + for(int i=data.get_min_index(); i<=data.get_max_index(); ++i) + ByteOrder::swap_order(data_ref[i]); + } + + if (num_written!=num_to_write || ferror(fptr)) + { warning("write_data: error after writing to FILE.\n"); return Succeeded::no; } + + return Succeeded::yes; +} + + +} // end of namespace detail +END_NAMESPACE_STIR diff --git a/src/include/stir/ImagingModality.h b/src/include/stir/ImagingModality.h new file mode 100644 index 0000000000..0af8fb8472 --- /dev/null +++ b/src/include/stir/ImagingModality.h @@ -0,0 +1,107 @@ +/* + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Declaration of class stir::ImagingModality + + \author Kris Thielemans +*/ + +#ifndef __stir_ImagingModality_H__ +#define __stir_ImagingModality_H__ + +#include "stir/interfile_keyword_functions.h" +#include + +namespace stir { + +/*! \ingroup buildblock + Class for encoding the modality +*/ +class ImagingModality +{ + public: + //! enum with possible values (using DICOM naming) + enum ImagingModalityValue + { Unknown, PT, NM, MR, CT, US, Optical}; + + //! Construct from enum, set string accordingly + ImagingModality(ImagingModalityValue modality_v = Unknown) + : modality(modality_v) + { + this->set_string(); + } + + //! Construct from string, set enum accordingly + explicit ImagingModality(const std::string& modality_string_v) + : modality_string(modality_string_v) + { + this->set_enum(); + } + + ImagingModalityValue get_modality() const + { + return this->modality; + } + + std::string get_name() const + { + return this->modality_string; + } + private: + ImagingModalityValue modality; + std::string modality_string; + + void set_string() + { + switch (this->modality) + { + case PT: this->modality_string="PT"; break; + case NM: this->modality_string="NM"; break; + case MR: this->modality_string="MR"; break; + case CT: this->modality_string="CT"; break; + case US: this->modality_string="US"; break; + case Optical: this->modality_string="Optical"; break; + default: + case Unknown: this->modality_string="Unknown"; break; + } + } + + void set_enum() + { + const std::string mod = standardise_interfile_keyword(this->modality_string); + if (mod=="pt" || mod=="pet") + this->modality=PT; + else if ( mod=="nm" || mod=="nucmed" || mod=="spect") + this->modality=NM; + else if ( mod=="mr" || mod=="mri") + this->modality=MR; + else if ( mod=="ct" || mod=="cat") + this->modality=CT; + else if ( mod=="us" || mod=="ultrasound") + this->modality=US; + else if ( mod=="optical") + this->modality=Optical; + else + this->modality=Unknown; + } +}; + +} // namespace +#endif diff --git a/src/include/stir/IndexRange.h b/src/include/stir/IndexRange.h new file mode 100644 index 0000000000..99cd4ac8d2 --- /dev/null +++ b/src/include/stir/IndexRange.h @@ -0,0 +1,189 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __IndexRange_H__ +#define __IndexRange_H__ + +/*! + \file + + \brief This file defines the stir::IndexRange class. + + \author Kris Thielemans + \author PARAPET project + + + +*/ +#include "stir/VectorWithOffset.h" +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Array + \brief This class defines ranges which can be 'irregular'. + + This class allows construction and basic manipulation of 'irregular' + (but not completely arbitrary) ranges. As the class diagram shows, + an IndexRange is basically a VectorWithOffset with elements + of type IndexRange. This recursion ends in IndexRange<1> + which is simply a pair of numbers, given the start and end of the + 1D range. + + This means that the outer index runs over an interval of integers. + The next level of indices again runs over such an interval, but + which interval can depend on the value of the outer index. + + For instance for a 2D range of indices \a i, \a j, the outer index + \a i could run from 1 to 2, and for \a i=1, \a j could run from 4 to 6, + while for \a i=2, \a j could run from 6 to 8. + + Facilities are provided for constructing 'regular' ranges (where the + range of the inner indices does not depend on the value of the + outer indices). However, storage is currently not optimised for the + regular case. + + Example of usage: + \code + IndexRange<3> range = construct_me_an_index_range(); + int outer_index = range.get_min_index(); + while(outer_index <= range.get_max_index()) + { + int level_2_min_index = range[outer_index].get_min_index(); + ... + } + \endcode +*/ +template +class IndexRange : public VectorWithOffset > +{ +protected: + typedef VectorWithOffset > base_type; + +public: + //! typedefs such that we do not need to have \a typename wherever we use iterators + typedef typename base_type::iterator iterator; + typedef typename base_type::const_iterator const_iterator; + + //! Empty range + inline IndexRange(); + + //! Make an IndexRange from the base type + inline IndexRange(const VectorWithOffset >& range); + + //! Copy constructor + inline IndexRange(const IndexRange& range); + + //! Construct a regular range given by all minimum indices and all maximum indices. + inline IndexRange( + const BasicCoordinate& min, + const BasicCoordinate& max); + + //! Construct a regular range given by sizes (minimum indices will be 0) + inline IndexRange(const BasicCoordinate& sizes); + + //these are derived from VectorWithOffset + // TODO these should be overloaded, to set regular_range as well. + /* + const IndexRange& operator[](int i) const + { return range[i]; } + + IndexRange& operator[](int i) + { return range[i]; } + */ + + //! comparison operator + inline bool operator==(const IndexRange&) const; + inline bool operator!=(const IndexRange&) const; + + //! checks if the range is 'regular' + inline bool is_regular() const; + + //! find regular range, returns false if the range is not regular + bool get_regular_range( + BasicCoordinate& min, + BasicCoordinate& max) const; + +#ifdef STIR_NO_MUTABLE + //! checks if the range is 'regular' + inline bool is_regular(); + + //! find regular range + bool get_regular_range( + BasicCoordinate& min, + BasicCoordinate& max); +#endif + +private: + //! enum to encode the current knowledge about regularity + enum is_regular_type {regular_true, regular_false, regular_to_do}; + + //! variable storing the current knowledge about regularity +#ifndef STIR_NO_MUTABLE + mutable +#endif + is_regular_type is_regular_range; +}; + + +//! The (simple) 1 dimensional specialisation of IndexRange +template<> +class IndexRange<1> +{ +public: + inline IndexRange(); + inline IndexRange(const int min, const int max); + + inline IndexRange(const BasicCoordinate<1,int>& min, + const BasicCoordinate<1,int>& max); + + inline IndexRange(const int length); + inline IndexRange(const BasicCoordinate<1, int>& size); + + inline int get_min_index() const; + inline int get_max_index() const; + inline int get_length() const; + + inline bool operator==(const IndexRange<1>& range2) const; + + //! checks if the range is 'regular' (always true for the 1d case) + inline bool is_regular() const; + + //! fills in min and max, and returns true + inline bool get_regular_range( + BasicCoordinate<1, int>& min, + BasicCoordinate<1, int>& max) const; + //! resets to new index range + inline void resize(const int min_index, const int max_index); + +private: + int min; + int max; +}; + + +END_NAMESPACE_STIR + +#include "stir/IndexRange.inl" + +#endif + + diff --git a/src/include/stir/IndexRange.inl b/src/include/stir/IndexRange.inl new file mode 100644 index 0000000000..a1ae09b24d --- /dev/null +++ b/src/include/stir/IndexRange.inl @@ -0,0 +1,231 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup Array + \brief inline definitions for the IndexRange class + + \author Kris Thielemans + \author PARAPET project + + + +*/ +#include + +START_NAMESPACE_STIR + +/*************************************** + n-D version + ***************************************/ + +template +IndexRange::IndexRange() + : base_type(), + is_regular_range(regular_true) + {} + +template +IndexRange::IndexRange(const IndexRange& range) + : base_type(range), + is_regular_range(range.is_regular_range) + {} + +template +IndexRange::IndexRange(const base_type& range) + : base_type(range), + is_regular_range(regular_to_do) + {} + +template +IndexRange:: +IndexRange( + const BasicCoordinate& min_v, + const BasicCoordinate& max_v) + : base_type(min_v[1], max_v[1]), + is_regular_range(regular_true) +{ + const IndexRange + lower_dims(cut_first_dimension(min_v), cut_first_dimension(max_v)); + this->fill(lower_dims); +} + +template +IndexRange:: +IndexRange(const BasicCoordinate& sizes) + : base_type(sizes[1]), + is_regular_range(regular_true) +{ + const IndexRange + lower_dims(cut_first_dimension(sizes)); + this->fill(lower_dims); +} + +template +bool +IndexRange:: + operator==(const IndexRange& range2) const +{ + return + this->get_min_index() == range2.get_min_index() && + this->get_length() == range2.get_length() && +#ifndef STIR_NO_NAMESPACES + // "using std::equal" didn't work for VC 6... + std::equal(this->begin(), this->end(), range2.begin()); +#else + equal(this->begin(), this->end(), range2.begin()); +#endif +} + + +template +bool +IndexRange:: + operator!=(const IndexRange& range2) const +{ + return !(*this==range2); +} + +template +bool +IndexRange:: + is_regular() const +{ + switch (is_regular_range) + { + case regular_true: + return true; + case regular_false: + return false; + case regular_to_do: + { + BasicCoordinate min; + BasicCoordinate max; + return + get_regular_range(min,max); + } + } + // although we never get here, VC insists on a return value... + // we check anyway + assert(false); + return true; +} + +#ifdef STIR_NO_MUTABLE + +template +bool +IndexRange:: + is_regular() +{ + switch (is_regular_range) + { + case regular_true: + return true; + case regular_false: + return false; + case regular_to_do: + { + BasicCoordinate min; + BasicCoordinate max; + return + get_regular_range(min,max); + } + } + // although we never get here, VC insists on a return value... + // we check anyway + assert(false); + return true; +} +#endif // STIR_NO_MUTABLE +/*************************************** + 1D version + ***************************************/ + +IndexRange<1>::IndexRange() +: min(0), max(0) +{} + +IndexRange<1>::IndexRange(const int min_v, const int max_v) +: min(min_v), max(max_v) +{} + +IndexRange<1>::IndexRange(const BasicCoordinate<1,int>& min_v, + const BasicCoordinate<1,int>& max_v) +: min(min_v[1]), max(max_v[1]) +{} + +IndexRange<1>::IndexRange(const int length) +: min(0), max(length-1) +{} + +IndexRange<1>::IndexRange(const BasicCoordinate<1,int>& size) +: min(0), max(size[1]-1) +{} + +int IndexRange<1>::get_min_index() const +{ return min;} + +int +IndexRange<1>::get_max_index() const +{ return max;} + +int +IndexRange<1>::get_length() const +{ return max-min+1; } + +bool +IndexRange<1>::operator==(const IndexRange<1>& range2) const +{ + return + get_min_index() == range2.get_min_index() && + get_length() == range2.get_length(); +} + +bool +IndexRange<1>::is_regular() const +{ + // 1D case: always true + return true; +} + +bool +IndexRange<1>::get_regular_range( + BasicCoordinate<1, int>& min_v, + BasicCoordinate<1, int>& max_v) const +{ + // somewhat complicated as we can't assign ints to BasicCoordinate<1,int> + BasicCoordinate<1, int> tmp; + tmp[1] = min; + min_v = tmp; + tmp[1] = max; + max_v = tmp; + return true; +} + +void +IndexRange<1>:: +resize(const int min_index, const int max_index) +{ + min = min_index; + max = max_index; +} +END_NAMESPACE_STIR diff --git a/src/include/stir/IndexRange2D.h b/src/include/stir/IndexRange2D.h new file mode 100644 index 0000000000..0b98ec6081 --- /dev/null +++ b/src/include/stir/IndexRange2D.h @@ -0,0 +1,64 @@ +// +// + +#ifndef __IndexRange2D_H__ +#define __IndexRange2D_H__ +/*! + \file + \ingroup Array + \brief This file declares the class stir::IndexRange2D. + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/IndexRange.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Array + \brief a 'convenience' class for 2D index ranges. + + Provides an easier constructor for regular ranges. +*/ +class IndexRange2D : public IndexRange<2> + +{ +private: + typedef IndexRange<2> base_type; + +public: + inline IndexRange2D(); + inline IndexRange2D(const IndexRange<2>& range_v); + inline IndexRange2D(const int min_1, const int max_1, + const int min_2, const int max_2); + inline IndexRange2D(const int length_1, const int length_2); + // TODO add 2 arg constructor with BasicCoordinate<2,int> min,max +}; + + +END_NAMESPACE_STIR + +#include "stir/IndexRange2D.inl" + +#endif diff --git a/src/include/stir/IndexRange2D.inl b/src/include/stir/IndexRange2D.inl new file mode 100644 index 0000000000..fbf4078b3b --- /dev/null +++ b/src/include/stir/IndexRange2D.inl @@ -0,0 +1,55 @@ +// +// +/*! + \file + \ingroup Array + \brief inline implementations for stir::IndexRange2D. + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Coordinate2D.h" + +START_NAMESPACE_STIR + +IndexRange2D::IndexRange2D() +: base_type() +{} + + +IndexRange2D::IndexRange2D(const IndexRange<2>& range_v) +: base_type(range_v) +{} + +IndexRange2D::IndexRange2D(const int min_1, const int max_1, + const int min_2, const int max_2) + :base_type(Coordinate2D(min_1,min_2), + Coordinate2D(max_1,max_2)) +{} + +IndexRange2D::IndexRange2D(const int length_1, const int length_2) +: base_type(Coordinate2D(0,0), + Coordinate2D(length_1-1,length_2-1)) +{} + +END_NAMESPACE_STIR diff --git a/src/include/stir/IndexRange3D.h b/src/include/stir/IndexRange3D.h new file mode 100644 index 0000000000..c99cba8d34 --- /dev/null +++ b/src/include/stir/IndexRange3D.h @@ -0,0 +1,68 @@ +// +// + +#ifndef __IndexRange3D_H__ +#define __IndexRange3D_H__ +/*! + \file + \ingroup Array + + \brief This file declares the class stir::IndexRange3D. + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/IndexRange.h" + +START_NAMESPACE_STIR + + +/*! + \ingroup Array + \brief a 'convenience' class for 3D index ranges. + Provides an easier constructor for regular ranges. +*/ +class IndexRange3D : public IndexRange<3> + +{ +private: + typedef IndexRange<3> base_type; + +public: + inline IndexRange3D(); + inline IndexRange3D(const IndexRange<3>& range_v); + inline IndexRange3D(const int min_1, const int max_1, + const int min_2, const int max_2, + const int min_3, const int max_3); + inline IndexRange3D(const int length_1, const int length_2, const int length_3); + + // TODO add 2 arg constructor with BasicCoordinate<2,int> min,max +}; + + +END_NAMESPACE_STIR + +#include "stir/IndexRange3D.inl" + +#endif diff --git a/src/include/stir/IndexRange3D.inl b/src/include/stir/IndexRange3D.inl new file mode 100644 index 0000000000..8915e9706e --- /dev/null +++ b/src/include/stir/IndexRange3D.inl @@ -0,0 +1,56 @@ +// +// +/*! + \file + \ingroup Array + \brief inline implementations for stir::IndexRange3D. + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Coordinate3D.h" + +START_NAMESPACE_STIR + +IndexRange3D::IndexRange3D() +: base_type() +{} + + +IndexRange3D::IndexRange3D(const IndexRange<3>& range_v) +: base_type(range_v) +{} + +IndexRange3D::IndexRange3D(const int min_1, const int max_1, + const int min_2, const int max_2, + const int min_3, const int max_3) + :base_type(Coordinate3D(min_1,min_2,min_3), + Coordinate3D(max_1,max_2,max_3)) +{} + +IndexRange3D::IndexRange3D(const int length_1, const int length_2, const int length_3) +: base_type(Coordinate3D(0,0,0), + Coordinate3D(length_1-1,length_2-1,length_3-1)) +{} +END_NAMESPACE_STIR diff --git a/src/include/stir/IndexRange4D.h b/src/include/stir/IndexRange4D.h new file mode 100644 index 0000000000..47fa83f18f --- /dev/null +++ b/src/include/stir/IndexRange4D.h @@ -0,0 +1,70 @@ +// +// +/*! + \file + \ingroup Array + + \brief This file declares the class stir::IndexRange4D. + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __IndexRange4D_H__ +#define __IndexRange4D_H__ + +#include "stir/IndexRange.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Array + \brief A convenience class for 4D index ranges + + This class is derived from IndexRange<4>. It just provides some + extra constructors for making 'regular' ranges. +*/ +class IndexRange4D : public IndexRange<4> + +{ +private: + typedef IndexRange<4> base_type; + +public: + inline IndexRange4D(); + inline IndexRange4D(const IndexRange<4>& range_v); + inline IndexRange4D(const int min_1, const int max_1, + const int min_2, const int max_2, + const int min_3, const int max_3, + const int min_4, const int max_4); + inline IndexRange4D(const int length_1, + const int length_2, + const int length_3, + const int length_4); +}; + + +END_NAMESPACE_STIR + +#include "stir/IndexRange4D.inl" + +#endif diff --git a/src/include/stir/IndexRange4D.inl b/src/include/stir/IndexRange4D.inl new file mode 100644 index 0000000000..bafc21e3c8 --- /dev/null +++ b/src/include/stir/IndexRange4D.inl @@ -0,0 +1,57 @@ +// +// +/*! + \file + \ingroup Array + + \brief inline implementations for stir::IndexRange4D. + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Coordinate4D.h" + +START_NAMESPACE_STIR + +IndexRange4D::IndexRange4D() +: base_type() +{} + + +IndexRange4D::IndexRange4D(const IndexRange<4>& range_v) +: base_type(range_v) +{} + +IndexRange4D::IndexRange4D(const int min_1, const int max_1, + const int min_2, const int max_2, + const int min_3, const int max_3, + const int min_4, const int max_4) + :base_type(Coordinate4D(min_1,min_2,min_3,min_4), + Coordinate4D(max_1,max_2,max_3,max_4)) +{} + +IndexRange4D::IndexRange4D(const int length_1, const int length_2, const int length_3, const int length_4) +: base_type(Coordinate4D(0,0,0,0), + Coordinate4D(length_1-1,length_2-1,length_3-1,length_4-1)) +{} +END_NAMESPACE_STIR diff --git a/src/include/stir/KeyParser.h b/src/include/stir/KeyParser.h new file mode 100644 index 0000000000..55e604263a --- /dev/null +++ b/src/include/stir/KeyParser.h @@ -0,0 +1,458 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Declaration of class stir::KeyParser + + \author Patrick Valente + \author Kris Thielemans + \author PARAPET project +*/ + + +#ifndef __stir_KEYPARSER_H__ +#define __stir_KEYPARSER_H__ + +#include "stir/shared_ptr.h" +#include "stir/Array.h" +#include "boost/any.hpp" + +//#include +#include +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +using std::string; +//using std::map; +using std::list; +using std::pair; +using std::istream; +using std::ostream; +#endif + +START_NAMESPACE_STIR + +typedef vector ASCIIlist_type; + +class Object; +class Succeeded; + +class KeyParser; + +/*! + \ingroup buildblock + \brief A class that enumerates the possible types that can be used + to store parsed values. Used (only) by KeyParser. + + ASCIIlist means a string which has to be one of a specified list + + \todo Should be made a protected enum of KeyParser + */ +class KeyArgument +{ +public: + enum type {NONE,ASCII,LIST_OF_ASCII,ASCIIlist,UINT, ULONG,INT, + LIST_OF_INTS,DOUBLE, LIST_OF_DOUBLES, listASCIIlist, + ARRAY2D_OF_FLOATS, + ARRAY3D_OF_FLOATS, + BASICCOORDINATE3D_OF_FLOATS, + BASICCOORDINATE3D_OF_ARRAY3D_OF_FLOATS, + PARSINGOBJECT, + SHARED_PARSINGOBJECT, + FLOAT, BOOL}; +}; + +/*! + \ingroup buildblock + \brief Class to store the Interfile keywords and their actions. + + \warning These should not be used outside of the KeyParser implementation. + \todo make private class in KeyParser +*/ +class map_element +{ +public : + KeyArgument::type type; + void (KeyParser::*p_object_member)(); // pointer to a member function + //TODO void (*p_object_member)(); + void *p_object_variable; // pointer to a variable + const ASCIIlist_type *p_object_list_of_values;// only used by ASCIIlist + // TODO should really not be here, but it works for now + typedef Object * (Parser)(istream*, const string&); + Parser* parser; + + map_element(); + + map_element(KeyArgument::type t, void (KeyParser::*pom)(), + void* pov= 0, const ASCIIlist_type *list_of_valid_keywords = 0); + map_element(void (KeyParser::*pom)(), + Object** pov, + Parser *); + map_element(void (KeyParser::*pom)(), + shared_ptr* pov, + Parser *); + ~map_element(); + + map_element& operator=(const map_element& me); +}; + +// note: next text contains double \\ for correct parsing by doxygen +// you should read them as a single backslash +/*! + \ingroup buildblock + \brief A class to parse Interfile headers + + Currently, Interfile 3.3 parsing rules are hard-coded, with + some extensions. + + KeyParser reads input line by line and parses each line separately. + It allows for '\\r' at the end of the line (as in files + originating in DOS/Windows). + When the line ends with a backslash '\\', the next line + will just be appended to the current one. That is, '\\' + acts as continuation marker. + + Lines can have arbitrary length. + + A special facility is provided for using the value of environment + variables: after reading the whole line, the text is checked for + occurences of the form ${some_text}$. These text strings + are then replaced by the value of the corresponding environment + variables (using the std::getenv function). + + \warning For end-of-line continuation, the backslash HAS to be + the last character. Even spaces after it will stop the 'continuation'. + + \warning Vectored keys are treated very dangerously: when a keyword + is assumed to be vectored, run-time errors occur when it is used without []. + \warning The use of the [*] index for vectored keys is NOT supported. + + Main problem: when non-trivial callback functions have to be used, you need to do it + via a derived class (as KeyParser requires pointers to member functions.) + + \warning As KeyParser::add_key stores pointers to the variables where you want + your results, it is somewhat dangerous to copy a KeyParser object. That is, its + keymap will still point to the same variables. + + \todo add checking functions in the map, as in + \code add_key("my key",&my_value, check_positive); \endcode + \todo add facilities for checking (while parsing) if a keyword was present before the current one +*/ +class KeyParser +{ + // historical typedefs + typedef std::vector IntVect; + typedef std::vector DoubleVect; + +public: + KeyParser(); + virtual ~KeyParser(); + + //! parse() returns false if there is some error, true otherwise + /*! if \s write_warnings is \c false, warnigns about undefined keywords will be supressed.*/ + bool parse(istream& f, const bool write_warnings=true); + //! parse() returns false if there is some error, true otherwise + /*! if \s write_warnings is \c false, warnigns about undefined keywords will be supressed.*/ + bool parse(const char * const filename, const bool write_warnings=true); + + ////// functions to add keys and their actions + + // KT 07/02/2001 all these are new (up to add_parsing_key) + + //! add a keyword. When parsing, parse its value as a float and put it in *variable_ptr + void add_key(const string& keyword, float * variable_ptr); + //! add a keyword. When parsing, parse its value as a double and put it in *variable_ptr + void add_key(const string& keyword, double * variable_ptr); + + //! add a keyword. When parsing, parse its value as a int and put it in *variable_ptr + void add_key(const string& keyword, int * variable_ptr); + + //! add a keyword. When parsing, parse its value as a int and put it in *variable_ptr + void add_key(const string& keyword, unsigned int * variable_ptr); + + //! add a keyword. When parsing, parse its value as an unsigned long and put it in *variable_ptr + void add_key(const string& keyword, unsigned long * variable_ptr); + + //! add a keyword. When parsing, parse its value as a int and put the bool value in *variable_ptr + /*! The integer should be 0 or 1, corresponding to false and true resp. */ + void add_key(const string& keyword, bool * variable_ptr); + + //! add a keyword. When parsing, parse its value as a list of doubles and put its value in *variable_ptr + void add_key(const string& keyword, vector * variable_ptr); + + //! add a keyword. When parsing, parse its value as a list of comma-separated strings and put its value in *variable_ptr + void add_key(const string& keyword, vector * variable_ptr); + + //! add a keyword. When parsing, parse its value as a 2d array of floats and put its value in *variable_ptr + void add_key(const string& keyword, Array<2,float>* variable_ptr); + + //! add a keyword. When parsing, parse its value as a 3d array of floats and put its value in *variable_ptr + void add_key(const string& keyword, Array<3,float>* variable_ptr); + + //! add a keyword. When parsing, parse its value as a 3d BasicCoordinate of floats and put its value in *variable_ptr + void add_key(const string& keyword,BasicCoordinate<3,float>* variable_ptr); + + //! add a keyword. When parsing, parse its value as a 3d BasicCoordinate of a 3d array of floats and put its value in *variable_ptr + void add_key(const string& keyword, BasicCoordinate<3,Array<3,float> >* variable_ptr); + + //! add a keyword. When parsing, parse its value as a string and put it in *variable_ptr + /*! The 'value' can contain spaces. */ + void add_key(const string& keyword, string * variable_ptr); + /*! + \brief add a keyword. When parsing, its string value is checked against + a list of strings. The corresponding index is stored in + *variable_ptr. + + If no match is found, a warning message is issued and *variable_ptr + is set to -1. + */ + void add_key(const string& keyword, + int* variable_ptr, const ASCIIlist_type * const list_of_values); + + //! add keyword that has to occur before all others + /*! Example of such a key: INTERFILE*/ + void add_start_key(const string& keyword); + //! add a keyword that when encountered, will stop the parsing + void add_stop_key(const string& keyword); + + //! add keyword corresponding to an object that will parse the next keys itself + /*! + When this keyword is encountered during parsing, the parser + ParsingClass::read_registered_object(name) is called, with 'name' set to + to the value of the keyword. + + ParsingClass has to be derived from RegisteredObject (strictly speaking it only has + to be derived from Object, and provide a static function void read_registered_object(string&)). + + Example of usage: + \code + struct SomeReconstruction + { + SomeReconstruction(); + ImageProcessor<3,float>* filter_ptr; + double beta; + KeyParser parser; + }; + + SomeReconstruction::SomeReconstruction() + { + beta = 1; + filter_ptr = 0; + parser.add_start_key("SomeReconstructionParameters"); + parser.add_key("beta ", &beta); + parser.add_parsing_key("MAP a la MRP filter type", &filter_ptr); + parser.add_stop_key("END SomeReconstruction Parameters"); + } + \endcode + + The .par file then would look as follows + \verbatim + SomeReconstructionParameters := + beta := 0.001 + MAP a la MRP filter type := Median + ; keywords here appropriate to a Median ImageFilter + End SomeReconstruction Parameters:= ; + \endverbatim + */ + // definition of next function has to be here to get it to compile with VC (it uses member templates) + template + void add_parsing_key(const string& keyword, ParsingClass** parsed_object_ptr_ptr) + { + add_in_keymap(keyword, + map_element(&KeyParser::set_parsing_object, + reinterpret_cast(parsed_object_ptr_ptr), + (map_element::Parser *)(&ParsingClass::read_registered_object)) + ); + } + + //! add keyword corresponding to an object that will parse the next keys itself + /*! As above, but with a shared_ptr */ + template + void add_parsing_key(const string& keyword, shared_ptr* parsed_object_ptr_ptr) + { + add_in_keymap(keyword, + map_element(&KeyParser::set_shared_parsing_object, + reinterpret_cast*>(parsed_object_ptr_ptr), + (map_element::Parser *)(&ParsingClass::read_registered_object)) + ); + } + + //! Prints all keywords (in random order) to the stream + void print_keywords_to_stream(ostream&) const; + + // KT 07/02/2001 new + //! Returns a string with keywords and their values + /*! Keywords are listed in the order they are inserted in the keymap + (except for start and stop keys which are listed first and last). + + \bug breaks with 'vectored' keys. + */ + virtual string parameter_info() const; + + // KT 07/02/2001 new + //! Ask interactively for values for all keywords + /*! Keywords are asked in the order they are inserted in the keymap. + + \todo any consistency checks are currently done by post_processing() at the + end of the parsing. It should be possible to have checks after every question + such that it can be repeated. + + \bug breaks with for 'vectored' keys. + */ + virtual void ask_parameters(); + + + //! returns the index of a string in 'list_of_values', -1 if not found + /*! Implementation note: this function is non-static because it uses + standardise_keyword + */ + int find_in_ASCIIlist(const string&, const ASCIIlist_type& list_of_values); + + +protected : + + ////// work horses + + //! This will be called at the end of the parsing + /*! \return false if everything OK, true if not + \todo return Succeeded instead. + */ + virtual bool post_processing() + { return false; } + + + + //! convert 'rough' keyword into a standardised form + /*! \todo Implementation note: this function is non-static such that it can + be overloaded. Probably a template with a function object would be + better. */ + virtual string + standardise_keyword(const string& keyword) const; + + + //! gets a keyword from a string + /*! Implementation note: this function is non-static as it uses + standardise_keyword(). + */ + virtual string + get_keyword(const string&) const; + + + + typedef void (KeyParser::*KeywordProcessor)(); + // TODO typedef void (*KeywordProcessor)(); + + + //! add a keyword to the list, together with its call_back function + /*! This provides a more flexible way to add keys with specific call_backs. + Can currently only be used by derived classes, as KeywordProcessor has to be a + pointer to member function. + \warning this interface to KeyParser will change in a future release */ + void add_key(const string& keyword, + KeyArgument::type t, KeywordProcessor function, + void* variable= 0, const ASCIIlist_type * const list = 0); + + //! version that defaults 'function' to set_variable + /*! \warning this interface to KeyParser will change in a future release */ + void add_key(const string& keyword, KeyArgument::type t, + void* variable, const ASCIIlist_type * const list = 0); + + ////// predefined call_back functions + + +public: + //! callback function to start parsing, has to be set by first keyword + void start_parsing(); + //! to stop parsing + void stop_parsing(); + //! callback function for keys which do not do anything + void do_nothing() {}; + //! callback function that sets the variable to the value given as the value of the keyword + /*! if the keyword had no value, set_variable will do nothing */ + void set_variable(); + + //! callback function that sets the variable by calling the parser (as stored by add_parsing_key()), with argument the value of the keyword + /*! if the keyword had no value, set_variable will do nothing */ + void set_parsing_object(); + //! callback function that sets the shared_ptr variable by calling the parser (as stored by add_parsing_key()), with argument the value of the keyword + /*! if the keyword had no value, set_variable will do nothing */ + void set_shared_parsing_object(); + + +private : + + friend class map_element; + ////// variables + + enum parse_status { end_parsing, parsing }; + parse_status status; + + // KT 01/05/2001 changed to a list, to preserve order of keywords + //typedef map Keymap; + typedef list > Keymap; + + Keymap kmap; + // KT 01/05/2001 new functions to allow a list type + map_element* find_in_keymap(const string& keyword); + void add_in_keymap(const string& keyword, const map_element& new_element); + + istream * input; + map_element* current; + int current_index; + string keyword; + + // next will be false when there's only a keyword on the line + // maybe should be protected (or even public?). At the moment, this is only used by set_variable(). + // That should cover most cases. + bool keyword_has_a_value; + boost::any parameter; + + ////// methods + + // loops over all lines in the file. + Succeeded parse_header(const bool write_warnings); + + // read a line, find keyword and call parse_value_in_line() + Succeeded read_and_parse_line(const bool write_warning); + + // see if current keyword is in the keymap using map_keyword + // if so, call its call_back function and return Succeeded::yes, else + // conditionally write a warning and return Succeeded::no + Succeeded parse_value_in_line(const string& line, const bool write_warning); + + // set 'current' to map_element corresponding to 'keyword' + // return Succeeded::yes if valid keyword, Succeeded::no otherwise + Succeeded map_keyword(const string& keyword); + + // call appropriate member function + void process_key(); + + + +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/LORCoordinates.h b/src/include/stir/LORCoordinates.h new file mode 100644 index 0000000000..3c62f99136 --- /dev/null +++ b/src/include/stir/LORCoordinates.h @@ -0,0 +1,581 @@ +// +// +#ifndef __stir_LORCoordinates_H__ +#define __stir_LORCoordinates_H__ + +/*! + \file + \ingroup LOR + \brief defines various classes for specifying a line in 3 dimensions + \warning This is all preliminary and likely to change. + \author Kris Thielemans + + +*/ +/* + Copyright (C) 2004 - 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/CartesianCoordinate3D.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + + + + +// predeclarations to allow cross-referencing +template class LOR; +template class LORInAxialAndSinogramCoordinates; +template class LORInCylinderCoordinates; +template class LORInAxialAndNoArcCorrSinogramCoordinates; +template class LORAs2Points; + + +/*! \ingroup LOR + \brief A base class for specifying an LOR with geometric coordinates + + A Line-of-Response (LOR) is really just a line in 3D. You can specify + a line in several ways, each if which is more convenient for some + application. This class provides a common base for all of these. + + \warning This is all preliminary and likely to change. +*/ +template +class LOR +{ + public: + virtual ~LOR() {} + + virtual + LOR * clone() const = 0; + + virtual + Succeeded + change_representation(LORInCylinderCoordinates&, + const double radius) const = 0; + virtual + Succeeded + change_representation(LORInAxialAndNoArcCorrSinogramCoordinates&, + const double radius) const = 0; + virtual + Succeeded + change_representation(LORInAxialAndSinogramCoordinates&, + const double radius) const = 0; + virtual + Succeeded + get_intersections_with_cylinder(LORAs2Points&, + const double radius) const = 0; +}; + +/*! \ingroup LOR + \brief A class for a point on a cylinder. + \warning This is all preliminary and likely to change. +*/ + +template +class PointOnCylinder +{ + private: + // sorry: has to be first to give the compiler a better chance of inlining + void check_state() const + { + assert(0<=_psi); + assert(_psi(2*_PI)); + } + public: + coordT psi() const { check_state(); return _psi; } + coordT& psi() { check_state(); return _psi; } + coordT z() const { return _z; } + coordT& z() { return _z; } + + inline + PointOnCylinder(); + inline + PointOnCylinder(const coordT z, const coordT psi); + + private: + coordT _z; + coordT _psi; + +}; + +/*! \ingroup LOR + \brief An internal class for LORs. Do not use. + \warning This is all preliminary and likely to change. +*/ +template +class LORCylindricalCoordinates_z_and_radius +{ + private: + // sorry: has to be first to give the compiler a better chance of inlining + void check_state() const + { + assert(_radius>0); + } + protected: + explicit + LORCylindricalCoordinates_z_and_radius(coordT radius=1) + : _radius(radius) + { check_state(); } + LORCylindricalCoordinates_z_and_radius(coordT z1, coordT z2, coordT radius) + : _radius(radius), _z1(z1), _z2(z2) + { check_state(); } + + coordT z1() const { check_state(); return _z1; } + coordT& z1() { check_state(); return _z1; } + coordT z2() const { check_state(); return _z2; } + coordT& z2() { check_state(); return _z2; } + + coordT radius() const { check_state(); return _radius; } + + inline + void + set_radius_no_check(const coordT new_radius) + { + check_state(); + assert(new_radius>0); + _z1 *= new_radius/_radius; + _z2 *= new_radius/_radius; + _radius = new_radius; + } + coordT _radius; + +private: + coordT _z1; + coordT _z2; +}; + +/*! \ingroup LOR + \brief A class for LORs. + \warning This is all preliminary and likely to change. +*/ +template +class LORInCylinderCoordinates : public LOR +{ + typedef LORInCylinderCoordinates self_type; + void check_state() const + { + assert(_radius>0); + } + public: + const PointOnCylinder& p1() const { return _p1; } + PointOnCylinder& p1() { return _p1; } + const PointOnCylinder& p2() const { return _p2; } + PointOnCylinder& p2() { return _p2; } + + void reset(coordT radius=1) + { + // set psi such that the new LOR does intersect that cylinder + _p1.psi()=0; _p2.psi()=static_cast(_PI); _radius=radius; + } + coordT radius() const { check_state(); return _radius; } + + inline + Succeeded + set_radius(coordT new_radius) + { + check_state(); + assert(new_radius>0); + if (_radius==new_radius) + return Succeeded::yes; + // find minimum radius of a cylinder that is intersected by this LOR + const coordT min_radius = + _radius*fabs(cos((_p1.psi()-_p2.psi())/2)); + if (new_radius >= min_radius) + return Succeeded::no; + _p1.z() *= new_radius/_radius; + _p2.z() *= new_radius/_radius; + _radius = new_radius; + return Succeeded::yes; + } + + + inline explicit + LORInCylinderCoordinates(const coordT radius = 1); + + inline + LORInCylinderCoordinates(const PointOnCylinder& p1, + const PointOnCylinder& p2, + const coordT radius = 1); + + inline + LORInCylinderCoordinates(const LORInAxialAndNoArcCorrSinogramCoordinates&); + + inline + LORInCylinderCoordinates(const LORInAxialAndSinogramCoordinates&); + + inline + LORInCylinderCoordinates(const LORAs2Points&); + + virtual +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + self_type* +#else + LOR* +#endif + clone() const { return new self_type(*this); } + + virtual + Succeeded + change_representation(LORInCylinderCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndNoArcCorrSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + get_intersections_with_cylinder(LORAs2Points&, + const double radius) const; + + private: + PointOnCylinder _p1; + PointOnCylinder _p2; + coordT _radius; + +}; + +/*! \ingroup LOR + \brief A class for LORs. + \warning This is all preliminary and likely to change. +*/ +template +class LORAs2Points : public LOR +{ + typedef LORAs2Points self_type; + public: + const CartesianCoordinate3D& p1() const { return _p1; } + CartesianCoordinate3D& p1() { return _p1; } + const CartesianCoordinate3D& p2() const { return _p2; } + CartesianCoordinate3D& p2() { return _p2; } + + inline + LORAs2Points(); + + inline + LORAs2Points(const CartesianCoordinate3D& p1, + const CartesianCoordinate3D& p2); + + inline + LORAs2Points(const LORInCylinderCoordinates& cyl_coords); + + inline + LORAs2Points(const LORInAxialAndSinogramCoordinates&); + + inline + LORAs2Points(const LORInAxialAndNoArcCorrSinogramCoordinates&); + + virtual +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + self_type* +#else + LOR* +#endif + clone() const { return new self_type(*this); } + + virtual + Succeeded + change_representation(LORInCylinderCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndNoArcCorrSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + get_intersections_with_cylinder(LORAs2Points&, + const double radius) const; + + private: + CartesianCoordinate3D _p1; + CartesianCoordinate3D _p2; +}; + +/*! \ingroup LOR + \brief A class for LORs. + \warning This is all preliminary and likely to change. +*/ +template +class LORInAxialAndSinogramCoordinates + : public LOR, private LORCylindricalCoordinates_z_and_radius +{ + private: + typedef LORInAxialAndSinogramCoordinates self_type; + typedef LORCylindricalCoordinates_z_and_radius private_base_type; + // sorry: has to be first to give the compiler a better chance of inlining + void check_state() const + { + assert(private_base_type::_radius>0); + assert(_s>-private_base_type::_radius); + assert(_s(_PI)); + assert(_phi>=0); + } + + public: + coordT z1() const { check_state(); return private_base_type::z1(); } + coordT& z1() { check_state(); return private_base_type::z1(); } + coordT z2() const { check_state(); return private_base_type::z2(); } + coordT& z2() { check_state(); return private_base_type::z2(); } + coordT phi() const { check_state(); return _phi; } + coordT& phi() { check_state(); return _phi; } + coordT s() const { check_state(); return _s; } + coordT& s() { check_state(); return _s; } + + coordT beta() const { check_state(); return asin(_s/private_base_type::_radius); } + + inline explicit + LORInAxialAndSinogramCoordinates(const coordT radius = 1); + + //! Constructor from explicit arguments + /*! \warning + It's a bad idea to use this constructor, as a mistake in the + order of arguments is easily made. + */ + inline + LORInAxialAndSinogramCoordinates(const coordT z1, + const coordT z2, + const coordT phi, + const coordT s, + const coordT radius =1); + + inline + LORInAxialAndSinogramCoordinates(const LORInCylinderCoordinates&); + + inline + LORInAxialAndSinogramCoordinates(const LORInAxialAndNoArcCorrSinogramCoordinates&); + +#if __cplusplus>= 201103L + inline + LORInAxialAndSinogramCoordinates(const LORAs2Points&); +#endif + + virtual +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + self_type* +#else + LOR* +#endif + clone() const { return new self_type(*this); } + + void reset(coordT radius=1) + { + // set such that the new LOR does intersect that cylinder + _s=0; private_base_type::_radius=radius; + } + coordT radius() const { check_state(); return private_base_type::_radius; } + + inline + Succeeded + set_radius(const coordT new_radius) + { + if (private_base_type::_radius==new_radius) + return Succeeded::yes; + assert(new_radius>0); + if(fabs(s())>=new_radius) + return Succeeded::no; + this->set_radius_no_check(new_radius); + return Succeeded::yes; + } + + + virtual + Succeeded + change_representation(LORInCylinderCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndNoArcCorrSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + get_intersections_with_cylinder(LORAs2Points&, + const double radius) const; + + private: + coordT _phi; + coordT _s; + +}; + +/*! \ingroup LOR + \brief A class for LORs. + \warning This is all preliminary and likely to change. +*/ +template +class LORInAxialAndNoArcCorrSinogramCoordinates + : public LOR, private LORCylindricalCoordinates_z_and_radius +{ + private: + typedef LORInAxialAndNoArcCorrSinogramCoordinates self_type; + typedef LORCylindricalCoordinates_z_and_radius private_base_type; + + // sorry: has to be first to give the compiler a better chance of inlining + void check_state() const + { + assert(private_base_type::_radius>0); + assert(_beta>=static_cast(-_PI/2)); + assert(_beta(_PI/2)); + assert(_phi(_PI)); + assert(_phi>=0); + } + public: + coordT z1() const { check_state(); return private_base_type::z1(); } + coordT& z1() { check_state(); return private_base_type::z1(); } + coordT z2() const { check_state(); return private_base_type::z2(); } + coordT& z2() { check_state(); return private_base_type::z2(); } + coordT phi() const { check_state(); return _phi; } + coordT& phi() { check_state(); return _phi; } + coordT beta() const { check_state(); return _beta; } + coordT& beta() { check_state(); return _beta; } + + coordT s() const { check_state(); return private_base_type::_radius*sin(_beta); } + + void reset(coordT radius=1) + { + // set such that the new LOR does intersect that cylinder + _beta=0; private_base_type::_radius=radius; + } + coordT radius() const { check_state(); return private_base_type::_radius; } + + inline + Succeeded + set_radius(const coordT new_radius) + { + if (private_base_type::_radius==new_radius) + return Succeeded::yes; + assert(new_radius>0); + if(fabs(s())>=new_radius) + return Succeeded::no; + this->set_radius_no_check(new_radius); + return Succeeded::yes; + } + + inline explicit + LORInAxialAndNoArcCorrSinogramCoordinates(const coordT radius = 1); + + //! Constructor from explicit arguments + /*! \warning + It's a bad idea to use this constructor, as a mistake in the + order of arguments is easily made. + */ + inline + LORInAxialAndNoArcCorrSinogramCoordinates(const coordT z1, + const coordT z2, + const coordT phi, + const coordT beta, + const coordT radius =1); + + inline + LORInAxialAndNoArcCorrSinogramCoordinates(const LORInCylinderCoordinates&); + + inline + LORInAxialAndNoArcCorrSinogramCoordinates(const LORInAxialAndSinogramCoordinates&); + +#if __cplusplus>= 201103L + inline + LORInAxialAndNoArcCorrSinogramCoordinates(const LORAs2Points&); +#endif + + virtual +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + self_type* +#else + LOR* +#endif + clone() const { return new self_type(*this); } + + virtual + Succeeded + change_representation(LORInCylinderCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndNoArcCorrSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + change_representation(LORInAxialAndSinogramCoordinates&, + const double radius) const; + virtual + Succeeded + get_intersections_with_cylinder(LORAs2Points&, + const double radius) const; + + private: + coordT _phi; + coordT _beta; +}; + +/*! \ingroup LOR + \brief Given an LOR, find its intersection with a (infintely long) cylinder + \warning This is all preliminary and likely to change. +*/ + +template +inline Succeeded +find_LOR_intersections_with_cylinder(LORInCylinderCoordinates&, + const LORAs2Points&, + const double radius); +/*! \ingroup LOR + \brief Given an LOR, find its intersection with a (infintely long) cylinder + \warning This is all preliminary and likely to change. +*/ +template +inline Succeeded +find_LOR_intersections_with_cylinder(LORAs2Points& intersection_coords, + const LORAs2Points& coords, + const double radius); +/*! \ingroup LOR + \brief Given an LOR, find its intersection with a (infintely long) cylinder + \warning This is all preliminary and likely to change. +*/ +template +inline Succeeded +find_LOR_intersections_with_cylinder(LORInAxialAndNoArcCorrSinogramCoordinates& lor, + const LORAs2Points& cart_coords, + const double radius); + +/*! \ingroup LOR + \brief Given an LOR, find its intersection with a (infintely long) cylinder + \warning This is all preliminary and likely to change. +*/ +template +inline Succeeded +find_LOR_intersections_with_cylinder(LORInAxialAndSinogramCoordinates& lor, + const LORAs2Points& cart_coords, + const double radius); + +END_NAMESPACE_STIR + +#include "stir/LORCoordinates.inl" + +#endif + diff --git a/src/include/stir/LORCoordinates.inl b/src/include/stir/LORCoordinates.inl new file mode 100644 index 0000000000..6c84a0947d --- /dev/null +++ b/src/include/stir/LORCoordinates.inl @@ -0,0 +1,499 @@ +// +// + +/*! + \file + \ingroup LOR + \brief Implementations for LORCoordinates.h + \warning This is all preliminary and likely to change. + \author Kris Thielemans + + +*/ +/* + Copyright (C) 2004- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/modulo.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +/******************************************************************** + The simple and boring constructors +********************************************************************/ +template +PointOnCylinder:: +PointOnCylinder() + :_psi(0) // set to value to avoid assert +{} + +template +PointOnCylinder:: +PointOnCylinder(const coordT z, const coordT psi) + : _z(z), _psi(psi) +{} + +template +LORInCylinderCoordinates:: +LORInCylinderCoordinates(const coordT radius) + : _radius(radius) +{} + +template +LORInCylinderCoordinates:: +LORInCylinderCoordinates(const PointOnCylinder& p1, + const PointOnCylinder& p2, + const coordT radius) + : _p1(p1), _p2(p2), _radius(radius) +{} + +template +LORAs2Points:: +LORAs2Points() +{} + +template +LORAs2Points:: +LORAs2Points(const CartesianCoordinate3D& p1, + const CartesianCoordinate3D& p2) + : _p1(p1), _p2(p2) +{} + +template +LORInAxialAndSinogramCoordinates:: +LORInAxialAndSinogramCoordinates(const coordT radius) + : LORCylindricalCoordinates_z_and_radius(radius), + _phi(0),_s(0) // set _phi,_s to value to avoid assert +{ + check_state(); +} + +template +LORInAxialAndSinogramCoordinates:: +LORInAxialAndSinogramCoordinates(const coordT z1, + const coordT z2, + const coordT phi, + const coordT s, + const coordT radius) + : + LORCylindricalCoordinates_z_and_radius(z1, z2, radius), + _phi(phi), _s(s) +{ + check_state(); +} + +template +LORInAxialAndNoArcCorrSinogramCoordinates:: +LORInAxialAndNoArcCorrSinogramCoordinates(const coordT radius) + : LORCylindricalCoordinates_z_and_radius(radius), + _phi(0),_beta(0) // set _phi,_beta to value to avoid assert + +{ + check_state(); +} + +template +LORInAxialAndNoArcCorrSinogramCoordinates:: +LORInAxialAndNoArcCorrSinogramCoordinates(const coordT z1, + const coordT z2, + const coordT phi, + const coordT beta, + const coordT radius) + : LORCylindricalCoordinates_z_and_radius(z1, z2, radius), + _phi(phi), _beta(beta) + +{ + check_state(); +} + +/******************************************************************** + more constructors + These convert from one class to another +********************************************************************/ +template +LORInCylinderCoordinates:: +LORInCylinderCoordinates(const LORInAxialAndNoArcCorrSinogramCoordinates& na_coords) + : _radius (na_coords.radius()) +{ + _p1.z() = na_coords.z1(); + _p2.z() = na_coords.z2(); + _p1.psi() = to_0_2pi(na_coords.phi() + na_coords.beta()); + _p2.psi() = to_0_2pi(na_coords.phi() - na_coords.beta() + static_cast(_PI)); + check_state(); +} + +template +LORInCylinderCoordinates:: +LORInCylinderCoordinates(const LORInAxialAndSinogramCoordinates& coords) + : _radius (coords.radius()) +{ + _p1.z() = coords.z1(); + _p2.z() = coords.z2(); + _p1.psi() = to_0_2pi(coords.phi() + coords.beta()); + _p2.psi() = to_0_2pi(coords.phi() - coords.beta() + static_cast(_PI)); + check_state(); +} + +template +static inline void +get_sino_coords( coordT& _z1, + coordT& _z2, + coordT& _phi, + coordT& _beta, + const LORInCylinderCoordinates& cyl_coords) +{ + _beta = to_0_2pi((cyl_coords.p1().psi() - cyl_coords.p2().psi() + static_cast(_PI))/2); + if (_beta>_PI) + _beta -= static_cast(2*_PI); + _phi = to_0_2pi((cyl_coords.p1().psi() + cyl_coords.p2().psi() - static_cast( _PI))/2); + + /* beta is now between -Pi and Pi, phi between 0 and 2Pi + Now bring into standard range and set z accordingly */ + if (_phi < static_cast(_PI)) + { + if (_beta >= static_cast(_PI)/2) + { + _beta = static_cast(_PI) - _beta; + _z2 = cyl_coords.p1().z(); + _z1 = cyl_coords.p2().z(); + } + else if (_beta < -static_cast(_PI)/2) + { + _beta = -static_cast(_PI) - _beta; + _z2 = cyl_coords.p1().z(); + _z1 = cyl_coords.p2().z(); + } + else + + { + _z1 = cyl_coords.p1().z(); + _z2 = cyl_coords.p2().z(); + } + } + else + { + _phi -= static_cast(_PI); + assert(_phi>=0); + if (_beta >= static_cast(_PI)/2) + { + _beta -= static_cast(_PI); + _z1 = cyl_coords.p1().z(); + _z2 = cyl_coords.p2().z(); + } + else if (_beta < -static_cast(_PI)/2) + { + _beta += static_cast(_PI); + _z1 = cyl_coords.p1().z(); + _z2 = cyl_coords.p2().z(); + } + else + { + _beta *= -1; + _z2 = cyl_coords.p1().z(); + _z1 = cyl_coords.p2().z(); + } + } + assert(_phi>=0); + assert(_phi<=_PI); + assert(_beta>=-_PI/2); + assert(_beta<=_PI/2); +} + +template +LORInAxialAndNoArcCorrSinogramCoordinates:: +LORInAxialAndNoArcCorrSinogramCoordinates(const LORInCylinderCoordinates& cyl_coords) + : LORCylindricalCoordinates_z_and_radius(cyl_coords.radius()) +{ +#ifndef NDEBUG + // set these to prevent assert breaking in check_state() + _phi=0; + _beta=0; +#endif + get_sino_coords(z1(), z2(), _phi, _beta, + cyl_coords); + check_state(); +} + +template +LORInAxialAndSinogramCoordinates:: +LORInAxialAndSinogramCoordinates(const LORInCylinderCoordinates& cyl_coords) + : LORCylindricalCoordinates_z_and_radius(cyl_coords.radius()) +{ + coordT beta; +#ifndef NDEBUG + // set these to prevent assert breaking in check_state() + _phi=0; + _s=0; +#endif + get_sino_coords(z1(), z2(), _phi, beta, + cyl_coords); + _s = this->_radius*sin(beta); + check_state(); +} + +template +LORInAxialAndSinogramCoordinates:: +LORInAxialAndSinogramCoordinates(const LORInAxialAndNoArcCorrSinogramCoordinates& coords) + : LORCylindricalCoordinates_z_and_radius(coords.z1(), coords.z2(), coords.radius()), + _phi(coords.phi()), + _s(coords.s()) +{ + check_state(); +} + +template +LORInAxialAndNoArcCorrSinogramCoordinates:: +LORInAxialAndNoArcCorrSinogramCoordinates(const LORInAxialAndSinogramCoordinates& coords) + : LORCylindricalCoordinates_z_and_radius(coords.z1(), coords.z2(), coords.radius()), + _phi(coords.phi()), + _beta(coords.beta()) +{ + check_state(); +} + +#if __cplusplus>= 201103L +template +LORInAxialAndSinogramCoordinates:: +LORInAxialAndSinogramCoordinates(const LORAs2Points& coords) + : LORInAxialAndSinogramCoordinates(LORInCylinderCoordinates(coords)) +{} + +template +LORInAxialAndNoArcCorrSinogramCoordinates:: +LORInAxialAndNoArcCorrSinogramCoordinates(const LORAs2Points& coords) + : LORInAxialAndNoArcCorrSinogramCoordinates(LORInCylinderCoordinates(coords)) +{} +#endif + +template +LORAs2Points:: +LORAs2Points(const LORInCylinderCoordinates& cyl_coords) +{ + // make sure the return values are in STIR coordinates + p1().z() = cyl_coords.p1().z(); + p1().y() = -cyl_coords.radius()*cos(cyl_coords.p1().psi()); + p1().x() = cyl_coords.radius()*sin(cyl_coords.p1().psi()); + + p2().z() = cyl_coords.p2().z(); + p2().y() = -cyl_coords.radius()*cos(cyl_coords.p2().psi()); + p2().x() = cyl_coords.radius()*sin(cyl_coords.p2().psi()); +} + +template +LORAs2Points:: +LORAs2Points(const LORInAxialAndSinogramCoordinates& coords) +{ + *this = LORInCylinderCoordinates(coords); +} + +template +LORAs2Points:: +LORAs2Points(const LORInAxialAndNoArcCorrSinogramCoordinates& coords) +{ + *this = LORInCylinderCoordinates(coords); +} + + +template +Succeeded +find_LOR_intersections_with_cylinder(LORAs2Points& intersection_coords, + const LORAs2Points& coords, + const double radius) +{ + const CartesianCoordinate3D& c1 = coords.p1(); + const CartesianCoordinate3D& c2 = coords.p2(); + + const CartesianCoordinate3D d = c2 - c1; + /* parametrisation of LOR is + c = l*d+c1 + l has to be such that c.x^2 + c.y^2 = R^2 + i.e. + (l*d.x+c1.x)^2+(l*d.y+c1.y)^2==R^2 + l^2*(d.x^2+d.y^2) + 2*l*(d.x*c1.x + d.y*c1.y) + c1.x^2+c2.y^2-R^2==0 + write as a*l^2+2*b*l+e==0 + l = (-b +- sqrt(b^2-a*e))/a + argument of sqrt simplifies to + R^2*(d.x^2+d.y^2)-(d.x*c1.y-d.y*c1.x)^2 + */ + const double dxy2 = (square(d.x())+square(d.y())); + const double argsqrt= + (square(radius)*dxy2-square(d.x()*c1.y()-d.y()*c1.x())); + if (argsqrt<=0) + return Succeeded::no; // LOR is outside detector radius + const coordT2 root = static_cast(sqrt(argsqrt)); + + const coordT2 l1 = static_cast((- (d.x()*c1.x() + d.y()*c1.y())+root)/dxy2); + const coordT2 l2 = static_cast((- (d.x()*c1.x() + d.y()*c1.y())-root)/dxy2); + // TODO won't work when coordT1!=coordT2 + intersection_coords.p1() = d*l1 + c1; + intersection_coords.p2() = d*l2 + c1; + assert(fabs(square(intersection_coords.p1().x())+square(intersection_coords.p1().y()) + - square(radius)) + +Succeeded +find_LOR_intersections_with_cylinder(LORInCylinderCoordinates& cyl_coords, + const LORAs2Points& cart_coords, + const double radius) +{ + LORAs2Points intersection_coords; + if (find_LOR_intersections_with_cylinder(intersection_coords, cart_coords, radius) + == Succeeded::no) + return Succeeded::no; + + const CartesianCoordinate3D& c1 = intersection_coords.p1(); + const CartesianCoordinate3D& c2 = intersection_coords.p2(); + cyl_coords.reset(static_cast(radius)); + + cyl_coords.p1().psi() = + from_min_pi_plus_pi_to_0_2pi(static_cast(atan2(c1.x(),-c1.y()))); + cyl_coords.p2().psi() = + from_min_pi_plus_pi_to_0_2pi(static_cast(atan2(c2.x(),-c2.y()))); + cyl_coords.p1().z() = + static_cast(c1.z()); + cyl_coords.p2().z() = + static_cast(c2.z()); + + return Succeeded::yes; +} + +template +Succeeded +find_LOR_intersections_with_cylinder(LORInAxialAndNoArcCorrSinogramCoordinates& lor, + const LORAs2Points& cart_coords, + const double radius) +{ + LORInCylinderCoordinates cyl_coords; + if (find_LOR_intersections_with_cylinder(cyl_coords, cart_coords, radius) + == Succeeded::no) + return Succeeded::no; + lor = cyl_coords; + return Succeeded::yes; +} + + +template +Succeeded +find_LOR_intersections_with_cylinder(LORInAxialAndSinogramCoordinates& lor, + const LORAs2Points& cart_coords, + const double radius) +{ + LORInCylinderCoordinates cyl_coords; + if (find_LOR_intersections_with_cylinder(cyl_coords, cart_coords, radius) + == Succeeded::no) + return Succeeded::no; + lor = cyl_coords; + return Succeeded::yes; +} + + +template +Succeeded +LORAs2Points:: +change_representation(LORInCylinderCoordinates& lor, + const double radius) const +{ + return find_LOR_intersections_with_cylinder(lor, *this, radius); +} + +template +Succeeded +LORAs2Points:: +change_representation(LORInAxialAndNoArcCorrSinogramCoordinates& lor, + const double radius) const +{ + return find_LOR_intersections_with_cylinder(lor, *this, radius); +} + +template +Succeeded +LORAs2Points:: +change_representation(LORInAxialAndSinogramCoordinates& lor, + const double radius) const +{ + return find_LOR_intersections_with_cylinder(lor, *this, radius); +} + +template +Succeeded +LORAs2Points:: +get_intersections_with_cylinder(LORAs2Points& lor, + const double radius) const +{ + return find_LOR_intersections_with_cylinder(lor, *this, radius); +} + +#define DEFINE_LOR_GET_FUNCTIONS(TYPE) \ +template \ +Succeeded \ +TYPE:: \ +change_representation(LORInCylinderCoordinates& lor, \ + const double radius) const \ +{ \ + lor = *this; \ + return lor.set_radius(static_cast(radius)); \ +} \ + \ +template \ +Succeeded \ +TYPE:: \ +change_representation(LORInAxialAndNoArcCorrSinogramCoordinates& lor, \ + const double radius) const \ +{ \ + lor = *this; \ + return lor.set_radius(static_cast(radius)); \ +} \ + \ +template \ +Succeeded \ +TYPE:: \ +change_representation(LORInAxialAndSinogramCoordinates& lor, \ + const double radius) const \ +{ \ + lor = *this; \ + return lor.set_radius(static_cast(radius)); \ +} \ + \ +template \ +Succeeded \ +TYPE:: \ +get_intersections_with_cylinder(LORAs2Points& lor, \ + const double radius) const \ +{ \ + self_type tmp = *this; \ + if (tmp.set_radius(static_cast(radius)) == Succeeded::no) \ + return Succeeded::no; \ + lor = tmp; \ + return Succeeded::yes; \ +} + +DEFINE_LOR_GET_FUNCTIONS(LORInCylinderCoordinates) +DEFINE_LOR_GET_FUNCTIONS(LORInAxialAndNoArcCorrSinogramCoordinates) +DEFINE_LOR_GET_FUNCTIONS(LORInAxialAndSinogramCoordinates) + +#undef DEFINE_LOR_GET_FUNCTIONS + + + + +END_NAMESPACE_STIR diff --git a/src/include/stir/MaximalArrayFilter3D.h b/src/include/stir/MaximalArrayFilter3D.h new file mode 100644 index 0000000000..c313d6a395 --- /dev/null +++ b/src/include/stir/MaximalArrayFilter3D.h @@ -0,0 +1,82 @@ +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + Copyright (C) 2010 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup Array + \brief Applies the dilation filter (i.e. voxel=max(neighbours)) + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#ifndef __stir_MaximalArrayFilter3D_H__ +#define __stir_MaximalArrayFilter3D_H__ + +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" + + +START_NAMESPACE_STIR + +template class Coordinate3D; + +/*! + \ingroup Array + \brief Implements erosion on 3D arrays. + + The minimum value for a 1D array of 2n+1 elements is defined as the minimum element + of the sorted array. + + For 3D images, the current filter works by extracting all neigbours (given by + the mask) to a 1D array, and getting the maximal of that array. + + This implementation of the maximal filter handles edges by taking the minimum of + all available pixels. For instance, when a 3x3 mask is used, and the + pixel-to-be-filtered is at the left edge, there will be only 6 pixels in the + mask (instead of 9). + + \todo Currently, the mask is determined in terms of the mask radius (in pixels), where + size = 2*radius+1. This could easily be relaxed. + \todo generalise to n-dimensions + */ +template +class MaximalArrayFilter3D: public ArrayFunctionObject_2ArgumentImplementation<3,elemT> +{ + public: + explicit MaximalArrayFilter3D (const Coordinate3D& mask_radius); + MaximalArrayFilter3D (); + bool is_trivial() const; + + private: + int mask_radius_x; + int mask_radius_y; + int mask_radius_z; + + virtual void do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const; + + //! extract all neighbours and put them in a 1D array + /*! \return the number of neighbours within the image range + */ + int extract_neighbours(Array<1,elemT>&,const Array<3,elemT>& array, const Coordinate3D&) const; + +}; + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/MaximalImageFilter3D.h b/src/include/stir/MaximalImageFilter3D.h new file mode 100644 index 0000000000..daeadd88fb --- /dev/null +++ b/src/include/stir/MaximalImageFilter3D.h @@ -0,0 +1,94 @@ +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + Copyright (C) 2010 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup ImageProcessor + \brief Implementations for class stir::MaximalImageFilter3D + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#ifndef __stir_MaximalImageFilter3D_H__ +#define __stir_MaximalImageFilter3D_H__ + + +#include "stir/DataProcessor.h" +#include "stir/MaximalArrayFilter3D.h" +#include "stir/DiscretisedDensity.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +template class CartesianCoordinate3D; + + + +/*! + \ingroup ImageProcessor + \brief A class in the ImageProcessor hierarchy that implements maximal + filtering. + + As it is derived from RegisteredParsingObject, it implements all the + necessary things to parse parameter files etc. + */ +template +class MaximalImageFilter3D: + public + RegisteredParsingObject< + MaximalImageFilter3D, + DataProcessor >, + DataProcessor > + > +{ + private: + typedef + RegisteredParsingObject< + MaximalImageFilter3D, + DataProcessor >, + DataProcessor > + > + base_type; +public: + static const char * const registered_name; + + MaximalImageFilter3D(); + + MaximalImageFilter3D(const CartesianCoordinate3D& mask_radius); + +private: + MaximalArrayFilter3D maximal_filter; + int mask_radius_x; + int mask_radius_y; + int mask_radius_z; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + + Succeeded virtual_set_up (const DiscretisedDensity< 3,elemT>& density); + void virtual_apply(DiscretisedDensity<3,elemT>& density, const DiscretisedDensity<3,elemT>& in_density) const; + void virtual_apply(DiscretisedDensity<3,elemT>& density) const; +}; + + +END_NAMESPACE_STIR + + +#endif // MaximalImageFilter3D diff --git a/src/include/stir/MedianArrayFilter3D.h b/src/include/stir/MedianArrayFilter3D.h new file mode 100644 index 0000000000..7c3b9ed75f --- /dev/null +++ b/src/include/stir/MedianArrayFilter3D.h @@ -0,0 +1,87 @@ +// +// +/*! + + \file + \ingroup Array + \brief Declaration of class stir::MedianArrayFilter3D + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_MedianArrayFilter3D_H__ +#define __stir_MedianArrayFilter3D_H__ + +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" + + +START_NAMESPACE_STIR + +template class Coordinate3D; + +/*! + \ingroup Array + \brief Implements median filtering on 3D arrays. + + The median for a 1D array of 2n+1 elements is defined as the nth element + of the sorted array. For 2n elements, we use (sorted[n-1]+sorted[n])/2 + (starting indices from 0). + + For 3D images, the current filter works by extracting all neigbours (given by + the mask) to a 1D array, and getting the median of that array. + + This implementation of the median filter handles edges by taking a median of + all available pixels. For instance, when a 3x3 mask is used, and the + pixel-to-be-filtered is at the left edge, there will be only 6 pixels in the + mask (instead of 9). + + \todo Currently, the mask is determined in terms of the mask radius (in pixels), where + size = 2*radius+1. This could easily be relaxed. + \todo generalise to n-dimensions + */ +template +class MedianArrayFilter3D: public ArrayFunctionObject_2ArgumentImplementation<3,elemT> +{ +public: + explicit MedianArrayFilter3D (const Coordinate3D& mask_radius); + MedianArrayFilter3D (); + bool is_trivial() const; + +private: + int mask_radius_x; + int mask_radius_y; + int mask_radius_z; + + virtual void do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const; + + //! extract all neighbours and put them in a 1D array + /*! \return the number of neighbours within the image range + */ + int extract_neighbours(Array<1,elemT>&,const Array<3,elemT>& array, const Coordinate3D&) const; + +}; + +END_NAMESPACE_STIR + +#endif + + + diff --git a/src/include/stir/MedianImageFilter3D.h b/src/include/stir/MedianImageFilter3D.h new file mode 100644 index 0000000000..d361c521a9 --- /dev/null +++ b/src/include/stir/MedianImageFilter3D.h @@ -0,0 +1,96 @@ +// +// +/*! + + \file + \ingroup ImageProcessor + \brief Declaration of class stir::MedianImageFilter3D.h + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_MedianImageFilter3D_H__ +#define __stir_MedianImageFilter3D_H__ + + +#include "stir/DataProcessor.h" +#include "stir/MedianArrayFilter3D.h" +#include "stir/DiscretisedDensity.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +template class CartesianCoordinate3D; + + + +/*! + \ingroup ImageProcessor + \brief A class in the ImageProcessor hierarchy that implements median + filtering. + + As it is derived from RegisteredParsingObject, it implements all the + necessary things to parse parameter files etc. + */ +template +class MedianImageFilter3D: + public + RegisteredParsingObject< + MedianImageFilter3D, + DataProcessor >, + DataProcessor > + > +{ + private: + typedef + RegisteredParsingObject< + MedianImageFilter3D, + DataProcessor >, + DataProcessor > + > + base_type; +public: + static const char * const registered_name; + + MedianImageFilter3D(); + + MedianImageFilter3D(const CartesianCoordinate3D& mask_radius); + +private: + MedianArrayFilter3D median_filter; + int mask_radius_x; + int mask_radius_y; + int mask_radius_z; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + + Succeeded virtual_set_up (const DiscretisedDensity< 3,elemT>& density); + void virtual_apply(DiscretisedDensity<3,elemT>& density, const DiscretisedDensity<3,elemT>& in_density) const; + void virtual_apply(DiscretisedDensity<3,elemT>& density) const; +}; + + +END_NAMESPACE_STIR + + +#endif // MedianImageFilter3D diff --git a/src/include/stir/MinimalArrayFilter3D.h b/src/include/stir/MinimalArrayFilter3D.h new file mode 100644 index 0000000000..e8f633d1e0 --- /dev/null +++ b/src/include/stir/MinimalArrayFilter3D.h @@ -0,0 +1,83 @@ +// +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief Applies the erosion filter (i.e. voxel=min(neighbours)) + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_MinimalArrayFilter3D_H__ +#define __stir_MinimalArrayFilter3D_H__ + +#include "stir/ArrayFunctionObject_2ArgumentImplementation.h" + + +START_NAMESPACE_STIR + +template class Coordinate3D; + +/*! + \ingroup Array + \brief Implements erosion on 3D arrays. + + The minimum value for a 1D array of 2n+1 elements is defined as the minimum element + of the sorted array. + + For 3D images, the current filter works by extracting all neigbours (given by + the mask) to a 1D array, and getting the minimal of that array. + + This implementation of the minimal filter handles edges by taking the minimum of + all available pixels. For instance, when a 3x3 mask is used, and the + pixel-to-be-filtered is at the left edge, there will be only 6 pixels in the + mask (instead of 9). + + \todo Currently, the mask is determined in terms of the mask radius (in pixels), where + size = 2*radius+1. This could easily be relaxed. + \todo generalise to n-dimensions + */ +template +class MinimalArrayFilter3D: public ArrayFunctionObject_2ArgumentImplementation<3,elemT> +{ +public: + explicit MinimalArrayFilter3D (const Coordinate3D& mask_radius); + MinimalArrayFilter3D (); + bool is_trivial() const; + +private: + int mask_radius_x; + int mask_radius_y; + int mask_radius_z; + + virtual void do_it(Array<3,elemT>& out_array, const Array<3,elemT>& in_array) const; + + //! extract all neighbours and put them in a 1D array + /*! \return the number of neighbours within the image range + */ + int extract_neighbours(Array<1,elemT>&,const Array<3,elemT>& array, const Coordinate3D&) const; + +}; + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/MinimalImageFilter3D.h b/src/include/stir/MinimalImageFilter3D.h new file mode 100644 index 0000000000..02cea9b860 --- /dev/null +++ b/src/include/stir/MinimalImageFilter3D.h @@ -0,0 +1,95 @@ +// +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup ImageProcessor + \brief Implementations for class MinimalImageFilter3D + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_MinimalImageFilter3D_H__ +#define __stir_MinimalImageFilter3D_H__ + + +#include "stir/DataProcessor.h" +#include "stir/MinimalArrayFilter3D.h" +#include "stir/DiscretisedDensity.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +template class CartesianCoordinate3D; + + + +/*! + \ingroup ImageProcessor + \brief A class in the ImageProcessor hierarchy that implements minimal + filtering. + + As it is derived from RegisteredParsingObject, it implements all the + necessary things to parse parameter files etc. + */ +template +class MinimalImageFilter3D: + public + RegisteredParsingObject< + MinimalImageFilter3D, + DataProcessor >, + DataProcessor > + > +{ + private: + typedef + RegisteredParsingObject< + MinimalImageFilter3D, + DataProcessor >, + DataProcessor > + > + base_type; +public: + static const char * const registered_name; + + MinimalImageFilter3D(); + + MinimalImageFilter3D(const CartesianCoordinate3D& mask_radius); + +private: + MinimalArrayFilter3D minimal_filter; + int mask_radius_x; + int mask_radius_y; + int mask_radius_z; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + + Succeeded virtual_set_up (const DiscretisedDensity< 3,elemT>& density); + void virtual_apply(DiscretisedDensity<3,elemT>& density, const DiscretisedDensity<3,elemT>& in_density) const; + void virtual_apply(DiscretisedDensity<3,elemT>& density) const; +}; + + +END_NAMESPACE_STIR + + +#endif // MinimalImageFilter3D diff --git a/src/include/stir/MultipleProjData.h b/src/include/stir/MultipleProjData.h new file mode 100644 index 0000000000..c1fd2347c3 --- /dev/null +++ b/src/include/stir/MultipleProjData.h @@ -0,0 +1,129 @@ +/* + Copyright (C) 2005 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_MultipleProjData__H__ +#define __stir_MultipleProjData__H__ + +/*! + \file + \ingroup data_buildblock + \brief Declaration of class stir::MultipleProjData + \author Kris Thielemans +*/ +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +//#include "stir/Scanner.h" +#include + +START_NAMESPACE_STIR + +class MultipleProjData +{ +public: + + MultipleProjData() {}; + + MultipleProjData(const shared_ptr& exam_info_sptr) + : _exam_info_sptr(exam_info_sptr) + { + } + //! Get a pointer to the exam information + const ExamInfo* + get_exam_info_ptr() const + { + return this->_exam_info_sptr.get(); + } + + //! Get a shared pointer to the exam information + shared_ptr + get_exam_info_sptr() const + { + return this->_exam_info_sptr; + } + + unsigned + get_num_proj_data() const + { + return static_cast(this->_proj_datas.size()); + } + + + //! resize to new number of projection data + /*! This acts like std::vector::resize(), i.e. if the new size is smaller than the previous size, + the last elements are deleted. If the new size is larger than the previous size, the new + elements are assigned with null pointers. In the latter case, you need to use set_proj_data_sptr() + */ + void resize(const unsigned new_size) + { + this->_proj_datas.resize(new_size); + } + + //! set projection data for a particular index + /*! \arg proj_data_sptr projection data (already fully initialised) + \arg index number of the data (needs to be between 1 and get_num_proj_data()) + */ + void + set_proj_data_sptr(const shared_ptr& proj_data_sptr, + const unsigned int index); + /*! + \warning The index starts from 1 + */ + const ProjData & + operator[](const unsigned int index) const + { + assert(index>=1); + assert(index<= this->get_num_proj_data()); + return *this->_proj_datas[index-1]; + } + /*! + \warning The index starts from 1 + */ + const ProjData & + get_proj_data(const unsigned int index) const + { return (*this)[index]; } + + /*! + \warning The index starts from 1 + */ + shared_ptr + get_proj_data_sptr(const unsigned int index) const + { + assert(index>=1); + assert(index<= this->get_num_proj_data()); + return this->_proj_datas[index-1]; + } + + const ProjDataInfo * + get_proj_data_info_ptr() const; + // return get_proj_data_sptr(1))->get_proj_data_info_ptr() + + /*! \deprecated */ + unsigned int get_num_gates() const + { + return static_cast(_proj_datas.size()); + } + +protected: + std::vector > _proj_datas; + //shared_ptr _scanner_sptr; + protected: + shared_ptr _exam_info_sptr; +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/NestedIterator.h b/src/include/stir/NestedIterator.h new file mode 100644 index 0000000000..34c175e285 --- /dev/null +++ b/src/include/stir/NestedIterator.h @@ -0,0 +1,183 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_NestedIterator__H__ +#define __stir_NestedIterator__H__ + +/*! + \file + + \brief This file declares the stir::NestedIterator class and supporting function objects. + \ingroup buildblock + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + +*/ + +#include "stir/NestedIteratorHelpers.h" +#include "boost/iterator/iterator_traits.hpp" + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief Class NestedIterator implements a (forward) iterator using + a pair of 'nested' iterators. + + Suppose you have a container where each element is a container, e.g. + std::vector\ \> . Using NestedIterator, + you can iterate through the 'elements of the elements' (i.e. the + int's in the above example). + + The template argument \c GetRestRangeFunctionT should be a function object + that, given a top-level iterator, finds the first and last + iterators for the sub-sequence. It defaults to just using + \code + current_rest_iter = top_level_iter->begin(); + end_rest_iter = top_level_iter->end(); + \endcode + \see BeginEndFunction, PtrBeginEndFunction, ConstBeginEndFunction, ConstPtrBeginEndFunction, + BeginEndAllFunction, PtrBeginEndAllFunction, ConstBeginEndAllFunction, ConstPtrBeginEndAllFunction + + Syntax is somewhat awkward for technical reasons (see the source for + operator==). You have to give + the \c begin and \c end of the top-level iterators at construction time. + (This would be far more natural when using boost::range). + + \par examples + Here is an example using a vector of lists of integers. + \code + typedef std::list C2; + typedef std::vector C1; + C1 c; + typedef NestedIterator FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + while (fiter != fiter_end) + { ... } + \endcode + Here is an example using a vector of (smart) pointers to 2D arrays, where we want to + iterate over all elements of all 2D arrays. + \code + typedef Array<2,int> C2; + typedef std::vector > C1; + C1 c; + typedef NestedIterator > FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + while (fiter != fiter_end) + { ... } + \endcode + + \par Implementation note + + The 2nd template argument would really be better implemented + as a template template. However, some compilers still don't support this. + + \bug At present, \c iterator_category typedef is hard-wired to be + \c std::forward_iterator_tag. This would be incorrect if + \c topleveliterT or \c rest_iter_type is only an input or + output iterator. +*/ +template > +class NestedIterator +{ +private: + typedef typename GetRestRangeFunctionT::rest_iter_type rest_iter_type; +public: + typedef std::forward_iterator_tag iterator_category; + typedef typename boost::iterator_difference::type difference_type; + typedef typename boost::iterator_value::type value_type; + typedef typename boost::iterator_reference::type reference; + typedef typename boost::iterator_pointer::type pointer; + +public: + //! default constructor + inline NestedIterator(); + + //! constructor to initialise the members + inline NestedIterator(const topleveliterT& top_level_iter, + const topleveliterT& end_top_level_iter); + + //! constructor to convert between nested iterators using convertible top and next level iterators + /*! Ignore the 2nd and 3rd argument. They are there to let the compiler check if the types are + convertible (using the SFINAE principle). + */ + template + inline NestedIterator( + NestedIterator other, + typename boost::enable_if_convertible::type* = 0, + typename boost::enable_if_convertible::type* = 0) + : _current_top_level_iter(other._current_top_level_iter), + _end_top_level_iter(other._end_top_level_iter), + _current_rest_iter(other._current_rest_iter), + _end_rest_iter(other._end_rest_iter) + {} + + //inline NestedIterator& operator=(const NestedIterator&); + + //! prefix increment + inline NestedIterator& operator++(); + + //! postfix increment + inline NestedIterator operator++(int); + + //! test equality + inline bool operator==(const NestedIterator&) const; + //! test equality + inline bool operator!=(const NestedIterator&) const; + + //! dereferencing operator + inline reference operator*() const; + + //! member-selection operator + inline pointer operator->() const; + +#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS +public: +#else +private: + // needed for conversion constructor + template friend class NestedIterator; +#endif + + //! the \c topleveliterT iterator pointing to the current \a row + topleveliterT _current_top_level_iter; + + //! a \c topleveliterT iterator marking the end of the \a column + topleveliterT _end_top_level_iter; + + //! a \c rest_iter_type iterator pointing to the current \a element in the \a row + rest_iter_type _current_rest_iter; + + //! a \c rest_iter_type iterator pointing to the end of the current \a row + rest_iter_type _end_rest_iter; +private: + //! set the rest_iters to the range corresponding to a new \a top_level_iter + void _set_rest_iters_for_current_top_level_iter(); +}; + +END_NAMESPACE_STIR + +#include "stir/NestedIterator.inl" + +#endif diff --git a/src/include/stir/NestedIterator.inl b/src/include/stir/NestedIterator.inl new file mode 100644 index 0000000000..bc3ba01b8e --- /dev/null +++ b/src/include/stir/NestedIterator.inl @@ -0,0 +1,154 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup buildblock + \brief inline implementations for stir::NestedIterator. + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + +*/ + +START_NAMESPACE_STIR + +template +NestedIterator:: +NestedIterator() +{} + +#if defined __GNUC__ +// Attempt to switch off warning about unitialised _current_rest_iter +// as this is only initialised/used if the top_level_iter specifies a valid range +// Unfortunately, the relevant pragma only exists from gcc 4.6 +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#endif +#endif +template +void +NestedIterator:: +_set_rest_iters_for_current_top_level_iter() +{ + if (this->_current_top_level_iter != this->_end_top_level_iter) + { + this->_current_rest_iter = + GetRestRangeFunctionT().begin(this->_current_top_level_iter); + this->_end_rest_iter = + GetRestRangeFunctionT().end(this->_current_top_level_iter); + } +} +#if defined __GNUC__ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic pop +#endif +#endif + +template +NestedIterator:: +NestedIterator(const topleveliterT& top_level_iter, + const topleveliterT& end_top_level_iter) + : _current_top_level_iter(top_level_iter), + _end_top_level_iter(end_top_level_iter) +{ + this->_set_rest_iters_for_current_top_level_iter(); +} + +template +bool +NestedIterator:: +operator==(const NestedIterator& iter2) const +{ + return + this->_current_top_level_iter == iter2._current_top_level_iter && + ( this->_current_top_level_iter == this->_end_top_level_iter || + this->_current_rest_iter == iter2._current_rest_iter); + /* + alternative: + comparing rest_iter is only necessary when the first iterator is not at the end. + This probably doesn't matter too much though as usually we are comparing with + end_all(), in which case the top_level_iters will only be equal when we are + at the end. So, the extra test would only occurs once in the loop over the whole + sequence. + + A (possibly sligthly faster) implementation would be: + + _current_top_level_iter == iter2._current_top_level_iter && + _current_rest_iter == iter2._current_rest_iter; + + However, the above relies on the fact that incrementing the iterator + ends up exactly in end_all(). This seems tricky to implement in general. + */ +} +template +bool +NestedIterator:: +operator!=(const NestedIterator& iter2) const +{ + return !(*this == iter2); +} + +template +NestedIterator& +NestedIterator:: +operator++() +{ + // TODO can only do assert for random-access iterators + // assert(this->_current_top_level_iter < this->_end_top_level_iter); + ++this->_current_rest_iter; + if (this->_current_rest_iter == this->_end_rest_iter) + { + // advance the top-level iterator and reset rest_iters + ++this->_current_top_level_iter; + this->_set_rest_iters_for_current_top_level_iter(); + } + return *this; +} + +template +NestedIterator +NestedIterator::operator++(int) +{ + const NestedIterator was = *this; + ++(*this); + return was; +} + + +template +typename NestedIterator::reference +NestedIterator:: +operator*() const +{ + return *this->_current_rest_iter; +} + +template +typename NestedIterator::pointer +NestedIterator:: +operator->() const +{ + return &(this->operator*()); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/NestedIteratorHelpers.h b/src/include/stir/NestedIteratorHelpers.h new file mode 100644 index 0000000000..503ce05c94 --- /dev/null +++ b/src/include/stir/NestedIteratorHelpers.h @@ -0,0 +1,291 @@ +// +// +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_NestedIteratorHelpers__H__ +#define __stir_NestedIteratorHelpers__H__ + +/*! + \file + + \brief This file defines supporting function objects for stir::NestedIterator. + \ingroup buildblock + + \author Kris Thielemans + +*/ + +#include "stir/common.h" +#include "boost/iterator/iterator_traits.hpp" +#include "boost/pointee.hpp" + + +START_NAMESPACE_STIR + +/*! \name Function objects that can be used for NestedIterator. + \ingroup buildblock +*/ +//@{ +#if 0 +// This is the original implementation, which works but contains a lot of code repetition. +// It's superseded by the implementation below, but that might need a recent compiler, so +// I've kept this old version in the file for now, but it is disabled. +template +class BeginEndFunction +{ + typedef typename boost::iterator_value::type iter_value_type; + public: + typedef typename iter_value_type::iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return iter->begin(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return iter->end(); } +}; + +template +class ConstBeginEndFunction +{ + typedef typename boost::iterator_value::type iter_value_type; + public: + typedef typename iter_value_type::const_iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return iter->begin(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return iter->end(); } +}; + +template +class BeginEndAllFunction +{ + typedef typename boost::iterator_value::type iter_value_type; + public: + typedef typename iter_value_type::full_iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return iter->begin_all(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return iter->end_all(); } +}; + +template +class ConstBeginEndAllFunction +{ + typedef typename boost::iterator_value::type iter_value_type; + public: + typedef typename iter_value_type::const_full_iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return iter->begin_all_const(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return iter->end_all_const(); } +}; + +template +class PtrBeginEndFunction +{ + typedef typename boost::pointee::type>::type iter_value_type; + public: + typedef typename iter_value_type::iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return (**iter).begin(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return (**iter).end(); } +}; + +template +class ConstPtrBeginEndFunction +{ + typedef typename boost::pointee::type>::type iter_value_type; + public: + typedef typename iter_value_type::const_iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return (**iter).begin(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return (**iter).end(); } +}; + +template +class PtrBeginEndAllFunction +{ + typedef typename boost::pointee::type>::type iter_value_type; + public: + typedef typename iter_value_type::full_iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return (**iter).begin_all(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return (**iter).end_all(); } +}; + +template +class ConstPtrBeginEndAllFunction +{ + typedef typename boost::pointee::type>::type iter_value_type; + public: + typedef typename iter_value_type::const_full_iterator rest_iter_type; + + rest_iter_type begin(const TopLevelIterT& iter) const + { return (**iter).begin_all_const(); } + rest_iter_type end(const TopLevelIterT& iter) const + { return (**iter).end_all_const(); } +}; + +#else + +// new implementation + + +//! Helper class for NestedIterator when the 1st level iterator refers to an ordinary iterator for the 2nd level iterator +/*! \param TopLevelIterT type of the top-level iterator to be used for NestedIterator. + \param RestIterT type of the 2nd level iter. + + This class can be used for the case where the 2nd level iterators can be obtained by using \c top_level_iter.begin() etc, + e.g. for \c std::vector > + + The default for \c RestIterT is suitable for most cases, as it finds \c RestIterT from the iterator traits + of \c TopLevelIterT. +*/ +template ::type::iterator> +class BeginEndFunction +{ +public: + //! typedef storing the type of the 2nd level iterator + typedef RestIterT rest_iter_type; + //! function to get the first 2nd level iterator for a top-level iterator + /*! returns \c (*iter).begin() */ + inline RestIterT begin(const TopLevelIterT& iter) const + { return iter->begin(); } + //! function to get the "end" 2nd level iterator for a top-level iterator + inline RestIterT end(const TopLevelIterT& iter) const + { return iter->end(); } +}; + +//! Helper class for NestedIterator when the 1st level iterator refers to pointers to an ordinary iterator for the 2nd level iterator +/*! \param TopLevelIterT type of the top-level iterator to be used for NestedIterator. + \param RestIterT type of the 2nd level iter. + + This class can be used for the case where the 2nd level iterators can be obtained by using \c top_level_iter->begin() etc, + e.g. for \c std::vector *> or std::vector > >. + + The default for \c RestIterT is suitable for most cases, as it finds \c RestIterT from the iterator traits + of \c TopLevelIterT. + + \see BeginEndFunction +*/ +template ::type>::type::iterator> +class PtrBeginEndFunction +{ +public: + typedef RestIterT rest_iter_type; + //! function to get the first 2nd level iterator for a top-level iterator + /*! returns \c (**iter).begin() */ + inline RestIterT begin(const TopLevelIterT& iter) const + { return (**iter).begin(); } + //! function to get the "end" 2nd level iterator for a top-level iterator + inline RestIterT end(const TopLevelIterT& iter) const + { return (**iter).end(); } +}; + +//! Helper class for NestedIterator when the 1st level iterator refers to a stir full iterator for the 2nd level iterator +/*! \param TopLevelIterT type of the top-level iterator to be used for NestedIterator. + \param RestIterT type of the 2nd level iter. + + This class can be used for the case where the 2nd level iterators can be obtained by using \c top_level_iter.begin_all() etc, + e.g. for \c std::vector > + + The default for \c RestIterT is suitable for most cases, as it finds \c RestIterT from the iterator traits + of \c TopLevelIterT. + + \see BeginEndFunction +*/ +template ::type::full_iterator> +class BeginEndAllFunction +{ +public: + typedef RestIterT rest_iter_type; + inline RestIterT begin(const TopLevelIterT& iter) const + { return iter->begin_all(); } + inline RestIterT end(const TopLevelIterT& iter) const + { return iter->end_all(); } +}; + +//! Helper class for NestedIterator when the 1st level iterator refers to a pointer to a stir full iterator for the 2nd level iterator +/*! \param TopLevelIterT type of the top-level iterator to be used for NestedIterator. + \param RestIterT type of the 2nd level iter. + + This class can be used for the case where the 2nd level iterators can be obtained by using \c top_level_iter->begin_all() etc, + e.g. for \c std::vector * > or std::vector > >. + + The default for \c RestIterT is suitable for most cases, as it finds \c RestIterT from the iterator traits + of \c TopLevelIterT. + + \see BeginEndFunction, BeginEndAllFunction +*/ +template ::type>::type::full_iterator> +class PtrBeginEndAllFunction +{ +public: + typedef RestIterT rest_iter_type; + inline RestIterT begin(const TopLevelIterT& iter) const + { return (**iter).begin_all(); } + inline RestIterT end(const TopLevelIterT& iter) const + { return (**iter).end_all(); } +}; + +//! Convenience class where the 2nd level iterator is a \c const_iterator +/*! This class just changes the default of BeginEndFunction. */ +template ::type::const_iterator> +class ConstBeginEndFunction + : public BeginEndFunction +{}; + +//! Convenience class where the 2nd level iterator is a \c const_full_iterator +/*! This class just changes the default of BeginEndAllFunction. */ +template ::type::const_full_iterator> +class ConstBeginEndAllFunction + : public BeginEndAllFunction +{}; + +//! Convenience class where the 2nd level iterator is a \c const_iterator +/*! This class just changes the default of PtrBeginEndFunction. */ +template +class ConstPtrBeginEndFunction + : public PtrBeginEndFunction::type>::type::const_iterator> +{}; + +//! Convenience class where the 2nd level iterator is a \c const_full_iterator +template +class ConstPtrBeginEndAllFunction + : public PtrBeginEndAllFunction::type>::type::const_full_iterator> +{}; + +#endif // #if between old and new implementation + +//@} + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/NonseparableConvolutionUsingRealDFTImageFilter.h b/src/include/stir/NonseparableConvolutionUsingRealDFTImageFilter.h new file mode 100644 index 0000000000..1962b48efe --- /dev/null +++ b/src/include/stir/NonseparableConvolutionUsingRealDFTImageFilter.h @@ -0,0 +1,135 @@ +// +// +/* + Copyright (C) 2007- 2007, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup ImageProcessor + \brief Declaration of class NonseparableConvolutionUsingRealDFTImageFilter + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + + +#ifndef __stir_NonseparableConvolutionUsingRealDFTImageFilter_H__ +#define __stir_NonseparableConvolutionUsingRealDFTImageFilter_H__ + + +#include "stir/NonseparableConvolutionUsingRealDFTImageFilter.h" +#include "stir/ArrayFilterUsingRealDFTWithPadding.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/DataProcessor.h" +#include "stir/DiscretisedDensity.h" +#include "stir/VectorWithOffset.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#endif + + +START_NAMESPACE_STIR + +// TODO!! remove define +// currently fixed at 3 because I didn't really have a good idea for the parsing +// keywords in n dimensions. +// +#define num_dimensions 3 + +/*! + \ingroup ImageProcessor + \brief A class derived from DataProcessor for performing separable + periodic convolutions with an array kernel. + + This filter applies a 3D convolution based on the filter kernel. + + When parsing, the filter coefficients are read as an Array + + Convolution is periodic. + + Elements of the input array that are outside its + index range are considered to be 0. + + \warning There is NO check if the kernel coefficients add up to 1. This is + because not all filters need this (e.g. edge enhancing filters). + + \par Example input for a kernel + \verbatim + Nonseparable Convolution Using Real DFT Image Filter := + filter kernel := kernel.hv + END Nonseparable Convolution Using Real DFT Image Filter := + \endverbatim + + The filter is implemented using the class ArrayFilterUsingRealDFTWithPadding. +*/ +template +class NonseparableConvolutionUsingRealDFTImageFilter : + public + RegisteredParsingObject< + NonseparableConvolutionUsingRealDFTImageFilter, + DataProcessor >, + DataProcessor > + > +{ + private: + typedef + RegisteredParsingObject< + NonseparableConvolutionUsingRealDFTImageFilter, + DataProcessor >, + DataProcessor > + > + base_type; +public: + //! Name for parsing registry + static const char * const registered_name; + + //! Default constructor + NonseparableConvolutionUsingRealDFTImageFilter(); + + //! Constructor taking filter kernel explicitly. + /*! This kernel is passed to the + ArrayFilterUsingRealDFTWithPadding constructor. + + */ + NonseparableConvolutionUsingRealDFTImageFilter( const Array& filter_coefficients ); + +private: + string _kernel_filename; + shared_ptr > _kernel_sptr; + shared_ptr > _array_filter_sptr; // ChT::float + Array _filter_coefficients; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + Succeeded virtual_set_up(const DiscretisedDensity& image); + void virtual_apply(DiscretisedDensity& out_density, + const DiscretisedDensity& in_density) const; + void virtual_apply(DiscretisedDensity& density) const ; + +}; + +#undef num_dimensions + +END_NAMESPACE_STIR + +#endif + + diff --git a/src/include/stir/NumericInfo.h b/src/include/stir/NumericInfo.h new file mode 100644 index 0000000000..703fdfa7b2 --- /dev/null +++ b/src/include/stir/NumericInfo.h @@ -0,0 +1,320 @@ +#ifndef __NUMERICINFO_H_ +#define __NUMERICINFO_H_ +// +// +/*! + \file + \ingroup buildblock + \brief This file declares the class stir::NumericInfo. + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +// TODO some of these members could be made static + +/* + History : + first version by Kris Thielemans + + KT 15/12/99 + reordered member function declarations to allow easier inlining + moved NumericType and ByteOrder to separate files + + KT 18/02/2000 use new syntax for template specialisations: template<> {class blabla}; + */ + +#include "stir/NumericType.h" + +// this code uses #define's as specified by the ANSI C standard +#include +#include +#ifndef __MSL__ +#include +#else +#include +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief class NumericInfo defines properties for the type NUMBER. + + + The idea comes the ANSI C++ class \c std::numeric_limits, but + some compiler didn't have this yet when PARAPET/STIR was started. + This current class should disappear at some point. + + Note that this general template is essentially empty, but it is needed to use + template syntax. + \warning It could be better to have some error in here, flagging (at compile + time) when you use it for a type which is not yet in our list. With the + current implementation, you will see a linker error only, something like + 'undefined reference NumericInfo::signed_type()' +*/ +template +class NumericInfo +{ +public: + inline bool signed_type() const; + + inline bool integer_type() const; + //! Size in 'bytes' as reported by sizeof(), so really size_in_sizeof_char + inline size_t size_in_bytes() const; + inline size_t size_in_bits() const; + + inline NUMBER max_value() const; + inline NUMBER min_value() const; + + inline NumericType type_id() const; +}; + + + +// Below are the actual details filled in. + +//! Basic properties of signed char +template<> +class NumericInfo +{ + typedef signed char type; +public: + bool signed_type() const + { return true; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return SCHAR_MAX; } + type min_value() const + { return SCHAR_MIN; } + NumericType type_id() const + { return NumericType::SCHAR; } +}; + +//! Basic properties of unsigned char +template<> +class NumericInfo +{ + typedef unsigned char type; +public: + bool signed_type() const + { return false; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return UCHAR_MAX; } + type min_value() const + { return 0; } + NumericType type_id() const + { return NumericType::UCHAR; } +}; + +//! Basic properties of signed short +template<> +class NumericInfo +{ + typedef signed short type; +public: + bool signed_type() const + { return true; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return SHRT_MAX; } + type min_value() const + { return SHRT_MIN; } + NumericType type_id() const + { return NumericType::SHORT; } +}; + +//! Basic properties of unsigned short +template<> +class NumericInfo +{ + typedef unsigned short type; +public: + bool signed_type() const + { return false; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return USHRT_MAX; } + type min_value() const + { return 0; } + NumericType type_id() const + { return NumericType::USHORT; } +}; + + +//! Basic properties of signed int +template<> +class NumericInfo +{ + typedef signed int type; +public: + bool signed_type() const + { return true; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return INT_MAX; } + type min_value() const + { return INT_MIN; } + NumericType type_id() const + { return NumericType::INT; } +}; + +//! Basic properties of unsigned int +template<> +class NumericInfo +{ + typedef unsigned int type; +public: + bool signed_type() const + { return false; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return UINT_MAX; } + type min_value() const + { return 0; } + NumericType type_id() const + { return NumericType::UINT; } +}; + + +//! Basic properties of signed long +template<> +class NumericInfo +{ + typedef signed long type; +public: + bool signed_type() const + { return true; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return LONG_MAX; } + type min_value() const + { return LONG_MIN; } + NumericType type_id() const + { return NumericType::LONG; } +}; + +//! Basic properties of unsigned long +template<> +class NumericInfo +{ + typedef unsigned long type; +public: + bool signed_type() const + { return false; } + bool integer_type() const + { return true; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return ULONG_MAX; } + type min_value() const + { return 0; } + NumericType type_id() const + { return NumericType::ULONG; } + +}; + +//! Basic properties of float +template<> +class NumericInfo +{ + typedef float type; +public: + bool signed_type() const + { return true; } + bool integer_type() const + { return false; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return FLT_MAX; } + type min_value() const + { return -FLT_MAX; } + NumericType type_id() const + { return NumericType::FLOAT; } +}; + +//! Basic properties of double +template<> +class NumericInfo +{ + typedef double type; +public: + bool signed_type() const + { return true; } + bool integer_type() const + { return false; } + size_t size_in_bytes() const + { return sizeof(type); } + size_t size_in_bits() + { return CHAR_BIT*size_in_bytes(); } + type max_value() const + { return DBL_MAX; } + type min_value() const + { return -DBL_MAX; } + NumericType type_id() const + { return NumericType::DOUBLE; } +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/NumericType.h b/src/include/stir/NumericType.h new file mode 100644 index 0000000000..4cb03d0108 --- /dev/null +++ b/src/include/stir/NumericType.h @@ -0,0 +1,158 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009 Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_NumericType_H__ +#define __stir_NumericType_H__ + +/*! + \file + \ingroup buildblock + \brief This file declares the stir::NumericType class. + + \author Kris Thielemans + \author PARAPET project +*/ +/* + Modification History: + + - first version by Kris Thielemans + + - KT 28/07/98 + added two methods to NumericType: + inline bool signed_type() const; + inline bool integer_type() const; + + - KT 15/12/99 + removed inlining. Gave troubles with gcc on NT. + added method that returns Interfile info + + - KT 15/07/04 + added TypeForNumericType +*/ + +#include "stir/common.h" +#include + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief provides names for some numeric types and methods for finding their properties. + + \warning CHAR itself is missing (there's only signed and unsigned versions). + This is because this class is only used where you have to know if the type + is signed. + */ + + +class NumericType +{ +public: + //! An enum for the supported types. + // BIT has to be the first type, and UNKNOWN_TYPE has to be + // the last name for the implementation of the 2nd NumericType constructor + // to work + enum Type { BIT, SCHAR, UCHAR, SHORT, USHORT, INT, UINT, LONG, ULONG, + FLOAT, DOUBLE, UNKNOWN_TYPE }; + + //! stores the current type + Type id; + + //! constructor, defaulting to unknown type + inline NumericType(Type t = UNKNOWN_TYPE); + + //! A constructor to work from named types a la Interfile + /*! + Possible values for \a number_format are + bit, signed integer, unsigned integer, float + Exact types are determined via the size_in_bytes parameter. + */ + NumericType(const std::string& number_format, const std::size_t size_in_bytes); + + //! comparison operator + inline bool operator==(NumericType type) const; + inline bool operator!=(NumericType type) const; + + //! as reported by sizeof(), so it is really size_in_sizeof_char + std::size_t size_in_bytes() const; + + std::size_t size_in_bits() const; + + //! returns true for all built-in types, except \c unsigned types + bool signed_type() const; + + //! returns true for all built-in types, except \c float and \c double + bool integer_type() const; + + + //! returns the names and size a la Interfile. see NumericType(const string&,const std::size_t) + void get_Interfile_info(std::string& number_format, std::size_t& size_in_bytes) const; +}; + +/*! + \ingroup buildblock + \brief A helper class that specifies the C++ type for a particular NumericType. + + Use as follows: + \code + typedef typename TypeForNumericType::type current_type; + \endcode + This is useful when writing code depending on the value of a NumericType enum. +*/ +template +struct TypeForNumericType {}; + + +#ifndef DOXYGEN_SKIP // disable definitions when running doxygen to avoid having all of this in the doc +template <> +struct TypeForNumericType +{ typedef signed char type; }; +template <> +struct TypeForNumericType +{ typedef unsigned char type; }; +template <> +struct TypeForNumericType +{ typedef signed short type; }; +template <> +struct TypeForNumericType +{ typedef unsigned short type; }; +template <> +struct TypeForNumericType +{ typedef signed int type; }; +template <> +struct TypeForNumericType +{ typedef unsigned int type; }; +template <> +struct TypeForNumericType +{ typedef signed long type; }; +template <> +struct TypeForNumericType +{ typedef unsigned long type; }; +template <> +struct TypeForNumericType +{ typedef float type; }; +template <> +struct TypeForNumericType +{ typedef double type; }; +#endif + +END_NAMESPACE_STIR + +#include "stir/NumericType.inl" + +#endif diff --git a/src/include/stir/NumericType.inl b/src/include/stir/NumericType.inl new file mode 100644 index 0000000000..8c0b66225d --- /dev/null +++ b/src/include/stir/NumericType.inl @@ -0,0 +1,47 @@ +// +// +/*! + \file + \ingroup buildblock + \brief Implementation of inline methods of class stir::NumericType. + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +NumericType::NumericType(Type t) +: id(t) +{} + +bool NumericType::operator==(NumericType type) const +{ + return id == type.id; +} + +bool NumericType::operator!=(NumericType type) const +{ + return !(*this == type); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/NumericVectorWithOffset.h b/src/include/stir/NumericVectorWithOffset.h new file mode 100644 index 0000000000..810dbd0cbe --- /dev/null +++ b/src/include/stir/NumericVectorWithOffset.h @@ -0,0 +1,134 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2005-06-03, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __NumericVectorWithOffset_H__ +#define __NumericVectorWithOffset_H__ +/*! + \file + + \brief defines the stir::NumericVectorWithOffset class + + \author Kris Thielemans + \author PARAPET project + +*/ + + +#include "stir/VectorWithOffset.h" + +START_NAMESPACE_STIR +/*! + \ingroup Array + \brief like VectorWithOffset, but with changes in various numeric operators + + Compared to VectorWithOffset, the numeric operators +,-,*,/ with + NumericVectorWithOffset objects return an object with the largest + index range of its arguments. Similarly operators +=,-=,*=,/= + potentially grow the *this object. + + In addition, operators +=,-=,*=,/= with objects of type \c elemT are defined. + + \warning It is likely that the automatic growing feature will be removed at some point. + */ + +template +class NumericVectorWithOffset : public VectorWithOffset +{ +private: + typedef VectorWithOffset base_type; + +public: + //! Construct an empty NumericVectorWithOffset + inline NumericVectorWithOffset(); + + //! Construct a NumericVectorWithOffset of given length + inline explicit NumericVectorWithOffset(const int hsz); + + //! Construct a NumericVectorWithOffset of elements with offset \c min_index + inline NumericVectorWithOffset(const int min_index, const int max_index); + + //! Constructor from an object of this class' base_type + inline NumericVectorWithOffset(const VectorWithOffset& t); + + // arithmetic operations with a vector, combining element by element + + //! adding vectors, element by element + inline NumericVectorWithOffset operator+ (const NumericVectorWithOffset &v) const; + + //! subtracting vectors, element by element + inline NumericVectorWithOffset operator- (const NumericVectorWithOffset &v) const; + + //! multiplying vectors, element by element + inline NumericVectorWithOffset operator* (const NumericVectorWithOffset &v) const; + + //! dividing vectors, element by element + inline NumericVectorWithOffset operator/ (const NumericVectorWithOffset &v) const; + + + // arithmetic operations with a elemT + // TODO??? use member templates + + //! return a new vector with elements equal to the sum of the elements in the original and the \c elemT + inline NumericVectorWithOffset operator+ (const elemT &v) const; + + //! return a new vector with elements equal to the difference of the elements in the original and the \c elemT + inline NumericVectorWithOffset operator- (const elemT &v) const; + + //! return a new vector with elements equal to the multiplication of the elements in the original and the \c elemT + inline NumericVectorWithOffset operator* (const elemT &v) const; + + //! return a new vector with elements equal to the division of the elements in the original and the \c elemT + inline NumericVectorWithOffset operator/ (const elemT &v) const; + + + // corresponding assignment operators + + //! adding elements of \c v to the current vector + inline NumericVectorWithOffset & operator+= (const NumericVectorWithOffset &v); + + //! subtracting elements of \c v from the current vector + inline NumericVectorWithOffset & operator-= (const NumericVectorWithOffset &v); + + //! multiplying elements of the current vector with elements of \c v + inline NumericVectorWithOffset & operator*= (const NumericVectorWithOffset &v); + + //! dividing all elements of the current vector by elements of \c v + inline NumericVectorWithOffset & operator/= (const NumericVectorWithOffset &v); + + //! adding an \c elemT to the elements of the current vector + inline NumericVectorWithOffset & operator+= (const elemT &v); + + //! subtracting an \c elemT from the elements of the current vector + inline NumericVectorWithOffset & operator-= (const elemT &v); + + //! multiplying the elements of the current vector with an \c elemT + inline NumericVectorWithOffset & operator*= (const elemT &v); + + //! dividing the elements of the current vector by an \c elemT + inline NumericVectorWithOffset & operator/= (const elemT &v); + +}; + +END_NAMESPACE_STIR + +#include "stir/NumericVectorWithOffset.inl" + +#endif // __NumericVectorWithOffset_H__ diff --git a/src/include/stir/NumericVectorWithOffset.inl b/src/include/stir/NumericVectorWithOffset.inl new file mode 100644 index 0000000000..b511a9809f --- /dev/null +++ b/src/include/stir/NumericVectorWithOffset.inl @@ -0,0 +1,279 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2005-06-03, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief inline implementations for NumericVectorWithOffset + + \author Kris Thielemans + \author PARAPET project + + */ + +// include for min,max definitions +#include + +START_NAMESPACE_STIR + +template +inline NumericVectorWithOffset::NumericVectorWithOffset() + : base_type() +{} + +template +inline +NumericVectorWithOffset::NumericVectorWithOffset(const int hsz) + : base_type(hsz) +{} + +template +inline +NumericVectorWithOffset::NumericVectorWithOffset(const int min_index, const int max_index) + : base_type(min_index, max_index) +{} + +template +NumericVectorWithOffset:: +NumericVectorWithOffset(const VectorWithOffset& t) + : base_type(t) +{} + +// addition +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator+ (const NumericVectorWithOffset &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval += v; +} + +// subtraction +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator- (const NumericVectorWithOffset &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval -= v; +} + +// elem by elem multiplication +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator* (const NumericVectorWithOffset &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval *= v; +} + +// elem by elem division +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator/ (const NumericVectorWithOffset &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval /= v; +} + +// Add a constant to every element +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator+ (const NUMBER &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval += v; +} + +// Subtract a constant from every element +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator- (const NUMBER &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval -= v; +} + +// Multiply every element by a constant +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator* (const NUMBER &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval *= v; +} + +// Divide every element by a constant +template +inline NumericVectorWithOffset +NumericVectorWithOffset::operator/ (const NUMBER &v) const +{ + this->check_state(); + NumericVectorWithOffset retval(*this); + return retval /= v; +} + + +/*! This will grow the vector automatically if the 2nd argument has + smaller min_index and/or larger max_index. + New elements are first initialised with T() before adding.*/ +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator+= (const NumericVectorWithOffset &v) +{ + this->check_state(); + // first check if *this is empty + if (this->get_length() == 0) + { + return *this = v; + } +#ifndef STIR_NO_NAMESPACES + this->grow (std::min(this->get_min_index(),v.get_min_index()), std::max(this->get_max_index(),v.get_max_index())); +#else + this->grow (min(this->get_min_index(),v.get_min_index()), max(this->get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + this->num[i] += v.num[i]; + this->check_state(); + return *this; +} + +/*! See operator+= (const NumericVectorWithOffset&) for growing behaviour */ +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator-= (const NumericVectorWithOffset &v) +{ + this->check_state(); + // first check if *this is empty + if (this->get_length() == 0) + { + *this = v; + return *this *= -1; + } +#ifndef STIR_NO_NAMESPACES + this->grow (std::min(this->get_min_index(),v.get_min_index()), std::max(this->get_max_index(),v.get_max_index())); +#else + this->grow (min(this->get_min_index(),v.get_min_index()), max(this->get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + this->num[i] -= v.num[i]; + this->check_state(); + return *this; +} + +/*! See operator+= (const NumericVectorWithOffset&) for growing behaviour */ +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator*= (const NumericVectorWithOffset &v) +{ + this->check_state(); + // first check if *this is empty + if (this->get_length() == 0) + { + // we have to return an object of the same dimensions as v, but filled with 0. + *this =v; + return *this *= 0; + } +#ifndef STIR_NO_NAMESPACES + this->grow (std::min(this->get_min_index(),v.get_min_index()), std::max(this->get_max_index(),v.get_max_index())); +#else + this->grow (min(this->get_min_index(),v.get_min_index()), max(this->get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + this->num[i] *= v.num[i]; + this->check_state(); + return *this; +} + +/*! See operator+= (const NumericVectorWithOffset&) for growing behaviour */ +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator/= (const NumericVectorWithOffset &v) +{ + this->check_state(); + // first check if *this is empty + if (this->get_length() == 0) + { + // we have to return an object of the same dimensions as v, but filled with 0. + *this =v; + return *this *= 0; + } +#ifndef STIR_NO_NAMESPACES + this->grow (std::min(this->get_min_index(),v.get_min_index()), std::max(this->get_max_index(),v.get_max_index())); +#else + this->grow (min(this->get_min_index(),v.get_min_index()), max(this->get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + this->num[i] /= v.num[i]; + this->check_state(); + return *this; +} + +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator+= (const NUMBER &v) +{ + this->check_state(); + for (int i=this->get_min_index(); i<=this->get_max_index(); i++) + this->num[i] += v; + this->check_state(); + return *this; +} + +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator-= (const NUMBER &v) +{ + this->check_state(); + for (int i=this->get_min_index(); i<=this->get_max_index(); i++) + this->num[i] -= v; + this->check_state(); + return *this; +} + +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator*= (const NUMBER &v) +{ + this->check_state(); + for (int i=this->get_min_index(); i<=this->get_max_index(); i++) + this->num[i] *= v; + this->check_state(); + return *this; +} + +template +inline NumericVectorWithOffset& +NumericVectorWithOffset::operator/= (const NUMBER &v) +{ + this->check_state(); + for (int i=this->get_min_index(); i<=this->get_max_index(); i++) + this->num[i] /= v; + this->check_state(); + return *this; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/OSMAPOSL/OSMAPOSLReconstruction.h b/src/include/stir/OSMAPOSL/OSMAPOSLReconstruction.h new file mode 100644 index 0000000000..fae0dd7543 --- /dev/null +++ b/src/include/stir/OSMAPOSL/OSMAPOSLReconstruction.h @@ -0,0 +1,198 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2012-06-05 - 2012, Kris Thielemans + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup OSMAPOSL + \brief Declaration of class stir::OSMAPOSLReconstruction + + \author Matthew Jacobson + \author Kris Thielemans + \author PARAPET project + +*/ + +#ifndef __stir_OSMAPOSL_OSMAPOSLReconstruction_h__ +#define __stir_OSMAPOSL_OSMAPOSLReconstruction_h__ + +#include "stir/recon_buildblock/IterativeReconstruction.h" + +START_NAMESPACE_STIR + +template +class PoissonLogLikelihoodWithLinearModelForMean; + +/*! \ingroup OSMAPOSL + \brief Implementation of the Ordered Subsets version of Green's + MAP One Step Late algorithm. + + See Jacobson et al, PMB for a description of the implementation. + + When no prior info is specified, this reduces to 'standard' OSEM. + + Two different forms of the prior are implemented. + (For background, see Mustavic&Thielemans, proc. IEEE MIC 2001). + + When MAP_model == "additive" this implements the standard form of OSL + (with a small modification for allowing subsets): + \code + lambda_new = lambda / ((p_v + beta*prior_gradient)/ num_subsets) * + sum_subset backproj(measured/forwproj(lambda)) + \endcode + with \f$p_v = sum_b p_{bv}\f$. + actually, we restrict 1 + beta*prior_gradient/p_v between .1 and 10 + + On the other hand, when MAP_model == "multiplicative" it implements + \code + lambda_new = lambda / (p_v*(1 + beta*prior_gradient)/ num_subsets) * + sum_subset backproj(measured/forwproj(lambda)) + \endcode + with \f$p_v = sum_b p_{bv}\f$. + actually, we restrict 1 + beta*prior_gradient between .1 and 10. + + + Note that all this assumes 'balanced subsets', i.e. + + \f[\sum_{b \in \rm{subset}} p_{bv} = + { \sum_b p_{bv} \over \rm{numsubsets} } \f] + + \warning This class should be the last in a Reconstruction hierarchy. +*/ +template +class OSMAPOSLReconstruction: +public IterativeReconstruction +{ + private: + typedef IterativeReconstruction base_type; +public: + + //! Default constructor (calling set_defaults()) + OSMAPOSLReconstruction(); + /*! + \brief Constructor, initialises everything from parameter file, or (when + parameter_filename == "") by calling ask_parameters(). + */ + explicit + OSMAPOSLReconstruction(const string& parameter_filename); + + //! accessor for the external parameters + OSMAPOSLReconstruction& get_parameters(){return *this; } + + //! accessor for the external parameters + const OSMAPOSLReconstruction& get_parameters() const + {return *this;} + + //! gives method information + virtual string method_info() const; + + //! Return current objective function + /* Overloading IterativeReconstruction::get_objective_function() + with a return-type specifying it'll always be a Poisson log likelihood. + */ + PoissonLogLikelihoodWithLinearModelForMean const& + get_objective_function() const; + + /*! \name Functions to set parameters + This can be used as alternative to the parsing mechanism. + \warning Be careful with setting shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + //! subiteration interval at which to apply inter-update filters + void set_inter_update_filter_interval(const int); + + //! inter-update filter object + void set_inter_update_filter_ptr(const shared_ptr > &); + + //! restrict updates (larger relative updates will be thresholded) + void set_maximum_relative_change(const double); + + //! restrict updates (smaller relative updates will be thresholded) + void set_minimum_relative_change(const double); + + //! boolean value to determine if the update images have to be written to disk + void set_write_update_image(const int); + + //! should be either additive or multiplicative + void set_MAP_model(const string&); + //@} + + protected: + //! prompts the user to enter parameter values manually + virtual void ask_parameters(); + + //! determines whether non-positive values in the initial image will be set to small positive ones + bool enforce_initial_positivity; + + //! determines wether voxels outside a circular FOV will be set to 0 or not + /*! Currently this circular FOV is slightly smaller than the actual image size (1 pixel at each end or so). + \deprecated + */ + bool do_rim_truncation; + + //! subiteration interval at which to apply inter-update filters + int inter_update_filter_interval; + + //! inter-update filter object + shared_ptr > inter_update_filter_ptr; + + // KT 17/08/2000 3 new parameters + + //! restrict updates (larger relative updates will be thresholded) + double maximum_relative_change; + + //! restrict updates (smaller relative updates will be thresholded) + double minimum_relative_change; + + //! boolean value to determine if the update images have to be written to disk + int write_update_image; + + //! should be either additive or multiplicative + string MAP_model; + + virtual void set_defaults(); + virtual void initialise_keymap(); + + //! used to check acceptable parameter ranges, etc... + virtual bool post_processing(); + + +private: + friend void do_sensitivity(const char * const par_filename); + + //! operations prior to the iterations + virtual Succeeded set_up(shared_ptr const& target_image_ptr); + + //! the principal operations for updating the image iterates at each iteration + virtual void update_estimate (TargetT& current_image_estimate); + + PoissonLogLikelihoodWithLinearModelForMean& + objective_function(); + + PoissonLogLikelihoodWithLinearModelForMean const& + objective_function() const; +}; + +END_NAMESPACE_STIR + +#endif + +// __OSMAPOSLReconstruction_h__ + diff --git a/src/include/stir/OSSPS/OSSPSReconstruction.h b/src/include/stir/OSSPS/OSSPSReconstruction.h new file mode 100644 index 0000000000..73f4d59e38 --- /dev/null +++ b/src/include/stir/OSSPS/OSSPSReconstruction.h @@ -0,0 +1,194 @@ + +// +// +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup OSSPS + \brief Declaration of class stir::OSSPSReconstruction + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ + +#ifndef __stir_OSSPS_OSSPSReconstruction_h__ +#define __stir_OSSPS_OSSPSReconstruction_h__ + +#include "stir/recon_buildblock/IterativeReconstruction.h" +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/ProjData.h" + +START_NAMESPACE_STIR + +/*! + \brief Implementation of the relaxed Ordered Subsets Separable + Paraboloidal Surrogate ( OSSPS) + + See + S. Ahn and J. A. Fessler, Globally convergent image reconstruction for + emission tomography using relaxed ordered subsets algorithms, IEEE + Trans. Med. Imag., vol. 22, no. 3, pp. 613-626, May 2003. + + OSSPS is a relaxed preconditioned sub-gradient descent algorithm: + + \f[ \lambda^\mathrm{new} = \lambda + \zeta D \nabla \Psi \f] + + with \f$\lambda\f$ the parameters to be estimated, + \f$\Psi\f$ the objective function (see class GeneralisedObjectiveFunction) + \f$D\f$ a diagonal matrix (the preconditioner) + and \f$\zeta\f$ an iteration-dependent number called the relaxation parameter (see below). + + \f$D\f$ depends on \f$\Psi\f$. The data-dependent term in the preconditioner + suggested in Ahn and Fessler turns out to be equal to the product of the Hessian of + \f$\Psi\f$ summed over all columns (while using the data plug-in approach for + approximating the Hessian close to the solution). Therefore, this OSSPS + implementation uses + GeneralisedObjectiveFunction::add_multiplication_with_approximate_Hessian_without_penalty. + It is thus completely generic and can be applied to any objective function implemented + in STIR. + + Note that the exact paraboloidal surrogate algorithm by Erdogan and Fessler is currently + not implemented. + + When no prior info is specified, this should converge to the Maximum Likelihood solution + (but in a very different way from MLEM!). + + Note that this implementation probably assumes 'balanced subsets', i.e. + + \f[\sum_{b \in \mathrm{subset}} P_{bv} = + \sum_b P_{bv} \over \mathrm{numsubsets} \f] + + \par Relaxation scheme + + The relaxation value for the additive update follows the suggestion from Ahn and Fessler: + + \f[ \zeta= { \alpha \over 1+ \gamma n } \f] + + with \f$n\f$ the (full) iteration number. The parameter \f$\alpha\f$ corresponds to the + class member relaxation_parameter, and \f$\gamma\f$ to + relaxation_gamma. Ahn and Fessler recommend to set \f$\alpha \approx 1\f$ and + \f$\gamma\f$ small (e.g. 0.1). + + \warning This class should be the last in the Reconstruction hierarchy. + \todo split into a preconditioned subgradient descent class and something that computes + the preconditioner. +*/ +template +class OSSPSReconstruction: +public IterativeReconstruction +{ + private: + typedef IterativeReconstruction base_type; +public: + + //! Default constructor (calls set_defaults()) + OSSPSReconstruction(); + + /*! + \brief Constructor, initialises everything from parameter file, or (when + parameter_filename == "") by calling ask_parameters(). + */ + explicit + OSSPSReconstruction(const string& parameter_filename); + + //! prompts the user to enter parameter values manually + virtual void ask_parameters(); + //! accessor for the external parameters + OSSPSReconstruction& get_parameters(){return *this;} + + //! accessor for the external parameters + const OSSPSReconstruction& get_parameters() const + {return *this;} + + //! gives method information + virtual string method_info() const; + + //! Precompute the data-dependent part of the denominator for the preconditioner +/*! + This function precomputes the denominator for the SPS + (separable paraboloidal surrogates) algorithm. It calls + GeneralisedObjectiveFunction::add_multiplication_with_approximate_Hessian_without_penalty + on a vector filled with ones. For emission and transmission tomography, + this corresponds to Erdogan and Fessler's approximations. +*/ + Succeeded + precompute_denominator_of_conditioner_without_penalty(); + + + protected: // could be private, but this way the doxygen comments are always listed + //! determines whether non-positive values in the initial image will be set to small positive ones + int enforce_initial_positivity; + + //! restrict values to maximum + double upper_bound; + + //! boolean value to determine if the update images have to be written to disk + int write_update_image; + + //! optional name of the file containing the "precomputed denominator" - see Erdogan & Fessler for more info + /*! If not specified, the corresponding object will be computed. */ + string precomputed_denominator_filename; + +#if 0 + bool do_line_search; +#endif + + //! relaxation parameter used (should be around 1) (see class documentation) + float relaxation_parameter; + //! parameter determining how fast relaxation goes down (see class documentation) + float relaxation_gamma; + + virtual void set_defaults(); + virtual void initialise_keymap(); + //! used to check acceptable parameter ranges, etc... + virtual bool post_processing(); + +private: + + //! pointer to the precomputed denominator + shared_ptr precomputed_denominator_ptr; + + //! data corresponding to the gometric forward projection of an image full of ones + /*! This is needed for the precomputed denominator. However, if the parameter is + not set, precompute_denominator_without_penalty_of_conditioner() will compute it. + */ + shared_ptr fwd_ones_sptr; + + //! operations prior to the iterations + virtual Succeeded set_up(shared_ptr const& target_image_ptr); + + //! the principal operations for updating the image iterates at each iteration + virtual void update_estimate(TargetT ¤t_image_estimate); + + GeneralisedPrior * get_prior_ptr() + { return this->get_objective_function().get_prior_ptr(); } + +#if 0 + float + line_search(const TargetT& current_estimate, const TargetT& additive_update); +#endif + +}; + +END_NAMESPACE_STIR + +#endif + +// __OSSPSReconstruction_h__ + diff --git a/src/include/stir/Object.h b/src/include/stir/Object.h new file mode 100644 index 0000000000..594ed2969e --- /dev/null +++ b/src/include/stir/Object.h @@ -0,0 +1,76 @@ +// +// +/*! + + \file + + \brief Declaration of class stir::Object + + \author Kris Thielemans + + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/common.h" + +#include +#ifndef STIR_NO_NAMESPACE +using std::string; +#endif + +#ifndef __stir_Object_H__ +#define __stir_Object_H__ + +START_NAMESPACE_STIR + +/*! \brief Base class for all classes that can parse .par files (and more?) + \ingroup buildblock + The main reason that this class exists is such that KeyParser can store + different types of objects, and get some basic info from it. + + \see RegisteredObject for more info on the registries etc that are used + for parsing.. +*/ + +class Object +{ +public: + virtual ~Object() {} + /*! \brief return a string describing all parameters of the object + + There is currently no requirement on the format of the returned string. + Ideally it would be such that the object can be constructed by parsing + the string again. + + \todo Ideally this function would be a const member, but we cannot + do this because ParsingObject::parameter_info is not const. + */ + virtual string parameter_info() = 0; + /*! \brief Returns the name of the type of the object. + + Each type that can be parsed has a unique (within its hierarchy) name + associated with it. This function returns that name. + KeyParser::parameter_info() needs to know this + name such that it can fill it in. + */ + virtual string get_registered_name() const= 0; +}; +END_NAMESPACE_STIR +#endif + diff --git a/src/include/stir/ParsingObject.h b/src/include/stir/ParsingObject.h new file mode 100644 index 0000000000..6478b5aa97 --- /dev/null +++ b/src/include/stir/ParsingObject.h @@ -0,0 +1,107 @@ +// +// +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup buildblock + \brief Declaration of class stir::ParsingObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +#ifndef __stir_ParsingObject_H__ +#define __stir_ParsingObject_H__ + + +#include "stir/KeyParser.h" + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief A base class for objects that want to be able to parse parameter files. + + This class is essentially a wrapper for KeyParser, such that it is safe to + copy ParsingObject objects. The problem with KeyParser is that it stores + pointers to the variables it needs to fill in. So, if you copy one KeyParser + object to another, both will fill in the same variables (unless add_key is + called afterwards). ParsingObject solves this by having a copy constructor + that reinitialises all keys in its own (protected) KeyParser object. + + \warning All this only works when all keys are set in the initialise_keymap() + function, and \b only there. + \see KeyParser +*/ + +class ParsingObject +{ +public: + ParsingObject() ; + ParsingObject(const ParsingObject&) ; + ParsingObject& operator=(const ParsingObject&) ; + virtual ~ParsingObject() {} + + /*! \name parsing functions + + parse() returns false if there is some error, true otherwise. + */ + //@{ + bool parse(istream& f); + bool parse(const char * const filename); + //@} + + void ask_parameters(); + + string parameter_info(); + +protected: + //! Set defaults before parsing + virtual void set_defaults(); + //! Initialise all keywords + virtual void initialise_keymap(); + //! This will be called at the end of the parsing + /*! \return false if everything OK, true if not */ + virtual bool post_processing(); + + //! This will be called before parsing or parameter_info is called + /*! + This virtual function should be overloaded when the values for the keywords + depend on other variables in the derived class that can be set independently + of the parsing. + + \par Example: + + A derived class has a public member angle_in_radians, while a keyword sets a + private member angle_in_degrees. + */ + virtual void set_key_values(); + +private: + bool keymap_is_initialised; +protected: + KeyParser parser; + +}; + + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/PatientPosition.h b/src/include/stir/PatientPosition.h new file mode 100644 index 0000000000..2b7079a1fb --- /dev/null +++ b/src/include/stir/PatientPosition.h @@ -0,0 +1,115 @@ +/* + Copyright (C) 2004 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Declaration of class stir::PatientPosition + + \author Kris Thielemans +*/ + +#ifndef __stir_PatientPosition_H__ +#define __stir_PatientPosition_H__ + +#include "stir/common.h" + +START_NAMESPACE_STIR +/*! \ingroup buildblock + Class for encoding patient position +*/ +class PatientPosition +{ + public: + //! enum specifying if the patient is scanned with the head first in the gantry, or the feet. + enum OrientationValue + { head_in, feet_in, other_orientation, unknown_orientation }; + //! enum specifying on what side the patient is lying on + /*! \a prone is face-downward, \a left is lying on the left side */ + enum RotationValue + { supine, prone, right, left, other_rotation, unknown_rotation }; + + //! enum using DICOM abreviations + /*! See Dicom C.7.3.1.1.2 */ + enum PositionValue + { + HFS, //!< Head First-Supine + HFP, //!< Head First-Prone + HFDR, //!< Head First-Decubitus Right + HFDL, //!< Head First-Decubitus Left + FFDR, //!< Feet First-Decubitus Right + FFDL, //!< Feet First-Decubitus Left + FFP, //!< Feet First-Prone + FFS, //!< Feet First-Supine + unknown_position + }; + + //! Default constructor (setting to unknown position and orientation) + PatientPosition() + : orientation(unknown_orientation), rotation(unknown_rotation) + { + assert(rotation >=0); + assert(rotation<= unknown_rotation); + assert(orientation >=0); + assert(orientation<= unknown_orientation); + } + + PatientPosition(OrientationValue orientation, RotationValue rotation) + : orientation(orientation), rotation(rotation) + { + assert(rotation >=0); + assert(rotation<= unknown_rotation); + assert(orientation >=0); + assert(orientation<= unknown_orientation); + } + + explicit PatientPosition(PositionValue position); + + void + set_rotation(const RotationValue rotation_v) + { + assert(rotation_v >=0); + assert(rotation_v<= unknown_rotation); + rotation = rotation_v; + } + RotationValue + get_rotation() const + { return rotation; } + + void + set_orientation(const OrientationValue orientation_v) + { + assert(orientation_v >=0); + assert(orientation_v<= unknown_orientation); + orientation = orientation_v; + } + OrientationValue + get_orientation() const + { return orientation; } + + PositionValue + get_position() const; + + const char * const get_position_as_string() const; + private: + OrientationValue orientation; + RotationValue rotation; +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/PixelsOnCartesianGrid.h b/src/include/stir/PixelsOnCartesianGrid.h new file mode 100644 index 0000000000..c480209e91 --- /dev/null +++ b/src/include/stir/PixelsOnCartesianGrid.h @@ -0,0 +1,140 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_PixelsOnCartesianGrid_H__ +#define __stir_PixelsOnCartesianGrid_H__ + +/*! + \file + \ingroup densitydata + \brief defines the stir::PixelsOnCartesianGrid class + + \author Sanida Mustafovic + \author Kris Thielemans (with help from Alexey Zverovich) + \author PARAPET project + + + +*/ +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/CartesianCoordinate2D.h" + +START_NAMESPACE_STIR + +class ProjDataInfo; + +/*! + \ingroup densitydata + \brief This class is used to represent pixelised densities on a + rectangular grid (2D). + +*/ +template +class PixelsOnCartesianGrid:public DiscretisedDensityOnCartesianGrid<2,elemT> +{ + +public: + +//! Construct an empty PixelsOnCartesianGrid +inline PixelsOnCartesianGrid(); + +//! Construct PixelsOnCartesianGrid with the given array, origin and grid spacing +inline PixelsOnCartesianGrid(const Array<2,elemT>& v, + const CartesianCoordinate3D& origin, + const BasicCoordinate<2,float>& grid_spacing); + +//! Construct PixelsOnCartesianGrid with the given range, origin and grid spacing +inline PixelsOnCartesianGrid(const IndexRange<2>& range, + const CartesianCoordinate3D& origin, + const BasicCoordinate<2,float>& grid_spacing); + +#if 0 +// disabled these 2 constructors. they were never implemented. +//! The next two constructors use ProjDataInfo to obtain the relevant information +/*! \see VoxelsOnCartesianGrid(const ProjDataInfo&,const float zoom,const CartesianCoordinate3D&,const CartesianCoordinate3D&) for more details + */ +PixelsOnCartesianGrid(const ProjDataInfo * proj_data_info_ptr, + const float zoom, + const CartesianCoordinate3D& origin, + const bool make_xy_size_odd = true); + +PixelsOnCartesianGrid(const ProjDataInfo * proj_data_info_ptr, + const float zoom, + const CartesianCoordinate3D& origin, + const int xy_size); +#endif + + +//! Definition of the pure virtual defined in DiscretisedDensity +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +DiscretisedDensity<2,elemT>* +#else +PixelsOnCartesianGrid* +#endif + get_empty_copy() const; + +//! Like get_empty_discretised_density, but returning a pointer to a PixelsOnCartesianGrid +PixelsOnCartesianGrid* get_empty_pixels_on_cartesian_grid() const; + +//TODO covariant return types +virtual +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +DiscretisedDensity<2,elemT>* +#else +PixelsOnCartesianGrid* +#endif +clone() const; + +inline int get_x_size() const; + +inline int get_y_size() const; + +inline int get_min_x() const; + +inline int get_min_y() const; + +inline int get_max_x() const; + +inline int get_max_y() const; + +//! is the same as get_grid_spacing(), but now returns CartesianCoordinate2D for convenience +inline CartesianCoordinate2D get_pixel_size() const; + +//! is the same as set_grid_spacing() +inline void set_pixel_size(const BasicCoordinate<2,float>&) const; + + +}; + + +END_NAMESPACE_STIR + +#include "stir/PixelsOnCartesianGrid.inl" +#endif + + + + + + + + + + + + diff --git a/src/include/stir/PixelsOnCartesianGrid.inl b/src/include/stir/PixelsOnCartesianGrid.inl new file mode 100644 index 0000000000..4ab7536fec --- /dev/null +++ b/src/include/stir/PixelsOnCartesianGrid.inl @@ -0,0 +1,141 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup densitydata + \brief inline implementations for the stir::PixelsOnCartesianGrid class + + \author Sanida Mustafovic + \author Kris Thielemans (with help from Alexey Zverovich) + \author PARAPET project + +*/ +START_NAMESPACE_STIR + + +template +PixelsOnCartesianGrid ::PixelsOnCartesianGrid() + : DiscretisedDensityOnCartesianGrid<2,elemT>() +{} + +template +PixelsOnCartesianGrid::PixelsOnCartesianGrid + (const Array<2,elemT>& v, + const CartesianCoordinate3D& origin, + const BasicCoordinate<2,float>& grid_spacing) + :DiscretisedDensityOnCartesianGrid<2,elemT> + (v.get_index_range(),origin,grid_spacing) +{ + Array<2,elemT>::operator=(v); +} + + +template +PixelsOnCartesianGrid::PixelsOnCartesianGrid + (const IndexRange<2>& range, + const CartesianCoordinate3D& origin, + const BasicCoordinate<2,float>& grid_spacing) + :DiscretisedDensityOnCartesianGrid<2,elemT> + (range,origin,grid_spacing) +{} + + +template +int +PixelsOnCartesianGrid:: get_min_y() const + { return this->get_length()==0 ? 0 : this->get_min_index(); } + +template +int +PixelsOnCartesianGrid::get_min_x() const + { return this->get_length()==0 ? 0 : (*this)[get_min_y()].get_min_index(); } + + +template +int +PixelsOnCartesianGrid::get_x_size() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_y()].get_length(); } + +template +int +PixelsOnCartesianGrid:: get_y_size() const +{ return this->get_length()==0 ? 0 : this->get_length();} + +template +int +PixelsOnCartesianGrid::get_max_x() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_y()].get_max_index();} + +template +int +PixelsOnCartesianGrid:: get_max_y() const +{ return this->get_length()==0 ? 0 : this->get_max_index();} + +template +CartesianCoordinate2D +PixelsOnCartesianGrid::get_pixel_size() const +{ + return CartesianCoordinate2D(this->get_grid_spacing()); +} + +template +void +PixelsOnCartesianGrid::set_pixel_size(const BasicCoordinate<2,float>& s) const +{ + this->set_grid_spacing(s); +} + +template +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +DiscretisedDensity<2,elemT>* +#else +PixelsOnCartesianGrid* +#endif +PixelsOnCartesianGrid::get_empty_copy() const +{ + return get_empty_pixels_on_cartesian_grid(); +} + +/*! + This member function will be unnecessary when all compilers can handle + 'covariant' return types. + It is a non-virtual counterpart of get_empty_pixels_on_cartesian_grid. +*/ +template +PixelsOnCartesianGrid* +PixelsOnCartesianGrid::get_empty_pixels_on_cartesian_grid() const + +{ + return new PixelsOnCartesianGrid(this->get_index_range(), + this->get_origin(), + this->get_grid_spacing()); +} + + +template +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +DiscretisedDensity<2,elemT>* +#else +PixelsOnCartesianGrid* +#endif +PixelsOnCartesianGrid::clone() const +{ + return new PixelsOnCartesianGrid(*this); +} +END_NAMESPACE_STIR diff --git a/src/include/stir/ProjData.h b/src/include/stir/ProjData.h new file mode 100644 index 0000000000..c8ae90c73a --- /dev/null +++ b/src/include/stir/ProjData.h @@ -0,0 +1,219 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Declaration of class stir::ProjData + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project +*/ +#ifndef __stir_ProjData_H__ +#define __stir_ProjData_H__ + + +#include "stir/shared_ptr.h" +#include "stir/ProjDataInfo.h" +#include +#include +//#include + +START_NAMESPACE_STIR + + +template class RelatedViewgrams; +class DataSymmetriesForViewSegmentNumbers; +template class SegmentBySinogram; +template class SegmentByView; +template class Viewgram; +template class Sinogram; +class ViewSegmentNumbers; +class Succeeded; +class ExamInfo; + +/*! + \ingroup projdata + \brief The (abstract) base class for the projection data. + + Projection data are supposed to be indexed by 4 coordinates + (corresponding to the most general case of projection data in + all directions of a 3D volume): +
          +
        • \c segment_num : indexes polar angle theta, or ring difference + (segment_num==0 are the projections orthogonal to the scanner axis) +
        • \c view_num : indexes azimuthal angle phi +
        • \c axial_pos_num : indexes different positions along the scanner axis + (corresponding to 'z', or different rings) +
        • \c tangential_pos_num : indexes different positions in a direction + tangential to the scanner cylinder. + (sometimes called 'bin' or 'element') +
        + + The number of axial positions is allowed to depend on segment_num. + + Different 'subsets' of the 4D data are possible by fixing one or + more of the 4 coordinates. Currently we support the following cases +
          +
        • SegmentBySinogram (fixed segment_num) +
        • SegmentByView (fixed segment_num) +
        • Viewgram (fixed segment_num and view_num) +
        • Sinogram (fixed segment_num and axial_pos_num) +
        • RelatedViewgrams (different Viewgrams related by symmetry) +
        + + This abstract class proves the general interface for accessing the + projection data. This works with get_ and set_ pairs. (Generally, + the 4D dataset is too big to be kept in memory.) In addition, there + are get_empty_ functions that just created the corresponding object + of appropriate sizes etc. but filled with 0. + + One important member of this class is get_proj_data_info_ptr() which + allows access to a ProjDataInfo object, which describes the dimensions + of the data, the scanner type, the geometry ... + + \warning The arguments 'make_num_tangential_poss_odd' are temporary + and will be deleted in the next release. +*/ +class ProjData +{ +public: + //! A static member to get the projection data from a file + static shared_ptr + read_from_file(const std::string& filename, + const std::ios::openmode open_mode = std::ios::in); + + //! Constructors + inline ProjData(); + inline ProjData(const shared_ptr& exam_info_sptr, + const shared_ptr& proj_data_info_ptr); + //! Destructor + virtual ~ProjData() {} + //! Get proj data info pointer + inline const ProjDataInfo* + get_proj_data_info_ptr() const; + //! Get pointer to exam info + inline const ExamInfo* + get_exam_info_ptr() const; + //! Get shared pointer to exam info + /*! \warning Use with care. If you modify a shared ptr, all objects using the same + shared pinter will be affected. */ + inline shared_ptr + get_exam_info_sptr() const; + //! change exam info + /*! This will allocate a new ExamInfo object and copy the data in there. */ + void + set_exam_info(ExamInfo const&); + //! Get viewgram + virtual Viewgram + get_viewgram(const int view, const int segment_num,const bool make_num_tangential_poss_odd = false) const=0; + //! Set viewgram + virtual Succeeded + set_viewgram(const Viewgram&) = 0; + //! Get sinogram + virtual Sinogram + get_sinogram(const int ax_pos_num, const int segment_num,const bool make_num_tangential_poss_odd = false) const=0; + //! Set sinogram + virtual Succeeded + set_sinogram(const Sinogram&) = 0; + + //! Get empty viewgram + Viewgram get_empty_viewgram(const int view, const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + + //! Get empty_sinogram + Sinogram + get_empty_sinogram(const int ax_pos_num, const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + + //! Get empty segment sino + SegmentByView + get_empty_segment_by_view(const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + //! Get empty segment view + SegmentBySinogram + get_empty_segment_by_sinogram(const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + + + //! Get segment by sinogram + virtual SegmentBySinogram + get_segment_by_sinogram(const int segment_num) const; + //! Get segment by view + virtual SegmentByView + get_segment_by_view(const int segment_num) const; + //! Set segment by sinogram + virtual Succeeded + set_segment(const SegmentBySinogram&); + //! Set segment by view + virtual Succeeded + set_segment(const SegmentByView&); + + //! Get related viewgrams + virtual RelatedViewgrams + get_related_viewgrams(const ViewSegmentNumbers&, + const shared_ptr&, + const bool make_num_tangential_poss_odd = false) const; + //! Set related viewgrams + virtual Succeeded set_related_viewgrams(const RelatedViewgrams& viewgrams); + + + //! Get empty related viewgrams, where the symmetries_ptr specifies the symmetries to use + RelatedViewgrams + get_empty_related_viewgrams(const ViewSegmentNumbers& view_segmnet_num, + //const int view_num, const int segment_num, + const shared_ptr& symmetries_ptr, + const bool make_num_tangential_poss_odd = false) const; + + //! Get number of segments + inline int get_num_segments() const; + //! Get number of axial positions per segment + inline int get_num_axial_poss(const int segment_num) const; + //! Get number of views + inline int get_num_views() const; + //! Get number of tangential positions + inline int get_num_tangential_poss() const; + //! Get minimum segment number + inline int get_min_segment_num() const; + //! Get maximum segment number + inline int get_max_segment_num() const; + //! Get mininum axial position per segmnet + inline int get_min_axial_pos_num(const int segment_num) const; + //! Get maximum axial position per segment + inline int get_max_axial_pos_num(const int segment_num) const; + //! Get minimum view number + inline int get_min_view_num() const; + //! Get maximum view number + inline int get_max_view_num() const; + //! Get minimum tangential position number + inline int get_min_tangential_pos_num() const; + //! Get maximum tangential position number + inline int get_max_tangential_pos_num() const; + +protected: + shared_ptr exam_info_sptr; + shared_ptr proj_data_info_ptr; +}; + + +END_NAMESPACE_STIR + +#include "stir/ProjData.inl" +#endif + diff --git a/src/include/stir/ProjData.inl b/src/include/stir/ProjData.inl new file mode 100644 index 0000000000..8e88c6e1be --- /dev/null +++ b/src/include/stir/ProjData.inl @@ -0,0 +1,97 @@ +/*! + \file + \ingroup projdata + \brief Implementations for inline functions of class stir::ProjData + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ProjDataInfo.h" + +START_NAMESPACE_STIR + +const ProjDataInfo* +ProjData::get_proj_data_info_ptr() const +{ + return proj_data_info_ptr.get(); +} + +const ExamInfo* +ProjData::get_exam_info_ptr() const +{ + return exam_info_sptr.get(); +} + +shared_ptr +ProjData::get_exam_info_sptr() const +{ + return exam_info_sptr; +} + +ProjData:: ProjData() +{} + +ProjData::ProjData(const shared_ptr& exam_info_sptr, + const shared_ptr& proj_data_info_sptr) + : exam_info_sptr(exam_info_sptr), proj_data_info_ptr(proj_data_info_sptr) +{} + + +int ProjData::get_num_segments() const +{ return proj_data_info_ptr->get_num_segments(); } + +int ProjData::get_num_axial_poss(const int segment_num) const +{ return proj_data_info_ptr->get_num_axial_poss(segment_num); } + +int ProjData::get_num_views() const +{ return proj_data_info_ptr->get_num_views(); } + +int ProjData::get_num_tangential_poss() const +{ return proj_data_info_ptr->get_num_tangential_poss(); } + +int ProjData::get_min_segment_num() const +{ return proj_data_info_ptr->get_min_segment_num(); } + +int ProjData::get_max_segment_num() const +{ return proj_data_info_ptr->get_max_segment_num(); } + +int ProjData::get_min_axial_pos_num(const int segment_num) const +{ return proj_data_info_ptr->get_min_axial_pos_num(segment_num); } + +int ProjData::get_max_axial_pos_num(const int segment_num) const +{ return proj_data_info_ptr->get_max_axial_pos_num(segment_num); } + +int ProjData::get_min_view_num() const +{ return proj_data_info_ptr->get_min_view_num(); } + +int ProjData::get_max_view_num() const +{ return proj_data_info_ptr->get_max_view_num(); } + +int ProjData::get_min_tangential_pos_num() const +{ return proj_data_info_ptr->get_min_tangential_pos_num(); } + +int ProjData::get_max_tangential_pos_num() const +{ return proj_data_info_ptr->get_max_tangential_pos_num(); } + + +END_NAMESPACE_STIR diff --git a/src/include/stir/ProjDataFromStream.h b/src/include/stir/ProjDataFromStream.h new file mode 100644 index 0000000000..94f7288200 --- /dev/null +++ b/src/include/stir/ProjDataFromStream.h @@ -0,0 +1,181 @@ +// +// +/*! + + \file + \ingroup projdata + \brief Declaration of class stir::ProjDataFromStream + + \author Sanida Mustafovic + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __ProjDataFromStream_H__ +#define __ProjDataFromStream_H__ + +#include "stir/ProjData.h" +#include "stir/NumericType.h" +#include "stir/ByteOrder.h" +#include "stir/shared_ptr.h" + +#include +#include + +START_NAMESPACE_STIR + + +/*! + \ingroup projdata + \brief A class which reads/writes projection data from/to a (binary) stream. + + Mainly useful for Interfile data. + + \warning Data have to be contiguous. + \warning The parameter make_num_tangential_poss_odd (used in various + get_ functions) is temporary and will be removed soon. + +*/ +class ProjDataFromStream : public ProjData +{ +public: + + enum StorageOrder { + Segment_AxialPos_View_TangPos, Segment_View_AxialPos_TangPos, + Unsupported }; +#if 0 + static ProjDataFromStream* ask_parameters(const bool on_disk = true); +#endif + +#if 0 + //! Empty constructor + ProjDataFromStream() + {} +#endif + + //! constructor taking all necessary parameters + /*! + \param segment_sequence_in_stream has to be set according to the order + in which the segments occur in the stream. segment_sequence_in_stream[i] + is the segment number of the i-th segment in the stream. + */ + ProjDataFromStream (shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + shared_ptr const& s, + const std::streamoff offs, + const std::vector& segment_sequence_in_stream, + StorageOrder o = Segment_View_AxialPos_TangPos, + NumericType data_type = NumericType::FLOAT, + ByteOrder byte_order = ByteOrder::native, + float scale_factor = 1 ); + + //! as above, but with a default value for segment_sequence_in_stream + /*! The default value for segment_sequence_in_stream is a vector with + values min_segment_num, min_segment_num+1, ..., max_segment_num + */ + ProjDataFromStream (shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + shared_ptr const& s, + const std::streamoff offs = 0, + StorageOrder o = Segment_View_AxialPos_TangPos, + NumericType data_type = NumericType::FLOAT, + ByteOrder byte_order = ByteOrder::native, + float scale_factor = 1 ); + //! Obtain the storage order + inline StorageOrder get_storage_order() const; + + //! Get the offset -Changed into streamoff from int + //inline int get_offset_in_stream() const; + inline std::streamoff get_offset_in_stream() const; + + //! Get the data_type in the stream + inline NumericType get_data_type_in_stream() const; + + //! Get the byte order + inline ByteOrder get_byte_order_in_stream() const; + + //! Get the segment sequence + inline std::vector get_segment_sequence_in_stream() const; + + //! Get & set viewgram + Viewgram get_viewgram(const int view_num, const int segment_num,const bool make_num_tangential_poss_odd=false) const; + Succeeded set_viewgram(const Viewgram& v); + + //! Get & set sinogram + Sinogram get_sinogram(const int ax_pos_num, const int segment_num,const bool make_num_tangential_poss_odd=false) const; + Succeeded set_sinogram(const Sinogram& s); + + //! Get all sinograms for the given segment + SegmentBySinogram get_segment_by_sinogram(const int segment_num) const; + //! Get all viewgrams for the given segment + SegmentByView get_segment_by_view(const int segment_num) const; + + + //! Set all sinograms for the given segment + Succeeded set_segment(const SegmentBySinogram&); + //! Set all viewgrams for the given segment + Succeeded set_segment(const SegmentByView&); + + //! Get scale factor + float get_scale_factor() const; + + +protected: + //! the stream with the data + shared_ptr sino_stream; + +private: + //! offset of the whole 3d sinogram in the stream + std::streamoff offset; + + + //!the order in which the segments occur in the stream + std::vector segment_sequence; + + inline int find_segment_index_in_sequence(const int segment_num) const; + + StorageOrder storage_order; + + NumericType on_disk_data_type; + + ByteOrder on_disk_byte_order; + + // scale_factor is only used when reading data from file. Data are stored in + // memory as float, with the scale factor multiplied out + float scale_factor; + + //! Calculate the offset for the given segmnet + std::streamoff get_offset_segment(const int segment_num) const; + + //! Calculate offsets for viewgram data + std::vector get_offsets(const int view_num, const int segment_num) const; + //! Calculate offsets for sinogram data + std::vector get_offsets_sino(const int ax_pos_num, const int segment_num) const; + + +}; + +END_NAMESPACE_STIR + +#include "stir/ProjDataFromStream.inl" + +#endif diff --git a/src/include/stir/ProjDataFromStream.inl b/src/include/stir/ProjDataFromStream.inl new file mode 100644 index 0000000000..83791557f8 --- /dev/null +++ b/src/include/stir/ProjDataFromStream.inl @@ -0,0 +1,96 @@ +// +// +/*! + + \file + \ingroup projdata + \brief Inline implementations for class stir::ProjDataFromStream + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2012-06-06 - 2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + + +//ProjDataFromStream::ProjDataFromStream() +//{} + +ProjDataFromStream::StorageOrder +ProjDataFromStream::get_storage_order() const +{ return storage_order; } + +int +ProjDataFromStream::find_segment_index_in_sequence(const int segment_num) const +{ +#ifndef STIR_NO_NAMESPACES + std::vector::const_iterator iter = + std::find(segment_sequence.begin(), segment_sequence.end(), segment_num); +#else + vector::const_iterator iter = + find(segment_sequence.begin(), segment_sequence.end(), segment_num); +#endif + // TODO do some proper error handling here + assert(iter != segment_sequence.end()); + return static_cast(iter - segment_sequence.begin()); +} + + +std::streamoff +ProjDataFromStream::get_offset_in_stream() const +{ return offset; } + +NumericType +ProjDataFromStream::get_data_type_in_stream() const +{ return on_disk_data_type; } + +ByteOrder +ProjDataFromStream::get_byte_order_in_stream() const +{ return on_disk_byte_order; } + +std::vector +ProjDataFromStream::get_segment_sequence_in_stream() const +{ return segment_sequence; } + +#if 0 +// this does not make a lot of sense. How to compare files etc. ? +bool +ProjDataFromStream::operator ==(const ProjDataFromStream& proj) +{ + + return + (*get_proj_data_info_ptr())== *(proj.get_proj_data_info_ptr())&& + (scale_factor ==proj.scale_factor)&& + (get_segment_sequence_in_stream()==proj.get_segment_sequence_in_stream())&& + (get_offset_in_stream()==proj.get_offset_in_stream()) && + (on_disk_data_type == proj.get_data_type_in_stream())&& + (get_byte_order_in_stream() == proj.get_byte_order_in_stream()) ; +} + + +#endif + + + +END_NAMESPACE_STIR diff --git a/src/include/stir/ProjDataGEAdvance.h b/src/include/stir/ProjDataGEAdvance.h new file mode 100644 index 0000000000..5f91bbee6e --- /dev/null +++ b/src/include/stir/ProjDataGEAdvance.h @@ -0,0 +1,111 @@ +// +// +/*! + + \file + \ingroup projdata + + \brief Declaration of class stir::ProjDataGEAdvance + + \author Damiano Belluzzo + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __ProjDataGEAdvance_H__ +#define __ProjDataGEAdvance_H__ + +#include "stir/ProjData.h" +#include "stir/NumericType.h" +#include "stir/ByteOrder.h" +#include "stir/Array.h" + +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::iostream; +using std::streamoff; +using std::vector; +#endif + +START_NAMESPACE_STIR + + +/*! + \ingroup projdata + \brief A class which reads projection data from a GE Advance + sinogram file. + + \warning support is still very basic. It assumes max_ring_diff == 11 and arc-corrected data. + The sinogram has to be extracted from the database using the "official" GE BREAKPOINT strategy. + (the file should contain 281 bins x 265 segments x 336 views.) + + No writing yet. + +*/ +class ProjDataGEAdvance : public ProjData +{ +public: + + static ProjDataGEAdvance* ask_parameters(const bool on_disk = true); + + + ProjDataGEAdvance (iostream* s); + + //! Get & set viewgram + Viewgram get_viewgram(const int view_num, const int segment_num,const bool make_num_tangential_poss_odd=false) const; + Succeeded set_viewgram(const Viewgram& v); + + //! Get & set sinogram + Sinogram get_sinogram(const int ax_pos_num, const int sergment_num,const bool make_num_tangential_poss_odd=false) const; + Succeeded set_sinogram(const Sinogram& s); + + +private: + //the file with the data + //This has to be a reference (or pointer) to a stream, + //because assignment on streams is not defined; + // TODO make shared_ptr + iostream* sino_stream; + //offset of the whole 3d sinogram in the stream + streamoff offset; + + + NumericType on_disk_data_type; + + ByteOrder on_disk_byte_order; + + // view_scaling_factor is only used when reading data from file. Data are stored in + // memory as float, with the scale factor multiplied out + + Array<1,float> view_scaling_factor; + + vector num_rings_orig; + vector segment_sequence_orig; + + +}; + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/ProjDataInMemory.h b/src/include/stir/ProjDataInMemory.h new file mode 100644 index 0000000000..4ff89a08e4 --- /dev/null +++ b/src/include/stir/ProjDataInMemory.h @@ -0,0 +1,112 @@ +/* + Copyright (C) 2002 - 2011-02-23, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Declaration of class stir::ProjDataInMemory + + \author Kris Thielemans +*/ + +#ifndef __stir_ProjDataInMemory_H__ +#define __stir_ProjDataInMemory_H__ + +#include "stir/ProjDataFromStream.h" +#include "boost/shared_array.hpp" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +/* Implementation note (KT) + + I first used the std::stringstream class (when available). + However, this class currently has a problem that you cannot preallocate + a buffer size. This means that when we write to the stringstream, it will + grow piece by piece. For some implementations (i.e. those that keep the memory + contiguous), this might mean multiple reallocations and copying of data. + Of course, for 'smart' implementations of stringstream, this wouldn't happen. + Still, I've decided to not take the risk, and always use old style strstream instead. + + It's not clear if strstream will ever disappear from C++, but in any case, it won't happen + very soon. Still, if you no longer have strstream, or don't want to use it, you can enable + the stringstream implementation by removing the next line. +*/ +#define STIR_USE_OLD_STRSTREAM + +#if defined(BOOST_NO_STRINGSTREAM) && !defined(STIR_USE_OLD_STRSTREAM) +#define STIR_USE_OLD_STRSTREAM +#endif + +START_NAMESPACE_STIR + +class Succeeded; + +/*! + \ingroup projdata + \brief A class which reads/writes projection data from/to memory. + + Mainly useful for temporary storage of projection data. + +*/ +class ProjDataInMemory : public ProjDataFromStream +{ +public: + + //! constructor with only info, but no data + /*! + \param proj_data_info_ptr object specifying all sizes etc. + The ProjDataInfo object pointed to will not be modified. + \param initialise_with_0 specifies if the data should be set to 0. + If \c false, the data is undefined until you set it yourself. + */ + ProjDataInMemory (shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + const bool initialise_with_0 = true); + + //! constructor that copies data from another ProjData + ProjDataInMemory (const ProjData& proj_data); + + //! destructor deallocates all memory the object owns + ~ProjDataInMemory(); + + //! writes info to a file in Interfile format + /*! \warning This might change as soon as we have proper output of projdata + */ + Succeeded + write_to_file(const string& filename) const; + + //! Returns a value of a bin + float get_bin_value(Bin& bin); + +private: +#ifdef STIR_USE_OLD_STRSTREAM + // an auto_ptr doesn't work in gcc 2.95.2 because of assignment problems, so we use shared_array + // note however that the buffer is not shared. we just use it such that its memory gets + // deallocated automatically. + boost::shared_array buffer; +#else +#endif + + size_t get_size_of_buffer() const; +}; + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/ProjDataInfo.h b/src/include/stir/ProjDataInfo.h new file mode 100644 index 0000000000..1b9fc7b2eb --- /dev/null +++ b/src/include/stir/ProjDataInfo.h @@ -0,0 +1,353 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-10-14, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + + \brief Declaration of class stir::ProjDataInfo + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ +#ifndef __stir_ProjDataInfo_H__ +#define __stir_ProjDataInfo_H__ + +#include "stir/VectorWithOffset.h" +#include "stir/Scanner.h" +#include "stir/shared_ptr.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +template class Sinogram; +template class Viewgram; +template class SegmentByView; +template class SegmentBySinogram; +template class RelatedViewgrams; +class DataSymmetriesForViewSegmentNumbers; +class ViewSegmentNumbers; +class Bin; +template class LOR; +template class LORInAxialAndNoArcCorrSinogramCoordinates; +class PMessage; + +/*! + \ingroup projdata + \brief An (abstract base) class that contains information on the + projection data. + +*/ +class ProjDataInfo +{ +protected: + typedef ProjDataInfo root_type; + +public: + + /********** static members **************/ + + //! Ask for the details and return a ProjDataInfo pointer + static ProjDataInfo* + ask_parameters(); + + //! Construct a ProjDataInfo suitable for GE Advance data + static ProjDataInfo* + ProjDataInfoGE(const shared_ptr& scanner_ptr, + const int max_delta, + const int num_views, const int num_tangential_poss, + const bool arc_corrected = true); + + //! Construct a ProjDataInfo suitable for CTI data + /*! \c span is used to denote the amount of axial compression (see CTI doc). + It has to be an odd number. + */ + static ProjDataInfo* + ProjDataInfoCTI(const shared_ptr& scanner_ptr, + const int span, const int max_delta, + const int num_views, const int num_tangential_poss, + const bool arc_corrected = true); + + + /************ constructors ***********/ + // TODO should probably be protected + + //! Construct an empty object + ProjDataInfo(); + + //! Constructor setting all relevant info for a ProjDataInfo + /*! The num_axial_pos_per_segment argument should be such that + num_axial_pos_per_segment[segment_num] gives you the appropriate value + for a particular segment_num + */ + ProjDataInfo(const shared_ptr& scanner_ptr, + const VectorWithOffset& num_axial_pos_per_segment, + const int num_views, + const int num_tangential_poss); + + + //! Standard trick for a 'virtual copy-constructor' + virtual ProjDataInfo* clone() const = 0; + + //! Like clone() but return a shared_ptr + inline shared_ptr create_shared_clone() const; + + //! Destructor + virtual ~ProjDataInfo() {} + + /**************** member functions *********/ + + // ProjDataInfo& operator=(const ProjDataInfo&); + + //! \name Functions that change the data size + //@{ + + //! Set a new range of segment numbers + /*! + This function is virtual in case a derived class needs to know the + segment range changed. + + \warning the new range has to be 'smaller' than the old one. */ + virtual void reduce_segment_range(const int min_segment_num, const int max_segment_num); + //! Set number of views (min_view_num is set to 0). + /*! This function is virtual in case a derived class needs to know the + number of views changed. */ + virtual void set_num_views(const int num_views); + //! Set number of tangential positions + /*! This function is virtual in case a derived class needs to know the + number of tangential positions changed. */ + virtual void set_num_tangential_poss(const int num_tang_poss); + //! Set number of axial positions per segment + /*! + \param num_axial_poss_per_segment is a vector with the new numbers, + where the index into the vector is the segment_num (i.e. it is not + related to the storage order of the segments or so). + + This function is virtual in case a derived class needs to know the + number of axial positions changed. */ + virtual void set_num_axial_poss_per_segment(const VectorWithOffset& num_axial_poss_per_segment); + + //! Set minimum axial position number for 1 segment + /*! This function is virtual in case a derived class needs to know the number changed. */ + virtual void set_min_axial_pos_num(const int min_ax_pos_num, const int segment_num); + //! Set maximum axial position number for 1 segment + /*! This function is virtual in case a derived class needs to know the number changed. */ + virtual void set_max_axial_pos_num(const int max_ax_pos_num, const int segment_num); + + //! Set minimum tangential position number + /*! This function is virtual in case a derived class needs to know the number changed. */ + virtual void set_min_tangential_pos_num(const int min_tang_poss); + //! Set maximum tangential position number + /*! This function is virtual in case a derived class needs to know the number changed. */ + virtual void set_max_tangential_pos_num(const int max_tang_poss); + //@} + + //! \name Functions that return info on the data size + //@{ + //! Get number of segments + inline int get_num_segments() const; + //! Get number of axial positions per segment + inline int get_num_axial_poss(const int segment_num) const; + //! Get number of views + inline int get_num_views() const; + //! Get number of tangential positions + inline int get_num_tangential_poss() const; + //! Get minimum segment number + inline int get_min_segment_num() const; + //! Get maximum segment number + inline int get_max_segment_num() const; + //! Get minimum axial position per segmnet + inline int get_min_axial_pos_num(const int segment_num) const; + //! Get maximum axial position per segment + inline int get_max_axial_pos_num(const int segment_num) const; + //! Get minimum view number + inline int get_min_view_num() const; + //! Get maximum view number + inline int get_max_view_num() const; + //! Get minimum tangential position number + inline int get_min_tangential_pos_num() const; + //! Get maximum tangential position number + inline int get_max_tangential_pos_num() const; + //@} + + //| \name Functions that return geometrical info for a Bin + //@{ + //! Get tangent of the co-polar angle of the normal to the projection plane + /*! theta=0 for 'direct' planes (i.e. projection planes parallel to the scanner axis) */ + virtual float get_tantheta(const Bin&) const =0; + + //! Get cosine of the co-polar angle of the normal to the projection plane + /*! theta=0 for 'direct' planes (i.e. projection planes parallel to the scanner axis) */ + inline float get_costheta(const Bin&) const; + + //! Get azimuthal angle phi of the normal to the projection plane + /*! phi=0 when the normal vector has no component along the horizontal axis */ + virtual float get_phi(const Bin&) const =0; + + //! Get value of the (roughly) axial coordinate in the projection plane (in mm) + /*! t-axis is defined to be orthogonal to the s-axis (and to the vector + normal to the projection plane */ + virtual float get_t(const Bin&) const =0; + + //! Return z-coordinate of the middle of the LOR (in mm) + /*! + The middle is defined as follows: imagine a cylinder centred around + the scanner axis. The LOR will intersect the cylinder at 2 opposite + ends. The middle of the LOR is exactly halfway those 2 points. + + The 0 of the z-axis is chosen in the middle of the scanner. + + Default implementation is equivalent to + \code + get_t(bin)/get_costheta(bin) + \endcode + */ + virtual inline float get_m(const Bin&) const; + + //! Get value of the tangential coordinate in the projection plane (in mm) + /*! s-axis is defined to be orthogonal to the scanner axis (and to the vector + normal to the projection plane */ + virtual float get_s(const Bin&) const =0; + + //! Get LOR corresponding to a given bin + /*! + \see get_bin() + \warning This function might get a different type of arguments + in the next release. + */ + virtual void + get_LOR(LORInAxialAndNoArcCorrSinogramCoordinates&, + const Bin&) const = 0; + //@} + + //! \name Functions that return info on the sampling in the different coordinates + //@{ + //! Get sampling distance in the \c t coordinate + /*! For some coordinate systems, this might depend on the Bin. The + default implementation computes it as + \code + 1/2(get_t(..., ax_pos+1,...)-get_t(..., ax_pos-1,...))) + \endcode + */ + virtual float get_sampling_in_t(const Bin&) const; + + //! Get sampling distance in the \c m coordinate + /*! For some coordinate systems, this might depend on the Bin. The + default implementation computes it as + \code + 1/2(get_m(..., ax_pos+1,...)-get_m(..., ax_pos-1,...))) + \endcode + */ + virtual float get_sampling_in_m(const Bin&) const; + + //! Get sampling distance in the \c s coordinate + /*! For some coordinate systems, this might depend on the Bin. The + default implementation computes it as + \code + 1/2(get_s(..., tang_pos+1)-get_s(..., tang_pos_pos-1))) + \endcode + */ + virtual float get_sampling_in_s(const Bin&) const; + //@} + + + //! Find the bin in the projection data that 'contains' an LOR + /*! Projection data corresponds to lines, so most Lines Of Response + (LORs) there is a bin in the projection data. Usually this will be + the bin which has a central LOR that is 'closest' to the LOR that + is passed as an argument. + + If there is no such bin (e.g. the LOR does not intersect the + detectors, Bin::get_bin_value() will be less than 0, otherwise + it will be 1. + + \warning This function might get a different type of arguments + in the next release. + \see get_LOR() + */ + virtual + Bin + get_bin(const LOR&) const = 0; + + //! \name Equality of ProjDataInfo objects + //@{ + //! check equality + bool operator ==(const ProjDataInfo& proj) const; + + bool operator !=(const ProjDataInfo& proj) const; + //@} + + //! \name Functions that return sinograms etc (filled with 0) + //@{ + + //! Get empty viewgram + Viewgram get_empty_viewgram(const int view_num, const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + + //! Get empty_sinogram + Sinogram get_empty_sinogram(const int ax_pos_num, const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + + //! Get empty segment sino + SegmentByView get_empty_segment_by_view(const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + //! Get empty segment view + SegmentBySinogram get_empty_segment_by_sinogram(const int segment_num, + const bool make_num_tangential_poss_odd = false) const; + + + //! Get empty related viewgrams, where the symmetries_ptr specifies the symmetries to use + RelatedViewgrams get_empty_related_viewgrams(const ViewSegmentNumbers&, + const shared_ptr&, + const bool make_num_tangential_poss_odd = false) const; + //@} + + + //! Get scanner pointer + inline const Scanner* get_scanner_ptr() const; + + //! Return a string describing the object + virtual string parameter_info() const; + +protected: + virtual bool blindly_equals(const root_type * const) const = 0; + +private: + shared_ptr scanner_ptr; + int min_view_num; + int max_view_num; + int min_tangential_pos_num; + int max_tangential_pos_num; + VectorWithOffset min_axial_pos_per_seg; + VectorWithOffset max_axial_pos_per_seg; + +}; + +END_NAMESPACE_STIR + +#include "stir/ProjDataInfo.inl" + +#endif // __ProjDataInfo_H__ + diff --git a/src/include/stir/ProjDataInfo.inl b/src/include/stir/ProjDataInfo.inl new file mode 100644 index 0000000000..14964da3ad --- /dev/null +++ b/src/include/stir/ProjDataInfo.inl @@ -0,0 +1,117 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-10-14, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief Implementations of inline functions for class stir::ProjDataInfo + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ + +START_NAMESPACE_STIR + +shared_ptr +ProjDataInfo:: +create_shared_clone() const +{ + shared_ptr sptr(this->clone()); + return sptr; +} + +int +ProjDataInfo::get_num_segments() const +{ return (max_axial_pos_per_seg.get_length());} + + +int +ProjDataInfo::get_num_axial_poss(const int segment_num) const +{ return max_axial_pos_per_seg[segment_num] - min_axial_pos_per_seg[segment_num]+1;} + +int +ProjDataInfo::get_num_views() const +{ return max_view_num - min_view_num + 1; } + +int +ProjDataInfo::get_num_tangential_poss() const +{ return max_tangential_pos_num - min_tangential_pos_num + 1; } + +int +ProjDataInfo::get_min_segment_num() const +{ return (max_axial_pos_per_seg.get_min_index()); } + +int +ProjDataInfo::get_max_segment_num()const +{ return (max_axial_pos_per_seg.get_max_index()); } + +int +ProjDataInfo::get_min_axial_pos_num(const int segment_num) const +{ return min_axial_pos_per_seg[segment_num];} + + +int +ProjDataInfo::get_max_axial_pos_num(const int segment_num) const +{ return max_axial_pos_per_seg[segment_num];} + + +int +ProjDataInfo::get_min_view_num() const + { return min_view_num; } + +int +ProjDataInfo::get_max_view_num() const +{ return max_view_num; } + + +int +ProjDataInfo::get_min_tangential_pos_num()const +{ return min_tangential_pos_num; } + +int +ProjDataInfo::get_max_tangential_pos_num()const +{ return max_tangential_pos_num; } + +float +ProjDataInfo::get_costheta(const Bin& bin) const +{ + return + 1/sqrt(1+square(get_tantheta(bin))); +} + +float +ProjDataInfo::get_m(const Bin& bin) const +{ + return + get_t(bin)/get_costheta(bin); +} + +const +Scanner* +ProjDataInfo::get_scanner_ptr() const +{ + return scanner_ptr.get(); + +} + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/ProjDataInfoCylindrical.h b/src/include/stir/ProjDataInfoCylindrical.h new file mode 100644 index 0000000000..fef6e41fbe --- /dev/null +++ b/src/include/stir/ProjDataInfoCylindrical.h @@ -0,0 +1,322 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + Copyright (C) 2013, Institute for Bioengineering of Catalonia + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Declaration of class stir::ProjDataInfoCylindrical + + \author Sanida Mustafovic + \author Kris Thielemans + \author Berta Marti Fuster + \author PARAPET project +*/ +#ifndef __stir_ProjDataInfoCylindrical_H__ +#define __stir_ProjDataInfoCylindrical_H__ + + +#include "stir/ProjDataInfo.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +using std::pair; +#endif + +START_NAMESPACE_STIR + +class Succeeded; + +/*! + \ingroup projdata + \brief projection data info for data corresponding to a + 'cylindrical' sampling. + + These data are organised by ring differences (allowing for + merging of some ring differences into 1 segment). The class is general + enough to have both the CTI 'spanned' format, and the GE Advance + format. +*/ +// TODOdoc more +class ProjDataInfoCylindrical: public ProjDataInfo +{ +private: + typedef ProjDataInfo base_type; + typedef ProjDataInfoCylindrical self_type; + +public: + //! Type used by get_all_ring_pairs_for_segment_axial_pos_num() + typedef vector > RingNumPairs; + + //! Constructors + ProjDataInfoCylindrical(); + //! Constructor given all the necessary information + /*! The min and max ring difference in each segment are passed + as VectorWithOffsets. All three vectors have to have index ranges + from min_segment_num to max_segment_num. + + \warning Most of this library assumes that segment 0 corresponds + to an average ring difference of 0. + */ + ProjDataInfoCylindrical(const shared_ptr& scanner_ptr, + const VectorWithOffset& num_axial_poss_per_segment, + const VectorWithOffset& min_ring_diff, + const VectorWithOffset& max_ring_diff, + const int num_views,const int num_tangential_poss); + + inline virtual float get_tantheta(const Bin&) const; + + inline float get_phi(const Bin&) const; + + inline float get_t(const Bin&) const; + + //! Return z-coordinate of the middle of the LOR + /*! + The 0 of the z-axis is chosen in the middle of the scanner. + + \warning Current implementation assumes that the axial positions are always 'centred', + i.e. get_m(Bin(..., min_axial_pos_num,...)) == - get_m(Bin(..., max_axial_pos_num,...)) + */ + inline float get_m(const Bin&) const; + + virtual void + get_LOR(LORInAxialAndNoArcCorrSinogramCoordinates& lor, + const Bin& bin) const; + + + void set_azimuthal_angle_sampling(const float angle); + + //void set_axial_sampling(const float samp, int segment_num); + + //! set new number of views, covering the same azimuthal angle range + /*! calls ProjDataInfo::set_num_views(), but makes sure that we cover the + same range of angles as before (usually, but not necessarily, 180 degrees) + by adjusting azimuthal_angle_sampling. + */ + virtual void + set_num_views(const int new_num_views); + + //! Get the azimuthal sampling (in radians) + inline float get_azimuthal_angle_sampling() const; + virtual inline float get_sampling_in_t(const Bin&) const; + virtual inline float get_sampling_in_m(const Bin&) const; + + //! Get the axial sampling (e.g in z_direction) + /*! + \warning The implementation of this function currently assumes that the axial + sampling is equal to the ring spacing for non-spanned data + (i.e. no axial compression), while it is half the + ring spacing for spanned data. + */ + inline float get_axial_sampling(int segment_num) const; + + //! Get average ring difference for the given segment + inline float get_average_ring_difference(int segment_num) const; + //! Get minimum ring difference for the given segment + inline int get_min_ring_difference(int segment_num) const; + //! Get maximum ring difference for the given segment + inline int get_max_ring_difference(int segment_num) const; + + //! Set minimum ring difference + void set_min_ring_difference(int min_ring_diff_v, int segment_num); + //! Set maximum ring difference + void set_max_ring_difference(int max_ring_diff_v, int segment_num); + + virtual void set_num_axial_poss_per_segment(const VectorWithOffset& num_axial_poss_per_segment); + virtual void set_min_axial_pos_num(const int min_ax_pos_num, const int segment_num); + virtual void set_max_axial_pos_num(const int max_ax_pos_num, const int segment_num); + virtual void reduce_segment_range(const int min_segment_num, const int max_segment_num); + + //! Set detector ring radius for all views + inline void set_ring_radii_for_all_views(const VectorWithOffset& new_ring_radius); + + //! Get detector ring radius for all views + inline VectorWithOffset get_ring_radii_for_all_views() const; + + //! Get detector ring radius + inline float get_ring_radius() const; + + inline float get_ring_radius( const int view_num) const; + //! Get detector ring spacing + inline float get_ring_spacing() const; + + //! Set detector ring spacing + void set_ring_spacing(float ring_spacing_v); + + //! Get the mashing factor, i.e. how many 'original' views are combined + /*! This gets the result by comparing the number of detectors in the scanner_ptr + with the actual number of views. + + \warning In the debug version, it is checked with an assert() that the number of + detectors is an even multiple of the number of views. This is not checked in + the normal version though. + */ + inline int get_view_mashing_factor() const; + + //! Find which segment a particular ring difference belongs to + /*! + \return Succeeded::yes when a corresponding segment was found. + */ + inline Succeeded + get_segment_num_for_ring_difference(int& segment_num, const int ring_diff) const; + + //! Find to which segment and axial position a ring pair contributes + /*! + \a ring1, \a ring2 have to between 0 and scanner.get_num_rings()-1. + \return Succeeded::yes when a corresponding segment was found. + \warning axial_pos_num returned might be outside the actual range in the proj_data_info. + + For CTI data with span, this essentially implements a 'michelogram'. + + \warning Current implementation assumes that the axial positions start from 0 for + the first ring-pair in the segment. + + \warning The implementation of this function currently assumes that the axial + sampling is equal to the ring spacing for non-spanned data + (i.e. no axial compression), while it is half the + ring spacing for spanned data. + */ + inline Succeeded + get_segment_axial_pos_num_for_ring_pair(int& segment_num, + int& axial_pos_num, + const int ring1, + const int ring2) const; + + //! Find all ring pairs that contribute to a segment and axial position + /*! + \a ring1, \a ring2 will be between 0 and scanner.get_num_rings()-1. + + \warning The implementation of this function currently assumes that the axial + sampling is equal to the ring spacing for non-spanned data + (i.e. no axial compression), while it is half the + ring spacing for spanned data. + */ + inline const RingNumPairs& + get_all_ring_pairs_for_segment_axial_pos_num(const int segment_num, + const int axial_pos_num) const; + //! Find the number of ring pairs that contribute to a segment and axial position + /*! + \warning The implementation of this function currently assumes that the axial + sampling is equal to the ring spacing for non-spanned data + (i.e. no axial compression), while it is half the + ring spacing for spanned data. + */ + inline unsigned + get_num_ring_pairs_for_segment_axial_pos_num(const int segment_num, + const int axial_pos_num) const; + + //! Find a ring pair that contributes to a segment and axial position + /*! + \a ring1, \a ring2 will be between 0 and scanner.get_num_rings()-1. + + \warning Currently only works when no axial compression is used for the segment (i.e. + min_ring_diff = max_ring_diff). Otherwise, a error() will be called. + + \warning The implementation of this function currently assumes that the axial + sampling is equal to the ring spacing for non-spanned data + (i.e. no axial compression), while it is half the + ring spacing for spanned data. + */ + void + get_ring_pair_for_segment_axial_pos_num(int& ring1, + int& ring2, + const int segment_num, + const int axial_pos_num) const; + + virtual string parameter_info() const; + +protected: + + //! a variable that is set if the data corresponds to physical rings in the scanner + /*! This is (only) used to prevent get_segment_axial_pos_num_for_ring_pair() et al + to go wild. Indeed, for cases where there's cylindrical sampling, but not + really any physical rings associated to the sampling, those functions will + return invalid information. + + The prime case where this is used is for data corresponding to (nearly) + continuous detectors, such as DHCI systems, or the HiDAC. + + Ideally, this would be done by having a separate class for such systems which + does not contain the ring-difference et al information. This seems to make + the hierarchy too complicated though. + + \bug The value of this variable is currently set by checking if the scanner + is a HiDAC scanner. This needs to be changed. + */ + bool sampling_corresponds_to_physical_rings; + +protected: + virtual bool blindly_equals(const root_type * const) const = 0; + +private: + float azimuthal_angle_sampling; + VectorWithOffset ring_radius; + float ring_spacing; + VectorWithOffset min_ring_diff; + VectorWithOffset max_ring_diff; + + /* + Next members have to be mutable as they can be modified by const member + functions. We need this because of the presence of set_min_ring_difference() + which invalidates these precalculated arrays. + If your compiler does not support mutable (and you don't want to upgrade + it to something more sensible), your best bet is to remove the + set_*ring_difference functions, and move the content of + initialise_ring_diff_arrays() to the constructor. (Not recommended!) + */ + + //! This member will signal if the arrays below contain sensible info or not + mutable bool ring_diff_arrays_computed; + //! This member stores the offsets used in get_m() + mutable VectorWithOffset m_offset; + + //! This member stores the offsets used in get_segment_axial_pos_num_for_ring_pair() + mutable VectorWithOffset ax_pos_num_offset; + //! This member stores a table converting ring differences to segment numbers + mutable VectorWithOffset ring_diff_to_segment_num; + //! This member stores a table converting segment/axial_pos to ring1+ring2 + mutable VectorWithOffset > segment_axial_pos_to_ring1_plus_ring2; + + //! This function sets all of the above + void initialise_ring_diff_arrays() const; + + inline int get_num_axial_poss_per_ring_inc(const int segment_num) const; + + //! This member will signal if the array below contain sensible info or not + mutable bool segment_axial_pos_to_ring_pair_allocated; + //! This member stores a table used by get_all_ring_pairs_for_segment_axial_pos_num() + mutable VectorWithOffset< VectorWithOffset < shared_ptr > > + segment_axial_pos_to_ring_pair; + + //! allocate table + void allocate_segment_axial_pos_to_ring_pair() const; + + //! initialise one element of the above table + void compute_segment_axial_pos_to_ring_pair(const int segment_num, const int axial_pos_num) const; + +}; + + +END_NAMESPACE_STIR + +#include "stir/ProjDataInfoCylindrical.inl" + +#endif diff --git a/src/include/stir/ProjDataInfoCylindrical.inl b/src/include/stir/ProjDataInfoCylindrical.inl new file mode 100644 index 0000000000..caea7b5bb8 --- /dev/null +++ b/src/include/stir/ProjDataInfoCylindrical.inl @@ -0,0 +1,263 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2003, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + Copyright (C) 2013, Institute for Bioengineering of Catalonia + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Implementation of inline functions of class stir::ProjDataInfoCylindrical + + \author Sanida Mustafovic + \author Kris Thielemans + \author Berta Marti Fuster + \author PARAPET project +*/ + +// for sqrt +#include +#include "stir/Bin.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include + +START_NAMESPACE_STIR + + +float +ProjDataInfoCylindrical::get_phi(const Bin& bin)const +{ return bin.view_num()*azimuthal_angle_sampling;} + + +float +ProjDataInfoCylindrical::get_m(const Bin& bin) const +{ + if (!ring_diff_arrays_computed) + initialise_ring_diff_arrays(); + return + bin.axial_pos_num()*get_axial_sampling(bin.segment_num()) + - m_offset[bin.segment_num()]; +} + +float +ProjDataInfoCylindrical::get_t(const Bin& bin) const +{ + return + get_m(bin)*get_costheta(bin); +} + +float +ProjDataInfoCylindrical::get_tantheta(const Bin& bin) const +{ + const float delta=get_average_ring_difference(bin.segment_num()); + if (fabs(delta)<0.0001F) + return 0; + const float R=get_ring_radius(bin.view_num()); + assert(R>=fabs(get_s(bin))); + return delta*ring_spacing/(2*sqrt(square(R)-square(get_s(bin)))); +} + + +float +ProjDataInfoCylindrical::get_sampling_in_m(const Bin& bin) const +{ + return get_axial_sampling(bin.segment_num()); +} + +float +ProjDataInfoCylindrical::get_sampling_in_t(const Bin& bin) const +{ + return get_axial_sampling(bin.segment_num())*get_costheta(bin); +} + +int +ProjDataInfoCylindrical:: +get_num_axial_poss_per_ring_inc(const int segment_num) const +{ + return + max_ring_diff[segment_num] != min_ring_diff[segment_num] ? + 2 : 1; +} + +float +ProjDataInfoCylindrical::get_azimuthal_angle_sampling() const +{return azimuthal_angle_sampling;} + +float +ProjDataInfoCylindrical::get_axial_sampling(int segment_num) const +{ + return ring_spacing/get_num_axial_poss_per_ring_inc(segment_num); +} + +float +ProjDataInfoCylindrical::get_average_ring_difference(int segment_num) const +{ + // KT 05/07/2001 use float division here. + // In any reasonable case, min+max_ring_diff will be even. + // But some day, an unreasonable case will walk in. + return (min_ring_diff[segment_num] + max_ring_diff[segment_num])/2.F; +} + + +int +ProjDataInfoCylindrical::get_min_ring_difference(int segment_num) const +{ return min_ring_diff[segment_num]; } + +int +ProjDataInfoCylindrical::get_max_ring_difference(int segment_num) const +{ return max_ring_diff[segment_num]; } + +float +ProjDataInfoCylindrical::get_ring_radius() const +{ + if (this->ring_radius.get_min_index()!=0 || this->ring_radius.get_max_index()!=0) + { + // check if all elements are equal + for (VectorWithOffset::const_iterator iter=this->ring_radius.begin(); iter!= this->ring_radius.end(); ++iter) + { + if (*iter != *this->ring_radius.begin()) + error("get_ring_radius called for non-circular ring"); + } + } + return *this->ring_radius.begin(); +} + +void +ProjDataInfoCylindrical::set_ring_radii_for_all_views(const VectorWithOffset& new_ring_radius) +{ + if (new_ring_radius.get_min_index() != this->get_min_view_num() || + new_ring_radius.get_max_index() != this->get_max_view_num()) + { + error("error set_ring_radii_for_all_views: you need to use correct range of view numbers"); + } + + this->ring_radius = new_ring_radius; +} + +VectorWithOffset +ProjDataInfoCylindrical::get_ring_radii_for_all_views() const +{ + if (this->ring_radius.get_min_index()==0 && this->ring_radius.get_max_index()==0) + { + VectorWithOffset out(this->get_min_view_num(), this->get_max_view_num()); + out.fill(this->ring_radius[0]); + return out; + } + else + return this->ring_radius; +} + +float +ProjDataInfoCylindrical::get_ring_radius( const int view_num) const +{ + if (this->ring_radius.get_min_index()==0 && this->ring_radius.get_max_index()==0) + return ring_radius[0]; + else + return ring_radius[view_num]; +} + +float +ProjDataInfoCylindrical::get_ring_spacing() const +{ return ring_spacing;} + +int +ProjDataInfoCylindrical:: +get_view_mashing_factor() const +{ + // KT 10/05/2002 new assert + assert(get_scanner_ptr()->get_num_detectors_per_ring() > 0); + // KT 10/05/2002 moved assert here from constructor + assert(get_scanner_ptr()->get_num_detectors_per_ring() % (2*get_num_views()) == 0); + // KT 28/11/2001 do not pre-store anymore as set_num_views would invalidate it + return get_scanner_ptr()->get_num_detectors_per_ring()/2 / get_num_views(); +} + +Succeeded +ProjDataInfoCylindrical:: +get_segment_num_for_ring_difference(int& segment_num, const int ring_diff) const +{ + if (!sampling_corresponds_to_physical_rings) + return Succeeded::no; + + // check currently necessary as reduce_segment does not reduce the size of the ring_diff arrays + if (ring_diff > get_max_ring_difference(get_max_segment_num()) || + ring_diff < get_min_ring_difference(get_min_segment_num())) + return Succeeded::no; + + if (!ring_diff_arrays_computed) + initialise_ring_diff_arrays(); + + segment_num = ring_diff_to_segment_num[ring_diff]; + // warning: relies on initialise_ring_diff_arrays to set invalid ring_diff to a too large segment_num + if (segment_num <= get_max_segment_num()) + return Succeeded::yes; + else + return Succeeded::no; +} + + +Succeeded +ProjDataInfoCylindrical:: +get_segment_axial_pos_num_for_ring_pair(int& segment_num, + int& ax_pos_num, + const int ring1, + const int ring2) const +{ + assert(0<=ring1); + assert(ring1get_num_rings()); + assert(0<=ring2); + assert(ring2get_num_rings()); + + // KT 01/08/2002 swapped rings + if (get_segment_num_for_ring_difference(segment_num, ring2-ring1) == Succeeded::no) + return Succeeded::no; + + // see initialise_ring_diff_arrays() for some info + ax_pos_num = (ring1 + ring2 - ax_pos_num_offset[segment_num])* + get_num_axial_poss_per_ring_inc(segment_num)/2; + return Succeeded::yes; +} + +const ProjDataInfoCylindrical::RingNumPairs& +ProjDataInfoCylindrical:: +get_all_ring_pairs_for_segment_axial_pos_num(const int segment_num, + const int axial_pos_num) const +{ + if (!ring_diff_arrays_computed) + initialise_ring_diff_arrays(); + if (is_null_ptr(segment_axial_pos_to_ring_pair[segment_num][axial_pos_num])) + compute_segment_axial_pos_to_ring_pair(segment_num, axial_pos_num); + return *segment_axial_pos_to_ring_pair[segment_num][axial_pos_num]; +} + +unsigned +ProjDataInfoCylindrical:: +get_num_ring_pairs_for_segment_axial_pos_num(const int segment_num, + const int axial_pos_num) const +{ + return + static_cast( + this->get_all_ring_pairs_for_segment_axial_pos_num(segment_num,axial_pos_num).size()); +} + +END_NAMESPACE_STIR + + + diff --git a/src/include/stir/ProjDataInfoCylindricalArcCorr.h b/src/include/stir/ProjDataInfoCylindricalArcCorr.h new file mode 100644 index 0000000000..8917fbffc8 --- /dev/null +++ b/src/include/stir/ProjDataInfoCylindricalArcCorr.h @@ -0,0 +1,96 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Declaration of class stir::ProjDataInfoCylindricalArcCorr + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +#ifndef __stir_ProjDataInfoCylindricalArcCorr_H__ +#define __stir_ProjDataInfoCylindricalArcCorr_H__ + + +#include "stir/ProjDataInfoCylindrical.h" + +START_NAMESPACE_STIR + +/*! + \ingroup projdata + \brief Projection data info for arc-corrected data + + This means that 'tangential_pos_num' actually indexes a linear coordinate + with a particular sampling distance (usually called the 'bin_size'). + */ +class ProjDataInfoCylindricalArcCorr : public ProjDataInfoCylindrical +{ + typedef ProjDataInfoCylindrical base_type; +#ifdef SWIG + // SWIG needs this typedef to be public + public: +#endif + typedef ProjDataInfoCylindricalArcCorr self_type; + +public: + //! Constructors + ProjDataInfoCylindricalArcCorr(); + ProjDataInfoCylindricalArcCorr(const shared_ptr scanner_ptr,float bin_size, + const VectorWithOffset& num_axial_pos_per_segment, + const VectorWithOffset& min_ring_diff_v, + const VectorWithOffset& max_ring_diff_v, + const int num_views,const int num_tangential_poss); + + ProjDataInfo* clone() const; + + bool operator==(const self_type&) const; + + inline virtual float get_s(const Bin&) const; + //! Set tangential sampling + void set_tangential_sampling(const float bin_size); + //! Get tangential sampling + inline float get_tangential_sampling() const; + virtual float get_sampling_in_s(const Bin&) const + {return bin_size; } + + virtual + Bin + get_bin(const LOR&) const; + + virtual string parameter_info() const; +private: + + float bin_size; + + virtual bool blindly_equals(const root_type * const) const; + +}; + +END_NAMESPACE_STIR + +#include "stir/ProjDataInfoCylindricalArcCorr.inl" + +#endif diff --git a/src/include/stir/ProjDataInfoCylindricalArcCorr.inl b/src/include/stir/ProjDataInfoCylindricalArcCorr.inl new file mode 100644 index 0000000000..53ac04a2d7 --- /dev/null +++ b/src/include/stir/ProjDataInfoCylindricalArcCorr.inl @@ -0,0 +1,48 @@ +// +// +/*! + + \file + \ingroup projdata + + \brief Implementation of inline functions of class stir::ProjDataInfoCylindricalArcCorr + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Bin.h" + +START_NAMESPACE_STIR + +float +ProjDataInfoCylindricalArcCorr::get_s(const Bin& bin) const +{return bin.tangential_pos_num()*bin_size;} + + +float +ProjDataInfoCylindricalArcCorr::get_tangential_sampling() const +{return bin_size;} + +END_NAMESPACE_STIR + diff --git a/src/include/stir/ProjDataInfoCylindricalNoArcCorr.h b/src/include/stir/ProjDataInfoCylindricalNoArcCorr.h new file mode 100644 index 0000000000..064965879a --- /dev/null +++ b/src/include/stir/ProjDataInfoCylindricalNoArcCorr.h @@ -0,0 +1,316 @@ +// +// +/* + Copyright (C) 2000- 2011-06-24, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + + \brief Declaration of class stir::ProjDataInfoCylindricalNoArcCorr + + \author Kris Thielemans + +*/ +#ifndef __stir_ProjDataInfoCylindricalNoArcCorr_H__ +#define __stir_ProjDataInfoCylindricalNoArcCorr_H__ + + +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/DetectionPositionPair.h" +#include "stir/VectorWithOffset.h" +#include "stir/CartesianCoordinate3D.h" + +START_NAMESPACE_STIR + +class Succeeded; +/*! + \ingroup projdata + \brief Projection data info for data which are not arc-corrected. + + For this class, 'tangential_pos_num' actually indexes an angular coordinate + with a particular angular sampling (usually given by half the angle between + detectors). That is + \code + get_s(Bin(..., tang_pos_num)) == ring_radius * sin(tang_pos_num*angular_increment) + \endcode + + This class also contains some functions specific for (static) full-ring PET + scanners. In this case, it is assumed that for 'raw' data (i.e. no mashing) + sinogram space is 'interleaved': 2 adjacent LOR_angles are + merged to 1 'view', while the corresponding bins are + interleaved: + + \verbatim + before interleaving after interleaving + a00 a01 a02 ... view 0: a00 a10 a01 a11 ... + a10 a11 ... + a20 a21 a22 ... view 1: a20 a30 a21 a31 ... + a30 a31 ... + \endverbatim + This (standard) interleaving is done because for 'odd' LOR_angles there + is no LOR which goes through the origin. + + + \par Interchanging the 2 detectors + + When the ring difference = 0 (i.e. a 2D - or direct - sinogram), + interchanging the 2 detectors does not change the LOR. This is why + (in 2D) one gets away with a full sinogram size of + num_views * 2 * num_views, where the size of 'detector-space' is + twice as large. + However, in 3D, interchanging the detectors, also interchanges the + rings. One has 2 options: + - have 1 sinogram with twice as many views, together with the rings + as 'unordered pair' (i.e. ring_difference is always >0) + - have 2 sinograms of the same size as in 2D, together with the rings + as 'ordered pair' (i.e. ring_difference can be positive and negative). + In STIR, we use the second convention. + + \todo The detector specific functions possibly do not belong in this class. + One can easily imagine a case where the theta,phi,s,t coordinates are as + described, but there is no real correspondence with detectors (for instance, + a rotating system). Maybe they should be moved somewhere else? + */ +class ProjDataInfoCylindricalNoArcCorr : public ProjDataInfoCylindrical +{ +private: + typedef ProjDataInfoCylindrical base_type; +#ifdef SWIG + // SWIG needs this typedef to be public + public: +#endif + typedef ProjDataInfoCylindricalNoArcCorr self_type; + +public: + //! Default constructor (leaves object in ill-defined state) + ProjDataInfoCylindricalNoArcCorr(); + //! Constructor completely specifying all parameters + /*! \see ProjDataInfoCylindrical class documentation for info on parameters */ + ProjDataInfoCylindricalNoArcCorr(const shared_ptr scanner_ptr, + const float ring_radius, const float angular_increment, + const VectorWithOffset& num_axial_pos_per_segment, + const VectorWithOffset& min_ring_diff_v, + const VectorWithOffset& max_ring_diff_v, + const int num_views,const int num_tangential_poss); + + //! Constructor which gets \a ring_radius and \a angular_increment from the scanner + /*! \a angular_increment is determined as Pi divided by the number of detectors in a ring. + \todo only suitable for full-ring PET scanners*/ + ProjDataInfoCylindricalNoArcCorr(const shared_ptr scanner_ptr, + const VectorWithOffset& num_axial_pos_per_segment, + const VectorWithOffset& min_ring_diff_v, + const VectorWithOffset& max_ring_diff_v, + const int num_views,const int num_tangential_poss); + + ProjDataInfo* clone() const; + + bool operator==(const self_type&) const; + + //! Gets s coordinate in mm + /*! \warning + This does \c not take the 'interleaving' into account which is + customarily applied to raw PET data. + */ + inline virtual float get_s(const Bin&) const; + + //! Gets angular increment (in radians) + inline float get_angular_increment() const; + + virtual string parameter_info() const; + + //! \name Functions that convert between bins and detection positions + //@{ + //! This gets view_num and tang_pos_num for a particular detector pair + /*! This function makes only sense if the scanner is a full-ring scanner + with discrete detectors and there is no rotation or wobble. + + \arg view runs currently from 0 to num_views-1 + + \arg tang_pos_num is centred around 0, where 0 corresponds + to opposing detectors. The maximum range of tangential positions for any + scanner is -(num_detectors)/2&) const; + + + //! This routine gets the detector pair corresponding to a bin. + /*! + \see get_det_pair_for_view_tangential_pos_num() for + restrictions. In addition, this routine only works for span=1 data, + i.e. no axial compression. + \todo use member template for the coordT type to support continuous detectors. + \warning Will call error() if certain conditions are not met. + */ + inline void + get_det_pos_pair_for_bin(DetectionPositionPair<>&, + const Bin&) const; + + //! This routine returns the number of detector pairs that correspond to a bin + unsigned int + get_num_det_pos_pairs_for_bin(const Bin&) const; + + //! This routine fills a vector with all the detector pairs that correspond to a bin. + /*! + \see ProjDataInfoCylindrical::get_all_ring_pairs_for_segment_axial_pos_num + for restrictions. + \todo It might be possible to return some weight factors in case there is + no many-to-one correspondence between detection positions and bins + (for instance for continuous detectors, or rotating scanners, or + arc-corrected data). + */ + void + get_all_det_pos_pairs_for_bin(vector >&, + const Bin&) const; + + //! This gets Bin coordinates for a particular detector pair + /*! + \return Succeeded::yes when a corresponding segment is found + \see get_view_tangential_pos_num_for_det_num_pair() for restrictions + \obsolete + */ + inline Succeeded + get_bin_for_det_pair(Bin&, + const int det1_num, const int ring1_num, + const int det2_num, const int ring2_num) const; + + + //! This routine gets the detector pair corresponding to a bin. + /*! + \see get_det_pair_for_view_tangential_pos_num() for + restrictions. In addition, this routine only works for span=1 data, + i.e. no axial compression. + \obsolete + */ + inline void + get_det_pair_for_bin( + int& det1_num, int& ring1_num, + int& det2_num, int& ring2_num, + const Bin&) const; + + //@} + + virtual + Bin + get_bin(const LOR&) const; + + + //! \name set of obsolete functions to go between bins<->LORs (will disappear!) + //@{ + /*! \warning These function take a different convention for the axial coordinate + compare to the get_m(), get_LOR() etc. In the current function, the axial coordinate (z) + is zero in the first ring, while for get_m() etc it is zero in the centre of the scanner. + \obsolete + */ + Succeeded find_scanner_coordinates_given_cartesian_coordinates(int& det1, int& det2, int& ring1, int& ring2, + const CartesianCoordinate3D& c1, + const CartesianCoordinate3D& c2) const; + + void find_cartesian_coordinates_of_detection(CartesianCoordinate3D& coord_1, + CartesianCoordinate3D& coord_2, + const Bin& bin) const; + + void find_cartesian_coordinates_given_scanner_coordinates (CartesianCoordinate3D& coord_1, + CartesianCoordinate3D& coord_2, + const int Ring_A,const int Ring_B, + const int det1, const int det2) const; + + void find_bin_given_cartesian_coordinates_of_detection(Bin& bin, + const CartesianCoordinate3D& coord_1, + const CartesianCoordinate3D& coord_2) const; + //@} + +private: + + float ring_radius; + float angular_increment; + + // used in get_view_tangential_pos_num_for_det_num_pair() + struct Det1Det2 { int det1_num; int det2_num; }; + mutable VectorWithOffset< VectorWithOffset > uncompressed_view_tangpos_to_det1det2; + mutable bool uncompressed_view_tangpos_to_det1det2_initialised; + //! build look-up table for get_view_tangential_pos_num_for_det_num_pair() + void initialise_uncompressed_view_tangpos_to_det1det2() const; + + // used in get_view_tangential_pos_num_for_det_num_pair() + // we prestore a lookup-table in terms for unmashed view/tangpos + struct ViewTangPosSwap { int view_num; int tang_pos_num; bool swap_detectors; }; + mutable VectorWithOffset< VectorWithOffset > det1det2_to_uncompressed_view_tangpos; + mutable bool det1det2_to_uncompressed_view_tangpos_initialised; + //! build look-up table for get_view_tangential_pos_num_for_det_num_pair() + void initialise_det1det2_to_uncompressed_view_tangpos() const; + + virtual bool blindly_equals(const root_type * const) const; + +}; + +END_NAMESPACE_STIR + +#include "stir/ProjDataInfoCylindricalNoArcCorr.inl" + +#endif diff --git a/src/include/stir/ProjDataInfoCylindricalNoArcCorr.inl b/src/include/stir/ProjDataInfoCylindricalNoArcCorr.inl new file mode 100644 index 0000000000..874b709248 --- /dev/null +++ b/src/include/stir/ProjDataInfoCylindricalNoArcCorr.inl @@ -0,0 +1,152 @@ +// +// +/*! + + \file + \ingroup projdata + + \brief Implementation of inline functions of class + ProjDataInfoCylindricalNoArcCorr + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Bin.h" +#include "stir/Succeeded.h" +#include + +START_NAMESPACE_STIR + +float +ProjDataInfoCylindricalNoArcCorr:: +get_s(const Bin& bin) const +{ + return ring_radius * sin(bin.tangential_pos_num()*angular_increment); +} + +float +ProjDataInfoCylindricalNoArcCorr:: +get_angular_increment() const +{ + return angular_increment; +} + +void +ProjDataInfoCylindricalNoArcCorr:: +get_det_num_pair_for_view_tangential_pos_num( + int& det1_num, + int& det2_num, + const int view_num, + const int tang_pos_num) const +{ + assert(get_view_mashing_factor() == 1); + if (!uncompressed_view_tangpos_to_det1det2_initialised) + initialise_uncompressed_view_tangpos_to_det1det2(); + + det1_num = uncompressed_view_tangpos_to_det1det2[view_num][tang_pos_num].det1_num; + det2_num = uncompressed_view_tangpos_to_det1det2[view_num][tang_pos_num].det2_num; +} + + +bool +ProjDataInfoCylindricalNoArcCorr:: +get_view_tangential_pos_num_for_det_num_pair(int& view_num, + int& tang_pos_num, + const int det1_num, + const int det2_num) const +{ + assert(det1_num!=det2_num); + if (!det1det2_to_uncompressed_view_tangpos_initialised) + initialise_det1det2_to_uncompressed_view_tangpos(); + + view_num = + det1det2_to_uncompressed_view_tangpos[det1_num][det2_num].view_num/get_view_mashing_factor(); + tang_pos_num = + det1det2_to_uncompressed_view_tangpos[det1_num][det2_num].tang_pos_num; + return + det1det2_to_uncompressed_view_tangpos[det1_num][det2_num].swap_detectors; +} + + +Succeeded +ProjDataInfoCylindricalNoArcCorr:: +get_bin_for_det_pair(Bin& bin, + const int det_num1, const int ring_num1, + const int det_num2, const int ring_num2) const +{ + if (get_view_tangential_pos_num_for_det_num_pair(bin.view_num(), bin.tangential_pos_num(), det_num1, det_num2)) + return get_segment_axial_pos_num_for_ring_pair(bin.segment_num(), bin.axial_pos_num(), ring_num1, ring_num2); + else + return get_segment_axial_pos_num_for_ring_pair(bin.segment_num(), bin.axial_pos_num(), ring_num2, ring_num1); +} + +Succeeded +ProjDataInfoCylindricalNoArcCorr:: +get_bin_for_det_pos_pair(Bin& bin, + const DetectionPositionPair<>& dp) const +{ + return + get_bin_for_det_pair(bin, + dp.pos1().tangential_coord(), + dp.pos1().axial_coord(), + dp.pos2().tangential_coord(), + dp.pos2().axial_coord()); +} +void +ProjDataInfoCylindricalNoArcCorr:: +get_det_pair_for_bin( + int& det_num1, int& ring_num1, + int& det_num2, int& ring_num2, + const Bin& bin) const +{ + get_det_num_pair_for_view_tangential_pos_num(det_num1, det_num2, bin.view_num(), bin.tangential_pos_num()); + get_ring_pair_for_segment_axial_pos_num( ring_num1, ring_num2, bin.segment_num(), bin.axial_pos_num()); +} + +void +ProjDataInfoCylindricalNoArcCorr:: +get_det_pos_pair_for_bin( + DetectionPositionPair<>& dp, + const Bin& bin) const +{ + //lousy work around because types don't match TODO remove! +#if 1 + int t1=dp.pos1().tangential_coord(), + a1=dp.pos1().axial_coord(), + t2=dp.pos2().tangential_coord(), + a2=dp.pos2().axial_coord(); + get_det_pair_for_bin(t1, a1, t2, a2, bin); + dp.pos1().tangential_coord()=t1; + dp.pos1().axial_coord()=a1; + dp.pos2().tangential_coord()=t2; + dp.pos2().axial_coord()=a2; + +#else + + get_det_pair_for_bin(dp.pos1().tangential_coord(), + dp.pos1().axial_coord(), + dp.pos2().tangential_coord(), + dp.pos2().axial_coord(), + bin); +#endif +} + +END_NAMESPACE_STIR + diff --git a/src/include/stir/ProjDataInterfile.h b/src/include/stir/ProjDataInterfile.h new file mode 100644 index 0000000000..707ba2e2c4 --- /dev/null +++ b/src/include/stir/ProjDataInterfile.h @@ -0,0 +1,99 @@ +/*! + + \file + \ingroup projdata + \brief Declaration of class stir::ProjDataInterfile + + \author Kris Thielemans +*/ +/* + Copyright (C) 2002 - 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2012-06-06, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_ProjDataInterfile_H__ +#define __stir_ProjDataInterfile_H__ + +#include "stir/ProjDataFromStream.h" +#include "stir/shared_ptr.h" + +#include +#include + + +START_NAMESPACE_STIR + + +/*! + \ingroup projdata + \brief A class which reads/writes projection data from/to a (binary) stream, but creates the + corresponding Interfile header. + + \warning The class can ONLY be used to create a new file. Use ProjData::read_from_file() to + read a projection data file. +*/ +class ProjDataInterfile : public ProjDataFromStream +{ +public: + + //! constructor taking all necessary parameters + /*! + \param filename The name to use for the files. See below. + \param segment_sequence_in_stream has to be set according to the order + in which the segments will occur in the stream. segment_sequence_in_stream[i] + is the segment number of the i-th segment in the stream. + + \par file names that will be used + +
          +
        • if \a filename has no extension or if \a filename has an extension .hs, + the extensions .s and .hs will be used for binary file and header file. +
        • otherwise, \a filename will be used for the binary data, and its extension + will be replaced with .hs for the header file. +
        + + \warning This call will create a new file for the binary data and the Intefile header. + Any existing files with the same file anmes will be overwritten without warning. + */ + ProjDataInterfile (shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + const std::string& filename, const std::ios::openmode, + const std::vector& segment_sequence_in_stream, + StorageOrder o = Segment_View_AxialPos_TangPos, + NumericType data_type = NumericType::FLOAT, + ByteOrder byte_order = ByteOrder::native, + float scale_factor = 1 ); + + //! as above, but with a default value for segment_sequence_in_stream + /*! The default value for segment_sequence_in_stream is a vector with + values min_segment_num, min_segment_num+1, ..., max_segment_num + */ + ProjDataInterfile (shared_ptr const& exam_info_sptr, + shared_ptr const& proj_data_info_ptr, + const std::string& filename, + const std::ios::openmode open_mode = std::ios::out, + StorageOrder o = Segment_View_AxialPos_TangPos, + NumericType data_type = NumericType::FLOAT, + ByteOrder byte_order = ByteOrder::native, + float scale_factor = 1 ); +private: + void create_stream(const std::string& filename, const std::ios::openmode open_mode); +}; + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/RegisteredObject.h b/src/include/stir/RegisteredObject.h new file mode 100644 index 0000000000..1220f1683b --- /dev/null +++ b/src/include/stir/RegisteredObject.h @@ -0,0 +1,169 @@ +// +// +/*! + \file + \ingroup buildblock + \brief Declaration of class stir::RegisteredObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_RegisteredObject_H__ +#define __stir_RegisteredObject_H__ + +#include "stir/Object.h" +#include "stir/FactoryRegistry.h" +#include "stir/interfile_keyword_functions.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::istream; +#endif + +START_NAMESPACE_STIR + + + +/*! + \brief Helper class to provide registry mechanisms to a Base class + \ingroup buildblock + + Suppose you have a hierarchy of classes with (nearly) all public + functionality provided by virtual functions of the Base class. + The aim is then to be able to select at run-time which + of the nodes will be used. + + To do this, one needs to enter all + node classes in a registry. This registry contains a key and a + "Base factory" for every node-class. The factory for + the node-class returns (a pointer to) a new node-class object, + which of course is also a Base object. + + In STIR, FactoryRegistry provides the type for the registry. + + In many cases, the factory constructs the new object from a stream. + The current class provides the basic mechanisms for this, i.e. + a registry, and a function that looks up the relevant factory + in the registry and uses it to construct the object from a stream. + In addition, there is an interactive function for asking the type + and its parameters. This makes only sense if the object construction + can be interactive as well (see ask_type_and_parameters()). + + In case the construction of the object is done by using ParsingObject, + nearly all of the necessary functionality can be provided to the + hierarchy by using RegisteredParsingObject in the hierarchy. In such + a case, the hierarchy looks normally as follows: + \code + RegisteredObject + Base + ... + Parent <- ParsingObject + RegisteredParsingObject + Derived + \endcode + + A recommended variation on this is the following: + \code + RegisteredObject + Base <- ParsingObject + ... + RegisteredParsingObject + Derived + \endcode + Aside from the fact that this is simpler, it also is more future proof. + Suppose that at some point you want to add parsing keys that are common to + the whole hierarchy. The best/only place to do this is to add them to + the \a Base class. But this can only be done if \a Base is derived from + ParsingObject, and hence there is can be no other ParsingObject in the + hierarchy. So, the recommended variation will need no change at all, while + the general version would need change to all nodes. + + As a final note, RegisteredObject could also be used for hierarchies that + do not use ParsingObject. + + \see RegisteredParsingObject + + \todo Currently there is a hard-wired value of "None" + for the default key (with a 0 factory). This is inappropriate + in some cases. + + \warning Visual C++ cannot inline the registry() function. As a result, + all possible instantiations of the RegisteredObject template have to be + defined in RegisteredObject.cxx file(s). You will have link errors if + you forgot to do this. +*/ +template +class RegisteredObject : public Object +{ +public: + inline RegisteredObject(); + + /*! + \brief Construct a new object (of a type derived from Root, its actual type determined by the registered_name parameter) by parsing the istream + + This works by finding the 'root factory' object in a registry that corresponds to + \a registered_name, and calling the factory on this istream*. + */ + inline static Root* read_registered_object(istream* in, const string& registered_name); + + //! \brief ask the user for the type, and then calls read_registered_object(0, type) + /*! + \warning Relies on read_registered_object to be interactive when its first argument is 0. + + Sadly, this function cannot be called ask_parameters() because of conflicts with + ParsingObject::ask_parameters() in the derived classes. + */ + inline static Root* ask_type_and_parameters(); + + //! List all possible registered names to the stream + /*! Names are separated with newlines. */ + inline static void list_registered_names(std::ostream& stream); + + +protected: + //! The type of a root factory is a function, taking an istream* as argument, and returning a Root* + typedef Root * (*RootFactory)(istream*); + //! The type of the registry + typedef FactoryRegistry RegistryType; + +#if defined(_MSC_VER) && _MSC_VER<=1300 +# define __STIR_REGISTRY_NOT_INLINE +#endif + + //! Static function returning the registry + /*! \warning This function is non inline when using Visual C++ 6.0 because of + a compiler limitation. This means that when using this compiler, + RegisteredObject will need explicit instantiations for all derived classes. + */ +#ifndef __STIR_REGISTRY_NOT_INLINE + inline +#endif + static RegistryType& registry(); + +}; + + +END_NAMESPACE_STIR +#include "stir/RegisteredObject.inl" + +#endif + diff --git a/src/include/stir/RegisteredObject.inl b/src/include/stir/RegisteredObject.inl new file mode 100644 index 0000000000..7d5e3c4a36 --- /dev/null +++ b/src/include/stir/RegisteredObject.inl @@ -0,0 +1,77 @@ +// +// +/*! + + \file + \ingroup buildblock + \brief Inline implementations for class stir::RegisteredObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/utilities.h" +#include + +START_NAMESPACE_STIR + +template +RegisteredObject::RegisteredObject() +{} + + +#ifndef __STIR_REGISTRY_NOT_INLINE +template +typename RegisteredObject::RegistryType& +RegisteredObject::registry () +{ + static RegistryType the_registry("None", 0); + return the_registry; +} +#endif + +template +Root* +RegisteredObject::read_registered_object(istream* in, const string& registered_name) +{ + RootFactory factory = registry().find_factory(registered_name); + return factory==0 ? 0 : (*factory)(in); +} + +template +Root* +RegisteredObject::ask_type_and_parameters() +{ + std::cout << "Which type do you want? Possible values are:\n"; + list_registered_names(std::cout); + const string registered_name = ask_string("Enter type", "None"); + return read_registered_object(0, registered_name); +} + +template +void +RegisteredObject:: +list_registered_names(std::ostream& stream) +{ + registry().list_keys(stream); +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/RegisteredParsingObject.h b/src/include/stir/RegisteredParsingObject.h new file mode 100644 index 0000000000..025f482535 --- /dev/null +++ b/src/include/stir/RegisteredParsingObject.h @@ -0,0 +1,165 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief Declaration of class stir::RegisteredParsingObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#ifndef __stir_RegisteredParsingObject_H__ +#define __stir_RegisteredParsingObject_H__ + + +#include "stir/ParsingObject.h" +#include + +#ifndef STIR_NO_NAMESPACE +using std::string; +#endif + + +START_NAMESPACE_STIR + + +//! Auxiliary class for RegisteredParsingObject +/*! + \ingroup buildblock + This class simply makes a class derived from Base and ParsingObject. Its use + should be restricted to the default value of the RegisteredParsingObject + template. +*/ +template +class AddParser : public Base, public ParsingObject +{}; + + + +/*! + \brief Parent class for all leaves in a RegisteredObject hierarchy that + do parsing of parameter files. + \ingroup buildblock + \see RegisteredObject for an explanation why you would use this class. + + RegisteredParsingObject::read_from_stream is implemented in terms of + ParsingObject::parse. + + Requirements on the class \a Base: + - It needs to be derived from RegisteredObject + + Requirements on the class \a Derived: + - It needs to have a static member static const char * const \a registered_name + - It needs to have a default constructor + - It needs to be derived from \a RegisteredParsingObject + + Requirements on the class \a Parent: + - It needs to be derived from ParsingObject + - It needs to be derived from \a Base + + Use the 2 parameter form if there is no ParsingObject anywhere in the + hierarchy yet. However, we recommend to immediately derive \a Base from + ParsingObject. + + \par How to add a leaf to the registry at run-time. + Constructing the hierarchy as above makes sure that everything is + ready. However, the registry needs to be filled at run-time. + This could be done with user selection of the desired leaves + (based on their \a registered_name), or just by entering all leaves + in the registry. + + A leaf will be entered in the hierarchy by declaring a variable as + follows: + \code + Derived::RegisterIt dummy; + \endcode + As soon as the variable is destructed, the leaf will be taken out of + the registry (but see todo). If you want to add it as long as the program runs, use + a static variable. + + Currently, STIR has static variables in files for each module + (for instance, buildblock_registries.cxx). Note that these files + have to be linked explicitly into your program, as opposed to + sticking it in a library. This is because the linker will think that + the variables in that file are never referenced, so would not include + it in the final executable (to try to remove redundant object files). +*/ +template > +class RegisteredParsingObject : public Parent +{ +public: + //! Construct a new object (of type Derived) by parsing the istream + /*! When the istream * is 0, questions are asked interactively. + + \todo Currently, the return value is a \a Base*. Preferably, it should be a + \a Derived*, but it seems the registration machinery would need extra + (unsafe) reinterpret_casts to get that to work. + (TODO find a remedy). + */ + inline static Base* read_from_stream(istream*); + + //! Returns Derived::registered_name + inline string get_registered_name() const; + //! Returns a string with all parameters and their values, in a form suitable for parsing again + inline string parameter_info(); + +public: + + //! A helper class to allow automatic registration. + struct RegisterIt + { + //! Default constructor adds the type to the registry. + RegisterIt() + { + //std::cerr << "Adding " << Derived::registered_name <<" to registry"< + +#ifndef STIR_NO_NAMESPACE +using std::ifstream; +#endif + +START_NAMESPACE_STIR + +template +string +RegisteredParsingObject:: get_registered_name() const + { return Derived::registered_name; } + +template +Base* +RegisteredParsingObject::read_from_stream(istream* in) +{ + Derived * der_ptr = new Derived; + if (in != NULL) + { + if(der_ptr->parse(*in)==false) + { + //parsing failed, return 0 pointer + delete der_ptr; + return 0; + } + } + else + der_ptr->ask_parameters(); + return der_ptr; +} + +template +string +RegisteredParsingObject::parameter_info() +{ + return ParsingObject::parameter_info(); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/RelatedViewgrams.h b/src/include/stir/RelatedViewgrams.h new file mode 100644 index 0000000000..f9cbabab32 --- /dev/null +++ b/src/include/stir/RelatedViewgrams.h @@ -0,0 +1,224 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Declaration of class stir::RelatedViewgrams + + \author Kris Thielemans + \author PARAPET project +*/ + +#ifndef __RelatedViewgrams_h__ +#define __RelatedViewgrams_h__ + +#include "stir/Viewgram.h" +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +#include + +#include + +START_NAMESPACE_STIR + +// forward declarations for 'friend' +class ProjData; +class ProjDataInfo; + + + +/*! + \brief A class for storing viewgrams which are related by symmetry + \ingroup projdata +*/ +template +class RelatedViewgrams +{ +private: +#ifdef SWIG +public: +#endif + typedef RelatedViewgrams self_type; + +public: + //! \name typedefs for iterator support + //@{ + typedef std::random_access_iterator_tag iterator_category; + typedef Viewgram value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef std::ptrdiff_t difference_type; + typedef std::size_t size_type; + + typedef typename std::vector >::iterator iterator; + typedef typename std::vector >::const_iterator const_iterator; + //@} + + + // --- constructors --- + + //! default constructor (sets everything empty) + inline RelatedViewgrams(); + + // implicit copy constructor (just element-by-element copy) + // RelatedViewgrams(const RelatedViewgrams&); + + //! a private constructor which simply sets the members + /*! \todo Currently public for the STIR_MPI version */ + inline RelatedViewgrams(const vector >& viewgrams, + const shared_ptr& symmetries_used); + + + // --- const members returning info --- + + //! get 'basic' view_num + /*! see DataSymmetriesForViewSegmentNumbers for definition of 'basic' */ + inline int get_basic_view_num() const; + //! get 'basic' segment_num + /*! see DataSymmetriesForViewSegmentNumbers for definition of 'basic' */ + inline int get_basic_segment_num() const; + //! get 'basic' view_segment_num + /*! see DataSymmetriesForViewSegmentNumbers for definition of 'basic' */ + inline ViewSegmentNumbers get_basic_view_segment_num() const; + + //! returns the number of viewgrams in this object + inline int get_num_viewgrams() const; + inline int get_num_axial_poss() const; + inline int get_num_tangential_poss() const; + inline int get_min_axial_pos_num() const; + inline int get_max_axial_pos_num() const; + inline int get_min_tangential_pos_num() const; + inline int get_max_tangential_pos_num() const; + + //! Get a pointer to the ProjDataInfo of this object + inline const ProjDataInfo * get_proj_data_info_ptr() const; + //! Get a pointer to the symmetries used in constructing this object + inline const DataSymmetriesForViewSegmentNumbers * get_symmetries_ptr() const; + //! Get a shared pointer to the symmetries used in constructing this object + /*! \warning It is dangerous to modify the shared symmetries object */ + inline shared_ptr get_symmetries_sptr() const; + // -- members which modify the structure --- + + //! Grow each viewgram + void grow(const IndexRange<2>& range); + + //TODOvoid zoom(const float zoom, const float Xoffp, const float Yoffp, + // const int size, const float itophi); + + + + // -- basic iterator support -- + + //! use to initialise an iterator to the first element of the vector + inline iterator begin(); + //! iterator 'past' the last element of the vector + inline iterator end(); + //! use to initialise an iterator to the first element of the (const) vector + inline const_iterator begin() const; + //! iterator 'past' the last element of the (const) vector + inline const_iterator end() const; + + + + // numeric operators + + //! Multiplication of all data elements with a constant + RelatedViewgrams& operator*= (const elemT); + //! Division of all data elements by a constant + RelatedViewgrams& operator/= (const elemT); + //! Addition of all data elements by a constant + RelatedViewgrams& operator+= (const elemT); + //! Subtraction of all data elements by a constant + RelatedViewgrams& operator-= (const elemT); + + + //! Element-wise multiplication with another RelatedViewgram object + RelatedViewgrams& operator*= (const RelatedViewgrams&); + //! Element-wise division by another RelatedViewgram object + RelatedViewgrams& operator/= (const RelatedViewgrams&); + //! Element-wise addition by another RelatedViewgram object + RelatedViewgrams& operator+= (const RelatedViewgrams&); + //! Element-wise subtraction by another RelatedViewgram object + RelatedViewgrams& operator-= (const RelatedViewgrams&); + + // numeric functions + + //! Find the maximum of all data elements + elemT find_max() const; + //! Find the maximum of all data elements + elemT find_min() const; + //! Set all data elements to n + void fill(const elemT &n); + + // other + + //! Return a new object with ProjDataInfo etc., but all data elements set to 0 + RelatedViewgrams get_empty_copy() const; + + //! \name Equality + //@{ + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! If they do \c not have the same characteristics, the string \a explanation + explains why. + */ + bool + has_same_characteristics(self_type const&, + string& explanation) const; + + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! Use this version if you do not need to know why they do not match. + */ + bool + has_same_characteristics(self_type const&) const; + + //! check equality (data has to be identical) + /*! Uses has_same_characteristics() and Array::operator==. + \warning This function uses \c ==, which might not be what you + need to check when \c elemT has data with float or double numbers. + */ + bool operator ==(const self_type&) const; + + //! negation of operator== + bool operator !=(const self_type&) const; + //@} + +private: + + friend class ProjData; + friend class ProjDataInfo; + + // members + vector > viewgrams; + shared_ptr symmetries_used; + + //! a function which is called internally to see if the object is valid + /*! it does nothing when NDEBUG is defined */ + inline void check_state() const; + + //! actual implementation of the above function + void debug_check_state() const; + +}; + +END_NAMESPACE_STIR + +#include "stir/RelatedViewgrams.inl" + + +#endif // __RelatedViewgrams_h__ + diff --git a/src/include/stir/RelatedViewgrams.inl b/src/include/stir/RelatedViewgrams.inl new file mode 100644 index 0000000000..08103fed7c --- /dev/null +++ b/src/include/stir/RelatedViewgrams.inl @@ -0,0 +1,181 @@ +// +// +/*! + + \file + \ingroup projdata + \brief inline implementations for class stir::RelatedViewgrams + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/ViewSegmentNumbers.h" + +START_NAMESPACE_STIR + +template +RelatedViewgrams::RelatedViewgrams() : + viewgrams(), symmetries_used() + {} + +template +RelatedViewgrams::RelatedViewgrams(const vector >& viewgrams, + const shared_ptr& symmetries_used) + : viewgrams(viewgrams), + symmetries_used(symmetries_used) + { + check_state(); + } + +template +void RelatedViewgrams::check_state() const +{ +#ifndef NDEBUG + debug_check_state(); +#endif +} + +template +int RelatedViewgrams::get_num_viewgrams() const +{ + check_state(); + return static_cast(viewgrams.size()); +} + + +template +int RelatedViewgrams::get_basic_view_num() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_view_num(); +} + +template +int RelatedViewgrams::get_basic_segment_num() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_segment_num(); +} + +template +ViewSegmentNumbers RelatedViewgrams:: +get_basic_view_segment_num() const +{ + return ViewSegmentNumbers(get_basic_view_num(), get_basic_segment_num()); +} + +template +int RelatedViewgrams::get_num_axial_poss() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_num_axial_poss(); +} + +template +int RelatedViewgrams::get_num_tangential_poss() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_num_tangential_poss(); +} + +template +int RelatedViewgrams::get_min_axial_pos_num() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_min_axial_pos_num(); +} + +template +int RelatedViewgrams::get_max_axial_pos_num() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_max_axial_pos_num(); +} + +template +int RelatedViewgrams::get_min_tangential_pos_num() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_min_tangential_pos_num(); +} + +template +int RelatedViewgrams::get_max_tangential_pos_num() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_max_tangential_pos_num(); +} + +template +const ProjDataInfo * +RelatedViewgrams:: +get_proj_data_info_ptr() const +{ + assert(viewgrams.size()>0); + check_state(); + return viewgrams[0].get_proj_data_info_ptr(); +} + +template +const DataSymmetriesForViewSegmentNumbers * +RelatedViewgrams::get_symmetries_ptr() const +{ + return symmetries_used.get(); +} + +template +shared_ptr +RelatedViewgrams::get_symmetries_sptr() const +{ + return symmetries_used; +} + +template +typename RelatedViewgrams::iterator +RelatedViewgrams::begin() +{ return viewgrams.begin();} + +template +typename RelatedViewgrams::iterator +RelatedViewgrams::end() +{return viewgrams.end();} + +template +typename RelatedViewgrams::const_iterator +RelatedViewgrams::begin() const +{return viewgrams.begin();} + +template +typename RelatedViewgrams::const_iterator +RelatedViewgrams::end() const +{return viewgrams.end();} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/RunTests.h b/src/include/stir/RunTests.h new file mode 100644 index 0000000000..2980e39aa2 --- /dev/null +++ b/src/include/stir/RunTests.h @@ -0,0 +1,426 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2005, Hammersmith Imanet Ltd + Copyright (C) 2013, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + \ingroup buildblock + \brief defines the stir::RunTests class + + \author Kris Thielemans + \author PARAPET project +*/ + +#include "stir/VectorWithOffset.h" +#include "stir/BasicCoordinate.h" +#include "stir/IndexRange.h" +#include "stir/stream.h" +#include +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + +/*! + \brief A base class for making test classes + \ingroup test + \ingroup buildblock + + With a derived class, an application could look like +\code +int main(int argc, char **argv, char **env) +{ + SomeTests tests(argc,argv,env); + tests.run_tests(); + return tests.main_return_value(); +} +\endcode + + \par Implementation notes + + At present, the various check* functions are overloaded on most basic + types, and in some STIR specific types such as VectorWithOffset. + This creates problems when the arguments are not exactly of one of those + types, as then the compilation might break. + + A potential solution for this would be to use member templates and the + addition of a 'generic' function as a template. However, then that + function would take precedence for other cases which are currently resolved + by overloading (such as when using stir::Array which is currently handled via + stir::VectorWithOffset). + + In summary, if you need to check a different type that's not provided for, + either use check(), add an appropriate function to your derived class, or + if useful for other cases to this class of course. +*/ +class RunTests +{ +public: + //! Default constructor + explicit RunTests( const double tolerance = 1E-4); + + //! Destructor, outputs a diagnostic message + virtual ~RunTests(); + + //! Function (to be overloaded) which does the actual tests. + /*! This function is expected to do a series of calls to check(), check_if_equal() etc. */ + virtual void run_tests() = 0; + + //! Returns if all checks were fine upto now. + bool is_everything_ok() const; + + //! Handy return value for a main() function + /*! Returns EXIT_SUCCESS if is_everything_ok(), EXIT_FAILURE otherwise */ + int main_return_value() const; + + //! Set value used in floating point comparisons (see check_* functions) + void set_tolerance(const double tolerance); + + //! Get value used in floating point comparisons (see check_* functions) + double get_tolerance() const; + + //! Tests if true, str can be used to tell what you are testing + /*! \return if this test worked. + If the test failed, writes diagnostic to \c std::cerr (including value of str) and + modifies internal variable \c everything_ok. + */ + bool check(const bool, const std::string& str = ""); + + /*! \name Test equality + float/double/complex numbers are compared using \c tolerance. + \see check() + */ + //@{ + bool check_if_equal(const double a, const double b, const std::string& str = ""); + // Note: due to current C++ overloading rules, we need copies for every integer type + bool check_if_equal(const short a, const short b, const std::string& str = ""); + bool check_if_equal(const unsigned short a, const unsigned short b, const std::string& str = ""); + bool check_if_equal(const int a, const int b, const std::string& str = ""); + bool check_if_equal(const unsigned int a, const unsigned int b, const std::string& str = ""); + bool check_if_equal(const long a, const long b, const std::string& str = ""); + bool check_if_equal(const unsigned long a, const unsigned long b, const std::string& str = ""); +#ifdef BOOST_HAS_LONG_LONG + // necessary to cope with std::size_t for instance (on 64 bit systems) + bool check_if_equal(const long long a, const long long b, const std::string& str = ""); + bool check_if_equal(const unsigned long long a, const unsigned long long b, const std::string& str = ""); +#endif + // VC 6.0 needs definition of template members in the class def unfortunately. + //! check equality by calling check_if_equal on real and imaginary parts + template + bool check_if_equal(const std::complex a, const std::complex b, const std::string& str = "") + { + return + check_if_equal(a.real(), b.real(), str) && + check_if_equal(a.imag(), b.imag(), str); + } + //! check equality by comparing ranges and calling check_if_equal on all elements + template + bool check_if_equal(const VectorWithOffset& t1, const VectorWithOffset& t2, + const std::string& str = "") + { + if (t1.get_min_index() != t2.get_min_index() || + t1.get_max_index() != t2.get_max_index()) + { + std::cerr << "Error: unequal ranges. " << str << std::endl; + return everything_ok = false; + } + + for (int i=t1.get_min_index(); i<= t1.get_max_index(); i++) + { + if(!check_if_equal(t1[i], t2[i], str)) + { + std::cerr << "(at VectorWithOffset<" << typeid(T).name() << "> first mismatch at index " << i << ")\n"; + return false; + } + } + return true; + } + // VC 6.0 needs definition of template members in the class def unfortunately. + //! check equality by comparing size and calling check_if_equal on all elements + template + bool check_if_equal(const std::vector& t1, const std::vector& t2, + const std::string& str = "") + { + if (t1.size() != t2.size()) + { + std::cerr << "Error: unequal ranges. " << str << std::endl; + return everything_ok = false; + } + + bool all_equal=true; + for (unsigned int i=0; i< t1.size(); i++) + { + if(!check_if_equal(t1[i], t2[i], str)) + { + std::cerr << "(at vector<" << typeid(T).name() << "> mismatch at index " << i << ")\n"; + all_equal=false; + } + } + return all_equal; + } + + // VC 6.0 needs definition of template members in the class def unfortunately. + template + bool check_if_equal(const IndexRange& t1, const IndexRange& t2, + const std::string& str = "") + { + if (t1 != t2) + { + std::cerr << "Error: unequal ranges. " << str << std::endl; + return everything_ok = false; + } + else + return true; + } + //! check equality by comparing norm(a-b) with tolerance + template + bool + check_if_equal(const BasicCoordinate& a, + const BasicCoordinate& b, + const std::string& str = "" ) + { + if (norm(a-b) > tolerance) + { + std::cerr << "Error : Unequal Coordinate value are " + << a << " and " << b << ". " << str << std::endl; + everything_ok = false; + return false; + } + else + return true; + } + //@} + + /*! \name Test if a value is zero + float/double/complex numbers are compared using \c tolerance. + \see check() + */ + //@{ + bool check_if_zero(const double a, const std::string& str = ""); + bool check_if_zero(const short a, const std::string& str = ""); + bool check_if_zero(const unsigned short a, const std::string& str = ""); + bool check_if_zero(const int a, const std::string& str = ""); + bool check_if_zero(const unsigned int a, const std::string& str = ""); + bool check_if_zero(const long a, const std::string& str = ""); + bool check_if_zero(const unsigned long a, const std::string& str = ""); +#ifdef BOOST_HAS_LONG_LONG + bool check_if_zero(const long long a, const std::string& str = ""); + bool check_if_zero(const unsigned long long a, const std::string& str = ""); +#endif + + // VC needs definition of template members in the class def unfortunately. + //! use check_if_zero on all elements + template + bool check_if_zero(const VectorWithOffset& t, const std::string& str = "") + { + for (int i=t.get_min_index(); i<= t.get_max_index(); i++) + { + if(!check_if_zero(t[i], str)) + { + std::cerr << "(at VectorWithOffset<" << typeid(T).name() << "> first mismatch at index " << i << ")\n"; + return false; + } + } + return true; + } + + //! compare norm with tolerance + template + bool + check_if_zero(const BasicCoordinate& a, const std::string& str = "" ) + { + if (norm(a) > tolerance) + { + std::cerr << "Error : Coordinate value is " << a<< " expected 0s. " << str << std::endl; + everything_ok = false; + return false; + } + else + return true; + } + //@} + + +protected: + //! tolerance for comparisons with real values + double tolerance; + //! variable storing current status + bool everything_ok; + + //! function that is called by some check_if_equal implementations. It just uses operator!= + template + bool + check_if_equal_generic(const T& a, const T& b, const std::string& str) + { + if (a != b) + { + std::cerr << "Error : unequal values are " << a << " and " << b + << ". " << str<< std::endl; + everything_ok = false; + return false; + } + else + return true; + } + + //! function that is called by some check_if_zero implementations. It just uses operator!= + template + bool + check_if_zero_generic(T a, const std::string& str) + { + if ((a!=static_cast(0))) + { + std::cerr << "Error : 0 value is " << a << " ." << str << std::endl; + everything_ok = false; + return false; + } + else + return true; + } + +}; + +END_NAMESPACE_STIR + + +START_NAMESPACE_STIR + +RunTests::RunTests(const double tolerance) + : tolerance(tolerance), everything_ok(true) +{} + +RunTests::~RunTests() +{ +#if defined(_DEBUG) && defined(__MSL__) + DebugNewReportLeaks(); +#endif + + if (everything_ok) + std::cerr << "\nAll tests ok !\n\n" << std::endl; + else + std::cerr << "\nEnd of tests. Please correct errors !\n\n" << std::endl; +} + +bool RunTests::is_everything_ok() const +{ return everything_ok ; } + +int RunTests::main_return_value() const +{ return everything_ok ? EXIT_SUCCESS : EXIT_FAILURE; } + +void RunTests::set_tolerance(const double tolerance_v) +{ + tolerance = tolerance_v; +} + +double RunTests::get_tolerance() const +{ return tolerance; } + +bool RunTests::check(const bool result, const std::string& str) +{ + if (!result) + { + std::cerr << "Error. " << str << std::endl; + everything_ok = false; + } + return result; +} + + +/*! tolerance is used to account for floating point rounding error. Equality is checked using +\code +((fabs(b)>tolerance && fabs(a/b-1) > tolerance) + || (fabs(b)<=tolerance && fabs(a-b) > tolerance)) +\endcode +*/ +bool +RunTests::check_if_equal(const double a, const double b, const std::string& str) +{ + if ((fabs(b)>tolerance && fabs(a/b-1) > tolerance) + || (fabs(b)<=tolerance && fabs(a-b) > tolerance)) + { + std::cerr << "Error : unequal values are " << a << " and " << b + << ". " << str<< std::endl; + everything_ok = false; + return false; + } + else + return true; +} + + +bool RunTests::check_if_equal(const short a, const short b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +bool RunTests::check_if_equal(const unsigned short a, const unsigned short b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +bool RunTests::check_if_equal(const int a, const int b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +bool RunTests::check_if_equal(const unsigned int a, const unsigned int b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +bool RunTests::check_if_equal(const long a, const long b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +bool RunTests::check_if_equal(const unsigned long a, const unsigned long b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +#ifdef BOOST_HAS_LONG_LONG +bool RunTests::check_if_equal(const long long a, const long long b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +bool RunTests::check_if_equal(const unsigned long long a, const unsigned long long b, const std::string& str) +{ return this->check_if_equal_generic(a,b,str);} +#endif + +bool RunTests::check_if_zero(const short a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +bool RunTests::check_if_zero(const unsigned short a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +bool RunTests::check_if_zero(const int a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +bool RunTests::check_if_zero(const unsigned int a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +bool RunTests::check_if_zero(const long a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +bool RunTests::check_if_zero(const unsigned long a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +#ifdef BOOST_HAS_LONG_LONG +bool RunTests::check_if_zero(const long long a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +bool RunTests::check_if_zero(const unsigned long long a, const std::string& str) +{ return this->check_if_zero_generic(a,str);} +#endif + +/*! check if \code fabs(a)<=tolerance \endcode */ +bool +RunTests::check_if_zero(const double a, const std::string& str ) +{ + if (fabs(a) > tolerance) + { + std::cerr << "Error : 0 value is " << a << " ." << str<< std::endl; + everything_ok = false; + return false; + } + else + return true; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/SSRB.h b/src/include/stir/SSRB.h new file mode 100644 index 0000000000..f441e96a1f --- /dev/null +++ b/src/include/stir/SSRB.h @@ -0,0 +1,143 @@ +// +// +/*! + + \file + \ingroup projdata + \brief Declaration of stir::SSRB functions + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_SSRB_H__ +#define __stir_SSRB_H__ + +#include "stir/common.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +class ProjData; +class ProjDataInfo; + +//! construct new ProjDataInfo that is appropriate for rebinned data +/*! + \ingroup projdata + \param in_proj_data_info input projection data information. + \param num_segments_to_combine how many segments will be combined into 1 output segment. + \param num_views_to_combine how many views will be combined in the output + (i.e. mashing) + \param num_tangential_poss_to_trim can be used to throw + away some bins. Half of the bins will be thrown away at each 'side' of a sinogram (see below). + \param max_in_segment_num_to_process rebinned in_proj_data only upto this segment. + Default value -1 means 'do all segments'. + + The original SSRB algorithm was developed in M.E. Daube-Witherspoon and + G. Muehllehner, (1987) Treatment of axial data in three-dimensional PET, + J. Nucl. Med. 28, 171-1724. It essentially ignores the obliqueness of a + Line of Response and moves data to the axial position in segment 0 such + that z-resolution on the axis of the scanner is preserved. + + The STIR implementation of SSRB is a generalisation that applies the same + idea while still allowing preserving some of the obliqueness. For instance, + for a dataset with 9 segments, SSRB can produce a new dataset with only 3 + segments. This essentially increases the axial compression (or span in CTI + terminology), see the STIR Glossary on axial compression. In addition, SSRB + can introduce extra mashing (see the STIR Glossary) of the data, i.e. add + views together. + + Here is how to determine which bins are discarded when trimming is used. + For a certain num_tangential_poss, the range is from +\verbatim + -(num_tangential_poss/2) to -(num_tangential_poss/2) + num_tangential_poss - 1. +\endverbatim + The new num_tangential_poss is simply set to old_num_tangential_poss - + num_tang_poss_to_trim. Note that because of this, if num_tang_poss_to_trim is + negative, more (zero) bins will be added. + + \warning in_proj_data_info has to be (at least) of type ProjDataInfoCylindrical + \warning This function can only handle in_proj_data_info where all segments have + identical 'num_segments_to_combine'. So it cannot handle standard + GE Advance data. + \todo get rid of both restrictions flagged as warnings in the documentation for this function. +*/ +ProjDataInfo * +SSRB(const ProjDataInfo& in_proj_data_info, + const int num_segments_to_combine, + const int num_views_to_combine = 1, + const int num_tangential_poss_to_trim = 0, + const int max_in_segment_num_to_process=-1 + ); + +//! Perform Single Slice Rebinning and write output to file +/*! + \ingroup projdata + \param output_filename filename to write output projection data (will be in + Interfile format) + \param in_projdata input data + \param num_segments_to_combine how many segments will be combined into 1 output segment. + \param max_in_segment_num_to_process rebinned in_proj_data only upto this segment. + Default value -1 means 'do all segments'. + \param do_normalisation (default true) wether to normalise the output sinograms + corresponding to how many input sinograms contribute to them. + + \see SSRB(const ProjDataInfo& in_proj_data_info, + const int num_segments_to_combine, + const int num_views_to_combine, + const int num_tang_poss_to_trim, + const int max_in_segment_num_to_process + ) for restrictions + */ +void +SSRB(const string& output_filename, + const ProjData& in_projdata, + const int num_segments_to_combine, + const int num_views_to_combine = 1, + const int num_tangential_poss_to_trim = 0, + const bool do_normalisation = true, + const int max_in_segment_num_to_process = -1 + ); + +//! Perform Single Slice Rebinning and write output to ProjData +/*! + \ingroup projdata + \param out_projdata Output projection data. Its projection_data_info is used to + determine output characteristics. Data will be 'put' in here using + ProjData::set_sinogram(). + \param in_projdata input data + \param do_normalisation (default true) wether to normalise the output sinograms + corresponding to how many input sinograms contribute to them. + + \warning in_proj_data_info has to be (at least) of type ProjDataInfoCylindrical +*/ +void +SSRB(ProjData& out_projdata, + const ProjData& in_projdata, + const bool do_normalisation = true + ); + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/Scanner.h b/src/include/stir/Scanner.h new file mode 100644 index 0000000000..470866d111 --- /dev/null +++ b/src/include/stir/Scanner.h @@ -0,0 +1,394 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2010, Hammersmith Imanet Ltd + Copyright (C) 2011-2013, King's College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup buildblock + + \brief Declaration of class stir::Scanner + + \author Claire Labbe + \author Kris Thielemans + \author Sanida Mustafovic + \author Charalampos Tsoumpas + \author PARAPET project +*/ +#ifndef __stir_buildblock_SCANNER_H__ +#define __stir_buildblock_SCANNER_H__ + +#include "stir/DetectionPosition.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::list; +#endif + +START_NAMESPACE_STIR + +class Succeeded; + +/*! + \ingroup buildblock + \brief A class for storing some info on the scanner + + This class stores geometrical info etc on the scanner. + \warning Currently really only appropriate for cylindrical PET scanners + + \par information on blocks, buckets etc + This class gives some informations on crystals, blocks etc. However, this + is currently (i.e. at least up to STIR 2.1) used in very few places. + For ECAT scanners, this information is used to read the normalisation .n + files and computed dead-time correction etc. For all other scanners, STIR + currently ignores this info. This might change in the future of course. + + At present, these functions follow CTI terminology, but the concepts + are similar for other scanners. + + \li \c crystal the smallest detection unit + \li \c block several crystals are grouped in a block, this can be in + 3 dimensions (see layer). This information could be useful for finding the + geometry of the scanner, but we would plenty more + size info presumably. + \li \c layer Some scanners have multiple layers of detectors to give + Depth Of Interaction information + \li \c bucket several \c blocks send detected events to one \c bucket. + This has consequences for the dead-time modelling. For instance, + one bucket could have much more singles than another, and hence + presumably higher singles-dead-time. + \li \c singles_unit (non-standard terminology) + Most scanners report the singles detected during the acquisition. + Some scanners (such as GE scanners) report singles for every crystal, + while others (such as CTI scanners) give only singles for a + collection of blocks. A \c singles_unit is then a set of crystals + for which we can get singles rates. + + \warning This information is only sensible for discrete detector-based scanners. + \todo Some scanners do not have all info filled in at present. Values are then + set to 0. + + \todo + a hierarchy distinguishing between different types of scanners + \todo derive from ParsingObject +*/ +class Scanner +{ + public: + + /************* static members*****************************/ + static Scanner * ask_parameters(); + + //! get the scanner pointer from the name + static Scanner * get_scanner_from_name(const string& name); + //! get the list of all names for the particular scanner + static string list_all_names(); + + // E931 HAS to be first, Unknown_scanner HAS to be last + // also, the list HAS to be consecutive (so DO NOT assign numbers here) + // finally, test_Scanner assumes E966 is the last in the list of CTI scanners + // supported by ecat_model from the LLN matrix library + // 08-3-2004, zlong, add user defined scanner + //! enum for all predefined scanners + /* \a Userdefined_scanner can be used to set arbitrary scanner geometry info. + \a Unknown_scanner will be used when parsing (e.g. from an Interfile header) + to flag up an error and do some guess work in trying to recognise the scanner from + any given parameters. + */ + enum Type {E931, E951, E953, E921, E925, E961, E962, E966, E1080, Siemens_mMR, RPT,HiDAC, + Advance, DiscoveryLS, DiscoveryST, DiscoverySTE, DiscoveryRX, Discovery600, + HZLR, RATPET, PANDA, HYPERimage, nanoPET, HRRT, Allegro, GeminiTF, User_defined_scanner, + Unknown_scanner}; + + //! constructor that takes scanner type as an input argument + Scanner(Type scanner_type); + + + //! constructor -(list of names) + /*! size info is in mm + \param intrinsic_tilt_v value in radians, \see get_default_intrinsic_tilt() + \warning calls error() when block/bucket info are inconsistent + */ + Scanner(Type type_v, const list& list_of_names_v, + int num_detectors_per_ring_v, int num_rings_v, + int max_num_non_arccorrected_bins_v, + int default_num_arccorrected_bins_v, + float inner_ring_radius_v, float average_depth_of_interaction_v, + float ring_spacing_v, float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v); + + //! constructor ( a single name) + /*! size info is in mm + \param intrinsic_tilt value in radians, \see get_default_intrinsic_tilt() + \warning calls error() when block/bucket info are inconsistent + */ + Scanner(Type type_v, const string& name, + int num_detectors_per_ring_v, int num_rings_v, + int max_num_non_arccorrected_bins_v, + int default_num_arccorrected_bins_v, + float inner_ring_radius_v, float average_depth_of_interaction_v, + float ring_spacing_v, float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v); + + + + //! get scanner parameters as a string + string parameter_info() const; + //! get the scanner name + const string& get_name() const; + //! get all scanner names as a list of strings + const list& get_all_names() const; + //! get all scanner names as a string + string list_names() const; + + //! comparison operator + bool operator ==(const Scanner& scanner) const; + inline bool operator !=(const Scanner& scanner) const; + + //! get scanner type + inline Type get_type() const; + //! checks consistency + /*! Calls warning() with diagnostics when there are problems + */ + Succeeded check_consistency() const; + + //! \name Functions returning geometrical info + //@{ + + //! get number of rings + inline int get_num_rings() const; + //! get the number of detectors per ring + inline int get_num_detectors_per_ring() const; + //! get the maximum number of arccorrected tangential positions + /*! \warning name is not in standard STIR terminology. Should be + \c get_max_num_non_arccorrected_tangential_poss() or so. + Even better would be to replace it by a name relating + to the number of detectors that are in coincidence with a + a single detector in the ring, as that is the physical + reason why there is a maximum number anyway. + \todo change name + */ + inline int get_max_num_non_arccorrected_bins() const; + //! get the default number of arccorrected tangential positions + /*! \warning name is not in standard STIR terminology. Should be + \c get_max_default_num_arccorrected_tangential_poss() or so. + \todo change name, mabe refering to the fan of detectors + in coincidence or so + */ + inline int get_default_num_arccorrected_bins() const; + //! get maximum number of views + /*! This is simply get_num_detectors_per_ring()/2 */ + inline int get_max_num_views() const; + //! get inner ring radius + inline float get_inner_ring_radius() const; + //! get effective ring radius + inline float get_effective_ring_radius() const; + //! get average depth of interaction + inline float get_average_depth_of_interaction() const; + //! get ring spacing + inline float get_ring_spacing() const; + //! get default arc-corrected bin size + inline float get_default_bin_size() const; + //! get intrinsic tilt in raw sinogram data (in radians) + /*! Some scanners construct sinograms where the first view does not + correspond to the vertical. This angle tells you how much the + image will be rotated when this tilt is ignored in the reconstruction + algorithm. It uses the same coordinate system as ProjDataInfo::get_phi(). + + \todo we still have to decide if ProjDataInfo::get_phi() will take + this tilt into account or not. At present, STIR ignores the intrinsic tilt. + */ + inline float get_default_intrinsic_tilt() const; + //! \name Info on crystals per block etc. + //@{ + //! get number of transaxial blocks per bucket + inline int get_num_transaxial_blocks_per_bucket() const; + //! get number of axial blocks per bucket + inline int get_num_axial_blocks_per_bucket() const; + //! get number of crystals in the axial direction + inline int get_num_axial_crystals_per_block() const; + //! get number of transaxial crystals + inline int get_num_transaxial_crystals_per_block() const; + //! get crystals in a bucket + inline int get_num_transaxial_crystals_per_bucket() const; + //! get crystals in a bucket + inline int get_num_axial_crystals_per_bucket() const; + //! get number of crystal layers (for DOI) + inline int get_num_detector_layers() const; + //! get number of axial blocks + inline int get_num_axial_blocks() const; + //! get number of axial blocks + inline int get_num_transaxial_blocks() const; + //! get number of axial buckets + inline int get_num_axial_buckets() const; + //! get number of axial buckets + inline int get_num_transaxial_buckets() const; + + //! get number of axial crystals per singles unit + inline int get_num_axial_crystals_per_singles_unit() const; + //! get number of transaxial crystals per singles unit. + inline int get_num_transaxial_crystals_per_singles_unit() const; + // TODO accomodate more complex geometries of singles units. + /* inline int get_num_crystal_layers_per_singles_unit() const; */ + //! get number of axial singles units + inline int get_num_axial_singles_units() const; + //! get number of transaxial singles unit + inline int get_num_transaxial_singles_units() const; + /* inline int get_num_layers_singles_units() const; */ + inline int get_num_singles_units() const; + + + //@} (end of block/bucket info) + + //@} (end of get geometrical info) + + //! \name Functions setting info + /*! Be careful to keep consistency by setting all relevant parameters*/ + //@{ + // zlong, 08-04-2004, add set_methods + //! set scanner type + inline void set_type(const Type & new_type); + //! set number of rings + inline void set_num_rings(const int & new_num); + //! set the namber of detectors per ring + inline void set_num_detectors_per_ring(const int & new_num) ; + //! set the maximum number of arccorrected bins + inline void set_max_num_non_arccorrected_bins(const int & new_num) ; + //! set the default number of arccorrected_bins + inline void set_default_num_arccorrected_bins(const int & new_num) ; + //! set inner ring radius + inline void set_inner_ring_radius(const float & new_radius); + //! set average depth of interaction + inline void set_average_depth_of_interaction(const float& new_depth_of_interaction); + //! set ring spacing + inline void set_ring_spacing(const float & new_spacing); + //! set default arc-corrected bin size + inline void set_default_bin_size(const float &new_size); + //! in degrees + inline void set_default_intrinsic_tilt(const float & new_tilt); + //! \name Info on crystals per block etc. + //@{ + //! set number of transaxial blocks per bucket + inline void set_num_transaxial_blocks_per_bucket(const int & new_num); + //! set number of axial blocks per bucket + inline void set_num_axial_blocks_per_bucket(const int & new_num); + //! set number of crystals in the axial direction + inline void set_num_axial_crystals_per_block(const int & new_num); + //! set number of transaxial crystals + inline void set_num_transaxial_crystals_per_block(const int & new_num); + //! set number of crystal layers (for DOI) + inline void set_num_detector_layers(const int& new_num); + //! set number of axial crystals per singles unit + inline void set_num_axial_crystals_per_singles_unit(const int & new_num); + //! set number of transaxial crystals per singles unit + inline void set_num_transaxial_crystals_per_singles_unit(const int & new_num); + // TODO accomodate more complex geometries of singles units. + + //@} (end of block/bucket info) + + //@} (end of set info) + + // Calculate a singles bin index from axial and transaxial singles bin coordinates. + inline int get_singles_bin_index(int axial_index, int transaxial_index) const; + + // Method used to calculate a singles bin index from + // a detection position. + inline int get_singles_bin_index(const DetectionPosition<>& det_pos) const; + + + // Get the axial singles bin coordinate from a singles bin. + inline int get_axial_singles_unit(int singles_bin_index) const; + + // Get the transaxial singles bin coordinate from a singles bin. + inline int get_transaxial_singles_unit(int singles_bin_index) const; + + +private: + Type type; + list list_of_names; + int num_rings; /* number of direct planes */ + int max_num_non_arccorrected_bins; + int default_num_arccorrected_bins; /* default number of bins */ + int num_detectors_per_ring; + + float inner_ring_radius; /*! detector inner radius in mm*/ + float average_depth_of_interaction; /*! Average interaction depth in detector crystal */ + float ring_spacing; /*! ring separation in mm*/ + float bin_size; /*! arc-corrected bin size in mm (spacing of transaxial elements) */ + float intrinsic_tilt; /*! intrinsic tilt in radians*/ + + int num_transaxial_blocks_per_bucket; /* transaxial blocks per bucket */ + int num_axial_blocks_per_bucket; /* axial blocks per bucket */ + int num_axial_crystals_per_block; /* number of crystals in the axial direction */ + int num_transaxial_crystals_per_block;/* number of transaxial crystals */ + int num_detector_layers; + + int num_axial_crystals_per_singles_unit; + int num_transaxial_crystals_per_singles_unit; + + + // ! set all parameters, case where default_num_arccorrected_bins==max_num_non_arccorrected_bins + void set_params(Type type_v, const list& list_of_names_v, + int num_rings_v, + int max_num_non_arccorrected_bins_v, + int num_detectors_per_ring_v, + float inner_ring_radius_v, + float average_depth_of_interaction_v, + float ring_spacing_v, + float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v); + + // ! set all parameters + void set_params(Type type_v, const list& list_of_names_v, + int num_rings_v, + int max_num_non_arccorrected_bins_v, + int default_num_arccorrected_bins_v, + int num_detectors_per_ring_v, + float inner_ring_radius_v, + float average_depth_of_interaction_v, + float ring_spacing_v, + float bin_size_v, float intrinsic_tilt_v, + int num_axial_blocks_per_bucket_v, int num_transaxial_blocks_per_bucket_v, + int num_axial_crystals_per_block_v, int num_transaxial_crystals_per_block_v, + int num_axial_crystals_per_singles_unit_v, + int num_transaxial_crystals_per_singles_unit_v, + int num_detector_layers_v); + + +}; + +END_NAMESPACE_STIR + +#include "stir/Scanner.inl" + +#endif + diff --git a/src/include/stir/Scanner.inl b/src/include/stir/Scanner.inl new file mode 100644 index 0000000000..3387695ff6 --- /dev/null +++ b/src/include/stir/Scanner.inl @@ -0,0 +1,366 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief implementation of inline functions of class Scanner + + \author Sanida Mustafovic + \author Kris Thielemans + \author Long Zhang (set*() functions) + \author PARAPET project + + +*/ + +START_NAMESPACE_STIR + +bool +Scanner::operator !=(const Scanner& scanner) const +{ + return !(*this == scanner); +} + +Scanner::Type +Scanner::get_type() const +{return type;} + +int +Scanner::get_num_rings() const +{ return num_rings;} +int +Scanner::get_num_detectors_per_ring() const +{ + return num_detectors_per_ring;} +int +Scanner::get_max_num_non_arccorrected_bins() const +{ return max_num_non_arccorrected_bins;} + +int +Scanner::get_max_num_views() const +{ return get_num_detectors_per_ring()/2; } + +int +Scanner::get_default_num_arccorrected_bins() const +{ + return default_num_arccorrected_bins; +} + +float +Scanner::get_inner_ring_radius() const +{ + return inner_ring_radius; +} + +float +Scanner::get_average_depth_of_interaction() const +{ + return average_depth_of_interaction; +} + + +float +Scanner::get_effective_ring_radius() const +{ + return inner_ring_radius + average_depth_of_interaction; +} + + +float +Scanner::get_ring_spacing() const +{ + return ring_spacing; +} + + +float +Scanner::get_default_bin_size() const +{ return bin_size;} + +float +Scanner::get_default_intrinsic_tilt() const +{ + return intrinsic_tilt;} + +int +Scanner::get_num_transaxial_blocks_per_bucket() const +{ + return num_transaxial_blocks_per_bucket; +} + +int +Scanner::get_num_axial_blocks_per_bucket() const +{ + return num_axial_blocks_per_bucket; +} + +int +Scanner::get_num_axial_crystals_per_block() const +{ + return num_axial_crystals_per_block; +} + +int +Scanner::get_num_transaxial_crystals_per_block()const +{ + return num_transaxial_crystals_per_block; +} + + +int +Scanner::get_num_axial_crystals_per_bucket() const +{ + return + get_num_axial_blocks_per_bucket() * + get_num_axial_crystals_per_block(); +} + + +int +Scanner::get_num_transaxial_crystals_per_bucket() const +{ + return + get_num_transaxial_blocks_per_bucket() * + get_num_transaxial_crystals_per_block(); +} + +int +Scanner::get_num_detector_layers() const +{ + return num_detector_layers; +} + +int +Scanner::get_num_axial_blocks() const +{ + return num_rings/num_axial_crystals_per_block; +} + +int +Scanner::get_num_transaxial_blocks() const +{ + return num_detectors_per_ring/num_transaxial_crystals_per_block; +} + +int +Scanner::get_num_axial_buckets() const +{ + return get_num_axial_blocks()/num_axial_blocks_per_bucket; +} + +int +Scanner::get_num_transaxial_buckets() const +{ + return get_num_transaxial_blocks()/num_transaxial_blocks_per_bucket; +} + + + +int +Scanner::get_num_axial_crystals_per_singles_unit() const +{ + return num_axial_crystals_per_singles_unit; +} + +int +Scanner::get_num_transaxial_crystals_per_singles_unit() const +{ + return num_transaxial_crystals_per_singles_unit; +} + + +int +Scanner::get_num_axial_singles_units() const +{ + if ( num_axial_crystals_per_singles_unit == 0 ) { + return 0; + } else { + return num_rings / num_axial_crystals_per_singles_unit; + } +} + + +int +Scanner::get_num_transaxial_singles_units() const +{ + if ( num_transaxial_crystals_per_singles_unit == 0 ) { + return 0; + } else { + return num_detectors_per_ring / num_transaxial_crystals_per_singles_unit; + } +} + + +int +Scanner::get_num_singles_units () const +{ + // TODO Accomodate more complex (multi-layer) geometries. + return get_num_axial_singles_units() * get_num_transaxial_singles_units(); +} + + + + + + +//************************ set ******************************8 + +void Scanner::set_type(const Type & new_type) +{ + type = new_type; +} + +void Scanner::set_num_rings(const int & new_num) +{ + num_rings = new_num; +} + +void Scanner::set_num_detectors_per_ring(const int & new_num) +{ + num_detectors_per_ring = new_num; +} + +void Scanner::set_max_num_non_arccorrected_bins(const int& new_num) +{ + max_num_non_arccorrected_bins = new_num; +} + +void Scanner::set_default_num_arccorrected_bins(const int& new_num) +{ + default_num_arccorrected_bins = new_num; +} + + +void Scanner::set_inner_ring_radius(const float & new_radius) +{ + inner_ring_radius = new_radius; +} + +void Scanner::set_average_depth_of_interaction(const float & new_depth_of_interaction) +{ + average_depth_of_interaction = new_depth_of_interaction; +} + + + +void Scanner::set_ring_spacing(const float& new_spacing) +{ + ring_spacing = new_spacing; +} + +void Scanner::set_default_bin_size(const float & new_size) +{ + bin_size = new_size; +} + +void Scanner::set_default_intrinsic_tilt(const float & new_tilt) +{ + intrinsic_tilt = new_tilt; +} + +void Scanner::set_num_transaxial_blocks_per_bucket(const int& new_num) +{ + num_transaxial_blocks_per_bucket = new_num; +} + +void Scanner::set_num_axial_blocks_per_bucket(const int& new_num) +{ + num_axial_blocks_per_bucket = new_num; +} + +void Scanner::set_num_detector_layers(const int& new_num) +{ + num_detector_layers = new_num; +} + + +void Scanner::set_num_axial_crystals_per_block(const int& new_num) +{ + num_axial_crystals_per_block = new_num; +} + +void Scanner::set_num_transaxial_crystals_per_block(const int& new_num) +{ + num_transaxial_crystals_per_block = new_num; +} + + + +void Scanner::set_num_axial_crystals_per_singles_unit(const int& new_num) +{ + num_axial_crystals_per_singles_unit = new_num; +} + +void Scanner::set_num_transaxial_crystals_per_singles_unit(const int& new_num) +{ + num_transaxial_crystals_per_singles_unit = new_num; +} + + + + +/******** Calculate singles bin index from detection position *********/ + + +int +Scanner::get_singles_bin_index(int axial_index, int transaxial_index) const { + // TODO: Accomodate more complex geometry. + return(transaxial_index + (axial_index * get_num_transaxial_singles_units())); +} + + + +int +Scanner::get_singles_bin_index(const DetectionPosition<>& det_pos) const { + + // TODO: Accomodate more complex geometry. + + int axial_index = det_pos.axial_coord() / get_num_axial_crystals_per_singles_unit(); + + int transaxial_index = det_pos.tangential_coord() / + get_num_transaxial_crystals_per_singles_unit(); + + //return(transaxial_index + (axial_index * get_num_transaxial_singles_units())); + return(get_singles_bin_index(axial_index, transaxial_index)); + +} + + + +// Get the axial singles bin coordinate from a singles bin. +int +Scanner::get_axial_singles_unit(int singles_bin_index) const { + // TODO: Accomodate more complex geometry. + return(singles_bin_index / get_num_transaxial_singles_units()); +} + + + +// Get the transaxial singles bin coordinate from a singles bin. +int +Scanner::get_transaxial_singles_unit(int singles_bin_index) const { + // TODO: Accomodate more complex geometry. + return(singles_bin_index % get_num_transaxial_singles_units()); +} + + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/Segment.h b/src/include/stir/Segment.h new file mode 100644 index 0000000000..4669143bb9 --- /dev/null +++ b/src/include/stir/Segment.h @@ -0,0 +1,135 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2012 Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Declaration of class stir::Segment + + \author Kris Thielemans + \author PARAPET project +*/ +#ifndef __Segment_H__ +#define __Segment_H__ + + +#include "stir/ProjDataInfo.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR +template class Sinogram; +template class Viewgram; + + +/*! + \brief An (abstract base) class for storing 3d projection data + \ingroup projdata + + This stores a subset of the data accessible via a ProjData object, + where the segment_num is fixed. + + At the moment, 2 'storage modes' are supported (and implemented as + derived classes). + + The template argument \c elemT is used to specify the data-type of the + elements of the 3d object. + */ + +template +class Segment +{ +#ifdef SWIG + // need to make typedef public for swig + public: +#endif + typedef Segment self_type; +public: + + enum StorageOrder{ StorageByView, StorageBySino }; + + virtual ~Segment() {} + //! Get the proj data info pointer + inline const ProjDataInfo* get_proj_data_info_ptr() const; + + virtual StorageOrder get_storage_order() const = 0; + //! Get the segment number + inline int get_segment_num() const; + virtual int get_min_axial_pos_num() const = 0; + virtual int get_max_axial_pos_num() const = 0; + virtual int get_min_view_num() const = 0; + virtual int get_max_view_num() const = 0; + virtual int get_min_tangential_pos_num() const = 0; + virtual int get_max_tangential_pos_num() const = 0; + virtual int get_num_axial_poss() const = 0; + + virtual int get_num_views() const = 0; + virtual int get_num_tangential_poss() const = 0; + + //! return a new sinogram, with data set as in the segment + virtual Sinogram get_sinogram(int axial_pos_num) const = 0; + //! return a new viewgram, with data set as in the segment + virtual Viewgram get_viewgram(int view_num) const = 0; + + //! set data in segment according to sinogram \c s + virtual void set_sinogram(const Sinogram& s) = 0; + //! set sinogram at a different axial_pos_num + virtual void set_sinogram(const Sinogram &s, int axial_pos_num) = 0; + //! set data in segment according to viewgram \c v + virtual void set_viewgram(const Viewgram& v) = 0; + + //! \name Equality + //@{ + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! If they do \c not have the same characteristics, the string \a explanation + explains why. + */ + bool + has_same_characteristics(self_type const&, + string& explanation) const; + + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! Use this version if you do not need to know why they do not match. + */ + bool + has_same_characteristics(self_type const&) const; + + //! check equality (data has to be identical) + /*! Uses has_same_characteristics() and Array::operator==. + \warning This function uses \c ==, which might not be what you + need to check when \c elemT has data with float or double numbers. + */ + virtual bool operator ==(const self_type&) const = 0; + + //! negation of operator== + bool operator !=(const self_type&) const; + //@} + +protected: + shared_ptr proj_data_info_ptr; + int segment_num; + + inline Segment(const shared_ptr& proj_data_info_ptr_v,const int s_num); +}; + +END_NAMESPACE_STIR + +#include "stir/Segment.inl" + +#endif + + diff --git a/src/include/stir/Segment.inl b/src/include/stir/Segment.inl new file mode 100644 index 0000000000..649d79a283 --- /dev/null +++ b/src/include/stir/Segment.inl @@ -0,0 +1,55 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, IRSL + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief implementation of inline functions of class stir::Segment + + \author Kris Thielemans + \author PARAPET project + + +*/ +#include "stir/Sinogram.h" + +START_NAMESPACE_STIR + +template +Segment:: +Segment( const shared_ptr& proj_data_info_ptr_v,const int s_num) + : + proj_data_info_ptr(proj_data_info_ptr_v), + segment_num(s_num) + {} + +template +int +Segment:: get_segment_num() const +{ return segment_num; } + + +template +const ProjDataInfo* +Segment::get_proj_data_info_ptr() const +{ + return proj_data_info_ptr.get(); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/SegmentBySinogram.h b/src/include/stir/SegmentBySinogram.h new file mode 100644 index 0000000000..b161c4e5e3 --- /dev/null +++ b/src/include/stir/SegmentBySinogram.h @@ -0,0 +1,119 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Declaration of class stir::SegmentBySinogram + + \author Sanida Mustafovic + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project + + +*/ +#ifndef __SegmentBySinogram_H__ +#define __SegmentBySinogram_H__ + +#include "stir/Segment.h" +#include "stir/Array.h" +#include "stir/Sinogram.h" + +START_NAMESPACE_STIR + +//forward declaration for use in convertion +template class SegmentByView; + + +/*! + \ingroup projdata + \brief A class for storing (3d) projection data with a fixed segment_num. + + Storage order is as follows: + \code + segment_by_sino[view_num][axial_pos_num][tangential_pos_num] + \endcode +*/ +template +class SegmentBySinogram : public Segment, public Array<3,elemT> +{ +private: + typedef SegmentBySinogram self_type; + +public: + //! typedef such that we do not need to have \a typename wherever we StorageOrder + typedef typename Segment::StorageOrder StorageOrder; + + //! Constructor that sets the data to a given 3d Array + SegmentBySinogram(const Array<3,elemT>& v, + const shared_ptr& proj_data_info_ptr_v, + const int segment_num); + + //! Constructor that sets sizes via the ProjDataInfo object, initialising data to 0 + SegmentBySinogram(const shared_ptr& proj_data_info_ptr_v, + const int segment_num); + + + //! Conversion from 1 storage order to the other + SegmentBySinogram (const SegmentByView& ); + //! Get storage order + inline StorageOrder get_storage_order() const; + //! Get number of axial positions + inline int get_num_axial_poss() const; + //! Get number of views + inline int get_num_views() const; + //! Get number of tangetial positions + inline int get_num_tangential_poss() const; + //! Get minimum axial position number + inline int get_min_axial_pos_num() const; + //! Get maximum axial position number + inline int get_max_axial_pos_num() const; + //! Get minimum view number + inline int get_min_view_num() const; + //! Get maximum view number + inline int get_max_view_num() const; + //! Get minimum tangetial position number + inline int get_min_tangential_pos_num() const; + //! Get maximum tangential position number + inline int get_max_tangential_pos_num() const; + //! Get sinogram + inline Sinogram get_sinogram(int axial_pos_num) const; + //! Get viewgram + Viewgram get_viewgram(int view_num) const; + //! Set viewgram + void set_viewgram(const Viewgram&); + //! Set sinogram + inline void set_sinogram(Sinogram const &s, int axial_pos_num); + inline void set_sinogram(const Sinogram& s); + + //! Overloading Array::grow + void grow(const IndexRange<3>& range); + //! Overloading Array::resize + void resize(const IndexRange<3>& range); + + virtual bool operator ==(const Segment&) const; +}; + +END_NAMESPACE_STIR + +#include "stir/SegmentBySinogram.inl" +#endif diff --git a/src/include/stir/SegmentBySinogram.inl b/src/include/stir/SegmentBySinogram.inl new file mode 100644 index 0000000000..a6d862714f --- /dev/null +++ b/src/include/stir/SegmentBySinogram.inl @@ -0,0 +1,126 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Implementations of inline functions of class stir::SegmentBySinogram + + \author Sanida Mustafovic + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project + + +*/ + +START_NAMESPACE_STIR + +template +int +SegmentBySinogram ::get_num_axial_poss() const +{ + return this->get_length(); +} + +template +int +SegmentBySinogram::get_min_axial_pos_num() const +{ + return this->get_min_index(); +} + +template +int +SegmentBySinogram::get_max_axial_pos_num() const +{ + return this->get_max_index(); +} + +template +int +SegmentBySinogram::get_num_views() const +{ + return this->get_length()==0 ? 0 : (*this)[get_min_axial_pos_num()].get_length(); +} + +template +int +SegmentBySinogram::get_min_view_num() const +{ + return this->get_length()==0 ? 0 : (*this)[get_min_axial_pos_num()].get_min_index(); +} + +template +int +SegmentBySinogram::get_max_view_num() const +{ +return this->get_length()==0 ? 0 : (*this)[get_min_axial_pos_num()].get_max_index(); +} + +template +int +SegmentBySinogram::get_num_tangential_poss() const +{ + return this->get_length()==0 ? 0 : (*this)[get_min_axial_pos_num()][get_min_view_num()].get_length(); +} + +template +int +SegmentBySinogram::get_min_tangential_pos_num() const +{ + return this->get_length()==0 ? 0 : (*this)[get_min_axial_pos_num()][get_min_view_num()].get_min_index(); +} + +template +int +SegmentBySinogram::get_max_tangential_pos_num() const +{ +return this->get_length()==0 ? 0 : (*this)[get_min_axial_pos_num()][get_min_view_num()].get_max_index(); +} + +template +typename SegmentBySinogram::StorageOrder +SegmentBySinogram:: +get_storage_order() const + { return Segment::StorageBySino; } + +template +Sinogram +SegmentBySinogram:: +get_sinogram(int axial_pos_num) const +{ return Sinogram(Array<3,elemT>::operator[](axial_pos_num), + Segment::proj_data_info_ptr, axial_pos_num, + Segment::get_segment_num()); } + +template +void +SegmentBySinogram:: +set_sinogram(Sinogram const &s, int axial_pos_num) +{ Array<3,elemT>::operator[](axial_pos_num) = s; } + +template +void +SegmentBySinogram:: +set_sinogram(const Sinogram& s) + { set_sinogram(s, s.get_axial_pos_num()); } + +END_NAMESPACE_STIR diff --git a/src/include/stir/SegmentByView.h b/src/include/stir/SegmentByView.h new file mode 100644 index 0000000000..163690a9ff --- /dev/null +++ b/src/include/stir/SegmentByView.h @@ -0,0 +1,123 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANRETTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + \brief Declaration of class stir::SegmentByView + + \author Sanida Mustafovic + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project + + +*/ +#ifndef __stir_SegmentByView_H__ +#define __stir_SegmentByView_H__ + + +#include "stir/Segment.h" +#include "stir/Array.h" +#include "stir/Viewgram.h" + +START_NAMESPACE_STIR + +template class SegmentBySinogram; +template class Sinogram; + +/*! + \ingroup projdata + \brief A class for storing (3d) projection data with a fixed segment_num. + + Storage order is as follows: + \code + segment_by_view[axial_pos_num][view_num][tangential_pos_num] + \endcode +*/ + +template class SegmentByView : public Segment, public Array<3,elemT> +{ +private: + typedef SegmentByView self_type; + +public: + //! typedef such that we do not need to have \a typename wherever we StorageOrder + typedef typename Segment::StorageOrder StorageOrder; + + //! Constructor that sets the data to a given 3d Array + SegmentByView(const Array<3,elemT>& v, + const shared_ptr& proj_data_info_ptr, + const int segment_num); + + //! Constructor that sets sizes via the ProjDataInfo object, initialising data to 0 + SegmentByView(const shared_ptr& proj_data_info_ptr, + const int segment_num); + + + //! Conversion from 1 storage order to the other + SegmentByView(const SegmentBySinogram& ); + + //TODO ? how to declare a conversion routine that works for any Segment ? + //! Get storage order + inline StorageOrder get_storage_order() const; + //! Get view number + inline int get_num_views() const; + //! Get number of axial positions + inline int get_num_axial_poss() const; + //! Get number of tangetial positions + inline int get_num_tangential_poss() const; + //! Get minimum view number + inline int get_min_view_num() const; + //! Get maximum view number + inline int get_max_view_num() const; + //! Get minimum axial position number + inline int get_min_axial_pos_num() const; + //! Get maximum axial positin number + inline int get_max_axial_pos_num() const; + //! Get minimum tangential position + inline int get_min_tangential_pos_num() const; + //! Get maximum tangetial position number + inline int get_max_tangential_pos_num() const; + + //! Get sinogram + Sinogram get_sinogram(int axial_pos_num) const; + //! Get viewgram + inline Viewgram get_viewgram(int view_num) const; + //! Set sinogram + inline void set_sinogram(const Sinogram &s); + //! Set sinogram + void set_sinogram(Sinogram const &s, int axial_pos_num); + //! Set viewgram + inline void set_viewgram(const Viewgram &v); + + //! Overloading Array::grow + void grow(const IndexRange<3>& range); + //! Overloading Array::resize + void resize(const IndexRange<3>& range); + + virtual bool operator ==(const Segment&) const; +}; + +END_NAMESPACE_STIR + +#include "stir/SegmentByView.inl" + +#endif diff --git a/src/include/stir/SegmentByView.inl b/src/include/stir/SegmentByView.inl new file mode 100644 index 0000000000..3ecbf127cd --- /dev/null +++ b/src/include/stir/SegmentByView.inl @@ -0,0 +1,122 @@ +// +// +/*! + + \file + \ingroup projdata + + \brief Implementations of inline functions of class stir::SegmentByView + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmtih Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +template +int +SegmentByView::get_num_views() const +{ + return this->get_length(); +} + +template +int +SegmentByView::get_min_view_num() const +{ + return this->get_min_index(); +} + +template +int +SegmentByView::get_max_view_num() const +{ + return this->get_max_index(); +} + +template +int +SegmentByView::get_num_axial_poss() const + { + return this->get_length()==0 ? 0 : (*this)[get_min_view_num()].get_length(); + } + +template +int +SegmentByView::get_min_axial_pos_num() const +{ + return this->get_length()==0 ? 0 : (*this)[get_min_view_num()].get_min_index(); +} + +template +int +SegmentByView::get_max_axial_pos_num() const +{ + return this->get_length()==0 ? 0 : (*this)[get_min_view_num()].get_max_index(); +} + +template +int +SegmentByView::get_num_tangential_poss() const +{ + return this->get_length()==0 ? 0 : (*this)[get_min_view_num()][get_min_axial_pos_num()].get_length(); +} + +template +int +SegmentByView::get_min_tangential_pos_num() const +{ +return this->get_length()==0 ? 0 : (*this)[get_min_view_num()][get_min_axial_pos_num()].get_min_index(); +} + +template +int +SegmentByView::get_max_tangential_pos_num()const +{ +return this->get_length()==0 ? 0 : (*this)[get_min_view_num()][get_min_axial_pos_num()].get_max_index(); +} + +template +typename SegmentByView::StorageOrder +SegmentByView::get_storage_order() const +{ return Segment::StorageByView; } + +template +Viewgram +SegmentByView::get_viewgram(int view_num) const +{ + return Viewgram(Array<3,elemT>::operator[](view_num), + this->proj_data_info_ptr->create_shared_clone(), view_num, + this->get_segment_num()); } + +template +void +SegmentByView::set_sinogram(const Sinogram &s) +{ set_sinogram(s, s.get_axial_pos_num()); } + +template +void +SegmentByView::set_viewgram(const Viewgram &v/*, int view_num*/) +{ Array<3,elemT>::operator[](v.get_view_num()) = v; } + +END_NAMESPACE_STIR diff --git a/src/include/stir/SeparableArrayFunctionObject.h b/src/include/stir/SeparableArrayFunctionObject.h new file mode 100644 index 0000000000..32e0c450a1 --- /dev/null +++ b/src/include/stir/SeparableArrayFunctionObject.h @@ -0,0 +1,87 @@ +// +// +/*! + \file + \ingroup Array + \brief Declaration of class stir::SeparableArrayFunctionObject + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#ifndef __stir_SeparableArrayFunctionObject_H__ +#define __stir_SeparableArrayFunctionObject_H__ + +#include "stir/ArrayFunctionObject_1ArgumentImplementation.h" +#include "stir/shared_ptr.h" +#include +#include "stir/VectorWithOffset.h" + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#endif + + +START_NAMESPACE_STIR + + + +/*! + \ingroup Array + \brief This class implements an \c n -dimensional ArrayFunctionObject whose operation + is separable. + + 'Separable' means that its operation consists of \c n 1D operations, one on each + index of the \c n -dimensional array. + \see in_place_apply_array_functions_on_each_index() + + */ +template +class SeparableArrayFunctionObject : + public ArrayFunctionObject_1ArgumentImplementation +{ +public: + //! Default constructor, results in a trivial ArrayFunctionObject + SeparableArrayFunctionObject (); + //! Constructor taking 1D ArrayFunctionObjects + /*! + The 1d functino objects are passed in a VectorWithOffset which needs to + have num_dimensions elements. (The starting index is irrelevant). + + The shared_ptr's have to be either all null (a trivial object) or all non-null. + */ + SeparableArrayFunctionObject (const VectorWithOffset< shared_ptr > >&); + + bool is_trivial() const; + +protected: + + VectorWithOffset< shared_ptr > > all_1d_array_filters; + virtual void do_it(Array& array) const; + +}; + + +END_NAMESPACE_STIR + + +#endif //SeparableArrayFunctionObject + diff --git a/src/include/stir/SeparableCartesianMetzImageFilter.h b/src/include/stir/SeparableCartesianMetzImageFilter.h new file mode 100644 index 0000000000..79cc475256 --- /dev/null +++ b/src/include/stir/SeparableCartesianMetzImageFilter.h @@ -0,0 +1,124 @@ +// +// +/*! + + \file + \ingroup ImageProcessor + \brief Declaration of class stir::SeparableCartesianMetzImageFilter + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_SeparableCartesianMetzImageFilter_H__ +#define __stir_SeparableCartesianMetzImageFilter_H__ + + +#include "stir/SeparableMetzArrayFilter.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/DataProcessor.h" +#include "stir/DiscretisedDensity.h" + + +START_NAMESPACE_STIR + +// TODO!! remove define + +#define num_dimensions 3 + +/*! + \ingroup ImageProcessor + \brief A class in the ImageProcessor hierarchy that implements Metz + filtering (which includes Gaussian filtering). + + As it is derived from RegisteredParsingObject, it implements all the + necessary things to parse parameter files etc. + + The discretised densities that will be filtered are supposed to be on a + Cartesian grid. The filtering operation is then performed as 3 separate + 1d filters in every direction. + + \warning This class is currently restricted to 3d. This is mainly because of + the difficulty to give sensible names to the parameters used for parsing + in n dimensions. + + \see SeparableMetzArrayFilter for what a Metz filter is + */ + +template +class SeparableCartesianMetzImageFilter : + public + RegisteredParsingObject< + SeparableCartesianMetzImageFilter, + DataProcessor >, + DataProcessor > + > +{ + private: + typedef + RegisteredParsingObject< + SeparableCartesianMetzImageFilter, + DataProcessor >, + DataProcessor > + > + base_type; +public: + static const char * const registered_name; + + //! Default constructor + SeparableCartesianMetzImageFilter(); + + // Construct metz filter given parameters + //SeparableCartesianMetzImageFilter(const double fwhm_x,const double fwhm_y, const double fwhm_z,const int metz_power_x,const int metz_power_y, const int metz_power_z); + + //Succeeded consistency_check( const DiscretisedDensity& image) const; + + + VectorWithOffset get_metz_fwhms() const; + VectorWithOffset get_metz_powers() const; + //! Maximum number of elements in the kernels + /*! -1 means unrestricted*/ + VectorWithOffset get_max_kernel_sizes() const; + +private: + + VectorWithOffset fwhms; + VectorWithOffset metz_powers; + VectorWithOffset max_kernel_sizes; + + SeparableMetzArrayFilter metz_filter; + + virtual void set_defaults(); + virtual void initialise_keymap(); + + Succeeded virtual_set_up(const DiscretisedDensity& image); + // new + void virtual_apply(DiscretisedDensity& out_density, const DiscretisedDensity& in_density) const; + void virtual_apply(DiscretisedDensity& density) const ; + +}; + +#undef num_dimensions + +END_NAMESPACE_STIR + +#endif + + diff --git a/src/include/stir/SeparableConvolutionImageFilter.h b/src/include/stir/SeparableConvolutionImageFilter.h new file mode 100644 index 0000000000..c5a24ccc6e --- /dev/null +++ b/src/include/stir/SeparableConvolutionImageFilter.h @@ -0,0 +1,155 @@ +// +// +/*! + + \file + \ingroup ImageProcessor + \brief Declaration of class stir::SeparableConvolutionImageFilter + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_SeparableConvolutionImageFilter_H__ +#define __stir_SeparableConvolutionImageFilter_H__ + + +#include "stir/SeparableArrayFunctionObject.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/DataProcessor.h" +#include "stir/DiscretisedDensity.h" +#include "stir/VectorWithOffset.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#endif + + +START_NAMESPACE_STIR + +// TODO!! remove define +// currently fixed at 3 because I didn't really have a good idea for the parsing +// keywords in n dimensions. +// +#define num_dimensions 3 + +/*! + \ingroup ImageProcessor + \brief A class derived from DataProcessor for performing separable + non-periodic convolutions. + + This filter applies a 1D convolution in all directions (z,y,x) + with potentially a different filter kernel for every direction. + + When parsing, the filter coefficients are read as a list of numbers for each + direction. The following conventions is used: +
          +
        1. A list of 0 length (which is the default) corresponds to no filtering. +
        2. When the list contains an even number of data, a 0 is appended (at the end). +
        3. After this, the central element of the list corresponds to the 0-th element + in the kernel, see below. +
        + Convolution is non-periodic. In each direction, the following is applied: + + \f[ out_i = \sum_j kernelforthisdirection_j in_{i-j} \f] + + Note that for most kernels, the above convention means that the zero- + index of the kernel corresponds to the peak in the kernel. + + Elements of the input array that are outside its + index range are considered to be 0. + + \warning There is NO check if the kernel coefficients add up to 1. This is + because not all filters need this (e.g. edge enhancing filters). + + \par Example input for a low-pass filter in x,y, no filtering in z + \verbatim + Separable Convolution Parameters := + x-dir filter coefficients := {0.25, .5, .25} + y-dir filter coefficients := {0.25, .5, .25} + ;z-dir filter coefficients := + END Separable Convolution Parameters := + \endverbatim + + The filter is implemented using the class ArrayFilter1DUsingConvolution. +*/ +template +class SeparableConvolutionImageFilter : + public + RegisteredParsingObject< + SeparableConvolutionImageFilter, + DataProcessor >, + DataProcessor > + > +{ + private: + typedef + RegisteredParsingObject< + SeparableConvolutionImageFilter, + DataProcessor >, + DataProcessor > + > + base_type; +public: + //! Name for parsing registry + static const char * const registered_name; + + //! Default constructor + SeparableConvolutionImageFilter(); + + //! Constructor taking filter coefficients explicitly. + /*! These filter coefficients are passed to the + ArrayFilter1DUsingConvolution constructor. + + \a filter_coefficients has to have length 3. (Start index is irrelevant). Its + first element will be applied to the 'first dimension', i.e. the first index. + */ + SeparableConvolutionImageFilter(const VectorWithOffset< VectorWithOffset >& filter_coefficients); + + //VectorWithOffset get_filter_coefficients(); + + +private: + // silly business because KeyParser supports only LIST_OF_DOUBLES + // TODO remove + vector< vector > filter_coefficients_for_parsing; + + VectorWithOffset< VectorWithOffset > filter_coefficients; + + SeparableArrayFunctionObject filter; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + Succeeded virtual_set_up(const DiscretisedDensity& image); + void virtual_apply(DiscretisedDensity& out_density, + const DiscretisedDensity& in_density) const; + void virtual_apply(DiscretisedDensity& density) const ; + +}; + +#undef num_dimensions + +END_NAMESPACE_STIR + +#endif + + diff --git a/src/include/stir/SeparableMetzArrayFilter.h b/src/include/stir/SeparableMetzArrayFilter.h new file mode 100644 index 0000000000..3376f1527d --- /dev/null +++ b/src/include/stir/SeparableMetzArrayFilter.h @@ -0,0 +1,123 @@ +// +// +/*! + + \file + \ingroup Array + \brief Declaration of class stir::SeparableMetzArrayFilter + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_SeparableMetzArrayFilter_H__ +#define __stir_SeparableMetzArrayFilter_H__ + +#include "stir/SeparableArrayFunctionObject.h" +#include "stir/BasicCoordinate.h" +#include "stir/VectorWithOffset.h" + +START_NAMESPACE_STIR + + + +/*! + \ingroup Array + \brief Separable Metz filtering in \c n - dimensions + + The Metz filter is easiest defined in frequency space. For a \c fwhm \c s and + power \c P, its (continuous) Fourier transform is given by + \f[ + M(k,s,P) = + (1 - (1 - G(k, s)^2)^{(P + 1)})/ G(k, s) + \f] + where \f$ G(k,s) \f$ is the Fourier transform of a Gaussian with FWHM \c s, + normalised such that \f$G(0,s) = 1\f$. + + For power 0, the Metz filter is just a Gaussian. For higher power, mid-range + frequencies are more and more amplified. The first figure shows the FT of the + Metz filter with \c fwhm 1, for powers 0, 0.5, 1, ... 3 (lowest curve is Gaussian). + \image html FTMetz.jpg + \image latex FTMetz.eps width=10cm + + Spatially, the Metz filter has negative lobes. The 2nd figure shows the Metz kernel + in space, again with \c fwhm 1, powers 0 (long dashes),1,2,3 (no dashes) + \image html Metz.jpg + \image latex Metz.eps width=10cm + Note that from the definition it follows that + \f[ Metz(x,s,P) = Metz(x/s, 1 ,P)/s \f] + The final figure illustrates the relation between the actual FWHM of the Metz + filter and the FWHM of the underlying Gaussian. + \image html MetzFWHM.jpg + \image latex MetzFWHM.eps width=10cm + + This implementation discretises the Metz filter currently in the following way. + it assumes that the input data are band-limited. For such data, it is possible + to compute the filtering with the continuous Metz filter exactly. This is + done with linear convolution of the sampled data with samples of the + spatial Metz cut off at the same frequency as the input data. + + \warning Currently, this implements a Metz filter cut off at 1/\c sampling_distance. + \warning The Metz filter does \e not preserve positivity. + */ +template +class SeparableMetzArrayFilter: public SeparableArrayFunctionObject +{ +public: + /*! + \brief Default constructor + \warning This currently does not set things properly for a trivial filter. + */ + SeparableMetzArrayFilter() {} + + //! Constructor + /*! + \param fwhms the FWHM of the underlying Gauss 1D filters (in mm) + \param metz_powers the powers of the 1D Metz filters + \param sampling_distances in each dimensions (in mm) + \param max_kernel_sizes maximum number of elements in the kernels. + -1 means unrestricted + + For each of these parameters, the index range should be from 1 to num_dimensions, + with 1 corresponding to the 1st (i.e. slowest) index. + + \warning the fwhms parameter does \c not give the FWHM of the Metz filter, but of + the underlying Gauss. + */ + SeparableMetzArrayFilter(const VectorWithOffset& fwhms, + const VectorWithOffset& metz_powers, + const BasicCoordinate& sampling_distances, + const VectorWithOffset& max_kernel_sizes); + + + +private: + VectorWithOffset fwhms; + VectorWithOffset metz_powers; + BasicCoordinate sampling_distances; + VectorWithOffset max_kernel_sizes; +}; + + +END_NAMESPACE_STIR + +#endif // SeparableMetzArrayFilter + + diff --git a/src/include/stir/Shape/Box3D.h b/src/include/stir/Shape/Box3D.h new file mode 100644 index 0000000000..b0813dde82 --- /dev/null +++ b/src/include/stir/Shape/Box3D.h @@ -0,0 +1,116 @@ +// +// +/* + Copyright (C) 2005- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Declaration of class stir::Box3D + + \par Description + A point with coordinates \a coord is inside the shape if for + x,y,z given by Shape3DWithOrientation::transform_to_original_coords(coord) + \f[ + abs(x), abs(y), abs(z) <= length_x/2, length_y/2, length_z/2 +\f] + + \par Parameters + \verbatim + Box3D Parameters:= + length-x (in mm):= + length-y (in mm):= + length-z (in mm):= + ; any parameters of Shape3DWithOrientation + End:= + \endverbatim + \author C. Ross Schmidtlein +*/ + +#ifndef __stir_Shape_Box3D_h__ +#define __stir_Shape_Box3D_h__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/Shape/Shape3DWithOrientation.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Shape + \brief Three-dimensional box + + box with the dimensions + (length_x,length_y,length_z), where length_x assumed to be + in x direction, length_y in y direction, and length_z in z-direction, + before any rotation with Euler angles. +*/ +class Box3D: +public RegisteredParsingObject +{ + public: + //! Name which will be used when parsing a Shape3D object + static const char * const registered_name; + + Box3D(); +#if 0 + Box3D( const float length_x, + const float length_y, + const float length_z, + const CartesianCoordinate3D& centre, + const float alpha, + const float beta, + const float gamma); +#endif + + Box3D( const float length_x, + const float length_y, + const float length_z, + const CartesianCoordinate3D& centre, + const Array<2,float>& direction_vectors = diagonal_matrix(3,1.F)); + + float get_geometric_volume() const; + float get_geometric_area() const; + + bool is_inside_shape(const CartesianCoordinate3D& coord) const; + + Shape3D* clone() const; + + //! Compare boxes + /*! Uses a tolerance determined by the smallest dimension of the object divided by 1000.*/ + bool + operator==(const Box3D&) const; + + virtual bool + operator==(const Shape3D& shape) const; + + protected: + //! Length in x-direction if the shape is not rotated + float length_x; + //! Length in y-direction if the shape is not rotated + float length_y; + //! Length in z-direction if the shape is not rotated + float length_z; + private: + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/Shape/CombinedShape3D.h b/src/include/stir/Shape/CombinedShape3D.h new file mode 100644 index 0000000000..3e487991bd --- /dev/null +++ b/src/include/stir/Shape/CombinedShape3D.h @@ -0,0 +1,85 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Declaration of class stir::CombinedShape3D + + \author Kris Thielemans + \author Sanida Mustafovic +*/ +#ifndef __stir_Shape_CombinedShape3D_h__ +#define __stir_Shape_CombinedShape3D_h__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/Shape/Shape3D.h" +#include "stir/shared_ptr.h" +#include + +START_NAMESPACE_STIR + + +template +struct logical_and_not : public std::binary_function + { + inline bool operator()(const T& x, const T& y) const + { return x && !y; } + }; + + +template +struct logical_and : public std::binary_function + { + inline bool operator()(const T& x, const T& y) const + { return x || y; } + }; + +/*! \ingroup Shape + \brief A class that allows combining several shapes using logical operations + \todo document more + \todo Parsing cannot work yet because of template (can be solved by explicit instantiation) + +*/ +template > +class CombinedShape3D : + public RegisteredParsingObject +{ +public: + // Name which will be used when parsing a Shape3D object + //static const char * const registered_name; + + inline CombinedShape3D( shared_ptr object1_v, shared_ptr object2_v); + inline bool is_inside_shape(const CartesianCoordinate3D& coord) const; + inline void translate(const CartesianCoordinate3D& direction); + inline void scale(const CartesianCoordinate3D& scale3D); + inline Shape3D* clone() const; + +private: + shared_ptr object1_ptr; + shared_ptr object2_ptr; + +}; + + +END_NAMESPACE_STIR + +#include "stir/Shape/CombinedShape3D.inl" + +#endif diff --git a/src/include/stir/Shape/CombinedShape3D.inl b/src/include/stir/Shape/CombinedShape3D.inl new file mode 100644 index 0000000000..c75fc4ebb4 --- /dev/null +++ b/src/include/stir/Shape/CombinedShape3D.inl @@ -0,0 +1,87 @@ +// +// +/*! + \file + \ingroup Shape + + \brief Inline implementations of class stir::CombinedShape3D + + \author Kris Thielemans + \author Sanida Mustafovic +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +START_NAMESPACE_STIR + +template +CombinedShape3D::CombinedShape3D( shared_ptr object1_v, shared_ptr object2_v) + :object1_ptr(object1_v), + object2_ptr(object2_v) + {} + + +template +bool CombinedShape3D::is_inside_shape(const CartesianCoordinate3D& index) const + { + return operation()(object1_ptr->is_inside_shape(index), + object2_ptr->is_inside_shape(index)); +} + +template +Shape3D* CombinedShape3D::clone() const +{ + // TODO alright ? +#if 0 + Shape3D* tmp = static_cast(new CombinedShape3D(*this)); + cerr << "Cloning " << this << + ", new " << tmp << endl; + return tmp; +#else + return static_cast(new CombinedShape3D(*this)); +#endif +} + +template +void CombinedShape3D::translate(const CartesianCoordinate3D& direction) +{ + // TODO alright ? + shared_ptr new_object1_ptr = object1_ptr->clone(); + shared_ptr new_object2_ptr = object2_ptr->clone(); + object1_ptr = new_object1_ptr; + object2_ptr = new_object2_ptr; + object1_ptr->translate(direction); + object2_ptr->translate(direction); +} + + +template +void CombinedShape3D::scale(const CartesianCoordinate3D& scale3D) +{ + // TODO alright ? +#if 0 + cerr << "scale: " << object1_ptr.ptr->data + << ", " << object2_ptr.ptr->data << endl; +#endif + shared_ptr new_object1_ptr = object1_ptr->clone(); + shared_ptr new_object2_ptr = object2_ptr->clone(); + object1_ptr = new_object1_ptr; + object2_ptr = new_object2_ptr; + object1_ptr->scale(scale3D); + object2_ptr->scale(scale3D); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/Shape/DiscretisedShape3D.h b/src/include/stir/Shape/DiscretisedShape3D.h new file mode 100644 index 0000000000..1ed9ceb026 --- /dev/null +++ b/src/include/stir/Shape/DiscretisedShape3D.h @@ -0,0 +1,172 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Declaration of class stir::DiscretisedShape3D + + \author Kris Thielemans +*/ +#ifndef __stir_Shape_DiscretisedShape3D_H__ +#define __stir_Shape_DiscretisedShape3D_H__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/Shape/Shape3D.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class DiscretisedDensity; + +/*! \ingroup Shape + \brief A class for shapes that have been discretised + + Currently only supports discretisation via VoxelsOnCartesianGrid. + + For DiscretisedShaped3D objects with smooth edges, voxel values + will vary between 0 and 1. + +*/ +class DiscretisedShape3D: + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a Shape3D object + static const char * const registered_name; + + DiscretisedShape3D(); + + //! Constructor that will copy the image to an internal member + /*! The \c filename member is set to "FROM MEMORY" such that parameter_info() + returns somewhat useful info. This has a consequence that the object cannot + be constructed from its own parameter_info(). This is in contrast with most + other shapes. + */ + DiscretisedShape3D(const VoxelsOnCartesianGrid& image); + + //! Constructor that will copy the shared_ptr image + /*! The \c filename member is set to "FROM MEMORY" such that parameter_info() + returns somewhat useful info. This has a consequence that the object cannot + be constructed from its own parameter_info(). This is in contrast with most + other shapes. + + \warning any modifications to the object that this shared_ptr points to + (and hence any modifications to this shape) will have + confusing consequences. + */ + DiscretisedShape3D(const shared_ptr >& density_ptr); + + //! Compare shapes + /*! \todo currently not implemented (will call error() */ + virtual bool + operator==(const Shape3D&) const + { error("DiscretisedShape3D::operator== not implemented. Sorry"); return false;} + + //! set origin of the shape + /*! \warning this will shift the origin of the object pointed to by \a density_ptr. + This is dangerous if you used the constructor taking a shared_ptr argument.*/ + virtual void set_origin(const CartesianCoordinate3D&); + +#ifdef DOXYGEN_SKIP + // following lines here are only read by doxygen. + // They include a comment to warn the user. + // In actual fact, the function does not need to be reimplemented as it uses set_origin() + //! translate the object by shifting its origin + /*! \warning this will shift the origin of the object pointed to by \a density_ptr as it uses set_origin(). + \warning This function is in fact not reimplemented from the + base_type. + */ + void translate(const CartesianCoordinate3D& direction); +#endif + + //! Scale shape + /*! \todo Not implemented (will call error()) */ + virtual void scale(const CartesianCoordinate3D& scale3D) + { error ("TODO: DiscretisedShape3D::scale not implemented. Sorry.");} + + //! determine if a point is inside a non-zero voxel or not + /*! + \warning For voxels at the edges, it is somewhat + ill-defined if a point in the voxel is inside the shape. The current + implementation will return true for every point in the voxel, + even if the voxel value is .001. + In particular, this means that this definition of is_inside_shape() + cannot be used to find the voxel_weight. So, we have to redefine + get_voxel_weight() in the present class. + */ + bool is_inside_shape(const CartesianCoordinate3D& index) const; + + //! get weight for a voxel centred around \a coord + /*! + \warning Presently only works when \a coord is the centre of a voxel and + \a voxel_size is identical to the image's voxel_size + + The argument \a num_samples is ignored. + */ + virtual float get_voxel_weight( + const CartesianCoordinate3D& coord, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& num_samples) const; + + //! Construct a new image (using zoom_image) from the underlying density + /*! + If the images do not have the same characteristics, zoom_image is called for interpolation. + The result is scaled such that mean ROI values remain the same (at least for ROIs which avoid edges). + + The argument \a num_samples is ignored. + */ + void construct_volume(VoxelsOnCartesianGrid &image, const CartesianCoordinate3D& num_samples) const; + //void construct_slice(PixelsOnCartesianGrid &plane, const CartesianCoordinate3D& num_samples) const; + + + virtual Shape3D* clone() const; + + //! provide access to the underlying density + DiscretisedDensity<3,float>& get_discretised_density(); + + //! provide (const) access to the underlying density + const DiscretisedDensity<3,float>& get_discretised_density() const; + +private: + shared_ptr > density_ptr; + + inline const VoxelsOnCartesianGrid& image() const; + inline VoxelsOnCartesianGrid& image(); + + //! \name Parsing functions + //@{ + virtual void set_defaults(); + virtual void initialise_keymap(); + //! Checks validity of parameters + /*! As currently there are 2 origin parameters (in Shape3D and + DiscretisedDensity), this function checks for consistency. + However, the origin in Shape3D will be ignored. + */ + virtual bool post_processing(); + //@} + string filename; +}; + + +END_NAMESPACE_STIR + +#include "stir/Shape/DiscretisedShape3D.inl" + +#endif diff --git a/src/include/stir/Shape/DiscretisedShape3D.inl b/src/include/stir/Shape/DiscretisedShape3D.inl new file mode 100644 index 0000000000..4118bd9611 --- /dev/null +++ b/src/include/stir/Shape/DiscretisedShape3D.inl @@ -0,0 +1,46 @@ +// +// +/*! + \file + \ingroup Shape + + \brief Inline-implementations of class stir::DiscretisedShape3D + + \author Kris Thielemans +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/VoxelsOnCartesianGrid.h" + +START_NAMESPACE_STIR + + +const VoxelsOnCartesianGrid& +DiscretisedShape3D:: +image() const +{ + return static_cast&>(*density_ptr); +} + +VoxelsOnCartesianGrid& +DiscretisedShape3D:: +image() +{ + return static_cast&>(*density_ptr); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/Shape/Ellipsoid.h b/src/include/stir/Shape/Ellipsoid.h new file mode 100644 index 0000000000..5113e62ea6 --- /dev/null +++ b/src/include/stir/Shape/Ellipsoid.h @@ -0,0 +1,116 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Declaration of class stir::Ellipsoid + \author Sanida Mustafovic + \author Kris Thielemans +*/ +#ifndef __stir_Shape_Ellipsoid_h__ +#define __stir_Shape_Elliposoid_h__ + + +#include "stir/RegisteredParsingObject.h" +#include "stir/Shape/Shape3DWithOrientation.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Shape + \brief Three-dimensional ellipsoid + + + \par Description + A point with coordinates \a coord is inside the shape if for + \f$r = coord - origin\f$: + \f[ + {(r.dir_x)^2 \over R_y^2} + {(r.dir_y)^2 \over R_y^2}+ + {(r.dir_z)^2 \over R_z^2} <= 1 + \f] + where \f$dir_x, dir_y, dir_z\f$ are described in the documentation for class + stir::Shape3DWithOrientation. + + \par Parameters + \verbatim + Ellipsoid Parameters:= + radius-x (in mm):= + radius-y (in mm):= + radius-z (in mm):= + ; any parameters of Shape3DWithOrientation + End:= + \endverbatim +*/ +class Ellipsoid: + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a Shape3D object + static const char * const registered_name; + + Ellipsoid(); + Ellipsoid( const CartesianCoordinate3D& radii, + const CartesianCoordinate3D& centre, + const Array<2,float>& direction_vectors = diagonal_matrix(3,1.F)); + //! get volume + float get_geometric_volume() const; +#if 0 + //! Get approximate geometric area + float get_geometric_area() const; +#endif + + bool is_inside_shape(const CartesianCoordinate3D& coord) const; + + Shape3D* clone() const; + + //! Compare cylinders + /*! Uses a tolerance determined by the smallest dimension of the object divided by 1000.*/ + bool + operator==(const Ellipsoid&) const; + + virtual bool + operator==(const Shape3D& shape) const; + + inline float get_radius_x() const + { return radii.x(); } + inline float get_radius_y() const + { return radii.y(); } + inline float get_radius_z() const + { return radii.z(); } + inline CartesianCoordinate3D get_radii() const + { return radii; } + void set_radii(const CartesianCoordinate3D& new_radii); + + +protected: + //! Radii in 3 directions (before using the direction vectors) + CartesianCoordinate3D radii; + + //! set defaults before parsing + /*! sets radii to 0 and calls Shape3DWithOrientation::set_defaults() */ + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/Shape/EllipsoidalCylinder.h b/src/include/stir/Shape/EllipsoidalCylinder.h new file mode 100644 index 0000000000..c7e6d8972c --- /dev/null +++ b/src/include/stir/Shape/EllipsoidalCylinder.h @@ -0,0 +1,158 @@ +/* + Copyright (C) 2000-2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Declaration of class stir::EllipsoidalCylinder + \author Sanida Mustafovic + \author Kris Thielemans + \author C. Ross Schmidtlein (Added overload functions to define sectors of a cylinder) +*/ + +#ifndef __stir_Shape_EllipsoidalCylinder_h__ +#define __stir_Shape_EllipsoidalCylinder_h__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/Shape/Shape3DWithOrientation.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Shape + \brief Three-dimensional ellipsoidal cylinder + + + \par Description + A point with coordinates \a coord is inside the shape if for + \f$r = coord - origin\f$: + \f[ + |r.dir_z| + radius-y (in mm):= + length-z (in mm):= + initial angle (in deg):= ; (defaults to 0) + final_angle (in deg):= ; (defaults to 360) + ; any parameters of Shape3DWithOrientation + End:= + \endverbatim +*/ +class EllipsoidalCylinder: + public RegisteredParsingObject +{ + +public: + //! Name which will be used when parsing a Shape3D object + static const char * const registered_name; + + //! Default constructor (calls set_defaults()) + EllipsoidalCylinder(); + + //! Constructor + /*! \warning: note order of arguments */ + EllipsoidalCylinder(const float length_z, + const float radius_y, + const float radius_x, + const CartesianCoordinate3D& centre, + const Array<2,float>& direction_vectors = diagonal_matrix(3,1.F)); + + //! Constructor + /*! \warning: note order of arguments. + \bug angles \a theta_1 and \a theta_2 are currently in degrees, while STIR conventions dictate radians. + */ + EllipsoidalCylinder(const float length_z, + const float radius_y, + const float radius_x, + const float theta_1, + const float theta_2, + const CartesianCoordinate3D& centre, + const Array<2,float>& direction_vectors = diagonal_matrix(3,1.F)); + + Shape3D* clone() const; + + //! Compare cylinders + /*! Uses a tolerance determined by the smallest dimension of the object divided by 1000.*/ + bool + operator==(const EllipsoidalCylinder& cylinder) const; + + virtual bool + operator==(const Shape3D& shape) const; + + //! get volume + float get_geometric_volume() const; +#if 0 + //! Get approximate geometric area + float get_geometric_area() const; +#endif + + bool is_inside_shape(const CartesianCoordinate3D& coord) const; + + inline float get_length() const + { return length; } + inline float get_radius_x() const + { return radius_x; } + inline float get_radius_y() const + { return radius_y; } + //TODOXXX add theta_1,2 + void set_length(const float); + void set_radius_x(const float); + void set_radius_y(const float); + +protected: + + //! Length of the cylinder + float length; + //! Radius in x-direction if the shape is not rotated + float radius_x; + //! Radius in y-direction if the shape is not rotated + float radius_y; + //! initial theta if the shape is not rotated (in degrees) + float theta_1; + //! final theta if the shape is not rotated (in degrees) + float theta_2; + + //! set defaults before parsing + /*! sets radii and length to 0, theta_1=0, theta_2=360 and calls Shape3DWithOrientation::set_defaults() */ + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/Shape/EllipsoidalCylinder.inl b/src/include/stir/Shape/EllipsoidalCylinder.inl new file mode 100644 index 0000000000..d0a68d7514 --- /dev/null +++ b/src/include/stir/Shape/EllipsoidalCylinder.inl @@ -0,0 +1,48 @@ +// +// +/*! + \file + \ingroup Shape + + \brief Inline-implementations of class stir::EllipsoidalCylinder + + \author Sanida Mustafovic + \author Kris Thielemans +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +START_NAMESPACE_STIR + +float EllipsoidalCylinder:: get_geometric_volume()const + { + return (radius_a*radius_b*_PI*length); + } + +Shape3D* EllipsoidalCylinder:: clone() const +{ + return static_cast(new EllipsoidalCylinder(*this)); +} +void +EllipsoidalCylinder::scale(const CartesianCoordinate3D& scale3D) +{ + origin *= scale3D; + length *= scale3D.z(); + radius_b *= scale3D.y(); + radius_a *= scale3D.x(); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/Shape/Shape3D.h b/src/include/stir/Shape/Shape3D.h new file mode 100644 index 0000000000..d821ac3a53 --- /dev/null +++ b/src/include/stir/Shape/Shape3D.h @@ -0,0 +1,220 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Declaration of class stir::Shape3D + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +#ifndef __stir_Shape_Shape3D_h__ +#define __stir_Shape_Shape3D_h__ + +#include "stir/RegisteredObject.h" +#include "stir/ParsingObject.h" +#include "stir/CartesianCoordinate3D.h" + +START_NAMESPACE_STIR + +template class VoxelsOnCartesianGrid; + + +/*! + \ingroup Shape + \brief The base class for all 3 dimensional shapes + + Shape3D objects are intended to represent geometrical object with + sharp boundaries. So, a point is inside or shape, or it is not (i.e. + no fuzzyness). + + The only derived class where this is relaxed is DiscretisedShape3D. + However, this then needs some special treatment for some member + functions, and you have to be somewhat careful with that class. + + \todo This could/should be generalised to allow general fuzzy shapes. + Probably the only thing to change is to let is_inside_shape() return + a float (between 0 and 1). This would solve some issues with + DiscretisedDhape3D. + + \todo The restriction to the 3D case for this base class largely comes + from the construct_volume() member (and the origin parsing members) + + \todo This base class really should have no origin member. + For example, DiscretisedShape3D now has effectively two. + Instead, we should have an additional class Shape3DWithOrigin. + Easy to do. + + \par Parsing + This base class defines the following keywords for parsing + \verbatim + ; specify origin as {z,y,x} + origin (in mm):= ;defaults to {0,0,0} + \endverbatim +*/ +class Shape3D : + public RegisteredObject, + public ParsingObject +{ +public: + + + virtual ~Shape3D() {} + + //! Compare shapes + /*! + \par Implementation note + + This virtual function has to be implemented in each final class of the hierarchy. + However, Shape3D::operator== has an implementation that checks equality of the + origin (up-to a tolerance of .001). Derived classes can call this implementation. + */ + virtual + inline bool operator==(const Shape3D&) const = 0; + + //! Compare shapes + inline bool operator!=(const Shape3D&) const; + + /*! + \brief Determine (approximately) the intersection volume of a voxel with the shape. + + \param voxel_centre is a cartesian coordinate in 'absolute' coordinates, + i.e. in mm and not relative to the \a origin member. + \param voxel_size is the voxel size in mm. + \param num_samples determines the number of samples to take in z,y,x + direction. + \return a value between 0 and 1 representing the fraction of the + voxel inside the shape + + In the Shape3D implementation, this is simply done by calling + is_inside_shape() at various points in the voxel, and returning + the average value. Obviously, this will only approximate the + intersection volume for very large \a num_samples, or when the + voxel is completely inside the shape. + */ + virtual float get_voxel_weight( + const CartesianCoordinate3D& voxel_centre, + const CartesianCoordinate3D& voxel_size, + const CartesianCoordinate3D& num_samples) const; + + + //! determine if a point is inside the shape or not (up to floating point errors) + /*! + \param coord is a cartesian coordinate in 'absolute' coordinates, + i.e. in mm and not relative to the \a origin member. + + This is really only well defined for shapes with sharp boundaries. + \see DiscretisedShape3D::is_inside_shape for some discussion. + \todo replace by floating point return value? + */ + virtual bool is_inside_shape(const CartesianCoordinate3D& coord) const = 0; + + //! translate the whole shape by shifting its origin + /*! Uses set_origin(). + + \see scale() + */ + virtual void translate(const CartesianCoordinate3D& direction); + //! scale the whole shape + /*! + Scaling the shape also shifts the origin of the shape: + new_origin = old_origin * scale3D. + This is necessary such that combined shapes keep their correct relative + positions. This means that scaling and translating is non-commutative. + \code + shape1=shape; + shape1.translate(offset); shape1.scale(scale); + shape2=shape; + shape2.scale(scale); shape2.translate(offset*scale); + assert(shape1==shape2); + \endcode + */ + virtual void scale(const CartesianCoordinate3D& scale3D) = 0; + + //! scale the whole shape, keeping the centre at the same place + inline void scale_around_origin(const CartesianCoordinate3D& scale3D); + + /*! + \brief construct an image representation the shape in a discretised manner + + In principle, each voxel is sub-sampled to allow smoother edges. + \warning Shapes have to be larger than the voxel size for sensible results. + For efficiency reasons, the current implementation of this function + does a first pass through the image where is_inside_shape() is called + only for the centre of the voxels. After this, only edge voxels are + resampled. So, if a shape lies between the centre of all voxels, + it will not be sampled at all. + \todo Get rid of restriction to allow only VoxelsOnCartesianGrid + (but that's rather hard) + \todo Potentially this should fill a DiscretisedShape3D. + */ + virtual void construct_volume(VoxelsOnCartesianGrid &image, const CartesianCoordinate3D& num_samples) const; + //virtual void construct_slice(PixelsOnCartesianGrid &plane, const CartesianCoordinate3D& num_samples) const; + + //! Compute approximate volume + /*! As this is not possible/easy for all shapes, the default implementation + returns a negative number. The user should check this to see if the returned + value makes sense. + */ + virtual float get_geometric_volume() const; +#if 0 + //! Compute approximate geometric area + /*! As this is not possible/easy for all shapes, the default implementation + returns a negative number. The user should check this to see if the returned + value makes sense. + */ + virtual float get_geometric_area() const; +#endif + + //TODO get_bounding_box() const; + + //! get the origin of the shape-coordinate system + inline CartesianCoordinate3D get_origin() const; + //! set the origin of the shape-coordinate system + virtual void set_origin(const CartesianCoordinate3D&); + + //! Allocate a new Shape3D object which is a copy of the current one. + virtual Shape3D* clone() const = 0; + + + // need to overload this to avoid ambiguity between Object::parameter_info and ParsingObject::parameter_info() + virtual std::string parameter_info(); + +protected: + inline Shape3D(); + inline explicit Shape3D(const CartesianCoordinate3D& origin); + + //! \name Parsing functions + //@{ + virtual void set_defaults(); + virtual void initialise_keymap(); + //@} +private: + //! origin of the shape + CartesianCoordinate3D origin; + +}; + +END_NAMESPACE_STIR + +#include "stir/Shape/Shape3D.inl" + +#endif diff --git a/src/include/stir/Shape/Shape3D.inl b/src/include/stir/Shape/Shape3D.inl new file mode 100644 index 0000000000..df591cd9e8 --- /dev/null +++ b/src/include/stir/Shape/Shape3D.inl @@ -0,0 +1,69 @@ +// +// +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Inline-implementations of class stir::Shape3D + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +START_NAMESPACE_STIR + +Shape3D::Shape3D() +: origin(0,0,0) +{} + +Shape3D::Shape3D(const CartesianCoordinate3D& origin) +: origin(origin) +{} + +bool +Shape3D:: +operator==(const Shape3D& s) const +{ + return norm(this->origin - s.origin) < .001F; +} + + +bool +Shape3D:: +operator!=(const Shape3D& s) const +{ + return !(*this == s); +} + +void +Shape3D::scale_around_origin(const CartesianCoordinate3D& scale3D) +{ + CartesianCoordinate3D old_origin = get_origin(); + translate(old_origin * (-1)); + scale(scale3D); + translate(old_origin); + assert((norm(get_origin())==0 && norm(old_origin)==0)|| + norm(get_origin() - old_origin) < norm(get_origin())*10E-5); +} + +CartesianCoordinate3D Shape3D::get_origin() const +{ return origin; } + + +END_NAMESPACE_STIR diff --git a/src/include/stir/Shape/Shape3DWithOrientation.h b/src/include/stir/Shape/Shape3DWithOrientation.h new file mode 100644 index 0000000000..33e040b8e7 --- /dev/null +++ b/src/include/stir/Shape/Shape3DWithOrientation.h @@ -0,0 +1,149 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Shape + + \brief Declaration of class stir::Shape3DWithOrientation + + \todo document parsing parameters + \par Parameters + \verbatim + ; any parameters of Shape3D + + ; parameters that enable to use non-default axes + ; values below are give a rotation around y for 90 degrees (swapping x and z) + ; Warning: this uses the STIR convention {z,y,x} + direction vectors (in mm) := { {0,0,1}, {0,1,0}, {-1,0,0}} + End:= + \endverbatim + + \author Sanida Mustafovic + \author Kris Thielemans +*/ + +#ifndef __stir_Shape_Shape3DWithOrientation__H__ +#define __stir_Shape_Shape3DWithOrientation__H__ + +#include "stir/Shape/Shape3D.h" +#include "stir/numerics/MatrixFunction.h" + +START_NAMESPACE_STIR +class Succeeded; + +/*! + \ingroup Shape + \brief Class for shapes with orientation + + Orientation is specified by giving a 3x3 matrix specifying 3 direction vectors. + Note that these vectors do not necessarily have to be orthogonal nor have unit-norm + (in fact, scale() will rescale these direction vectors). Of course, they should not + be parallel, but this is not checked. + + Functions like \c is_inside_shape(coord) should compute the coordinate to be used + in the calculation as matrix_multiply(direction_vectors, coord-origin), + or best practice is to call transform_to_original_coords(). + + \todo A previous release had Euler angle code. However, it is currently disabled as + there were bugs in it. +*/ + +class Shape3DWithOrientation: public Shape3D +{ + typedef Shape3D base_type; + +public: + + bool operator==(const Shape3DWithOrientation& s) const; + virtual void scale(const CartesianCoordinate3D& scale3D); + + //! get direction vectors currently in use + /*! Index offsets will always be 1 */ + const Array<2,float>& get_direction_vectors() const + { return _directions; } + //! set direction vectors + /*! + Any index offset will be accepted. + + Note that scaling the direction vectors is equivalent to a call to + scale_around_origin() + */ + Succeeded set_direction_vectors(const Array<2,float>&); + +#if 0 + // TODO non-sensical after non-uniform scale + float get_angle_alpha() const; + float get_angle_beta() const; + float get_angle_gamma() const; +#endif + +protected: + + //! default constructor (NO initialisation of values) + Shape3DWithOrientation(); + +#if 0 + / + Shape3DWithOrientation(const CartesianCoordinate3D& origin, + const float alpha, + const float beta, + const float gamma); +#endif + Shape3DWithOrientation(const CartesianCoordinate3D& origin, + const Array<2,float>& directions = diagonal_matrix(3,1.F)); + +#if 0 + void + set_directions_from_Euler_angles( + const float alpha, + const float beta, + const float gamma); +#endif + + //! gets the volume of the cell spanned by the direction vectors + /*! this should be used when computing volumes etc */ + float get_volume_of_unit_cell() const; + + //! Transform a 'real-world' coordinate to the coordinate system used by the shape + CartesianCoordinate3D + transform_to_shape_coords(const CartesianCoordinate3D&) const; + + //! sets defaults for parsing + /*! sets direction vectors to the normal unit vectors. */ + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + virtual void set_key_values(); + +private: +#if 0 + // temporary variables to store values while parsing + float alpha_in_degrees; + float beta_in_degrees; + float gamma_in_degrees; +#endif + + Array<2,float> _directions; + +}; + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/Sinogram.h b/src/include/stir/Sinogram.h new file mode 100644 index 0000000000..1e55b5eac3 --- /dev/null +++ b/src/include/stir/Sinogram.h @@ -0,0 +1,150 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Declaration of class stir::Sinogram + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +#ifndef __Sinogram_h__ +#define __Sinogram_h__ + + +#include "stir/Array.h" +#include "stir/ProjDataInfo.h" +#include "stir/shared_ptr.h" + + + + +START_NAMESPACE_STIR + +/*! + \ingroup projdata + \brief A class for 2d projection data. + + This represents a subset of the full projection. segment_num and axial_pos_num + are fixed. + +*/ +template +class Sinogram : public Array<2,elemT> +{ +private: + typedef Array<2,elemT> base_type; +#ifdef SWIG + // SWIG needs the next typedef to be public +public: +#endif + typedef Sinogram self_type; +#ifdef SWIG + // SWIG needs a default constructor + inline Sinogram() {} +#endif + +public: + //! Construct sinogram from proj_data_info pointer, ring and segment number. Data are set to 0. + inline Sinogram(const shared_ptr& proj_data_info_ptr, + const int ax_pos_num, const int segment_num); + + //! Construct sinogram with data set to the array. + inline Sinogram(const Array<2,elemT>& p,const shared_ptr& proj_data_info_ptr, + const int ax_pos_num, const int segment_num); + + //! Get segment number + inline int get_segment_num() const; + //! Get number of axial positions + inline int get_axial_pos_num() const; + //! Get minimum view number + inline int get_min_view_num() const; + //! Get maximum view number + inline int get_max_view_num() const; + //! Get number of views + inline int get_num_views() const; + //! Get minimum number of tangetial positions + inline int get_min_tangential_pos_num() const; + //! Get maximum number of tangential positions + inline int get_max_tangential_pos_num() const; + //! Get number of tangential positions + inline int get_num_tangential_poss() const; + + //! Get an empty sinogram of the same dimensions, segment_num etc. + inline Sinogram get_empty_copy(void) const; + + //! Overloading Array::grow + void grow(const IndexRange<2>& range); + //! Overloading Array::resize + void resize(const IndexRange<2>& range); + + //! Get the projection data info pointer + /*! \warning Do not use this pointer after the Sinogram object is destructed. + */ + inline const ProjDataInfo* get_proj_data_info_ptr() const; + + //inline Sinogram operator = (const Sinogram &s) const; + + //! \name Equality + //@{ + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! If they do \c not have the same characteristics, the string \a explanation + explains why. + */ + bool + has_same_characteristics(self_type const&, + string& explanation) const; + + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! Use this version if you do not need to know why they do not match. + */ + bool + has_same_characteristics(self_type const&) const; + + //! check equality (data has to be identical) + /*! Uses has_same_characteristics() and Array::operator==. + \warning This function uses \c ==, which might not be what you + need to check when \c elemT has data with float or double numbers. + */ + bool operator ==(const self_type&) const; + + //! negation of operator== + bool operator !=(const self_type&) const; + //@} + +private: + + shared_ptr proj_data_info_ptr; + int axial_pos_num; + int segment_num; + +}; + +END_NAMESPACE_STIR + +#include "stir/Sinogram.inl" + +#endif diff --git a/src/include/stir/Sinogram.inl b/src/include/stir/Sinogram.inl new file mode 100644 index 0000000000..e91e81fb9e --- /dev/null +++ b/src/include/stir/Sinogram.inl @@ -0,0 +1,139 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007,Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Implementations of inline functions of class stir::Sinogram + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/IndexRange2D.h" + +START_NAMESPACE_STIR + + +template +int +Sinogram::get_segment_num() const +{ return segment_num; } + +template +int +Sinogram::get_axial_pos_num() const +{ return axial_pos_num; } + +template +int +Sinogram::get_min_view_num() const + {return this->get_min_index();} + +template +int +Sinogram::get_max_view_num() const + { return this->get_max_index(); } + +template +int +Sinogram::get_num_views() const + { return this->get_length();} + +template +int +Sinogram::get_num_tangential_poss()const + { return this->get_length()==0 ? 0 : (*this)[get_min_view_num()].get_length();} + +template +int +Sinogram::get_min_tangential_pos_num() const + { return this->get_length()==0 ? 0 :(*this)[get_min_view_num()].get_min_index();} + +template +int +Sinogram::get_max_tangential_pos_num() const +{ return this->get_length()==0 ? 0 :(*this)[get_min_view_num()].get_max_index(); } + + + +template +Sinogram +Sinogram::get_empty_copy(void) const +{ + Sinogram copy(proj_data_info_ptr, get_axial_pos_num(), get_segment_num()); + return copy; +} + + +template +const ProjDataInfo* +Sinogram:: get_proj_data_info_ptr() const +{ + return proj_data_info_ptr.get(); +} + +template +Sinogram:: +Sinogram(const Array<2,elemT>& p, + const shared_ptr& pdi_ptr, + const int ax_pos_num, const int s_num) + : + Array<2,elemT>(p), + proj_data_info_ptr(pdi_ptr), + axial_pos_num(ax_pos_num), + segment_num(s_num) +{ + assert(axial_pos_num <= proj_data_info_ptr->get_max_axial_pos_num(segment_num)); + assert(axial_pos_num >= proj_data_info_ptr->get_min_axial_pos_num(segment_num)); + // segment_num is already checked by doing get_max_axial_pos_num(s_num) + + assert( get_min_view_num() == pdi_ptr->get_min_view_num()); + assert( get_max_view_num() == pdi_ptr->get_max_view_num()); + assert( get_min_tangential_pos_num() == pdi_ptr->get_min_tangential_pos_num()); + assert( get_max_tangential_pos_num() == pdi_ptr->get_max_tangential_pos_num()); +} + + + +template +Sinogram:: +Sinogram(const shared_ptr& pdi_ptr, + const int ax_pos_num, const int s_num) + : + Array<2,elemT>(IndexRange2D (pdi_ptr->get_min_view_num(), + pdi_ptr->get_max_view_num(), + pdi_ptr->get_min_tangential_pos_num(), + pdi_ptr->get_max_tangential_pos_num())), + proj_data_info_ptr(pdi_ptr), + axial_pos_num(ax_pos_num), + segment_num(s_num) +{ + assert(axial_pos_num <= proj_data_info_ptr->get_max_axial_pos_num(segment_num)); + assert(axial_pos_num >= proj_data_info_ptr->get_min_axial_pos_num(segment_num)); + // segment_num is already checked by doing get_max_axial_pos_num(s_num) +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/Succeeded.h b/src/include/stir/Succeeded.h new file mode 100644 index 0000000000..4cd61e0d3b --- /dev/null +++ b/src/include/stir/Succeeded.h @@ -0,0 +1,61 @@ +// +// +#ifndef __stir_Succeeded_H__ +#define __stir_Succeeded_H__ + +/*! + + \file + \ingroup buildblock + \brief Declaration of class stir::Succeeded + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/common.h" + +START_NAMESPACE_STIR + +/*! + \brief + a class containing an enumeration type that can be used by functions to signal + successful operation or not + + Example: + \code + Succeeded f() { do_something; return Succeeded::yes; } + void g() { if (f() == Succeeded::no) error("Error calling f"); } + \endcode +*/ +class Succeeded +{ +public: + enum value { yes, no }; + Succeeded(const value& v) : v(v) {} + bool operator==(const Succeeded &v2) const { return v == v2.v; } + bool operator!=(const Succeeded &v2) const { return v != v2.v; } +private: + value v; +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/ThresholdMinToSmallPositiveValueDataProcessor.h b/src/include/stir/ThresholdMinToSmallPositiveValueDataProcessor.h new file mode 100644 index 0000000000..fde052d801 --- /dev/null +++ b/src/include/stir/ThresholdMinToSmallPositiveValueDataProcessor.h @@ -0,0 +1,104 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup DataProcessor + \brief Declaration of class stir::ThresholdMinToSmallPositiveValueDataProcessor + + \author Kris Thielemans + +*/ + +#ifndef __stir_ThresholdMinToSmallPositiveValueDataProcessor_H__ +#define __stir_ThresholdMinToSmallPositiveValueDataProcessor_H__ + + +#include "stir/RegisteredParsingObject.h" +#include "stir/DataProcessor.h" + + +START_NAMESPACE_STIR + +/*! + \ingroup DataProcessor + \brief A class in the DataProcessor hierarchy for making sure all elements are strictly positive. + + Works by calling threshold_min_to_small_positive_value(). + + As it is derived from RegisteredParsingObject, it implements all the + necessary things to parse parameter files etc. + + \par Parsing parameters + + ; if part of a larger parameter file, you'd probably have something like + ; data processor type := Chained Data Processor + Chained Data Processor Parameters:= + Data Processor to apply first:= data_processor type + ; parameters for first data processor + Data Processor to apply second:=data_processor type + ; parameters for second data processor + END Chained Data Processor Parameters:= + + */ + +template +class ThresholdMinToSmallPositiveValueDataProcessor : + public + RegisteredParsingObject< + ThresholdMinToSmallPositiveValueDataProcessor, + DataProcessor, + DataProcessor + > +{ +private: + typedef + RegisteredParsingObject< + ThresholdMinToSmallPositiveValueDataProcessor, + DataProcessor, + DataProcessor + > + base_type; +public: + static const char * const registered_name; + + //! Construct by calling set_defaults() + ThresholdMinToSmallPositiveValueDataProcessor(); + + +private: + + int rim_truncation_image; + + virtual void set_defaults(); + virtual void initialise_keymap(); + + Succeeded virtual_set_up(const DataT&); + + void virtual_apply(DataT& out_data, const DataT& in_data) const; + void virtual_apply(DataT& data) const ; + +}; + + +END_NAMESPACE_STIR + +#endif + + diff --git a/src/include/stir/TimeFrameDefinitions.h b/src/include/stir/TimeFrameDefinitions.h new file mode 100644 index 0000000000..31d5b25c66 --- /dev/null +++ b/src/include/stir/TimeFrameDefinitions.h @@ -0,0 +1,113 @@ +/* + Copyright (C) 2003 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup buildblock + \brief Declaration of class stir::TimeFrameDefinitions + + \author Kris Thielemans +*/ +#ifndef __stir_TimeFrameDefinitions_H__ +#define __stir_TimeFrameDefinitions_H__ + +#include "stir/common.h" +#include +#include +#include + +START_NAMESPACE_STIR +/*! + \ingroup buildblock + \brief Class used for storing time frame durations + + All times are in seconds as per standard STIR conventions. + + Times are supposed to be relative to the exam start time. + + Currently this class can read frame info from an ECAT6, ECAT7 and a 'frame definition' + file. See the documentation for the constructor. +*/ +class TimeFrameDefinitions +{ +public: + //! Default constructor: no time frames at all + TimeFrameDefinitions(); + + //! Read the frame definitions from a file + /*! + \deprecated + The filename can point to an ECAT6 file, and ECAT7 file (if you + have installed the LLN library), an Interfile file, or a simple ASCII text file. + + This latter uses the '.fdef' format used by Peter Bloomfield's software. + The format is a number of lines, each existing of 2 numbers + \verbatim + num_frames_of_this_duration duration_in_secs + \endverbatim + This duration is a double number. + + This class in fact allows an extension of the above. Setting + \a num_frames_of_this_duration to 0 allows skipping + a time period of the corresponding \a duration_in_secs. + */ + explicit TimeFrameDefinitions(const std::string& fdef_filename); + + //! Construct from a list of time frames + /*! Each frame is specified as a std::pair with start and end time (in seconds). + Start times have to be in increasing order*/ + TimeFrameDefinitions(const std::vector >&); + + //! Construct from a list of start times and durations + /*! start times have to be in increasing order*/ + TimeFrameDefinitions(const std::vector& start_times, const std::vector& durations); + + //! Construct from a single time frame of an existing object + TimeFrameDefinitions(const TimeFrameDefinitions&, unsigned int frame_num); + + //! \name get info for 1 frame (frame_num is 1 based) + //@{ + double get_start_time(unsigned int frame_num) const; + double get_end_time(unsigned int frame_num) const; + double get_duration(unsigned int frame_num) const; + //@} + + //! Get start time of first frame + double get_start_time() const; + //! Get end time of last frame + double get_end_time() const; + + //! Get number of frames + unsigned int get_num_frames() const; + //! Get number of frames + unsigned int get_num_time_frames() const; + + //! Get the frame number associated with a frame starting and start_time and ending at end_time. + /*! \return frame number (between 1 and get_num_time_frames()) or 0 if frame not found. + */ + unsigned int get_time_frame_num(const double start_time, const double end_time) const; + +private: + //! Stores start and end time for each frame + std::vector > frame_times; + void read_fdef_file(const std::string& filename); + +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/TimeGateDefinitions.h b/src/include/stir/TimeGateDefinitions.h new file mode 100644 index 0000000000..5dce6b367e --- /dev/null +++ b/src/include/stir/TimeGateDefinitions.h @@ -0,0 +1,112 @@ +// +/* + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup buildblock + \brief Declaration of class stir::TimeGateDefinitions + + \author Charalampos Tsoumpas + \author Kris Thielemans + + \todo This files needs proper test + +*/ +#ifndef __stir_TimeGateDefinitions_H__ +#define __stir_TimeGateDefinitions_H__ + +#include "stir/common.h" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::pair; +using std::vector; +#endif + +START_NAMESPACE_STIR +/*! + \ingroup buildblock + \brief Class used for storing time gate durations + + Times are supposed to be relative to the scan start time. + + Currently this class can read gate info from an ECAT6, ECAT7 and a 'gate definition' + file. See the documentation for the constructor. + + Will probably be superseded by Study classes. +*/ +class TimeGateDefinitions +{ + public: + //! Default constructor: no time gates at all + TimeGateDefinitions(); + TimeGateDefinitions(const vector& gate_num_vector, + const vector& duration_vector); + TimeGateDefinitions(const vector >& gate_sequence); + explicit TimeGateDefinitions(const string& gdef_filename); + + //! Read the gate definitions from a file + /*! + The filename can point to a simple ASCII text file. + The format is a number of lines, each existing of 2 numbers + \verbatim + gate_num duration_in_secs + \endverbatim + This duration is a double number. + + This class in fact allows an extension of the above. Setting + \a gate_num_of_this_duration to 0 allows skipping + a time period of the corresponding \a duration_in_secs. + */ + void read_gdef_file(const string& gdef_filename); + + // Nicolas A Karakatsanis: Calculate and set the time fraction for each motion/gate relative to the total frame duration + void set_gate_relative_durations(const vector >& gate_sequence); + + //! \name get info for a gate + //@{ + double get_gate_duration(unsigned int num) const; + unsigned int get_gate_num(unsigned int num) const; + + // Get the time fraction for each motion/gate relative to the total acquisition duration + float get_gate_relative_duration(unsigned int num) const; //Nicolas A Karakatsanis + + //@} + + //! Get number of gates + unsigned int get_num_gates() const; + //! Get number of gates + unsigned int get_num_time_gates() const; + + private: + //! Stores start and end time for each gate + vector > _gate_sequence; + + // Total duration of all gates (total acquisition length) (Nicolas A Karakatsanis) + float _acquisition_total_duration; + + //! Stores the time fractions for all motions/gate (time fraction = gate_duration/acquisition_total_duration) (Nicolas A Karakatsanis) + vector _gate_relative_durations_sequence; + +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/TimedBlock.h b/src/include/stir/TimedBlock.h new file mode 100644 index 0000000000..f7a34e4c30 --- /dev/null +++ b/src/include/stir/TimedBlock.h @@ -0,0 +1,104 @@ +// @(#)Timer.h 1.6: 00/03/23 +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup buildblock + + \brief Class stir::TimedBlock + + \author Alexey Zverovich + \author PARAPET project + +*/ +#ifndef _stir_TimedBlock_H_ +#define _stir_TimedBlock_H_ +namespace stir { + + class Timer; + + /*! \brief Helper class for measuring execution time of a block of code. + \ingroup buildblock + + It starts the timer in ctor, stops in dtor. + Do not create unnamed instances of this class, as they are quite + useless: you cannot predict destruction time. + + \par Usage: + + \code + + SomeTimer t; + // do whatever you want here + { + TimedBlock tb(t); + do_something_1(); + do_something_2(); + }; + // do whatever you want here + { + TimedBlock tb(t); + do_something_3(); + }; + // do whatever you want here + cout << "It took " << t.GetTime() << "sec to execute do_something_1..3()" << endl; + + \endcode + + \par Template argument requirements + + \c TimerT has to have a start() and stop() member function. This is the case for + stir::Timer (and derived functions) and stir::HighResWallClockTimer. + */ + template + class TimedBlock + { + public: + + //! Create a timed block + inline TimedBlock(TimerT& Timer); + //! Destroy a timed block + inline virtual ~TimedBlock(void); + + protected: + private: + + TimedBlock(const TimedBlock&); // Not defined + TimedBlock& operator=(const TimedBlock&); // Not defined + + TimerT& m_Timer; + + }; + + + template + TimedBlock::TimedBlock(TimerT& timer) + : m_Timer(timer) + { + m_Timer.start(); + } + + template + TimedBlock::~TimedBlock(void) + { + m_Timer.stop(); + } +} + +#endif diff --git a/src/include/stir/TimedObject.h b/src/include/stir/TimedObject.h new file mode 100644 index 0000000000..38e082bee4 --- /dev/null +++ b/src/include/stir/TimedObject.h @@ -0,0 +1,79 @@ +#ifndef __TimedObject_H__ +#define __TimedObject_H__ +/*! + \file + \ingroup buildblock + + \brief declares the stir::TimedObject class + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/CPUTimer.h" + +START_NAMESPACE_STIR +/*! + \ingroup buildblock + \brief base class for all objects which need timers. + At the moment, there's only a CPU timer. + + It is the responsibility of the derived class to start and + stop the timer. +*/ +class TimedObject +{ +public: + + //! reset all timers kept by this object + inline void reset_timers(); + + //! stop all timers kept by this object + /*! Note: function is const such that it can be called in a + function of a derived class that is const. + */ + inline void stop_timers() const; + + //! start all timers kept by this object + /*! Note: function is const such that it can be called in a + function of a derived class that is const. + */ + inline void start_timers() const; + + //! get current value of the timer (since first use or last reset) + inline double get_CPU_timer_value() const; + +private: + + //! A timer that measured CPU time. + /*! Note: member is mutable such that it can be modified in a const function. + */ + mutable CPUTimer cpu_timer; + + // TODO include other times (such as wall-clock) + +}; + +END_NAMESPACE_STIR + +#include "stir/TimedObject.inl" + +#endif diff --git a/src/include/stir/TimedObject.inl b/src/include/stir/TimedObject.inl new file mode 100644 index 0000000000..ac3adfe9bc --- /dev/null +++ b/src/include/stir/TimedObject.inl @@ -0,0 +1,55 @@ +// +// +/*! + \file + \ingroup buildblock + \brief inline implementations for stir::TimedObject + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +void TimedObject::reset_timers() +{ + cpu_timer.reset(); +} + +void TimedObject::start_timers() const +{ + cpu_timer.start(); +} + + +void TimedObject::stop_timers() const +{ + cpu_timer.stop(); +} + + +double TimedObject::get_CPU_timer_value() const +{ + return cpu_timer.value(); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/Timer.h b/src/include/stir/Timer.h new file mode 100644 index 0000000000..6aacd5d3ef --- /dev/null +++ b/src/include/stir/Timer.h @@ -0,0 +1,84 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief This declares the stir::Timer class. + + \author Kris Thielemans + \author PARAPET project + +*/ + +#ifndef __stir_TIMER_H__ +#define __stir_TIMER_H__ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief + A general base class for timers. Interface is like a stop watch. + + \par Example of usage: + + \code + DerivedFromTimer t; + t.start(); + // do things + cerr << t.value(); + // do things + t.stop(); + // do things + t.reset() + // etc + \endcode + + Derived classes simply have to implement the virtual function + double get_current_value() +*/ +class Timer +{ +public: + inline Timer(); + inline virtual ~Timer(); + inline void start(); + inline void stop(); + inline void reset(); + //! return value is undefined when start() is not called first. + inline double value() const; + +protected: + bool running; + double previous_value; + double previous_total_value; + + virtual double get_current_value() const = 0; +}; + +END_NAMESPACE_STIR + + +#include "stir/Timer.inl" + +#endif // __TIMER_H__ diff --git a/src/include/stir/Timer.inl b/src/include/stir/Timer.inl new file mode 100644 index 0000000000..2d86148e6b --- /dev/null +++ b/src/include/stir/Timer.inl @@ -0,0 +1,85 @@ +// +// +/*! + + \file + \ingroup buildblock + + \brief inline implementations for stir::Timer + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +START_NAMESPACE_STIR + +Timer::Timer() +{ + running = false; + previous_total_value = 0.; + +} + +Timer::~Timer() +{} + +void Timer::start() +{ + if (!running) + { + running = true; + previous_value = get_current_value(); + } +} + +void Timer::stop() +{ + if (running) + { + previous_total_value += get_current_value() - previous_value; + running = false; + } +} + +#ifdef OLDDESIGN +void Timer::restart() +{ + previous_total_value = 0.; + running = false; + start(); +} +#endif + +void Timer::reset() +{ + assert(running == false); + previous_total_value = 0.; +} + +double Timer::value() const +{ + double tmp = previous_total_value; + if (running) + tmp += get_current_value() - previous_value; + return tmp; +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/TrivialDataSymmetriesForViewSegmentNumbers.h b/src/include/stir/TrivialDataSymmetriesForViewSegmentNumbers.h new file mode 100644 index 0000000000..5ed8d8f150 --- /dev/null +++ b/src/include/stir/TrivialDataSymmetriesForViewSegmentNumbers.h @@ -0,0 +1,83 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Declaration of class stir::TrivialDataSymmetriesForViewSegmentNumbers + + \author Kris Thielemans + + +*/ +#ifndef __TrivialDataSymmetriesForViewSegmentNumbers_H__ +#define __TrivialDataSymmetriesForViewSegmentNumbers_H__ + +#include "stir/DataSymmetriesForViewSegmentNumbers.h" + +START_NAMESPACE_STIR + +/*! + \brief A class for encoding/finding NO symmetries. Works only on + ViewSegmentNumbers (instead of Bin). + + This class is mainly useful if you need a DataSymmetriesForViewSegmentNumbers + object (e.g. for RelatedViewgrams), but do not need/have projectors. + +*/ +class TrivialDataSymmetriesForViewSegmentNumbers : public DataSymmetriesForViewSegmentNumbers +{ +public: + + virtual inline DataSymmetriesForViewSegmentNumbers * clone() const; + + +#if 0 + // TODO + //! returns the range of the indices for basic view/segments + virtual ViewSegmentIndexRange + get_basic_view_segment_index_range() const; +#endif + + virtual inline void + get_related_view_segment_numbers(vector&, const ViewSegmentNumbers& v_s) const; + + virtual inline int + num_related_view_segment_numbers(const ViewSegmentNumbers& v_s) const; + + /*! \brief given an arbitrary view/segment, find the basic view/segment + + in this class, \a v_s is unchanged, and the return value is always false. + 'v_s' is changed (i.e. it was NOT a basic view/segment). + */ + virtual inline bool + find_basic_view_segment_numbers(ViewSegmentNumbers& v_s) const; + +private: + virtual bool blindly_equals(const root_type * const) const; + +}; + +END_NAMESPACE_STIR + +#include "stir/TrivialDataSymmetriesForViewSegmentNumbers.inl" + +#endif + diff --git a/src/include/stir/TrivialDataSymmetriesForViewSegmentNumbers.inl b/src/include/stir/TrivialDataSymmetriesForViewSegmentNumbers.inl new file mode 100644 index 0000000000..ab05888e58 --- /dev/null +++ b/src/include/stir/TrivialDataSymmetriesForViewSegmentNumbers.inl @@ -0,0 +1,70 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Implementation of inline-methods of class stir::TrivialDataSymmetriesForViewSegmentNumbers + + \author Kris Thielemans + +*/ + +START_NAMESPACE_STIR + +DataSymmetriesForViewSegmentNumbers* +TrivialDataSymmetriesForViewSegmentNumbers:: +clone() const +{ + return new TrivialDataSymmetriesForViewSegmentNumbers; +} + + +void +TrivialDataSymmetriesForViewSegmentNumbers:: +get_related_view_segment_numbers(vector& all, const ViewSegmentNumbers& v_s) const +{ + all.resize(1); + all[0] = v_s; +} + + +int +TrivialDataSymmetriesForViewSegmentNumbers:: +num_related_view_segment_numbers(const ViewSegmentNumbers& v_s) const +{ + return 1; +} + +bool +TrivialDataSymmetriesForViewSegmentNumbers:: +find_basic_view_segment_numbers(ViewSegmentNumbers& v_s) const +{ + return false; +} + +bool +TrivialDataSymmetriesForViewSegmentNumbers:: +blindly_equals(const root_type * const) const +{ + return true; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/TruncateToCylindricalFOVImageProcessor.h b/src/include/stir/TruncateToCylindricalFOVImageProcessor.h new file mode 100644 index 0000000000..2daba21510 --- /dev/null +++ b/src/include/stir/TruncateToCylindricalFOVImageProcessor.h @@ -0,0 +1,93 @@ +// +// +/* + Copyright (C) 2005- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup ImageProcessor + \brief Declaration of class stir::TruncateToCylindricalFOVImageProcessor + + \author Kris Thielemans + +*/ + +#ifndef __stir_TruncateToCylindricalFOVImageProcessor_H__ +#define __stir_TruncateToCylindricalFOVImageProcessor_H__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/DataProcessor.h" +#include "stir/DiscretisedDensity.h" + + +START_NAMESPACE_STIR + + +/*! + \ingroup ImageProcessor + \brief A class in the DataProcessor hierarchy that sets voxels to 0 + outside a given radius. + + As it is derived from RegisteredParsingObject, it implements all the + necessary things to parse parameter files etc. + + The discretised densities that will be filtered are supposed to be on a + Cartesian grid. + */ + +template +class TruncateToCylindricalFOVImageProcessor : + public + RegisteredParsingObject< + TruncateToCylindricalFOVImageProcessor, + DataProcessor >, + DataProcessor > + > +{ + private: + typedef + RegisteredParsingObject< + TruncateToCylindricalFOVImageProcessor, + DataProcessor >, + DataProcessor > + > + base_type; +public: + static const char * const registered_name; + + //! Default constructor + TruncateToCylindricalFOVImageProcessor(); + + private: + bool _strictly_less_than_radius; + + virtual void set_defaults(); + virtual void initialise_keymap(); + + Succeeded virtual_set_up(const DiscretisedDensity<3,elemT>& image); + // new + void virtual_apply(DiscretisedDensity<3,elemT>& out_density, const DiscretisedDensity<3,elemT>& in_density) const; + void virtual_apply(DiscretisedDensity<3,elemT>& density) const ; + +}; + + +END_NAMESPACE_STIR + +#endif + + diff --git a/src/include/stir/VectorWithOffset.h b/src/include/stir/VectorWithOffset.h new file mode 100644 index 0000000000..814af9f097 --- /dev/null +++ b/src/include/stir/VectorWithOffset.h @@ -0,0 +1,413 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2012-06-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + Copyright (C) 2000- 2012, Hammersmith Imanet Ltd + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_VectorWithOffset_H__ +#define __stir_VectorWithOffset_H__ + +/*! + \file + \ingroup Array + \brief defines the stir::VectorWithOffset class + + \author Kris Thielemans + \author PARAPET project + +*/ + +#include "stir/common.h" +#include "boost/iterator/iterator_adaptor.hpp" +#include "boost/iterator/reverse_iterator.hpp" + +START_NAMESPACE_STIR + +namespace detail { +/*! \ingroup Array + \brief templated class for the iterators used by VectorWithOffset. + + There should be no need to use this class yourself. Always use + VectorWithOffset::iterator or VectorWithOffset::const_iterator. +*/ +template +class VectorWithOffset_iter + : public boost::iterator_adaptor< + VectorWithOffset_iter // Derived + , elemT* // Base + , boost::use_default // Value + , boost::random_access_traversal_tag // CategoryOrTraversal + > +{ + private: + // abbreviation of the type of this class + typedef VectorWithOffset_iter self_t; + public: + VectorWithOffset_iter() + : VectorWithOffset_iter::iterator_adaptor_(0) {} + + //! allow assignment from ordinary pointer + /*! really should be used within VectorWithOffset + It is explicit such that you can't do this by accident. + */ + explicit VectorWithOffset_iter(elemT* p) + : VectorWithOffset_iter::iterator_adaptor_(p) {} + + //! some magic trickery to be able to assign iterators to const iterators, but not to incompatible types + /*! See the boost documentation for more info. + */ + template + VectorWithOffset_iter( + VectorWithOffset_iter const& other, + typename boost::enable_if_convertible::type* = 0) + : VectorWithOffset_iter::iterator_adaptor_(other.base()) {} +}; + +} // end of namespace detail + + +/*! + \ingroup Array + \brief A templated class for vectors, but with indices starting not from 0 + + Elements are guaranteed to be stored contiguously. (Emergency) methods + are provided for accessing the data via a \c T*. + + This class tries to mimic std::vector for the most common methods, but + it is much more conservative in its memory allocations. + The only memory that is allocated is what you asked for (although the + allocated memory hardly ever shrinks, except when calling recycle()). + So, std::vector::push_back() etc are not provided, as they would be + horribly inefficient for the current class (ok, except if you would have + called reserve() first). + + It is possible to construct a VectorWithOffset that uses existing memory. + It will then never deallocate that memory obviously. Note that when growing + the vector (or assigning a bigger vector), the vector will allocate new + memory. Any modifications to the vector then will no longer be connected + to the original data block. This can always be tested using + owns_memory_for_data(). + + \warning This class does not satisfy full Container requirements. + \warning Current implementation relies on shifting a \c T* outside the range + of allocated data. This is not guaranteed to be valid by ANSI C++. It is fine + however as long as the \c min_index is negative and such that \c abs(min_index) is + smaller than \c max_index. + \todo add allocator template as in std::vector. This is non-trivial as + we would have to use uninitialized_copy etc. in some places. +*/ + +template +class VectorWithOffset +{ +public: + //! \name typedefs for iterator support + /*! Most of these should really not be needed because we use boost::iterator_adaptor now. + However, some are used directly in STIR code. (Maybe they shouldn't....) + */ + //@{ + typedef T value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef ptrdiff_t difference_type; + typedef detail::VectorWithOffset_iter iterator; + typedef detail::VectorWithOffset_iter const_iterator; + + typedef boost::reverse_iterator reverse_iterator; + typedef boost::reverse_iterator const_reverse_iterator; + //@} + typedef size_t size_type; +public: + + + //! Default constructor: creates a vector of length 0 + inline VectorWithOffset(); + + //! Construct a VectorWithOffset of given length (initialised with \c T()) + inline explicit VectorWithOffset(const int hsz); + + //! Construct a VectorWithOffset with offset \c min_index (initialised with \c T()) + inline VectorWithOffset(const int min_index, const int max_index); + + //! Construct a VectorWithOffset of given length using existing data (no initialisation) + inline explicit + VectorWithOffset(const int hsz, + T * const data_ptr, + T * const end_of_data_ptr); + + //! Construct a VectorWithOffset with offset \c min_index using existing data (no initialisation) + inline + VectorWithOffset(const int min_index, const int max_index, + T * const data_ptr, + T * const end_of_data_ptr); + + //! copy constructor + inline VectorWithOffset(const VectorWithOffset &il) ; + + //! Destructor + inline virtual ~VectorWithOffset(); + + //! Free all memory and make object as if default-constructed + /*! This is not the same as resize(0), as the latter does not + deallocate the memory (i.e. does not change the capacity()). + */ + inline void recycle(); + + //! assignment operator with another vector + inline VectorWithOffset & operator= (const VectorWithOffset &il) ; + + //! \name index range operations + //@{ + //! return number of elements in this vector + /*! \deprecated Use size() instead. */ + inline int get_length() const; + + //! return number of elements in this vector + inline size_t size() const; + + //! get value of first valid index + inline int get_min_index() const; + + //! get value of last valid index + inline int get_max_index() const; + + //! change value of starting index + inline void set_offset(const int min_index); + + //! identical to set_offset() + inline void set_min_index(const int min_index); + + //! grow the range of the vector, new elements are set to \c T() + /*! Currently, it is only checked with assert() if old range is + a subinterval of the new range. + + grow() currently simply calls resize(). However, if you overload + resize() in a derived class, it is probably safest to overload + grow() as well. + */ + inline virtual void grow(const int min_index, const int max_index); + + //! grow the range of the vector from 0 to new_size-1, new elements are set to \c T() + inline void grow(const unsigned int new_size); + + //! change the range of the vector, new elements are set to \c T() + /*! New memory is allocated if the range grows outside the range specified by + get_capacity_min_index() till get_capacity_max_index(). Data is then copied + and old memory deallocated (unless owns_memory_for_data() is false). + + \todo in principle reallocation could be avoided when the new range would fit in the + old one by shifting. + */ + inline virtual void resize(const int min_index, const int max_index); + + //! change the range of the vector from 0 to new_size-1, new elements are set to \c T() + inline void resize(const unsigned int new_size); + + + //! make the allocated range at least from \a min_index to \a max_index + inline void reserve(const int min_index, const int max_index); + + //! make the allocated range at least from 0 to new_size-1 + inline void reserve(const unsigned int new_size); + + //! get allocated size + inline size_t capacity() const; + + //! check if this object owns the memory for the data + /*! Will be false if one of the constructors is used that passes in a data block. + */ + inline bool + owns_memory_for_data() const; + + //! get min_index within allocated range + /*! This value depends on get_min_index() and hence will change + after calling set_min_index(). + + For a vector of 0 length, this function returns 0. + */ + inline int get_capacity_min_index() const; + + //! get max_index within allocated range + /*! This value depends on get_min_index() and hence will change + after calling set_min_index(). + + For a vector of 0 length, this function returns capacity()-1. + */ + inline int get_capacity_max_index() const; + //@} + + //! allow array-style access, read/write + inline T& operator[] (int i); + + //! array access, read-only + inline const T& operator[] (int i) const; + + //! allow array-style access, read/write, but with range checking (throws std::out_of_range) + inline T& at (int i); + + //! array access, read-only, but with range checking (throws std::out_of_range) + inline const T& at(int i) const; + + //! checks if the vector is empty + inline bool empty() const; + + //! \name comparison operators + //@{ + inline bool operator== (const VectorWithOffset &iv) const; + inline bool operator!= (const VectorWithOffset &iv) const; + //@} + + //! fill elements with value \a n + inline void fill(const T &n); + + //! \name access to the data via a pointer + //@{ + //! member function for access to the data via a T* + inline T* get_data_ptr(); + + //! member function for access to the data via a const T* +#ifndef STIR_NO_MUTABLE + inline const T * get_const_data_ptr() const; +#else + inline const T * get_const_data_ptr(); +#endif + + //! signal end of access to T* + inline void release_data_ptr(); + + //! signal end of access to const T* +#ifndef STIR_NO_MUTABLE + inline void release_const_data_ptr() const; +#else + inline void release_const_data_ptr(); +#endif + //@} + + //!\name basic iterator support + //@{ + //! use to initialise an iterator to the first element of the vector + inline iterator begin(); + //! use to initialise an iterator to the first element of the (const) vector + inline const_iterator begin() const; + //! iterator 'past' the last element of the vector + inline iterator end(); + //! iterator 'past' the last element of the (const) vector + inline const_iterator end() const; + + inline reverse_iterator rbegin(); + inline reverse_iterator rend(); + inline const_reverse_iterator rbegin() const; + inline const_reverse_iterator rend() const; + //@} + + /*! \name arithmetic assignment operators with objects of the same type + \warning Arguments must have matching index ranges. Otherwise error() is called. + */ + //@{ + //! adding elements of \c v to the current vector + inline VectorWithOffset & operator+= (const VectorWithOffset &v); + + //! subtracting elements of \c v from the current vector + inline VectorWithOffset & operator-= (const VectorWithOffset &v); + + //! multiplying elements of the current vector with elements of \c v + inline VectorWithOffset & operator*= (const VectorWithOffset &v); + + //! dividing all elements of the current vector by elements of \c v + inline VectorWithOffset & operator/= (const VectorWithOffset &v); + //@} +#if 0 + // next operators are disabled for now + // if enabling then, you should also put them in NumericVectorWithOffset probably + /*! \name arithmetic assignment operators with objects of the type \c T + + Note that currently the corresponding arithmetic operator are currently not implemented. + One of the reasons is that the temporary copy it would involve is normally to + be avoided at all costs. + */ + //@{ + //! adding \c t to the all elements of the current vector + inline VectorWithOffset & operator+= (const T &t); + + //! subtracting \c t from the all elements of the current vector + inline VectorWithOffset & operator-= (const T &t); + + //! multiplying elements of the current vector with \c t + inline VectorWithOffset & operator*= (const T &t); + + //! dividing all elements of the current vector by \c t + inline VectorWithOffset & operator/= (const T &t); + //@} +#endif + + /*! \name arithmetic operators with objects of the same type + + \warning Arguments must have matching index ranges. Otherwise error() is called. + \warning current implementation involves a temporary copy of the data, + unless you have a really smart compiler. + */ + //@{ + //! adding vectors, element by element + inline VectorWithOffset operator+ (const VectorWithOffset &v) const; + + //! subtracting vectors, element by element + inline VectorWithOffset operator- (const VectorWithOffset &v) const; + + //! multiplying vectors, element by element + inline VectorWithOffset operator* (const VectorWithOffset &v) const; + + //! dividing vectors, element by element + inline VectorWithOffset operator/ (const VectorWithOffset &v) const; + //@} + +protected: + + //! pointer to (*this)[0] (taking get_min_index() into account that is). + T *num; + + //! Called internally to see if all variables are consistent + inline void check_state() const; + +private: + //! length of vector + unsigned int length; + //! starting index + int start; + + T* begin_allocated_memory; + T* end_allocated_memory; + + //! Default member settings for all constructors + inline void init(); + + //! call destructors and deallocate + inline void _destruct_and_deallocate(); + + //! boolean to test if get_data_ptr is called + // This variable is declared mutable such that get_const_data_ptr() can change it. +#ifndef STIR_NO_MUTABLE + mutable +#endif + bool pointer_access; + bool _owns_memory_for_data; +}; + +END_NAMESPACE_STIR + +#include "stir/VectorWithOffset.inl" + +#endif // __VectorWithOffset_H__ diff --git a/src/include/stir/VectorWithOffset.inl b/src/include/stir/VectorWithOffset.inl new file mode 100644 index 0000000000..755758b4ee --- /dev/null +++ b/src/include/stir/VectorWithOffset.inl @@ -0,0 +1,842 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2010-07-01, Hammersmith Imanet Ltd + Copyright (C) 2012-06-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief inline implementations of stir::VectorWithOffset + + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include +#include + +START_NAMESPACE_STIR + +template +void +VectorWithOffset::init() +{ + length =0; // i.e. an empty row of zero length, + start = 0; // no offsets + num = 0; // and no data. + begin_allocated_memory = 0; + end_allocated_memory = 0; +} + +template +bool +VectorWithOffset::owns_memory_for_data() const +{ + return this->_owns_memory_for_data; +} + +/*! +This function (only non-empty when debugging) +is used before and after any modification of the object +*/ +template +void +VectorWithOffset::check_state() const +{ + // disable for normal debugging +#if _DEBUG>1 + assert(((length > 0) || + (length == 0 && start == 0 && + num == begin_allocated_memory))); + +#endif + assert(begin_allocated_memory <= num+start); + assert(end_allocated_memory>=begin_allocated_memory); + assert(static_cast(end_allocated_memory-begin_allocated_memory) >= length); + // check if data is being accessed via a pointer (see get_data_ptr()) + assert(pointer_access == false); +} + +template +void +VectorWithOffset:: +_destruct_and_deallocate() +{ + // TODO when reserve() no longer initialises new elements, + // we'll have to be careful to delete only initialised elements + // and just de-allocate the rest + + // Check on capacity probably not really necessary + // as begin_allocated_memory is == 0 in that case, and delete[] 0 doesn't do anything + // (I think). Anyway, we're on the safe side now... + if (this->owns_memory_for_data() && this->capacity() != 0) + delete[] this->begin_allocated_memory; +} + +template +void +VectorWithOffset::recycle() +{ + this->check_state(); + this->_destruct_and_deallocate(); + this->init(); +} + +template +int VectorWithOffset::get_min_index() const +{ + return start; +} + +template +int VectorWithOffset::get_max_index() const +{ + return start + length - 1; +} + +/*! Out of range errors are detected using assert() */ +template +T& +VectorWithOffset::operator[] (int i) +{ + this->check_state(); + assert(i>=this->get_min_index()); + assert(i<=this->get_max_index()); + + return num[i]; +} + +/*! Out of range errors are detected using assert() */ +template +const T& +VectorWithOffset::operator[] (int i) const +{ + this->check_state(); + assert(i>=this->get_min_index()); + assert(i<=this->get_max_index()); + + return num[i]; +} + +template +T& +VectorWithOffset::at(int i) +{ + if (length==0 || iget_min_index() || i>this->get_max_index()) + throw std::out_of_range("index out of range"); + this->check_state(); + return num[i]; +} + +template +const T& +VectorWithOffset::at(int i) const +{ + if (length==0 || iget_min_index() || i>this->get_max_index()) + throw std::out_of_range("index out of range"); + this->check_state(); + + return num[i]; +} + +template +bool +VectorWithOffset::empty() const +{ + return length==0; +} + +template +typename VectorWithOffset::iterator +VectorWithOffset::begin() +{ + this->check_state(); + return typename VectorWithOffset::iterator(num+this->get_min_index()); +} + +template +typename VectorWithOffset::const_iterator +VectorWithOffset::begin() const +{ + this->check_state(); + return typename VectorWithOffset::const_iterator(num+this->get_min_index()); +} + +template +typename VectorWithOffset::iterator +VectorWithOffset::end() +{ + this->check_state(); + return typename VectorWithOffset::iterator(num+this->get_max_index()+1); +} + +template +typename VectorWithOffset::const_iterator +VectorWithOffset::end() const +{ + this->check_state(); + return typename VectorWithOffset::const_iterator(num+this->get_max_index()+1); +} + +template +typename VectorWithOffset::reverse_iterator +VectorWithOffset::rbegin() +{ + this->check_state(); + return boost::make_reverse_iterator(end()); +} + +template +typename VectorWithOffset::const_reverse_iterator +VectorWithOffset::rbegin() const +{ + this->check_state(); + return boost::make_reverse_iterator(end()); +} + +template +typename VectorWithOffset::reverse_iterator +VectorWithOffset::rend() +{ + this->check_state(); + return boost::make_reverse_iterator(begin()); +} + +template +typename VectorWithOffset::const_reverse_iterator +VectorWithOffset::rend() const +{ + this->check_state(); + return boost::make_reverse_iterator(begin()); +} + +template +VectorWithOffset::VectorWithOffset() +: _owns_memory_for_data(true) +{ + pointer_access = false; + this->init(); +} + +template +VectorWithOffset::VectorWithOffset(const int hsz) + : length(hsz), + start(0), + pointer_access(false), + _owns_memory_for_data(true) +{ + if ((hsz > 0)) + { + num = new T[hsz]; + begin_allocated_memory = num; + end_allocated_memory = num + length; + } + else + this->init(); + this->check_state(); +} + +template +VectorWithOffset::VectorWithOffset(const int min_index, const int max_index) + : length(static_cast(max_index - min_index) + 1), + start(min_index), + pointer_access(false), + _owns_memory_for_data(true) +{ + if (max_index >= min_index) + { + num = new T[length]; + begin_allocated_memory = num; + end_allocated_memory = num + length; + num -= min_index; + } + else + this->init(); + this->check_state(); +} + + +template +VectorWithOffset:: +VectorWithOffset(const int sz, + T * const data_ptr, T * const end_of_data_ptr) + : length(static_cast(sz)), + start(0), + pointer_access(false), + _owns_memory_for_data(false) +{ + this->begin_allocated_memory = data_ptr; + this->end_allocated_memory = end_of_data_ptr; + this->num = this->begin_allocated_memory - this->start; + this->check_state(); +} + +template +VectorWithOffset:: +VectorWithOffset(const int min_index, const int max_index, + T * const data_ptr, T * const end_of_data_ptr) + : length(static_cast(max_index - min_index) + 1), + start(min_index), + pointer_access(false), + _owns_memory_for_data(false) +{ + this->begin_allocated_memory = data_ptr; + this->end_allocated_memory = end_of_data_ptr; + this->num = this->begin_allocated_memory - this->start; + this->check_state(); +} + +template +VectorWithOffset::~VectorWithOffset() +{ + _destruct_and_deallocate(); +} + +template +void +VectorWithOffset::set_offset(const int min_index) +{ + this->check_state(); + // only do something when non-zero length + if (length == 0) return; + num += start - min_index; + start = min_index; +} + +template +void +VectorWithOffset:: +set_min_index(const int min_index) +{ + this->set_offset(min_index); +} + +template +size_t +VectorWithOffset:: +capacity() const +{ + return size_t(end_allocated_memory-begin_allocated_memory); +} + +template +int +VectorWithOffset:: +get_capacity_min_index() const +{ + // the behaviour for length==0 depends on num==begin_allocated_memory + assert(length>0 || num==begin_allocated_memory); + return static_cast(begin_allocated_memory - num); +} + +template +int +VectorWithOffset:: +get_capacity_max_index() const +{ + // the behaviour for length==0 depends on num==begin_allocated_memory + assert(length>0 || num==begin_allocated_memory); + return static_cast(end_allocated_memory - num - 1); +} + +//the new members will be initialised with the default constructor for T +// but this should change in the future +template +void +VectorWithOffset:: +reserve(const int new_capacity_min_index, const int new_capacity_max_index) +{ + this->check_state(); + const int actual_capacity_min_index = + length==0 + ? new_capacity_min_index + : std::min(this->get_capacity_min_index(), new_capacity_min_index); + const int actual_capacity_max_index = + length==0 + ? new_capacity_max_index + : std::max(this->get_capacity_max_index(), new_capacity_max_index); + if (actual_capacity_min_index > actual_capacity_max_index) + return; + + const unsigned int new_capacity = + static_cast(actual_capacity_max_index - actual_capacity_min_index) + 1; + if (new_capacity <= this->capacity()) + return; + // TODO use allocator here instead of new + T *newmem = new T[new_capacity]; + const unsigned extra_at_the_left = + length==0 + ? 0U + : std::max(0, this->get_min_index() - actual_capacity_min_index); + std::copy(this->begin(), this->end(), + newmem + extra_at_the_left); + this->_destruct_and_deallocate(); + begin_allocated_memory = newmem; + end_allocated_memory = begin_allocated_memory + new_capacity; + _owns_memory_for_data =true; + num = begin_allocated_memory + extra_at_the_left - (length>0?start:0); + this->check_state(); +} + +template +void +VectorWithOffset:: +reserve(const unsigned int new_size) +{ + // note: for 0 new_size, we avoid a wrap-around + // otherwise we would be reserving quite a lot of memory! + if (new_size!=0) + reserve(0, static_cast(new_size-1)); +} + +//the new members will be initialised with the default constructor for T +template +void +VectorWithOffset:: +resize(const int min_index, const int max_index) +{ + this->check_state(); + if (min_index > max_index) + { + length = 0; start = 0; num = begin_allocated_memory; + return; + } + const unsigned old_length = length; + if (old_length>0) + { + if (min_index == this->get_min_index() && max_index == this->get_max_index()) + return; + // determine overlapping range to avoid copying too much data when calling reserve() + const int overlap_min_index = std::max(this->get_min_index(), min_index); + const int overlap_max_index = std::min(this->get_max_index(), max_index); + // TODO when using non-initialised memory, call delete here on elements that go out of range + length = + overlap_max_index - overlap_min_index < 0 ? + 0 : + static_cast(overlap_max_index - overlap_min_index) + 1; + if (length==0) + { + start = 0; num = begin_allocated_memory; + } + else + { + // do not change num as num[0] should remain the same + start = overlap_min_index; + } + } // end if (length>0) + const unsigned overlapping_length = length; + this->reserve(min_index, max_index); + // TODO when using allocator, call default constructor for new elements here + // (and delete the ones that go out of range!) + length = + static_cast(max_index - min_index) + 1; + start = min_index; + if (overlapping_length>0) + { + // do not change num as num[0] should remain the same + } + else + { + // we have reallocated the whole array, so set num correctly + num = begin_allocated_memory - min_index; + } + this->check_state(); +} + +template +void +VectorWithOffset::resize(const unsigned new_size) +{ + if (new_size==0) + { + length = 0; start = 0; num = begin_allocated_memory; + } + else + this->resize(0,static_cast(new_size-1)); +} + +//the new members will be initialised with the default constructor for T +template +void +VectorWithOffset:: +grow(const int min_index, const int max_index) +{ + // allow grow arbitrary when it's zero length + assert(length == 0 || (min_index <= this->get_min_index() && max_index >= this->get_max_index())); + this->resize(min_index, max_index); +} + +template +void +VectorWithOffset::grow(const unsigned new_size) +{ + this->grow(0,static_cast(new_size-1)); +} + +template +VectorWithOffset & +VectorWithOffset::operator= (const VectorWithOffset &il) +{ + this->check_state(); + if (this == &il) return *this; // in case of x=x + { + if (this->capacity() < il.size()) + { + // first truncate current and then reserve space + length = 0; + start = 0; + num = begin_allocated_memory; + this->reserve(il.get_min_index(), il.get_max_index()); + } + length = il.length; + this->set_offset(il.get_min_index()); + std::copy(il.begin(), il.end(), this->begin()); + } + + this->check_state(); + return *this; +} + + +template +VectorWithOffset::VectorWithOffset(const VectorWithOffset &il) + : pointer_access(false), + _owns_memory_for_data(true) +{ + this->init(); + *this = il; // Uses assignment operator (above) +} + +template +int VectorWithOffset::get_length() const +{ + this->check_state(); + return static_cast(length); +} + +template +size_t VectorWithOffset::size() const +{ + this->check_state(); + return size_t(length); +} + +template +bool +VectorWithOffset::operator== (const VectorWithOffset &iv) const +{ + this->check_state(); + if (length != iv.length || start != iv.start) return false; + return std::equal(this->begin(), this->end(), iv.begin()); +} + +template +bool +VectorWithOffset::operator!= (const VectorWithOffset &iv) const +{ return !(*this == iv); } + +template +void +VectorWithOffset::fill(const T &n) +{ + this->check_state(); + //TODO use std::fill() if we can use namespaces (to avoid name conflicts) + //std::fill(begin(), end(), n); + for(int i=this->get_min_index(); i<=this->get_max_index(); i++) + num[i] = n; + this->check_state(); +} + + + +/*! + This returns a \c T* to the first element of a, + members are guaranteed to be stored contiguously in memory. + + Use only in emergency cases... + + To prevent invalidating the safety checks (and making + reimplementation more difficult), NO manipulation with + the vector is allowed between the pairs + get_data_ptr() and release_data_ptr() + and + get_const_data_ptr() and release_data_ptr(). + (This is checked with assert() in DEBUG mode.) +*/ +template +T* +VectorWithOffset::get_data_ptr() +{ + assert(!pointer_access); + + pointer_access = true; + return (num+start); + + // if implementation changes, this would need to keep track + // if which pointer it returns. +}; + +/*! + This returns a \c const \c T* to the first element of a, + members are guaranteed to be stored contiguously in memory. + + Use get_const_data_ptr() when you are not going to modify + the data. + + \see get_data_ptr() +*/ +template +const T * +VectorWithOffset::get_const_data_ptr() +#ifndef STIR_NO_MUTABLE +const +#endif +{ + assert(!pointer_access); + + pointer_access = true; + return (num+start); + + // if implementation changes, this would need to keep track + // if which pointer it returns. +}; + +/*! + This has to be used when access to the T* returned by get_data_ptr() is + finished. It updates + the vector with any changes you made, and allows access to + the other member functions again. + + \see get_data_ptr() +*/ +template +void +VectorWithOffset::release_data_ptr() +{ + assert(pointer_access); + + pointer_access = false; +} + +/*! + This has to be used when access to the const T* returned by get_const_data_ptr() is + finished. It allows access to + the other member functions again. + + \see get_const_data_ptr() +*/ + +template +void +VectorWithOffset::release_const_data_ptr() +#ifndef STIR_NO_MUTABLE +const +#endif +{ + assert(pointer_access); + + pointer_access = false; +} + +/********************** arithmetic operators ****************/ +template +inline VectorWithOffset& +VectorWithOffset::operator+= (const VectorWithOffset &v) +{ + this->check_state(); +#if 1 + if (this->get_min_index() != v.get_min_index() && + this->get_max_index() != v.get_max_index()) + error("VectorWithOffset::+= with non-matching range"); +#else + // first check if *this is empty + if (this->get_length() == 0) + { + return *this = v; + } + this->grow (std::min(get_min_index(),v.get_min_index()), std::max(get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + num[i] += v.num[i]; + this->check_state(); + return *this; +} + +template +inline VectorWithOffset& +VectorWithOffset::operator-= (const VectorWithOffset &v) +{ + this->check_state(); +#if 1 + if (this->get_min_index() != v.get_min_index() && + this->get_max_index() != v.get_max_index()) + error("VectorWithOffset::-= with non-matching range"); +#else + // first check if *this is empty + if (get_length() == 0) + { + *this = v; + return *this *= -1; + } + grow (std::min(get_min_index(),v.get_min_index()), std::max(get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + num[i] -= v.num[i]; + this->check_state(); + return *this; +} + +template +inline VectorWithOffset& +VectorWithOffset::operator*= (const VectorWithOffset &v) +{ + this->check_state(); +#if 1 + if (this->get_min_index() != v.get_min_index() && + this->get_max_index() != v.get_max_index()) + error("VectorWithOffset::*= with non-matching range"); +#else + // first check if *this is empty + if (get_length() == 0) + { + // we have to return an object of the same dimensions as v, but filled with 0. + *this =v; + return *this *= 0; + } + grow (std::min(get_min_index(),v.get_min_index()), std::max(get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + num[i] *= v.num[i]; + this->check_state(); + return *this; +} + +template +inline VectorWithOffset& +VectorWithOffset::operator/= (const VectorWithOffset &v) +{ + this->check_state(); +#if 1 + if (this->get_min_index() != v.get_min_index() && + this->get_max_index() != v.get_max_index()) + error("VectorWithOffset::/= with non-matching range"); +#else + // first check if *this is empty + if (get_length() == 0) + { + // we have to return an object of the same dimensions as v, but filled with 0. + *this =v; + return *this *= 0; + } + grow (std::min(get_min_index(),v.get_min_index()), std::max(get_max_index(),v.get_max_index())); +#endif + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + num[i] /= v.num[i]; + this->check_state(); + return *this; +} + +/**** operator+=(T) etc *****/ +#if 0 +// disabled for now +// warning: not tested +template +inline VectorWithOffset& +VectorWithOffset::operator+= (const T &t) +{ + typename iterator iter = this->begin(); + const typename iterator end_iter = this->end(); + while (iter != end_iter) + *iter++ += t; +} + +template +inline VectorWithOffset& +VectorWithOffset::operator-= (const T &t) +{ + typename iterator iter = this->begin(); + const typename iterator end_iter = this->end(); + while (iter != end_iter) + *iter++ -= t; +} +template +inline VectorWithOffset& +VectorWithOffset::operator*= (const T &t) +{ + typename iterator iter = this->begin(); + const typename iterator end_iter = this->end(); + while (iter != end_iter) + *iter++ *= t; +} +template +inline VectorWithOffset& +VectorWithOffset::operator/= (const T &t) +{ + typename iterator iter = this->begin(); + const typename iterator end_iter = this->end(); + while (iter != end_iter) + *iter++ /= t; +} + +#endif + +/**** operator* etc ********/ + +// addition +template +inline VectorWithOffset +VectorWithOffset::operator+ (const VectorWithOffset &v) const +{ + this->check_state(); + VectorWithOffset retval(*this); + return retval += v; +} + +// subtraction +template +inline VectorWithOffset +VectorWithOffset::operator- (const VectorWithOffset &v) const +{ + this->check_state(); + VectorWithOffset retval(*this); + return retval -= v; +} + +// elem by elem multiplication +template +inline VectorWithOffset +VectorWithOffset::operator* (const VectorWithOffset &v) const +{ + this->check_state(); + VectorWithOffset retval(*this); + return retval *= v; +} + +// elem by elem division +template +inline VectorWithOffset +VectorWithOffset::operator/ (const VectorWithOffset &v) const +{ + this->check_state(); + VectorWithOffset retval(*this); + return retval /= v; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/ViewSegmentNumbers.h b/src/include/stir/ViewSegmentNumbers.h new file mode 100644 index 0000000000..8fb271be85 --- /dev/null +++ b/src/include/stir/ViewSegmentNumbers.h @@ -0,0 +1,83 @@ +// +// +/*! + \file + \ingroup projdata + + \brief Definition of class stir::ViewSegmentNumbers + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + + +#ifndef __stir_ViewSegmentNumbers_h__ +#define __stir_ViewSegmentNumbers_h__ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +/*! + \brief A very simple class to store view and segment numbers + \ingroup projdata +*/ +class ViewSegmentNumbers +{ +public: + + //! an empty constructor (sets everything to 0) + inline ViewSegmentNumbers(); + //! constructor taking view and segment number as arguments + inline ViewSegmentNumbers( const int view_num,const int segment_num); + + //! get segment number for const objects + inline int segment_num() const; + //! get view number for const objects + inline int view_num() const; + + //! get reference to segment number + inline int& segment_num(); + //! get reference to view number + inline int& view_num(); + + + //! comparison operator, only useful for sorting + /*! order : (0,1) < (0,-1) < (1,1) ...*/ + inline bool operator<(const ViewSegmentNumbers& other) const; + + //! test for equality + inline bool operator==(const ViewSegmentNumbers& other) const; + inline bool operator!=(const ViewSegmentNumbers& other) const; + +private: + int segment; + int view; + +}; + +END_NAMESPACE_STIR + +#include "stir/ViewSegmentNumbers.inl" + +#endif diff --git a/src/include/stir/ViewSegmentNumbers.inl b/src/include/stir/ViewSegmentNumbers.inl new file mode 100644 index 0000000000..198bd32999 --- /dev/null +++ b/src/include/stir/ViewSegmentNumbers.inl @@ -0,0 +1,81 @@ +/*! + \file + \ingroup projdata + + \brief inline implementations for class stir::ViewSegmentNumbers + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +START_NAMESPACE_STIR + +ViewSegmentNumbers::ViewSegmentNumbers() +:segment(0),view(0) + {} + +ViewSegmentNumbers::ViewSegmentNumbers( const int view_num,const int segment_num) + : segment(segment_num),view(view_num) + {} + +int +ViewSegmentNumbers::segment_num() const +{ + return segment;} +int +ViewSegmentNumbers::view_num() const +{ + return view;} + + +int& +ViewSegmentNumbers::segment_num() +{ return segment;} + +int& +ViewSegmentNumbers::view_num() +{ return view;} + +bool +ViewSegmentNumbers:: +operator<(const ViewSegmentNumbers& other) const +{ + return (view< other.view) || + ((view == other.view) && (segment > other.segment)); +} + +bool +ViewSegmentNumbers:: +operator==(const ViewSegmentNumbers& other) const +{ + return (view == other.view) && (segment == other.segment); +} + +bool +ViewSegmentNumbers:: +operator!=(const ViewSegmentNumbers& other) const +{ + return !(*this == other); +} +END_NAMESPACE_STIR diff --git a/src/include/stir/Viewgram.h b/src/include/stir/Viewgram.h new file mode 100644 index 0000000000..986b18ead5 --- /dev/null +++ b/src/include/stir/Viewgram.h @@ -0,0 +1,148 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projdata + + \brief Declaration of class stir::Viewgram + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +#ifndef __Viewgram_h__ +#define __Viewgram_h__ + + +#include "stir/Array.h" +#include "stir/ProjDataInfo.h" +#include "stir/IndexRange.h" +#include "stir/shared_ptr.h" + + +START_NAMESPACE_STIR + +/*! + \ingroup projdata + \brief A class for 2d projection data. + + This represents a subset of the full projection. segment_num and tangential_pos_num + are fixed. + +*/ + +template +class Viewgram : public Array<2,elemT> +{ +private: + typedef Array<2,elemT> base_type; +#ifdef SWIG + // SWIG needs the next typedef to be public +public: +#endif + typedef Viewgram self_type; +#ifdef SWIG + // SWIG needs a default constructor + inline Viewgram() {} +#endif + +public: + //! Construct from proj_data_info pointer, view and segment number. Data are set to 0. + inline Viewgram(const shared_ptr& proj_data_info_ptr, + const int v_num, const int s_num); + + //! Construct with data set to the array. + inline Viewgram(const Array<2,elemT>& p,const shared_ptr& proj_data_info_ptr, + const int v_num, const int s_num); + + + //! Get segment number + inline int get_segment_num() const; + //! Get number of views + inline int get_view_num() const; + //! Get minimum number of axial positions + inline int get_min_axial_pos_num() const; + //! Get maximum number of axial positions + inline int get_max_axial_pos_num() const; + //! Get number of axial positions + inline int get_num_axial_poss() const; + //! Get minimum number of axial positions + inline int get_min_tangential_pos_num() const; + //! Get maximum number of tangetial positions + inline int get_max_tangential_pos_num() const; + //! Get number of tangential positions + inline int get_num_tangential_poss() const; + + //! Get an empty viewgram of the same dimensions, segment_num etc. + inline Viewgram get_empty_copy(void) const; + + //! Overloading Array::grow + void grow(const IndexRange<2>& range); + //! Overloading Array::resize + void resize(const IndexRange<2>& range); + + //! Get the proj_data_info pointer + /*! \warning Do not use this pointer after the Viewgram object is destructed. + */ + inline const ProjDataInfo* get_proj_data_info_ptr() const; + + //! \name Equality + //@{ + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! If they do \c not have the same characteristics, the string \a explanation + explains why. + */ + bool + has_same_characteristics(self_type const&, + string& explanation) const; + + //! Checks if the 2 objects have the proj_data_info, segment_num etc. + /*! Use this version if you do not need to know why they do not match. + */ + bool + has_same_characteristics(self_type const&) const; + + //! check equality (data has to be identical) + /*! Uses has_same_characteristics() and Array::operator==. + \warning This function uses \c ==, which might not be what you + need to check when \c elemT has data with float or double numbers. + */ + bool operator ==(const self_type&) const; + + //! negation of operator== + bool operator !=(const self_type&) const; + //@} + +private: + + shared_ptr proj_data_info_ptr; + int view_num; + int segment_num; +}; + +END_NAMESPACE_STIR + +#include "stir/Viewgram.inl" + +#endif diff --git a/src/include/stir/Viewgram.inl b/src/include/stir/Viewgram.inl new file mode 100644 index 0000000000..88a32e0c8b --- /dev/null +++ b/src/include/stir/Viewgram.inl @@ -0,0 +1,135 @@ +// +// +/*! + + \file + \ingroup projdata + + \brief Inline implementations of class stir::Viewgram + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/IndexRange2D.h" + +START_NAMESPACE_STIR + +template +int +Viewgram::get_segment_num() const +{ return segment_num; } + +template +int +Viewgram::get_view_num() const +{ return view_num; } + +template +int +Viewgram::get_min_axial_pos_num() const + {return this->get_min_index();} + +template +int +Viewgram::get_max_axial_pos_num() const + { return this->get_max_index(); } + +template +int +Viewgram::get_num_axial_poss() const + { return this->get_length();} + + +template +int +Viewgram::get_num_tangential_poss() const + { return this->get_length()==0 ? 0 : (*this)[get_min_axial_pos_num()].get_length();} + + +template +int +Viewgram::get_min_tangential_pos_num() const + { return this->get_length()==0 ? 0 :(*this)[get_min_axial_pos_num()].get_min_index();} + +template +int +Viewgram::get_max_tangential_pos_num() const +{ return this->get_length()==0 ? 0 :(*this)[get_min_axial_pos_num()].get_max_index(); } + + +template +Viewgram +Viewgram::get_empty_copy(void) const + { + Viewgram copy(proj_data_info_ptr, get_view_num(), get_segment_num()); + return copy; +} + +template +const ProjDataInfo* +Viewgram:: get_proj_data_info_ptr()const +{ + return proj_data_info_ptr.get(); +} + + +template +Viewgram:: +Viewgram(const Array<2,elemT>& p, + const shared_ptr& pdi_ptr, + const int v_num, const int s_num) + : + Array<2,elemT>(p), proj_data_info_ptr(pdi_ptr), + view_num(v_num), segment_num(s_num) +{ + assert(view_num <= proj_data_info_ptr->get_max_view_num()); + assert(view_num >= proj_data_info_ptr->get_min_view_num()); + // segment_num is already checked by doing get_max_axial_pos_num(s_num) + + assert( get_min_axial_pos_num() == pdi_ptr->get_min_axial_pos_num(s_num)); + assert( get_max_axial_pos_num() == pdi_ptr->get_max_axial_pos_num(s_num)); + assert( get_min_tangential_pos_num() == pdi_ptr->get_min_tangential_pos_num()); + assert( get_max_tangential_pos_num() == pdi_ptr->get_max_tangential_pos_num()); +} + +template +Viewgram:: +Viewgram(const shared_ptr& pdi_ptr, + const int v_num, const int s_num) + : + Array<2,elemT>(IndexRange2D (pdi_ptr->get_min_axial_pos_num(s_num), + pdi_ptr->get_max_axial_pos_num(s_num), + pdi_ptr->get_min_tangential_pos_num(), + pdi_ptr->get_max_tangential_pos_num())), + proj_data_info_ptr(pdi_ptr), + view_num(v_num), + segment_num(s_num) +{ + assert(view_num <= proj_data_info_ptr->get_max_view_num()); + assert(view_num >= proj_data_info_ptr->get_min_view_num()); + // segment_num is already checked by doing get_max_axial_pos_num(s_num) +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/VoxelsOnCartesianGrid.h b/src/include/stir/VoxelsOnCartesianGrid.h new file mode 100644 index 0000000000..6d1ed8fa05 --- /dev/null +++ b/src/include/stir/VoxelsOnCartesianGrid.h @@ -0,0 +1,186 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_VoxelsOnCartesianGrid_H__ +#define __stir_VoxelsOnCartesianGrid_H__ + +/*! + \file + \ingroup densitydata + \brief defines the stir::VoxelsOnCartesianGrid class + + \author Sanida Mustafovic + \author Kris Thielemans (with help from Alexey Zverovich) + \author PARAPET project + + +*/ +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/CartesianCoordinate3D.h" + +START_NAMESPACE_STIR + +class ProjDataInfo; +template class PixelsOnCartesianGrid; + +/*! + \ingroup densitydata + \brief This class is used to represent voxelised densities on a cuboid + grid (3D). + + This class represents 'normal' data. Basisfunctions are just voxels. +*/ +template +class VoxelsOnCartesianGrid:public DiscretisedDensityOnCartesianGrid<3,elemT> +{ + +public: + +#if 0 + //! Asks for filename etc, and returns an image +static VoxelsOnCartesianGrid ask_parameters(); +#endif + +//! Construct an empty VoxelsOnCartesianGrid (empty range, 0 origin, 0 grid_spacing) +VoxelsOnCartesianGrid(); + +//! Construct a VoxelsOnCartesianGrid, initialising data from the Array<3,elemT> object. +/*! All elements are set 0. */ +VoxelsOnCartesianGrid(const Array<3,elemT>& v, + const CartesianCoordinate3D& origin, + const BasicCoordinate<3,float>& grid_spacing); + +//! Construct a VoxelsOnCartesianGrid from an index range +/*! All elements are set 0. */ +VoxelsOnCartesianGrid(const IndexRange<3>& range, + const CartesianCoordinate3D& origin, + const BasicCoordinate<3,float>& grid_spacing); + + // KT 10/12/2001 replace 2 constructors with the more general one below +//! use ProjDataInfo to obtain the size information +/*! + When sizes.x() is -1, a default size in x is found by taking the diameter + of the FOV spanned by the projection data. Similar for sizes.y(). + + When sizes.z() is -1, a default size in z is found by taking the number of planes as +
          +
        • $N_0$ when segment 0 is axially compressed,
        • +
        • $2N_0-1$ when segment 0 is not axially compressed,
        • +
        + where $N_0$ is the number of sinograms in segment 0. + + Actual index ranges start from 0 for z, but from -(x_size_used/2) for x (and similar for y). + + x,y grid spacing are set to the + proj_data_info_ptr-\>get_scanner_ptr()-\>get_default_bin_size()/zoom. + This is to make sure that the voxel size is independent on if arc-correction is used or not. + If the default bin size is 0, the sampling distance in s (for bin 0) is used. + + z grid spacing is set to half the scanner ring distance. + + All voxel values are set 0. + +*/ +VoxelsOnCartesianGrid(const ProjDataInfo& proj_data_info_ptr, + const float zoom = 1.F, + const CartesianCoordinate3D& origin = CartesianCoordinate3D(0.F,0.F,0.F), + const CartesianCoordinate3D& sizes = CartesianCoordinate3D(-1,-1,-1)); + + +//! Definition of the pure virtual defined in DiscretisedDensity +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +DiscretisedDensity<3,elemT>* +#else +VoxelsOnCartesianGrid* +#endif + get_empty_copy() const; + +//! Like get_empty_copy, but returning a pointer to a VoxelsOnCartesianGrid +VoxelsOnCartesianGrid* get_empty_voxels_on_cartesian_grid() const; + +#ifdef STIR_NO_COVARIANT_RETURN_TYPES +virtual DiscretisedDensity<3,elemT>* +#else +virtual VoxelsOnCartesianGrid* +#endif +clone() const; + +//! Extract a single plane +PixelsOnCartesianGrid get_plane(const int z) const; + +//! Set a single plane +void set_plane(const PixelsOnCartesianGrid& plane, const int z); + +//! is the same as get_grid_spacing(), but now returns CartesianCoordinate3D for convenience +inline CartesianCoordinate3D get_voxel_size() const; + +//! is the same as set_grid_spacing() +void set_voxel_size(const BasicCoordinate<3,float>&); + +//! Growing of outer dimension only +void grow_z_range(const int min_z, const int max_z); + + //! \name Convenience functions for regular grids in 3D + /*! It is assumed that \c z is the highest dimension and \c x the lowest. + */ + //@{ + inline int get_x_size() const; + + inline int get_y_size() const; + + inline int get_z_size() const; + + inline int get_min_x() const; + + inline int get_min_y() const; + + inline int get_min_z() const; + + inline int get_max_x() const; + + inline int get_max_y() const; + + inline int get_max_z() const; + + BasicCoordinate<3,int> get_lengths() const; + BasicCoordinate<3,int> get_min_indices() const; + BasicCoordinate<3,int> get_max_indices() const; + + //@} + +}; + + +END_NAMESPACE_STIR + +#include "stir/VoxelsOnCartesianGrid.inl" +#endif + + + + + + + + + + + + diff --git a/src/include/stir/VoxelsOnCartesianGrid.inl b/src/include/stir/VoxelsOnCartesianGrid.inl new file mode 100644 index 0000000000..9d84001474 --- /dev/null +++ b/src/include/stir/VoxelsOnCartesianGrid.inl @@ -0,0 +1,100 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup densitydata + \brief inline implementations for the stir::VoxelsOnCartesianGrid class + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + + +*/ +START_NAMESPACE_STIR + + +template +CartesianCoordinate3D +VoxelsOnCartesianGrid::get_voxel_size() const +{ + return CartesianCoordinate3D(this->get_grid_spacing()); +} + +template +int +VoxelsOnCartesianGrid:: +get_min_z() const +{ return this->get_min_index();} + + +template +int +VoxelsOnCartesianGrid:: +get_min_y() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_z()].get_min_index(); } + +template +int +VoxelsOnCartesianGrid:: +get_min_x() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_z()][get_min_y()].get_min_index(); } + + +template +int +VoxelsOnCartesianGrid:: +get_x_size() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_z()][get_min_y()].get_length(); } + +template +int +VoxelsOnCartesianGrid:: +get_y_size() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_z()].get_length();} + +template +int +VoxelsOnCartesianGrid:: +get_z_size() const +{ return this->get_length(); } + + +template +int +VoxelsOnCartesianGrid:: +get_max_x() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_z()][get_min_y()].get_max_index();} + +template +int +VoxelsOnCartesianGrid:: +get_max_y() const +{ return this->get_length()==0 ? 0 : (*this)[get_min_z()].get_max_index();} + +template +int +VoxelsOnCartesianGrid:: +get_max_z() const +{ return this->get_max_index(); } + + + +END_NAMESPACE_STIR diff --git a/src/include/stir/analytic/FBP2D/FBP2DReconstruction.h b/src/include/stir/analytic/FBP2D/FBP2DReconstruction.h new file mode 100644 index 0000000000..4ab8bcd554 --- /dev/null +++ b/src/include/stir/analytic/FBP2D/FBP2DReconstruction.h @@ -0,0 +1,156 @@ +// +// +#ifndef __stir_analytic_FBP2D_FBP2DReconstruction_H__ +#define __stir_analytic_FBP2D_FBP2DReconstruction_H__ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup FBP2D + + \brief declares the stir::FBP2DReconstruction class + + \author Kris Thielemans + \author PARAPET project + +*/ + +#include "stir/recon_buildblock/AnalyticReconstruction.h" +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include +#include "stir/shared_ptr.h" + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + +template class DiscretisedDensity; +class Succeeded; +class ProjData; + +/*! \ingroup FBP2D + \brief Reconstruction class for 2D Filtered Back Projection + + \par Parameters + \verbatim +fbp2dparameters := + +input file := input.hs +output filename prefix := output + +; output image parameters +; zoom defaults to 1 +zoom := 1 +; image size defaults to whole FOV +xy output image size (in pixels) := 180 + +; can be used to call SSRB first +; default means: call SSRB only if no axial compression is already present +;num segments to combine with ssrb := -1 + +; filter parameters, default to pure ramp +alpha parameter for ramp filter := 1 +cut-off for ramp filter (in cycles) := 0.5 + +; allow less padding. DO NOT USE +; (unless you're sure that the object occupies only half the FOV) +;Transaxial extension for FFT:=1 + +; back projector that could be used (defaults to interpolating backprojector) +; Back projector type:= some type + +; display data during processing for debugging purposes +; Display level := 0 +end := + \endverbatim + + alpha specifies the usual Hamming window (although I'm not so sure about the terminology here). So, + for the "ramp filter" alpha =1. In frequency space, something like (from RampFilter.cxx) + + \code + (alpha + (1 - alpha) * cos(_PI * f / fc)) + \endcode + +*/ +class FBP2DReconstruction : public AnalyticReconstruction +{ + typedef AnalyticReconstruction base_type; +public: + //! Default constructor (calls set_defaults()) + FBP2DReconstruction (); + /*! + \brief Constructor, initialises everything from parameter file, or (when + parameter_filename == "") by calling ask_parameters(). + */ + explicit + FBP2DReconstruction(const string& parameter_filename); + + FBP2DReconstruction(const shared_ptr&, + const double alpha_ramp=1., + const double fc_ramp=.5, + const int pad_in_s=2, + const int num_segments_to_combine=-1 + ); + + virtual string method_info() const; + + virtual void ask_parameters(); + + protected: // make parameters protected such that doc shows always up in doxygen + // parameters used for parsing + + //! Ramp filter: Alpha value + double alpha_ramp; + //! Ramp filter: Cut off frequency + double fc_ramp; + //! amount of padding for the filter (has to be 0,1 or 2) + int pad_in_s; + //! number of segments to combine (with SSRB) before starting 2D reconstruction + /*! if -1, a value is chosen depending on the axial compression. + If there is no axial compression, num_segments_to_combine is + effectively set to 3, otherwise it is set to 1. + \see SSRB + */ + int num_segments_to_combine; + //! potentially display data + /*! allowed values: \c display_level=0 (no display), 1 (only final image), + 2 (filtered-viewgrams). Defaults to 0. + */ + int display_level; + private: + Succeeded actual_reconstruct(shared_ptr > const & target_image_ptr); + + shared_ptr back_projector_sptr; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + bool post_processing_only_FBP2D_parameters(); + +}; + + + + +END_NAMESPACE_STIR + + +#endif + diff --git a/src/include/stir/analytic/FBP2D/RampFilter.h b/src/include/stir/analytic/FBP2D/RampFilter.h new file mode 100644 index 0000000000..7a2ad311c1 --- /dev/null +++ b/src/include/stir/analytic/FBP2D/RampFilter.h @@ -0,0 +1,80 @@ +// +// +/*! + \file + \brief Definition of class RampFilter, used for (2D) FBP + \ingroup FBP2D + \author Claire Labbe + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_FBP2D_RampFilter_H__ +#define __stir_FBP2D_RampFilter_H__ + +#ifdef NRFFT +#include "local/stir/Filter.h" +#else +#include "stir/ArrayFilterUsingRealDFTWithPadding.h" +#include "stir/TimedObject.h" +#endif +#include + +START_NAMESPACE_STIR +/*! + \ingroup FBP2D + \brief The ramp filter used for (2D) FBP + + The filter has 2 parameters: a cut-off frequency \c fc and \c alpha which specifies the usual + Hamming window (although I'm not so sure about the terminology here). So, + for the "ramp filter" alpha =1. In frequency space, something like (from RampFilter.cxx) + + \code + (alpha + (1 - alpha) * cos(_PI * f / fc)) + \endcode + + The actual implementation works differently to overcome problems with defining the ramp in frequency + space (with a well-known DC offset as consequence). We therefore compute the ramp*Hanning in + "ordinary" space in continuous form, do the sampling there, and then DFT it. +*/ +class RampFilter : +#ifdef NRFFT + public Filter1D +#else + public ArrayFilterUsingRealDFTWithPadding<1,float>, + public TimedObject +#endif +{ + +private: + float fc; + float alpha; + float sampledist; + public: + RampFilter(float sampledist_v, int length_v , float alpha_v=1, float fc_v=.5); + + virtual std::string parameter_info() const; + +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/analytic/FBP3DRP/ColsherFilter.h b/src/include/stir/analytic/FBP3DRP/ColsherFilter.h new file mode 100644 index 0000000000..267fa0e959 --- /dev/null +++ b/src/include/stir/analytic/FBP3DRP/ColsherFilter.h @@ -0,0 +1,140 @@ +// +// + +/*! + \file + \ingroup FBP3DRP + \brief Colsher filter class + \author Claire LABBE + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2004, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __ColsherFilter_H__ +#define __ColsherFilter_H__ + +#ifdef NRFFT +#include "local/stir/Filter.h" +#else +#include "stir/ArrayFilterUsingRealDFTWithPadding.h" +#include "stir/TimedObject.h" +#endif + +START_NAMESPACE_STIR +#ifdef NRFFT +template class Viewgram; +#endif + +/*! + \ingroup FBP3DRP + \brief This class contains the Colsher filter used for 3D-PET reconstruction. + + The Colsher filter is combined with a 2-dimensional apodising Hamming filter. +*/ +class ColsherFilter: +#ifdef NRFFT + public Filter2D +#else + public ArrayFilterUsingRealDFTWithPadding<2,float>, + public TimedObject +#endif +{ + +public: +#ifndef NRFFT + //! Default constructor + /*! \warning Leaves object in ill-defined state*/ + ColsherFilter() {} + /*! + \brief constructor for the ColsherFilter. + + \param theta_max + the polar angle corresponding to the maximum oblique angle + included in the reconstruction. + + The \c alpha and \c fc parameters are designed to minimize the + amplification of noise. + + The \c stretch_factor parameters can be used to define the Colsher + filter via a finer grid to avoid the problems with sampling a + continuous filter in frequency space. For the ramp-filter, this can + be done using analytic integration, but here we have to do it numerically. + */ + explicit ColsherFilter(float theta_max, + float alpha_colsher_axial=1.F, float fc_colsher_axial=0.5F, + float alpha_colsher_radial=1.F, float fc_colsher_radial=0.5F, + const int stretch_factor_axial=2, + const int stretch_factor_planar=2); + //! Initialise filter values + /*! creates a 2D Colsher filter of size height*width, + \param theta the polar angle + \param d_a the sampling distance in the 's' coordinate + \param d_b the sampling distance in the 't' coordinate + */ + Succeeded + set_up(int height, int width, float theta, + float d_a, float d_b); +#else + ColsherFilter(int height, int width, float gamma, float theta_max, + float d_a, float d_b, + float alpha_colsher_axial, float fc_colsher_axial, + float alpha_colsher_radial, float fc_colsher_radial); +#endif + + virtual std::string parameter_info() const; + + ~ColsherFilter() {} + + + private: +#ifdef NRFFT + //! gamma is the polar angle + float gamma; + /* d_a, d_b are used to convert to millimeter.*/ + //! d_a is initialised with the sampling distance + float d_a; + //! d_b is initialised with ring spacing * sin(theta) + float d_b; +#endif + //! theta_max corresponds to the maximum aperture in the reconstruction + float theta_max; + //! value of the axial alpha parameter for apodized Hamming window + float alpha_axial; + //! value of the axial cut-off frequency of the Colsher filter + float fc_axial; + //! value of the planar alpha parameter for apodized Hamming window + float alpha_planar; + //! value of the planar cut-off frequency of the Colsher filter + float fc_planar; + int stretch_factor_axial; + int stretch_factor_planar; +}; + +#ifdef NRFFT +void Filter_proj_Colsher(Viewgram & view_i, + Viewgram & view_i1, + ColsherFilter& CFilter, + int PadS, int PadZ); +#endif +END_NAMESPACE_STIR + +#endif // __ColsherFilter_H__ + diff --git a/src/include/stir/analytic/FBP3DRP/FBP3DRPReconstruction.h b/src/include/stir/analytic/FBP3DRP/FBP3DRPReconstruction.h new file mode 100644 index 0000000000..3080c905c7 --- /dev/null +++ b/src/include/stir/analytic/FBP3DRP/FBP3DRPReconstruction.h @@ -0,0 +1,267 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup FBP3DRP + \brief Declaration of class stir::FBP3DRPReconstruction + \author Claire LABBE + \author Kris Thielemans + \author PARAPET project +*/ + +#ifndef __stir_analytic_FBP3DRP_FBP3DRPRECONSTRUCTION_H__ +#define __stir_analytic_FBP3DRP_FBP3DRPRECONSTRUCTION_H__ + + + +#include "stir/recon_buildblock/AnalyticReconstruction.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/recon_buildblock/ForwardProjectorByBin.h" +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include "stir/analytic/FBP3DRP/ColsherFilter.h" +#include "stir/ArcCorrection.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class RelatedViewgrams; +template class Sinogram; +template class SegmentBySinogram; +template class VoxelsOnCartesianGrid; +template class DiscretisedDensity; +class Succeeded; + +/* KT 180899 forget about PETAnalyticReconstruction for the moment + TODO Derive from PETAnalyticReconstruction when it makes any sense + */ +/*! + \ingroup FBP3DRP + \class FBP3DRPReconstruction + \brief This class contains the implementation of the FBP3DRP algorithm. + + This class implements the 3DRP algorithm (Kinahan and Rogers) as a specific + case of a 3D FBP reconstruction algorithm. + + Some care is taken to achieve + a fairly general implementation. For instance, the number of sinograms + in the oblique segments is arbitrary (i.e. does not have to be related + to what you would get from a cylindrical PET scanner). Also, scale + factors are inserted such that the reconstructed image has (almost) + the same scale independent of the number of segments that is used. + + Nevertheless, this is an analytic algorithm, and it implements a discrete + version of a continuous inversion formula. This will work best (but of + course slowest) when the number of segments is large. + + This implementation is specific for data using sampling corresponding + to cylindrical PET scanners. + This dependency essentially only occurs in the backprojection where a + Jacobian is necessary in this case, and where the number of ring differences + in each segment is taken into account. It would be not too difficult + to make a version that works on e.g. spherical sampling. + + \par About zooming (rescaling + offset): + 1) The 2D FBP process works at full resolution, i.e on the original + number of bins, and with a pixel size equal to the bin size. + 2) For the process of oblique sinograms: + - Forward projection works at full resolution i.e forward projection works + from images without zooming and complete missing projection data on normal sinograms + - Colsher filter is then applied on complete data + - 3D backprojection then puts this data into an image with + appropriate voxel sizes, i.e. it is up to the backprojector to perform + the zooming. + - So, no zooming is needed on the final image. + + +*/ +class FBP3DRPReconstruction: public AnalyticReconstruction +{ + typedef AnalyticReconstruction base_type; +public: + + + //! Default constructor (calls set_defaults()) + FBP3DRPReconstruction (); + + /*! + \brief Constructor, initialises everything from parameter file, or (when + parameter_filename == "") by calling ask_parameters(). + */ + explicit + FBP3DRPReconstruction(const string& parameter_filename); + + // explicitly implement destructor (NOT inline) to avoid funny problems with + // the shared_ptr > destructor with gcc. + // Otherwise, gcc will complain if you didn't include DiscretisedDensity.h + // because it doesn't know ~DiscretisedDensity. + ~FBP3DRPReconstruction(); + +//! This method returns the type of the reconstruction algorithm during the reconstruction, here it is FBP3DRP + virtual string method_info() const; + +protected: +/*! + \brief Implementation of the reconstruction + + This method implements the reconstruction by giving as input the emission sinogram data corrected for attenuation, + scatter, dead time, + and returns the output reconstructed image +*/ + + virtual Succeeded actual_reconstruct(shared_ptr > const&); + +//! Best fit of forward projected sinograms + void do_best_fit(const Sinogram &sino_measured, const Sinogram &sino_calculated); + + +//! 2D FBP implementation. + void do_2D_reconstruction(); + +//! Save image data. + void do_save_img(const char *file, const VoxelsOnCartesianGrid &data) const; + +//! Read image estimated from 2D FBP + void do_read_image2D(); + + +//! 3D reconstruction implementation. + void do_3D_Reconstruction( VoxelsOnCartesianGrid &image); + +//! Arc-correction viewgrams + void do_arc_correction(RelatedViewgrams & viewgrams) const; + +//! Growing 8 viewgrams in both ring and bin directions. + void do_grow3D_viewgram(RelatedViewgrams & viewgrams, + int rmin, int rmax); +//! 3D forward projection implentation by view. + void do_forward_project_view(RelatedViewgrams & viewgrams, + int rmin, int rmax, + int orig_min_ring, int orig_max_ring) const; +//! Apply Colsher filter to 8 viewgrams. + void do_colsher_filter_view( RelatedViewgrams & viewgrams); +//! 3D backprojection implentation for 8 viewgrams. + void do_3D_backprojection_view(RelatedViewgrams const & viewgrams, + VoxelsOnCartesianGrid &image, + int rmin, int rmax); +//! Saving CPU timing and values of reconstruction parameters into a log file. + void do_log_file(const VoxelsOnCartesianGrid &image); + + + + + virtual void do_byview_initialise(const VoxelsOnCartesianGrid& image) const + {}; + + virtual void do_byview_finalise(VoxelsOnCartesianGrid& image) {}; +public: + // KT 230899 this has to be public to let the Para stuff access it (sadly) + + virtual void do_process_viewgrams( + RelatedViewgrams & viewgrams, + int rmin, int rmax, + int orig_min_ring, int orig_max_ring, + VoxelsOnCartesianGrid &image); + + // parameters stuff + public: + + + void ask_parameters(); + + +protected: + + //! Switch to display intermediate images, 0,1,2 + int display_level; + + //! Switch to save files after each segment, 0 or 1 + int save_intermediate_files; + + //! Filename of image used in the reprojection step (default is empty) + /*! If the filename is empty, FBP is used (with filter parameters as + specified further). + + \warning This image must have the correct scale. That is, if you use the + forward projector on it, you get sinograms of the same scale as the + input sinograms. There is NO check on this. + */ + string image_for_reprojection_filename; + + //! Number of segments to combine with SSRB before calling FBP + /*! default -1 will use SSRB only when the data are not yet axially compressed */ + int num_segments_to_combine; + + //! Transaxial extension for FFT + int PadS; + //! Axial extension for FFT + int PadZ; + //! Ramp filter: Alpha value + double alpha_ramp; + //! Ramp filter: Cut off frequency + double fc_ramp; + + //! Alpha parameter for Colsher filter in axial direction + double alpha_colsher_axial; + //! Cut-off frequency for Colsher filter in axial direction + double fc_colsher_axial; + //! Alpha parameter for Colsher filter in planar direction + double alpha_colsher_planar; + //! Cut-off frequency for Colsher filter in planar direction + double fc_colsher_planar; + //! Define Colsher at larger size than used for filtering, axial direction + int colsher_stretch_factor_axial; + //! Define Colsher at larger size than used for filtering, planar direction + int colsher_stretch_factor_planar; + + + //! =1 => apply additional fitting procedure to forward projected data (DISABLED) + int fit_projections; +private: + + virtual void set_defaults(); + virtual void initialise_keymap(); + + + //! access to input proj_data_info cast to cylindrical type + const ProjDataInfoCylindrical& input_proj_data_info_cyl() const; + //! Size info for the projection data with missing data filled in + shared_ptr proj_data_info_with_missing_data_sptr; + + shared_ptr > image_estimate_density_ptr; + // convenience access functions to the above member + inline VoxelsOnCartesianGrid& estimated_image(); + inline const VoxelsOnCartesianGrid& estimated_image() const; + + shared_ptr forward_projector_sptr; + shared_ptr back_projector_sptr; +#ifndef NRFFT + ColsherFilter colsher_filter; +#endif + float alpha_fit; + float beta_fit; + + shared_ptr arc_correction_sptr; +}; + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/array_index_functions.h b/src/include/stir/array_index_functions.h new file mode 100644 index 0000000000..f66358ba0f --- /dev/null +++ b/src/include/stir/array_index_functions.h @@ -0,0 +1,101 @@ +// +// +/* + Copyright (C) 2004- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_array_index_functions_h_ +#define __stir_array_index_functions_h_ + +/*! + \file + \ingroup Array + + \brief a variety of useful functions for indexing stir::Array objects + + \author Kris Thielemans + +*/ + + +#include "stir/Array.h" +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR + +#if !defined(_MSC_VER) || _MSC_VER>1200 +// VC 6.0 needs ugly work-arounds. We'll put these in the .inl file + +/* \ingroup Array + \name Functions for writing generic code with indexing of multi-dimensional arrays + */ +//@{ + +//! an alternative for array indexing using BasicCoordinate objects +/*! Case where the index has lower dimension than the array*/ +template +inline +const Array& +get(const Array& a, const BasicCoordinate &c); + +//! an alternative for array indexing using BasicCoordinate objects +/*! Case where the index has the same dimension as the array*/ +template +inline +const elemT& +get(const Array& a, const BasicCoordinate &c); + + +//! Get the first multi-dimensional index of the array +/*! \todo If the array \arg a is empty, we return an object where all indices are 0. + It would be better to throw an exception. +*/ +template +inline +BasicCoordinate +get_min_indices(const Array& a); + + +//! Given an index into an array, increment it to the next one +/*! + \return \c true if the next index was still within the array, \c false otherwise + + This can be used to iterate through an array using code such as + \code + Array array = ...; + BasicCoordinate indices = + get_min_indices(array); + do + { something with indices } + while (next(indices, array)); + \endcode + \warning The above loop will fail for empty arrays +*/ +template +inline +bool +next(BasicCoordinate& indices, + const Array& a); + +//@} +#endif // end of VC 6.0 conditional + + +END_NAMESPACE_STIR + +#include "stir/array_index_functions.inl" + +#endif diff --git a/src/include/stir/array_index_functions.inl b/src/include/stir/array_index_functions.inl new file mode 100644 index 0000000000..5e5501216c --- /dev/null +++ b/src/include/stir/array_index_functions.inl @@ -0,0 +1,253 @@ +// +// +/* + Copyright (C) 2004- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + + \brief implementation of functions in stir/array_index_functions.h + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2008, Hammersmith Imanet Ltd + See STIR/LICENSE.txt for details +*/ +#include "stir/detail/test_if_1d.h" +#include + +START_NAMESPACE_STIR + +/* First we define the functions that actually do the work. + + The code is a bit more complicated than need be because we try to accomodate + older compilers that have trouble with function overloading of templates. + See test_if_1d for some info. +*/ +namespace detail +{ + +template +inline +BasicCoordinate +get_min_indices_help(is_not_1d, const Array& a) +{ + if (a.get_min_index()<=a.get_max_index()) + return join(a.get_min_index(), get_min_indices(*a.begin())); + else + { + // a is empty. Not clear what to return, so we just return 0 + // It would be better to throw an exception. + BasicCoordinate tmp(0); + return tmp; + } +} + +template +inline +BasicCoordinate<1, int> +get_min_indices_help(is_1d, const Array<1, T>& a) +{ + BasicCoordinate<1, int> result; + result[1] = a.get_min_index(); + return result; +} + +template +inline +bool +next_help(is_1d, BasicCoordinate<1, int>& index, + const Array& a) +{ + if (a.get_min_index()>a.get_max_index()) + return false; + assert(index[1]>=a.get_min_index()); + assert(index[1]<=a.get_max_index()); + index[1]++; + return index[1]<=a.get_max_index(); +} + +template +inline +bool +next_help(is_not_1d, + BasicCoordinate& index, + const Array& a) +{ + if (a.get_min_index()>a.get_max_index()) + return false; + BasicCoordinate upper_index= cut_last_dimension(index); + assert(index[num_dimensions]>=get(a,upper_index).get_min_index()); + assert(index[num_dimensions]<=get(a,upper_index).get_max_index()); + index[num_dimensions]++; + if (index[num_dimensions]<=get(a,upper_index).get_max_index()) + return true; + if (!next(upper_index, a)) + return false; + index=join(upper_index, get(a,upper_index).get_min_index()); + return true; +} + +} // end of namespace detail + + +/* Now define the functions in the stir namespace in terms of the above. + Also define get() for which I didn't bother to try the work-arounds, + as they don't work for VC 6.0 anyway... +*/ +template +inline +BasicCoordinate +get_min_indices(const Array& a) +{ + return detail::get_min_indices_help(detail::test_if_1d(), a); +} +#if !defined(_MSC_VER) || _MSC_VER>1200 + +template +inline +bool +next(BasicCoordinate& index, + const Array& a) +{ + return detail::next_help(detail::test_if_1d(), index, a); +} + +template +inline +const Array& +get(const Array& a, const BasicCoordinate &c) +{ + return get(a[c[1]],cut_first_dimension(c)); +} + +template +inline +const elemT& +get(const Array& a, const BasicCoordinate &c) +{ + return a[c]; +} +template +inline +const Array& +get(const Array& a, const BasicCoordinate<1,int> &c) +{ + return a[c[1]]; +} + + +#else + +/* terrible code for VC 6.0 + Stop reading now unless you have that compiler (or something else severely broken). + This code works right now, (September 2004) but will no longer be supported in later versions. + + We need to list all dimensions explicitly. Sigh. + I do this with macros to avoid too much repetition. + + Aside from that, the actual code really should be the same. +*/ + +#define GET(num_dimensions, num_dimensions2) \ +template \ +inline \ +const Array& \ +get(const Array& a, const BasicCoordinate &c) \ +{ \ + return get(a[c[1]],cut_first_dimension(c)); \ +} + +#define GET_EQUAL_DIM(num_dimensions) \ +template \ +inline \ +const elemT& \ +get(const Array& a, const BasicCoordinate &c) \ +{ \ + return a[c]; \ +} + +#define GET_1D(num_dimensions) \ +template \ +inline \ +const Array& \ +get(const Array& a, const BasicCoordinate<1,int> &c) \ +{ \ + return a[c[1]]; \ +} + +GET_1D(2) +GET_1D(3) +GET_EQUAL_DIM(1) +GET_EQUAL_DIM(2) +GET_EQUAL_DIM(3) +GET(3,2) + +#undef GET_1D +#undef GET_EQUAL_DIM +#undef GET + + +#define DEFINE_NEXT_1D(num_dimensions2) \ +template \ +inline bool \ +next(BasicCoordinate<1, int>& index, \ + const Array& a) \ +{ if (a.get_min_index()>a.get_max_index())\ + return false;\ + assert(index[1]>=a.get_min_index()); \ + assert(index[1]<=a.get_max_index()); \ + index[1]++;\ + return index[1]<=a.get_max_index();\ +} + +#define DEFINE_NEXT(num_dimensions, num_dimensions2) \ +template \ +inline bool \ +next(BasicCoordinate& index, \ + const Array& a) \ +{\ + if (a.get_min_index()>a.get_max_index()) \ + return false; \ + BasicCoordinate upper_index= cut_last_dimension(index);\ + assert(index[num_dimensions]>=get(a,upper_index).get_min_index());\ + assert(index[num_dimensions]<=get(a,upper_index).get_max_index());\ + index[num_dimensions]++;\ + if (index[num_dimensions]<=get(a,upper_index).get_max_index())\ + return true;\ + if (!next(upper_index, a))\ + return false;\ + index=join(upper_index, get(a,upper_index).get_min_index());\ +} + + + +DEFINE_NEXT_1D(1) +DEFINE_NEXT_1D(2) +DEFINE_NEXT_1D(3) +DEFINE_NEXT(2,2) +DEFINE_NEXT(2,3) +DEFINE_NEXT(3,3) + +#undef DEFINE_NEXT_1D +#undef DEFINE_NEXT + +#endif // end of VC 6.0 code + +END_NAMESPACE_STIR diff --git a/src/include/stir/assign.h b/src/include/stir/assign.h new file mode 100644 index 0000000000..05694d3815 --- /dev/null +++ b/src/include/stir/assign.h @@ -0,0 +1,132 @@ + +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_assign_H__ +#define __stir_assign_H__ + +/*! + \file + \ingroup buildblock + \brief defines the stir::assign function to assign values to different data types + + \author Kris Thielemans + +*/ +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" +#include "stir/BasicCoordinate.h" +#include + +START_NAMESPACE_STIR +/*! \ingroup buildblock + \name templated functions for assigning values + + When writing templated code, it is sometimes not possible to use \c operator=() + for assignment, e.g. when the classes do not support that operator. The + \c assign template tries to alleviate this problem by providing several + overloads when the first argument is a (STIR) container. + + \par Usage + \code + assign(x,y); // logically equivalent to x=y; + \endcode + + \par Design consideration + We could have overloaded \c operator=() instead, but that would probably + lead to surprising conversions. +*/ +//@{ +// TODO hopefully next ifdef is not necessary. Otherwise we need to have more for ints etc +#if defined(_MSC_VER) && _MSC_VER<=1300 +inline +void assign(double& x, const double y) +{ + x=y; +} + +static inline +void assign(float& x, const float y) +{ + x=y; +} +#else + +template + inline + void assign(T& x, const T2& y) +{ + x=y; +} +#endif + +template +inline +void assign(std::vector& v, const T2& y) +{ + for (typename std::vector::iterator iter = v.begin(); + iter != v.end(); ++iter) + assign(*iter, y); +} + +template +inline +void assign(BasicCoordinate& v, const T2& y) +{ + for (typename BasicCoordinate::iterator iter = v.begin(); + iter != v.end(); ++iter) + assign(*iter, y); +} + +template +inline +void assign(VectorWithOffset& v, const T2& y) +{ + for (typename VectorWithOffset::iterator iter = v.begin(); + iter != v.end(); ++iter) + assign(*iter, y); +} + +// Even though we have VectorWithOffset above, we still seem to need a version for Arrays as well +// for when calling assign(vector >, 0). +// We're not sure why... +template +inline + void assign(Array& v, const T2& y) +{ + for (typename Array::full_iterator iter = v.begin_all(); + iter != v.end_all(); ++iter) + assign(*iter, y); +} + +// a few common cases given explictly here such that we don't get conversion warnings all the time. +inline +void assign(double& x, const int y) +{ + x=static_cast(y); +} + +inline +void assign(float& x, const int y) +{ + x=static_cast(y); +} +//@} + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/assign_to_subregion.h b/src/include/stir/assign_to_subregion.h new file mode 100644 index 0000000000..8a686c186f --- /dev/null +++ b/src/include/stir/assign_to_subregion.h @@ -0,0 +1,53 @@ + +/* + Copyright (C) 2003- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_assign_to_subregion_H__ +#define __stir_assign_to_subregion_H__ + +/*! + \file + \ingroup Array + \brief declares the stir::assign_to_subregion function + + \author Kris Thielemans + +*/ +#include "stir/Array.h" + +START_NAMESPACE_STIR + +/*! + \ingroup Array + \brief assign a value to a sub-region of an array + + sets all values for indices between \a mask_location - \a half_size and \a mask_location + \a half_size to \a value, + taking care of staying inside the index-range of the array. +*/ +template +inline void +assign_to_subregion(Array<3,elemT>& input_array, + const BasicCoordinate<3,int>& mask_location, + const BasicCoordinate<3,int>& half_size, + const elemT& value); +END_NAMESPACE_STIR + +#include "stir/assign_to_subregion.inl" + +#endif + + diff --git a/src/include/stir/assign_to_subregion.inl b/src/include/stir/assign_to_subregion.inl new file mode 100644 index 0000000000..e4a351028a --- /dev/null +++ b/src/include/stir/assign_to_subregion.inl @@ -0,0 +1,56 @@ + +/* + Copyright (C) 2003- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief implementation of the stir::assign_to_subregion function + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + +START_NAMESPACE_STIR + +template +void +assign_to_subregion(Array<3,elemT>& input_array, + const BasicCoordinate<3,int>& mask_location, + const BasicCoordinate<3,int>& half_mask_size, + const elemT& value) +{ + const int min_k_index = input_array.get_min_index(); + const int max_k_index = input_array.get_max_index(); + for ( int k = max(mask_location[1]-half_mask_size[1],min_k_index); k<= min(mask_location[1]+half_mask_size[1],max_k_index); ++k) + { + const int min_j_index = input_array[k].get_min_index(); + const int max_j_index = input_array[k].get_max_index(); + for ( int j = max(mask_location[2]-half_mask_size[2],min_j_index); j<= min(mask_location[2]+half_mask_size[2],max_j_index); ++j) + { + const int min_i_index = input_array[k][j].get_min_index(); + const int max_i_index = input_array[k][j].get_max_index(); + for ( int i = max(mask_location[3]-half_mask_size[3],min_i_index); i<= min(mask_location[3]+half_mask_size[3],max_i_index); ++i) + input_array[k][j][i] = value; + } + } +} + +END_NAMESPACE_STIR + + + diff --git a/src/include/stir/centre_of_gravity.h b/src/include/stir/centre_of_gravity.h new file mode 100644 index 0000000000..c7e62ec2b3 --- /dev/null +++ b/src/include/stir/centre_of_gravity.h @@ -0,0 +1,116 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + + \brief This file contains functions to compute the centre of gravity of + arrays and images. + \author Kris Thielemans +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR +// predeclerations to avoid having to include the files and create unnecessary +// dependencies +template class BasicCoordinate; +template class Array; +template class VectorWithOffset; +template class CartesianCoordinate3D; +template class VoxelsOnCartesianGrid; + +//! Compute centre of gravity of a vector but without dividing by its sum +/*! \ingroup Array + The unweighted centre of gravity is computed as follows: + \f[ + C_k = \sum_{i} i A_{i} + \f] +*/ +template +T +find_unweighted_centre_of_gravity_1d(const VectorWithOffset& row); + +//! Compute centre of gravity of an Array but without dividing by its sum +/*! \ingroup Array + Each coordinate of the unweighted centre of gravity is computed as follows: + \f[ + C_k = \sum_{i_1...i_n} i_k A_{i_1...i_n} + \f] +*/ +template +BasicCoordinate +find_unweighted_centre_of_gravity(const Array& ); + +//! Compute centre of gravity of a 1D Array but without dividing by its sum +/*! \ingroup Array + Conceptually the same as the n-dimensional version, but returns a \c T, not a + BasicCoordinate\<1,T\>. +*/ +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +#else +#define T float +#endif +T +find_unweighted_centre_of_gravity(const Array<1,T>& ); + +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#undef T +#endif + +//! Compute centre of gravity of an Array +/*! \ingroup Array + Calls find_unweighted_centre_of_gravity and divides the result with the + sum of all the elements in the array. + + \warning When the sum is 0, error() is called. + \todo better error handling +*/ +template +BasicCoordinate +find_centre_of_gravity(const Array& ); + +//! Computes centre of gravity for each plane +/*! \ingroup Array + The result is in mm in STIR physical coordinates, i.e. taking the origin into account. + + The result can be used to find the central line of a (uniform) object, for + instance a cylinder. The output of this function can by used by + linear_regression(). + + The weight is currently simply the sum of the voxel values in that plane, + thresholded to be at least 0. If the weight is 0, the x,y coordinates are + simply set to 0. + */ +template +void +find_centre_of_gravity_in_mm_per_plane( VectorWithOffset< CartesianCoordinate3D >& allCoG, + VectorWithOffset& weights, + const VoxelsOnCartesianGrid& image); + +//! Computes centre of gravity of an image +/*! \ingroup Array + The result is in mm in STIR physical coordinates, i.e. taking the origin into account. +*/ +template +CartesianCoordinate3D +find_centre_of_gravity_in_mm(const VoxelsOnCartesianGrid& image); + +END_NAMESPACE_STIR diff --git a/src/include/stir/common.h b/src/include/stir/common.h new file mode 100644 index 0000000000..817bd4b1d0 --- /dev/null +++ b/src/include/stir/common.h @@ -0,0 +1,332 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_common_H__ +#define __stir_common_H__ + +/*! + \file + \ingroup buildblock + \brief basic configuration include file + + \author Kris Thielemans + \author Alexey Zverovich + \author Darren Hague + \author PARAPET project + + + + + + This include file defines some commonly used macros, templates + and functions in an attempt to smooth out some system dependencies. + It also defines some functions which are used very often. + +

        Macros and system dependencies:

        + +
          +
        • macros for namespace support: + #defines STIR_NO_NAMESPACES if the compiler does not support namespaces + #defines START_NAMESPACE_STIR etc. + +
        • includes boost/config.hpp + +
        • #defines STIR_NO_COVARIANT_RETURN_TYPES when the compiler does not + support virtual functions of a derived class differing only in the return + type. + Define when your compiler does not handle the following: + \code + class A { virtual A* f();} + class B:A { virtual B* f(); } + \endcode + +
        • #defines STIR_NO_AUTO_PTR when the compiles has no std::auto_ptr support. + In that case, we #define auto_ptr to shared_ptr + +
        • preprocessor definitions which attempt to determine the + operating system this is going to run on. + use as #ifdef __OS_WIN__ ... #elif ... #endif + Possible values are __OS_WIN__, __OS_MAC__, __OS_VAX__, __OS_UNIX__ + The __OS_UNIX__ case has 'subbranches'. At the moment we attempt to find + out on __OS_AIX__, __OS_SUN__, __OS_OSF__, __OS_LINUX__. + (If the attempts fail to determine the correct OS, you can pass + the correct value as a preprocessor definition to the compiler) + +
        • #includes cstdio, cstdlib, cstring, cmath + +
        • a trick to get ANSI C++ 'for' scoping rules work for compilers + which do not follow the new standard + +
        • #ifdef STIR_ASSERT, then define our own assert, else include <cassert> + +
        + +

        Speeding up std::copy

        + +
          +
        • For old compilers (check the source!), overloads of std::copy for built-in + types to use memmove (so it's faster) +
        + +

        stir namespace members declared here

        + +
          +
        • const double _PI
        • + +
        • inline template <class NUMBER> NUMBER square(const NUMBER &x)
        • + +
        + +

        stir include files included here

        +
          +
        • stir/error.h definiong stir::error
        • +
        • stir/warning.h definiong stir::warning
        • +
        +*/ +#if defined(_MSC_VER) +#include "stir/config/visualc.h" +#endif +#if defined(__GNUC__) +#include "stir/config/gcc.h" +#endif + +#include "boost/config.hpp" + +#include +#include +#include +#include + + +//*************** namespace macros +#ifndef STIR_NO_NAMESPACES + +# define START_NAMESPACE_STIR namespace stir { +# define END_NAMESPACE_STIR } +# define USING_NAMESPACE_STIR using namespace stir; +# define START_NAMESPACE_STD namespace std { +# define END_NAMESPACE_STD } +# define USING_NAMESPACE_STD using namespace std; +#else +# define START_NAMESPACE_STIR +# define END_NAMESPACE_STIR +# define USING_NAMESPACE_STIR +# define START_NAMESPACE_STD +# define END_NAMESPACE_STD +# define USING_NAMESPACE_STD +#endif + + +//*************** define __OS_xxx__ + +#if !defined(__OS_WIN__) && !defined(__OS_MAC__) && !defined(__OS_VAX__) && !defined(__OS_UNIX__) +// if none of these macros is defined externally, we attempt to guess, defaulting to UNIX + +#ifdef __MSL__ + // Metrowerks CodeWarrior + // first set its own macro +# if macintosh && !defined(__dest_os) +# define __dest_os __mac_os +# endif +# if __dest_os == __mac_os +# define __OS_MAC__ +# else +# define __OS_WIN__ +# endif + +#elif defined(_WIN32) || defined(WIN32) || defined(_WINDOWS) || defined(_DOS) + // Visual C++, MSC, cygwin gcc and hopefully some others +# define __OS_WIN__ + +#elif defined(VAX) + // Just in case anyone is still using VAXes... +# define __OS_VAX__ + +#else // default + +# define __OS_UNIX__ + // subcases +# if defined(_AIX) +# define __OS_AIX__ +# elif defined(__sun) + // should really branch on SunOS and Solaris... +# define __OS_SUN__ +# elif defined(__linux__) +# define __OS_LINUX__ +# elif defined(__osf__) +# defined __OS_OSF__ +# endif + +#endif // __OS_UNIX_ case + +#endif // !defined(__OS_xxx_) + +//************** auto_ptr +#if defined(BOOST_NO_AUTO_PTR) && !defined(STIR_NO_AUTO_PTR) +# define STIR_NO_AUTO_PTR +#endif + +#ifdef STIR_NO_AUTO_PTR +// first include memory, just in case there is a (supposedly flawed) auto_ptr in there +#include +// now include our own shared_ptr (somewhat tricky, as this will +// include this file again...) +#include "stir/shared_ptr.h" +#define auto_ptr shared_ptr +#endif + + +//*************** overload std::copy for built-in types +/* If you have an older compiler, chages are that std::copy is + implemented in the obvious way of iterating and copying along + the way. However, for simple types (such as floats), calling + memmove (not memcpy as the ranges could overlap) is faster. + So, we overload std::copy for some built-in types. + + However, newer compilers (in particular gcc from version 2.8) + take care of this themselves. So, we only do this + conditionally. +*/ +#ifdef STIR_SPEED_UP_STD_COPY +#include + +START_NAMESPACE_STD +//! overloads std::copy for faster performance +template <> +inline double * +copy(const double * first, const double * last, double * to) +{ memmove(to, first, (last-first)*sizeof(double)); return to+(last-first); } + +template <> +inline float * +copy(const float * first, const float * last, float * to) +{ memmove(to, first, (last-first)*sizeof(float)); return to+(last-first); } + +template <> +inline unsigned long int * +copy(const unsigned long int * first, const unsigned long int * last, unsigned long int * to) +{ memmove(to, first, (last-first)*sizeof(unsigned long int)); return to+(last-first); } + +template <> +inline signed long int * +copy(const signed long int * first, const signed long int * last, signed long int * to) +{ memmove(to, first, (last-first)*sizeof(signed long int)); return to+(last-first); } + +template <> +inline unsigned int * +copy(const unsigned int * first, const unsigned int * last, unsigned int * to) +{ memmove(to, first, (last-first)*sizeof(unsigned int)); return to+(last-first); } + +template <> +inline signed int * +copy(const signed int * first, const signed int * last, signed int * to) +{ memmove(to, first, (last-first)*sizeof(signed int)); return to+(last-first); } + +template <> +inline unsigned short int * +copy(const unsigned short int * first, const unsigned short int * last, unsigned short int * to) +{ memmove(to, first, (last-first)*sizeof(unsigned short int)); return to+(last-first); } + +template <> +inline signed short int * +copy(const signed short int * first, const signed short int * last, signed short int * to) +{ memmove(to, first, (last-first)*sizeof(signed short int)); return to+(last-first); } + +template <> +inline unsigned char * +copy(const unsigned char * first, const unsigned char * last, unsigned char * to) +{ memmove(to, first, (last-first)*sizeof(unsigned char)); return to+(last-first); } + +template <> +inline signed char * +copy(const signed char * first, const signed char * last, signed char * to) +{ memmove(to, first, (last-first)*sizeof(signed char)); return to+(last-first); } + +template <> +inline char * +copy(const char * first, const char * last, char * to) +{ memmove(to, first, (last-first)*sizeof(char)); return to+(last-first); } + + +template <> +inline bool * +copy(const bool * first, const bool * last, bool * to) +{ memmove(to, first, (last-first)*sizeof(bool)); return to+(last-first); } + +END_NAMESPACE_STD + +#endif // #ifdef STIR_SPEED_UP_STD_COPY + +//*************** for() scope trick + +/* ANSI C++ (re)defines the scope of variables declared in a for() statement. + Example: the 'i' variable has scope only within the for statement. + for (int i=0; ...) + do_something; + The next trick (by AZ) solves this problem. + At the moment, we only need it for VC++ + */ + +#if defined(STIR_ENABLE_FOR_SCOPE_WORKAROUND) +# ifndef for +# define for if (0) ; else for +# else +# error 'for' is already #defined to something +# endif +#endif + +//*************** assert + +#ifndef STIR_ASSERT +# include +#else + // use our own assert +# ifdef assert +# undef assert +# endif +# if !defined(NDEBUG) +# define assert(x) {if (!(x)) { \ + fprintf(stderr,"Assertion \"%s\" failed in file %s:%d\n", # x,__FILE__, __LINE__); \ + abort();} } +# else +# define assert(x) +# endif +#endif // STIR_ASSERT + +//*************** +START_NAMESPACE_STIR + +//! The constant pi to high precision. +/*! \ingroup buildblock */ +const double _PI = 3.14159265358979323846264338327950288419716939937510; + +//! returns the square of a number, templated. +/*! \ingroup buildblock */ +template +inline NUMBER square(const NUMBER &x) { return x*x; } + + +END_NAMESPACE_STIR + +// include these such that we don't have to include them all over the place +#include "stir/error.h" +#include "stir/warning.h" + + +#endif diff --git a/src/include/stir/config/gcc.h b/src/include/stir/config/gcc.h new file mode 100644 index 0000000000..cee178ab50 --- /dev/null +++ b/src/include/stir/config/gcc.h @@ -0,0 +1,48 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_config_gcc_H__ +#define __stir_config_gcc_H__ + +/*! + \file + \ingroup buildblock + \brief configuration for gcc + + \author Kris Thielemans + \author PARAPET project + + + + + This include file defines a few macros and en/disables pragmas + specific to gcc. + + It is included by sitr/common.h. You should never include it directly. +*/ + +#if defined __GNUC__ +# if __GNUC__ == 2 && __GNUC_MINOR__ <= 8 +# define STIR_NO_NAMESPACES +# define STIR_NO_AUTO_PTR +# endif +#endif + +#endif diff --git a/src/include/stir/config/visualc.h b/src/include/stir/config/visualc.h new file mode 100644 index 0000000000..98f0d45dd3 --- /dev/null +++ b/src/include/stir/config/visualc.h @@ -0,0 +1,61 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_config_visualc_H__ +#define __stir_config_visualc_H__ + +/*! + \file + \ingroup buildblock + \brief configuration for Visual C++ + + \author Kris Thielemans + \author PARAPET project + + + + + This include file defines a few macros and en/disables pragmas + specific to Microsoft Visual C++. + + It is included by sitr/common.h. You should never include it directly. +*/ + +#if defined(_MSC_VER) && _MSC_VER<=1300 +// do this only up to VC 7.0 +#define STIR_NO_COVARIANT_RETURN_TYPES +#define STIR_SPEED_UP_STD_COPY +#define STIR_ENABLE_FOR_SCOPE_WORKAROUND +#endif + +#if defined(_MSC_VER) +// set _SCL_SECURE_NO_WARNINGS +// otherwise we get a load of messages that std::copy and std::equal are unsafe +// in VectorWithOffset and IndexRange etc because they use C-style arrays internally +#pragma warning( disable : 4996) + +// enable secure versions of standard C functions such as sprintf etc +// this will cause a run-time error when overwriting memory etc +// hopefully this is enough to avoid a lot of warnings +// otherwise we'll need to set define _CTR_SECURE_NO_WARNINGS +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif + +#endif diff --git a/src/include/stir/convert_array.h b/src/include/stir/convert_array.h new file mode 100644 index 0000000000..f6692ce007 --- /dev/null +++ b/src/include/stir/convert_array.h @@ -0,0 +1,141 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_convert_array_H__ +#define __stir_convert_array_H__ + +/*! + \file + \ingroup Array + + \brief This file declares the stir::convert_array functions. + This is a function to convert stir::Array objects to a different numeric type. + + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +template class NumericInfo; +template class Array; + + +/*! + \ingroup Array + \brief A function that finds a scale factor to use when converting data to a new type + + The scale factor is such that + (\a data_in / \a scale_factor) + will fit in the maximum range for the output type. + + When input and output types are identical, \a scale_factor is set to 1. + + \param scale_factor + a reference to a (float or double) variable which will be + set to the scale factor such that (ignoring types) + \code data_in == data_out * scale_factor \endcode + If scale_factor is initialised to 0, the maximum range of \a T2 + is used. If scale_factor != 0, find_scale_factor attempts to use the + given scale_factor, unless the T2 range doesn't fit. + In that case, the same scale_factor is used as in the 0 case. + + \param data_in + some Array object, elements are of some numeric type \a T1 + \param info_for_out_type + \a T2 is the desired output type + + Note that there is an effective threshold at 0 currently (i.e. negative + numbers are ignored) when \a T2 is an unsigned type. + + \see convert_array +*/ +template +inline void +find_scale_factor(scaleT& scale_factor, + const Array& data_in, + const NumericInfo info_for_out_type); + +/*! + \ingroup Array + \brief A function that returns a new Array (of the same dimension) with elements of type \c T2 + + Result is (approximately) \a data_in / \a scale_factor. + + \par example + \code + Array<2,float> data_out = convert_array(scale_factor, data_in, NumericInfo()) + \endcode + + \param scale_factor + a reference to a (float or double) variable which will be + set to the scale factor such that (ignoring types) + \code data_in == data_out * scale_factor \endcode + \see find_scale_factor for more info on the determination of \a scale_factor. + + \param data_in + some Array object, elements are of some numeric type \a T1 + \param info2 + \a T2 is the desired output type + + \return + data_out : + an Array object whose elements are of numeric type T2. + + When the output type is integer, rounding is used. + + Note that there is an effective threshold at 0 currently (i.e. negative + numbers are cut out) when T2 is an unsigned type. + +*/ +template +inline +Array +convert_array(scaleT& scale_factor, + const Array& data_in, + const NumericInfo info2); +/*! + \ingroup Array + \brief Converts the \c data_in Array to \c data_out (with elements of different types) such that \c data_in == \c data_out * \c scale_factor + + \par example + \code + convert_array(data_out, scale_factor, data_in); + \endcode + + \see convert_array(scale_factor, data_in, info2) for more info +*/ + +template +inline void +convert_array(Array& data_out, + scaleT& scale_factor, + const Array& data_in); + + +END_NAMESPACE_STIR + +#include "stir/convert_array.inl" + +#endif + diff --git a/src/include/stir/convert_array.inl b/src/include/stir/convert_array.inl new file mode 100644 index 0000000000..0d35fb125a --- /dev/null +++ b/src/include/stir/convert_array.inl @@ -0,0 +1,67 @@ +// +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief implementation of stir::convert_array + + \author Kris Thielemans + + + +*/ +#include "stir/NumericInfo.h" +#include "stir/Array.h" +#include "stir/convert_range.h" +START_NAMESPACE_STIR + +template +void +find_scale_factor(scaleT& scale_factor, + const Array& data_in, + const NumericInfo info_for_out_type) +{ + find_scale_factor(scale_factor, data_in.begin_all(), data_in.end_all(), info_for_out_type); +} + + + +template +Array +convert_array(scaleT& scale_factor, + const Array& data_in, + const NumericInfo info_for_out_type) +{ + Array data_out(data_in.get_index_range()); + + convert_array(data_out, scale_factor, data_in); + return data_out; +} + +template +void +convert_array(Array& data_out, + scaleT& scale_factor, + const Array& data_in) +{ + convert_range(data_out.begin_all(), scale_factor, + data_in.begin_all(), data_in.end_all()); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/convert_range.h b/src/include/stir/convert_range.h new file mode 100644 index 0000000000..eb35897d01 --- /dev/null +++ b/src/include/stir/convert_range.h @@ -0,0 +1,78 @@ +// +// +/* + Copyright (C) 2006- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_convert_range_H__ +#define __stir_convert_range_H__ + +/*! + \file + \ingroup Array + + \brief This file declares the stir::convert_range and stir::find_scale_factor functions. + + \author Kris Thielemans + + +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +template class NumericInfo; + +/*! + \ingroup Array + \brief A function that finds a scale factor to use when converting data to a new type + + This function works with input data given as an iterator range. + \see find_scale_factor(scale_factor,data_in,info_for_out_type) +*/ +template +inline void +find_scale_factor(scaleT& scale_factor, + const InputIteratorT& begin, const InputIteratorT& end, + const NumericInfo info_for_out_type); + +/*! + \ingroup Array + \brief Converts the data in the input range to the output range (with elements of different types) such that \c data_in == \c data_out * \c scale_factor + + Note order of arguments. Output-range occurs first (as standard in STIR). + \par example + \code + convert_range(data_out.begin_all(), scale_factor, + data_in.begin_all(), data_in.end_all()); + \endcode + + \see convert_array(scale_factor, data_in, info2) for more info +*/ + +template +inline void + convert_range(const OutputIteratorT& out_begin, + scaleT& scale_factor, + const InputIteratorT& in_begin, const InputIteratorT& in_end); + + +END_NAMESPACE_STIR + +#include "stir/convert_range.inl" + +#endif + diff --git a/src/include/stir/convert_range.inl b/src/include/stir/convert_range.inl new file mode 100644 index 0000000000..2d3dc7f42f --- /dev/null +++ b/src/include/stir/convert_range.inl @@ -0,0 +1,203 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + \brief implementation of stir::convert_range + + \author Kris Thielemans + \author PARAPET project + + + +*/ +#include "stir/NumericInfo.h" +#include "stir/round.h" +#include +#include "boost/iterator/iterator_traits.hpp" +#include "boost/limits.hpp" +START_NAMESPACE_STIR + +// anonymous namespace for local functions +namespace +{ + + /* Declaration of auxiliary function is_negative() with the obvious + implementation. + However, we overload it for unsigned types to return always false. + The compiler would do this automatically for us. However, many + compilers (including gcc) will warn when you do + unsigned x=...; + if (x<0) + { + // never get here + } + This file relies on templated definitions of convert_array. So, + if we use if-statements as above with templated code, we will get + warnings when instantiating the code with unsigned types. + + Summary, instead of the above if, write + T x; + if (is_negative(x)) + { + // never get here if T is an unsigned type + } + and you won't get a warning message + */ + + template + inline bool is_negative(const T x) + { return x<0; } + + inline bool is_negative(const unsigned char x) + { return false; } + + inline bool is_negative(const unsigned short x) + { return false; } + + inline bool is_negative(const unsigned int x) + { return false; } + + inline bool is_negative(const unsigned long x) + { return false; } + +} + +template +inline void +find_scale_factor(scaleT& scale_factor, + const InputIteratorT& begin, const InputIteratorT& end, + const NumericInfo info_for_out_type) +{ + typedef typename boost::iterator_value::type T1; + NumericInfo info1; + + if (info1.type_id() == info_for_out_type.type_id()) + { + // TODO could use different scale factor in this case as well, but at the moment we don't) + scale_factor = scaleT(1); + return; + } + + // find the scale factor to use when converting to the maximum range in T2 + const double data_in_max = + *std::max_element(begin, end); + double tmp_scale = + data_in_max / + static_cast(info_for_out_type.max_value()); + if (info_for_out_type.signed_type() && info1.signed_type()) + { + const double data_in_min = + *std::min_element(begin, end); + tmp_scale = + std::max(tmp_scale, + data_in_min /static_cast(info_for_out_type.min_value())); + } + // use an extra factor of 1.01. Otherwise, rounding errors can + // cause data_in.find_max() / scale_factor to be bigger than the + // max_value + tmp_scale *= 1.01; + + if (scale_factor == 0 || tmp_scale > scale_factor) + { + // We need to convert to the maximum range in T2 + scale_factor = scaleT(tmp_scale); + } +} + + +template +void + convert_range(const OutputIteratorT& out_begin, + scaleT& scale_factor, + const InputIteratorT& in_begin, const InputIteratorT& in_end) +{ + typedef typename boost::iterator_value::type OutType; + + find_scale_factor(scale_factor, in_begin, in_end, NumericInfo()); + if (scale_factor == 0) + { + // data_in contains only 0 + OutputIteratorT out_iter = out_begin; + InputIteratorT in_iter = in_begin; + for (; + in_iter != in_end; + ++in_iter, ++out_iter) + { + *out_iter = static_cast(0); + } + return; + } + + // do actual conversion + OutputIteratorT out_iter = out_begin; + InputIteratorT in_iter = in_begin; + if (!std::numeric_limits::is_integer) + { + for (; + in_iter != in_end; + ++in_iter, ++out_iter) + { + *out_iter = + static_cast(*in_iter / scale_factor); + } + } + else + { + for (; + in_iter != in_end; + ++in_iter, ++out_iter) + { + // KT coded the checks on the data types in the loop. + // This is presumably slow, but all these conditionals can be + // resolved at compile time, so a good compiler does the work for me. + if (!std::numeric_limits::is_signed + && is_negative(*in_iter)) + { + // truncate negatives + *out_iter = 0; + } + else + { + // convert using rounding + *out_iter = + static_cast(round(*in_iter / scale_factor)); + } + } + } +} + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +// specialisation for equal Iterator types +// In fact, we could do better and test for boost::iterator_value::type +// etc, but that requires some template trickery +template +void + convert_range(const IteratorT& out_begin, + scaleT& scale_factor, + const IteratorT& in_begin, const IteratorT& in_end) +{ + scale_factor = scaleT(1); + std::copy(in_begin, in_end, out_begin); +} +#endif + + +END_NAMESPACE_STIR diff --git a/src/include/stir/cross_product.h b/src/include/stir/cross_product.h new file mode 100644 index 0000000000..5b022873a2 --- /dev/null +++ b/src/include/stir/cross_product.h @@ -0,0 +1,59 @@ +#ifndef __stir_cross_product_H__ +#define __stir_cross_product_H__ +// +// +/* + Copyright (C) 2003- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief defines the cross-product of 2 CartesianCoordinate3D numbers + + \author Kris Thielemans + +*/ + +#include "stir/CartesianCoordinate3D.h" + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief the cross-product for 3-dimensional coordinates. + + \warning This implements minus the 'usual' definition + of the cross-product. This is done because STIR uses a left-handed + coordinate system. The definition of \a cross_product is such that + \f$ {a, b, a\times b}\f$ forms a left-handed + coordinate system. +*/ + + +template +CartesianCoordinate3D +cross_product(const CartesianCoordinate3D& a, + const CartesianCoordinate3D& b) +{ + return + CartesianCoordinate3D(a.y()*b.x() - a.x()*b.y(), + -a.z()*b.x() + a.x()*b.z(), + a.z()*b.y() - a.y()*b.z()); +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/data/SinglesRates.h b/src/include/stir/data/SinglesRates.h new file mode 100644 index 0000000000..f566fe9a49 --- /dev/null +++ b/src/include/stir/data/SinglesRates.h @@ -0,0 +1,193 @@ + +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup singles_buildblock + + \brief Declaration of class stir::SinglesRates + + \author Kris Thielemans and Sanida Mustafovic +*/ + +#ifndef __stir_data_SinglesRates_H__ +#define __stir_data_SinglesRates_H__ + +//#include "stir/Array.h" +#include "stir/DetectionPosition.h" +#include "stir/RegisteredObject.h" +#include "stir/Scanner.h" +#include "stir/shared_ptr.h" + +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#endif + + + +START_NAMESPACE_STIR + + + + + + +/*! + \ingroup singles_buildblock + + \brief A single frame of singles information. + */ +class FrameSinglesRates +{ + + public: + typedef std::vector::iterator iterator; + typedef std::vector::const_iterator const_iterator; + + //! Constructor taking all arguments + /*! \warning only checks sizes with an \c assert. + */ + FrameSinglesRates(vector& avg_singles_rates, + double start_time, + double end_time, + shared_ptr scanner); + //! Constructor without singles rates + /*! Initialises the size of the internal object that stores the singles rates + but does not initialise its values. + */ + FrameSinglesRates(double start_time, + double end_time, + shared_ptr scanner); + + + //! Get singles rate for a particular singles bin index. + // + // The singles rate returned is the rate for a whole singles unit. + // + float get_singles_rate(int singles_bin_index) const; + + //! Get singles rate for a detection position. + // + // The singles rate returned is the rate for a whole singles unit. + // + float get_singles_rate(const DetectionPosition<>& det_pos) const; + + const_iterator begin() const + { return this->_singles.begin(); } + + iterator begin() + { return this->_singles.begin(); } + + const_iterator end() const + { return this->_singles.end(); } + + iterator end() + { return this->_singles.end(); } + + //! Get the start time of the frame whose rates are recorded. + double get_start_time() const; + + //! Get the end time of the frame whose rates are recorded. + double get_end_time() const; + + //! Get the scanner information. + inline const Scanner * get_scanner_ptr() const; + + private: + + double _start_time; + double _end_time; + vector _singles; + + // Scanner specifics + shared_ptr _scanner_sptr; + +}; + + + + + +/*! + \ingroup singles_buildblock + \brief The base-class for using singles info + + Singles in PET are photons detected by a single detector. In PET they + are useful to estimate dead-time. + + This class allows to get the rate of singles during an acquisition. + There will be 1 rate per singles unit. See Scanner for + some more info. +*/ +class SinglesRates : public RegisteredObject +{ +public: + + virtual ~SinglesRates () {} + //! Get the singles rate for a particular singles unit and a frame with the specified start and end times. + /*! The behaviour of this function is specified by the derived classes. + \warning Currently might return -1 if the \a start_time, \a end_time + are invalid (e.g. out of the measured range). + */ + virtual float + get_singles_rate(const int singles_bin_index, + const double start_time, + const double end_time) const = 0; + + //! Virtual function that returns the average singles rate given the detection positions and time-interval of detection + /*! The behaviour of this function is specified by the derived classes. + \warning Currently might return -1 if the \a start_time, \a end_time + are invalid (e.g. out of the measured range). + + Default implementation uses Scanner::get_singles_bin_index(). + */ + + virtual float get_singles_rate(const DetectionPosition<>& det_pos, + const double start_time, + const double end_time) const; + + //! Get the scanner pointer + inline const Scanner * get_scanner_ptr() const; + + + //! Generate a FramesSinglesRate - containing the average rates + // for a frame begining at start_time and ending at end_time. + //virtual FrameSinglesRates get_rates_for_frame(double start_time, + // double end_time) const = 0; + + +protected: + shared_ptr scanner_sptr; + +}; + + + + + + + + +END_NAMESPACE_STIR + +#include "stir/data/SinglesRates.inl" +#endif + diff --git a/src/include/stir/data/SinglesRates.inl b/src/include/stir/data/SinglesRates.inl new file mode 100644 index 0000000000..a72ba0f4e3 --- /dev/null +++ b/src/include/stir/data/SinglesRates.inl @@ -0,0 +1,47 @@ +// +// +/* + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup singles_buildblock + + \brief Implementation of class stir::SinglesRates + + \author Kris Thielemans and Sanida Mustafovic +*/ + + +START_NAMESPACE_STIR + + +const +Scanner* SinglesRates::get_scanner_ptr() const +{ + return scanner_sptr.get(); +} + + + +const Scanner * +FrameSinglesRates:: +get_scanner_ptr() const { + return _scanner_sptr.get(); +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/data/SinglesRatesForTimeFrames.h b/src/include/stir/data/SinglesRatesForTimeFrames.h new file mode 100644 index 0000000000..4ada69f978 --- /dev/null +++ b/src/include/stir/data/SinglesRatesForTimeFrames.h @@ -0,0 +1,102 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup singles_buildblock + + \brief Declaration of class stir::SinglesRatesForTimeFrames + \author Kris Thielemans + \author Timothy Borgeaud +*/ + +#ifndef __stir_data_SinglesRatesForTimeFrames_H__ +#define __stir_data_SinglesRatesForTimeFrames_H__ + +#include "stir/data/SinglesRates.h" +#include "stir/Array.h" +#include "stir/TimeFrameDefinitions.h" + +START_NAMESPACE_STIR + +/*! + \ingroup singles_buildblock + \brief A class for singles rates that are recorded in time frames. +*/ +class SinglesRatesForTimeFrames +: public SinglesRates +{ +public: + + //! Default constructor + SinglesRatesForTimeFrames (); + + //SinglesRatesForTimeFrames(const TimeFrameDefinitions& time_frame_definitions, + // const shared_ptr& scanner_sptr); + + + //! get the singles rate for a particular singles unit and frame number. + // + // The singles rate returned is the rate for a whole singles unit. + // + float get_singles_rate(int singles_bin_index, unsigned int frame_number) const; + + + //! get the singles rate for a particular singles unit and a frame with + // the specified start and end times. + // + // The singles rate returned is the rate for a whole singles unit. + // + /*! \warning Currently returns -1 if the \a start_time, \a end_time + does not corresponds to a time frame. + */ + float get_singles_rate(const int singles_bin_index, + const double start_time, const double end_time) const; + + //! Generate a FramesSinglesRate - containing the average rates + // for a frame begining at start_time and ending at end_time. + FrameSinglesRates get_rates_for_frame(double start_time, + double end_time) const; + + //! Set a singles rate by singles bin index and time frame number. + /*! \warning No error checking is doing on validity of the indices. + */ + void set_singles_rate(const int singles_bin_index, + const unsigned time_frame_num, + const float new_rate); + + //! Get the number of frames for which singles rates are recorded. + unsigned int get_num_frames() const; + + //! Get the time frame definitions + const TimeFrameDefinitions& + get_time_frame_definitions() const; + +protected: + + Array<2,float> _singles; + TimeFrameDefinitions _time_frame_defs; + + + +}; + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/data/SinglesRatesFromECAT7.h b/src/include/stir/data/SinglesRatesFromECAT7.h new file mode 100644 index 0000000000..9efcac98f2 --- /dev/null +++ b/src/include/stir/data/SinglesRatesFromECAT7.h @@ -0,0 +1,73 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup singles_buildblock + + \brief Declaration of class stir::ecat::ecat7::SinglesRatesFromECAT7 + \author Sanida Mustafovic and Kris Thielemans +*/ + +#ifndef __stir_data_SinglesRatesFromECAT7_H__ +#define __stir_data_SinglesRatesFromECAT7_H__ + +#include "stir/data/SinglesRatesForTimeFrames.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/IO/stir_ecat7.h" // necessary for namespace macros +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +/*! + \ingroup singles_buildblock + \brief A class that extracts singles info from an ECAT7 sinogram file. +*/ +class SinglesRatesFromECAT7 : +public RegisteredParsingObject > +{ +public: + + //! Name which will be used when parsing a SinglesRatesFromECAT7 object + static const char * const registered_name; + + //! Default constructor + SinglesRatesFromECAT7 (); + + + //! The function that reads singles from ECAT7 file + /*! \return The number of frames found. 0 if failed. + */ + int read_singles_from_file(const string& ECAT7_filename, + const std::ios::openmode open_mode = std::ios::in); + + +private: + string ECAT7_filename; + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); +}; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/data/SinglesRatesFromSglFile.h b/src/include/stir/data/SinglesRatesFromSglFile.h new file mode 100644 index 0000000000..9d23d5208c --- /dev/null +++ b/src/include/stir/data/SinglesRatesFromSglFile.h @@ -0,0 +1,225 @@ +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup singles_buildblock + + \brief Declaration of class stir::SinglesRatesFromSglFile + + \author Kris Thielemans + \author Sanida Mustafovic + \author Tim Borgeaud + +*/ + +#ifndef __stir_data_SinglesRatesFromSglFile_H__ +#define __stir_data_SinglesRatesFromSglFile_H__ + +#include "stir/data/SinglesRates.h" +#include "stir/Array.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/IO/stir_ecat7.h" + + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + + + + +/*! + \ingroup singles_buildblock + \brief A class for reading/writing singles from an ECAT7 .sgl file + + .sgl files are generated by CTI/Siemens PET scanners when doing a list mode scan +*/ +class SinglesRatesFromSglFile : +public RegisteredParsingObject + +{ +public: + + struct sgl_str + { + long int time; + long int num_sgl; + long int sgl[126]; // Total prompts and total randoms at the end. + }; + + static const unsigned SIZE_OF_SINGLES_RECORD; + + //! Name which will be used when parsing a SinglesRatesFromSglFile object + static const char * const registered_name; + + + //! Default constructor + SinglesRatesFromSglFile(); + + // implementation of pure virtual in SinglesRates + virtual float + get_singles_rate(const int singles_bin_index, + const double start_time, const double end_time) const; + + + //! Generate a FramesSinglesRate - containing the average rates + // for a frame begining at start_time and ending at end_time. + FrameSinglesRates get_rates_for_frame(double start_time, + double end_time) const; + + + /* + *! Get time slice index for a time slice ending at or after t. + * + * Each slice of singles data has a corresponing time recorded with + * the singles counts. This time is considered to represent the time + * at the end of the slice. + * + * For a given double precision number of seconds, t, this function + * will return the slice index for the first time slice that has a + * corresponding time greater than or equal to t. + * + * Assuming contiguous slices that end at the time recorded for the slice, + * this function returns the slice in which t is contained. + * + * This function assumes that all slices are continguous. + * If the supplied t does not actually fall within a frame, the closest + * frame (ending after t) is returned. Values of t before the first time + * slice will result in the index to the first slice being returned. + */ + virtual int get_end_time_slice_index(double t) const; + + + /* + *! Get time slice index for a time slice ending after t. + * + * Each slice of singles data has a corresponing time recorded with + * the singles counts. This time is considered to represent the time + * at the end of the slice. + * + * For a given double precision number of seconds, t, this function + * will return the slice index for the first time slice that has a + * correspdoning time greater than t. + * + * Assuming contiguous slices that end at the time recorded for the slice, + * this function returns the slice which starts before t. A time interval + * that begins at t should contain only time slices that end _after_ t + * not at t. + * + * This function assumes that all slices are continguous. + * If the supplied t does not actually fall within a frame, the closest + * frame (ending after t) is returned. Values of t before the first time + * slice will result in the index to the first slice being returned. + */ + virtual int get_start_time_slice_index(double t) const; + + + //! Get rates using time slice and singles bin indices. + // + // The singles rate returned is the rate for a whole singles unit. + // + int get_singles_rate(int singles_bin_index, int time_slice) const; + + //! Set a singles rate by singles bin index and time slice. + // + // The singles rate returned is the rate for a whole singles unit. + // + void set_singles_rate(int singles_bin_index, int time_slice, int new_rate); + + + //! Rebin the sgl slices into a different set of consecutive slices. + // + // Returns the number of new bins. + int rebin(vector& new_end_times); + + + //! Get the vector of time values for each time slice index. + vector get_times() const; + + + // Some inspectors + + //! Return the number of time slices. + int get_num_time_slices() const; + + + //! Return the time interval per slice of singles data. + double get_singles_time_interval() const; + + + // IO Methods + + //! The function that reads singles from *.sgl file. + int read_singles_from_sgl_file(const string& sgl_filename); + + /*! + * \brief Write the SinglesRatesFromSglFile object to a stream. + * \param[in] output The ostream to which the object will be written. + */ + std::ostream& write(std::ostream& output); + + + +private: + + // Indexed by time slice and singles bin index. + Array<2, int> _singles; + + vector _times; + vector _total_prompts; + vector _total_randoms; + + +#ifdef HAVE_LLN_MATRIX + Main_header _singles_main_header; +#endif + + int _num_time_slices; + + // A value of zero for _singles_time_interval indicates that the time slices + // are of different lengths. + double _singles_time_interval; + + string _sgl_filename; + + // Calculate and set _singles_time_interval. + void set_time_interval(); + + // get slice start time. + double get_slice_start(int slice_index) const; + + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + + + + + + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/decay_correction_factor.h b/src/include/stir/decay_correction_factor.h new file mode 100644 index 0000000000..7927d8409a --- /dev/null +++ b/src/include/stir/decay_correction_factor.h @@ -0,0 +1,68 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_decay_correction_factor_H__ +#define __stir_decay_correction_factor_H__ +/*! + \file + \ingroup buildblock + \brief Simple functions to compute the decay correction factor. + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#include "stir/common.h" +#include + +START_NAMESPACE_STIR + +//! Compute decay-correction factor for a time frame +/*! + \ingroup buildblock + This function computes the factor eneded to convert average number of counts per second to + activity at time 0, i.e. it returns + \f[ \frac{(t_2-t_1)}{ \int_{t_1}^{t_2} \! 2^{-t/\mathrm{halflife}} \, dt} \f] + */ +inline double +decay_correction_factor(const double isotope_halflife, const double start_time, const double end_time) +{ + assert(end_time-start_time>0); + const double lambda=std::log(2.)/isotope_halflife; + + return + std::fabs(lambda*(end_time-start_time)) < .01 + ? std::exp(-start_time*lambda) // if very short frame, we can ignore the duration + : lambda*(end_time-start_time)/ + (std::exp(-start_time*lambda)-std::exp(-end_time*lambda)); +} + +//! Computes the decay-correction factor for activity at a given time point +/*! \ingroup buildblock + This function computes the correction factor to convert activity at t0 + \a rel_time to activity at t0, i.e. + \f[ 2^{(\mathrm{rel\_time} / \mathrm{halflife})} \f] +*/ +inline double decay_correction_factor(const double isotope_halflife, const double rel_time) +{ + return std::exp(rel_time*std::log(2.)/isotope_halflife); +} + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/detail/test_if_1d.h b/src/include/stir/detail/test_if_1d.h new file mode 100644 index 0000000000..1ad64ba4df --- /dev/null +++ b/src/include/stir/detail/test_if_1d.h @@ -0,0 +1,81 @@ +/*! + \file + \ingroup buildblock_detail + \brief Classes for use in implementation of stir::Array, stir::BasicCoordinate etc to test if it's a 1D array. + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_detail_test_if_1d_H__ +#define __stir_detail_test_if_1d_H__ +namespace stir { + namespace detail { + /*! \ingroup buildblock_detail + \brief a class used to signify it's a 1D array + \see test_if_1d + */ + struct is_1d{}; + /*! \ingroup buildblock_detail + \brief a class used to signify it's not a 1D array + \see test_if_1d + */ + struct is_not_1d{}; + + /*! \ingroup buildblock_detail + \brief a templated class used to check if it's a 1D array or not + This class only exists to allow a work-around for older compilers + (such as VC 6.0) that do not implement partial ordering of + function templates or partial template specialisation. + + For modern compilers one can write + \code + // generic case + template void f(Array&); + // 1D case + template void f(Array<1,T>&); + \endcode + The work-around is as follows + \code + // generic case + template void f_help(is_not_1d, Array&); + // 1D case + template void f_help(is_1d, Array<1,T>&); + // function that will dispatch + template void f(Array& a) + { f_help(test_if_1d(), a); } + \endcode + So, the same effect is achieved by having one extra function. + Of course, the name f_help is arbitrary, and could just as well + be f. However, it's best to hide these away from the user, as they + should never be used explicitly. + */ + // note: should be Num_dimensions and not num_dimensions + // because for old compilers, num_dimensions is sometimes #defined (sigh) + template + struct test_if_1d : is_not_1d {}; + /*! \ingroup buildblock_detail + \brief 1D specialisation of a templated class used to check if it's a 1D array or not + */ + template <> + struct test_if_1d<1> : is_1d {}; + } +} + +#endif diff --git a/src/include/stir/display.h b/src/include/stir/display.h new file mode 100644 index 0000000000..5491aa3980 --- /dev/null +++ b/src/include/stir/display.h @@ -0,0 +1,190 @@ + +#ifndef __DISPLAY_H__ +#define __DISPLAY_H__ + +/*! + + \file + \ingroup display + + \brief Functions to display 2D and 3D stir::Array and stir::RelatedViewgrams objects + + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" + +START_NAMESPACE_STIR + +# if defined(__GNUC__) && (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +// gcc 2.95.2 is the only compiler we've used that handles the defaults properly + +/*! \brief The main function to display Array<3,elemT> objects. + + This function is templated for generality. + elemT is the type of elements in the Array<3,elemT> + scaleT is the type of the scale factors + CHARP is the type of the text strings (could be char * or variations with const) + + \param plane_stack + the Array object + \param scale_factors + a VectorWithOffset of factors which are multiplied with the numbers + in the Array object to give the "real" values + \param text + a VectorWithOffset of strings that are displayed below the images + \param maxi + a double which gives the ("real") value that will correspond to the + maximum of the color scale. All bigger values are displayed with the + same color. + If maxi is 0, all planes are scaled independently. + \param title + text that will be used as a title for the display. title==0 means no text. + \param zoom + an int giving the number of times the image should be enlarged. + Enlargement currently is with linear interpolation, giving + reasonably smooth images (although one could want to see the + 'pixels', but I didn't implement that yet). + If zoom = 0, maximum enlargement is used. + + Note that the scale_factors and text arrays are required to have the + same range is the outer dimension of the Array<3,elemT> object. + + Note that there is an effective threshold at 0 currently (i.e. negative + numbers are cut out).. + + \warning Due to the choice of defaults, if \c maxi is not given, the images will + be scaled independently. + */ +// TODO, make version with CHARP ='string' but requires function overloading +template +void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi = 0, + const char * const title = 0, + int zoom = 0); + +//! \brief display for Array<3,elemT> without scale factors and text. +template +inline void display(const Array<3,elemT>& plane_stack, + double maxi = 0, + const char * const title = 0, int zoom = 0); + + +//! \brief display for Array<2,elemT> objects, text==0 means no text. +template +inline void display(const Array<2,elemT>& plane, + const char * const text = 0, + double maxi = 0, int zoom = 0); + +#else // !gcc 2.95 + + +// VC and gcc 2.8.1 have problems with the defaults in the above declarations. +// So, we have to do them by hand... +template +void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, + const char * const title , + int zoom); + +template +inline void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, + const char * const title); + +template +inline void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi); + + +template +inline void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text); + +template +inline void display(const Array<3,elemT>& plane_stack, + double maxi, + const char * const title, + int zoom); + +template +inline void display(const Array<3,elemT>& plane_stack, + double maxi, + const char * const title); + +template +inline void display(const Array<3,elemT>& plane_stack, + double maxi); + +template +inline void display(const Array<3,elemT>& plane_stack); + +template +inline void display(const Array<2,elemT>& plane, + const char * const text, + double maxi, int zoom); + +template +inline void display(const Array<2,elemT>& plane, + const char * const text, + double maxi); + +template +inline void display(const Array<2,elemT>& plane, + const char * const text); + +template +inline void display(const Array<2,elemT>& plane); + +#endif + + + +template class RelatedViewgrams; + +//! Convenience function to display all viewgrams in a RelatedViewgrams object +template +void display(const RelatedViewgrams& v1, + double maxi = 0, + const char * const title = 0, + int zoom = 0); + + + +END_NAMESPACE_STIR + +#include "stir/display.inl" + +#endif diff --git a/src/include/stir/display.inl b/src/include/stir/display.inl new file mode 100644 index 0000000000..f0c1d570c8 --- /dev/null +++ b/src/include/stir/display.inl @@ -0,0 +1,164 @@ +// +// +/*! + \file + \ingroup display + + \brief functions to display 2D and 3D stir::Array objects + + \author Kris Thielemans + \author PARAPET project + + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/IndexRange3D.h" + +START_NAMESPACE_STIR +/*! + \see display(const Array<3,elemT>&, + const VectorWithOffset& , + const VectorWithOffset& , + double, + const char * const , + int zoom) for more info. + This function sets the 'text' parameter to a sequence of numbers. +*/ +template +void +display(const Array<3,elemT>& plane_stack, + double maxi, + const char * const title, + int zoom) + +{ + VectorWithOffset scale_factors(plane_stack.get_min_index(), + plane_stack.get_max_index()); + scale_factors.fill(1.); + VectorWithOffset text(plane_stack.get_min_index(), + plane_stack.get_max_index()); + + for (int i=plane_stack.get_min_index();i<= plane_stack.get_max_index();i++) + { + text[i]=new char[10]; + sprintf(text[i],"%d", i); + } + + display(plane_stack, scale_factors, text, + maxi, title,zoom); + // clean up memory afterwards + for (int i=plane_stack.get_min_index();i<= plane_stack.get_max_index();i++) + delete[] text[i]; + +} + +/*! + \see display(const Array<3,elemT>&, + const VectorWithOffset& , + const VectorWithOffset& , + double, + const char * const , + int zoom) for more info.*/ +template +void +display(const Array<2,elemT>& plane, + const char * const text, + double maxi, int zoom ) +{ + + if (plane.get_length()==0) + return; + // make a 3D array with arbitrary dimensions for its first and only plane + Array<3,elemT> stack(IndexRange3D(0,0,0,0,0,0)); + // this assignment sets correct dimensions for the 2 lowest dimensions + stack[0] = plane; + VectorWithOffset scale_factors(1); + scale_factors[0] = 1.F; + VectorWithOffset texts(1); + texts[0] = ""; + + display(stack, scale_factors, texts, maxi, text, zoom); +} + +# if defined(__GNUC__) && (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +// gcc 2.95.2 is the only compiler we've used that handles the defaults properly + +#else +// VC and gcc 2.8.1 have problems with the defaults in the above declarations. +// So, we have to do them by hand... + + +template +void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi, + const char * const title) +{ display(plane_stack, scale_factors, text, maxi, title, 0); } + +template +void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text, + double maxi) +{ display(plane_stack, scale_factors, text, maxi, 0, 0); } + + +template +void display(const Array<3,elemT>& plane_stack, + const VectorWithOffset& scale_factors, + const VectorWithOffset& text) +{ display(plane_stack, scale_factors, text, 0., 0, 0); } + +template +void display(const Array<3,elemT>& plane_stack, + double maxi, + const char * const title) +{ display(plane_stack, maxi, title, 0); } + +template +void display(const Array<3,elemT>& plane_stack, + double maxi) +{ display(plane_stack, maxi, 0, 0); } + +template +void display(const Array<3,elemT>& plane_stack) +{ display(plane_stack, 0., 0, 0); } + +template +void display(const Array<2,elemT>& plane, + const char * const text, + double maxi) +{ display(plane, text, maxi, 0); } + +template +void display(const Array<2,elemT>& plane, + const char * const text) +{ display(plane, text, 0., 0); } + +template +void display(const Array<2,elemT>& plane) +{ display(plane, 0, 0., 0); } + + +#endif + +END_NAMESPACE_STIR diff --git a/src/include/stir/doxygen_doc_for_boost.h b/src/include/stir/doxygen_doc_for_boost.h new file mode 100644 index 0000000000..fd63ecac2c --- /dev/null +++ b/src/include/stir/doxygen_doc_for_boost.h @@ -0,0 +1,121 @@ +// +// +//#error This file is for doxygen only. It does not contain any code. +/*! + \file + \ingroup boost + + \brief Documentation for some boost functions + + \author Kris Thielemans + \author PARAPET project + + +*/ + +/* + Copyright (C) 2000 PARAPET project + Copyright (C) 2001 - 2004-09-14, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! \namespace boost + \brief Namespace for the boost library + + see http://www.boost.org +*/ + +/*! \defgroup boost Boost + + Pending doxygen documentation of the boost library, we provide very basic + documentation of a few boost classes within STIR. This is mainly to get + class hierarchies and so on to work. + + See http://www.boost.org for more info. +*/ + +namespace boost +{ + namespace detail { + /*! \ingroup boost + \brief Boost class for chaining of operators (see operators.hpp) + */ + class empty_base {}; + } + +/*! \ingroup boost + \brief Boost class to define all comparison operators given only 2 (see operators.hpp) + */ +template + struct partially_ordered {}; + +/*! \ingroup boost + \brief Boost class to define operator!= in terms of operator== (see operators.hpp) + */ +template + struct equality_comparable {}; + + +/*! \ingroup boost + \brief A smart pointer class: multiple shared_ptr's refer to one object + + This class keeps a reference counter to see how many shared_ptr's refer + to the object. When a shared_ptr is deleted, the reference counter is + decremented and if the object is longer referenced, it is deleted. + + \par Advantages: (it's easy) + +
          +
        • Automatic tracking of memory allocations. No memory leaks. +
        • Syntax hardly changes (you still use * and ->) +
        + + \par Disadvantages: (you have to be careful) +
          +
        • If the object which a shared_ptr refers to gets modified, it affects all + shared_ptrs sharing the object. +
        • Constructing 2 shared_ptr's from the same ordinary pointer gives trouble. +
        + + \par Example: + + \code + + { + // ok + shared_ptr i_ptr1(new int (2)); + shared_ptr i_ptr2(i_ptr1); + std::auto_ptr a_ptr(new int(3)); + shared_ptr i_ptr3(a_ptr); + // now never use a_ptr anymore + { + int * i_ptr = new int (2); + i_ptr1.reset(i_ptr); + // now never use i_ptr anymore + } + } + { + // trouble! *i_ptr will be deleted twice ! + int * i_ptr = new int (2); + shared_ptr i_ptr1 (i_ptr); + shared_ptr i_ptr2 (i_ptr); + } + \endcode +*/ +template + class shared_ptr {}; + + +} diff --git a/src/include/stir/doxygengroups.h b/src/include/stir/doxygengroups.h new file mode 100644 index 0000000000..6ffb3fc23a --- /dev/null +++ b/src/include/stir/doxygengroups.h @@ -0,0 +1,366 @@ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + Copyright (C) 2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +// define some doxygen groups and namespace +// This file does not contain any code + +/*! \namespace stir + \brief Namespace for the STIR library (and some/most of its applications) + + This namespace encompasses the whole + library. All classes, functions and symbols are in this namespace. + This has the effect that conflicts with any other library is + impossible (except if that library uses the same namespace...). + */ + +/*! \namespace stir::BSpline + \brief Namespace for functions and classes for B-Spline interpolation in the STIR library + */ + +/*! \namespace stir::detail + \brief Namespace for the implementation details of the STIR library + + You should never have to call one of these routines. +*/ + +/*! \namespace stir::ecat + \brief Namespace for the ECAT IO part of the STIR library (and some/most of its applications) + + This namespace contains all routines that are common to the ECAT6 and + ECAT7 format. +*/ + +/*! \namespace stir::ecat::ecat7 + \brief Namespace for the ECAT7 IO part of the STIR library (and some/most of its applications) + + This namespace is only non-empty when the HAVE_LLN_MATRIX preprocessor + symbol is defined during compilation. + */ + +// have to define it here, otherwise doxygen ignores the \def command below +#define HAVE_LLN_MATRIX + +/*! \def HAVE_LLN_MATRIX + \brief Preprocessor symbol that needs to be defined to enable ECAT7 support. + You need to have the ecat matrix library developed originally at the + UCL of Louvain la Neuve. If the STIR Makefiles can find this + library, HAVE_LLN_MATRIX will be automatically defined for you. + See the User's guide for instructions. +*/ +/*! \namespace stir::ecat::ecat6 + \brief Namespace for the ECAT6 IO part of the STIR library (and some/most of its applications) + */ +/*! +\defgroup STIR STIR +All of STIR. +*/ + +/*! +\defgroup STIR_library STIR library +\ingroup STIR +The whole collection of libraries in STIR. +*/ + +/*! +\defgroup buildblock Basic building blocks +\ingroup STIR_library +Library with things that are not specific to reconstructions. +This includes multi-dimensional arrays, images, image processors, +projection data,... +*/ +/*! +\defgroup buildblock_detail Implementation details for buildblock +\ingroup buildblock +*/ +/*! +\defgroup Array Items relating to vectors and (multi-dimensional) arrays +\ingroup buildblock +*/ +/*! +\defgroup Array_detail Implementation details used by Array classes +\ingroup Array +*/ +/*! +\defgroup Array_IO Functions that implement IO for Array objects +\ingroup Array +*/ +/*! +\defgroup Array_IO_detail Implementation details for functions that implement IO for Array objects +\ingroup Array_IO +*/ +/*! +\defgroup Coordinate Items relating to coordinates +\ingroup buildblock +*/ +/*! +\defgroup geometry Items related to simple geometric calculations +\ingroup buildblock +Functions to compute distances between lines etc. +*/ +/*! +\defgroup projdata Items related to projection data +\ingroup buildblock +Basic support for projection data. This is the term generally used in STIR +for data obtained by the scanner or immediate post-processing. +*/ +/*! +\defgroup LOR Items related to Line Of Responses (preliminary) +\ingroup projdata +Classes for LORs. +\warning Preliminary and likely to change in the next release +*/ +/*! +\defgroup densitydata Items related to image data +\ingroup buildblock +Basic support for image (or discretised density) data. +*/ +/*! +\defgroup resolution Items related to finding image resolution based on point or line sources +\ingroup densitydata +*/ +/*! +\defgroup DataProcessor Data processors +\ingroup buildblock +A hierarchy of classes for performing data processing. Mechanisms +for parsing are provided such that different image processors can +be selected at run-time. +*/ +/*! +\defgroup ImageProcessor Image processors +\ingroup densitydata +\see Doxygen group DataProcessor for other members! + +A hierarchy of classes for performing image processing. Mechanisms +for parsing are provided such that different image processors can +be selected at run-time. + +*/ + + +/*! +\defgroup data_buildblock Acquisition data building blocks +\ingroup STIR_library +Library with building blocks for reading scan data +\todo move projection data etc in here +*/ +/*! +\defgroup singles_buildblock Singles rates etc +\ingroup data_buildblock +*/ + +/*! +\defgroup numerics Numerical algorithms +\ingroup STIR_library +*/ +/*! +\defgroup DFT Discrete Fourier transforms +\ingroup numerics +*/ +/*! +\defgroup BSpline Classes and functions for B-spline interpolation. +\ingroup numerics +*/ +/*! +\defgroup IO Input/Output Library +\ingroup STIR_library +Library with classes and functions to read and write images and projection +from/to file. +*/ +/*! +\defgroup InterfileIO Interfile support in the IO library +\ingroup IO +*/ +/*! +\defgroup ECAT ECAT6 and ECAT7 support in the IO library +\ingroup IO +*/ + + +/*! +\defgroup listmode Support classes for reading list mode data +\ingroup STIR_library +*/ + +/*! +\defgroup Shape Classes for describing geometric shapes such as cylinders etc. +\ingroup STIR_library +*/ + +/*! +\defgroup evaluation Classes for computing ROI values and other FOMs + For image evaluation, it is often necessary to compute ROI values, + or other simple Figures of Merits (FOMs). These classes + and functions allow you do to this directly in STIR. This is mainly + useful for automation, as there is no nice graphical interface in STIR + to draw ROIs etc. +\ingroup STIR_library +*/ + +/*! +\defgroup recon_buildblock Reconstruction building blocks +\ingroup STIR_library +Library with 'general' reconstruction building blocks +*/ +/*! +\defgroup projection Projection building blocks +\ingroup recon_buildblock +Everything (?) related to projection matrices, forward and back projection. + +In the context of image reconstruction, 'forward projection' means going from +the image to an estimate of the (mean of the) data. This is because in +SPECT and PET, the measurements can be seen to be approximations of line +integrals through the object. + +STIR keeps this terminology, even though it is unfortunate. (For instance, +a stir::ProjMatrix is not a projection matrix in the mathematical sense.) +*/ +/*! +\defgroup symmetries Symmetries building blocks +\ingroup projection +Usually, there are (geometric) symmetries between the image and the projection +data. This means that various elements of the projection matrix will be equal. +The classes in this module convert this concept into code, such that projection +matrices need only be computed for the 'independent' bins. +*/ +/*! +\defgroup normalisation Normalisation building blocks +\ingroup recon_buildblock +Everything related to BinNormalisation classes. + +In PET 'normalisation' is used to describe a multiplicative calibration of +every detector-pair. More generally, it can be used to the process of +'correcting' projection data by multiplying every bin with a factor. +*/ +/*! +\defgroup GeneralisedObjectiveFunction Objective functions for iterative estimation of variables +\ingroup recon_buildblock +Everything related to objective functions, i.e. functions that need to +be 'optimised' in some way. +*/ +/*! +\defgroup priors Priors and penalties for MAP +\ingroup GeneralisedObjectiveFunction +Everything related to priors, which are used for MAP-type (also knows as +'penalised') reconstructions. +*/ +/*! +\defgroup distributable distributable building blocks +\ingroup recon_buildblock +Classes and functions that are used to make a common interface for the serial +and parallel implementation of the reconstruction algorithms. +*/ + + +/*! +\defgroup reconstructors Reconstruction classes +\ingroup STIR_library +*/ +/*! +\defgroup OSMAPOSL OSMAPOSL +\ingroup reconstructors +Implementation of the OSMAP One-Step-Late reconstruction algorithm +*/ +/*! +\defgroup OSSPS OSSPS +\ingroup reconstructors +Implementation of the OS Separable Paraboloidal Surrogate reconstruction algorithm +*/ +/*! +\defgroup FBP2D FBP2D +\ingroup reconstructors +Implementation of the 2D Filtered Back Projection algorithm +*/ +/*! +\defgroup FBP3DRP FBP3DRP +\ingroup reconstructors +Implementation of the 3D Reprojection Filtered Back Projection algorithm +*/ + +/*! +\defgroup modelling Kinetic modelling building blocks +\ingroup STIR_library +building blocks for kinetic modelling +*/ +/*! +\ingroup spatial_transformation +\ingroup STIR_library +building blocks for motion fields, warping etc +*/ + +/*! +\defgroup scatter Scatter estimation building blocks +\ingroup STIR_library +building blocks for scatter estimation +*/ + +/*! +\defgroup display Display functions +\ingroup STIR_library +Library for displaying of images +*/ +/*! +\defgroup para Parallel library +\ingroup STIR_library +*/ + +/*! +\defgroup alltest Test code for STIR +\ingroup STIR +*/ +/*! +\defgroup test Tests of the basic building blocks +\ingroup alltest +*/ +/*! +\defgroup recontest Tests of reconstruction building blocks +\ingroup alltest +*/ +/*! +\defgroup numerics_test Tests of numeric building blocks +\ingroup alltest +*/ + + + + +/*! +\defgroup main_programs Executables +\ingroup STIR +Almost all programs that can be executed by the user. +*/ +/*! +\defgroup utilities Utility programs +\ingroup main_programs +*/ +/*! +\defgroup listmode_utilities Utility programs for list mode data +\ingroup utilities +*/ +/*! +\defgroup ECAT_utilities ECAT6 and ECAT7 utilities +\ingroup utilities +Includes conversion programs etc. +*/ + + + +/*! +\defgroup examples Example files +\ingroup STIR +Some examples files to illustrate some basic coding in STIR. +*/ diff --git a/src/include/stir/doxygenmain.h b/src/include/stir/doxygenmain.h new file mode 100644 index 0000000000..b88cd304e5 --- /dev/null +++ b/src/include/stir/doxygenmain.h @@ -0,0 +1,56 @@ +// +// +// This file is for doxygen only. It does not contain any code. +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \mainpage + + \section intro Introduction + + This is the detailed documentation for STIR: Software for Tomographic + Image Reconstruction. Additional documentation + (sometimes overlapping) is given in the User's Guide, + Overview documents etc are available on the + STIR website (http://stir.sourceforge.net). You should probably read those + first before looking into the documentation on this page. + + The current pages are automatically + generated by doxygen from text comments in the files. + + As the amount of software is rather large, some guidance is + needed. The best place to start is probably the Modules section. This + attempts to group files in a sensible way. In particular, a User might only be + interested in the Executables module. (Note however that the doxygen + documentation for some executables is not very informative. In any case, + just executing the utility should give a usage message). + + Another way to navigate through this is the Class Hierarchy page, or indeed + any of the other alphabetical lists. + However, this is not structured at all, and even contains some classes + which we'd rather not have in there. So, in the beginning, this might be + somewhat confusing. + + \section docproblems Problems to keep in mind when reading this documentation + + All documentation depends on the person who writes it. In the end, only + the code is what matters... + + + +*/ diff --git a/src/include/stir/error.h b/src/include/stir/error.h new file mode 100644 index 0000000000..491030a5e4 --- /dev/null +++ b/src/include/stir/error.h @@ -0,0 +1,93 @@ +// +// +#ifndef __stir_error_H__ +#define __stir_error_H__ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2010-06-25, Hammersmith Imanet Ltd + Copyright (C) 2013-01-01 - 2013, Kris Thielemans + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief Declaration of stir::error() + + \author Kris Thielemans + +*/ +#include "stir/common.h" +#include +#include + +START_NAMESPACE_STIR + +//! Print error with format string a la \c printf and throw exception +/*! \ingroup buildblock + + The arguments are the same as if you would call printf(). The error message is written to stderr, + preceeded by "ERROR:", a std::string is constructed with the error message, and + throw is called with the string as argument. + + Note that because we throw an exception, the caller can catch it. Prior to STIR 2.1, this was + not possible as stir::error directly called std::exit. + + \todo As opposed to using printf-style calling sequence, use a syntax like stir::info + + \par Example + \code + error("Error opening file %s", filename); + \endcode + + \deprecated (use 1 argument version instead) +*/ +void +error(const char *const s, ...); + + +//! Use this function for writing error messages and throwing an exception +/*! \ingroup buildblock + + The argument is expected to be a string, but could be anything for which + std::ostream::operator\<\< would work. + + This function currently first writes a newline, then \c ERROR:, then \c string + and then another newline to std::cerr. Then it throws an exception (of type string). + + \todo At a later stage, it will also write to a log-file. + + \c boost::format is useful in this context. + + \par Example + \code + error(boost::format("Incorrect number of subsets: %d") % num_subsets); + + error("This does not work"); + \endcode +*/ + +template +inline void +error(const STRING& string) +{ + std::stringstream sstr; + sstr << "\nERROR: " + << string + << std::endl; + std::cerr << sstr.str(); + throw sstr.str(); +} + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/evaluation/ROIValues.h b/src/include/stir/evaluation/ROIValues.h new file mode 100644 index 0000000000..81f0b33aa6 --- /dev/null +++ b/src/include/stir/evaluation/ROIValues.h @@ -0,0 +1,140 @@ +/*! + \file + \ingroup evaluation + + \brief Definition of class stir::ROIValues + + \author Damiano Belluzzo + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_evaluation_ROIValues__H__ +#define __stir_evaluation_ROIValues__H__ + +#include "stir/common.h" + +#include +#include +#include +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + + +/*! + \ingroup evaluation + \brief A class to store and get results of an ROI calculation. + + This class stores the volume of the ROI (in cubic mm), the integral over the ROI of the functions and + its square and the min and max values in the ROI. These values are used to compute mean, + standard deviation and coefficient of variance. +*/ +class ROIValues +{ + +public: + + ROIValues() + {init();}; + + ROIValues(float roi_volume, float integral, float integral_of_square, float min_value, float max_value) + : roi_volume(roi_volume), integral(integral), integral_of_square(integral_of_square), + min_value(min_value), max_value(max_value) + { + update(); + }; + + //! Combine the ROI values appropriately + ROIValues operator+= (const ROIValues &iv) + { + roi_volume += iv.roi_volume; + integral += iv.integral; + integral_of_square += iv.integral_of_square; + + +#ifndef STIR_NO_NAMESPACES + min_value = std::min(min_value, iv.min_value); + max_value = std::max(max_value, iv.max_value); +#else + min_value = min(min_value, iv.min_value); + max_value = max(max_value, iv.max_value); +#endif + + update(); + return *this; + }; + + //! Return a string with all info, one per line + string report() const; + + //! Total valume (in mm^3) + float get_roi_volume() const + { return roi_volume; } + //! Sum of elements times voxel volume + float get_integral() const + { return integral; } + //! Sum of squares times voxel volume + float get_integral_of_square() const + { return integral_of_square; } + //! Mean value + float get_mean() const + { return mean_value; } + //! Variance + float get_variance() const + { return variance_value; } + //! Standard deviation + float get_stddev() const + {return std_value; } + //! Coefficient of Variance =stddev/mean) + float get_CV() const + {return std_value/mean_value; } + //! Minimum value in the ROI + float get_min() const + { return min_value; } + //! Maximum value in the ROI + float get_max() const + { return max_value; } + + +//friend ostream &operator <<( ostream &stream, ROIValues val); + +private: + + float roi_volume; + float integral; + float integral_of_square; + + float mean_value; + float variance_value; + float std_value; + + float min_value; + float max_value; + + void init(); + void update(); +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/evaluation/compute_ROI_values.h b/src/include/stir/evaluation/compute_ROI_values.h new file mode 100644 index 0000000000..15d9c6a4c2 --- /dev/null +++ b/src/include/stir/evaluation/compute_ROI_values.h @@ -0,0 +1,95 @@ +// +// +/*! + \file + \ingroup evaluation + + \brief Declaration of various function that computes ROI values + + \author Kris Thielemans +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_evaluation_compute_ROI_values__H__ +#define __stir_evaluation_compute_ROI_values__H__ + +#include "stir/evaluation/ROIValues.h" + +START_NAMESPACE_STIR + +template class CartesianCoordinate2D; +template class CartesianCoordinate3D; +template class VectorWithOffset; +template class DiscretisedDensity; +class Shape3D; + +/*! \ingroup evaluation + \name Functions to compute ROI values + + Shapes are first discretised using Shape3D::construct_volume. This can make fuzzy + boundaries (when the \a num_samples argument is not (1,1,1), or when DiscretisedShape3D + needs zooming). Mean and stddev are computed using weighted versions, taking this smoothness + into account, while ROI_min and max are ignore those weights. +*/ +//@{ + +// TODO doc + +void +compute_ROI_values_per_plane(VectorWithOffset& values, + const DiscretisedDensity<3,float>& image, + const Shape3D& shape, + const CartesianCoordinate3D& num_samples); +ROIValues +compute_total_ROI_values(const VectorWithOffset& values); + +ROIValues +compute_total_ROI_values(const DiscretisedDensity<3,float>& image, + const Shape3D& shape, + const CartesianCoordinate3D& num_samples + ); + +// function that calculate the +void +compute_plane_range_ROI_values_per_plane(VectorWithOffset& values, + const DiscretisedDensity<3,float>& image, + const CartesianCoordinate2D& plane_range, + const Shape3D& shape, + const CartesianCoordinate3D& num_samples); + +float +compute_CR_hot(ROIValues& val1, ROIValues& val2); +float +compute_CR_cold(ROIValues& val1, ROIValues& val2); +float +compute_uniformity(ROIValues& val); + +VectorWithOffset +compute_CR_hot_per_plane(VectorWithOffset& val1,VectorWithOffset& val2); + +VectorWithOffset +compute_CR_cold_per_plane(VectorWithOffset& val1,VectorWithOffset& val2); + +VectorWithOffset +compute_uniformity_per_plane(VectorWithOffset& val); + +// end of doxygen group +//@} + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/extend_projdata.h b/src/include/stir/extend_projdata.h new file mode 100644 index 0000000000..bc5fd1b7fd --- /dev/null +++ b/src/include/stir/extend_projdata.h @@ -0,0 +1,50 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + \ingroup projdata + \file Functions that extend a direct sinogram or segment in the view direction + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ +START_NAMESPACE_STIR + +//@{ +/*! +\ingroup projdata +\brief Extension of direct projection data in view direction. + +Functions that extend the given sinogram or segment in the view direction taking +periodicity into account, if exists. If the sinogram is not symmetric in +tangential position, the values are extrapolated by nearest neighbour known values. + +This is probably only useful before calling interpolation routines, or for FORE. +*/ +Array<3,float> +extend_segment_in_views(const SegmentBySinogram& sino, + const int min_view_extension, const int max_view_extension); +Array<2,float> +extend_sinogram_in_views(const Sinogram& sino, + const int min_view_extension, const int max_view_extension); +//@} + +END_NAMESPACE_STIR + + diff --git a/src/include/stir/extract_line.h b/src/include/stir/extract_line.h new file mode 100644 index 0000000000..802b2cf963 --- /dev/null +++ b/src/include/stir/extract_line.h @@ -0,0 +1,49 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_extract_line_H__ +#define __stir_extract_line_H__ +/*! + \file + \ingroup buildblock + \brief Declaration of stir::extract_line + + \author Charalampos Tsoumpas + \author Kris Thielemans + + + */ +#include "stir/Array.h" +#include "stir/BasicCoordinate.h" +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief extracts a line from an array in the direction of the specified dimension. + \todo make n-dimensional version +*/ +template +Array<1,elemT> +inline +extract_line(const Array<3,elemT> &, + const BasicCoordinate<3,int>& index, + const int dimension); +END_NAMESPACE_STIR + +#include "stir/extract_line.inl" +#endif diff --git a/src/include/stir/extract_line.inl b/src/include/stir/extract_line.inl new file mode 100644 index 0000000000..909847ecf6 --- /dev/null +++ b/src/include/stir/extract_line.inl @@ -0,0 +1,52 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief Implementation of stir::extract_line + + \author Charalampos Tsoumpas + \author Kris Thielemans + + + */ + +START_NAMESPACE_STIR +template +Array<1,elemT> +extract_line(const Array<3,elemT>& input_array, + const BasicCoordinate<3,int>& index, + const int dimension) +{ + BasicCoordinate<3,int> min_index,max_index; + min_index[1] = input_array.get_min_index(); + max_index[1] = input_array.get_max_index(); + min_index[2] = input_array[index[1]].get_min_index(); + max_index[2] = input_array[index[1]].get_max_index(); + min_index[3] = input_array[index[1]][index[2]].get_min_index(); + max_index[3] = input_array[index[1]][index[2]].get_max_index(); + Array<1,elemT> line(min_index[dimension],max_index[dimension]); + BasicCoordinate<3,int> running_index = index; + int &counter = running_index[dimension]; + for (counter=min_index[dimension]; counter<= max_index[dimension] ; ++counter) + line[counter]= input_array[running_index]; + return line ; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/find_fwhm_in_image.h b/src/include/stir/find_fwhm_in_image.h new file mode 100644 index 0000000000..a438a2b17f --- /dev/null +++ b/src/include/stir/find_fwhm_in_image.h @@ -0,0 +1,146 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup resolution + \brief A collection of functions to measure resolution + + \author Charalampos Tsoumpas + \author Kris Thielemans + + + */ +#include "stir/shared_ptr.h" +#include "stir/DiscretisedDensity.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include + +START_NAMESPACE_STIR + +/*! + \ingroup resolution + \brief find width at a level + \param[in] begin_iterator start of sequence to check + \param[in] max_iterator location from where the search will start, should be close + to the location of the (local) maximum you want to investigate + \param[in] end_iterator end of sequence to check + \param[in] level_height intensity level at which to find the width + \return width of the level set (in pixel units) + + The implementation assumes uniform spacing between the samples. + + We use linear interpolation between samples to estimate where the function value + reaches the \a level_height value. + + If the search runs to the end/start of the sequence, a warning is issued, and the width + is estimated using linear extrapolation. +*/ +template +float find_level_width(const RandomAccessIterType& begin_iterator, + const RandomAccessIterType& max_iterator, + const RandomAccessIterType& end_iterator, + const float level_height) ; +/*! + \ingroup resolution + \brief find width at a level + \param[in] begin_iterator start of sequence to check + \param[in] end_iterator end of sequence to check + \param[in] level_height intensity level at which to find the width + \return width of the level set (in pixel units) + + This function finds the maximum in the sequence and calls + find_level_width(const RandomAccessIterType& begin_iterator, + const RandomAccessIterType& max_iterator, + const RandomAccessIterType& end_iterator, + const float level_height) +*/ +template +float find_level_width(const RandomAccessIterType& begin_iterator, + const RandomAccessIterType& end_iterator, + const float level_height); +/*! + \ingroup resolution + \brief + finds the maximum of the Input_Array in the given slice at the given + dimension (z=1, y=2, x=3), and returns its location as a vector in BasicCoordinate Field + (only 3D implementation). +*/ +template +BasicCoordinate<3,int> +maximum_location_per_slice(const Array<3,elemT>& input_array, + const int slice, const int dimension); + +/*! + \ingroup resolution + \brief extract a line from the given array after determining its locatin with a parabolic fit + + It finds the real maximum location, using the 3 points parabolic fit. Then, tri-linear interpolation is used + to find the whole line at the given dimension (z:1,y:2,x:3) taking into account the voxels that + intersects the voxel which has in its center the point with the real maximum_value. +*/ +template +Array<1,elemT> +interpolate_line(const Array<3,elemT>& input_array, + const BasicCoordinate<3,int>& max_location, + const BasicCoordinate<3,bool>& do_direction, + const int dimension); + +/*! + \ingroup resolution + \brief a structure that is used to hold the output of the function find_fwhm_in_image. +*/ +template +struct ResolutionIndex +{ + elemT voxel_value; + BasicCoordinate voxel_location; + BasicCoordinate resolution; +}; +/*! + \ingroup resolution + \brief Finds FWHM, FWTM etc (in mm) for a number of point sources or a line source + + \param[in] input_image + \param[in] num_maxima the number of maxima to find (see below) + \param[in] level level at which to compute the width (2 for half maximum, 10 for tenth maximum etc.) + \param[in] dimension the dimension along which the line source is oriented, or 0 for point sources + \param[in] nema enables the calculation based on the NEMA Standards Publication + NU 2-2001. + \return a list containing the maximum_value, its location per slice and resolution. + For line sources, sorted by minimum to maximum slice of the requested dimension, or for point sources, + sorted by maximum to minimum value. + + For line sources, \a num_maxima slices are sampled (from first to last slice, with steps given by num_slices/(num_maxima+1) + + For point sources, if \a num_maxima is larger than 1, after finding a maximum and the resolution, the data is masked out in + a neigbhourhood of half-size (resolution*2/level). This will only ork properly if the point sources are not too close to eachother + and have roughly the maximum. + + The value of the maximum is computed using a parabolic fit through the 3 points around the maximum as specified + in NEMA 2001. + + If nema=false, the interpolate_line() function is used to find a line, otherwise we use extract_line(). +*/ + +template +std::list > +find_fwhm_in_image(DiscretisedDensity<3,elemT> & input_image, + const unsigned int num_maxima, const float level, + const int dimension, const bool nema); +END_NAMESPACE_STIR diff --git a/src/include/stir/geometry/line_distances.h b/src/include/stir/geometry/line_distances.h new file mode 100644 index 0000000000..949d310eec --- /dev/null +++ b/src/include/stir/geometry/line_distances.h @@ -0,0 +1,166 @@ +// +// + +/*! + \file + \ingroup geometry + \brief A few functions to compute distances between lines etc + \todo move implementations to .cxx + \author Kris Thielemans +*/ +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details. +*/ + +#include "stir/CartesianCoordinate3D.h" +#include "stir/LORCoordinates.h" +#include +#ifdef BOOST_NO_STDC_NAMESPACE + namespace std { using ::sqrt; using ::fabs; } +#endif + + +START_NAMESPACE_STIR + +/*! \ingroup geometry + \brief find a point half-way between 2 lines and their distance + + The point is found by minimising the distance with both lines. + + If the lines are parallel, the point returned is still valid, although it is of course + not unique in practice. +*/ +template +inline +coordT +coordinate_between_2_lines(CartesianCoordinate3D& result, + const LORAs2Points& line0, + const LORAs2Points& line1) +{ + /* Rationale: + parametrise points on the lines as + r0 + a0 d0, r1 + a1 d1 + where r0 is a point on the line, and d0 is its direction + + compute distance squared between those points, i.e. + norm(a0 d0 - a1 d1 + r0-r1)^2 + This can be written using inner products of all the vectors. + + Minimising it (by computing derivatives) results in a linear eq in a0, a1: + a0 d0d0 == a1 d0d1 + r10d0, + a0 d0d1 == a1 d1d1 + r10d1 + which is easily solved. + The half-way point can then be found by using + (r0 + a0 d0 + r1 + a1 d1)/2 + for the a0,a1 found. + */ + const CartesianCoordinate3D& r0 = line0.p1(); + const CartesianCoordinate3D& r1 = line1.p1(); + const CartesianCoordinate3D r10 = r1-r0; + const CartesianCoordinate3D d0 = line0.p2() - line0.p1(); + const CartesianCoordinate3D d1 = line1.p2() - line1.p1(); + const coordT d0d0 = inner_product(d0,d0); + const coordT d0d1 = inner_product(d0,d1); + const coordT d1d1 = inner_product(d1,d1); + const coordT r10d0 = inner_product(r10,d0); + const coordT r10r10 = inner_product(r10,r10); + + const coordT eps=d0d0*10E-5; // small number for comparisons + + const coordT denom = square(d0d1) - d0d0*d1d1; + coordT distance_squared; + if (std::fabs(denom) <= eps) + { + //parallel lines + const coordT a0 = r10d0/d0d0; + result = r0 + d0*a0; + distance_squared = r10r10 - square(r10d0)/d0d0; + } + else + { + const coordT r10d1 = inner_product(r10,d1); + const coordT a0 = (-d1d1*r10d0 + d0d1*r10d1)/denom; + const coordT a1 = (-d0d1*r10d0 + d0d0*r10d1)/denom; + + result = ((r0 + d0*a0) + (r1 + d1*a1))/2; + distance_squared = + (d1d1*square(r10d0) - 2*d0d1*r10d0*r10d1 + d0d0*square(r10d1))/denom + + r10r10; + } + if (distance_squared >= 0) + return std::sqrt(distance_squared); + else + { + if (-distance_squared < eps) + return 0; + else + { + assert(false); + return std::sqrt(distance_squared); // will return NaN + } + } +} + + +/*! \ingroup geometry + \brief find the distance between a point and a line + +*/ +template +inline +coordT +distance_between_line_and_point( + const LORAs2Points& line, + const CartesianCoordinate3D& r1 ) +{ + /* Rationale: + parametrise points on the lines as + r0 + a0 d0 + where r0 is a point on the line, and d0 is its direction + + compute distance squared between those points, i.e. + norm(a0 d0 + r0-r1)^2 + This can be written using inner products of all the vectors: + a0^2 d0d0 - 2 a0 r10d0 + r10r10 + Minimising it (by computing derivatives) results in a linear eq in a0, a1: + a0 d0d0 == r10d0 + */ + const CartesianCoordinate3D& r0 = line.p1(); + const CartesianCoordinate3D r10 = r1-r0; + const CartesianCoordinate3D d0 = line.p2() - line.p1(); + const coordT d0d0 = inner_product(d0,d0); + const coordT r10d0 = inner_product(r10,d0); + const coordT r10r10 = inner_product(r10,r10); + + //const coordT a0 = r10d0/d0d0; + //result = r0 + d0*a0; + const coordT distance_squared = r10r10 - square(r10d0)/d0d0; + if (distance_squared >= 0) + return std::sqrt(distance_squared); + else + { + if (-distance_squared < d0d0*10E-5) + return 0; + else + { + assert(false); + return std::sqrt(distance_squared); // will return NaN + } + } +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/getopt.h b/src/include/stir/getopt.h new file mode 100644 index 0000000000..e937537e22 --- /dev/null +++ b/src/include/stir/getopt.h @@ -0,0 +1,192 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software + Foundation, Inc. This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute + it and/or modify it under the terms of the GNU Lesser + General Public License as published by the Free Software + Foundation; either version 2.1 of the License, or + (at your option) any later version. + + The GNU C Library 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with the GNU C Library; if not, write + to the Free Software Foundation, Inc., 59 Temple Place, + Suite 330, Boston, MA 02111-1307 USA. */ + + + +#ifndef _stir_GETOPT_H +#define _stir_GETOPT_H + +#ifdef HAVE_SYSTEM_GETOPT + +/* use system getopt */ +#include + +#else + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if (defined __STDC__ && __STDC__) || defined __cplusplus + //# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int ___argc, char *const *___argv, const char *__shortopts); + //# else /* not __GNU_LIBRARY__ */ + //extern int getopt (); + //# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* HAVE_SYSTEM_GETOPT */ + +#endif /* getopt.h */ + diff --git a/src/include/stir/index_at_maximum.h b/src/include/stir/index_at_maximum.h new file mode 100644 index 0000000000..c8454d05fa --- /dev/null +++ b/src/include/stir/index_at_maximum.h @@ -0,0 +1,108 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup array + + \brief Declaration of stir:index_at_maximum() and stir::indices_at_maximum() + + \todo move implementations to .cxx + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + +#include "stir/VectorWithOffset.h" +#include "stir/BasicCoordinate.h" +#include "stir/Array.h" + +START_NAMESPACE_STIR + +/*! \ingroup array + \brief Finds the index where the maximum occurs in a (1-dimensional) vector. + + If the maximum occurs more than once, the smallest index is returned. + + If the vector is empty, the function returns 0. + + \todo make iterator version, or something that works on std::vector + +*/ + +template +int index_at_maximum(const VectorWithOffset& v) +{ + if (v.size() == 0) + return 0; + + int index_at_max=v.get_min_index(); + elemT max_value=v[index_at_max]; + for (int index=v.get_min_index(); index<=v.get_max_index(); ++index) + { + const elemT value = v[index]; + if (value>max_value) + { + index_at_max=index; + max_value=value; + } + } + return index_at_max; +} + +/*! \ingroup array + \brief Finds the first (3-dimensional) index where the maximum occurs + in a (3-dimensional) array. + + \todo generalise to arbitrary dimensions + \todo implementation currently cycles through the data twice +*/ +template +BasicCoordinate<3,int> +indices_at_maximum(const Array<3,elemT>& input_array) +{ + const elemT current_maximum = input_array.find_max(); + BasicCoordinate<3,int> max_location, min_index, max_index; + + bool found=false; + min_index[1] = input_array.get_min_index(); + max_index[1] = input_array.get_max_index(); + for ( int k = min_index[1]; k<= max_index[1] && !found; ++k) + { + min_index[2] = input_array[k].get_min_index(); + max_index[2] = input_array[k].get_max_index(); + for ( int j = min_index[2]; j<= max_index[2] && !found; ++j) + { + min_index[3] = input_array[k][j].get_min_index(); + max_index[3] = input_array[k][j].get_max_index(); + for ( int i = min_index[3]; i<= max_index[3] && !found; ++i) + { + if (input_array[k][j][i] == current_maximum) + { + max_location[1] = k; + max_location[2] = j; + max_location[3] = i; + } + } + } + } + found = true; + return max_location; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/info.h b/src/include/stir/info.h new file mode 100644 index 0000000000..9c7c999e64 --- /dev/null +++ b/src/include/stir/info.h @@ -0,0 +1,63 @@ +// +// +#ifndef __stir_info_H__ +#define __stir_info_H__ +/* + Copyright (C) 2006- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief Declaration of stir::info() + + \author Kris Thielemans + +*/ +#include "stir/common.h" +#include + +START_NAMESPACE_STIR + +//! Use this function for writing informational messages +/*! \ingroup buildblock + + The argument is expected to be a string, but could be anything for which + std::ostream::operator\<\< would work. + + This function currently first writes a newline, then \c INFO, then \c string + and then another newline to std::cerr. + + \todo At a later stage, it will also write to a log-file. + + \c boost::format is useful in this context. + + \par Example + \code + info(boost::format("Running sub-iteration %1% of total %2%") % subiter_num % total); + + info("Running a really complicated algorithm"); + \endcode +*/ +template +void +info(const STRING& string) +{ + std::cerr << "\nINFO: " + << string + << std::endl; +} + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/interfile_keyword_functions.h b/src/include/stir/interfile_keyword_functions.h new file mode 100644 index 0000000000..1f1334a142 --- /dev/null +++ b/src/include/stir/interfile_keyword_functions.h @@ -0,0 +1,69 @@ +/*! + \file + \ingroup buildblock + + \brief Functions useful for manipulating Interfile keywords + + \author Kris Thielemans +*/ +/* + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_interfile_keyword_functions_H__ +#define __stir_interfile_keyword_functions_H__ +#include "stir/common.h" + + +#include +#include + +START_NAMESPACE_STIR + +//! Put a (Interfile) keyword into a standard form +/*! + This follows Interfile 3.3 conventions: +
          +
        • The characters \c space, \c tab, \c underscore, \c ! are all + treated as white space. +
        • Starting and trailing white space is trimmed. +
        • Repeated white space is replaced with a single space +
        • All letters are made lowercase. +
        +*/ +std::string +standardise_interfile_keyword(const std::string& keyword); + +//! A function object that compares Interfile keywords +/*! This is similar to std::less, except that it applies + standardise_interfile_keyword() on its arguments before doing the + comparison. + + Useful for constructing a std::map for instance. +*/ +struct interfile_less : public std::binary_function +{ + bool operator()(const std::string& a, const std::string& b) const + { + return + standardise_interfile_keyword(a) < + standardise_interfile_keyword(b); + } +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/interpolate.h b/src/include/stir/interpolate.h new file mode 100644 index 0000000000..b10aba6680 --- /dev/null +++ b/src/include/stir/interpolate.h @@ -0,0 +1,37 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __interpolate_H__ +#define __interpolate_H__ +/*! + \file + \ingroup buildblock + + \brief declares functions for interpolation + + \warning will be moved to numerics + \author Kris Thielemans + \author PARAPET project + +*/ + + +#include "stir/numerics/overlap_interpolate.h" + +#endif diff --git a/src/include/stir/interpolate_projdata.h b/src/include/stir/interpolate_projdata.h new file mode 100644 index 0000000000..0355557bac --- /dev/null +++ b/src/include/stir/interpolate_projdata.h @@ -0,0 +1,77 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + \ingroup projdata + \file Declaration of stir::interpolate_projdata + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#include "stir/numerics/BSplines.h" + +START_NAMESPACE_STIR + +class ProjData; +template class BasicCoordinate; +template class Sinogram; +template class SegmentBySinogram; + + +//! \brief Perform B-Splines Interpolation +/*! + \ingroup projdata + \param[out] proj_data_out Its projection_data_info is used to + determine output characteristics. Data will be 'put' in here using + ProjData::set_sinogram(). + \param[in] proj_data_in input data + \param[in] spline_type determines which type of BSpline will be used + \param[in] remove_interleaving + The STIR implementation of interpolating 3D (for the moment) projdata is a generalisation that applies + B-Splines Interpolation to projdata supposing that every dimension is a regular grid. For instance, for + a 3D dataset, interpolating can produce a new expanded 3D dataset based on the given information + (proj_data_out). This mostly is useful in the scatter sinogram expansion. + + See STIR documentation about B-Spline interpolation or scatter correction. + + \todo This currently only works for direct sinograms (i.e. segment 0). + \warning Because of the boundary conditions in the B-spline interpolation, + strange results can occur if the output sinogram has a larger range than + the input sinogram. +*/ +//@{ +Succeeded +interpolate_projdata(ProjData& proj_data_out, + const ProjData& proj_data_in, + const BSpline::BSplineType spline_type, + const bool remove_interleaving = false, + const bool use_view_offset = false); +Succeeded +interpolate_projdata(ProjData& proj_data_out, + const ProjData& proj_data_in, + const BasicCoordinate<3, BSpline::BSplineType> & spline_type, + const bool remove_interleaving = false, + const bool use_view_offset = false); +//@} + +END_NAMESPACE_STIR + + + diff --git a/src/include/stir/inverse_SSRB.h b/src/include/stir/inverse_SSRB.h new file mode 100644 index 0000000000..06c41464ab --- /dev/null +++ b/src/include/stir/inverse_SSRB.h @@ -0,0 +1,60 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + \ingroup projdata + \file Declaration of stir::inverse_SSRB + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + + +#include "stir/common.h" + +START_NAMESPACE_STIR + +class ProjData; +class Succeeded; +//! Perform Inverse Single Slice Rebinning and write output to ProjData4D format +/*! + \ingroup projdata + \param[out] proj_data_4D Its projection_data_info is used to + determine output characteristics (e.g. number of segments). Data will be 'put' in here using + ProjData::set_sinogram(). + \param[in] proj_data_3D input data + + The STIR implementation of Inverse SSRB applies the + inverse idea of SSRB. inverse_SSRB will produce oblique + sinograms by finding the sinogram that has the same + 'm'-coordinate (i.e. the intersection with the z-axis + of the central LOR). In addition, if the output sinogram would lie 'half-way' + 2 input sinograms, it will be set to the average of the 2 input sinograms. + + Note that any oblique segments in \a proj_data_3D are currently ignored. + + Input and output projectino data should have the same number of views and tangential positions. + +*/ +Succeeded +inverse_SSRB(ProjData& proj_data_4D, + const ProjData& proj_data_3D); + +END_NAMESPACE_STIR + diff --git a/src/include/stir/is_null_ptr.h b/src/include/stir/is_null_ptr.h new file mode 100644 index 0000000000..2a7282a626 --- /dev/null +++ b/src/include/stir/is_null_ptr.h @@ -0,0 +1,62 @@ +// +// +/* + Copyright (C) 2000- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief Definition of stir::is_null_ptr functions + + \author Kris Thielemans +*/ + +#ifndef __stir_is_null_ptr_H__ +#define __stir_is_null_ptr_H__ + +#include "stir/shared_ptr.h" +#include // for auto_ptr +START_NAMESPACE_STIR +/*! \ingroup buildblock + \name testing of (smart) pointers + + A utility function that checks if an ordinary or smart pointer is null + with identical syntax for all types. +*/ +//@{ +template +inline +bool +is_null_ptr(T const * const ptr) +{ return ptr==0; } + +template +inline +bool +is_null_ptr(shared_ptr const& sptr) +{ return is_null_ptr(sptr.get()); } + +template +inline +bool +is_null_ptr(std::auto_ptr const& aptr) +{ return is_null_ptr(aptr.get()); } + +//@} + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/line.h b/src/include/stir/line.h new file mode 100644 index 0000000000..cb130c6c8e --- /dev/null +++ b/src/include/stir/line.h @@ -0,0 +1,79 @@ +// +// +/*! + + \file + \ingroup buildblock + + \brief declaration of class stir::Line + + \author Patrick Valente + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, IRSL + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_LINE_H__ +#define __stir_LINE_H__ + + +#include "stir/common.h" + +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::vector; +#endif + +START_NAMESPACE_STIR + +/*! + \brief A class used by the Interfile parser. + \warning This will be removed soon. Do NOT USE. +*/ +class Line : public string +{ + +public : + Line() : string() + {} + + Line& operator=(const char* ch); + + string get_keyword(); + int get_index(); + int get_param(vector& v); + // KT 29/10/98 new + int get_param(vector& v); + int get_param(vector& v); + int get_param(string& s); + int get_param(int& i); + // KT 01/08/98 new + int get_param(unsigned long& i); + // KT 01/08/98 new + int get_param(double& i); +}; + +END_NAMESPACE_STIR + +#endif + + diff --git a/src/include/stir/linear_regression.h b/src/include/stir/linear_regression.h new file mode 100644 index 0000000000..a8038430a0 --- /dev/null +++ b/src/include/stir/linear_regression.h @@ -0,0 +1,139 @@ +// +// +/*! + + \file + \ingroup buildblock + + \brief Declaration of stir::linear_regression() + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __linear_regression_h__ +#define __linear_regression_h__ + +#include "stir/VectorWithOffset.h" + +START_NAMESPACE_STIR + +/*! + \ingroup buildblock + \brief Implements standard linear regression on VectorWithOffset data + + The linear_regression function does straightforward + (1 dimensional) weighted least squares fitting. + + \par input + + 3 VectorWithOffsets of measured_data, coordinates, weights
        + 1 optional boolean value use_estimated_variance (default=true) + + \par output + + fitted parameters : constant, scale
        + goodness of fit measures : chi_square and the (co)variances + + This solves the minimisation problem: +\verbatim + Find constant, scale such that + chi_square = + sum_i weights[i]* + (constant + scale*coordinates[i] - measured_data[i])^2 + is minimal. +\endverbatim + + When use_estimated_variance == false, the (co)variances are computed + assuming that 1/weights[i] is the standard deviation on measured_data[i]. + In particular, this means that the (co)variances depend only on the + weights and the coordinates. + + Alternatively, when use_estimated_variance == true, the weights are + considered to be really only proportional to the + 1/variance. Then the estimated variance is used to get sensible + estimates of the errors: + \verbatim + estimated_variance = chi_square/(measured_data.get_length() - 2) + estimated_covariance_matrix = original_covariance_matrix * estimated_variance + \endverbatim +*/ + +template +inline void +linear_regression(Value& constant, Value& scale, + Value& chi_square, + Value& variance_of_constant, + Value& variance_of_scale, + Value& covariance_of_constant_with_scale, + const VectorWithOffset& measured_data, + const VectorWithOffset& coordinates, + const VectorWithOffset& weights, + const bool use_estimated_variance = true + ); + +/*! + \ingroup buildblock + \brief Implements standard linear regression + + This function takes the data as iterators for maximum flexibility. + Note that it is assumed (but not checked) that the + \a measured_data, \a coordinates and \a weights iterators + run over the same range. + + \see linear_regression(Value& , Value&, + Value& , + Value& , + Value& , + Value& , + const VectorWithOffset& , + const VectorWithOffset& , + const VectorWithOffset& , + const bool + ) +*/ + +template +inline void +linear_regression(Value& constant, Value& scale, + Value& chi_square, + Value& variance_of_constant, + Value& variance_of_scale, + Value& covariance_of_constant_with_scale, + DataIter measured_data_begin, DataIter measured_data_end, + CoordinatesIter coords_begin, + WeightsIter weights_begin, + const bool use_estimated_variance = true); + +template +inline void +linear_regression(ValueIter regression_values_begin, + DataIter data_begin, DataIter data_end, + CoordinatesIter coords_begin, + WeightsIter weights_begin, + const bool use_estimated_variance = true); + +END_NAMESPACE_STIR + +#include "stir/linear_regression.inl" + +#endif // __linear_regression_h__ + + diff --git a/src/include/stir/linear_regression.inl b/src/include/stir/linear_regression.inl new file mode 100644 index 0000000000..8f8d963b76 --- /dev/null +++ b/src/include/stir/linear_regression.inl @@ -0,0 +1,224 @@ +// +// +/*! + \file + \ingroup buildblock + + \brief Implementation of inline functions for stir::linear_regression() + + \author Kris Thielemans + \author Charalampos Tsoumpas + \author PARAPET project + + +*/ +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include // for size_t +START_NAMESPACE_STIR + +namespace detail +{ + /* + We compute the linear regression using + Numerical Recipes formulas for numerical stability + + Correspondence with their notation: + y_i = measured_data[i] + x_i = coordinates[i] + sigma_i = 1/sqrt(weights[i]) + + t_i = sqrt(weights[i]) (x[i] - Sx/S) + + This last one is computed here in terms of + wti = (x[i] - Sx/S) + + Further notation: + S = sum of the weights + Sx = weights . coordinates + Sy = weights . measured + Sty = weights . (wt*measured) + etc. + (Syy is used to compute chi_square in the current implementation) + + The fit is split up into 2 functions: + - linear_regression_compute_S + - linear_regression_compute_fit_from_S + + The main reason for this is that *compute_S needs to be + templated in 3 different argument types for maximum + flexibility. This in practice means it needs to be + an inline function (to avoid problems at linking time). + In contrast, linear_regression_compute_fit_from_S + is only templated in the Value type, which will be + float or double anyway. + */ + + // defined in .cxx +template +void +linear_regression_compute_fit_from_S(Value& constant, Value& scale, + Value& chi_square, + Value& variance_of_constant, + Value& variance_of_scale, + Value& covariance_of_constant_with_scale, + const double S, + const double Sx, + const double Sy, + const double Syy, + const double Stt, + const double Sty, + const std::size_t data_size, + const bool use_estimated_variance + ); + +template +inline void +linear_regression_compute_S(double& S, + double& Sx, + double& Sy, + double& Syy, + double& Stt, + double& Sty, + const DataIter data_begin, const DataIter data_end, + const CoordinatesIter coords_begin, + const WeightsIter weights_begin) +{ + DataIter data_iter = data_begin; + CoordinatesIter coords_iter = coords_begin; + WeightsIter weights_iter = weights_begin; + + for (; data_iter != data_end; ++data_iter, ++coords_iter, ++weights_iter) + { + const double weight = static_cast(*weights_iter); + S += weight; + Sx += weight * (*coords_iter); + Sy += weight * (*data_iter); + Syy += weight * square(static_cast(*data_iter)); + } + + data_iter = data_begin; + coords_iter = coords_begin; + weights_iter = weights_begin; + + for (; data_iter != data_end; ++data_iter, ++coords_iter, ++weights_iter) + { + const double wti = ( *coords_iter - Sx/S); + Stt += *weights_iter * wti * wti; + Sty += *weights_iter * wti * *data_iter; + } +} + +} // end namespace detail + +template +inline void +linear_regression(Value& constant, Value& scale, + Value& chi_square, + Value& variance_of_constant, + Value& variance_of_scale, + Value& covariance_of_constant_with_scale, + DataIter data_begin, DataIter data_end, + CoordinatesIter coords_begin, + WeightsIter weights_begin, + const bool use_estimated_variance) +{ + double Sy = 0; + double Sx = 0; + double S = 0; + double Syy = 0; + double Stt = 0; + double Sty = 0; + + detail::linear_regression_compute_S(S,Sx,Sy, Syy, Stt, Sty, + data_begin, data_end, + coords_begin, + weights_begin); + + detail::linear_regression_compute_fit_from_S(constant, scale, + chi_square, + variance_of_constant, + variance_of_scale, + covariance_of_constant_with_scale, + S,Sx,Sy, Syy, Stt, Sty, + static_cast(data_end - data_begin), + use_estimated_variance); + +} + +template +inline void +linear_regression(Value& constant, Value& scale, + Value& chi_square, + Value& variance_of_constant, + Value& variance_of_scale, + Value& covariance_of_constant_with_scale, + const VectorWithOffset& measured_data, + const VectorWithOffset& coordinates, + const VectorWithOffset& weights, + const bool use_estimated_variance + ) +{ + assert(measured_data.get_min_index() == coordinates.get_min_index()); + assert(measured_data.get_min_index() == weights.get_min_index()); + assert(measured_data.get_max_index() == coordinates.get_max_index()); + assert(measured_data.get_max_index() == weights.get_max_index()); + + + linear_regression(constant, scale, + chi_square, + variance_of_constant, + variance_of_scale, + covariance_of_constant_with_scale, + measured_data.begin(), measured_data.end(), + coordinates.begin(), + weights.begin(), + use_estimated_variance); +} + +template +inline void +linear_regression(ValueIter value_begin, + DataIter data_begin, DataIter data_end, + CoordinatesIter coords_begin, + WeightsIter weights_begin, + const bool use_estimated_variance) +{ + double Sy = 0; + double Sx = 0; + double S = 0; + double Syy = 0; + double Stt = 0; + double Sty = 0; + + detail::linear_regression_compute_S(S,Sx,Sy, Syy, Stt, Sty, + data_begin, data_end, + coords_begin, + weights_begin); + + ValueIter value_iter=value_begin; + + detail::linear_regression_compute_fit_from_S(*value_iter, *(value_iter+1), + *(value_iter+2),*(value_iter+3), + *(value_iter+4),*(value_iter+5), + S, Sx, Sy, Syy, Stt, Sty, + data_end - data_begin, + use_estimated_variance); + *(value_iter+6)= *(value_iter)*Sx/Sy; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.h b/src/include/stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.h new file mode 100644 index 0000000000..caf533641f --- /dev/null +++ b/src/include/stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.h @@ -0,0 +1,91 @@ +// +// +/*! + \file + \ingroup listmode + \brief Declarations of class stir::CListEventCylindricalScannerWithDiscreteDetectors + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_listmode_CListEventCylindricalScannerWithDiscreteDetectors_H__ +#define __stir_listmode_CListEventCylindricalScannerWithDiscreteDetectors_H__ + +#include "stir/Succeeded.h" +#include "stir/DetectionPositionPair.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" + +START_NAMESPACE_STIR + +//! Class for storing and using a coincidence event from a list mode file for a cylindrical single layer scanner +/*! \ingroup listmode + For scanners with discrete detectors, the list mode events usually store detector indices + in some way. This class provides access mechanisms to those detection positions, and + also provides more efficient implementations of some virtual members of CListEvent. +*/ +class CListEventCylindricalScannerWithDiscreteDetectors : public CListEvent +{ +public: + inline explicit + CListEventCylindricalScannerWithDiscreteDetectors(const shared_ptr& scanner_sptr); + + const Scanner * get_scanner_ptr() const + { return this->scanner_sptr.get(); } + + //! This routine returns the corresponding detector pair + virtual void get_detection_position(DetectionPositionPair<>&) const = 0; + + //! This routine sets in a coincidence event from detector "indices" + virtual void set_detection_position(const DetectionPositionPair<>&) = 0; + + //! find LOR between detector pairs + /*! Overrides the default implementation to use get_detection_position() + which should be faster. + */ + inline virtual LORAs2Points get_LOR() const; + + //! find bin for this event + /*! Overrides the default implementation to use get_detection_position() + which should be faster. + + \warning This implementation is only valid for \c proj_data_info of + type ProjDataInfoCylindricalNoArcCorr. However, because of efficiency reasons + this is only checked in debug mode (NDEBUG not defined). + */ + inline virtual void get_bin(Bin& bin, const ProjDataInfo& proj_data_info) const; + + protected: + shared_ptr + get_uncompressed_proj_data_info_sptr() const + { + return uncompressed_proj_data_info_sptr; + } + + shared_ptr scanner_sptr; + private: + shared_ptr + uncompressed_proj_data_info_sptr; + +}; + +END_NAMESPACE_STIR + +#include "stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.inl" + +#endif diff --git a/src/include/stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.inl b/src/include/stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.inl new file mode 100644 index 0000000000..7baa19f36b --- /dev/null +++ b/src/include/stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.inl @@ -0,0 +1,90 @@ +// +// +/*! + \file + \ingroup listmode + \brief Implementations of class stir::CListEventCylindricalScannerWithDiscreteDetectors + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/LORCoordinates.h" + +START_NAMESPACE_STIR + +CListEventCylindricalScannerWithDiscreteDetectors:: +CListEventCylindricalScannerWithDiscreteDetectors(const shared_ptr& scanner_sptr) + : scanner_sptr(scanner_sptr) +{ + this->uncompressed_proj_data_info_sptr.reset + (dynamic_cast + ( + ProjDataInfo::ProjDataInfoCTI(scanner_sptr, + 1, scanner_sptr->get_num_rings()-1, + scanner_sptr->get_num_detectors_per_ring()/2, + scanner_sptr->get_default_num_arccorrected_bins(), + false))); +} + +LORAs2Points +CListEventCylindricalScannerWithDiscreteDetectors:: +get_LOR() const +{ + LORAs2Points lor; + // provide somewhat shorter names for the 2 coordinates + CartesianCoordinate3D& coord_1 = lor.p1(); + CartesianCoordinate3D& coord_2 = lor.p2(); + + DetectionPositionPair<> det_pos; + this->get_detection_position(det_pos); + assert(det_pos.pos1().radial_coord()==0); + assert(det_pos.pos2().radial_coord()==0); + + // TODO we're using an obsolete function here which uses a different coordinate system + this->get_uncompressed_proj_data_info_sptr()-> + find_cartesian_coordinates_given_scanner_coordinates(coord_1, coord_2, + det_pos.pos1().axial_coord(), + det_pos.pos2().axial_coord(), + det_pos.pos1().tangential_coord(), + det_pos.pos2().tangential_coord()); + // find shift in z + const float shift = this->scanner_sptr->get_ring_spacing()* + (this->scanner_sptr->get_num_rings()-1)/2.F; + coord_1.z() -= shift; + coord_2.z() -= shift; + + return lor; +} + +void +CListEventCylindricalScannerWithDiscreteDetectors:: +get_bin(Bin& bin, const ProjDataInfo& proj_data_info) const +{ + assert(dynamic_cast(&proj_data_info) != 0); + DetectionPositionPair<> det_pos; + this->get_detection_position(det_pos); + if (static_cast(proj_data_info). + get_bin_for_det_pos_pair(bin, det_pos) == Succeeded::no) + bin.set_bin_value(0); + else + bin.set_bin_value(1); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.h b/src/include/stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.h new file mode 100644 index 0000000000..af450ae02c --- /dev/null +++ b/src/include/stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.h @@ -0,0 +1,97 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Definition of class stir::CListEventCylindricalScannerWithViewTangRingRingEncoding + + \author Kris Thielemans + +*/ + +#ifndef __stir_listmode_CListEventCylindricalScannerWithViewTangRingRingEncoding_H__ +#define __stir_listmode_CListEventCylindricalScannerWithViewTangRingRingEncoding_H__ + +#include "stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.h" +#include "stir/DetectionPositionPair.h" + +START_NAMESPACE_STIR + + +//! Helper class for listmode events when using 2d sinograms and ring-pairs is most efficient +/*! \ingroup listmode + + This class simplifies coding of a CListEventCylindricalScannerWithDiscreteDetectors + class in case the coordinates are stored in the raw data as + \c view_num, \c tangential_pos_num, \c ring_a and \c ring_b. + + The default implementations for get_detection_position() etc are somewhat inefficient in such + case. This helper class provides faster implementations. For example usage, + see ecat::ecat7::CListEventECAT966, but it's intended to be used as follows + + \code + class myEventClass : public CListEventCylindricalScannerWithDiscreteDetectors + { + public: + someType get_data(); + // etc + }; + \endcode + This implementation of this class relies on \c someType providing the following functions + \code + class someType + { + void get_sinogram_and_ring_coordinates(int& view, int& tangential_pos_num, unsigned int& ring_a, unsigned int& ring_b) const; + + void set_sinogram_and_ring_coordinates( + const int view_num, const int tangential_pos_num, + const int ring_a, const int ring_b); + // etc + }; + \endcode +*/ +template +class CListEventCylindricalScannerWithViewTangRingRingEncoding : +public CListEventCylindricalScannerWithDiscreteDetectors +{ + public: + CListEventCylindricalScannerWithViewTangRingRingEncoding(const shared_ptr& scanner_sptr) : + CListEventCylindricalScannerWithDiscreteDetectors(scanner_sptr) + {} + + //! This routine returns the corresponding detector pair + inline void get_detection_position(DetectionPositionPair<>&) const; + +/*! This routine constructs a (prompt) coincidence event */ + inline void set_detection_position(const DetectionPositionPair<>&); + + //! warning only ProjDataInfoCylindricalNoArcCorr + inline virtual + void + get_bin(Bin&, const ProjDataInfo&) const; + + inline void get_uncompressed_bin(Bin& bin) const; + +}; + +END_NAMESPACE_STIR + +#include "stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.inl" + +#endif diff --git a/src/include/stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.inl b/src/include/stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.inl new file mode 100644 index 0000000000..be0db7deaa --- /dev/null +++ b/src/include/stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.inl @@ -0,0 +1,128 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Implementation for stir::CListEventCylindricalScannerWithViewTangRingRingEncoding + + \author Kris Thielemans + +*/ + +START_NAMESPACE_STIR + +template +void +CListEventCylindricalScannerWithViewTangRingRingEncoding:: +get_detection_position(DetectionPositionPair<>& det_pos) const +{ + det_pos.pos1().radial_coord()=0; + det_pos.pos2().radial_coord()=0; + int tangential_pos_num; + int view_num; + static_cast(this)-> + get_data().get_sinogram_and_ring_coordinates(view_num, tangential_pos_num, + det_pos.pos1().axial_coord(), + det_pos.pos2().axial_coord()); + + int det_num_1, det_num_2; + this->get_uncompressed_proj_data_info_sptr()-> + get_det_num_pair_for_view_tangential_pos_num(det_num_1, det_num_2, + view_num, tangential_pos_num); + det_pos.pos1().tangential_coord() = det_num_1; + det_pos.pos2().tangential_coord() = det_num_2; +} + +template +void +CListEventCylindricalScannerWithViewTangRingRingEncoding:: +set_detection_position(const DetectionPositionPair<>& det_pos) +{ + int tangential_pos_num; + int view_num; + const bool swap_rings = + this-> + get_uncompressed_proj_data_info_sptr()-> + get_view_tangential_pos_num_for_det_num_pair(view_num, tangential_pos_num, + det_pos.pos1().tangential_coord(), + det_pos.pos2().tangential_coord()); + + if (swap_rings) + { + static_cast(this)->get_data(). + set_sinogram_and_ring_coordinates(view_num, tangential_pos_num, + det_pos.pos1().axial_coord(), + det_pos.pos2().axial_coord()); + } + else + { + static_cast(this)->get_data(). + set_sinogram_and_ring_coordinates(view_num, tangential_pos_num, + det_pos.pos2().axial_coord(), + det_pos.pos1().axial_coord()); + } +} + +static void +sinogram_coordinates_to_bin(Bin& bin, const int view_num, const int tang_pos_num, + const int ring_a, const int ring_b, + const ProjDataInfoCylindrical& proj_data_info) +{ + if (proj_data_info.get_segment_axial_pos_num_for_ring_pair(bin.segment_num(), bin.axial_pos_num(), ring_a, ring_b) == + Succeeded::no) + { + bin.set_bin_value(-1); + return; + } + bin.set_bin_value(1); + bin.view_num() = view_num / proj_data_info.get_view_mashing_factor(); + bin.tangential_pos_num() = tang_pos_num; +} + +template +void +CListEventCylindricalScannerWithViewTangRingRingEncoding:: +get_bin(Bin& bin, const ProjDataInfo& proj_data_info) const +{ + assert (dynamic_cast(&proj_data_info)!=0); + + int tangential_pos_num; + int view_num; + unsigned int ring_a; + unsigned int ring_b; + static_cast(this)->get_data(). + get_sinogram_and_ring_coordinates(view_num, tangential_pos_num, ring_a, ring_b); + sinogram_coordinates_to_bin(bin, view_num, tangential_pos_num, ring_a, ring_b, + static_cast(proj_data_info)); +} + +template +void +CListEventCylindricalScannerWithViewTangRingRingEncoding:: +get_uncompressed_bin(Bin& bin) const +{ + unsigned int ring_a; + unsigned int ring_b; + this->get_sinogram_and_ring_coordinates(bin.view_num(), bin.tangential_pos_num(), ring_a, ring_b); + this->get_uncompressed_proj_data_info_sptr()-> + get_segment_axial_pos_num_for_ring_pair(bin.segment_num(), bin.axial_pos_num(), + ring_a, ring_b); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/listmode/CListModeData.h b/src/include/stir/listmode/CListModeData.h new file mode 100644 index 0000000000..4ec1373ec8 --- /dev/null +++ b/src/include/stir/listmode/CListModeData.h @@ -0,0 +1,237 @@ +/* + Copyright (C) 2003 - 2011-06-24, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2014, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Declaration of class stir::CListModeData + + \author Kris Thielemans +*/ + +#ifndef __stir_listmode_CListModeData_H__ +#define __stir_listmode_CListModeData_H__ + +#include "stir/Scanner.h" +#include "stir/shared_ptr.h" +#include +#include + +# ifdef BOOST_NO_STDC_NAMESPACE +namespace std { using ::time_t; } +#endif + + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR +class CListRecord; +class Succeeded; +class ExamInfo; + +/*! + \brief The base class for reading list mode data. + \ingroup listmode + + \par What is list mode data? + + List mode data is a format for storing detected counts as a list, as + opposed to a histogram. For each count, a list mode event contains + all the properties that the scanner can give you. Hence, the + list mode data gives you all the information about your acquisition + that you can possibly get. Which information this is obviously depends + on the scanner. + + For most (all?) scanners, events are stored in chronological order. + In addition to events, time flags are inserted into the list mode data. + So, generally list mode data is a list of 'records', which can be + of different types. In STIR, this concept of a 'record' corresponds to + the CListRecord class and its relatives (see the documentation for + CListRecord). + + \par Usage + + For most applications, i.e. when one just wants to go through the list of + all events, the code would be as follows: + + \code + shared_ptr + lm_data_sptr(read_from_file(filename)); + + // get a pointer to a 'template' record that will work for the scanner + // from which we're reading data + shared_ptr record_sptr = + lm_data_ptr->get_empty_record_sptr(); + // give the record a simple name to avoid cluttering the code below + CListRecord& record = *record_sptr; + + double current_time = 0; + while (lm_data_sptr->get_next_record(record) == Succeeded::yes) + { + if (record.is_time()) + { + current_time= record.time().get_time_in_secs(); + } + if (record.is_event()) + { + if (record.event().is_prompt()) + { // do something + } + // ... + } + } + \endcode + + In addition, there is a facility to 'remember' positions in the list, + and go back to one of these positions. This could be useful to + mark time frames. This goes as follows. + + \code + // somehow I found out this is the start of the frame, so save it + CListModeData::SavedPosition start_of_this_frame = + lm_data_sptr->save_get_position(); + + // now do something with this frame + + // now get back to the start of the frame + if ( lm_data_sptr->set_get_position(start_of_this_frame) + != Succeeded::yes) + error("Help!"); + \endcode + + \todo Currently, this class (and CListRecord) is specific to PET, i.e. to + coincidence detection (hence the 'C'). However, the only part that + is not general are the functions related to prompts and delayeds. + Potentially, we make classes ListModeData etc which would work for SPECT + (and other count-based modalities?). Alternatively, SPECT can be + handled by calling all single photon events 'prompts'. + + \par Notes for developers + + If you want to add a new type of list mode data, you have to make corresponding + derived classes of CListModeData, CListRecord etc. You also have to modify + make sure that read_from_file recognises your data. This + normally involves creating a new InputFileFormat class. +*/ +class CListModeData +{ +public: + //! Use this typedef for save/set_get_position + typedef unsigned int SavedPosition; + + //! Default constructor + CListModeData(); + + virtual + ~CListModeData(); + + //! Returns the name of the list mode data + /*! This name is not necessarily unique, and might be empty. However, it is expected + (but not guaranteed) that + CListModeData::read_from_file(lm_data_ptr-\>get_name()) would read + the same list mode data. + + The reason this cannot be guaranteed is largely in case the list mode data is + not really on disk, but the object corresponds for instance to a Monte Carlo simulator. + */ + virtual std::string + get_name() const = 0; + + //! Get const pointer to exam info + const ExamInfo* + get_exam_info_ptr() const; + //! Get shared pointer to exam info + /*! \warning Use with care. If you modify the object pointer to by a shared ptr, all objects using the same + shared pointer will be affected. */ + shared_ptr + get_exam_info_sptr() const; + +#if 0 + //! Scan start time + /*! In secs since midnight (UTC) 1/1/1970 (as returned by std::time()). + + Should return std::time_t(-1) if unknown or invalid. + \deprecated + Use ExamInfo instead. + */ + virtual + std::time_t + get_scan_start_time_in_secs_since_1970() const; +#endif + + //! Get a pointer to an empty record + /*! This is mainly/only useful to get a record of the correct type, that can then be + passed to get_next_record(). + */ + virtual + shared_ptr get_empty_record_sptr() const = 0; + + //! Gets the next record in the listmode sequence + virtual + Succeeded get_next_record(CListRecord& event) const = 0; + + //! Call this function if you want to re-start reading at the beginning. + virtual + Succeeded reset() = 0; + + //! Save the current reading position + /*! + Note that the return value is not related to the number of events + already read. In particular, you cannot do any arithmetic on it to + skip a few events. This is different from e.g. std::streampos. + + \warning There is a maximum number of times this function can be called. + This is determined by the SavedPosition type. Once you save more + positions, the first positions will be overwritten. There is currently + no way of finding out after how many times this will happen (but it's + a large number...). + + \warning These saved positions are only valid for the lifetime of the + CListModeData object. + + \warning A derived class might disable this facility. It will/should + then always return Succeeded::no when calling set_get_position(). + */ + virtual + SavedPosition save_get_position() = 0; + + //! Set the position for reading to a previously saved point + + virtual + Succeeded set_get_position(const SavedPosition&) = 0; + + //! Get scanner pointer + /*! Returns a pointer to a scanner object that is appropriate for the + list mode data that is being read. + */ + const Scanner* get_scanner_ptr() const; + + //! Return if the file stores delayed events as well (as opposed to prompts) + virtual bool has_delayeds() const = 0; + +protected: + //! Has to be set by the derived class + shared_ptr scanner_sptr; + //! Has to be set by the derived class + shared_ptr exam_info_sptr; +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/listmode/CListModeDataECAT.h b/src/include/stir/listmode/CListModeDataECAT.h new file mode 100644 index 0000000000..1990aaf5ea --- /dev/null +++ b/src/include/stir/listmode/CListModeDataECAT.h @@ -0,0 +1,110 @@ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Declaration of class stir::CListModeDataECAT + + \author Kris Thielemans +*/ + +#ifndef __stir_listmode_CListModeDataECAT_H__ +#define __stir_listmode_CListModeDataECAT_H__ + +#include "stir/listmode/CListModeData.h" +#include "stir/IO/InputStreamWithRecords.h" +#include "stir/shared_ptr.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/stir_ecat7.h" +#else +#include "stir/IO/stir_ecat_common.h" // for namespace macros +#endif +#include +#include +#include +#include + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +//! A class that reads the listmode data for ECAT scanners +/*! \ingroup listmode + This file format is currently used by the HR+ and HR++. It stores + the coincidence data in multiple .lm files, with a maximum filesize + of about 2 GB (to avoid problems with OS limits on filesize). + In addition, there is a .sgl file with the singles rate per 'bucket'-per-ring + (roughly every 2 seconds). The .sgl also contains a 'main_header' + with some scanner and patient info. + + \todo This class currently relies in the fact that + vector<>::size_type == SavedPosition +*/ +template +class CListModeDataECAT : public CListModeData +{ +public: + //! Constructor taking a prefix for the filename + /*! If the listmode files are called something_1.lm, something_2.lm etc. + Then this constructor should be called with the argument "something" + + \todo Maybe allow for passing e.g. something_2.lm in case the first lm file is missing. + */ + CListModeDataECAT(const std::string& listmode_filename_prefix); + + virtual std::string + get_name() const; + + virtual + shared_ptr get_empty_record_sptr() const; + + virtual + Succeeded get_next_record(CListRecord& record) const; + + virtual + Succeeded reset(); + + virtual + SavedPosition save_get_position(); + + virtual + Succeeded set_get_position(const SavedPosition&); + + //! returns \c true, as ECAT listmode data stores delayed events (and prompts) + /*! \todo this might depend on the acquisition parameters */ + virtual bool has_delayeds() const { return true; } + +private: + std::string listmode_filename_prefix; + mutable unsigned int current_lm_file; + mutable shared_ptr > current_lm_data_ptr; + //! a vector that stores the saved_get_positions for ever .lm file + mutable std::vector > saved_get_positions_for_each_lm_data; + typedef std::pair GetPosition; + std::vector saved_get_positions; + + // const as it modifies only mutable elements + // It has to be const as e.g. get_next_record calls it + Succeeded open_lm_file(unsigned int) const; +}; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/listmode/CListRecord.h b/src/include/stir/listmode/CListRecord.h new file mode 100644 index 0000000000..014bb653e7 --- /dev/null +++ b/src/include/stir/listmode/CListRecord.h @@ -0,0 +1,204 @@ +// +// +/*! + \file + \ingroup listmode + \brief Declarations of classes stir::CListRecord, stir::CListTime and stir::CListEvent which + are used for list mode data. + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_listmode_CListRecord_H__ +#define __stir_listmode_CListRecord_H__ + + +#include "stir/round.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR +class Bin; +class ProjDataInfo; +class Succeeded; +template class CartesianCoordinate3D; +template class LORAs2Points; + +//! Class for storing and using a coincidence event from a list mode file +/*! \ingroup listmode + CListEvent is used to provide an interface to the actual events (i.e. + detected counts) in the list mode stream. + + \todo this is still under development. Things to add are for instance + energy windows and time-of-flight info. Also, get_bin() would need + time info or so for rotating scanners. + + \see CListModeData for more info on list mode data. +*/ +class CListEvent +{ +public: + virtual ~CListEvent() {} + + //! Checks if this is a prompt event or a delayed event + /*! PET scanners generally have a facility to detect events in a + 'delayed' coincidence window. This is used to estimate the + number of accidental coincidences (or 'randoms'). + */ + virtual + bool + is_prompt() const = 0; + + //! Changes the event from prompt to delayed or vice versa + /*! Default implementation just returns Succeeded::no. */ + virtual + Succeeded + set_prompt(const bool prompt = true); + + //! Finds the LOR between the coordinates where the detection took place + /*! Obviously, these coordinates are only estimates which depend on the + scanner hardware. For example, Depth-of-Interaction might not be + taken into account. However, the intention is that this function returns + 'likely' positions (e.g. not the face of a crystal, but a point somewhere + in the middle). + + Coordinates are in mm and in the standard STIR coordinate system + used by ProjDataInfo etc (i.e. origin is in the centre of the scanner). + + \todo This function might need time info or so for rotating scanners. + */ + virtual LORAs2Points + get_LOR() const = 0; + + //! Finds the bin coordinates of this event for some characteristics of the projection data + /*! bin.get_bin_value() will be <=0 when the event corresponds to + an LOR outside the range of the projection data. + + bin.get_bin_value() will be set to a negative value if no such bin + can be found. + + Currently, bin.get_bin_value() might indicate some weight + which can be used for normalisation. This is unlikely + to remain the case in future versions. + + The default implementation uses get_LOR() + and ProjDataInfo::get_bin(). However, a derived class + can overload this with a more efficient implementation. + + \todo get_bin() might need time info or so for rotating scanners. + */ + virtual + void + get_bin(Bin& bin, const ProjDataInfo&) const; + +}; /*-coincidence event*/ + + +//! A class for storing and using a timing record from a listmode file +/*! \ingroup listmode + CListTime is used to provide an interface to the 'timing' events + in the list mode stream. Usually, the timing event also contains + gating information. For rotating scanners, it could also contain + angle info. + + \todo this is still under development. Things to add are angles + or so for rotating scanners. Also, some info on the maximum + (and actual?) number of gates would be useful. + \see CListModeData for more info on list mode data. +*/ +class CListTime +{ +public: + virtual ~CListTime() {} + + virtual unsigned long get_time_in_millisecs() const = 0; + inline double get_time_in_secs() const + { return get_time_in_millisecs()/1000.; } + + virtual Succeeded set_time_in_millisecs(const unsigned long time_in_millisecs) = 0; + inline Succeeded set_time_in_secs(const double time_in_secs) + { + unsigned long time_in_millisecs; + round_to(time_in_millisecs, time_in_secs/1000.); + return set_time_in_millisecs(time_in_millisecs); + } + +}; + +//! A class recording external input to the scanner (normally used for gating) +/*! For some scanners, the state of some external measurements can be recorded in the + list file, such as ECG triggers etc. We currently assume that these take discrete values. + + If your scanner has more data available, you can provide it in the derived class. +*/ +class CListGatingInput +{ +public: + virtual ~CListGatingInput() {} + + //! get gating-related info + /*! Generally, gates are numbered from 0 to some maximum value. + */ + virtual unsigned int get_gating() const = 0; + + virtual Succeeded set_gating(unsigned int) = 0; +}; + +//! A class for a general element of a list mode file +/*! \ingroup listmode + This represents either a timing or coincidence event in a list mode + data stream. + + Some scanners can have more types of records. For example, + the Quad-HiDAC puts singles information in the + list mode file. If you need that information, + you will have to do casting to e.g. CListRecordQHiDAC. + + \see CListModeData for more info on list mode data. +*/ +class CListRecord +{ +public: + virtual ~CListRecord() {} + + virtual bool is_time() const = 0; + + virtual bool is_event() const = 0; + + virtual CListEvent& event() = 0; + virtual const CListEvent& event() const = 0; + virtual CListTime& time() = 0; + virtual const CListTime& time() const = 0; + + virtual bool operator==(const CListRecord& e2) const = 0; + bool operator!=(const CListRecord& e2) const { return !(*this == e2); } + +}; + +class CListRecordWithGatingInput : public CListRecord +{ + public: + virtual bool is_gating_input() const { return false; } + virtual CListGatingInput& gating_input() = 0; + virtual const CListGatingInput& gating_input() const = 0; +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/listmode/CListRecordECAT962.h b/src/include/stir/listmode/CListRecordECAT962.h new file mode 100644 index 0000000000..1a47721b4b --- /dev/null +++ b/src/include/stir/listmode/CListRecordECAT962.h @@ -0,0 +1,275 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Classes for listmode events for the ECAT 962 (aka Exact HR+) + + \author Kris Thielemans + +*/ + +#ifndef __stir_listmode_CListRecordECAT962_H__ +#define __stir_listmode_CListRecordECAT962_H__ + +#include "stir/listmode/CListRecord.h" +#include "stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/IO/stir_ecat_common.h" // for namespace macros +#include "stir/Succeeded.h" +#include "stir/ByteOrder.h" +#include "stir/ByteOrderDefine.h" +#include "stir/round.h" +#include "boost/static_assert.hpp" +#include "boost/cstdint.hpp" + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + + +//! Class for storing and using a coincidence event from a listmode file +/*! \ingroup listmode + The private definition is specific to the 962. Public members are generic + though. + + For the 962 the event word is 32 bit. To save 1 bit in size, a 2d sinogram + encoding is used (as opposed to a detector number on the ring + for both events). + Both bin and view use 9 bits, so their maximum range is + 512 values, which is fine for the 962 (which needs only 288). + + The 962 has 2 other bits, one for the energy window, and a 'multiple' bit. + + \todo use DetectionPosition etc. +*/ +class CListEventDataECAT962 +{ + public: + inline bool is_prompt() const { return random == 0; } + inline Succeeded set_prompt(const bool prompt = true) + { if (prompt) random=0; else random=1; return Succeeded::yes; } + +/*! This routine returns the corresponding tangential_pos_num,view_num,ring_a and ring_b + */ + void get_sinogram_and_ring_coordinates(int& view, int& tangential_pos_num, unsigned int& ring_a, unsigned int& ring_b) const; + +/*! This routine constructs a coincidence event */ + void set_sinogram_and_ring_coordinates( + const int view_num, const int tangential_pos_num, + const unsigned int ring_a, const unsigned int ring_b); + + + private: + /* ring encoding. use as follows: + This organisation corresponds to physical detector blocks (which + have 8 crystal rings). Names are not very good probably... + */ + /* 'random' bit: + 1 if event is Random (it fell in delayed time window) */ + /* bin field is shifted in a funny way, use the following code to find + bin_number: + if ( bin > NumProjBinsBy2 ) bin -= NumProjBins ; + */ + +#if STIRIsNativeByteOrderBigEndian + unsigned type : 1; /* 0-coincidence event, 1-time tick */ + unsigned block_A_ring_bit1 : 1; + unsigned block_B_ring_bit1 : 1; + unsigned block_A_ring_bit0 : 1; + unsigned block_B_ring_bit0 : 1; + unsigned block_B_detector : 3; + unsigned block_A_detector : 3; + unsigned scatter : 1; + unsigned random : 1; + unsigned multiple : 1; + unsigned bin : 9; + unsigned view : 9; +#else + // Do byteswapping first before using this bit field. + unsigned view : 9; + unsigned bin : 9; + unsigned multiple : 1; + unsigned random : 1; + unsigned scatter : 1; + unsigned block_A_detector : 3; + unsigned block_B_detector : 3; + unsigned block_B_ring_bit0 : 1; + unsigned block_A_ring_bit0 : 1; + unsigned block_B_ring_bit1 : 1; + unsigned block_A_ring_bit1 : 1; + unsigned type : 1; /* 0-coincidence event, 1-time tick */ + +#endif +}; /*-coincidence event*/ + +#if 0 +//! Class for storing and using a coincidence event from a listmode file from the ECAT 962 scanner +class CListEventECAT962 : public CListEventCylindricalScannerWithViewTangRingRingEncoding +{ + public: + CListEventECAT962() : + CListEventCylindricalScannerWithViewTangRingRingEncoding(new Scanner(Scanner::E962)) + {} + + Succeeded init_from_data_ptr(const void * const ptr) + { + const char * const data_ptr = reinterpret_cast(ptr); + std::copy(data_ptr, data_ptr+sizeof(this->raw), reinterpret_cast(&this->raw)); + return Succeeded::yes; + } + inline bool is_prompt() const { return this->data.random == 0; } + inline Succeeded set_prompt(const bool prompt = true) + { if (prompt) this->data.random=0; else this->data.random=1; return Succeeded::yes; } + + private: + BOOST_STATIC_ASSERT(sizeof(CListEventDataECAT962)==4); + union + { + CListEventDataECAT962 data; + boost::int32_t raw; + }; +}; +#endif + +//! A class for storing and using a timing 'event' from a listmode file +/*! \ingroup listmode + */ +class CListTimeDataECAT962 +{ + public: + inline unsigned long get_time_in_millisecs() const + { return static_cast(time); } + inline Succeeded set_time_in_millisecs(const unsigned long time_in_millisecs) + { + time = ((1U<<28)-1) & static_cast(time_in_millisecs); + // TODO return more useful value + return Succeeded::yes; + } + inline unsigned int get_gating() const + { return gating; } + inline Succeeded set_gating(unsigned int g) + { gating = g & 0xf; return gating==g ? Succeeded::yes : Succeeded::no;}// TODONK check +private: + friend class CListRecordECAT962; // to give access to type field +#if STIRIsNativeByteOrderBigEndian + unsigned type : 1; /* 0-coincidence event, 1-time tick */ + unsigned gating : 4; /* some info about the gating signals */ + unsigned time : 27 ; /* since scan start */ +#else + // Do byteswapping first before using this bit field. + unsigned time : 27 ; /* since scan start */ + unsigned gating : 4; /* some info about the gating signals */ + unsigned type : 1; /* 0-coincidence event, 1-time tick */ +#endif +}; + +//! A class for a general element of a listmode file +/*! \ingroup listmode + For the 962 it's either a coincidence event, or a timing flag.*/ +class CListRecordECAT962 : public CListRecordWithGatingInput, public CListTime, public CListGatingInput, + public CListEventCylindricalScannerWithViewTangRingRingEncoding +{ + public: + typedef CListEventDataECAT962 DataType; + DataType get_data() const { return this->event_data; } + + public: + CListRecordECAT962() : + CListEventCylindricalScannerWithViewTangRingRingEncoding(shared_ptr(new Scanner(Scanner::E962))) + {} + + bool is_time() const + { return time_data.type == 1U; } + bool is_gating_input() const + { return this->is_time(); } + bool is_event() const + { return time_data.type == 0U; } + virtual CListEvent& event() + { return *this; } + virtual const CListEvent& event() const + { return *this; } + virtual CListTime& time() + { return *this; } + virtual const CListTime& time() const + { return *this; } + virtual CListGatingInput& gating_input() + { return *this; } + virtual const CListGatingInput& gating_input() const + { return *this; } + + bool operator==(const CListRecord& e2) const + { + return dynamic_cast(&e2) != 0 && + raw == static_cast(e2).raw; + } + + // time + inline unsigned long get_time_in_millisecs() const + { return time_data.get_time_in_millisecs(); } + inline Succeeded set_time_in_millisecs(const unsigned long time_in_millisecs) + { return time_data.set_time_in_millisecs(time_in_millisecs); } + inline unsigned int get_gating() const + { return time_data.get_gating(); } + inline Succeeded set_gating(unsigned int g) + { return time_data.set_gating(g); } + + // event + inline bool is_prompt() const { return event_data.is_prompt(); } + inline Succeeded set_prompt(const bool prompt = true) + { return event_data.set_prompt(prompt); } + + + virtual Succeeded init_from_data_ptr(const char * const data_ptr, + const std::size_t +#ifndef NDEBUG + size // only used within assert, so don't define otherwise to avoid compiler warning +#endif + , const bool do_byte_swap) + { + assert(size >= 4); + std::copy(data_ptr, data_ptr+4, reinterpret_cast(&raw));// TODO necessary for operator== + if (do_byte_swap) + ByteOrder::swap_order(raw); + return Succeeded::yes; + } + virtual std::size_t size_of_record_at_ptr(const char * const /*data_ptr*/, const std::size_t /*size*/, + const bool /*do_byte_swap*/) const + { return 4; } + +private: + union { + CListEventDataECAT962 event_data; + CListTimeDataECAT962 time_data; + boost::int32_t raw; + }; + BOOST_STATIC_ASSERT(sizeof(boost::int32_t)==4); + BOOST_STATIC_ASSERT(sizeof(CListEventDataECAT962)==4); + BOOST_STATIC_ASSERT(sizeof(CListTimeDataECAT962)==4); + +}; + + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/listmode/CListRecordECAT966.h b/src/include/stir/listmode/CListRecordECAT966.h new file mode 100644 index 0000000000..14bee47971 --- /dev/null +++ b/src/include/stir/listmode/CListRecordECAT966.h @@ -0,0 +1,270 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Classes for listmode events for the ECAT 966 (aka Exact 3d) + + \author Kris Thielemans + +*/ + +#ifndef __stir_listmode_CListRecordECAT966_H__ +#define __stir_listmode_CListRecordECAT966_H__ + +#include "stir/listmode/CListRecord.h" +#include "stir/listmode/CListEventCylindricalScannerWithViewTangRingRingEncoding.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/IO/stir_ecat_common.h" // for namespace macros +#include "stir/Succeeded.h" +#include "stir/ByteOrder.h" +#include "stir/ByteOrderDefine.h" +#include "stir/round.h" +#include "boost/static_assert.hpp" +#include "boost/cstdint.hpp" +#include "stir/DetectionPositionPair.h" + +START_NAMESPACE_STIR + +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +//! Class for decoding storing and using a raw coincidence event from a listmode file from the ECAT 966 scanner +/*! \ingroup listmode + + This class just provides the bit-field definitions. You should normally use CListEventECAT966. + + For the 966 the event word is 32 bit. To save 1 bit in size, a 2d sinogram + encoding is used (as opposed to a detector number on the ring + for both events). + Both bin and view use 9 bits, so their maximum range is + 512 values, which is fine for the 966 (which needs only 288). + +*/ +class CListEventDataECAT966 +{ + public: + + /*! This routine returns the corresponding tangential_pos_num,view_num,ring_a and ring_b + */ + void get_sinogram_and_ring_coordinates(int& view, int& tangential_pos_num, unsigned int& ring_a, unsigned int& ring_b) const; + + /*! This routine constructs a coincidence event */ + void set_sinogram_and_ring_coordinates( + const int view_num, const int tangential_pos_num, + const int ring_a, const int ring_b); + + /* ring encoding. use as follows: + #define CRYSTALRINGSPERDETECTOR 8 + ringA = ( block_A_ring * CRYSTALRINGSPERDETECTOR ) + block_A_detector ; + in practice, for the 966 block_A_ring ranges from 0 to 5. + + This organisation corresponds to physical detector blocks (which + have 8 crystal rings). Names are not very good probably... + */ + /* 'random' bit: + 1 if event is Random (it fell in delayed time window) */ + /* bin field is shifted in a funny way, use the following code to find + bin_number: + if ( bin > NumProjBinsBy2 ) bin -= NumProjBins ; + */ + +#if STIRIsNativeByteOrderBigEndian + unsigned type : 1; /* 0-coincidence event, 1-time tick */ + unsigned block_B_ring : 3; + unsigned block_A_ring : 3; + unsigned block_B_detector : 3; + unsigned block_A_detector : 3; + unsigned random : 1; + unsigned bin : 9; + unsigned view : 9; +#else + // Do byteswapping first before using this bit field. + unsigned view : 9; + unsigned bin : 9; + unsigned random : 1; + unsigned block_A_detector : 3; + unsigned block_B_detector : 3; + unsigned block_A_ring : 3; + unsigned block_B_ring : 3; + unsigned type : 1; /* 0-coincidence event, 1-time tick */ + +#endif +}; /*-coincidence event*/ + +//! Class for storing and using a coincidence event from a listmode file from the ECAT 966 scanner +class CListEventECAT966 : public CListEventCylindricalScannerWithViewTangRingRingEncoding +{ + private: + public: + typedef CListEventDataECAT966 DataType; + DataType get_data() const { return this->data; } + + public: + CListEventECAT966() : + CListEventCylindricalScannerWithViewTangRingRingEncoding(shared_ptr(new Scanner(Scanner::E966))) + {} + + Succeeded init_from_data_ptr(const void * const ptr) + { + const char * const data_ptr = reinterpret_cast(ptr); + std::copy(data_ptr, data_ptr+sizeof(this->raw), reinterpret_cast(&this->raw)); + return Succeeded::yes; + } + inline bool is_prompt() const { return this->data.random == 0; } + inline Succeeded set_prompt(const bool prompt = true) + { if (prompt) this->data.random=0; else this->data.random=1; return Succeeded::yes; } + + private: + BOOST_STATIC_ASSERT(sizeof(CListEventDataECAT966)==4); + union + { + CListEventDataECAT966 data; + boost::int32_t raw; + }; +}; + +//! A class for decoding a raw timing 'event' from a listmode file from the ECAT 966 scanner +/*! \ingroup listmode + This class just provides the bit-field definitions. You should normally use CListTimeECAT966. + + */ +class CListTimeDataECAT966 +{ + public: + +#if STIRIsNativeByteOrderBigEndian + unsigned type : 1; /* 0-coincidence event, 1-time tick */ + unsigned gating : 4; /* some info about the gating signals */ + unsigned time : 27 ; /* since scan start */ +#else + // Do byteswapping first before using this bit field. + unsigned time : 27 ; /* since scan start */ + unsigned gating : 4; /* some info about the gating signals */ + unsigned type : 1; /* 0-coincidence event, 1-time tick */ +#endif +}; + + +//! A class for storing and using a timing 'event' from a listmode file from the ECAT 966 scanner +/*! \ingroup listmode + */ +class CListTimeECAT966 : public CListTime, public CListGatingInput +{ + public: + Succeeded init_from_data_ptr(const void * const ptr) + { + const char * const data_ptr = reinterpret_cast(ptr); + std::copy(data_ptr, data_ptr+sizeof(this->raw), reinterpret_cast(&this->raw)); + return Succeeded::yes; + } + bool is_time() const + { return this->data.type == 1U; } + inline unsigned long get_time_in_millisecs() const + { return static_cast(this->data.time); } + inline Succeeded set_time_in_millisecs(const unsigned long time_in_millisecs) + { + this->data.time = ((1U<<28)-1) & static_cast(time_in_millisecs); + // TODO return more useful value + return Succeeded::yes; + } + inline unsigned int get_gating() const + { return this->data.gating; } + inline Succeeded set_gating(unsigned int g) + { this->data.gating = g & 0xf; return this->data.gating==g ? Succeeded::yes : Succeeded::no;} + + private: + BOOST_STATIC_ASSERT(sizeof(CListTimeDataECAT966)==4); + union + { + CListTimeDataECAT966 data; + boost::int32_t raw; + }; +}; + +//! A class for a general element of a listmode file +/*! \ingroup listmode + For the 966 it's either a coincidence event, or a timing flag.*/ +class CListRecordECAT966 : public CListRecordWithGatingInput +{ + + //public: + + bool is_time() const + { return this->time_data.is_time(); } + bool is_gating_input() const + { return this->is_time(); } + bool is_event() const + { return !this->is_time(); } + virtual CListEventECAT966& event() + { return this->event_data; } + virtual const CListEventECAT966& event() const + { return this->event_data; } + virtual CListTimeECAT966& time() + { return this->time_data; } + virtual const CListTimeECAT966& time() const + { return this->time_data; } + virtual CListTimeECAT966& gating_input() + { return this->time_data; } + virtual const CListTimeECAT966& gating_input() const + { return this->time_data; } + + bool operator==(const CListRecord& e2) const + { + return dynamic_cast(&e2) != 0 && + raw == dynamic_cast(e2).raw; + } + + public: + virtual Succeeded init_from_data_ptr(const char * const data_ptr, + const std::size_t +#ifndef NDEBUG + size // only use within assert +#endif + , const bool do_byte_swap) + { + assert(size >= 4); + std::copy(data_ptr, data_ptr+4, reinterpret_cast(&raw));// TODO necessary for operator== + if (do_byte_swap) + ByteOrder::swap_order(raw); + this->time_data.init_from_data_ptr(&raw); + // should in principle check return value, but it's always Succeeded::yes anyway + if (!this->is_time()) + return this->event_data.init_from_data_ptr(&raw); + else + return Succeeded::yes; + } + + virtual std::size_t size_of_record_at_ptr(const char * const /*data_ptr*/, const std::size_t /*size*/, + const bool /*do_byte_swap*/) const + { return 4; } + + private: + CListEventECAT966 event_data; + CListTimeECAT966 time_data; + boost::int32_t raw; + +}; + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/listmode/LmToProjData.h b/src/include/stir/listmode/LmToProjData.h new file mode 100644 index 0000000000..d38b574608 --- /dev/null +++ b/src/include/stir/listmode/LmToProjData.h @@ -0,0 +1,272 @@ +#ifndef __stir_listmode_LmToProjData_H__ +#define __stir_listmode_LmToProjData_H__ +// +// +/*! + \file + \ingroup listmode + + \brief Declaration of the stir::LmToProjData class which is used to bin listmode data to (3d) sinograms + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/ProjDataInfo.h" +#include "stir/listmode/CListModeData.h" +#include "stir/ParsingObject.h" +#include "stir/TimeFrameDefinitions.h" + +#include "stir/recon_buildblock/BinNormalisation.h" + +START_NAMESPACE_STIR + +class CListEvent; +class CListTime; + +/*! + \ingroup listmode + + \brief This class is used to bin listmode data to projection data, + i.e. (3d) sinograms. + + It provides the basic machinery to go through a list mode data file, + and write projection data for each time frame. + + The class can parse its parameters from an input file. This has the + following format: + + \verbatim + lm_to_projdata Parameters:= + + input file := some_lm_file + output filename prefix := my_favorite_name_for_the_projdata + + ; parameters that determine the sizes etc of the output + + template_projdata := some_projdata_file + ; the next can be used to use a smaller number of segments than given + ; in the template + maximum absolute segment number to process := + + ; parameters for saying which events will be stored + + ; time frames (see TimeFrameDefinitions doc for format) + frame_definition file := frames.fdef + ; or a total number of events (if larger than 0, frame definitions will be ignored) + ; note that this normally counts the total of prompts-delayeds (see below) + num_events_to_store := -1 + + ; parameters relating to prompts and delayeds + + ; with the default values, prompts will be added and delayed subtracted + ; to give the usual estimate of the trues. + + ; store the prompts (value should be 1 or 0) + store prompts := 1 ;default + ; what to do if it's a delayed event + store delayeds := 1 ;default + + + ; parameters related to normalisation + ; default settings mean no normalisation + ; Use with care! + + ; in pre normalisation, each event will contribute its + ; 'normalisation factor' to the bin + ; in post normalisation, an average factor for the bin will be used + do pre normalisation := 0 ; default is 0 + ; type of pre-normalisation (see BinNormalisation doc) + Bin Normalisation type for pre-normalisation := None ; default + ; type of post-normalisation (see BinNormalisation doc) + Bin Normalisation type for post-normalisation := None ; default + + ; miscellaneous parameters + + ; list each event on stdout and do not store any files (use only for testing!) + ; has to be 0 or 1 + List event coordinates := 0 + + ; if you're short of RAM (i.e. a single projdata does not fit into memory), + ; you can use this to process the list mode data in multiple passes. + num_segments_in_memory := -1 + + End := + \endverbatim + + Hopefully the only thing that needs explaining are the parameters related + to prompts and delayeds. These are used to allow different ways of + processing the data. There are really only 3 useful cases: + +
          +
        • 'online' subtraction of delayeds
          + This is the default, and adds prompts but subtracts delayeds. + \code + store prompts := 1 + store delayeds := 1 + \endcode +
        • +
        • store prompts only
          + Use + \code + store prompts := 1 + store delayeds := 0 + \endcode + +
        • +
        • store delayeds only
          + Use + \code + store prompts := 0 + store delayeds := 1 + \endcode + Note that now the delayted events will be added, + not subtracted. +
        • +
        + + \par Notes for developers + + The class provides several + virtual functions. If a derived class overloads these, the default behaviour + might change. For example, get_bin_from_event() might do motion correction. + + \todo Currently, there is no support for gating or energy windows. This + could in principle be added by a derived class, but it would be better + to do it here. + \todo Timing info or so for get_bin_from_event() for rotating scanners etc. + \todo There is overlap between the normalisation and the current treatment + of bin.get_bin_value(). This is really because we should be using + something like a EventNormalisation class for pre-normalisation. + + \see CListModeData for more info on list mode data. + +*/ + +class LmToProjData : public ParsingObject +{ +public: + + //! Constructor taking a filename for a parameter file + /*! Will attempt to open and parse the file. */ + LmToProjData(const char * const par_filename); + + //! Default constructor + /*! \warning leaves parameters ill-defined. Set them by parsing. */ + LmToProjData(); + + //! This function does the actual work + virtual void process_data(); + +protected: + + + //! will be called when a new time frame starts + /*! The frame numbers start from 1. */ + virtual void start_new_time_frame(const unsigned int new_frame_num); + + //! will be called after a new timing event is found in the file + virtual void process_new_time_event(const CListTime&); + + //! will be called to get the bin for a coincidence event + /*! If bin.get_bin_value()<=0, the event will be ignored. Otherwise, + the value will be used as a bin-normalisation factor + (on top of anything done by normalisation_ptr). + \todo Would need timing info or so for e.g. time dependent + normalisation or angle info for a rotating scanner.*/ + virtual void get_bin_from_event(Bin& bin, const CListEvent&) const; + + //! A function that should return the number of uncompressed bins in the current bin + /*! \todo it is not compatiable with e.g. HiDAC doesn't belong here anyway + (more ProjDataInfo?) + */ + int get_compression_count(const Bin& bin) const; + + //! Computes a post-normalisation factor (if any) for this bin + /*! This uses get_compression_count() when do_pre_normalisation=true, or + post_normalisation_ptr otherwise. + */ + void do_post_normalisation(Bin& bin) const; + + //! \name parsing functions + //@{ + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + //@} + + //! \name parsing variables + //{@ + string input_filename; + string output_filename_prefix; + string template_proj_data_name; + //! frame definitions + /*! Will be read using TimeFrameDefinitions */ + string frame_definition_filename; + bool do_pre_normalisation; + bool store_prompts; + bool store_delayeds; + int num_segments_in_memory; + // TODO make long (or even unsigned long) but can't do this yet because we can't parse longs yet + int num_events_to_store; + int max_segment_num_to_process; + + //! Toggle readable output on stdout or actual projdata + /*! corresponds to key "list event coordinates" */ + bool interactive; + + shared_ptr template_proj_data_info_ptr; + //! This will be used for pre-normalisation + shared_ptr normalisation_ptr; + //! This will be used for post-normalisation + shared_ptr post_normalisation_ptr; + + //@} + + //! Pointer to the actual data + shared_ptr lm_data_ptr; + + //! Time frames + TimeFrameDefinitions frame_defs; + + //! stores the time (in secs) recorded in the previous timing event + double current_time; + //! stores the current frame number + /*! The frame numbers start from 1. */ + unsigned int current_frame_num; + + //! Internal variable that will be used for pre-normalisation + /*! Will be removed when we have EventNormalisation (or similar) hierarchy */ + shared_ptr proj_data_info_cyl_uncompressed_ptr; + + + /*! \brief variable that will be set according to if we are using + time frames or num_events_to_store + */ + bool do_time_frame; + //! A variable that will be set to 1,0 or -1, according to store_prompts and store_delayeds + int delayed_increment; + +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/listmode/LmToProjDataBootstrap.h b/src/include/stir/listmode/LmToProjDataBootstrap.h new file mode 100644 index 0000000000..857b2447a7 --- /dev/null +++ b/src/include/stir/listmode/LmToProjDataBootstrap.h @@ -0,0 +1,121 @@ +// +// +/*! + + \file + \ingroup listmode + \brief Class for binning list mode files with the bootstrap method + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_listmode_LmToProjDataBootstrap_H__ +#define __stir_listmode_LmToProjDataBootstrap_H__ + + +#include "stir/listmode/LmToProjData.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#endif + +START_NAMESPACE_STIR + +/*! \ingroup listmode + \brief Class for binning list mode data into projection data using the + bootstrap procedure. + + The bootstrap method allows estimating the variance of an estimator + based on a single data-set (magic!). This class can be used to + generate multiple equivalent projdata, which can then be reconstructed. + The sample variance computed on these images will be an estimate of + the variance on the reconstructions. + + For list mode data, bootstrapping works by selecting random events + from the list mode file with replication (i.e. some events will occur + more than once, other events will not occur at all). + + There are various papers on the bootstrap method. For PET data, it was + for example applied by I. Buvat. (TODO add references) + + The pseudo-random number generator used is boost::mt19937 which should be + good enough for most purposes. However, it can be easily replaced by any + generator that follows the boost conventions. + + \par Parsing + This class implements just one keyword in addition to those made + available by its base type. + \verbatim + ; an unsigned int (but not 0) to seed the pseudo-random number generator + seed := 42 ; default value + \endverbatim + \par Notes for developers + + This class is templated in terms of a LmToProjDataT to allow + it to be used with different derived classes of LmToProjData. After all, the + bootstrapping mechanism does not depend on how LmToProjData actually works. + +*/ +template< typename LmToProjDataT> +class LmToProjDataBootstrap : public LmToProjDataT +{ + +public: + + //! Constructor that parses from a file + LmToProjDataBootstrap(const char * const par_filename); + //! Constructor that parses from a file but with explicit seed + /*! The \a seed argument will override any value found in the par file */ + LmToProjDataBootstrap(const char * const par_filename, const unsigned int seed); + +protected: + //! will be called when a new time frame starts + /*! Initialises a vector with the number of times each event has to be replicated */ + virtual void start_new_time_frame(const unsigned int new_frame_num); + + virtual void get_bin_from_event(Bin& bin, const CListEvent&) const; + + + // \name parsing variables + //@{ + //! used to seed the pseudo-random number generator + /*! should be non-zero */ + unsigned int seed; + //@} + +private: + typedef LmToProjDataT base_type; + typedef vector replication_type; + + + replication_type num_times_to_replicate; + mutable replication_type::const_iterator num_times_to_replicate_iter; + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + +}; + +END_NAMESPACE_STIR + + +#endif diff --git a/src/include/stir/make_array.h b/src/include/stir/make_array.h new file mode 100644 index 0000000000..a6b5a60063 --- /dev/null +++ b/src/include/stir/make_array.h @@ -0,0 +1,211 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_make_array_H__ +#define __stir_make_array_H__ +/*! + \file + \ingroup Array + + \brief Declaration of functions for constructing arrays stir::make_1d_array etc + + \author Kris Thielemans + +*/ +#include "stir/Array.h" + +START_NAMESPACE_STIR + + +template +inline +VectorWithOffset +make_vector(const T& a0); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7); + + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8); + +template +inline +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8, const T& a9); + + +template +inline +Array<1,T> +make_1d_array(const T& a0); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7); + + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8); + +template +inline +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8, const T& a9); + + + +template +inline +Array +make_array(const Array& a0); + +template +inline +Array +make_array(const Array& a0, const Array& a1); + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2); + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3); + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4); + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5); + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6); + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6, const Array& a7); + + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6, const Array& a7, const Array& a8); + +template +inline +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6, const Array& a7, const Array& a8, const Array& a9); + + +END_NAMESPACE_STIR + +#include "stir/make_array.inl" + +#endif diff --git a/src/include/stir/make_array.inl b/src/include/stir/make_array.inl new file mode 100644 index 0000000000..35acae0213 --- /dev/null +++ b/src/include/stir/make_array.inl @@ -0,0 +1,338 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup Array + + \brief Implementation of functions for constructing arrays stir::make_1d_array etc + + \author Kris Thielemans + +*/ + +START_NAMESPACE_STIR + +template +VectorWithOffset +make_vector(const T& a0) +{ + VectorWithOffset a(1); + a[0]=a0; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1) +{ + VectorWithOffset a(2); + a[0]=a0; a[1]=a1; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2) +{ + VectorWithOffset a(3); + a[0]=a0; a[1]=a1; a[2]=a2; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3) +{ + VectorWithOffset a(4); + a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4) +{ + VectorWithOffset a(5); + a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5) +{ + VectorWithOffset a(6); + a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; a[5]=a5; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6) +{ + VectorWithOffset a(7); + a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; a[5]=a5; a[6]=a6; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7) +{ + VectorWithOffset a(8); + a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; a[5]=a5; a[6]=a6; a[7]=a7; + return a; +} + + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8) +{ + VectorWithOffset a(9); + a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; + a[5]=a5; a[6]=a6; a[7]=a7; a[8]=a8; + return a; +} + +template +VectorWithOffset +make_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8, const T& a9) +{ + VectorWithOffset a(10); + a[0]=a0; a[1]=a1; a[2]=a2; a[3]=a3; a[4]=a4; + a[5]=a5; a[6]=a6; a[7]=a7; a[8]=a8; a[9]=a9; + return a; +} + + +template +Array<1,T> +make_1d_array(const T& a0) +{ + const Array<1,T> a = NumericVectorWithOffset(make_vector(a0)); + return a; +} + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1) +{ + const Array<1,T> a = NumericVectorWithOffset(make_vector(a0, a1)); + return a; +} + + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2) +{ + const Array<1,T> a = NumericVectorWithOffset(make_vector(a0, a1, a2)); + return a; +} + + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3) +{ + const Array<1,T> a = NumericVectorWithOffset(make_vector(a0, a1, a2, a3)); + return a; +} + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4) +{ + const Array<1,T> a = + NumericVectorWithOffset(make_vector(a0, a1, a2, a3, a4)); + return a; +} + + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5) +{ + const Array<1,T> a = + NumericVectorWithOffset (make_vector(a0, a1, a2, a3, a4, a5)); + return a; +} + + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6) +{ + const Array<1,T> a = + NumericVectorWithOffset(make_vector(a0, a1, a2, a3, a4, + a5, a6)); + return a; +} + + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7) +{ + const Array<1,T> a = + NumericVectorWithOffset(make_vector(a0, a1, a2, a3, a4, + a5, a6, a7)); + return a; +} + + + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8) +{ + const Array<1,T> a = + NumericVectorWithOffset(make_vector(a0, a1, a2, a3, a4, + a5, a6, a7, a8)); + return a; +} + + +template +Array<1,T> +make_1d_array(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, + const T& a5, const T& a6, const T& a7, const T& a8, const T& a9) +{ + const Array<1,T> a = + NumericVectorWithOffset(make_vector(a0, a1, a2, a3, a4, + a5, a6, a7, a8, a9)); + return a; +} + + +template +Array +make_array(const Array& a0) +{ + const Array<1,T> a = NumericVectorWithOffset(make_vector(a0)); + return a; +} + +template +Array +make_array(const Array& a0, const Array& a1) +{ + const Array a = NumericVectorWithOffset,T>(make_vector(a0, a1)); + return a; +} + + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2) +{ + const Array a = NumericVectorWithOffset,T>(make_vector(a0, a1, a2)); + return a; +} + + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3) +{ + const Array a = NumericVectorWithOffset,T>(make_vector(a0, a1, a2, a3)); + return a; +} + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4) +{ + const Array a = + NumericVectorWithOffset,T>(make_vector(a0, a1, a2, a3, a4)); + return a; +} + + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5) +{ + const Array a = + NumericVectorWithOffset,T> (make_vector(a0, a1, a2, a3, a4, a5)); + return a; +} + + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6) +{ + const Array a = + NumericVectorWithOffset,T>(make_vector(a0, a1, a2, a3, a4, + a5, a6)); + return a; +} + + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6, const Array& a7) +{ + const Array a = + NumericVectorWithOffset,T>(make_vector(a0, a1, a2, a3, a4, + a5, a6, a7)); + return a; +} + + + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6, const Array& a7, const Array& a8) +{ + const Array a = + NumericVectorWithOffset,T>(make_vector(a0, a1, a2, a3, a4, + a5, a6, a7, a8)); + return a; +} + + +template +Array +make_array(const Array& a0, const Array& a1, const Array& a2, const Array& a3, const Array& a4, + Array& a5, const Array& a6, const Array& a7, const Array& a8, const Array& a9) +{ + const Array a = + NumericVectorWithOffset,T>(make_vector(a0, a1, a2, a3, a4, + a5, a6, a7, a8, a9)); + return a; +} + + +END_NAMESPACE_STIR diff --git a/src/include/stir/min_positive_element.h b/src/include/stir/min_positive_element.h new file mode 100644 index 0000000000..1cdbfc8ef7 --- /dev/null +++ b/src/include/stir/min_positive_element.h @@ -0,0 +1,70 @@ +// +// +/* + Copyright (C) 2002- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_min_positive_element_h_ +#define __stir_min_positive_element_h_ + +/*! + \file + \ingroup buildblock + + \brief Declares the stir::min_positive_element() function + + \author Kris Thielemans + +*/ + +#include "stir/common.h" +#include +START_NAMESPACE_STIR + +//! Finds where the smallest strictly positive element occurs +/*! + \ingroup buildblock + \param start start of the sequence. Usually object.begin(). + \param end end of the sequence in iterator sense (so actually one beyond + the last element). Usually object.end(). + \return an iterator that points to the element in the sequence which + has the smallest (strictly) positive value. If no (strictly) positive + element is found, or if the sequence is empty, the \a end argument + is returned. + + The iterator type has to satisfy the requirements of a forward iterator, + and its value_type has to be comparable using < and <=. +*/ +template +ForwardIter_t +min_positive_element(ForwardIter_t start, ForwardIter_t end) +{ + // go and look for the first (strictly) positive number + while (start != end && *start <= 0) + ++start; + if (start==end) return end; + + // now look through the rest for a smaller positive number + ForwardIter_t result = start; + while (++start != end) + if(!(*start<=0) && *start<*result) + result = start; + + return result; +} + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/modelling/KineticModel.h b/src/include/stir/modelling/KineticModel.h new file mode 100644 index 0000000000..6f23891c32 --- /dev/null +++ b/src/include/stir/modelling/KineticModel.h @@ -0,0 +1,66 @@ +// +// +/* + Copyright (C) 2006 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + + \brief Definition of class stir::KineticModel + + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_modelling_KineticModel_H__ +#define __stir_modelling_KineticModel_H__ + +#include "stir/RegisteredObject.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +/*! + \brief base class for all kinetic models + \ingroup modelling + + At present very basic. It just provides the parsing mechanism. +*/ +class KineticModel: public RegisteredObject +{ + +public: + static const char * const registered_name ; + //! default constructor + KineticModel(); + + //! default destructor + virtual ~KineticModel(); + + // virtual float get_compartmental_activity_at_time(const int param_num, const int sample_num) const; + // virtual float get_total_activity_at_time(const int sample_num) const; + + virtual Succeeded set_up() = 0; + + // protected: + // void initialise_keymap(); + +}; + +END_NAMESPACE_STIR + +#endif //__stir_modelling_KineticModel_H__ diff --git a/src/include/stir/modelling/KineticParameters.h b/src/include/stir/modelling/KineticParameters.h new file mode 100644 index 0000000000..a9dd06a372 --- /dev/null +++ b/src/include/stir/modelling/KineticParameters.h @@ -0,0 +1,64 @@ +// +// +/* + Copyright (C) 2006 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + + \brief Declaration of class stir::KineticParameters + + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_modelling_KineticParameters_H__ +#define __stir_modelling_KineticParameters_H__ + +#include "stir/BasicCoordinate.h" +#include "stir/assign.h" + +START_NAMESPACE_STIR + +template +class KineticParameters:public BasicCoordinate +{ + typedef BasicCoordinate base_type; + public: + KineticParameters() + {} + + KineticParameters(const base_type& c) + : base_type(c) + {} + +}; + +template +inline +void assign(KineticParameters& v, const T2& y) +{ + for (typename KineticParameters::iterator iter = v.begin(); + iter != v.end(); ++iter) + assign(*iter, y); +} + +END_NAMESPACE_STIR + +//#include "stir/modelling/KineticParameters.inl" + +#endif //__stir_modelling_KineticParameters_H__ diff --git a/src/include/stir/modelling/KineticParameters.inl b/src/include/stir/modelling/KineticParameters.inl new file mode 100644 index 0000000000..6702c06568 --- /dev/null +++ b/src/include/stir/modelling/KineticParameters.inl @@ -0,0 +1,57 @@ +// +// +/* + Copyright (C) 2006 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \file + \ingroup modelling + + \brief Implementations of inline functions of class stir::KineticParameters + + \author Charalampos Tsoumpas + +*/ + +START_NAMESPACE_STIR + + //! default constructor +template +KineticParameters::KineticParameters() +{ } + //! constructor +//template +//KineticParameters::KineticParameters() +//{} + + //! default destructor +template +KineticParameters::~KineticParameters() +{ } + + //! set the blood counts of the sample +template +void KineticParameters:: +set_parameter_value( const elemT param_value, const int param_num) +{ KineticParameters::_kin_params[param_num]=param_value ; } + + //! get the blood counts of the sample +template +elemT KineticParameters:: +get_parameter_value(const int param_num) const +{ return KineticParameters::_kin_params[param_num] ; } + + +END_NAMESPACE_STIR diff --git a/src/include/stir/modelling/ModelMatrix.h b/src/include/stir/modelling/ModelMatrix.h new file mode 100644 index 0000000000..7bcb4e42e0 --- /dev/null +++ b/src/include/stir/modelling/ModelMatrix.h @@ -0,0 +1,172 @@ +// +// +/* + Copyright (C) 2006 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief Declaration of class stir::ModelMatrix + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + +*/ + +#ifndef __stir_modelling_ModelMatrix_H__ +#define __stir_modelling_ModelMatrix_H__ + +#include "stir/Array.h" +#include "stir/BasicCoordinate.h" +#include "stir/VectorWithOffset.h" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/Succeeded.h" +#include +#include + +START_NAMESPACE_STIR +//! A helper class to store the model matrix for a linear kinetic model +/*! \ingroup modelling + */ +template +class ModelMatrix +{ +public: + inline ModelMatrix(); //!< default constructor + + inline ~ModelMatrix(); //!< default destructor + + /*! Implementation to read the model matrix from a text file + \warning In this way the information about the calibration _is_uncalibrated and the counts _is_converted is not passed. + */ + inline void read_from_file(const std::string input_string); + + //! Implementation to write the model matrix to a text file + inline Succeeded write_to_file(const std::string output_string); + + //! \name Functions to get parameters @{ + inline Array<2,float> get_model_array() const; + inline const VectorWithOffset get_model_array_sum() const; + inline VectorWithOffset get_time_vector() const; + //!@} + //! \name Functions to set parameters @{ + inline void set_model_array(const Array<2,float>& model_array); + inline void set_time_vector(const VectorWithOffset& time_vector); + //! Function to set _is_calibrated boolean true or false + inline void set_if_uncalibrated(const bool is_uncalibrated); + inline void set_if_in_correct_scale(const bool in_correct_scale); + inline void set_matrix_in_total_frame_counts(const bool is_converted_to_total_counts); + //!@} + + //! Function to give the threshold_value to the all elements of the model_array which lower value than the threshold_value. + inline void threshold_model_array(const float threshold_value) ; + + /*! Function to divide with the calibration factor the model array. + Calibrated ModelMatrix means that the counts are in kBq/ml, while uncalibrated means that it will be to the same units as the reconstructed images. + */ + inline void uncalibrate(const float cal_factor); + + /*! Function to multiply with the scale factor the model array. + Scaled ModelMatrix means that the counts are already scaled to the correct, while not scaled means that it needs to be scaled. + */ + inline void scale_model_matrix(const float scale_factor); + + /*! Multiply with the duration to convert the count rate to total counts in the time frame. + Converted ModelMatrix means that it is in total counts in respect to the time_frame_duration, + while not converted sets the _is_converted to false and means that it will be in "mean count rate". + */ + inline void convert_to_total_frame_counts(const TimeFrameDefinitions& time_frame_definitions); + + /*! Multiplications of the model with the dynamic or the parametric images. + /todo Maybe it will be better to lie in a linear models class. + */ + //@{ + //! multiply (transpose) model-matrix with dynamic image and add result to original \c parametric_image + inline void + multiply_dynamic_image_with_model_and_add_to_input(ParametricVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image) const ; + //! multiply (transpose) model-matrix with dynamic image (overwriting original content of \c parametric_image) + /*! \todo current implementation first fills first argument with 0 and then calls + multiply_dynamic_image_with_model_and_add_to_input(). This is somewhat inefficient. + */ + inline void + multiply_dynamic_image_with_model(ParametricVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image) const ; + //! multiply model-matrix with parametric image and add result to original \c dynamic_image + inline void + multiply_parametric_image_with_model_and_add_to_input(DynamicDiscretisedDensity & dynamic_image, + const ParametricVoxelsOnCartesianGrid & parametric_image ) const ; + //! multiply model-matrix with parametric image (overwriting original content of \c dynamic_image) + /*! \todo current implementation first fills first argument with 0 and then calls + multiply_dynamic_image_with_model_and_add_to_input(). This is somewhat inefficient. + */ + inline void + multiply_parametric_image_with_model(DynamicDiscretisedDensity & dynamic_image, + const ParametricVoxelsOnCartesianGrid & parametric_image ) const ; + + inline void + normalise_parametric_image_with_model_sum( ParametricVoxelsOnCartesianGrid & parametric_image_out, + const ParametricVoxelsOnCartesianGrid & parametric_image ) const ; + + + /*! Multiplications of the initialization kinetic model matrix with the dynamic or the parametric images. + /todo Maybe it will be better to lie in a linear models class. + */ + //@{ + //! multiply (transpose) initialization kinetic model-matrix with dynamic image and add result to original \c parametric_image + inline void + multiply_dynamic_image_with_initialization_model_and_add_to_input(GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image) const ; + //! multiply (transpose) initialization kinetic model-matrix with dynamic image (overwriting original content of \c parametric_image) + /*! \todo current implementation first fills first argument with 0 and then calls + multiply_dynamic_image_with_initialization kinetic model_and_add_to_input(). This is somewhat inefficient. + */ + inline void + multiply_dynamic_image_with_initialization_model(GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image) const ; + //! multiply initialization kinetic model-matrix with parametric image and add result to original \c dynamic_image + inline void + multiply_parametric_image_with_initialization_model_and_add_to_input(DynamicDiscretisedDensity & dynamic_image, + const GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image ) const ; + //! multiply initialization kinetic model-matrix with parametric image (overwriting original content of \c dynamic_image) + /*! \todo current implementation first fills first argument with 0 and then calls + multiply_dynamic_image_with_initialization_model_and_add_to_input(). This is somewhat inefficient. + */ + inline void + multiply_parametric_image_with_initialization_model(DynamicDiscretisedDensity & dynamic_image, + const GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image ) const ; + + inline void + normalise_parametric_image_with_initialization_model_sum( GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image_out, + const GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image ) const ; + + //@} +private: + + //! At the moment it has the form of _model_array[param_num][frame_num]. + Array<2,float> _model_array; + VectorWithOffset _time_vector; + bool _is_uncalibrated ; + bool _in_correct_scale ; + bool _is_converted_to_total_counts; +}; + +END_NAMESPACE_STIR + +#include "stir/modelling/ModelMatrix.inl" + +#endif //__stir_modelling_ModelMatrix_H__ + diff --git a/src/include/stir/modelling/ModelMatrix.inl b/src/include/stir/modelling/ModelMatrix.inl new file mode 100644 index 0000000000..41ad1ed6f5 --- /dev/null +++ b/src/include/stir/modelling/ModelMatrix.inl @@ -0,0 +1,520 @@ +// +// +/* + Copyright (C) 2006 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \file + \ingroup modelling + + \brief Implementations of inline functions of class stir::ModelMatrix + + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + +*/ + +#include +START_NAMESPACE_STIR + +//! default constructor +template +ModelMatrix::ModelMatrix() +{ + // Calibrated ModelMatrix means that the counts are in kBq/ml, while uncalibrated means that it will be to the same units as the reconstructed images. + this->_is_uncalibrated=false; + // Converted ModelMatrix means that it is in total counts in respect to the time_frame_duration, while false means that it will be in mean count rate. + this->_in_correct_scale=false; + this->_is_converted_to_total_counts=false; +} + +//! default destructor +template +ModelMatrix::~ModelMatrix() +{ } + +//! Implementation to read the model matrix +template +void ModelMatrix::read_from_file(const std::string input_string) +{ + std::ifstream data_stream(input_string.c_str()); + unsigned int starting_frame, last_frame; + if(!data_stream) + error("cannot read model matrix from file.\n"); + else + { + data_stream >> starting_frame ; + data_stream >> last_frame ; + } + + BasicCoordinate<2,int> min_range; + BasicCoordinate<2,int> max_range; + min_range[1]=1; min_range[2]=starting_frame; + max_range[1]=num_param; max_range[2]=last_frame; + IndexRange<2> data_range(min_range,max_range); + Array<2,float> input_array(data_range); + while(true) + { + for(unsigned int frame_num=starting_frame; frame_num<=last_frame; ++frame_num) + for(int param_num=1;param_num<=num_param;++param_num) + data_stream >> input_array[param_num][frame_num] ; + if(!data_stream) + break; + } + this->_model_array=input_array; // I do not pass info if it is calibrated and if it includes time frame_duration, yet. +} + +//! Implementation to write the model matrix +template +Succeeded ModelMatrix::write_to_file(const std::string output_string) +{ + + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + unsigned int starting_frame=model_array_min[2], last_frame=model_array_max[2]; + + std::ofstream data_stream(output_string.c_str(),std::ios::out); + if(!data_stream) + { + warning("ModelMatrix::write_to_file: error opening output file %s\n", + output_string.c_str()); + return Succeeded::no; + } + else + { + data_stream << starting_frame << " " ; + data_stream << last_frame << " " ; + } + + // It will be good to assert that there will be no writing error. + for(unsigned int frame_num=starting_frame; frame_num<=last_frame; ++frame_num) + { + data_stream << "\n"; + for(int param_num=1;param_num<=num_param;++param_num) + data_stream << this->_model_array[param_num][frame_num] << " "; + } + data_stream.close(); + return Succeeded::yes; +} + + +template +void ModelMatrix:: +set_model_array(const Array<2,float>& model_array) +{ this->_model_array=model_array ; } + +template +Array<2,float> +ModelMatrix:: +get_model_array() const +{ return this->_model_array ; } + +template +const VectorWithOffset +ModelMatrix:: +get_model_array_sum() const +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + VectorWithOffset sum(model_array_min[1],model_array_max[1]); + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + { + sum[param_num]=0.F; + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + sum[param_num] += this->_model_array[param_num][frame_num] ; + } + return + sum; +} + +template +void ModelMatrix:: +threshold_model_array(const float threshold_value) +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + if(this->_model_array[param_num][frame_num]<=0) + this->_model_array[param_num][frame_num]=threshold_value; + +} + +template +void ModelMatrix:: +set_if_uncalibrated(const bool is_uncalibrated) +{ this->_is_uncalibrated=is_uncalibrated; } + +template +void ModelMatrix:: +set_if_in_correct_scale(const bool in_correct_scale) +{ this->_in_correct_scale=in_correct_scale; } + +template +void ModelMatrix:: +set_matrix_in_total_frame_counts(const bool is_converted_to_total_counts) +{ this->_is_converted_to_total_counts=is_converted_to_total_counts; } + +template +void ModelMatrix:: +uncalibrate(const float cal_factor) +{ + if(this->_is_uncalibrated) + warning("ModelMatrix is already uncalibrated, so it will be not re-uncalibrated."); + else + { + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + this->_model_array[param_num][frame_num]/=cal_factor; + + ModelMatrix::set_if_uncalibrated(true); + } +} + +template +void ModelMatrix:: +scale_model_matrix(const float scale_factor) +{ + if (this->_in_correct_scale) + warning("ModelMatrix is already scaled, so it will not be re-scaled. "); + else + { + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + this->_model_array[param_num][frame_num]*= scale_factor; + + this->_in_correct_scale=true; + } +} + +template +void ModelMatrix:: +convert_to_total_frame_counts(const TimeFrameDefinitions& time_frame_definitions) +{ + if (this->_is_converted_to_total_counts==true) + warning("ModelMatrix is already converted to total counts, so it will not be re-converted. "); + else + { + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + this->_model_array[param_num][frame_num]*= static_cast(time_frame_definitions.get_duration(frame_num)); + + this->_is_converted_to_total_counts=true; + } +} + +template +void ModelMatrix:: +set_time_vector(const VectorWithOffset& time_vector) +{this->_time_vector=time_vector;} + +template +VectorWithOffset +ModelMatrix:: +get_time_vector() const +{return this->_time_vector;} + +template +void +ModelMatrix:: +multiply_dynamic_image_with_model_and_add_to_input(ParametricVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image ) const +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!this->_model_array.get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + + // Assert that the sizes of the one frame of the dynamic image is equal with the parametric image size. + // ChT::ToDo::Might be better to assert that each of the dimensions sizes with their voxle sizes are equal. + // Could probably use has_same_characteristics()? + assert(dynamic_image[1].size_all()==parametric_image.size_all()); + assert(dynamic_image.get_time_frame_definitions().get_num_frames()==static_cast (model_array_max[2])); + assert(model_array_max[1]-model_array_min[1]+1==num_param); + + const int min_k_index = dynamic_image[1].get_min_index(); + const int max_k_index = dynamic_image[1].get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = dynamic_image[1][k].get_min_index(); + const int max_j_index = dynamic_image[1][k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = dynamic_image[1][k][j].get_min_index(); + const int max_i_index = dynamic_image[1][k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + { + float sum_over_frames=0.F; + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + sum_over_frames+=this->_model_array[param_num][frame_num]*dynamic_image[frame_num][k][j][i]; + parametric_image[k][j][i][param_num]+=sum_over_frames; + } + } + } +} + +template +void +ModelMatrix:: +multiply_dynamic_image_with_model(ParametricVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image ) const +{ + std::fill(parametric_image.begin_all(), parametric_image.end_all(), 0.F); + this->multiply_dynamic_image_with_model_and_add_to_input(parametric_image,dynamic_image ); +} + +template +void +ModelMatrix:: +multiply_parametric_image_with_model_and_add_to_input(DynamicDiscretisedDensity & dynamic_image, + const ParametricVoxelsOnCartesianGrid & parametric_image ) const +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array does not have a regular range"); + + // Assert that the sizes of the one frame of the dynamic image is equal with the parametric image size. + // ChT::ToDo::Might be better to assert that each of the dimensions sizes with their voxle sizes are equal. + // Maybe this will be easier if I clone the single images for the two and then compare them. + assert(dynamic_image[1].size_all()==parametric_image.size_all()); + assert(dynamic_image.get_time_frame_definitions().get_num_frames()==static_cast (model_array_max[2])); + assert(model_array_max[1]-model_array_min[1]+1==num_param); + + const int min_k_index = dynamic_image[1].get_min_index(); + const int max_k_index = dynamic_image[1].get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = dynamic_image[1][k].get_min_index(); + const int max_j_index = dynamic_image[1][k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = dynamic_image[1][k][j].get_min_index(); + const int max_i_index = dynamic_image[1][k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + { + float sum_over_param=0.F; + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + sum_over_param+=parametric_image[k][j][i][param_num]*this->_model_array[param_num][frame_num]; + dynamic_image[frame_num][k][j][i]=sum_over_param; + } + } + } +} + +template +void +ModelMatrix:: +multiply_parametric_image_with_model(DynamicDiscretisedDensity & dynamic_image, + const ParametricVoxelsOnCartesianGrid & parametric_image ) const +{ + std::fill(dynamic_image.begin_all(), dynamic_image.end_all(), 0.F); + this->multiply_parametric_image_with_model_and_add_to_input(dynamic_image, parametric_image); +} + +template +void +ModelMatrix:: +normalise_parametric_image_with_model_sum( ParametricVoxelsOnCartesianGrid & parametric_image_out, + const ParametricVoxelsOnCartesianGrid & parametric_image ) const +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + + assert(parametric_image_out.size_all()==parametric_image.size_all()); + assert(model_array_max[1]-model_array_min[1]+1==num_param); + + const int min_k_index = parametric_image.construct_single_density(num_param).get_min_index(); + const int max_k_index = parametric_image.construct_single_density(num_param).get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = (parametric_image.construct_single_density(num_param))[k].get_min_index(); + const int max_j_index = (parametric_image.construct_single_density(num_param))[k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = (parametric_image.construct_single_density(num_param))[k][j].get_min_index(); + const int max_i_index = (parametric_image.construct_single_density(num_param))[k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + { + parametric_image_out[k][j][i][1]=parametric_image[k][j][i][1]/((this->get_model_array_sum())[1]); + parametric_image_out[k][j][i][2]=parametric_image[k][j][i][2]/((this->get_model_array_sum())[2]); + } + } + } +} + + + + + + +template +void +ModelMatrix:: +multiply_dynamic_image_with_initialization_model_and_add_to_input(GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image ) const +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!this->_model_array.get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + + // Assert that the sizes of the one frame of the dynamic image is equal with the parametric image size. + // ChT::ToDo::Might be better to assert that each of the dimensions sizes with their voxle sizes are equal. + // Could probably use has_same_characteristics()? + assert(dynamic_image[1].size_all()==parametric_image.size_all()); + assert(dynamic_image.get_time_frame_definitions().get_num_frames()==static_cast (model_array_max[2])); + assert(model_array_max[1]-model_array_min[1]+1==num_param); + + const int min_k_index = dynamic_image[1].get_min_index(); + const int max_k_index = dynamic_image[1].get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = dynamic_image[1][k].get_min_index(); + const int max_j_index = dynamic_image[1][k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = dynamic_image[1][k][j].get_min_index(); + const int max_i_index = dynamic_image[1][k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + { + float sum_over_frames=0.F; + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + sum_over_frames+=this->_model_array[param_num][frame_num]*dynamic_image[frame_num][k][j][i]; + if (param_num==2) + { + parametric_image[k][j][i][param_num]+=0; + parametric_image[k][j][i][param_num+1]+=sum_over_frames; + } + else + parametric_image[k][j][i][param_num]+=sum_over_frames; + } + } + } +} + +template +void +ModelMatrix:: +multiply_dynamic_image_with_initialization_model(GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dynamic_image ) const +{ + std::fill(parametric_image.begin_all(), parametric_image.end_all(), 0.F); + this->multiply_dynamic_image_with_initialization_model_and_add_to_input(parametric_image,dynamic_image ); +} + +template +void +ModelMatrix:: +multiply_parametric_image_with_initialization_model_and_add_to_input(DynamicDiscretisedDensity & dynamic_image, + const GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image ) const +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array does not have a regular range"); + + // Assert that the sizes of the one frame of the dynamic image is equal with the parametric image size. + // ChT::ToDo::Might be better to assert that each of the dimensions sizes with their voxle sizes are equal. + // Maybe this will be easier if I clone the single images for the two and then compare them. + assert(dynamic_image[1].size_all()==parametric_image.size_all()); + assert(dynamic_image.get_time_frame_definitions().get_num_frames()==static_cast (model_array_max[2])); + assert(model_array_max[1]-model_array_min[1]+1==num_param); + + const int min_k_index = dynamic_image[1].get_min_index(); + const int max_k_index = dynamic_image[1].get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = dynamic_image[1][k].get_min_index(); + const int max_j_index = dynamic_image[1][k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = dynamic_image[1][k][j].get_min_index(); + const int max_i_index = dynamic_image[1][k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + for(int frame_num = model_array_min[2];frame_num<=model_array_max[2] ; ++frame_num) + { + float sum_over_param=0.F; + for(int param_num = model_array_min[1];param_num<=model_array_max[1] ; ++param_num) + if (param_num==2) + sum_over_param+=parametric_image[k][j][i][param_num+1]*this->_model_array[param_num][frame_num]; + else + sum_over_param+=parametric_image[k][j][i][param_num]*this->_model_array[param_num][frame_num]; + dynamic_image[frame_num][k][j][i]=sum_over_param; + } + } + } +} + +template +void +ModelMatrix:: +multiply_parametric_image_with_initialization_model(DynamicDiscretisedDensity & dynamic_image, + const GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image ) const +{ + std::fill(dynamic_image.begin_all(), dynamic_image.end_all(), 0.F); + this->multiply_parametric_image_with_initialization_model_and_add_to_input(dynamic_image, parametric_image); +} + +template +void +ModelMatrix:: +normalise_parametric_image_with_initialization_model_sum( GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image_out, + const GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image ) const +{ + BasicCoordinate<2,int> model_array_min, model_array_max; + if(!(this->_model_array).get_regular_range(model_array_min,model_array_max)) + error("Model array has not regular range"); + + assert(parametric_image_out.size_all()==parametric_image.size_all()); + assert(model_array_max[1]-model_array_min[1]+1==num_param); + + const int min_k_index = parametric_image.construct_single_density(num_param).get_min_index(); + const int max_k_index = parametric_image.construct_single_density(num_param).get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = (parametric_image.construct_single_density(num_param))[k].get_min_index(); + const int max_j_index = (parametric_image.construct_single_density(num_param))[k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = (parametric_image.construct_single_density(num_param))[k][j].get_min_index(); + const int max_i_index = (parametric_image.construct_single_density(num_param))[k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + { + parametric_image_out[k][j][i][1]=parametric_image[k][j][i][1]/((this->get_model_array_sum())[1]); + parametric_image_out[k][j][i][2]=0; + parametric_image_out[k][j][i][3]=parametric_image[k][j][i][3]/((this->get_model_array_sum())[2]); + } + } + } +} + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/modelling/ParametricDiscretisedDensity.h b/src/include/stir/modelling/ParametricDiscretisedDensity.h new file mode 100644 index 0000000000..fb0d53eeb6 --- /dev/null +++ b/src/include/stir/modelling/ParametricDiscretisedDensity.h @@ -0,0 +1,198 @@ +// +// +#ifndef __stir_modelling_ParametricDiscretisedDensity_H__ +#define __stir_modelling_ParametricDiscretisedDensity_H__ +/* + Copyright (C) 2006 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief Declaration of class stir::ParametricDiscretisedDensity + \author Kris Thielemans + \author Nicolas A Karakatsanis + +*/ + +#include "stir/DiscretisedDensity.h" +#include "stir/NestedIterator.h" +// for ParametricVoxelsOnCartesianGrid typedef +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/modelling/KineticParameters.h" +START_NAMESPACE_STIR +template +class ParametricDiscretisedDensity; + +//! A helper class to find the type of a 'single' image for a corresponding parametric image. +template +struct Parametric2Single; + +template +struct Parametric2Single > +{ + typedef typename Parametric2Single::type type; +}; + +template +struct Parametric2Single > > +{ + typedef VoxelsOnCartesianGrid type; +}; + +//! Class to store parametric images +/*! \ingroup modelling + \param DiscDensT should be a class for storing an image, e.g. VoxelsOnCartesianGrid + + This class stores parametric images as an image of parameters (as opposed to a sequence of images, one + for each parameter). However, it provides various functions to get single images out, e.g. corresponding + to a single parameter, or by applying a function on all parameters. +*/ +template +class ParametricDiscretisedDensity: +public DiscDensT +{ + private: + // typedef DiscretisedDensity base_type; + typedef DiscDensT base_type; + public: + typedef typename Parametric2Single::type SingleDiscretisedDensityType; + + typedef typename base_type::full_iterator full_densel_iterator; + typedef typename base_type::const_full_iterator const_full_densel_iterator; + + typedef NestedIterator > full_iterator; + typedef NestedIterator > + const_full_iterator; + + //! A static member to read an image from file + static ParametricDiscretisedDensity * read_from_file(const std::string& filename); + + //! Get number of parameters in a single densel + static unsigned int + get_num_params(); + + ParametricDiscretisedDensity(const base_type& density) + : base_type(density) + {} + + // implementation works, although only for VoxelsOnCartesianGrid , but not needed for now + // ParametricDiscretisedDensity(const VectorWithOffset > & densities); + + // implementation works, but not needed for now + // void update_parametric_image(const VectorWithOffset > & densities); + + void update_parametric_image(const SingleDiscretisedDensityType & single_density, const unsigned int param_num); + + full_iterator begin_all() + { return full_iterator(base_type::begin_all(), base_type::end_all()); } + + const_full_iterator begin_all_const() const + { return const_full_iterator(base_type::begin_all_const(), base_type::end_all_const()); } + + full_iterator end_all() + { return full_iterator(base_type::end_all(), base_type::end_all()); } + + const_full_iterator end_all_const() const + { return const_full_iterator(base_type::end_all_const(), base_type::end_all_const()); } + + const_full_iterator begin_all() const + { return this->begin_all_const(); } + + const_full_iterator end_all() const + { return this->end_all_const(); } + + full_densel_iterator begin_all_densel() + { return base_type::begin_all(); } + + const_full_densel_iterator begin_all_densel_const() const + { return base_type::begin_all_const(); } + + full_densel_iterator end_all_densel() + { return base_type::end_all(); } + + const_full_densel_iterator end_all_densel_const() const + { return base_type::end_all_const(); } + + const_full_densel_iterator begin_all_densel() const + { return this->begin_all_densel_const(); } + + const_full_densel_iterator end_all_densel() const + { return this->end_all_densel_const(); } + + //! Allocate a new object with same characteristics as the current one. + virtual ParametricDiscretisedDensity* get_empty_copy() const; + + //! Allocate a new object which is a copy of the current one. + virtual ParametricDiscretisedDensity* clone() const; + + //! construct a single image by applying a function object on each KineticParameter + template + void + construct_single_density_using_function(SingleDiscretisedDensityType& density, KPFunctionObject f) const; + + template + const SingleDiscretisedDensityType + construct_single_density_using_function(KPFunctionObject f) const; + + //! construct a single image corresponding to the parameter with index \c i + //@{ + void + construct_single_density(SingleDiscretisedDensityType& density, const int i) const; + + const SingleDiscretisedDensityType + construct_single_density(const int index) const; +#if 0 //!< Implementation of non-const functions - which should be able to update a single parameter of a parametric image. + + template + void + construct_single_density_using_function(SingleDiscretisedDensityType& density, KPFunctionObject f) ; + + template + SingleDiscretisedDensityType & + construct_single_density_using_function(KPFunctionObject f) ; + + void + construct_single_density(SingleDiscretisedDensityType& density, const int i) ; + + SingleDiscretisedDensityType & // Maybe this should be a reference... + construct_single_density(const int index); +#endif + //@} +}; + +//! Convenience typedef for base-type of Cartesian Voxelised Parametric Images with just two parameters +typedef VoxelsOnCartesianGrid > + ParametricVoxelsOnCartesianGridBaseType; + + +//! Convenience typedef for Cartesian Voxelised Parametric Images with just two parameters +typedef ParametricDiscretisedDensity + ParametricVoxelsOnCartesianGrid; + + +//! Convenience typedef for base-type of Cartesian Voxelised Parametric Images with just three parameters (for Generalized Patlak algorithm) +typedef VoxelsOnCartesianGrid > + GeneralizedPatlakVoxelsOnCartesianGridBaseType; + +//! Convenience typedef for Cartesian Voxelised Parametric Images with just three parameters (for Generalized Patlak algorithm) +typedef ParametricDiscretisedDensity + GeneralizedPatlakVoxelsOnCartesianGrid; + + +END_NAMESPACE_STIR +//#include "stir/modelling/ParametricDiscretisedDensity.inl" + +#endif //__stir_modelling_ParametricDiscretisedDensity_H__ diff --git a/src/include/stir/modelling/PatlakPlot.h b/src/include/stir/modelling/PatlakPlot.h new file mode 100644 index 0000000000..23fce644d2 --- /dev/null +++ b/src/include/stir/modelling/PatlakPlot.h @@ -0,0 +1,196 @@ +// +// +/* + Copyright (C) 2006 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief Implementation of functions of class stir::PatlakPlot + + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + +*/ + + +#ifndef __stir_modelling_PatlakPlot_H__ +#define __stir_modelling_PatlakPlot_H__ + +#include "stir/modelling/KineticModel.h" +#include "stir/modelling/ModelMatrix.h" +#include "stir/modelling/PlasmaData.h" +#include "stir/Succeeded.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +//! +/*! + \ingroup modelling + \brief Patlak kinetic model + + Model suitable for irreversible tracers such as FDG and FLT. See + + - Patlak C S, Blasberg R G, Fenstermacher J D (1985) + Graphical evaluation of blood-to-brain transfer constants from multiple-time uptake data, {J Cereb Blood Flow Metab 3(1): p. 1-7. + + - Patlak C S, Blasberg R G (1985) + Experimental and Graphical evaluation of blood-to-brain transfer constant from multiple-time uptake data: Generalizations, + J Cereb Blood Flow Metab 5: p. 584-90. + + + \par Example .par file + \verbatim + Patlak Plot Parameters:= + + time frame definition filename := frames.txt + starting frame := 23 + calibration factor := 9000 + blood data filename := blood_file.txt + ; In seconds + Time Shift := 0 + In total counts := 1 + + end Patlak Plot Parameters:= + \endverbatim + + \warning + - The dynamic images will be calibrated only if the calibration factor is given. + - The [if_total_cnt] is set to true the Dynamic Image will have the total number of + counts while if set to false it will have the total_number_of_counts/get_duration(frame_num). + - The dynamic images will always be in decaying counts. + - The plasma data is assumed to be in decaying counts. + + \todo Should be derived from LinearModels, but when non-linear models will be introduced, as well. +*/ +class PatlakPlot : public RegisteredParsingObject +{ + public: + //! Name which will be used when parsing a PatlakPlot object + static const char * const registered_name; + + PatlakPlot(); //!< Default constructor (calls set_defaults()) + ~PatlakPlot(); //!< default destructor + /*! \name Functions to get parameters */ + //@{ + //! Simply gets model matrix, if it has been already stored. + ModelMatrix<2> get_model_matrix() const; + //! Creates model matrix from plasma data (Must be already sorted in appropriate frames). + ModelMatrix<2> get_model_matrix(const PlasmaData& plasma_data, + const TimeFrameDefinitions& time_frame_definitions, + const unsigned int starting_frame); + //! Returns the frame that the PatlakPlot linearization is assumed to be valid. + unsigned int + get_starting_frame() const ; + //! Returns the TimeFrameDefinitions that the PatlakPlot linearization is assumed to be valid: ChT::Check + TimeFrameDefinitions + get_time_frame_definitions() const ; + //!@} + /*! \name Functions to set parameters*/ + //@{ + void set_model_matrix(ModelMatrix<2> model_matrix) ; //!< Simply set model matrix + //@} + + //! Multiplies the dynamic image with the model gradient. + /*! For a linear model the model gradient is the transpose of the model matrix. + So, the dynamic image is "projected" from time domain to the parameter domain. + + \todo Should be a virtual function declared in the KineticModel class. + */ + virtual void + multiply_dynamic_image_with_model_gradient(ParametricVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dyn_image) const; + //! Multiplies the dynamic image with the model gradient and add to original \c parametric_image + /*! \todo Should be a virtual function declared in the KineticModel class. + */ + virtual void + multiply_dynamic_image_with_model_gradient_and_add_to_input(ParametricVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dyn_image) const; + + //! Multiplies the parametric image with the model matrix to get the corresponding dynamic image. + /*! \todo Should be a virtual function declared in the KineticModel class. + */ + virtual void + get_dynamic_image_from_parametric_image(DynamicDiscretisedDensity & dyn_image, + const ParametricVoxelsOnCartesianGrid & par_image) const; + + + //! Multiplies the dynamic image with the initialization kinetic model gradient. + /*! For a linear model the model gradient is the transpose of the model matrix. + So, the dynamic image is "projected" from time domain to the parameter domain. + + \todo Should be a virtual function declared in the KineticModel class. + Only intended for the initialization of the Generalized Patlak Model EM update estimates + Currently not used but retained for future potential usage. + The initialization of generalized Patlak nested estimates is performed by GeneralizedPatlakPlot equivalent method + */ + virtual void + multiply_dynamic_image_with_initialization_model_gradient(GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dyn_image) const; + + //! Multiplies the dynamic image with the initialization kinetic model gradient and add to original \c parametric_image + /*! \todo Should be a virtual function declared in the KineticModel class. + Only intended for the initialization of the Generalized Patlak Model EM update estimates + Currently not used but retained for future potential usage. + The initialization of generalized Patlak nested estimates is performed by GeneralizedPatlakPlot equivalent method + */ + virtual void + multiply_dynamic_image_with_initialization_model_gradient_and_add_to_input(GeneralizedPatlakVoxelsOnCartesianGrid & parametric_image, + const DynamicDiscretisedDensity & dyn_image) const; + + //! Multiplies the parametric image with the initialization kinetic model matrix to get the corresponding dynamic image. + /*! \todo Should be a virtual function declared in the KineticModel class. + Only intended for the initialization of the Generalized Patlak Model EM update estimates + Currently not used but retained for future potential usage. + The initialization of generalized Patlak nested estimates is performed by GeneralizedPatlakPlot equivalent method + */ + virtual void + get_dynamic_image_from_initialization_parametric_image(DynamicDiscretisedDensity & dyn_image, + const GeneralizedPatlakVoxelsOnCartesianGrid & par_image) const; + + //! This is the common method used to estimate the parametric images from the dynamic images. + void + apply_linear_regression(ParametricVoxelsOnCartesianGrid & par_image, const DynamicDiscretisedDensity & dyn_image) const; + + void set_defaults(); + + Succeeded set_up(); + + bool _if_cardiac; //!< Switches between cardiac and brain data + unsigned int _starting_frame; //!< Starting frame to apply the model + float _cal_factor; //!< Calibration Factor, maybe to be removed. + float _time_shift; //!< Shifts the time to fit the timing of Plasma Data with the Projection Data. + bool _in_correct_scale; //!< Switch to scale or not the model_matrix to the correct scale, according to the appropriate scale factor. + bool _in_total_cnt; //!< Switch to choose the image values of the model to be in total counts or in mean counts. + bool _plasma_in_total_cnt; //!< Switch to choose the plasma values of the model to be in total counts or in mean counts. + string _blood_data_filename; //!< Name of file in which the input function is stored + PlasmaData _plasma_frame_data; //!< Stores the plasma data into frames for brain studies + string _time_frame_definition_filename; //!< name of file to get frame definitions + TimeFrameDefinitions _frame_defs; //!< TimeFrameDefinitions + + private: + void create_model_matrix(); //!< Creates model matrix from private members + void initialise_keymap(); + bool post_processing(); + mutable ModelMatrix<2> _model_matrix; + bool _matrix_is_stored; + typedef RegisteredParsingObject base_type; +}; + +END_NAMESPACE_STIR + +#endif //__stir_modelling_PatlakPlot_H__ diff --git a/src/include/stir/modelling/PlasmaData.h b/src/include/stir/modelling/PlasmaData.h new file mode 100644 index 0000000000..99fe5779a4 --- /dev/null +++ b/src/include/stir/modelling/PlasmaData.h @@ -0,0 +1,130 @@ +// +// +/* + Copyright (C) 2005 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief Declaration of class stir::PlasmaData + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_modelling_PlasmaData_H__ +#define __stir_modelling_PlasmaData_H__ + +#include "stir/modelling/PlasmaSample.h" +#include "stir/TimeFrameDefinitions.h" +#include + +START_NAMESPACE_STIR + +//! A class for storing plasma samples of a single study. +/*! \ingroup modelling + */ +class PlasmaData +{ + typedef std::vector plot_type; + + public: + //! constructor giving a vector \todo Better to use iterators + inline PlasmaData(const std::vector & plasma_blood_plot); + inline PlasmaData(); //!< default constructor + inline ~PlasmaData(); //!< default constructor + + typedef plot_type::const_iterator const_iterator; + //!\todo Implementation to set the input units. + + /* + enum VolumeUnits + { ml , litre }; + enum SamplingTimeUnits + { seconds , minutes }; + enum RadioactivityUnits + { counts_per_sec , counts_per_min , kBq }; + */ + + // Implementation to set the input units not currently used. Always, it assumed to use kBq, seconds, ml. + /* inline void set_input_units(const SamplingTimeUnits input_sampling_time_units, + const VolumeUnits input_volume_units, + const RadioactivityUnits input_radioactivity_units ) ; + */ + + + /*! Implementation to read the input function from ONLY a 3-columns data file (Time-InputFunctionRadioactivity-TotalBloodRadioactivity). + \warning Assumes that the input function is not corrected for decay. + */ + inline void read_plasma_data(const std::string input_string) ; + + inline void set_plot(const std::vector & plasma_blood_plot); + + /*! Sorts the plasma_data into frames + \warning It corrects for decay if the data are not decay corrected. + \return PlasmaData are in start-end frames time mode. + */ + inline PlasmaData get_sample_data_in_frames(TimeFrameDefinitions time_frame_def); + + /*!Function to shift the time data + This is useful if the start time of the scan and the start time of the plasma are not precisely correct. + This can be measured by the plasma peak and the very first frames of the dynamic images. + \note This cannot be estimated in the current implementation of the direct reconstructions. Thus, it is given externally. */ + + //! \name Functions to get parameters @{ + inline double get_time_shift(); + inline bool get_if_decay_corrected() const ; + inline double get_isotope_halflife() const; + inline TimeFrameDefinitions get_time_frame_definitions() const; //!@} + //! \name Functions to set parameters + //!@{ + inline void set_time_frame_definitions(const TimeFrameDefinitions & plasma_fdef); //!<\note The set_time_frame_definitions() is prefered than giving directly the Scan TimeFrameDefinitions since the sample may not be measured for all the frames \n For example at the beginning or at the end of the scan. + inline void set_if_decay_corrected(const bool is_decay_corrected); + inline void set_isotope_halflife(const double isotope_halflife); + inline void shift_time(const double time_shift); + //!@} + + //!Function to decay correct the data + inline void decay_correct_PlasmaData(); + + //! begin() and end() iterators for the plasma curve and the size() function + //@{ + inline const_iterator begin() const ; + inline const_iterator end() const ; + inline unsigned int size() const ; + //!@} + + //!\todo non const_iterator should be defined if the plasma data needs to be changed + //inline iterator begin() ; + //inline iterator end() ; + + private: + // PlasmaSample _plasma_type ; + // VolumeUnits _input_volume_units ; + // SamplingTimeUnits _input_sampling_time_units ; + // RadioactivityUnits _input_radioactivity_units ; + bool _is_decay_corrected ; + std::vector _plasma_blood_plot ; + TimeFrameDefinitions _plasma_fdef; + double _isotope_halflife; + int _sample_size; + double _time_shift ; +}; + +END_NAMESPACE_STIR + +#include "stir/modelling/PlasmaData.inl" + +#endif //__stir_modelling_PlasmaData_H__ diff --git a/src/include/stir/modelling/PlasmaData.inl b/src/include/stir/modelling/PlasmaData.inl new file mode 100644 index 0000000000..225955ba0f --- /dev/null +++ b/src/include/stir/modelling/PlasmaData.inl @@ -0,0 +1,289 @@ +// +// +/* + Copyright (C) 2005 - 2011 Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief Implementations of inline functions of class stir::PlasmaData + + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + +*/ +#include "stir/decay_correction_factor.h" +#include "stir/numerics/integrate_discrete_function.h" + +START_NAMESPACE_STIR + +//! default constructor +PlasmaData::PlasmaData() +{ + this->set_if_decay_corrected(false); +} + +//! constructor giving a vector +//ChT::ToDO: Better to use iterators +PlasmaData::PlasmaData(const std::vector & plasma_blood_plot) +{ + this->_plasma_blood_plot=plasma_blood_plot; + this->set_if_decay_corrected(false); + this->_isotope_halflife=-1.; +} + +//! default destructor +PlasmaData::~PlasmaData() +{ } + +//! Implementation to read the input function from ONLY a 3-columns data file (Time-InputFunctionRadioactivity-WholeBloodRadioactivity). +void PlasmaData::read_plasma_data(const std::string input_string) +{ + std::ifstream data_stream(input_string.c_str()); + if(!data_stream) + error("cannot read plasma data from file.\n"); + else + data_stream >> _sample_size ; + + while(true) + { + float sample_time=0, blood_sample_radioactivity=0, plasma_sample_radioactivity=0; + data_stream >> sample_time ; + data_stream >> plasma_sample_radioactivity ; + data_stream >> blood_sample_radioactivity ; + if(!data_stream) + break; + const PlasmaSample current_sample(sample_time,plasma_sample_radioactivity,blood_sample_radioactivity); + (this->_plasma_blood_plot).push_back(current_sample); + // Comment: The input function is generally not corrected for decay. + this->set_if_decay_corrected(false); + } +} + +// Implementation to set the input units not currently used. +/* + void + PlasmaData::set_input_units( SamplingTimeUnits input_sampling_time_units, + VolumeUnits input_volume_units, + RadioactivityUnits input_radioactivity_units ) +{ + _input_sampling_time_units=input_sampling_time_units ; + _input_volume_units=input_volume_units ; + _input_radioactivity_units=input_radioactivity_units ; +} +*/ + +//! Function to set the plasma_blood_plot +void PlasmaData::set_plot(const std::vector & plasma_blood_plot) +{ this->_plasma_blood_plot = plasma_blood_plot; } + +//!Function to shift the time data +void PlasmaData::shift_time(const double time_shift) +{ + _time_shift=time_shift; + for(std::vector::iterator cur_iter=this->_plasma_blood_plot.begin() ; + cur_iter!=this->_plasma_blood_plot.end() ; ++cur_iter) + cur_iter->set_time_in_s(cur_iter->get_time_in_s()+time_shift); +} + +//!Function to get the time shift +double PlasmaData::get_time_shift() +{ return PlasmaData::_time_shift ; } + +//!Function to get the isotope halflife +double +PlasmaData::get_isotope_halflife() const +{ return this->_isotope_halflife; } + +//!Function to set the isotope halflife +void PlasmaData::set_isotope_halflife(const double isotope_halflife) +{ this->_isotope_halflife=isotope_halflife; } + +void PlasmaData:: +set_time_frame_definitions(const TimeFrameDefinitions & plasma_fdef) +{ this->_plasma_fdef=plasma_fdef; } + +TimeFrameDefinitions PlasmaData:: +get_time_frame_definitions() const +{ return this->_plasma_fdef; } + +void +PlasmaData:: +set_if_decay_corrected(const bool is_decay_corrected) +{ this->_is_decay_corrected=is_decay_corrected; } + +bool +PlasmaData:: +get_if_decay_corrected() const +{ return this->_is_decay_corrected; } + +void +PlasmaData:: +decay_correct_PlasmaData() +{ + + if (this->_is_decay_corrected==true) + warning("PlasmaData are already decay corrected"); + else + { + assert(this->_isotope_halflife>0); + for(std::vector::iterator cur_iter=this->_plasma_blood_plot.begin() ; + cur_iter!=this->_plasma_blood_plot.end() ; ++cur_iter) + { + cur_iter->set_plasma_counts_in_kBq( static_cast(cur_iter->get_plasma_counts_in_kBq()*decay_correction_factor(_isotope_halflife,cur_iter->get_time_in_s()))); + cur_iter->set_blood_counts_in_kBq( static_cast(cur_iter->get_blood_counts_in_kBq()*decay_correction_factor(_isotope_halflife,cur_iter->get_time_in_s()))); + } + PlasmaData::set_if_decay_corrected(true); + } +} + +//! Sorts the plasma_data into frames +PlasmaData +PlasmaData::get_sample_data_in_frames(TimeFrameDefinitions time_frame_def) +{ + if (this->_is_decay_corrected==false) + { + this->decay_correct_PlasmaData(); + warning("Correcting for decay while sampling into frames."); + this->set_if_decay_corrected(true); + } + std::vector start_times_vector ; + std::vector durations_vector ; + const unsigned int num_frames=time_frame_def.get_num_frames(); + std::vector samples_in_frames_vector(num_frames); + PlasmaData::const_iterator cur_iter; + std::vector::iterator frame_iter=samples_in_frames_vector.begin(); + + // Estimate the plasma_frame_vector and the plasma_frame_sum_vector using the integrate_discrete_function() implementation + for (unsigned int frame_num=1; frame_num<=num_frames && frame_iter!=samples_in_frames_vector.end() ; ++frame_num, ++frame_iter ) + { + std::vector time_frame_vector ; + std::vector plasma_frame_vector ; + std::vector blood_frame_vector ; + const double frame_start_time=time_frame_def.get_start_time(frame_num);//t1 + const double frame_end_time=time_frame_def.get_end_time(frame_num);//t2 + + for(cur_iter=(this->_plasma_blood_plot).begin() ; cur_iter!=(this->_plasma_blood_plot).end() ; ++cur_iter) + { + const double cur_time=(*cur_iter).get_time_in_s() ; + if (cur_timeset_blood_counts_in_kBq( + static_cast(integrate_discrete_function(time_frame_vector,blood_frame_vector)/ + (time_frame_vector[time_frame_vector.size()-1]-time_frame_vector[0]))) ; + frame_iter->set_plasma_counts_in_kBq( + static_cast(integrate_discrete_function(time_frame_vector,plasma_frame_vector)/ + (time_frame_vector[time_frame_vector.size()-1]-time_frame_vector[0]))); + frame_iter->set_time_in_s(0.5*(time_frame_vector[time_frame_vector.size()-1]+time_frame_vector[0])); + start_times_vector.push_back(time_frame_vector[0]); + durations_vector.push_back(time_frame_vector[time_frame_vector.size()-1]-time_frame_vector[0]) ; + } + else if(time_frame_vector.size()==1) + { + frame_iter->set_plasma_counts_in_kBq( static_cast(plasma_frame_vector[0])); + frame_iter->set_blood_counts_in_kBq( static_cast(blood_frame_vector[0])); + frame_iter->set_time_in_s(time_frame_vector[0]); + start_times_vector.push_back(frame_start_time); + durations_vector.push_back(frame_end_time-frame_start_time) ; + } + } + PlasmaData plasma_data_in_frames(samples_in_frames_vector); + TimeFrameDefinitions plasma_fdef(start_times_vector,durations_vector); + plasma_data_in_frames.set_if_decay_corrected(this->_is_decay_corrected); + plasma_data_in_frames.set_isotope_halflife(this->_isotope_halflife); + plasma_data_in_frames.set_time_frame_definitions(plasma_fdef); + + PlasmaData::const_iterator cur_plasma_frame_iter; + + std::cout << "Plasma data after sorted in user-defined time frames.\n"; + std::cout << "Time frame " << "Plasma counts " << "Blood counts \n"; + + for(cur_plasma_frame_iter=plasma_data_in_frames.begin() ; + cur_plasma_frame_iter!=plasma_data_in_frames.end(); ++cur_plasma_frame_iter ) + std::cout << cur_plasma_frame_iter->get_time_in_s() << " " + << cur_plasma_frame_iter->get_plasma_counts_in_kBq() << " " + << cur_plasma_frame_iter->get_blood_counts_in_kBq() << " " + << "\n"; + + std::cout << "\n"; + + //for(cur_plasma_frame_iter=plasma_data_in_frames.begin() ; + // cur_plasma_frame_iter!=plasma_data_in_frames.end(); ++cur_plasma_frame_iter ) + // std::cout << "Current frame blood counts: " << cur_plasma_frame_iter->get_blood_counts_in_kBq() << "\n"; + + //std::cout << "\n"; + + //for(cur_plasma_frame_iter=plasma_data_in_frames.begin() ; + // cur_plasma_frame_iter!=plasma_data_in_frames.end(); ++cur_plasma_frame_iter ) + // std::cout << "Current frame times: " << cur_plasma_frame_iter->get_time_in_s() << "\n"; + + //std::cout << "\n"; + + return plasma_data_in_frames; +} + +//PlasmaData begin() and end() of the PlasmaData ; +PlasmaData::const_iterator +PlasmaData::begin() const +{ return this->_plasma_blood_plot.begin() ; } + +PlasmaData::const_iterator +PlasmaData::end() const +{ return this->_plasma_blood_plot.end() ; } + +unsigned int +PlasmaData::size() const +{ return static_cast(this->_plasma_blood_plot.size()) ; } + +/* +//PlasmaData begin() and end() of the PlasmaData ; +PlasmaData::iterator +PlasmaData::begin() +{ return this->_plasma_blood_plot.begin() ; } + +PlasmaData::iterator +PlasmaData::end() +{ return this->_plasma_blood_plot.end() ; } +*/ + +END_NAMESPACE_STIR diff --git a/src/include/stir/modelling/PlasmaSample.h b/src/include/stir/modelling/PlasmaSample.h new file mode 100644 index 0000000000..31377369ad --- /dev/null +++ b/src/include/stir/modelling/PlasmaSample.h @@ -0,0 +1,84 @@ +// +// +/* + Copyright (C) 2005 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief Declaration of class stir::PlasmaData + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_modelling_PlasmaSample_H__ +#define __stir_modelling_PlasmaSample_H__ + +#include "stir/common.h" +#include +#include + +START_NAMESPACE_STIR + +class PlasmaSample +{ +public: + //! default constructor + inline PlasmaSample(); + + /*! A constructor : constructs a PlasmaSample object \n + \param sample_time is the time in \a seconds relativily to the start of the scan. + \param plasma_sample_counts is the activity of plasma at the sample_time (assumed to be in \a kBq/ml) + \param blood_sample_counts is the activity of blood at the sample_time (assumed to be in \a kBq/ml) + */ + inline PlasmaSample( const double sample_time, const float plasma_sample_counts, const float blood_sample_counts); + + //! default destructor + inline ~PlasmaSample(); + + //! \name Functions to get parameters + //@{ + //! get the time of the sample + inline double get_time_in_s() const; + //! get the blood counts of the sample + inline float get_blood_counts_in_kBq() const; + //! get the plasma counts of the sample + inline float get_plasma_counts_in_kBq() const; + //@} + + //! \name Functions to set parameters + //@{ + //! set the time of the sample + inline void set_time_in_s( const double time ); + //! set the blood counts of the sample + inline void set_blood_counts_in_kBq( const float blood_counts ); + //! set the plasma counts of the sample + inline void set_plasma_counts_in_kBq( const float plasma_counts ); + //@} + + + +private : + float _blood_counts; + float _plasma_counts; + double _time; +}; + +END_NAMESPACE_STIR + +#include "stir/modelling/PlasmaSample.inl" + +#endif //__stir_modelling_PlasmaSample_H__ diff --git a/src/include/stir/modelling/PlasmaSample.inl b/src/include/stir/modelling/PlasmaSample.inl new file mode 100644 index 0000000000..0635e131a0 --- /dev/null +++ b/src/include/stir/modelling/PlasmaSample.inl @@ -0,0 +1,72 @@ +// +// +/* + Copyright (C) 2005 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief Implementations of inline functions of class stir::PlasmaData + + \author Charalampos Tsoumpas + +*/ + +START_NAMESPACE_STIR + + //! default constructor +PlasmaSample::PlasmaSample() +{ } + //! constructor, time in s +PlasmaSample:: +PlasmaSample(const double sample_time, const float plasma_sample_counts, const float blood_sample_counts) +{ + PlasmaSample::set_time_in_s( sample_time ); + PlasmaSample::set_blood_counts_in_kBq( blood_sample_counts ); + PlasmaSample::set_plasma_counts_in_kBq( plasma_sample_counts ); +} + + //! default destructor +PlasmaSample::~PlasmaSample() +{ } + + //! set the time of the sample +void PlasmaSample::set_time_in_s( const double time ) +{ PlasmaSample::_time=time ; } + + //! get the time of the sample +double PlasmaSample::get_time_in_s() const +{ return PlasmaSample::_time ; } + + //! set the blood counts of the sample +void PlasmaSample::set_blood_counts_in_kBq( const float blood_counts ) +{ PlasmaSample::_blood_counts=blood_counts ; } + + //! get the blood counts of the sample +float PlasmaSample::get_blood_counts_in_kBq() const +{ return PlasmaSample::_blood_counts ; } + + //! get the plasma counts of the sample +void PlasmaSample::set_plasma_counts_in_kBq( const float plasma_counts ) +{ PlasmaSample::_plasma_counts=plasma_counts ; } + + //! get the plasma counts of the sample +float PlasmaSample::get_plasma_counts_in_kBq() const +{ return PlasmaSample::_plasma_counts ; } + + + +END_NAMESPACE_STIR diff --git a/src/include/stir/modulo.h b/src/include/stir/modulo.h new file mode 100644 index 0000000000..c809d318be --- /dev/null +++ b/src/include/stir/modulo.h @@ -0,0 +1,161 @@ +// +// +#ifndef __stir_modulo_H__ +#define __stir_modulo_H__ + +/*! + \file + \ingroup buildblock + \brief defines stir::modulo() and related functions + + \author Kris Thielemans + + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +/*! \ingroup buildblock + \name Functions for modulo computations +*/ +//@{ + +//! Like std::fmod() but with guaranteed nonnegative result +/*! + std::fmod(a,b) return a number of the same sign as \a a. This is often + inconvenient as the result of this is that the range of std::fmod(a,b) is + from \a -fabs(b) to \a +fabs(b). + + In contrast, modulo(a,b) always returns a nonnegative result. To be precise: + + \c modulo(a,b) returns the value \c a-i*b, for the integer \c i + such that, if \c b is nonzero, the result is greater or equal to 0 and + less than the magnitude of \c b. + + Error handling (i.e. \a b=0) is as for std::fmod(). + + \warning When assigning the result to a float, the implied rounding might + give you float which is (a tiny bit) larger than fabs(b). + +*/ +inline +double +modulo(const double a, const double b) +{ + const double res = fmod(a,b); + return res<0 ? res + fabs(b) : res; +} + +//! modulo for floats +/*! + \see modulo(double,double) + The reason for this function is that rounding from double to float + might make the result of the calculation with doubles larger than b. + + \warning Because of C++ promotion of floats to doubles, it is + very easy to call the modulo(double,double) version inadvertently. + So, you should probably not rely too much on the result being less than + \a b. +*/ +inline +float +modulo(const float a, const float b) +{ + float res = + static_cast(modulo(static_cast(a),static_cast(b))); + assert(res>=0); + const float abs_b = b>=0 ? b : -b; + if (res>=abs_b) res -= abs_b; + assert(res>=0); + return res; +} + +//! Like the normal modulus operator (%) but with guaranteed nonnegative result +/*! + Result will be larger than or equal to 0, and (strictly) smaller than + \a abs(b). +*/ +inline +int +modulo(const int a, const int b) +{ + const int res = a%b; + const int res2 = res<0 ? res + (b>=0 ? b : -b) : res; + assert(res2>=0); + assert(res2<(b>=0?b:-b)); + return res2; +} + +//! Performs the modulus operation on each element of the coordinates +/*! + \return A BasicCoordinate such that for all d + \code result[d] = modulo(a[d], b[d] \endcode +*/ +template +inline +BasicCoordinate +modulo(const BasicCoordinate& a, const BasicCoordinate& b) +{ + BasicCoordinate result; + for (int d=1; d<=num_dimensions; ++d) + result[d] = modulo(a[d], b[d]); + return result; +} + +//! A function to convert an angle from one range to another +/*! + This is mainly useful for converting results from e.g. std::atan2 to + a range \f$[0,2\pi)\f$. +*/ +template +inline +FloatOrDouble +from_min_pi_plus_pi_to_0_2pi(const FloatOrDouble phi) +{ + static const FloatOrDouble two_pi =static_cast(2*_PI); + assert(phi>= -two_pi); + assert(phi< two_pi); + if (phi>=0) + return phi; + FloatOrDouble res = phi+two_pi; + // due to floating point finite precision, the following check is needed... + if (res>=two_pi) + res -= two_pi; + assert(res>=0); + assert(resmodulo(phi, static_cast(2*_PI)) */ +template +inline +FloatOrDouble +to_0_2pi(const FloatOrDouble phi) +{ + return modulo(phi, static_cast(2*_PI)); +} + +//@} + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/more_algorithms.h b/src/include/stir/more_algorithms.h new file mode 100644 index 0000000000..58270acb49 --- /dev/null +++ b/src/include/stir/more_algorithms.h @@ -0,0 +1,92 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_more_algorithms_H__ +#define __stir_more_algorithms_H__ +/*! + \file + \ingroup buildblock + + \brief Declaration of some functions missing from std::algorithm + + \author Kris Thielemans + +*/ +#include "stir/common.h" +#include + +START_NAMESPACE_STIR + +/*! \ingroup buildblock + \brief Like std::max_element, but comparing after taking absolute value + + This function using stir::norm_squared(), so works for complex numbers as well. +*/ +template +inline +iterT abs_max_element(iterT start, iterT end); + +/*! + \ingroup buildblock + \brief Compute the sum of a sequence using operator+=(), using an initial value. + + Sadly std::accumulate uses operator+(). For non-trivial objects, + this might call an inefficient version for the addition. + As an alternative, std::accumulate could be called with a function object + that calls operator+=. +*/ +template +inline +elemT +sum(IterT start, IterT end, elemT init); + +/*! + \ingroup buildblock + \brief Compute the sum of a sequence using operator+=(). + + Sadly std::accumulate uses operator+(). For non-trivial objects, + this might call an inefficient version for the addition. + Alternatively, std::accumulate could be called with a function object + that calls operator+=. Still, in that case you need to specify an + initial value. + + If the range is empty, this function calls operator*=(0) to initialise the object to 0. + + \warning Currently, no work-around is present for old compilers that do not support + std::iterator_traits. +*/ +template +inline +typename std::iterator_traits::value_type +sum(IterT start, IterT end); + +/*! + \ingroup buildblock + \brief Compute the average of a sequence using sum(start,end). + \warning Currently, no work-around is present for old compilers that do not support + std::iterator_traits. +*/ +template +inline +typename std::iterator_traits::value_type +average(IterT start, IterT end); + +END_NAMESPACE_STIR + +#include "stir/more_algorithms.inl" +#endif diff --git a/src/include/stir/more_algorithms.inl b/src/include/stir/more_algorithms.inl new file mode 100644 index 0000000000..de17be4cf1 --- /dev/null +++ b/src/include/stir/more_algorithms.inl @@ -0,0 +1,93 @@ +// +// +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + + \brief Implementation of some functions missing from std::algorithm + + \author Kris Thielemans + +*/ +// not nice to have a dependency in buildblock on numerics/norm, but +// we'll bother with that when necessary. +#include "stir/numerics/norm.h" + +START_NAMESPACE_STIR + +template +iterT abs_max_element(iterT start, iterT end) +{ + if (start == end) + return start; + iterT current_max_iter=start; + double current_max=norm_squared(*start); + iterT iter=start; ++iter; + + while(iter != end) + { + const double n=norm_squared(*iter); + if (n>current_max) + { + current_max=n; current_max_iter=iter; + } + ++iter; + } + return current_max_iter; +} + +template +inline +elemT +sum(IterT start, IterT end, elemT init) +{ + elemT tmp = init; + for (IterT iter=start; iter!=end; ++iter) + tmp += *iter; + return tmp; +} + +template +inline +typename std::iterator_traits::value_type +sum(IterT start, IterT end) +{ + if (start==end) + { + typename std::iterator_traits::value_type tmp; + tmp *= 0; + return tmp; + } + return sum(start+1,end,*start); +} + +template +inline +typename std::iterator_traits::value_type +average(IterT start, IterT end) +{ + typename std::iterator_traits::value_type tmp = + sum(start, end); + tmp /= (end - start); + return tmp; +} + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/numerics/BSplines.h b/src/include/stir/numerics/BSplines.h new file mode 100644 index 0000000000..adfa6653ce --- /dev/null +++ b/src/include/stir/numerics/BSplines.h @@ -0,0 +1,86 @@ +/* + Copyright (C) 2005 - 2009-10-27, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_numerics_BSplines__H__ +#define __stir_numerics_BSplines__H__ + +/*! +\file +\ingroup BSpline +\brief Implementation of the basic components and declarations for B-Splines Interpolation + +\author Charalampos Tsoumpas +\author Kris Thielemans +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +namespace BSpline { + + /*! \brief The type used for relative positions between the grid points. + \ingroup BSpline + */ + typedef double pos_type; + + /*! \brief enum providing constants to define the type of B-Spline used for interpolation + \ingroup BSpline + */ + enum BSplineType + {near_n, linear, quadratic, cubic, quartic, quintic, oMoms} ; + + /*! \brief compute BSpline coefficients that gives the BSpline that interpolates the given data + \internal + \ingroup BSpline + You should never have to use this function yourself. + */ + template + inline + void + BSplines_coef(RandIterOut c_begin_iterator, + RandIterOut c_end_iterator, + IterT input_begin_iterator, + IterT input_end_iterator, + const constantsT z1, const constantsT z2, const constantsT lambda); // to be taken from the class + + /*! \brief return value of the first derivative of the spline + \ingroup BSpline + */ + template + inline + pos_type + BSplines_1st_der_weight(const pos_type relative_position, const BSplineType spline_type) ; + + /*! \brief return spline value + \ingroup BSpline + */ + template + inline + pos_type + BSplines_weights(const pos_type relative_position, const BSplineType spline_type); + + + //*/ +} // end BSpline namespace + +END_NAMESPACE_STIR + +#include "stir/numerics/BSplines_weights.inl" +#include "stir/numerics/BSplines_coef.inl" + +#endif diff --git a/src/include/stir/numerics/BSplines1DRegularGrid.h b/src/include/stir/numerics/BSplines1DRegularGrid.h new file mode 100644 index 0000000000..40eddfc18c --- /dev/null +++ b/src/include/stir/numerics/BSplines1DRegularGrid.h @@ -0,0 +1,141 @@ +/* + Copyright (C) 2005 - 2009-10-27, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_numerics_BSplines1DRegularGrid__H__ +#define __stir_numerics_BSplines1DRegularGrid__H__ + +/*! +\file +\ingroup BSpline +\brief Implementation of the B-Splines Interpolation + +\author Charalampos Tsoumpas +\author Kris Thielemans +*/ + +#include "stir/numerics/BSplines.h" +#include + +START_NAMESPACE_STIR + +namespace BSpline +{ + + /*! \ingroup BSpline + \brief Temporary class for 1D B-splines + + This class works with std::vector objects, while BSplinesRegularGrid works with + stir::Array objects. + \todo remove overlap with the n-dimensional version BSplinesRegularGrid + */ + template + class BSplines1DRegularGrid + { + private: + typedef typename std::vector::iterator RandIterOut; + int input_size; // create in the constructor + constantsT z1; + constantsT z2; + constantsT lambda; + + + inline + out_elemT + BSplines_product(const int index, const pos_type relative_position, const bool if_deriv) const; + + inline + void + set_private_values(BSplineType); + + inline + out_elemT + compute_BSplines_value(const pos_type relative_position, const bool if_deriv) const; + + // sadly,VC6.0 needs definition of template members in the class definition + template + inline + void + set_coef(IterT input_begin_iterator, IterT input_end_iterator) + { + BSplines1DRegularGrid::input_size = static_cast(input_end_iterator - input_begin_iterator); + BSplines_coef_vector.resize(input_size); + BSplines_coef(BSplines_coef_vector.begin(),BSplines_coef_vector.end(), + input_begin_iterator, input_end_iterator, z1, z2, lambda); + } + + public: + std::vector BSplines_coef_vector; + BSplineType spline_type; + + + //! default constructor: no input + inline BSplines1DRegularGrid(); + + //! constructor given a vector as an input, estimates the Coefficients + inline explicit BSplines1DRegularGrid(const std::vector & input_vector); + + //! constructor given a begin_ and end_ iterator as input, estimates the Coefficients + template + inline BSplines1DRegularGrid(const IterT input_begin_iterator, + const IterT input_end_iterator) + { + set_private_values(cubic); + set_coef(input_begin_iterator, input_end_iterator); + } + //! constructor given a begin_ and end_ iterator as input, estimates the Coefficients + template + inline BSplines1DRegularGrid(const IterT input_begin_iterator, + const IterT input_end_iterator, const BSplineType this_type) + { + set_private_values(this_type); + set_coef(input_begin_iterator, input_end_iterator); + } + + inline + BSplines1DRegularGrid(const std::vector & input_vector, const BSplineType this_type); + + //! destructor + inline ~BSplines1DRegularGrid(); + + inline + out_elemT + BSplines(const pos_type relative_position) const; + + inline + out_elemT + BSplines_1st_der(const pos_type relative_position) const; + + //! same as BSplines() + inline + const out_elemT + operator() (const pos_type relative_position) const; + + inline + const std::vector + BSplines_output_sequence(RandIterOut output_relative_position_begin_iterator, //relative_position might be better float + RandIterOut output_relative_position_end_iterator); + inline + const std::vector + BSplines_output_sequence(std::vector output_relative_position); + }; +} // end BSpline namespace + +END_NAMESPACE_STIR + +#include "stir/numerics/BSplines1DRegularGrid.inl" + +#endif diff --git a/src/include/stir/numerics/BSplines1DRegularGrid.inl b/src/include/stir/numerics/BSplines1DRegularGrid.inl new file mode 100644 index 0000000000..abcccaf9be --- /dev/null +++ b/src/include/stir/numerics/BSplines1DRegularGrid.inl @@ -0,0 +1,199 @@ +/* + Copyright (C) 2005 - 2009-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup BSpline + \brief Implementation of the B-Splines Interpolation + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ + +#include "stir/numerics/BSplinesDetail.inl" +#include "stir/assign.h" +START_NAMESPACE_STIR + +namespace BSpline { + + template + BSplines1DRegularGrid:: + BSplines1DRegularGrid() + { } + + template + BSplines1DRegularGrid:: + BSplines1DRegularGrid(const std::vector & input_vector) + { + set_private_values(cubic); + set_coef(input_vector.begin(), input_vector.end()); + } + ///* + template + BSplines1DRegularGrid:: + BSplines1DRegularGrid(const std::vector & input_vector, const BSplineType this_type) + { + set_private_values(this_type); + set_coef(input_vector.begin(), input_vector.end()); + } + + template + BSplines1DRegularGrid:: + ~BSplines1DRegularGrid() + {} + + template + void + BSplines1DRegularGrid:: + set_private_values(BSplineType this_type) + { + this->spline_type = this_type; + detail::set_BSpline_values(this->z1,this->z2,this->lambda,this_type); + } + +#if 0 + // needs to be in .h for VC 6.0 + template + void + BSplines1DRegularGrid:: + set_coef(RandIterIn input_begin_iterator, RandIterIn input_end_iterator) + { + input_size = input_end_iterator - input_begin_iterator; + for(int i=0; i(BSplines_coef_vector.size()-2)); + } +#endif + + template + out_elemT + BSplines1DRegularGrid:: + compute_BSplines_value(const pos_type relative_position, const bool if_deriv) const + { + assert(relative_position>-input_size+2); + assert(relative_position<2*input_size-4); + out_elemT BSplines_value; + assign(BSplines_value,0); + const int int_pos =(int)floor(relative_position); +#if 0 + for (int k=int_pos-2; k=input_size) index=2*input_size-2-k; + else index = k; + assert(0<=index && index + out_elemT + BSplines1DRegularGrid:: + BSplines(const pos_type relative_position) const + { + return compute_BSplines_value(relative_position, false); + } + + template + out_elemT + BSplines1DRegularGrid:: + BSplines_1st_der(const pos_type relative_position) const + { + return compute_BSplines_value(relative_position, true); + } + + template + out_elemT + BSplines1DRegularGrid:: + BSplines_product(const int index, const pos_type relative_position, const bool if_deriv) const + { + if (if_deriv==true) + return BSplines_coef_vector[index]*BSplines_1st_der_weight(relative_position, spline_type); + else + return BSplines_coef_vector[index]*BSplines_weights(relative_position,spline_type); + } + + template + const out_elemT BSplines1DRegularGrid:: + operator() (const pos_type relative_position) const + { + return BSplines1DRegularGrid:: + BSplines(relative_position); + } + + //* + template + const std::vector BSplines1DRegularGrid:: + BSplines_output_sequence(RandIterOut output_relative_position_begin_iterator, //relative_position might be better float + RandIterOut output_relative_position_end_iterator) + { + std::vector output_vector(output_relative_position_end_iterator- + output_relative_position_begin_iterator); + + for(RandIterOut current_iterator=output_vector.begin(), + current_relative_position_iterator=output_relative_position_begin_iterator; + current_iterator!=output_vector.end() && + current_relative_position_iterator!=output_relative_position_end_iterator; + ++current_iterator,++current_relative_position_iterator) + *current_iterator = BSplines1DRegularGrid:: + BSplines(*current_relative_position_iterator); + + return output_vector; + } + template + const std::vector BSplines1DRegularGrid:: + BSplines_output_sequence(std::vector output_relative_position) + { + return BSplines_output_sequence(output_relative_position.begin(), + output_relative_position.end()); + } + +} // end BSpline namespace + +END_NAMESPACE_STIR + diff --git a/src/include/stir/numerics/BSplinesDetail.inl b/src/include/stir/numerics/BSplinesDetail.inl new file mode 100644 index 0000000000..3a56e168fe --- /dev/null +++ b/src/include/stir/numerics/BSplinesDetail.inl @@ -0,0 +1,353 @@ +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_buildblock + \brief Implementation of the B-Splines Interpolation + + \author Kris Thielemans + \author Charalampos Tsoumpas +*/ +#include "stir/assign.h" + +START_NAMESPACE_STIR + +namespace BSpline { + ///// implementation functions Out Of the Class //////// + namespace detail { + template + static inline void + set_BSpline_values(constantsT& z1, constantsT& z2, constantsT& lambda, + const BSplineType spline_type) + { + switch(spline_type) + { + case near_n: + z1=static_cast(0); + z2=static_cast(0); + break; + case linear: + z1=static_cast(0); + z2=static_cast(0); + break; + case quadratic: + z1 = static_cast(sqrt(8.)-3); + z2=static_cast(0); + break; + case cubic: + z1 = static_cast(sqrt(3.)-2); + z2=static_cast(0); + break; + case quartic: + z1 = static_cast(sqrt(664.-sqrt(438976.))+sqrt(304.)-19.); + z2 = static_cast(sqrt(664.-sqrt(438976.))-sqrt(304.)-19.); + break; + case quintic: + z1 = static_cast(0.5*(sqrt(270.-sqrt(70980.))+sqrt(105.)-13.)); + z2 = static_cast(0.5*(sqrt(270.-sqrt(70980.))-sqrt(105.)-13.)); + break; + case oMoms: + z1 = static_cast((sqrt(105.)-13.)/8.); + z2 = static_cast(0); + break; + } + lambda = static_cast((1.-z1)*(1. - (1./z1))); + if (z2!=static_cast(0)) + lambda *= static_cast((1.-z2)*(1. - (1./z2))); + } + + + // 1d specialisation + template + void + set_coef(Array<1, out_elemT>& coeffs, const Array<1, in_elemT>& input, + const BasicCoordinate<1,constantsT>& z1s, + const BasicCoordinate<1,constantsT>& z2s, + const BasicCoordinate<1,constantsT>& lambdas) + { + BSplines_coef(coeffs.begin(), coeffs.end(), + input.begin(), input.end(), z1s[1], z2s[1], lambdas[1]); + } + + template + void + set_coef(Array& coeffs, + const Array& input, + const BasicCoordinate& z1s, + const BasicCoordinate& z2s, + const BasicCoordinate& lambdas) + { + Array temp ( input.get_index_range()); + BSplines_coef(temp.begin(),temp.end(), + input.begin(), input.end(), z1s[1], z2s[1], lambdas[1]); + + for (int i=coeffs.get_min_index(); i<=coeffs.get_max_index(); ++i) + { + set_coef(coeffs[i], + temp[i], + cut_first_dimension(z1s), + cut_first_dimension(z2s), + cut_first_dimension(lambdas)); + } + } + +#if 0 + template + struct BW + { + typedef pos_type result_type; + pos_type operator()(const pos_type p, const BSplineType type) + { + return BSplines_weights(p, type); + } + }; + + template + struct Bder + { + typedef pos_type result_type; + pos_type operator()(const pos_type p, const BSplineType type) + { + return BSplines_1st_der_weight(p, type); + } + }; +#else + template + struct BW + { + typedef pos_type result_type; + pos_type operator()(const pos_type pos, int piece, const PieceWiseFunction& f) + { + return f.function_piece(pos, piece); + } + }; + + template + struct Bder + { + typedef pos_type result_type; + pos_type operator()(const pos_type pos, int piece, const PieceWiseFunction& f) + { + return f.derivative_piece(pos, piece); + } + }; +#endif + + // TODO later + /* + get_value could be used normally to say get_value(coeffs,index) == coeffs[index], + but would allows to use e.g. periodic boundary conditions or extrapolation + */ + template + inline + typename SplineFunctionT::result_type + spline_convolution(const Array& coeffs, + const BasicCoordinate& relative_positions, + const BasicCoordinate& spline_types, + FunctionT f, + SplineFunctionT g) + { + const int current_dimension = num_dimensions2 - num_dimensions + 1; + const PieceWiseFunction& bspline = + bspline_function(spline_types[current_dimension]); + + typename SplineFunctionT::result_type value; + assign(value,0); + const int kmin= static_cast(std::ceil(relative_positions[current_dimension]-bspline.kernel_length_right())); + const int kmax=kmin+bspline.kernel_total_length()-1; + int k=kmin; + pos_type current_pos=relative_positions[current_dimension]-k; + #define NNN +#ifdef NNN + // TODO doesn't work yet when relative_position is an integer: kmin then becomes highest_piece+1 + //int p=bspline.find_highest_piece(); + //assert(p == bspline.find_piece(current_pos)); + int p=bspline.find_piece(current_pos); +#define DECR_P , --p +#else +#define DECR_P +#endif + for (; k<=kmax; ++k, --current_pos DECR_P) + { + int index; + if (kcoeffs.get_max_index()) index=2*coeffs.get_max_index()-k; + else index = k; + assert(coeffs.get_min_index()<=index && index<=coeffs.get_max_index()); + value += static_cast( + g(coeffs[index], relative_positions, spline_types) * +#ifdef NNN + f(current_pos, p, bspline) +#else + f(current_pos, spline_types[current_dimension]) +#endif + ); + } + return value ; + } + + template + inline + T + spline_convolution(const Array<1, T>& coeffs, + const BasicCoordinate& relative_positions, + const BasicCoordinate& spline_types, + FunctionT f) + { + const int current_dimension = num_dimensions2; + const PieceWiseFunction& bspline = + bspline_function(spline_types[current_dimension]); + T value; + assign(value,0); + //x-1.5(std::ceil(relative_positions[current_dimension]-bspline.kernel_length_right())); + const int kmax=kmin+bspline.kernel_total_length()-1; + int k=kmin; + pos_type current_pos=relative_positions[current_dimension]-k; +#ifdef NNN + // TODO doesn't work yet when relative_position is an integer: kmin then becomes highest_piece+1 + //int p=bspline.find_highest_piece(); + //assert(p == bspline.find_piece(current_pos)); + int p=bspline.find_piece(current_pos); +#define DECR_P , --p +#else +#define DECR_P +#endif + for (; k<=kmax; ++k, --current_pos DECR_P) + { + int index; + if (kcoeffs.get_max_index()) index=2*coeffs.get_max_index()-k; + else index = k; + assert(coeffs.get_min_index()<=index && index<=coeffs.get_max_index()); + value += + static_cast( + coeffs[index] * +#ifdef NNN + f(current_pos, p, bspline) + // bspline.function_piece(current_pos, p) +#else + f(current_pos, spline_types[current_dimension]) +#endif + ); + } + return value ; + } + + template + struct + compute_BSplines_value + { + typedef T result_type; + T operator()(const Array& coeffs, + const BasicCoordinate& relative_positions, + const BasicCoordinate& spline_types) const + { + return + spline_convolution(coeffs, relative_positions, spline_types, + BW(), + //BSplineFunction(), + compute_BSplines_value()); + } + }; + +#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) +#define T float + template <> +#else + template +#endif + struct + compute_BSplines_value<1, num_dimensions2,T> + { + typedef T result_type; + T operator()(const Array<1, T>& coeffs, + const BasicCoordinate& relative_positions, + const BasicCoordinate& spline_types) const + { + return + spline_convolution(coeffs, relative_positions, spline_types, + BW() + //BSplineFunction() + ); + } + }; +#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) +#undef T +#endif + + template + struct + compute_BSplines_gradient + { + typedef BasicCoordinate result_type; + + BasicCoordinate + operator()(const Array& coeffs, + const BasicCoordinate& relative_positions, + const BasicCoordinate& spline_types) const + { + const T first_value = + spline_convolution(coeffs, relative_positions, spline_types, + Bder(), + //BSplineFunction(), + compute_BSplines_value()); + const BasicCoordinate rest_value = + spline_convolution(coeffs, relative_positions, spline_types, + BW(), + //BSplineFunction(), + compute_BSplines_gradient()); + return join(first_value, rest_value); + } + }; + +#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) +#define T float + template <> +#else + template +#endif + struct + compute_BSplines_gradient<1,num_dimensions2,T> + { + typedef BasicCoordinate<1,T> result_type; + + BasicCoordinate<1,T> + operator()(const Array<1, T>& coeffs, + const BasicCoordinate& relative_positions, + const BasicCoordinate& spline_types) const + { + BasicCoordinate<1,T> result; + result[1] = + spline_convolution(coeffs, relative_positions, spline_types, + Bder() + //BSplineFunction() + ); + return result; + } + }; +#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) +#undef T +#endif + + + +} // end of namespace detail +} // end of namespace BSpline + +END_NAMESPACE_STIR diff --git a/src/include/stir/numerics/BSplinesRegularGrid.h b/src/include/stir/numerics/BSplinesRegularGrid.h new file mode 100644 index 0000000000..4b9a4856f0 --- /dev/null +++ b/src/include/stir/numerics/BSplinesRegularGrid.h @@ -0,0 +1,172 @@ +/* + Copyright (C) 2005 - 2009-10-27, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_numerics_BSplinesRegularGrid__H__ +#define __stir_numerics_BSplinesRegularGrid__H__ +/*! + \file + \ingroup BSpline + \brief Implementation of the n-dimensional B-Splines Interpolation + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ + +#include "stir/Array.h" +#include "stir/BasicCoordinate.h" +#include "stir/numerics/BSplines.h" +START_NAMESPACE_STIR + +namespace BSpline { + + /*! \ingroup BSpline + \brief A class for n-dimensional BSpline interpolation when the input samples + are on a regular grid. + + This class provides essentially an n-dimensional function, so can be used as a function object. + + \par Example + \code + Array<3,float> some_data = ....; + + BSplinesRegularGrid<3, float> interpolator(cubic); + + interpolator.set_coef(some_data); + + Coordinate3D position(1.2, 3.4, 5.6); + + float value = interpolator(position); + \endcode + + \warning The implementation currently uses mirror boundary conditions. This means you + can ask for values of the interpolator outside the original grid, but the results + might not be what you expect. + */ + template + class BSplinesRegularGrid + { + + public: + // only there for tests + Array get_coefficients() const + { return this->_coeffs; } + + + + //! constructor given an array of samples and the spline type + inline + explicit + BSplinesRegularGrid(const Array & input, + const BSplineType & this_type = cubic) + { + this->set_private_values(this_type); + this->set_coef(input); + } + + //! constructor given an array of samples and a different spline type for every dimension + inline + BSplinesRegularGrid(const Array & input, + const BasicCoordinate & this_type) + { + this->set_private_values(this_type); + this->set_coef(input); + } + + //! constructor that only sets the spline type + /*! You need to call set_coef() first before you will get a sensible result.*/ + inline + explicit + BSplinesRegularGrid( + const BSplineType & this_type = cubic) + { + this->set_private_values(this_type); + } + + //! constructor that only sets a different spline type for every dimension + /*! You need to call set_coef() first before you will get a sensible result.*/ + inline + explicit + BSplinesRegularGrid(const BasicCoordinate & this_type) + { + this->set_private_values(this_type); + } + + //! destructor + inline ~BSplinesRegularGrid(); + + //! Compute the coefficients for the B-splines from an array of samples. + /*! When the order of the spline is larger than 1, the coefficients multiplying + the basic splines are not equal to the samples. This variable stores them + for further use. + \todo rename + */ + inline + void + set_coef(const Array & input); + + //! Compute value of the interpolator + /*! \param relative_positions + A coordinate with respect to the original grid coordinates as used by the + input array. In particular, if the input array was not 0-based, your + \c relative_positions should not be either. + \return the interpolated value. + + + \todo should probably be templated in pos_type. + */ + inline + const out_elemT + operator() (const BasicCoordinate& relative_positions) const; + + //! Compute gradient of the interpolator + /*! \param relative_positions + A coordinate with respect to the original grid coordinates as used by the + input array. In particular, if the input array was not 0-based, your + \c relative_positions should not be either. + \return the gradient + + \todo should probably be templated in pos_type. + */ + inline + const BasicCoordinate + gradient(const BasicCoordinate& relative_positions) const; + + private: + + // variables that store numbers for the spline type + // TODO these coefficients and the spline type could/should be integrated into 1 class + BasicCoordinate _spline_types; + BasicCoordinate _z1s; + BasicCoordinate _z2s; + BasicCoordinate _lambdas; + //! coefficients for B-splines + Array _coeffs; + + inline void + set_private_values(const BasicCoordinate & this_type); + inline void + set_private_values(const BSplineType & this_type); + + }; + +} // end BSpline namespace + +END_NAMESPACE_STIR + +#include "stir/numerics/BSplinesRegularGrid.inl" + +#endif diff --git a/src/include/stir/numerics/BSplinesRegularGrid.inl b/src/include/stir/numerics/BSplinesRegularGrid.inl new file mode 100644 index 0000000000..e921873f5e --- /dev/null +++ b/src/include/stir/numerics/BSplinesRegularGrid.inl @@ -0,0 +1,86 @@ +/* + Copyright (C) 2005 - 2009-10-08, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_buildblock + \brief Implementation of the B-Splines Interpolation + + \author Kris Thielemans + \author Charalampos Tsoumpas +*/ + +#include "stir/numerics/BSplinesDetail.inl" +START_NAMESPACE_STIR + +namespace BSpline { + + +template +BSplinesRegularGrid:: +~BSplinesRegularGrid() +{} + + template + void BSplinesRegularGrid:: + set_private_values(const BasicCoordinate & this_type) + { + this->_spline_types = this_type; + for ( int i = 1 ; i<=num_dimensions; ++i) + detail::set_BSpline_values(this->_z1s[i],this->_z2s[i],this->_lambdas[i],this_type[i]); + } + + template + void BSplinesRegularGrid:: + set_private_values(const BSplineType & this_type) + { + for ( int i = 1 ; i<=num_dimensions; ++i) + { + this->_spline_types[i] = this_type; + detail::set_BSpline_values(this->_z1s[i],this->_z2s[i],this->_lambdas[i],this_type); + } + } + + template + void BSplinesRegularGrid :: + set_coef(const Array & input) + { + this->_coeffs = Array(input.get_index_range()); + detail::set_coef(this->_coeffs, input, this->_z1s, this->_z2s, this->_lambdas); + } + + + template + const out_elemT + BSplinesRegularGrid:: + operator() (const BasicCoordinate& relative_positions) const + { + return detail::compute_BSplines_value()(this->_coeffs, relative_positions, this->_spline_types); + } + + template + const BasicCoordinate + BSplinesRegularGrid:: + gradient(const BasicCoordinate& relative_positions) const + { + return detail::compute_BSplines_gradient()(this->_coeffs, relative_positions, this->_spline_types); + } + +} // end of namespace BSpline + +END_NAMESPACE_STIR + diff --git a/src/include/stir/numerics/BSplines_coef.inl b/src/include/stir/numerics/BSplines_coef.inl new file mode 100644 index 0000000000..10a32e1b3c --- /dev/null +++ b/src/include/stir/numerics/BSplines_coef.inl @@ -0,0 +1,143 @@ +/* + Copyright (C) 2005-2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup BSpline + \brief Implementation of the (cubic) B-Splines Interpolation + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ + +#include "stir/modulo.h" +#include "stir/assign.h" +#include "stir/numerics/IR_filters.h" +START_NAMESPACE_STIR + +namespace BSpline { + + namespace detail + { + template + inline +#if defined(_MSC_VER) && _MSC_VER<=1300 + float +#else + typename std::iterator_traits::value_type +#endif + cplus0(const IterT input_begin_iterator, + const IterT input_end_iterator, + const constantsT z1, const constantsT precision, const bool periodicity) + { +#if defined(_MSC_VER) && _MSC_VER<=1300 + typedef float out_elemT; +#else + typedef typename std::iterator_traits::value_type out_elemT; +#endif + + const int input_size = static_cast(input_end_iterator - input_begin_iterator); + // assert(input_size>BSplines_coef_vector.size()); + out_elemT sum=*input_begin_iterator; + for(int i=1; + i<(int)ceil(log(precision)/log(fabs(z1))) && i<=2*input_size-3; + ++i) + { + int index = i; + if (periodicity==0 && i >= input_size) + index = 2*input_size-2-i; + sum += static_cast(*(input_begin_iterator+index)*pow(z1,i)); + } + //if (periodicity==1) + + return static_cast(sum/(1-pow(z1,2*input_size-2))); + } + } // end of namespace detail + + template + void + BSplines_coef(RandIterOut c_begin_iterator, + RandIterOut c_end_iterator, + IterT input_begin_iterator, + IterT input_end_iterator, + const constantsT z1, const constantsT z2, const constantsT lamda) + { + +#if defined(_MSC_VER) && _MSC_VER<=1300 + typedef float out_elemT; + // typedef float in_elemT; + //typedef typename _Val_Type(c_begin_iterator) out_elemT; + //typedef typename _Val_Type(c_begin_iterator) in_elemT; +#else + typedef typename std::iterator_traits::value_type out_elemT; + // typedef typename std::iterator_traits::value_type in_elemT; +#endif + + /* + cplus(c_end_iterator-c_begin_iterator, 0) + cminus(c_end_iterator-c_begin_iterator, 0), + */ + //const int input_size = c_end_iterator-c_begin_iterator ; //-1; //!!! + + if (z1==0 && z2==0) //Linear and Nearest Neighbour coefficients are the same to the input data + { + IterT current_input_iterator = input_begin_iterator; + for(RandIterOut current_iterator=c_begin_iterator; + current_iterator!=c_end_iterator && current_input_iterator!=input_end_iterator; + ++current_iterator,++current_input_iterator) + *current_iterator= (out_elemT)(*current_input_iterator); + + // copy(input_begin_iterator, input_end_iterator, c_begin_iterator); + } + else + { + typedef std::vector c_vector_type; + c_vector_type cplus(c_end_iterator-c_begin_iterator), + cminus(c_end_iterator-c_begin_iterator); + std::vector + input_factor_for_cminus(1, -z1), pole_for_cplus(1, -z1), pole_for_cminus(1,-z1); + assign(cplus,0); + assign(cminus,0); + std::vector input_factor_for_cplus(1, (constantsT)1); + + *(cplus.begin())=detail::cplus0( + input_begin_iterator,input_end_iterator, z1,static_cast(.00001),0); //k or Nmax_precision + + IIR_filter(cplus.begin(), cplus.end(), + input_begin_iterator, input_end_iterator, + input_factor_for_cplus.begin(), input_factor_for_cplus.end(), + pole_for_cplus.begin(), pole_for_cplus.end(), 1); + + *(cminus.end()-1) = static_cast((*(cplus.end()-1) + (*(cplus.end()-2))*z1)*z1/(z1*z1-1)); + IIR_filter(cminus.rbegin(), cminus.rend(), + cplus.rbegin(), cplus.rend(), + input_factor_for_cminus.begin(), input_factor_for_cminus.end(), + pole_for_cminus.begin(), pole_for_cminus.end(), 1); + + RandIterOut current_iterator=c_begin_iterator; + typename c_vector_type::const_iterator current_cminus_iterator=cminus.begin(); + for(; + current_iterator!=c_end_iterator && current_cminus_iterator!=cminus.end(); + ++current_iterator,++current_cminus_iterator) + { + *current_iterator=static_cast(*current_cminus_iterator*lamda); + } + } + } + +} // end BSpline namespace + +END_NAMESPACE_STIR diff --git a/src/include/stir/numerics/BSplines_weights.inl b/src/include/stir/numerics/BSplines_weights.inl new file mode 100644 index 0000000000..ac79587173 --- /dev/null +++ b/src/include/stir/numerics/BSplines_weights.inl @@ -0,0 +1,482 @@ +// +// +/* + Copyright (C) 2005 - 2009-10-27, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup BSpline + \brief Implementation of the B-Splines Interpolation + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + + +START_NAMESPACE_STIR +namespace BSpline +{ + + template + class PieceWiseFunction + { + public: + typedef posT result_type; + + virtual ~PieceWiseFunction() {} + + virtual posT kernel_length_left() const = 0; + virtual int kernel_total_length() const = 0; + posT kernel_length_right() const + { return -this->kernel_length_left() + this->kernel_total_length(); } + + virtual posT function_piece(const posT x, int p) const = 0; + virtual posT derivative_piece(const posT x, int p) const = 0; + virtual int find_piece(const posT x) const = 0; + virtual int find_highest_piece() const = 0; + posT function(const posT x) const + { + return this->function_piece(x, find_piece(x)); + } + posT derivative(const posT x) const + { + return this->derivative_piece(x, find_piece(x)); + } + posT operator()(const posT x) const + { + return this->function(x); + } + posT operator()(const posT p, const BSplineType) + { + return this->function(p); + } + + }; + + template + class BSplineFunction : public PieceWiseFunction + {}; + + template + class BSplineFunction: public PieceWiseFunction + { + public: + BSplineFunction() {} + posT kernel_length_left() const { return static_cast(.5); } + BOOST_STATIC_CONSTANT(int, kernel_total_length_value=1); + int kernel_total_length() const { return kernel_total_length_value; } + posT function_piece(const posT x, int p) const + { + switch (p) + { + case 0: + return static_cast(1); + // todo probably should add another piece containing a just .5, now returns 0 + default: + return 0; + } + } + posT derivative_piece(const posT, int ) const + { + return 0; + } + + int find_abs_piece(const posT absx) const + { + return static_cast(absx+.5); + } + int find_piece(const posT x) const + { + const int abs_p = this->find_abs_piece(fabs(x)); + if (x>0) + return abs_p; + else + return -abs_p; + } + int find_highest_piece() const + { + return 0; + } + }; + + template + class BSplineFunction: public PieceWiseFunction + { + public: + BSplineFunction() {} + posT kernel_length_left() const { return static_cast(1); } + BOOST_STATIC_CONSTANT(int, kernel_total_length_value=2); + int kernel_total_length() const { return kernel_total_length_value; } + posT function_piece(const posT x, int p) const + { + switch (p) + { + case 0: + return 1-x; + case -1: + return 1+x; + default: + return 0; + } + } + posT derivative_piece(const posT x, int p) const + { + switch (p) + { + case 0: + return -1; + case -1: + return 1; + default: + return 0; + } + } + int find_piece(const posT x) const + { + return static_cast(floor(x)); + } + + int find_highest_piece() const + { + return 0; + } + }; + + template + class BSplineFunction: public PieceWiseFunction + { + public: + BSplineFunction() {} + posT kernel_length_left() const { return static_cast(1.5); } + BOOST_STATIC_CONSTANT(int, kernel_total_length_value=3); + int kernel_total_length() const { return kernel_total_length_value; } + posT function_piece(const posT x, int p) const + { + switch (std::abs(p)) + { + case 0: + return static_cast(3)/4 - square(x); + case 1: + { + const posT absx = std::fabs(x); + return square(2*absx - 3)/8; + } + default: + return 0; + } + } + posT derivative_piece(const posT x, int p) const + { + switch (std::abs(p)) + { + case 0: + return -2*x; + case 1: + { + const int sign= x>0?1:-1; + return x - sign*static_cast(1.5); + } + default: + return 0; + } + } + private: + int find_abs_piece(const posT absx) const + { +#if 1 + return static_cast(absx+.5); +#else + // can use this if guaranteed never out of range + if (absx<=.5) + return 0; + else if (absx<=1.5) + return 1; + else + return 2; +#endif + + } + public: + int find_piece(const posT x) const + { + const int abs_p = this->find_abs_piece(fabs(x)); + if (x>0) + return abs_p; + else + return -abs_p; + } + int find_highest_piece() const + { + return 1; + } + +#if 0 + posT function(const posT x) const + { + const posT absx = fabs(x); + // note: gcc inlines next function call, even getting rid of switch + // so, this is faster than using virtual functions etc. + // however, ugly code repetition, so we can't be bothered, as this is hardly called anyway + if (absx<=.5) + return self_t::function_piece(absx,0); + else if (absx<=1.5) + return self_t::function_piece(absx,1); + else + return 0; + } +#endif + }; + + template + class BSplineFunction: public PieceWiseFunction + { + public: + BSplineFunction() {} + posT kernel_length_left() const { return static_cast(2); } + BOOST_STATIC_CONSTANT(int, kernel_total_length_value=4); + int kernel_total_length() const { return kernel_total_length_value; } + posT function_piece(const posT x, int p) const + { + const posT absx = std::fabs(x); + switch (p) + { + case 0: + case -1: + return 2./3. + (absx/2-1)*absx*absx; + case 1: + case -2: + { + const posT tmp=2-absx; + return tmp*tmp*tmp/6; + } + default: + return 0; + } + } + posT derivative_piece(const posT x, int p) const + { + switch (p) + { + case 0: + return x*(1.5*x-2); + case -1: + return -x*(1.5*x+2); + case 1: + return -square(x-2)/2; + case -2: + return square(x+2)/2; + default: + return 0; + } + } + int find_piece(const posT x) const + { + return static_cast(floor(x)); + } + int find_highest_piece() const + { + return 1; + } + }; + + + template + class BSplineFunction: public PieceWiseFunction + { + public: + BSplineFunction() {} + posT kernel_length_left() const { return static_cast(2); } + BOOST_STATIC_CONSTANT(int, kernel_total_length_value=4); + int kernel_total_length() const { return kernel_total_length_value; } + posT function_piece(const posT x, int p) const + { + const posT absx = std::fabs(x); + switch (p) + { + case 0: + case -1: + return 13./21. + absx*(1./14. +absx*(absx/2-1)) ; + case 1: + case -2: + return 29./21. + absx*(-85./42. + absx*(1-absx/6)) ; + default: + return 0; + } + } + posT derivative_piece(const posT x, int p) const + { + const posT absx = std::fabs(x); + const int sign=x>0?1:-1; + switch (p) + { + case 0: + case -1: + return sign*(1/14. + absx*(-2+3*absx/2)); + case 1: + case -2: + return sign*(-85/42. + absx*(2-absx/2)); + default: + return 0; + } + } + int find_piece(const posT x) const + { + return static_cast(floor(x)); + } + int find_highest_piece() const + { + return 1; + } + }; + + static const BSplineFunction near_n_BSpline_function; + static const BSplineFunction linear_BSpline_function; + static const BSplineFunction quadratic_BSpline_function; + static const BSplineFunction cubic_BSpline_function; + static const BSplineFunction oMoms_BSpline_function; + + inline + const PieceWiseFunction& + bspline_function(BSplineType type) + { + switch (type) + { + case near_n: + return near_n_BSpline_function; + case linear: + return linear_BSpline_function; + case quadratic: + return quadratic_BSpline_function; + case cubic: + return cubic_BSpline_function; + case oMoms: + return oMoms_BSpline_function; + default: + std::cerr << "quartic,quantic to do\n"; + exit(EXIT_FAILURE); + return cubic_BSpline_function;//WARNING WRONG + } + } + + template + inline + posT + cubic_BSplines_weight(const posT relative_position) + { + const posT abs_relative_position = fabs(relative_position); + assert(abs_relative_position>=0); + if (abs_relative_position<1) + return 2./3. + (0.5*abs_relative_position-1)*abs_relative_position*abs_relative_position; + if (abs_relative_position>=2) + return 0; + const posT tmp=2-abs_relative_position; + return tmp*tmp*tmp/6; + + } + + + template + inline + posT + oMoms_weight(const posT relative_position) + { + const posT abs_relative_position = fabs(relative_position); + assert(abs_relative_position>=0); + if (abs_relative_position>=2) + return 0; + if (abs_relative_position>=1) + return 29./21. + abs_relative_position*(-85./42. + + abs_relative_position*(1.-abs_relative_position/6)) ; + else + return 13./21. + abs_relative_position*(1./14. + + abs_relative_position*(0.5*abs_relative_position-1.)) ; + } + + template + inline + posT + cubic_BSplines_1st_der_weight(const posT relative_position) + { + const posT abs_relative_position = fabs(relative_position); + if (abs_relative_position>=2) + return 0; + int sign = relative_position>0?1:-1; + if (abs_relative_position>=1) + return -0.5*sign*(abs_relative_position-2)*(abs_relative_position-2); + return sign*abs_relative_position*(1.5*abs_relative_position-2.); + } + + template + posT + BSplines_1st_der_weight(const posT relative_position, const BSplineType spline_type) + { + switch(spline_type) + { + case cubic: + return cubic_BSplines_1st_der_weight(relative_position); + default: + error("BSplines_1st_der_weight currently only implemented for cubic splines."); + return 0; + // TODO + } + } + + template + posT + BSplines_weights(const posT relative_position, const BSplineType spline_type) + { + // double relative_position = rel_position; + switch(spline_type) + { + case cubic: + return cubic_BSplines_weight(relative_position); + case near_n: + { + if (fabs(relative_position)<0.5) + return 1; + if (fabs(relative_position)==0.5) + return 0.5; + else return 0; + } + case linear: + { + if (fabs(relative_position)<1) + return 1-fabs(relative_position); + else + return 0; + } + case quadratic: + return BSplineFunction().function(relative_position); + case quintic: + return + (pow(std::max(0.,-3. + relative_position),5) - 6*pow(std::max(0.,-2. + relative_position),5) + + 15*pow(std::max(0.,-1. + relative_position),5) - 20*pow(std::max(static_cast(0),relative_position),5) + + 15*pow(std::max(0.,1. + relative_position),5) - 6*pow(std::max(0.,2. + relative_position),5) + + pow(std::max(0.,3. + relative_position),5))/ 120. ; + case oMoms: + return oMoms_weight(relative_position); + default: + error("Not implemented b-spline type"); + return -1000000; + } + } + +} // end BSpline namespace + +END_NAMESPACE_STIR + diff --git a/src/include/stir/numerics/IR_filters.h b/src/include/stir/numerics/IR_filters.h new file mode 100644 index 0000000000..e9742b23f3 --- /dev/null +++ b/src/include/stir/numerics/IR_filters.h @@ -0,0 +1,72 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + \brief Implementation of the IIR and FIR filters + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#include "stir/shared_ptr.h" +#include +#include +#include + +START_NAMESPACE_STIR + +/*\ingroup numerics + \brief IIR filter +*/ +template +void +inline +IIR_filter(RandIter1 output_begin_iterator, + RandIter1 output_end_iterator, + const RandIter2 input_begin_iterator, + const RandIter2 input_end_iterator, + const RandIter3 input_factor_begin_iterator, + const RandIter3 input_factor_end_iterator, + const RandIter4 pole_begin_iterator, + const RandIter4 pole_end_iterator, + const bool if_initial_exists); + +/*\ingroup numerics + \brief IIR filter +*/ +template +void +inline +FIR_filter(RandIter1 output_begin_iterator, + RandIter1 output_end_iterator, + const RandIter2 input_begin_iterator, + const RandIter2 input_end_iterator, + const RandIter3 input_factor_begin_iterator, + const RandIter3 input_factor_end_iterator, + const bool if_initial_exists); +END_NAMESPACE_STIR + +#include "stir/numerics/IR_filters.inl" diff --git a/src/include/stir/numerics/IR_filters.inl b/src/include/stir/numerics/IR_filters.inl new file mode 100644 index 0000000000..d9d0a5aa26 --- /dev/null +++ b/src/include/stir/numerics/IR_filters.inl @@ -0,0 +1,126 @@ +/* + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + \brief implements the IR_filters + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ + +START_NAMESPACE_STIR + +template +void +inline +IIR_filter(RandIter1 output_begin_iterator, + RandIter1 output_end_iterator, + const RandIter2 input_begin_iterator, + const RandIter2 input_end_iterator, + const RandIter3 input_factor_begin_iterator, + const RandIter3 input_factor_end_iterator, + const RandIter4 pole_begin_iterator, + const RandIter4 pole_end_iterator, + const bool if_initial_exists) +{ + // The input should be initialised to 0 + // if(output_begin_iterator==output_end_iterator) + // warning("No output signal is given./n"); +#if 1 + if(if_initial_exists==false) + *output_begin_iterator=(*input_begin_iterator)*(*input_factor_begin_iterator); +#else + // an attempt to remove warnings by VC++, but it doesn't work for higher-dimensional arrays + typedef typename CastScalarForOperation::value_type>::type cast_type; + + if(if_initial_exists==false) + *output_begin_iterator=(*input_begin_iterator)*static_cast(*input_factor_begin_iterator); +#endif + + RandIter1 current_output_iterator = output_begin_iterator ; + RandIter2 current_input_iterator = input_begin_iterator ; + + for(++current_output_iterator, ++current_input_iterator; + current_output_iterator != output_end_iterator && + current_input_iterator != input_end_iterator; + ++current_output_iterator, ++current_input_iterator) + { + RandIter2 current_current_input_iterator = current_input_iterator; + for(RandIter3 current_input_factor_iterator = input_factor_begin_iterator; + current_input_factor_iterator != input_factor_end_iterator; + ++current_input_factor_iterator,--current_current_input_iterator + ) + { +#if 1 + (*current_output_iterator) += + (*current_current_input_iterator) * + (*current_input_factor_iterator); +#else + (*current_output_iterator) += + (*current_current_input_iterator) * + static_cast(*current_input_factor_iterator); +#endif + if (current_current_input_iterator==input_begin_iterator) + break; + } + + RandIter4 current_pole_iterator = pole_begin_iterator; + RandIter1 current_feedback_iterator = current_output_iterator ; + + for(--current_feedback_iterator ; + current_pole_iterator != pole_end_iterator + ;++current_pole_iterator,--current_feedback_iterator) + { + (*current_output_iterator) -= +#if 1 + (*current_feedback_iterator) * + (*current_pole_iterator); +#else + (*current_feedback_iterator) * + static_cast(*current_pole_iterator); +#endif + if(current_feedback_iterator==output_begin_iterator) + break; + } + } +} + +template +void +inline +FIR_filter(RandIter1 output_begin_iterator, + RandIter1 output_end_iterator, + const RandIter2 input_begin_iterator, + const RandIter2 input_end_iterator, + const RandIter3 input_factor_begin_iterator, + const RandIter3 input_factor_end_iterator, + const bool if_initial_exists) +{ + IIR_filter(output_begin_iterator, output_end_iterator, + input_begin_iterator, input_end_iterator, + input_factor_begin_iterator, input_factor_end_iterator, + output_begin_iterator, output_begin_iterator,if_initial_exists); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/numerics/MatrixFunction.h b/src/include/stir/numerics/MatrixFunction.h new file mode 100644 index 0000000000..08b9f09b2d --- /dev/null +++ b/src/include/stir/numerics/MatrixFunction.h @@ -0,0 +1,144 @@ +// +// +/* + Copyright (C) 2004- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_numerics_MatrixFunction_H__ +#define __stir_numerics_MatrixFunction_H__ +/*! + \file + \ingroup numerics + + \brief Declaration of functions for matrices + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +#include "stir/Array.h" +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR + + +//---------------------------------------------------------------------- +/*! \ingroup numerics + \name functions specific for 1D Arrays +*/ +//@{ + +//! Inner product of 2 1D arrays +/*! \ingroup numerics + This returns the sum of multiplication of elements of \a conjugate(v1) and \a v2. + + Implementation is appropriate for complex numbers. + + Arguments must have the same index range. + */ +template +inline elemT +inner_product (const Array<1,elemT> & v1, const Array<1,elemT> &v2); + +//! angle between 2 1D arrays +/*! \ingroup numbers + */ +template +inline double +angle (const Array<1,elemT> & v1, const Array<1,elemT> &v2); + +//@} end of 1D functions + + +//---------------------------------------------------------------------- +/*! \ingroup numerics + \name functions for matrices +*/ +//@{ + +//! matrix with vector multiplication +/*! Index ranges have to be compatible (checked with assert). + */ +template +inline Array<1,elemT> + matrix_multiply(const Array<2,elemT>& m, const Array<1,elemT>& vec); + +//! matrix multiplication with vector (given as BasicCoordinate) +/*! matrix size has to be compatible with \c dimension. Matrix index range has to start from 1. + All of this is only checked with assert(). +*/ +template +inline BasicCoordinate + matrix_multiply(const Array<2,elemT>& m, const BasicCoordinate& vec); + +//! matrix multiplication +/*! Index ranges have to be compatible (checked with assert). + */ +template +inline Array<2,elemT> + matrix_multiply(const Array<2,elemT> &m1, const Array<2,elemT>& m2); + +//! matrix transposition +template +inline Array<2,elemT> + matrix_transpose (const Array<2,elemT>& m); + +//! construct a diagonal matrix with all elements on the diagonal equal +/*! \param[in] dimension specifies the size of the matrix + \param[in] value gives the value on the diagonal. Note that its + type determines the type of the return value. + + \par Example + \code + // a 3x3 identity matrix + Array<2,float> iden = diagonal_matrix(3, 1.F); + \endcode + + Index-range of the matrix will be 0 till + dimensions-1. +*/ +template +inline +Array<2,elemT> + diagonal_matrix(const unsigned dimension, const elemT value); + +//! construct a diagonal matrix +/*! + \param[in] values gives the values on the diagonal. Note that its + type determines the type of the return value. + + \par Example + \code + // a 3x3 diagonal matrix with values 1,2,3 on the diagonal + Array<2,float> diag = diagonal_matrix(Coordinate3D(1,2,3)); + \endcode + + Index-range of the matrix will be 0 till + dimensions-1. (Note that this is different from + \a values). +*/ +template +inline +Array<2,elemT> + diagonal_matrix(const BasicCoordinate& values); + + +//@} + +END_NAMESPACE_STIR + +#include "stir/numerics/MatrixFunction.inl" + +#endif diff --git a/src/include/stir/numerics/MatrixFunction.inl b/src/include/stir/numerics/MatrixFunction.inl new file mode 100644 index 0000000000..36f41f24e3 --- /dev/null +++ b/src/include/stir/numerics/MatrixFunction.inl @@ -0,0 +1,206 @@ +// +// +/* + Copyright (C) 2004- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + + \brief Implementation of functions for matrices + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +#include "stir/IndexRange2D.h" +#include +#include +# ifdef BOOST_NO_STDC_NAMESPACE + namespace std { using ::acos; } +# endif + +START_NAMESPACE_STIR + + +//---------------------------------------------------------------------- +// some functions specific for 1D Arrays +//---------------------------------------------------------------------- + +template +inline elemT +inner_product (const Array<1,elemT> & v1, const Array<1,elemT> &v2) +{ + assert(v1.get_index_range() == v2.get_index_range()); + elemT tmp = 0; + typename Array<1,elemT>::const_iterator i1=v1.begin(); + typename Array<1,elemT>::const_iterator i2=v2.begin(); + for (; i1!=v1.end(); ++i1, ++i2) + tmp += ((*i1) * (*i2)); + return tmp; +} + +template +inline std::complex +inner_product (const Array<1,std::complex > & v1, const Array<1,std::complex > &v2) +{ + assert(v1.get_index_range() == v2.get_index_range()); + std::complex tmp = 0; + typename Array<1,std::complex >::const_iterator i1=v1.begin(); + typename Array<1,std::complex >::const_iterator i2=v2.begin(); + for (; i1!=v1.end(); ++i1, ++i2) + tmp += (std::conj(*i1) * (*i2)); + return tmp; +} + +template +inline double +angle (const Array<1,elemT> & v1, const Array<1,elemT> &v2) +{ + return std::acos(inner_product(v1,v2)/norm(v1)/ norm(v2)); +} + + + +//---------------------------------------------------------------------- +// functions for matrices + +// matrix with vector multiplication +// first define a help function that works with both types of vectors) +namespace detail +{ + template + inline + void + matrix_multiply_help(vecT& retval, const Array<2,elemT>& m, const vecT& vec) + { + assert(m.is_regular()); + if (m.size()==0) + { return; } + + const int m_min_row = m.get_min_index(); + const int m_max_row = m.get_max_index(); + const int m_min_col = m[m_min_row].get_min_index(); + const int m_max_col = m[m_min_row].get_max_index(); + // make sure matrices are conformable for multiplication + assert(vec.get_min_index() == m_min_col); + assert(vec.get_max_index() == m_max_col); + for(int i=m_min_row; i<=m_max_row; ++i) + { + int j=m_min_col; + retval[i] = m[i][j]*vec[j]; + for(++j; j<=m_max_col; ++j) + retval[i] += m[i][j]*vec[j]; + } + } +} + +template +inline Array<1,elemT> +matrix_multiply(const Array<2,elemT>& m, const Array<1,elemT>& vec) +{ + Array<1,elemT> ret(m.get_min_index(), m.get_max_index()); + detail::matrix_multiply_help(ret, m, vec); + return ret; +} + +template +inline BasicCoordinate +matrix_multiply(const Array<2,elemT>& m, const BasicCoordinate& vec) +{ + BasicCoordinate ret; + detail::matrix_multiply_help(ret, m, vec); + return ret; +} + +// matrix multiplication +template +inline Array<2,elemT> +matrix_multiply(const Array<2,elemT> &m1, const Array<2,elemT>& m2) +{ + assert(m1.is_regular()); + assert(m2.is_regular()); + if (m1.size()==0 || m2.size()==0) + { Array<2,elemT> retval; return retval; } + + const int m1_min_row = m1.get_min_index(); + const int m1_max_row = m1.get_max_index(); + const int m2_min_row = m2.get_min_index(); + const int m2_max_row = m2.get_max_index(); + const int m2_min_col = m2[m2_min_row].get_min_index(); + const int m2_max_col = m2[m2_min_row].get_max_index(); + // make sure matrices are conformable for multiplication + assert(m1[m1_min_row].get_min_index() == m2_min_row); + assert(m1[m1_min_row].get_max_index() == m2_max_row); + + Array<2,elemT> retval(IndexRange2D(m1_min_row, m1_max_row, + m2_min_col, m2_max_col)); + + for (int i=m1_min_row; i<=m1_max_row; ++i) + { + for(int j=m2_min_col; j<=m2_max_col; ++j) + { + for(int k=m2_min_row; k<=m2_max_row; ++k) + retval[i][j] += m1[i][k]*m2[k][j]; + } + } + return retval; +} + + +template +inline Array<2,elemT> +matrix_transpose (const Array<2,elemT>& m) +{ + assert(m.is_regular()); + if (m.size()==0) + { Array<2,elemT> retval; return retval; } + + const int m_min_row = m.get_min_index(); + const int m_max_row = m.get_max_index(); + const int m_min_col = m[m_min_row].get_min_index(); + const int m_max_col = m[m_min_row].get_max_index(); + Array<2,elemT> new_m(IndexRange2D(m_min_col, m_max_col, + m_min_row, m_max_row)); + for(int j=m_min_row; j<=m_max_row; ++j) + for(int i=m_min_col; i<=m_max_col; ++i) + new_m[i][j] = m[j][i]; + return new_m; +} + +template +inline +Array<2,elemT> + diagonal_matrix(const unsigned dimension, const elemT value) +{ + Array<2,elemT> m(IndexRange2D(dimension,dimension)); + for (unsigned int i=0; i +inline +Array<2,elemT> + diagonal_matrix(const BasicCoordinate& values) +{ + Array<2,elemT> m(IndexRange2D(dimension,dimension)); + for (unsigned int i=0; i class Array; + +/*! \ingroup numerics + \brief Compute the determinant of a matrix + + Matrix indices can start from any number. + + \todo Only works for low dimensions for now. +*/ +template +elemT +determinant(const Array<2,elemT>& m); + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/numerics/divide.h b/src/include/stir/numerics/divide.h new file mode 100644 index 0000000000..4ee1981b91 --- /dev/null +++ b/src/include/stir/numerics/divide.h @@ -0,0 +1,63 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_divide_H__ +#define __stir_divide_H__ +/*! + \file + \ingroup numerics + \brief implementation of stir::divide + + \author Matthew Jacobson + \author Kris Thielemans + \author PARAPET project + +*/ + +START_NAMESPACE_STIR + +//! division of two ranges, 0/0 = 0 +/*! + \ingroup numerics + + This function sets 0/0 to 0 (not the usual NaN). It is for instance useful in + Poisson log-likelihood computation. + + Because of potential numerical rounding problems, we test if a number is + 0 by comparing its absolute value with a small value, which is determined + by multiplying the maximum in the \c numerator range with \a small_num. + + \warning This function does not test for non-zero numbers by 0. Results in + that case will likely depend on your processor and/or compiler settings. +*/ +template +inline +void +divide(const NumeratorIterT& numerator_begin, + const NumeratorIterT& numerator_end, + const DenominatorIterT& denominator_begin, + const small_numT small_num); + +END_NAMESPACE_STIR + +#include "stir/numerics/divide.inl" + +#endif diff --git a/src/include/stir/numerics/divide.inl b/src/include/stir/numerics/divide.inl new file mode 100644 index 0000000000..d5ba32e932 --- /dev/null +++ b/src/include/stir/numerics/divide.inl @@ -0,0 +1,62 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + \brief implementation of stir::divide + + \author Matthew Jacobson + \author Kris Thielemans + \author PARAPET project + +*/ +#include + +START_NAMESPACE_STIR + +template +void +divide( + const NumeratorIterT& numerator_begin, + const NumeratorIterT& numerator_end, + const DenominatorIterT& denominator_begin, + const small_numT small_num) +{ + small_numT small_value= + *std::max_element(numerator_begin, numerator_end) + *small_num; + small_value=(small_value>0)?small_value:0; + + NumeratorIterT numerator_iter = numerator_begin; + DenominatorIterT denominator_iter = denominator_begin; + while (numerator_iter != numerator_end) + { + if(std::fabs(*denominator_iter)<=small_value && std::fabs(*numerator_iter)<=small_value) + (*numerator_iter)=0; + else + (*numerator_iter)/=(*denominator_iter); + ++numerator_iter; + ++denominator_iter; + } +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/numerics/erf.h b/src/include/stir/numerics/erf.h new file mode 100644 index 0000000000..eadc054096 --- /dev/null +++ b/src/include/stir/numerics/erf.h @@ -0,0 +1,50 @@ +// +// +/* + Copyright (C) 2004 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +/*! \ingroup numerics + \name A collection of error functions. + The erf() is a high precision implementation of the error function. + The erfc() is the complementary of the erf(), which should be equal to 1-erf(), but with + higher precision when erf is close to 1. + + \todo replace with boost::erf +*/ +//@{ +inline +double erf(double); +inline +double erfc(double); +//@} + +END_NAMESPACE_STIR + +#include "stir/numerics/erf.inl" + diff --git a/src/include/stir/numerics/erf.inl b/src/include/stir/numerics/erf.inl new file mode 100644 index 0000000000..f916043581 --- /dev/null +++ b/src/include/stir/numerics/erf.inl @@ -0,0 +1,427 @@ +// +// +/*- +* Copyright (c) 1992, 1993 +* The Regents of the University of California. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. Neither the name of the University nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +* SUCH DAMAGE. +*/ + +/* Modified Nov 30, 1992 P. McILROY: +* Replaced expansions for x >= 1.25 (error 1.7ulp vs ~6ulp) +* Replaced even+odd with direct calculation for x < .84375, +* to avoid destructive cancellation. +* +* Performance of erfc(x): +* In 300000 trials in the range [.83, .84375] the +* maximum observed error was 3.6ulp. +* +* In [.84735,1.25] the maximum observed error was <2.5ulp in +* 100000 runs in the range [1.2, 1.25]. +* +* In [1.25,26] (Not including subnormal results) +* the error is < 1.7ulp. +*/ + +/* double erf(double x) +* double erfc(double x) +* x +* 2 |\ +* erf(x) = --------- | exp(-t*t)dt +* sqrt(pi) \| +* 0 +* +* erfc(x) = 1-erf(x) +* +* Method: +* 1. Reduce x to |x| by erf(-x) = -erf(x) +* 2. For x in [0, 0.84375] +* erf(x) = x + x*P(x^2) +* erfc(x) = 1 - erf(x) if x<=0.25 +* = 0.5 + ((0.5-x)-x*P) if x in [0.25,0.84375] +* where +* 2 2 4 20 +* P = P(x ) = (p0 + p1 * x + p2 * x + ... + p10 * x ) +* is an approximation to (erf(x)-x)/x with precision +* +* -56.45 +* | P - (erf(x)-x)/x | <= 2 +* +* +* Remark. The formula is derived by noting +* erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....) +* and that +* 2/sqrt(pi) = 1.128379167095512573896158903121545171688 +* is close to one. The interval is chosen because the fixed +* point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is +* near 0.6174), and by some experiment, 0.84375 is chosen to +* guarantee the error is less than one ulp for erf. +* +* 3. For x in [0.84375,1.25], let s = x - 1, and +* c = 0.84506291151 rounded to single (24 bits) +* erf(x) = c + P1(s)/Q1(s) +* erfc(x) = (1-c) - P1(s)/Q1(s) +* |P1/Q1 - (erf(x)-c)| <= 2**-59.06 +* Remark: here we use the taylor series expansion at x=1. +* erf(1+s) = erf(1) + s*Poly(s) +* = 0.845.. + P1(s)/Q1(s) +* That is, we use rational approximation to approximate +* erf(1+s) - (c = (single)0.84506291151) +* Note that |P1/Q1|< 0.078 for x in [0.84375,1.25] +* where +* P1(s) = degree 6 poly in s +* Q1(s) = degree 6 poly in s +* +* 4. For x in [1.25, 2]; [2, 4] +* erf(x) = 1.0 - tiny +* erfc(x) = (1/x)exp(-x*x-(.5*log(pi) -.5z + R(z)/S(z)) +* +* Where z = 1/(x*x), R is degree 9, and S is degree 3; +* +* 5. For x in [4,28] +* erf(x) = 1.0 - tiny +* erfc(x) = (1/x)exp(-x*x-(.5*log(pi)+eps + zP(z)) +* +* Where P is degree 14 polynomial in 1/(x*x). +* +* Notes: +* Here 4 and 5 make use of the asymptotic series +* exp(-x*x) +* erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) ); +* x*sqrt(pi) +* +* where for z = 1/(x*x) +* P(z) ~ z/2*(-1 + z*3/2*(1 + z*5/2*(-1 + z*7/2*(1 +...)))) +* +* Thus we use rational approximation to approximate +* erfc*x*exp(x*x) ~ 1/sqrt(pi); +* +* The error bound for the target function, G(z) for +* the interval +* [4, 28]: +* |eps + 1/(z)P(z) - G(z)| < 2**(-56.61) +* for [2, 4]: +* |R(z)/S(z) - G(z)| < 2**(-58.24) +* for [1.25, 2]: +* |R(z)/S(z) - G(z)| < 2**(-58.12) +* +* 6. For inf > x >= 28 +* erf(x) = 1 - tiny (raise inexact) +* erfc(x) = tiny*tiny (raise underflow) +* +* 7. Special cases: +* erf(0) = 0, erf(inf) = 1, erf(-inf) = -1, +* erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2, +* erfc/erf(NaN) is NaN +*/ + +/* Modified for STIR library Jun 05, 2005 Ch Tsoumpas and K Thielemans. + + WARNING: + There are some assumptions here about IEEE arithmetic etc. + On non-IEEE machines you're bound to have problems. + + We put in some work-arounds by using (hopefully) portable STIR_isnan, + and STIR_finite(). +*/ + + +#ifdef _IEEE_LIBM +/* +* redefining "___function" to "function" in _IEEE_LIBM mode +*/ +#include "ieee_libm.h" +#endif + +#if defined(__vax__) || defined(tahoe) +// non-IEEE machines +#define _IEEE 0 +#define TRUNC(x) (double)(x) = (float)(x) +#else +// assume everything uses IEEE floating point arithmetic +#define _IEEE 1 +// warning: strange definition of TRUNC that will go very weird on non-IEEE machines +#define TRUNC(x) *(((int *) &x) + 1) &= 0xf8000000 +#endif + + +#include +using std::fabs; +using std::exp; + +#include "stir/numerics/ieeefp.h" + + +START_NAMESPACE_STIR + +static const double +tiny = 1e-300, +half = 0.5, +one = 1.0, +two = 2.0, +c = 8.45062911510467529297e-01, /* (float)0.84506291151 */ + /* + * Coefficients for approximation to erf in [0,0.84375] + */ + p0t8 = 1.02703333676410051049867154944018394163280, + p0 = 1.283791670955125638123339436800229927041e-0001, + p1 = -3.761263890318340796574473028946097022260e-0001, + p2 = 1.128379167093567004871858633779992337238e-0001, + p3 = -2.686617064084433642889526516177508374437e-0002, + p4 = 5.223977576966219409445780927846432273191e-0003, + p5 = -8.548323822001639515038738961618255438422e-0004, + p6 = 1.205520092530505090384383082516403772317e-0004, + p7 = -1.492214100762529635365672665955239554276e-0005, + p8 = 1.640186161764254363152286358441771740838e-0006, + p9 = -1.571599331700515057841960987689515895479e-0007, + p10= 1.073087585213621540635426191486561494058e-0008; +/* + * Coefficients for approximation to erf in [0.84375,1.25] +*/ +static const double +pa0 = -2.362118560752659485957248365514511540287e-0003, +pa1 = 4.148561186837483359654781492060070469522e-0001, +pa2 = -3.722078760357013107593507594535478633044e-0001, +pa3 = 3.183466199011617316853636418691420262160e-0001, +pa4 = -1.108946942823966771253985510891237782544e-0001, +pa5 = 3.547830432561823343969797140537411825179e-0002, +pa6 = -2.166375594868790886906539848893221184820e-0003, +qa1 = 1.064208804008442270765369280952419863524e-0001, +qa2 = 5.403979177021710663441167681878575087235e-0001, +qa3 = 7.182865441419627066207655332170665812023e-0002, +qa4 = 1.261712198087616469108438860983447773726e-0001, +qa5 = 1.363708391202905087876983523620537833157e-0002, +qa6 = 1.198449984679910764099772682882189711364e-0002; +/* +* log(sqrt(pi)) for large x expansions. +* The tail (lsqrtPI_lo) is included in the rational +* approximations. +*/ +static const double +lsqrtPI_hi = .5723649429247000819387380943226; +/* +* lsqrtPI_lo = .000000000000000005132975581353913; +* +* Coefficients for approximation to erfc in [2, 4] +*/ +static const double +rb0 = -1.5306508387410807582e-010, /* includes lsqrtPI_lo */ +rb1 = 2.15592846101742183841910806188e-008, +rb2 = 6.24998557732436510470108714799e-001, +rb3 = 8.24849222231141787631258921465e+000, +rb4 = 2.63974967372233173534823436057e+001, +rb5 = 9.86383092541570505318304640241e+000, +rb6 = -7.28024154841991322228977878694e+000, +rb7 = 5.96303287280680116566600190708e+000, +rb8 = -4.40070358507372993983608466806e+000, +rb9 = 2.39923700182518073731330332521e+000, +rb10 = -6.89257464785841156285073338950e-001, +sb1 = 1.56641558965626774835300238919e+001, +sb2 = 7.20522741000949622502957936376e+001, +sb3 = 9.60121069770492994166488642804e+001; +/* +* Coefficients for approximation to erfc in [1.25, 2] +*/ +static const double +rc0 = -2.47925334685189288817e-007, /* includes lsqrtPI_lo */ +rc1 = 1.28735722546372485255126993930e-005, +rc2 = 6.24664954087883916855616917019e-001, +rc3 = 4.69798884785807402408863708843e+000, +rc4 = 7.61618295853929705430118701770e+000, +rc5 = 9.15640208659364240872946538730e-001, +rc6 = -3.59753040425048631334448145935e-001, +rc7 = 1.42862267989304403403849619281e-001, +rc8 = -4.74392758811439801958087514322e-002, +rc9 = 1.09964787987580810135757047874e-002, +rc10 = -1.28856240494889325194638463046e-003, +sc1 = 9.97395106984001955652274773456e+000, +sc2 = 2.80952153365721279953959310660e+001, +sc3 = 2.19826478142545234106819407316e+001; +/* +* Coefficients for approximation to erfc in [4,28] +*/ +static const double +rd0 = -2.1491361969012978677e-016, /* includes lsqrtPI_lo */ +rd1 = -4.99999999999640086151350330820e-001, +rd2 = 6.24999999772906433825880867516e-001, +rd3 = -1.54166659428052432723177389562e+000, +rd4 = 5.51561147405411844601985649206e+000, +rd5 = -2.55046307982949826964613748714e+001, +rd6 = 1.43631424382843846387913799845e+002, +rd7 = -9.45789244999420134263345971704e+002, +rd8 = 6.94834146607051206956384703517e+003, +rd9 = -5.27176414235983393155038356781e+004, +rd10 = 3.68530281128672766499221324921e+005, +rd11 = -2.06466642800404317677021026611e+006, +rd12 = 7.78293889471135381609201431274e+006, +rd13 = -1.42821001129434127360582351685e+007; + + +inline +double +erf(double x) +{ + double R,S,P,Q,ax,s,y,z,r; + if(!STIR_finite(x)) { /* erf(nan)=nan */ + if (STIR_isnan(x)) + return(x); + return (x > 0 ? one : -one); /* erf(+/-inf)= +/-1 */ + } + if ((ax = x) < 0) + ax = - ax; + if (ax < .84375) { + if (ax < 3.7e-09) { + if (ax < 1.0e-308) + return 0.125*(8.0*x+p0t8*x); /*avoid underflow */ + return x + p0*x; + } + y = x*x; + r = y*(p1+y*(p2+y*(p3+y*(p4+y*(p5+ + y*(p6+y*(p7+y*(p8+y*(p9+y*p10))))))))); + return x + x*(p0+r); + } + if (ax < 1.25) { /* 0.84375 <= |x| < 1.25 */ + s = fabs(x)-one; + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); + if (x>=0) + return (c + P/Q); + else + return (-c - P/Q); + } + if (ax >= 6.0) { /* inf>|x|>=6 */ + if (x >= 0.0) + return (one-tiny); + else + return (tiny-one); + } + /* 1.25 <= |x| < 6 */ + z = -ax*ax; + s = -one/z; + if (ax < 2.0) { + R = rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+ + s*(rc6+s*(rc7+s*(rc8+s*(rc9+s*rc10))))))))); + S = one+s*(sc1+s*(sc2+s*sc3)); + } else { + R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+ + s*(rb6+s*(rb7+s*(rb8+s*(rb9+s*rb10))))))))); + S = one+s*(sb1+s*(sb2+s*sb3)); + } + y = (R/S -.5*s) - lsqrtPI_hi; + z += y; + z = exp(z)/ax; + if (x >= 0) + return (one-z); + else + return (z-one); +} + +inline +double +erfc(double x) +{ + double R,S,P,Q,s,ax,y,z,r; + if (!STIR_finite(x)) { + if (STIR_isnan(x)) /* erfc(NaN) = NaN */ + return(x); + else if (x > 0) /* erfc(+-inf)=0,2 */ + return 0.0; + else + return 2.0; + } + if ((ax = x) < 0) + ax = -ax; + if (ax < .84375) { /* |x|<0.84375 */ + if (ax < 1.38777878078144568e-17) /* |x|<2**-56 */ + return one-x; + y = x*x; + r = y*(p1+y*(p2+y*(p3+y*(p4+y*(p5+ + y*(p6+y*(p7+y*(p8+y*(p9+y*p10))))))))); + if (ax < .0625) { /* |x|<2**-4 */ + return (one-(x+x*(p0+r))); + } else { + r = x*(p0+r); + r += (x-half); + return (half - r); + } + } + if (ax < 1.25) { /* 0.84375 <= |x| < 1.25 */ + s = ax-one; + P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6))))); + Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6))))); + if (x>=0) { + z = one-c; return z - P/Q; + } else { + z = c+P/Q; return one+z; + } + } + if (ax >= 28) { /* Out of range */ + if (x>0) + return (tiny*tiny); + else + return (two-tiny); + } + z = ax; + TRUNC(z); + y = z - ax; y *= (ax+z); + z *= -z; /* Here z + y = -x^2 */ + s = one/(-z-y); /* 1/(x*x) */ + if (ax >= 4) { /* 6 <= ax */ + R = s*(rd1+s*(rd2+s*(rd3+s*(rd4+s*(rd5+ + s*(rd6+s*(rd7+s*(rd8+s*(rd9+s*(rd10 + +s*(rd11+s*(rd12+s*rd13)))))))))))); + y += rd0; + } else if (ax >= 2) { + R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(rb5+ + s*(rb6+s*(rb7+s*(rb8+s*(rb9+s*rb10))))))))); + S = one+s*(sb1+s*(sb2+s*sb3)); + y += R/S; + R = -.5*s; + } else { + R = rc0+s*(rc1+s*(rc2+s*(rc3+s*(rc4+s*(rc5+ + s*(rc6+s*(rc7+s*(rc8+s*(rc9+s*rc10))))))))); + S = one+s*(sc1+s*(sc2+s*sc3)); + y += R/S; + R = -.5*s; + } + /* return exp(-x^2 - lsqrtPI_hi + R + y)/x; */ + // s = ((R + y) - lsqrtPI_hi) + z; + // y = (((z-s) - lsqrtPI_hi) + R) + y; + // r = exp(-x + s/x); + //r = __exp__D(s, y)/x; + if (x>0) + return + (exp(-x*x - lsqrtPI_hi + R + y))/x; + //return r; + else + return + 2. - (exp(-x*x - lsqrtPI_hi + R + y))/x; + // return two-r; +} + + +#undef TRUNC +#undef _IEEE +END_NAMESPACE_STIR diff --git a/src/include/stir/numerics/fourier.h b/src/include/stir/numerics/fourier.h new file mode 100644 index 0000000000..24750f4f71 --- /dev/null +++ b/src/include/stir/numerics/fourier.h @@ -0,0 +1,253 @@ +// +// + +/*! + \file + \ingroup DFT + \brief Functions for computing FFTs + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_numerics_stir_fourier_h__ +#define __stir_numerics_stir_fourier_h__ +#include "stir/VectorWithOffset.h" +#include "stir/Array_complex_numbers.h" +START_NAMESPACE_STIR + + + +/*! \ingroup DFT + \brief Compute multi-dimensional discrete fourier transform. + + \param[in,out] c The type of \a c should normally be Array\ \>. + The function will then compute the \a n- dimensional fourier transform of the data, + and store the result in \a c. + + \param[in] sign This can be used to implement a different convention for the DFT. + + \see fourier_1d for conventions and restrictions + + \warning Currently, the array has to have \c get_min_index()==0 at each dimension. +*/ +template +void +fourier(T& c, const int sign = 1); +//fourier(VectorWithOffset& c, const int sign = 1); + + +/*! \ingroup DFT + \brief Compute the inverse of the multi-dimensional discrete fourier transform. + + The scale factor is such that inverse_fourier(fourier(c,sign),sign)==c, aside + from numerical error of course. + \see fourier +*/ +template +inline void inverse_fourier(T& c, const int sign=1) +{ + fourier(c,-sign); +#ifdef _MSC_VER + // disable warning about conversion + #pragma warning(disable:4244) +#endif + c /= c.size_all(); +#ifdef _MSC_VER + // disable warning about conversion + #pragma warning(default:4244) +#endif +} + +/*! \ingroup DFT + + \brief Compute one-dimensional discrete fourier transform of an array. + + \param[in,out] c The type of \a c should normally be Array\ \> (but see below). + The function will then compute the one-dimensional fourier transform (i.e. on the + 'outer' index) of the data, and store the result in \a c. + + \param[in] sign This can be used to implement a different convention for the DFT + + \warning Currently, the array has to be indexed from 0. + \warning Currently, the length of the array has to be a power of 2. + + The convention used is as follows. + For a vector of length \a n, the result is + \f[ + r_s = \sum_{s=0}^{n-1} c_r e^{\mathrm{sign} 2\pi i r s/n} + \f] + This means that the zero-frequency will be returned in c[0] + + This function can be used with more general type of \a c (if instantiated in fourier.cxx). + The type \a T has to be such that \a T::value_type, \a T::reference and + T::reference T::operator[](const int) exist. Moreover, numerical + operations + operator*=(T::reference, std::complex\), + operator+=(T::reference, T::value_type) and + operator*=(T::reference, int), + have to be defined as well. +*/ +template +void fourier_1d(T& c, const int sign); + +/*! \ingroup DFT + \brief Compute the inverse of the one-dimensional discrete fourier transform. + + The scale factor is such that inverse_fourier_1d(fourier_1d(c,sign),sign)==c, aside + from numerical error of course. + \see fourier_1d() +*/ +template +inline void inverse_fourier_1d(T& c, const int sign=1) +{ + fourier_1d(c,-sign); +#ifdef _MSC_VER + // disable warning about conversion + #pragma warning(disable:4244) +#endif + c /= c.size(); +#ifdef _MSC_VER + #pragma warning(default:4244) +#endif +} + +/*! \ingroup DFT + + \brief Compute one-dimensional discrete fourier transform of a real array (of even size). + + \param[in] c The type of \a c should normally be Array\<1,float\> + (or \c double). + \param[in] sign This can be used to implement a different convention for the DFT. + \return The positive frequencies of the DFT as an array of complex numbers. That is, + for c.size()==2*n, the returned array will have indices from 0 + to n, with the 0 frequency at 0. + + For a real array, the DFT is such that the values at negative frequencies are the + complex conjugate of the value at the corresponding positive frequency. + In addition, if the length of the real array is even, the DFT can be computed + efficiently by creating a complex array of half the length (by putting the + even-numbered elements as the real part, and the odd-numbered as the imaginary part). + + This function implements the above and is hence (probably) a faster way to compute + DFTs of real arrays. Note however, that in contrast to the Numerical Recipes routines, + the result is not stored in the same memory location as the input. For a recent + compiler that implements the Named-Return-Value-Optimisation, this should not be a problem + in most cases. + + Result is such that + pos_frequencies_to_all(fourier_1d_for_real_data(v,sign))==fourier(v,sign) + (this is meant symbolically. In code you'd have to make \c v into an array of complex + numbers before passing to \c fourier). + + \see pos_frequencies_to_all() + \see fourier_1d() for conventions and restrictions + + \warning Currently, the array has to have \c get_min_index()==0. +*/ +template +Array<1,std::complex > +fourier_1d_for_real_data(const Array<1,T>& c, const int sign = 1); + + +/*! \ingroup DFT + + \brief Compute the inverse of the one-dimensional discrete fourier transform of a real array (of even size). + \warning Because of implementation issues, a temporary copy of the input data \c c has to be made. This + obviously affects performance. + \see fourier_1d_for_real_data() +*/ +template +Array<1,T> +inverse_fourier_1d_for_real_data(const Array<1,std::complex >& c, const int sign = 1); + +/*! \ingroup DFT + + \brief As inverse_fourier_1d_for_real_data(), but avoiding the copy of the input array. + + \warning destroys values in (and resizes) first argument \a c + \see inverse_fourier_1d_for_real_data() +*/ +template +Array<1,T> + inverse_fourier_1d_for_real_data_corrupting_input(Array<1,std::complex >& c, const int sign); + +/*! \ingroup DFT + + \brief Compute discrete fourier transform of a real array (with the last dimensions of even size). + + \param[in] c The type of \a c should normally be Array\ + (or \c double). + \param[in] sign This can be used to implement a different convention for the DFT. + \return The positive frequencies of the DFT as an array of complex numbers. That is, + if \c c has sizes (n1,n2,...,nd), with nd even, + the returned array will have sizes + (n1,n2,...,(nd/2)+1), with the 0 frequency at index (0,0,...0). + + For a real array, the DFT is such that the values at frequency + (k1,k2,...,kd) are the complex conjugate of the value at the corresponding + frequency (-k1,-k2,...,-kd). + \see fourier_1d_for_real_data() + + This can be used to compute only the 'positive' half of the frequencies. For this + implementation, this means that only results for frequencies (k1,k2,...,kd) + with 0\<=kd\<=(nd/2), i.e. the 'last' dimension has positive frequencies. + + \warning At present, \c c has to be a regular array with all indices starting from 0. + \see pos_frequencies_to_all() +*/ +template + Array > + fourier_for_real_data(const Array& c, const int sign = 1); + +/*! \ingroup DFT + + \brief Compute the inverse of the discrete fourier transform of a real array (with the last dimension of even size). + + \warning Because of implementation issues, a temporary copy of the input data \c c has to be made. This + \see fourier_for_real_data() +*/ +template + Array + inverse_fourier_for_real_data(const Array >& c, const int sign = 1); + + +/*! \ingroup DFT + + \brief As inverse_fourier_for_real_data(), but avoiding the copy of the input array. + + \warning destroys values in (and resizes) first argument \a c + \see inverse_fourier_for_real_data() +*/ +template +Array + inverse_fourier_for_real_data_corrupting_input(Array >& c, const int sign=1); + +/*! \ingroup DFT + \brief Adds negative frequencies to the last dimension of a complex array by complex conjugation. + + \see fourier_for_real_data() +*/ +template +Array > +pos_frequencies_to_all(const Array >& c); + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/numerics/ieeefp.h b/src/include/stir/numerics/ieeefp.h new file mode 100644 index 0000000000..8f3cd2916d --- /dev/null +++ b/src/include/stir/numerics/ieeefp.h @@ -0,0 +1,101 @@ +// +// +/* + Copyright (C) 2004- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_numerics_ieeefp_H__ +#define __stir_numerics_ieeefp_H__ +/*! + \file + \ingroup numerics + + \brief Definition of work-around macros STIR_isnan and STIR_finite for a few non-portable IEEE floating point functions + + \warning The setting of these macros is tricky and only tested on a few systems. + Hopefully, somebody else can find a better way. For example, + http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2004/n1568.htm + + \author Kris Thielemans +*/ + +#include "stir/common.h" + + +#if defined(_MSC_VER) + +# include +# define STIR_isnan _isnan +# define STIR_finite _finite + +#else + +# include + + // attempt to get to find isnan but it might not work on some systems + // terrible hack to try and find isnan in std + // will only work for gcc +# if _GLIBCPP_USE_C99 && !_GLIBCPP_USE_C99_FP_MACROS_DYNAMIC +# define STIR_isnan std::isnan +# define STIR_finite std::isfinite +# else +# if defined(HAVE_IEEEFP_H) // this macro might be set (but probably only by configure) +# include +# define STIR_isnan isnan +# define STIR_finite finite +# endif +# endif + +#endif + +#if !defined(STIR_isnan) +# if defined(isnan) + #define STIR_isnan isnan +# else //portable version + // according to IEEE rules if x is NaN, then x!=x + // so, the following will work even on non-IEEE systems + #define STIR_isnan(x) (x)!=(x) +# endif +#endif + +#if !defined(STIR_finite) +# if defined(finite) +# define STIR_finite finite +# else //portable version + // we give up and say all numbers are finite + #define STIR_finite(x) true +# endif +#endif + +#ifdef DOXYGEN_SKIP // only when running doxygen + // doxygen doesn't execute above preprocessor commands, but then doesn't generate documentation + // so define something here + #define STIR_finite finite + #define STIR_isnan isnan +#endif +/*! +\def STIR_isnan(x) +A (hopefully) portable way to call isnan. Current implementation does not always +find isnan and then reverts to (x)!=(x), which according to IEEE math should work as well. +*/ + +/*! +\def STIR_finite(x) +A (hopefully) portable way to call \c finite. But problems can occur on your system. +Current implementation does not always find \c finite and then reverts to \c true. +*/ + + +#endif diff --git a/src/include/stir/numerics/integrate_discrete_function.h b/src/include/stir/numerics/integrate_discrete_function.h new file mode 100644 index 0000000000..5d10bbf2bd --- /dev/null +++ b/src/include/stir/numerics/integrate_discrete_function.h @@ -0,0 +1,59 @@ +// +// +/* + Copyright (C) 2004 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + \brief Declaration of stir::integrate_discrete_function function + + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_integrate_discrete_function_H__ +#define __stir_integrate_discrete_function_H__ + +#include "stir/common.h" +#include +#include +#include +#include +#include + +START_NAMESPACE_STIR +/*! + \brief numerical integration of a 1D function + \ingroup numerics + + This is a simple integral implementation using rectangular (=0) or trapezoidal (=1) approximation. + It currently integrates over the complete range specified. + + \param coordinates Coordinates at which the function samples are given + \param values Function values + \param interpolation_order has to be 0 or 1 + \warning Type \c elemT should not be an integral type. +*/ +template +inline elemT +integrate_discrete_function(const std::vector & coordinates, const std::vector & values, const int interpolation_order = 1); + +END_NAMESPACE_STIR + +#include "stir/numerics/integrate_discrete_function.inl" + +#endif //__integrate_discrete_function_H__ diff --git a/src/include/stir/numerics/integrate_discrete_function.inl b/src/include/stir/numerics/integrate_discrete_function.inl new file mode 100644 index 0000000000..6f40b24e0b --- /dev/null +++ b/src/include/stir/numerics/integrate_discrete_function.inl @@ -0,0 +1,67 @@ +// +// +/* + Copyright (C) 2004 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \file + \ingroup numerics + + \brief Implementations of inline function stir::integrate_discrete_function + + \author Charalampos Tsoumpas + +*/ + +START_NAMESPACE_STIR + +template +elemT +integrate_discrete_function(const std::vector& t , const std::vector& f , const int interpolation_order ) +{ + const std::size_t num_samples=f.size(); + elemT integral_result=0; + assert(num_samples>1); + if(num_samples!=t.size()) + error("integrate_discrete_function requires equal size of the two input vectors!!!"); + + switch (interpolation_order) + { + case 0: + //Rectangular Formula: + // If not at the borders apply: (t_next-t_previous)*0.5*f + // If at the borders apply: (t2-t1)*0.5*f, (tN-TN_previous)*0.5*f + { + integral_result=f[0]*(t[1]-t[0])*0.5F; + for (std::size_t i=1;im.max_eigenvector + and max_eigenvalue*max_eigenvector is small + (compared to max_eigenvalue). + + + Computation uses the power method, see for instance + http://www.maths.lth.se/na/courses/FMN050/FMN050-05/eigenE.pdf. + + The method consists in computing + \f[v^{n+1}=m.v^{n}\f] + \f[v^{n+1}/=\mathrm{norm}(v^{n+1})\f] + with + \f$ v^{0}=\mathrm{start} \f$ + for \f$ n\f$ big enough such that + \f$ \mathrm{norm}(v^{n+1}-v^{n})\f$ becomes smaller + than \a tolerance. The eigenvalue is then computed using the Rayleigh + quotient + \f[v.m.v \over v.v \f] + + This will converge to the eigenvector which has + the largest absolute eigenvalue. The method fails when the matrix + has more than 1 largest absolute eigenvalue + (e.g. with opposite sign). + +*/ +template +inline +Succeeded +absolute_max_eigenvector_using_power_method(elemT& max_eigenvalue, + Array<1,elemT>& max_eigenvector, + const Array<2,elemT>& m, + const Array<1,elemT>& start, + const double tolerance = .01, + const unsigned long max_num_iterations = 10000UL) +{ + assert(m.is_regular()); + if (m.size()==0) + { max_eigenvalue=0; max_eigenvector=start; return Succeeded::yes; } + + const double tolerance_squared = square(tolerance); + Array<1,elemT> current = start; + current /= (*abs_max_element(current.begin(), current.end())); + unsigned long remaining_num_iterations = max_num_iterations; + + double change; + do + { + max_eigenvector = matrix_multiply(m, current); + const elemT norm_factor = *abs_max_element(max_eigenvector.begin(), max_eigenvector.end()); + max_eigenvector /= norm_factor; + change = norm_squared(max_eigenvector - current); + current = max_eigenvector; + --remaining_num_iterations; + } + while (change > tolerance_squared && remaining_num_iterations!=0); + + current /= static_cast(norm(current)); + max_eigenvector = matrix_multiply(m, current); + // compute eigenvalue using Rayleigh quotient + max_eigenvalue = + static_cast(inner_product(current,max_eigenvector) / + norm_squared(current)); + max_eigenvector /= static_cast(norm(max_eigenvector)); + + return remaining_num_iterations ==0 ? Succeeded::no : Succeeded::yes; + + /*norm( max_eigenvector*max_eigenvalue - + matrix_multiply(m, max_eigenvector));*/ +} + +/*! + \ingroup numerics + \brief Compute the eigenvalue with the largest absolute value + and corresponding eigenvector of a matrix by using the shifted power method. + + \see absolute_max_eigenvector_using_shifted_power_method(). + + The current method calls the normal power method for m-shift*I + and shifts the eigenvalue back to the eigenvalue for m. + + This method can be used to enhance the convergence rate if you know more + about the eigenvalues. It can also be used to find another + eigenvalue by shifting with the maximum eigenvalue. + */ +template +inline +Succeeded +absolute_max_eigenvector_using_shifted_power_method(elemT& max_eigenvalue, + Array<1,elemT>& max_eigenvector, + const Array<2,elemT>& m, + const Array<1,elemT>& start, + const elemT shift, + const double tolerance = .03, + const unsigned long max_num_iterations = 10000UL) +{ + if (m.get_min_index()!=0 || m[0].get_min_index()!=0) + error("absolute_max_eigenvector_using_shifted_power_method:\n" + " implementation needs work for indices that don't start from 0. sorry"); + + Succeeded success = + absolute_max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + // sadly need to explicitly convert result of subtraction back to Array + Array<2,elemT>(m - diagonal_matrix(static_cast(m.size()), shift)), + start, + tolerance, + max_num_iterations); + max_eigenvalue += shift; + return success; +} + + +/*! + \ingroup numerics + \brief Compute the eigenvalue with the largest value + and corresponding eigenvector of a matrix by using the power method. + + \warning This assumes that all eigenvalues are real. + + \see absolute_max_eigenvector_using_shifted_power_method(). + + \param[in] m is the input matrix, which has to be real-symmetric + + + This will attempt to find the eigenvector which has + the largest eigenvalue. The method fails when the matrix + has a negative eigenvalue of the same magnitude as the + largest eigenvalue. + + \todo the algorithm would work with hermitian matrices, but the code needs one small adjustment. +*/ +template +inline +Succeeded +max_eigenvector_using_power_method(elemT& max_eigenvalue, + Array<1,elemT>& max_eigenvector, + const Array<2,elemT>& m, + const Array<1,elemT>& start, + const double tolerance = .03, + const unsigned long max_num_iterations = 10000UL) +{ + + Succeeded success = + absolute_max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + m, + start, + tolerance, + max_num_iterations); + if (success == Succeeded::no) + return Succeeded::no; + + if (max_eigenvalue>=0) // TODO would need to take real value for complex case + return Succeeded::yes; + + // we found a negative eigenvalue + // try again with a shift equal to the previously found max_eigenvalue + // this shift will effectively put that eigenvalue to 0 during the + // power method iterations + // also it will make all eigenvalues positive (as we subtract the + // smallest negative eigenvalue) + success = + absolute_max_eigenvector_using_shifted_power_method(max_eigenvalue, + max_eigenvector, + m, + start, + max_eigenvalue, + tolerance, + max_num_iterations); + if (success == Succeeded::no) + return Succeeded::no; + + assert(max_eigenvalue>=0); + return Succeeded::yes; +} + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/numerics/norm.h b/src/include/stir/numerics/norm.h new file mode 100644 index 0000000000..bc756382a9 --- /dev/null +++ b/src/include/stir/numerics/norm.h @@ -0,0 +1,137 @@ +// +// +/* + Copyright (C) 2003- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_numerics_norm_H__ +#define __stir_numerics_norm_H__ +/*! + \file + \ingroup numerics + \brief Declaration of the stir::norm(), stir::norm_squared() functions and + stir::NormSquared unary function + + \author Kris Thielemans + +*/ + + +#include "stir/common.h" +#include +#include +# ifdef BOOST_NO_STDC_NAMESPACE + namespace std { using ::fabs; } +# endif + +START_NAMESPACE_STIR + +template class Array; + +/*! + \ingroup numerics + \name Functions to compute the norm +*/ +//@{ + +//! A helper class that computes the square of the norm of numeric data +/*! It's there to avoid unnecessary sqrts when computing norms of vectors. + + The default template just uses the square (with conversion to double), + but we'll specialise it for complex numbers. + + It's derived from std::unary_function such that it follows + the conventions for a function object. +*/ + +// specialisations for complex numbers are in .inl file for clarity of this file. +template +struct NormSquared : + public std::unary_function +{ + double operator()(T x) const + { + return static_cast(x)*x; + } +}; + + +//! Returns the square of the norm of a number +/*! \see norm(elemT)*/ +template +inline double +norm_squared (const elemT t) +{ return NormSquared()(t); } + + +//! Returns the norm of a number +/*! This is the same as the absolute value, but works also for std::complex.*/ +template +inline double +norm (const elemT t) +{ return sqrt(norm_squared(t)); } + +// 2 overloads to avoid doing sqrt(t*t) +inline double +norm (const double t) +{ return std::fabs(t); } + +inline double +norm (const float t) +{ return std::fabs(t); } + +//! Returns the square of the l2-norm of a sequence +/*! The l2-norm is defined as the sqrt of the sum of squares of the norms + of each element in the sequence. +*/ +template +inline double norm_squared (Iter begin, Iter end); + +//! Returns the l2-norm of a sequence +/*! The l2-norm is defined as the sqrt of the sum of squares of the norms + of each element in the sequence. + + \see norm(const Array<1,elemT>&) for a convenience function for Array objects. +*/ +template +inline double norm (Iter begin, Iter end); + +//! l2 norm of a 1D array +/*! + This returns the sqrt of the sum of the square of the absolute values + of the elements of \a v1. + */ +template +inline double +norm (const Array<1,elemT> & v1); + + +//! square of the l2 norm of a 1D array +/*! + This returns the sum of the square of the absolute values of the + elements of \a v1. + */ +template +inline double +norm_squared (const Array<1,elemT> & v1); + +//@} + +END_NAMESPACE_STIR + +#include "stir/numerics/norm.inl" + +#endif diff --git a/src/include/stir/numerics/norm.inl b/src/include/stir/numerics/norm.inl new file mode 100644 index 0000000000..3b64199b10 --- /dev/null +++ b/src/include/stir/numerics/norm.inl @@ -0,0 +1,97 @@ +// +// +/* + Copyright (C) 2003- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup numerics + \brief Implementation of the stir::norm(), stir::norm_squared() functions and + stir::NormSquared unary function + + \author Kris Thielemans + +*/ + + +#include +#include +# ifdef BOOST_NO_STDC_NAMESPACE + namespace std { using ::fabs; } +# endif + +START_NAMESPACE_STIR + + +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +template +struct NormSquared > + : public std::unary_function&, double> +{ + double operator()(const std::complex& x) const + { return square(x.real())+ square(x.imag()); } +}; + +#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +// handle float and double separately. (sigh) +#define INSTANTIATE_NormSquared(T) \ + template <> \ + struct NormSquared > \ + : public std::unary_function&, double> \ +{ \ + double operator()(const std::complex& x) const \ + { return square(x.real())+ square(x.imag()); } \ +}; +INSTANTIATE_NormSquared(float) +INSTANTIATE_NormSquared(double) +#undef INSTANTIATE_NormSquared +#endif + + +template +double norm_squared (Iter begin, Iter end) +{ + double res = 0; + for (Iter iter= begin; iter != end; ++iter) + res+= norm_squared(*iter); + return res; +} + +template +double norm (Iter begin, Iter end) +{ + return sqrt(norm_squared(begin, end)); +} + + +template +inline double +norm (const Array<1,elemT> & v1) +{ + return norm(v1.begin(), v1.end()); +} + +template +inline double +norm_squared(const Array<1,elemT> & v1) +{ + return norm_squared(v1.begin(), v1.end()); +} + +END_NAMESPACE_STIR + diff --git a/src/include/stir/numerics/overlap_interpolate.h b/src/include/stir/numerics/overlap_interpolate.h new file mode 100644 index 0000000000..b2de77d584 --- /dev/null +++ b/src/include/stir/numerics/overlap_interpolate.h @@ -0,0 +1,145 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + + \brief Declaration of stir::overlap_interpolate + + \author Kris Thielemans + \author PARAPET project + +*/ + +#ifndef __stir_numerics_overlap_interpolate__H__ +#define __stir_numerics_overlap_interpolate__H__ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +template class VectorWithOffset; + +/*! + \ingroup numerics + + \brief 'overlap' interpolation (i.e. count preserving) for vectors. + \see overlap_interpolate(const out_iter_t out_begin, const out_iter_t out_end, + const out_coord_iter_t out_coord_begin, const out_coord_iter_t out_coord_end, + const in_iter_t in_begin, in_iter_t in_end, + const in_coord_iter_t in_coord_begin, const in_coord_iter_t in_coord_end, + const bool only_add_to_output=false, const bool assign_rest_with_zeroes) +*/ +template +void +overlap_interpolate(VectorWithOffset& out_data, + const VectorWithOffset& in_data, + const float zoom, + const float offset, + const bool assign_rest_with_zeroes = true); + + +/*! \ingroup numerics + \brief 'overlap' interpolation for iterators, with arbitrary 'bin' sizes. + + This type of interpolation considers the data as the samples of + a step-wise function. The interpolated array again represents a + step-wise function, such that the counts (i.e. integrals) are + preserved. + + In and out data are specified using iterators. For each, there is + also a pair of iterators specifying the coordinates of the edges + of the 'bins' (or 'boxes') in some arbitrary coordinate system + (common between in and out parameters of course). Note that there + should be one more coordinate than data (i.e. you have to specify + the last edge as well). This is (only) checked with assert() statements. + + \param only_add_to_output + If \c false will overwrite any data present in the output (aside from possibly + the tails: see \c assign_rest_with_zeroes). + If \c true, results will be added to the data. + \param assign_rest_with_zeroes + If \c false does not set values in the \c out range which do not overlap with + \c in range. + If \c true those data are set to 0. + + \warning when the out iterators point to an integral type, there is no + rounding but truncation. + + \par Examples: + Given 2 arrays and zoom and offset parameters + \code + Array<1,float> in = ...; + Array<1,float> out = ...; + float zoom = ...; float offset = ...; + \endcode + the following pieces of code should give the same result (this is tested + in test_interpolate): + \code + overlap_interpolate(out, in, zoom, offset, true); + \endcode + and + \code + Array<1,float> in_coords(in.get_min_index(), in.get_max_index()+1); + for (int i=in_coords.get_min_index(); i<=in_coords.get_max_index(); ++i) + in_coords[i]=i-.5F; + Array<1,float> out_coords(out.get_min_index(), out.get_max_index()+1); + for (int i=out_coords.get_min_index(); i<=out_coords.get_max_index(); ++i) + out_coords[i]=(i-.5F)/zoom+offset; + overlap_interpolate(out.begin(), out.end(), + out_coords.begin(), out_coords.end(), + in.begin(), in.end(), + in_coords.begin(), in_coords.end() + ); + \endcode + + \par Implementation details: + + Because this implementation works for arbitrary (numeric) types, it + is slightly more complicated than would be necessary for (say) floats. + In particular, +
          +
        • we do our best to avoid creating temporary objects
        • +
        • we zero values by using multiplication with 0. This is to allow + the case where assignment with an int (or float) does not exist + (in particular, in our higher dimensional arrays).
        • +
        + The implementation is inline to avoid problems with template + instantiations. + \par History: +
          +
        • first version by Kris Thielemans
        • +
        + */ +template +inline +void + overlap_interpolate(const out_iter_t out_begin, const out_iter_t out_end, + const out_coord_iter_t out_coord_begin, const out_coord_iter_t out_coord_end, + const in_iter_t in_begin, in_iter_t in_end, + const in_coord_iter_t in_coord_begin, const in_coord_iter_t in_coord_end, + const bool only_add_to_output=false, const bool assign_rest_with_zeroes=true); + +END_NAMESPACE_STIR + +#include "stir/numerics/overlap_interpolate.inl" + +#endif diff --git a/src/include/stir/numerics/overlap_interpolate.inl b/src/include/stir/numerics/overlap_interpolate.inl new file mode 100644 index 0000000000..36d7fc9ccf --- /dev/null +++ b/src/include/stir/numerics/overlap_interpolate.inl @@ -0,0 +1,165 @@ +// +// +/* + Copyright (C) 2005- 2006, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + + \brief Implementation of inline versions of stir::overlap_interpolate + \author Kris Thielemans +*/ +#include +#include "boost/iterator/iterator_traits.hpp" + +START_NAMESPACE_STIR +template +void + overlap_interpolate(const out_iter_t out_begin, const out_iter_t out_end, + const out_coord_iter_t out_coord_begin, const out_coord_iter_t out_coord_end, + const in_iter_t in_begin, in_iter_t in_end, + const in_coord_iter_t in_coord_begin, const in_coord_iter_t in_coord_end, + const bool only_add_to_output, + const bool assign_rest_with_zeroes) +{ + + if (out_begin == out_end) + return; + if (in_begin == in_end) + return; + + // check sizes. + // these asserts can be disabled if we ever use this function with iterators + // that don't support the next 2 lines + assert(out_coord_end - out_coord_begin - 1 == (out_end - out_begin)); + assert(in_coord_end - in_coord_begin - 1 == (in_end - in_begin)); + + out_iter_t out_iter = out_begin; + out_coord_iter_t out_coord_iter = out_coord_begin; + + in_iter_t in_iter = in_begin; + in_coord_iter_t in_coord_iter = in_coord_begin; + + // skip input to the left of the output range + assert(in_coord_iter+1 != in_coord_end); + while (*(in_coord_iter+1) <= *out_coord_iter) + { + ++in_coord_iter; ++in_iter; + if (in_coord_iter+1 == in_coord_end) + return; + } + + // skip output to the left of the input range + assert(out_coord_iter+1 != out_coord_end); + while (*(out_coord_iter+1) <= *in_coord_iter) + { + if (!only_add_to_output && assign_rest_with_zeroes) + *out_iter *= 0; // note: use *= such that it works for multi-dim arrays + ++out_coord_iter; ++out_iter; + if (out_coord_iter+1 == out_coord_end) + return; + } + + // now first in-box overlaps guaranteed with first out-box + assert(*(out_coord_iter+1) > *in_coord_iter); + assert(*(in_coord_iter+1) > *out_coord_iter); + + // a typedef for the coordinate type + typedef typename boost::iterator_value::type coord_t; + + // find small number for comparisons. + // we'll take it 1000 times smaller than the minimum of the average out_box size or in_box size + const coord_t epsilon = + std::min(((*(out_coord_end-1)) - (*out_coord_begin)) / + ((out_coord_end-1 - out_coord_begin)*1000), + ((*(in_coord_end-1)) - (*in_coord_begin)) / + ((in_coord_end-1 - in_coord_begin)*1000)); + + // do actual interpolation + // we walk through the boxes, checking the overlap. + // after each step, we'll advance either in_iter or out_iter. + coord_t current_coord = std::max(*in_coord_iter, *out_coord_iter); + bool first_time_for_this_out_box = true; + while (true) + { + // right edge of in-box is beyond out-box + const bool in_beyond_out = + *(in_coord_iter+1) > *(out_coord_iter+1); + const coord_t new_coord = + in_beyond_out ? *(out_coord_iter+1) : *(in_coord_iter+1); +#ifndef STIR_OVERLAP_NORMALISATION + const coord_t overlap = (new_coord - current_coord); +#else + const coord_t overlap = (new_coord - current_coord)/ + (*(out_coord_iter+1) - *(out_coord_iter)); +#endif + assert(overlap>-epsilon); + + if (!only_add_to_output && first_time_for_this_out_box) + { + if (overlap>epsilon) + *out_iter = *in_iter * overlap; + else + *out_iter *= 0; + first_time_for_this_out_box = false; + } + else + { + if (overlap>epsilon) + *out_iter += *in_iter * overlap; + } + current_coord = new_coord; + if (in_beyond_out) + { + ++out_coord_iter; ++out_iter; + if (out_iter == out_end) + { + assert(out_coord_iter+1 == out_coord_end); + return; // all out-boxes are done + } + first_time_for_this_out_box = true; + } + else + { + ++in_coord_iter; ++in_iter; + if (in_iter == in_end) + break; + } + } // end of while + + assert(in_coord_iter+1 == in_coord_end); + // fill rest of output with 0 + if (!only_add_to_output && assign_rest_with_zeroes) + { + while (true) + { + ++out_iter; +#ifndef NDEBUG + // increment just so we can check at the end that there is + // one more out_coord_iter than out_iter + ++out_coord_iter; +#endif + if (out_iter == out_end) + break; + *out_iter *= 0; // note: use *= such that it works for multi-dim arrays + } + assert(out_coord_iter+1 == out_coord_end); + } +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/numerics/sampling_functions.h b/src/include/stir/numerics/sampling_functions.h new file mode 100644 index 0000000000..dab9a2be8c --- /dev/null +++ b/src/include/stir/numerics/sampling_functions.h @@ -0,0 +1,62 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + \brief Sampling functions (currently only stir::sample_function_on_regular_grid) + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ + +START_NAMESPACE_STIR + +/*! + \brief Generic function to get the values of a 3D function on a regular grid + \ingroup numerics + \param[in,out] out array that will be filled with the function values. Its dimensions are used to find + the coordinates where to sample the function (see below). + \param[in] func function to sample + \param[in] offset offset to use for coordinates (see below) + \param[in] step step size to use for coordinates (see below) + + Symbolically, this function does the following computation for every index in the array + \code + out(index) = func(index * step - offset) + \endcode + + \par requirement for type FunctionType + Due to the calling sequence above, the following has to be defined + \code + elemT FunctionType::operator(const BasicCoordinate<3, positionT>&) + \endcode + + \todo At the moment, only the 3D version is implemented, but this could be templated. +*/ +template +inline +void sample_function_on_regular_grid(Array<3,elemT>& out, + FunctionType func, + const BasicCoordinate<3, positionT>& offset, + const BasicCoordinate<3, positionT>& step); + +END_NAMESPACE_STIR + +#include "stir/numerics/sampling_functions.inl" diff --git a/src/include/stir/numerics/sampling_functions.inl b/src/include/stir/numerics/sampling_functions.inl new file mode 100644 index 0000000000..4ac29f321a --- /dev/null +++ b/src/include/stir/numerics/sampling_functions.inl @@ -0,0 +1,65 @@ +// +// +/* +Copyright (C) 2005- 2009, Hammersmith Imanet Ltd +This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \author Kris Thielemans + \author Charalampos Tsoumpas + \ingroup numerics + \brief implementation of stir::sample_function_on_regular_grid +*/ + +START_NAMESPACE_STIR + +template +void sample_function_on_regular_grid(Array<3,elemT>& out, + FunctionType func, + const BasicCoordinate<3, positionT>& offset, + const BasicCoordinate<3, positionT>& step) +{ + BasicCoordinate<3,int> min_out, max_out; + IndexRange<3> out_range = out.get_index_range(); + if (!out_range.get_regular_range(min_out,max_out)) + warning("Output must be regular range!"); + + BasicCoordinate<3, int> index_out; + BasicCoordinate<3, positionT> relative_positions; + index_out[1]=min_out[1]; + relative_positions[1]= index_out[1] * step[1] - offset[1] ; + const BasicCoordinate<3, positionT> max_relative_positions= + (BasicCoordinate<3,positionT>(max_out)+static_cast(.001)) * step + offset; + for (; + index_out[1]<=max_out[1] && relative_positions[1]<=max_relative_positions[1]; + ++index_out[1], relative_positions[1]+= step[1]) + { + index_out[2]=min_out[2]; + relative_positions[2]= index_out[2] * step[2] + offset[2] ; + for (; + index_out[2]<=max_out[2] && relative_positions[2]<=max_relative_positions[2]; + ++index_out[2], relative_positions[2]+= step[2]) + { + index_out[3]=min_out[3]; + relative_positions[3]= index_out[3] * step[3] + offset[3] ; + for (; + index_out[3]<=max_out[3] && relative_positions[3]<=max_relative_positions[3]; + ++index_out[3], relative_positions[3]+= step[3]) + out[index_out] = func(relative_positions) ; + } + } +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/numerics/stir_NumericalRecipes.h b/src/include/stir/numerics/stir_NumericalRecipes.h new file mode 100644 index 0000000000..535b2cef36 --- /dev/null +++ b/src/include/stir/numerics/stir_NumericalRecipes.h @@ -0,0 +1,158 @@ +// +// + +/*! + \file + \ingroup numerics + \brief functions to convert from data in Numerical Recipes format to STIR arrays. + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_numerics_stir_NumericalRecipes_h__ +#define __stir_numerics_stir_NumericalRecipes_h__ + +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" +#include + +START_NAMESPACE_STIR + +/*! + \ingroup numerics + \name functions to convert from data in Numerical Recipes format to STIR arrays. +*/ +//@{ + +inline void stir_to_nr(const VectorWithOffset< std::complex >& c, + VectorWithOffset& nr_data) +{ + for (int i=0; i >& c2d, + VectorWithOffset& nr_data) +{ + + VectorWithOffset::iterator nr_iter = nr_data.begin(); + + Array<2,std::complex >::const_full_iterator iter= + c2d.begin_all(); + + while(iter != c2d.end_all()) + { + *nr_iter++ = iter->real(); + *nr_iter++ = iter->imag(); + ++iter; + } +} + + +inline void stir_to_nr(const VectorWithOffset > >& c2d, + VectorWithOffset& nr_data) +{ + + VectorWithOffset::iterator nr_iter = nr_data.begin(); + + VectorWithOffset > >::const_iterator iter = + c2d.begin(); + while(iter != c2d.end()) + { + Array<1,std::complex >::const_iterator row_iter = iter->begin(); + while(row_iter != iter->end()) + { + *nr_iter++ = row_iter->real(); + *nr_iter++ = row_iter->imag(); + ++row_iter; + } + ++iter; + } +} + +void nr_to_stir(const VectorWithOffset& nr_data, + VectorWithOffset< std::complex >& c) +{ + for (int i=0; i(nr_data[2*i+1], nr_data[2*i+2]); + } +} + +inline void nr_to_stir(const VectorWithOffset& nr_data, + Array<2,std::complex > & c2d) +{ + VectorWithOffset::const_iterator nr_iter = nr_data.begin(); + Array<2,std::complex >::full_iterator iter= + c2d.begin_all(); + while(iter != c2d.end_all()) + { + *iter = std::complex(*nr_iter, *(nr_iter+1)); + nr_iter+= 2; + ++iter; + } +} + +inline void nr_to_stir(const VectorWithOffset& nr_data, + VectorWithOffset > >& c2d) +{ + VectorWithOffset::const_iterator nr_iter = nr_data.begin(); + VectorWithOffset > >::iterator iter = + c2d.begin(); + while(iter != c2d.end()) + { + Array<1,std::complex >::iterator row_iter = iter->begin(); + while(row_iter != iter->end()) + { + *row_iter = std::complex(*nr_iter, *(nr_iter+1)); + nr_iter+= 2; + ++row_iter; + } + ++iter; + } +} + +#if 0 +void real_to_complex(const VectorWithOffset< std::complex >& c, + VectorWithOffset& nr_data) +{ + Array<2,std::complex >::const_full_iterator iter= + c2d.begin_all(); + + while(iter != c2d.end_all()) + { + *nr_iter++ = iter->real(); + *nr_iter++ = iter->imag(); + ++iter; + } + for (int i=0; i class SegmentByView; +template class SegmentBySinogram; +template class Viewgram; +template class RelatedViewgrams; +template class DiscretisedDensity; + +#if 0 +//! scales an image and adds it to another +void multiply_and_add(DiscretisedDensity<3,float> &image_res, const DiscretisedDensity<3,float> &image_scaled, float scalar); +#endif + +//! truncates negative values to zero +float neg_trunc(float x); + +//MJ 17/05/2000 disabled +// gives 1 if negative, 0 otherwise +//float neg_indicate(float x){return (x<=0.0)?1.0:0.0;} + +#if 0 +//! sets non-positive voxel values to small positive ones AND truncate to circular FOV +/*! \warning Really makes only sense for images of type DiscretisedDensityOnCartesianGrid + (or derived types) + */ +void threshold_min_to_small_positive_value_and_truncate_rim(DiscretisedDensity<3,float>& input_image, const int rim_truncation_image=0); + +//! divide sinograms and set 'edge bins' to zero, put answer in numerator +void divide_and_truncate(DiscretisedDensity<3,float>& numerator, + const DiscretisedDensity<3,float>& denominator, + const int rim_truncation, + int & count); +#endif + +//! divide viewgrams and set 'edge bins' to zero, put answer in numerator +void divide_and_truncate(Viewgram& numerator, const Viewgram& denominator, + const int rim_truncation_sino, + int& count, int& count2, double* f = NULL); + +//! divide related viewgrams and set 'edge bins' to zero, put answer in numerator +void divide_and_truncate(RelatedViewgrams& numerator, const RelatedViewgrams& denominator, + const int rim_truncation_sino, + int& count, int& count2, double* f = NULL); + +//! sets to zero voxels within rim_truncation_image of the FOV rim +void truncate_rim(DiscretisedDensity<3,float>& image_input, + const int rim_truncation_image, + const bool strictly_less_than_radius = true); + + + +//! sets the first and last rim_truncation_sino bins at the 'edges' to zero +void truncate_rim(SegmentByView& seg, const int rim_truncation_sino); + +//! sets the first and last rim_truncation_sino bins at the 'edges' to zero +void truncate_rim(Viewgram& viewgram, const int rim_truncation_sino); + +//! sets the end planes of the image to zero +void truncate_end_planes(DiscretisedDensity<3,float> &input_image, int input_num_planes=1); + +//! simple division of two sinograms, x/0 = 0 +void divide_array(SegmentByView& numerator, const SegmentByView& denominator); + +//! simple division of two images, x/0 = 0 +void divide_array(DiscretisedDensity<3,float>& numerator, const DiscretisedDensity<3,float>& denominator); + +//MJ 03/01/2000 Trying to adhoc parallelize a loglikelihood computation + +//! compute the log term of the loglikelihood function for given part of the projection space +void accumulate_loglikelihood(Viewgram& projection_data, + const Viewgram& estimated_projections, + const int rim_truncation_sino, + double* accum); + +//! compute the log term of the loglikelihood function for given part of the image space +void accumulate_loglikelihood(DiscretisedDensity<3,float>& outer_loop_dyn_image_estimate, + const DiscretisedDensity<3,float>& nested_loop_dyn_image_estimate, + const int rim_truncation_sino, + double* accum); + + +END_NAMESPACE_STIR +#endif // __recon_array_functions_h_ + diff --git a/src/include/stir/recon_buildblock/AnalyticReconstruction.h b/src/include/stir/recon_buildblock/AnalyticReconstruction.h new file mode 100644 index 0000000000..32438e5134 --- /dev/null +++ b/src/include/stir/recon_buildblock/AnalyticReconstruction.h @@ -0,0 +1,163 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_recon_buildblock_AnalyticReconstruction_H__ +#define __stir_recon_buildblock_AnalyticReconstruction_H__ +/*! + \file + \ingroup recon_buildblock + + \brief declares the stir::AnalyticReconstruction class + + \author Kris Thielemans + \author Matthew Jacobson + \author Claire Labbe + \author PARAPET project + +*/ +/* Modification history + + KT 10122001 + - added construct_target_image_ptr and 0 argument reconstruct() +*/ + +#include "stir/recon_buildblock/Reconstruction.h" +#include "stir/DiscretisedDensity.h" +#include "stir/ProjData.h" +#include + + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + + +class Succeeded; + +/*! + \brief base class for all analytic reconstruction algorithms + \ingroup recon_buildblock + This class provides extra functinoality (compared to Reconstruction) as it assumes + that the \c TargetT is really a VoxelsOnCartesianGrid. + + \todo Currently the template argument uses DiscretisedDensity + because of conversion problems with stir::shared_ptr. Maybe it will be + possible to correct this once we use boost:shared_ptr. + */ +class AnalyticReconstruction : public Reconstruction > +{ +protected: + typedef DiscretisedDensity<3,float> TargetT; +private: + typedef Reconstruction base_type; +public: + + //! construct an image from parameters set (e.g. during parsing) + virtual DiscretisedDensity<3,float>* + construct_target_image_ptr() const; + + //! reconstruct and write to file + /*! + Calls construct_target_image_ptr() and then actual_reconstruct(target_image_sptr). + At the end of the reconstruction, the final image is saved to file as given in + Reconstruction::output_filename_prefix. + \return Succeeded::yes if everything was alright. + */ + virtual Succeeded + reconstruct(); + + //! executes the reconstruction storing result in \c target_image_sptr + /*! + Calls actual_reconstruct() + \return Succeeded::yes if everything was alright. + + \par Developer\'s note + + Because of C++ rules, overloading one of the reconstruct() functions + in a derived class, hides the other. So, we need an implementation for + this function. This is the reason to use the actual_reconstruct function. + */ + virtual Succeeded + reconstruct(shared_ptr const& target_image_sptr); + + // parameters + protected: + + //! the output image size in x and y direction + /*! convention: if -1, use a size such that the whole FOV is covered + */ + int output_image_size_xy; + + //! the output image size in z direction + /*! convention: if -1, use default as provided by VoxelsOnCartesianGrid constructor + */ + int output_image_size_z; + + //! the zoom factor + double zoom; + + //! offset in the x-direction + double Xoffset; + + //! offset in the y-direction + double Yoffset; + + //! offset in the z-direction + double Zoffset; + + + //! the input projection data file name + string input_filename; + //! the maximum absolute ring difference number to use in the reconstruction + /*! convention: if -1, use get_max_segment_num()*/ + int max_segment_num_to_process; + + //! points to the object for the total input projection data + shared_ptr proj_data_ptr; + // KT 20/06/2001 disabled +#if 0 + //! number of views to add (i.e. mashing) + int num_views_to_add; +#endif + + + +protected: + //! executes the reconstruction storing result in \c target_image_sptr + /*! + \return Succeeded::yes if everything was alright. + */ + virtual Succeeded + actual_reconstruct(shared_ptr const& target_image_sptr) = 0; + + //! used to check acceptable parameter ranges, etc... + virtual bool post_processing(); + virtual void set_defaults(); + virtual void initialise_keymap(); + + +}; + +END_NAMESPACE_STIR + + +#endif + diff --git a/src/include/stir/recon_buildblock/BackProjectorByBin.h b/src/include/stir/recon_buildblock/BackProjectorByBin.h new file mode 100644 index 0000000000..f7bcad25d2 --- /dev/null +++ b/src/include/stir/recon_buildblock/BackProjectorByBin.h @@ -0,0 +1,129 @@ +// +// +/*! + \file + \ingroup projection + + \brief Declares class stir::BackProjectorByBin + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_recon_buildblock_BackProjectorByBin_h_ +#define __stir_recon_buildblock_BackProjectorByBin_h_ + +#include "stir/RegisteredObject.h" +#include "stir/TimedObject.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class RelatedViewgrams; +template class DiscretisedDensity; +class ProjDataInfo; +class ProjData; +class DataSymmetriesForViewSegmentNumbers; + + + +/*! + \ingroup projection + \brief Abstract base class for all back projectors +*/ +class BackProjectorByBin : + public TimedObject, + public RegisteredObject +{ +public: + + //! Default constructor calls reset_timers() + BackProjectorByBin(); + + virtual ~BackProjectorByBin(); + + //! Stores all necessary geometric info + /*! + If necessary, set_up() can be called more than once. + + Derived classes can assume that back_project() will be called + with input corresponding to the arguments of the last call to set_up(). + + \warning there is currently no check on this. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ) =0; + + /*! \brief Informs on which symmetries the projector handles + It should get data related by at least those symmetries. + Otherwise, a run-time error will occur (unless the derived + class has other behaviour). + */ + virtual const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const = 0; + + + //! project whole proj_data into the volume + /*! it overwrites the data already present in the volume */ + void back_project(DiscretisedDensity<3,float>&, + const ProjData&); + + /*! \brief projects the viewgrams into the volume + it adds to the data already present in the volume.*/ + void back_project(DiscretisedDensity<3,float>&, + const RelatedViewgrams&); + + /*! \brief projects the specified range of the viewgrams into the volume + it adds to the data already present in the volume.*/ + void back_project(DiscretisedDensity<3,float>&, + const RelatedViewgrams&, + const int min_axial_pos_num, const int max_axial_pos_num); + + /*! \brief projects the specified range of the viewgrams into the volume + it adds to the data already present in the volume.*/ + void back_project(DiscretisedDensity<3,float>&, + const RelatedViewgrams&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + +protected: + + virtual void actual_back_project(DiscretisedDensity<3,float>&, + const RelatedViewgrams&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) = 0; +private: + void do_segments(DiscretisedDensity<3,float>& image, + const ProjData& proj_data_org, + const int start_segment_num, const int end_segment_num, + const int start_axial_pos_num, const int end_axial_pos_num, + const int start_tang_pos_num,const int end_tang_pos_num, + const int start_view, const int end_view); + + +}; + +END_NAMESPACE_STIR + + +#endif // __BackProjectorByBin_h_ diff --git a/src/include/stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h b/src/include/stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h new file mode 100644 index 0000000000..7f01569856 --- /dev/null +++ b/src/include/stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h @@ -0,0 +1,329 @@ +// +// +/*! + + \file + \ingroup projection + + \brief Declares class stir::BackProjectorByBinUsingInterpolation + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __BackProjectorByBinUsingInterpolation_h_ +#define __BackProjectorByBinUsingInterpolation_h_ + +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class Viewgram; +template class RelatedViewgrams; +template class VoxelsOnCartesianGrid; +template class Array; +class ProjDataInfo; +class ProjDataInfoCylindricalArcCorr; +class DataSymmetriesForBins_PET_CartesianGrid; +/*! + \brief + The next class is used in BackProjectorByBinUsingInterpolation + to take geometric things + into account. It also includes some normalisation. (internal use only). + + \internal + + Use as follows: + \code + const JacobianForIntBP jacobian(*(segment.scanner)); + jacobian(segment.get_average_delta(), s+ 0.5); + \endcode + */ + + +class JacobianForIntBP +{ +private: + // store some scanner related data to avoid recomputation + const float R2; + const float dxy2; + const float ring_spacing2; + // total normalisation of backprojection, 3 factors: + // (_Pi/scanner.num_views) for discretisation of integral over phi + // scanner.ring_spacing for discretisation of integral over delta + // normalisation of projection space integral: 1/(2 Pi) + + const float backprojection_normalisation; + + const bool use_exact_Jacobian_now; + +public: + explicit JacobianForIntBP(const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, bool exact); + + float operator()(const float delta, const float s) const + { + float tmp; + if (use_exact_Jacobian_now) + tmp = 4*(R2 - dxy2 * s*s); + else + tmp = 4*R2; + return tmp / pow(tmp + ring_spacing2*delta*delta, 1.5F)* backprojection_normalisation; + } +}; + + +/*! + \ingroup projection + \brief does backprojection by interpolating between the bins. + + This implementation uses incremental backprojection + + Two versions of interpolation are implemented: +
          +
        • ordinary linear interpolation +
        • piecewise linear interpolation in the axial direction +
        + The former is an implementation of + "Incremental beamwise backprojection using geometrical symmetries for 3D PET reconstruction + in a cylindrical scanner geometry" + M L Egger, C Joseph, C Morel, Phys. Med. Biol. (1998) 43 3009-3024 + http://dx.doi.org/10.1088/0031-9155/43/10/023 + + For the latter, see the extended abstract for 3D99 + "On various approximations for the projectors in iterative reconstruction algorithms for + 3D-PET", K. Thielemans, M.W. Jacobson, D. Belluzzo. Available on the STIR web-site. + + The piecewise linear interpolation is only used when the axial voxel size is half the + axial_sampling of the projection data (for the segment in question). + + \warning This implementation makes various assumptions (for optimal speed): +
          +
        • voxel_size.x() = voxel_size.y() +
        • arc-corrected data +
        • voxel_size.z() is either equal to or half the axial_sampling of the projection data +
        + When the bin size is not equal to the voxel_size.x(), zoom_viewgrams() is first called to + adjust the bin size, then the usual incremental backprojection is used. + + \bug Currently this implementation has problems on certain processors + due to floating point rounding errors. Intel *86 and PowerPC give + correct results, SunSparc has a problem at tangential_pos_num==0 (also HP + stations give problems). +*/ +class BackProjectorByBinUsingInterpolation : + public RegisteredParsingObject + +{ +public: + //! Name which will be used when parsing a BackProjectorByBin object + static const char * const registered_name; + + //! The constructor defaults to using piecewise linear interpolation and the exact Jacobian + explicit + BackProjectorByBinUsingInterpolation( + const bool use_piecewise_linear_interpolation = true, + const bool use_exact_Jacobian = true); + + //! The constructor defaults to using piecewise linear interpolation and the exact Jacobian + /*! \deprecated Use set_up() instead */ + BackProjectorByBinUsingInterpolation( + shared_ptrconst&, + shared_ptr > const& image_info_ptr, + const bool use_piecewise_linear_interpolation = true, const bool use_exact_Jacobian = true); + + //! Stores all necessary geometric info + /*! Note that the density_info_ptr is not stored in this object. It's only used to get some info on sizes etc. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + + /*! \brief Gets the symmetries used by this backprojector + + \warning This BackProjectorByBin implementation requires that the + RelatedViewgrams data are constructed with symmetries corresponding + to the current member. Using another DataSymmetriesForViewSegmentNumbers + object will likely crash the program. + */ + const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const; + /*! + \brief Use this to switch between the exact Jacobian and + an approximate Jacobian (valid for s << R). + */ + void use_exact_Jacobian(const bool use_exact_Jacobian); + + + /*! + \brief Use this to switch between ordinary linear interpolation and + piece-wise linear interpolation in the axial direction. + */ + void use_piecewise_linear_interpolation(const bool use_piecewise_linear_interpolation); + +private: + + // KT 20/06/2001 changed type to enable use of more methods + shared_ptr symmetries_ptr; + //const DataSymmetriesForViewSegmentNumbers * symmetries_ptr; + + bool use_piecewise_linear_interpolation_now; + + bool use_exact_Jacobian_now; + + //! \name variables determining which symmetries will be used + /*! \warning do NOT use. They are only here for testing purposes */ + //@{ + bool do_symmetry_90degrees_min_phi; + bool do_symmetry_180degrees_min_phi; + bool do_symmetry_swap_segment; + bool do_symmetry_swap_s; + bool do_symmetry_shift_z; + //@} + +#if 0 + // not used yet +struct ProjDataForIntBP +{ + float view__pos_s; + float view__pos_sp1; + float view__neg_s; + float view__neg_sp1; + float min90__pos_s; + float min90__pos_sp1; + float min90__neg_s; + float min90__neg_sp1; + float plus90__pos_s; + float plus90__pos_sp1; + float plus90__neg_s; + float plus90__neg_sp1; + float min180__pos_s; + float min180__pos_sp1; + float min180__neg_s; + float min180__neg_sp1; +}; +#endif + + void actual_back_project(DiscretisedDensity<3,float>&, + const RelatedViewgrams&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + + virtual void + back_project_all_symmetries( VoxelsOnCartesianGrid& image, + const Viewgram & pos_view, + const Viewgram & neg_view, + const Viewgram & pos_plus90, + const Viewgram & neg_plus90, + const Viewgram & pos_min180, + const Viewgram & neg_min180, + const Viewgram & pos_min90, + const Viewgram & neg_min90, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + /* + This function projects 4 viewgrams related by symmetry. + It will be used for view=0 or 45 degrees + (or all others if the above version is not implemented in + the derived class) + Here 0<=view < num_views/2 (= 90 degrees) + */ + + virtual void + back_project_view_plus_90_and_delta(VoxelsOnCartesianGrid& image, + const Viewgram & pos_view, + const Viewgram & neg_view, + const Viewgram & pos_plus90, + const Viewgram & neg_plus90, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + /* + void back_project_2D_view_plus_90(const PETSinogram &sino, PETPlane &image, int view, + const int min_bin_num, const intmax_tangential_pos_num); + void back_project_2D_all_symmetries(const PETSinogram &sino, PETPlane &image, int view, + const int min_bin_num, const intmax_tangential_pos_num); +*/ + + +/* + + These functions use a 3D version of Cho's algorithm for backprojecting incrementally. + See M. Egger's thesis for details. + In addition to the symmetries mentioned above, they also use s,-s symmetry + (while being careful when s=0 to avoid self-symmetric cases) + */ + + + static void piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90(Array<4, float > const & Projptr, + VoxelsOnCartesianGrid& image, + const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + float delta, + const double cphi, const double sphi, int s, int ax_pos0, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset); + + static void piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview(Array<4, float > const &Projptr, + VoxelsOnCartesianGrid& image, + const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + float delta, + const double cphi, const double sphi, int s, int ax_pos0, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset); + + static void linear_interpolation_backproj3D_Cho_view_viewplus90(Array<4, float > const & Projptr, + VoxelsOnCartesianGrid& image, + const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + float delta, + const double cphi, const double sphi, int s, int ax_pos0, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset); + + static void linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview(Array<4, float > const &Projptr, + VoxelsOnCartesianGrid& image, + const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + float delta, + const double cphi, const double sphi, int s, int ax_pos0, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset); + + /* +static void backproj2D_Cho_view_viewplus90( PETPlane & image, + const ProjDataForIntBP &projs, + const double cphi, const double sphi, int s); + + static void backproj2D_Cho_view_viewplus90_180minview_90minview( PETPlane & image, + const ProjDataForIntBP &projs, + const double cphi, const double sphi, int s); + +*/ + virtual void set_defaults(); + virtual void initialise_keymap(); + +}; + +END_NAMESPACE_STIR + + +#endif // __BackProjectorByBinUsingInterpolation_h_ + diff --git a/src/include/stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h b/src/include/stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h new file mode 100644 index 0000000000..f4958e1420 --- /dev/null +++ b/src/include/stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h @@ -0,0 +1,111 @@ +// +// + + +#ifndef _BackProjectorByBinUsingProjMatrixByBin_ +#define _BackProjectorByBinUsingProjMatrixByBin_ + +/*! + + \file + + \brief Declaration of class stir::BackprojectorByBinUsingProjMatrixByBin + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/shared_ptr.h" +//#include "stir/DataSymmetriesForBins.h" +//#include "stir/RelatedViewgrams.h" + +class Viewgrams; +template class RelatedViewgrams; +class ProjDataInfoCylindricalArcCorr; + + +START_NAMESPACE_STIR + +/*! + \brief This implements the BackProjectorByBin interface, given any +ProjMatrixByBin object + + */ +class BackProjectorByBinUsingProjMatrixByBin: + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a BackProjectorByBin object + static const char * const registered_name; + + BackProjectorByBinUsingProjMatrixByBin(); + + BackProjectorByBinUsingProjMatrixByBin ( + const shared_ptr& proj_matrix_ptr); + + //! Stores all necessary geometric info + /*! Note that the density_info_ptr is not stored in this object. It's only used to get some info on sizes etc. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + + const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const; + + + virtual void actual_back_project(DiscretisedDensity<3,float>& image, + const RelatedViewgrams&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + + shared_ptr & + get_proj_matrix_sptr(){ return proj_matrix_ptr ;} + + +protected: + + shared_ptr proj_matrix_ptr; + +private: + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + + + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.inl" + +#endif + + diff --git a/src/include/stir/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.h b/src/include/stir/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.h new file mode 100644 index 0000000000..487202e144 --- /dev/null +++ b/src/include/stir/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.h @@ -0,0 +1,96 @@ +// +// $Id: BackProjectorByBinUsingSquareProjMatrixByBin.h +// + + +#ifndef _BackProjectorByBinUsingSquareProjMatrixByBin_ +#define _BackProjectorByBinUsingSquareProjMatrixByBin_ + +/*! + + \file + + \brief + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project + + $Date: + + $Revision: +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2001, IRSL + See STIR/LICENSE.txt for details +*/ + +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/shared_ptr.h" +//#include "stir/recon_buildblock/DataSymmetriesForBins.h" +//#include "stir/RelatedViewgrams.h" + +class Viewgrams; +template class RelatedViewgrams; +class ProjDataInfoCylindricalArcCorr; + + +START_NAMESPACE_STIR + +/*! + \brief This implements the BackProjectorByBin interface, given any +ProjMatrixByBin object + + */ +class BackProjectorByBinUsingSquareProjMatrixByBin: + public RegisteredParsingObject +{ +public: + static const char * const registered_name; + + BackProjectorByBinUsingSquareProjMatrixByBin(); + + BackProjectorByBinUsingSquareProjMatrixByBin ( + const shared_ptr& proj_matrix_ptr); + + + const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const; + + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + + + virtual void actual_back_project(DiscretisedDensity<3,float>& image, + const RelatedViewgrams&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + + shared_ptr & + get_proj_matrix_sptr(){ return proj_matrix_ptr ;} + + protected: + + shared_ptr proj_matrix_ptr; + +private: + virtual void set_defaults(); + virtual void initialise_keymap(); +}; + + + + +END_NAMESPACE_STIR + +//#include "stir/BackProjectorByBinUsingSquareProjMatrixByBin.inl" + +#endif + + diff --git a/src/include/stir/recon_buildblock/BinNormalisation.h b/src/include/stir/recon_buildblock/BinNormalisation.h new file mode 100644 index 0000000000..83d448247a --- /dev/null +++ b/src/include/stir/recon_buildblock/BinNormalisation.h @@ -0,0 +1,104 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup normalisation + + \brief Declaration of class stir::BinNormalisation + + \author Kris Thielemans +*/ + +#ifndef __stir_recon_buildblock_BinNormalisation_H__ +#define __stir_recon_buildblock_BinNormalisation_H__ + + +#include "stir/RegisteredObject.h" +#include "stir/Bin.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class RelatedViewgrams; +class Succeeded; +class ProjDataInfo; +/*! + \ingroup normalisation + \brief Abstract base class for implementing bin-wise normalisation of data. + + As part of the measurement model in PET, there usually is some multiplicative + correction for every bin, as in + \f[ P^\mathrm{full}_{bv} = \mathrm{norm}_b P^\mathrm{normalised}_{bv} \f] + This multiplicative correction is usually split in the \c normalisation + factors (which are scanner dependent) and the \c attenuation factors (which + are object dependent). + + The present class can be used for both of these factors. +*/ +class BinNormalisation : public RegisteredObject +{ +public: + virtual ~BinNormalisation(); + + //! check if we would be multiplying with 1 (i.e. do nothing) + /*! This function can be used to check if the operations are guaranteed to do nothing + (while potentially taking time and effort). The base-class sets this to always + return false. It is up to the derived class to change this. + */ + virtual inline bool is_trivial() const { return false;} + + //! initialises the object and checks if it can handle such projection data + /*! Default version does nothing. */ + virtual Succeeded set_up(const shared_ptr&); + + //! Return the 'efficiency' factor for a single bin + /*! With the notation of the class documentation, this returns the factor + \f$\mathrm{norm}_b \f$. + + \warning Some derived classes might implement this very inefficiently. + */ + virtual float get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const =0; + + //! normalise some data + /*! + This would be used for instance to precorrect unnormalised data. With the + notation of the class documentation, this would \c divide by the factors + \f$\mathrm{norm}_b \f$. + + Default implementation divides with the factors returned by get_bin_efficiency() + (after applying a threshold to avoid division by 0). + */ + virtual void apply(RelatedViewgrams&,const double start_time, const double end_time) const; + + //! undo the normalisation of some data + /*! + This would be used for instance to bring geometrically forward projected data to + the mean of the measured data. With the + notation of the class documentation, this would \c multiply by the factors + \f$\mathrm{norm}_b \f$. + + Default implementation multiplies with the factors returned by get_bin_efficiency(). + */ + virtual void undo(RelatedViewgrams&,const double start_time, const double end_time) const; + +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/BinNormalisationFromAttenuationImage.h b/src/include/stir/recon_buildblock/BinNormalisationFromAttenuationImage.h new file mode 100644 index 0000000000..79e4589e91 --- /dev/null +++ b/src/include/stir/recon_buildblock/BinNormalisationFromAttenuationImage.h @@ -0,0 +1,131 @@ +// +// +/*! + \file + \ingroup normalisation + + \brief Declaration of class stir::BinNormalisationFromAttenuationImage + + \author Kris Thielemans +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_BinNormalisationFromAttenuationImage_H__ +#define __stir_recon_buildblock_BinNormalisationFromAttenuationImage_H__ + +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/recon_buildblock/ForwardProjectorByBin.h" +#include + +#ifndef STIR_NO_NAMESPACE +using std::string; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup normalisation + \brief A BinNormalisation class that gets attenuation correction factors from + an attenuation image + + This forwards projects the attenuation image, multiplies with -1, and exponentiates + to obtain the attenuation correction factors. + + Default forward projector is ForwardProjectorByBinUsingRayTracing. + + \warning Attenuation image data are supposed to be in units cm^-1. + (Reference: water has mu .096 cm^-1.) + \todo Add mechanism for caching the attenuation correction factors, such that they will + be calculated only once. However, caching should by default be disabled, as most + applications need them only once anyway. + + \par Parsing details + \verbatim + Bin Normalisation From Attenuation Image:= + attenuation_image_filename := + forward projector type := + End Bin Normalisation From Attenuation Image := + \endverbatim +*/ +class BinNormalisationFromAttenuationImage : + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a BinNormalisation object + static const char * const registered_name; + + //! Default constructor + /*! + \warning You should not call any member functions for any object just + constructed with this constructor. Initialise the object properly first + by parsing. + */ + BinNormalisationFromAttenuationImage(); + + //! Constructor that reads the image from a file + /*! Default forward projector is ForwardProjectorByBinUsingRayTracing. */ + BinNormalisationFromAttenuationImage(const string& filename, shared_ptr const& =shared_ptr()); + + //! Constructor that takes the image as an argument + /*! Default forward projector is ForwardProjectorByBinUsingRayTracing. + The image pointed to by attenuation_image_ptr is NOT modified. + */ + BinNormalisationFromAttenuationImage(shared_ptr > const& attenuation_image_ptr, + shared_ptr const& = shared_ptr()); + + //! Checks if we can handle certain projection data. + /*! This test is essentially checking if the forward projector can handle the data + by calling ForwardProjectorByBin::set_up(). + */ + virtual Succeeded set_up(const shared_ptr&); + + //! Normalise some data + /*! + This means \c multiply with the data in the projdata object + passed in the constructor. + */ + virtual void apply(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const; + + //! Undo the normalisation of some data + /*! + This means \c divide with the data in the projdata object + passed in the constructor. + */ + virtual void undo(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const; + + virtual float get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const; + +private: + shared_ptr > attenuation_image_ptr; + shared_ptr forward_projector_ptr; + + // parsing stuff + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + string attenuation_image_filename; +}; + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/BinNormalisationFromECAT7.h b/src/include/stir/recon_buildblock/BinNormalisationFromECAT7.h new file mode 100644 index 0000000000..6958c5468b --- /dev/null +++ b/src/include/stir/recon_buildblock/BinNormalisationFromECAT7.h @@ -0,0 +1,149 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup recon_buildblock + + \brief Declaration of class stir::ecat::ecat7::BinNormalisationFromECAT7 + + \author Kris Thielemans +*/ + +#ifndef HAVE_LLN_MATRIX +#error This file can only be compiled when HAVE_LLN_MATRIX is #defined +#endif + +#ifndef __stir_recon_buildblock_BinNormalisationFromECAT7_H__ +#define __stir_recon_buildblock_BinNormalisationFromECAT7_H__ + +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/data/SinglesRates.h" +#include "stir/Scanner.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/Array.h" +#include + +#ifndef STIR_NO_NAMESPACE +using std::string; +#endif + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +/*! + \ingroup recon_buildblock + \ingroup ECAT + \brief A BinNormalisation class that gets the normalisation factors from + an ECAT7 3D normalisation file + + \par Parsing example + \verbatim + Bin Normalisation type := from ecat7 + Bin Normalisation From ECAT7:= + normalisation filename:= myfile.n + ; next keyword gives the singles to be used for dead-time correction + ; normally set to get the info from the ECAT7 sinogram + ; + singles rates:= Singles From ECAT7 + Singles Rates From ECAT7 := + ecat7_filename := ${ecat7_filename} + End Singles Rates From ECAT7:= + + ; next keywords can be used to switch off some of the normalisation components + ; do not use unless you know why + ; use_detector_efficiencies:=1 + ; use_dead_time:=1 + ; use_geometric_factors:=1 + ; use_crystal_interference_factors:=1 + End Bin Normalisation From ECAT7:= + \endverbatim + +*/ +class BinNormalisationFromECAT7 : + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a BinNormalisation object + static const char * const registered_name; + + //! Default constructor + /*! + \warning You should not call any member functions for any object just + constructed with this constructor. Initialise the object properly first + by parsing. + */ + BinNormalisationFromECAT7(); + + //! Constructor that reads the projdata from a file + BinNormalisationFromECAT7(const string& filename); + + virtual Succeeded set_up(const shared_ptr&); + float get_bin_efficiency(const Bin& bin, const double start_time, const double end_time) const; + + bool use_detector_efficiencies() const; + bool use_dead_time() const; + bool use_geometric_factors() const; + bool use_crystal_interference_factors() const; + +private: + Array<1,float> axial_t1_array; + Array<1,float> axial_t2_array; + Array<1,float> trans_t1_array; + shared_ptr singles_rates_ptr; + Array<2,float> geometric_factors; + Array<2,float> efficiency_factors; + Array<2,float> crystal_interference_factors; + shared_ptr scanner_ptr; + int num_transaxial_crystals_per_block; + // TODO move to Scanner + int num_axial_blocks_per_singles_unit; + shared_ptr proj_data_info_ptr; + ProjDataInfoCylindricalNoArcCorr const * proj_data_info_cyl_ptr; + shared_ptr proj_data_info_cyl_uncompressed_ptr; + int span; + int mash; + int num_blocks_per_singles_unit; + + bool _use_detector_efficiencies; + bool _use_dead_time; + bool _use_geometric_factors; + bool _use_crystal_interference_factors; + + void read_norm_data(const string& filename); + float get_dead_time_efficiency ( const DetectionPosition<>& det_pos, + const double start_time, const double end_time) const; + + // parsing stuff + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + string normalisation_ECAT7_filename; +}; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/BinNormalisationFromProjData.h b/src/include/stir/recon_buildblock/BinNormalisationFromProjData.h new file mode 100644 index 0000000000..d69bddbe24 --- /dev/null +++ b/src/include/stir/recon_buildblock/BinNormalisationFromProjData.h @@ -0,0 +1,119 @@ +// +// +/*! + \file + \ingroup normalisation + + \brief Declaration of class stir::BinNormalisationFromProjData + + \author Kris Thielemans +*/ +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_BinNormalisationFromProjData_H__ +#define __stir_recon_buildblock_BinNormalisationFromProjData_H__ + +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +#include + +#ifndef STIR_NO_NAMESPACE +using std::string; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup normalisation + \brief A BinNormalisation class that gets the normalisation factors from + a ProjData object + + \warning the ProjData object containing the normalisation factors should + currently have exactly the same dimensions as the data it is applied on. + + \par Parsing details + \verbatim + Bin Normalisation From ProjData:= + normalisation projdata filename := + End Bin Normalisation From ProjData:= + \endverbatim +*/ +class BinNormalisationFromProjData : + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a BinNormalisation object + static const char * const registered_name; + + //! Default constructor + /*! + \warning You should not call any member functions for any object just + constructed with this constructor. Initialise the object properly first + by parsing. + */ + BinNormalisationFromProjData(); + + //! Constructor that reads the projdata from a file + BinNormalisationFromProjData(const string& filename); + + //! Constructor that takes the projdata from a shared_pointer + /*! The projdata object pointed to will \c not be modified. */ + BinNormalisationFromProjData(const shared_ptr& norm_proj_data_ptr); + + //! check if we would be multiplying with 1 (i.e. do nothing) + /*! Checks if all data is equal to 1 (up to a tolerance of 1e-4). To do this, it uses ProjData::get_viewgram() + and loops over all viewgrams. + */ + virtual bool is_trivial() const; + + //! Checks if we can handle certain projection data. + /*! Compares the ProjDataInfo from the ProjData object containing the normalisation factors + with the ProjDataInfo supplied. */ + virtual Succeeded set_up(const shared_ptr&); + + //! Normalise some data + /*! + This means \c multiply with the data in the projdata object + passed in the constructor. + */ + virtual void apply(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const; + + //! Undo the normalisation of some data + /*! + This means \c divide with the data in the projdata object + passed in the constructor. + */ + virtual void undo(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const; + + virtual float get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const; + +private: + shared_ptr norm_proj_data_ptr; + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + string normalisation_projdata_filename; +}; + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/ChainedBinNormalisation.h b/src/include/stir/recon_buildblock/ChainedBinNormalisation.h new file mode 100644 index 0000000000..0aae69824d --- /dev/null +++ b/src/include/stir/recon_buildblock/ChainedBinNormalisation.h @@ -0,0 +1,126 @@ +// +// +/*! + \file + \ingroup normalisation + + \brief Declaration of class ChainedBinNormalisation + + \author Kris Thielemans +*/ +/* + Copyright (C) 2003- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_ChainedBinNormalisation_H__ +#define __stir_recon_buildblock_ChainedBinNormalisation_H__ + +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +/*! + \ingroup normalisation + \brief A BinNormalisation class that simply multiplies the factors given by + 2 BinNormalisation objects. + + This is especially useful to combine the 'usual' normalisation factors and attenuation factors + in PET. As both are multiplicative corrections, they both belong in the BinNormalisation + hierarchy. + + \par Parsing details + \verbatim + Chained Bin Normalisation Parameters:= + ; type of one of the bin normalisations, followed by its parameters + Bin Normalisation to apply first := + + ; type of the other, and its parameters + Bin Normalisation to apply second := + END Chained Bin Normalisation Parameters := + \endverbatim + \par Example + This example shows how to construct the parameter file for the case that there + are normalisation factors in a file \a norm.hs and an attenuation image in a file + \a atten.hv. + \see BinNormalisationFromProjData, BinNormalisationFromAttenuationImage. + + \verbatim + Bin Normalisation type := Chained + Chained Bin Normalisation Parameters:= + Bin Normalisation to apply first := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= norm.hs + End Bin Normalisation From ProjData:= + Bin Normalisation to apply second := From Attenuation Image + Bin Normalisation From Attenuation Image:= + attenuation_image_filename := atten.hv + forward projector type := ray tracing + Forward Projector Using Ray Tracing Parameters := + End Forward Projector Using Ray Tracing Parameters := + End Bin Normalisation From Attenuation Image := + END Chained Bin Normalisation Parameters := + \endverbatim +*/ +class ChainedBinNormalisation : + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a BinNormalisation object + static const char * const registered_name; + + //! Default constructor + /*! + \warning You should not call any member functions for any object just + constructed with this constructor. Initialise the object properly first + by parsing. + */ + ChainedBinNormalisation(); + +ChainedBinNormalisation(shared_ptr const& apply_first, + shared_ptr const& apply_second); + + //! Checks if we can handle certain projection data. + /*! Calls set_up for the BinNormalisation members. */ + virtual Succeeded set_up(const shared_ptr&); + + //! Normalise some data + /*! + This calls apply() of the 2 BinNormalisation members + */ + virtual void apply(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const; + + //! Undo the normalisation of some data + /*! + This calls undo() of the 2 BinNormalisation members. + */ + virtual void undo(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const; + + virtual float get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const; + + +private: + shared_ptr apply_first; + shared_ptr apply_second; + // parsing stuff + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/DataSymmetriesForBins.h b/src/include/stir/recon_buildblock/DataSymmetriesForBins.h new file mode 100644 index 0000000000..b43fd5f6f5 --- /dev/null +++ b/src/include/stir/recon_buildblock/DataSymmetriesForBins.h @@ -0,0 +1,199 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup symmetries + + \brief Declaration of class stir::DataSymmetriesForBins + + \author Kris Thielemans + \author PARAPET project + + +*/ +#ifndef __stir_recon_buildblock_DataSymmetriesForBins_H__ +#define __stir_recon_buildblock_DataSymmetriesForBins_H__ + +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +#include "stir/ProjDataInfo.h" // is used in .inl +#include "stir/shared_ptr.h" +#include +#include + +#include "stir/Coordinate2D.h" + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#ifndef STIR_NO_AUTO_PTR +using std::auto_ptr; +#endif +#endif + +START_NAMESPACE_STIR + +class Bin; +class SymmetryOperation; +class ProjDataInfo; + + +#if 0 +class BinIndexRange; +#endif + +/*! + \brief AxTangPosNumbers as a class that provides the 2 remaining + coordinates for a Bin, aside from ViewSegmentNumbers. + + TODO? something more sofisticated than a typedef +*/ +typedef Coordinate2D AxTangPosNumbers; + + +/*! + \ingroup symmetries + \brief A class for encoding/finding symmetries common to the geometry + of the projection data and the discretised density. + + This class is mainly (only?) useful for ProjMatrixByBin classes and their + 'users'. Together with SymmetryOperation, it provides the basic + way to be able to write generic code without knowing which + particular symmetries the data have. + + \todo I have used Bin here to have the 4 coordinates, but Bin has data as well + which is not really necessary here. +*/ +class DataSymmetriesForBins : public DataSymmetriesForViewSegmentNumbers +{ +private: + typedef DataSymmetriesForViewSegmentNumbers base_type; + typedef DataSymmetriesForBins self_type; + +public: + DataSymmetriesForBins(const shared_ptr& proj_data_info_ptr); + + virtual ~DataSymmetriesForBins(); + + virtual +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + DataSymmetriesForBins +#else + DataSymmetriesForViewSegmentNumbers +#endif + * clone() const = 0; + +#if 0 + TODO! + //! returns the range of the indices for basic bins + virtual BinIndexRange + get_basic_bin_index_range() const = 0; +#endif + + //! fills in a vector with all the bins that are related to 'b' (including itself) + /*! range for axial_pos_num and tangential_pos_num is taken from the ProjDataInfo object + passed in the constructor + \warning \c b has to be a 'basic' bin + */ + // next return value could be a RelatedBins ??? + // however, both Bin and RelatedBins have data in there (which is not needed here) + inline void + get_related_bins(vector&, const Bin& b) const; + + //! fills in a vector with all the bins (within the range) that are related to 'b' + /*! \warning \c b has to be a 'basic' bin + */ + virtual void + get_related_bins(vector&, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + + //! fills in a vector with the axial and tangential position numbers related to this bin + /*! range for axial_pos_num and tangential_pos_num is taken from the ProjDataInfo object + passed in the constructor + \warning \c b has to be a 'basic' bin + \see 6 argument version of get_related_bins_factorised() + */ + inline void + get_related_bins_factorised(vector&, const Bin& b) const; + + //! fills in a vector with the axial and tangential position numbers related to this bin + /*! + It is guaranteed (or at least, it should be by the implementation of the derived class) + that these AxTangPosNumbers are related for all related ViewSegmentNumbers + for this bin. + + So, you can find all related bins by calling get_related_ViewSegmentNumbers() + and get_related_bins_factorised(), which is what the default implementation + does. (A derived class might do this in a more optimal way.) + + \warning \c b has to be a 'basic' bin + */ + virtual void + get_related_bins_factorised(vector&, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const = 0; + + //! returns the number of bins related to 'b' + virtual int + num_related_bins(const Bin& b) const; + + /*! \brief given an arbitrary bin 'b', find the basic bin and the corresponding symmetry operation + + sets 'b' to the corresponding 'basic' bin and returns the symmetry + transformation from 'basic' to 'b'. + */ + virtual auto_ptr + find_symmetry_operation_from_basic_bin(Bin&) const = 0; + + /*! \brief given an arbitrary bin 'b', find the basic bin + + sets 'b' to the corresponding 'basic' bin and returns true if + 'b' is changed (i.e. it was NOT a basic bin). + */ + virtual bool + find_basic_bin(Bin& b) const; + + /*! \brief test if a bin is 'basic' + + The default implementation uses find_basic_bin + */ + virtual bool + is_basic(const Bin& v_s) const; + + //! default implementation in terms of find_symmetry_operation_from_basic_bin + virtual auto_ptr + find_symmetry_operation_from_basic_view_segment_numbers(ViewSegmentNumbers&) const; + + +protected: + //! Member storing the info needed by get_related_bins() et al + const shared_ptr proj_data_info_ptr; + + //! Check equality + virtual bool blindly_equals(const root_type * const) const = 0; +}; + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/DataSymmetriesForBins.inl" + + +#endif + diff --git a/src/include/stir/recon_buildblock/DataSymmetriesForBins.inl b/src/include/stir/recon_buildblock/DataSymmetriesForBins.inl new file mode 100644 index 0000000000..4765a1a198 --- /dev/null +++ b/src/include/stir/recon_buildblock/DataSymmetriesForBins.inl @@ -0,0 +1,59 @@ +// +// +/*! + + \file + \ingroup buildblock + + \brief inline implementations for class stir::DataSymmetriesForBins + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Bin.h" + +START_NAMESPACE_STIR +void +DataSymmetriesForBins:: + get_related_bins(vector& rel_b, const Bin& b) const +{ + get_related_bins(rel_b, b, + proj_data_info_ptr->get_min_axial_pos_num(b.segment_num()), + proj_data_info_ptr->get_max_axial_pos_num(b.segment_num()), + proj_data_info_ptr->get_min_tangential_pos_num(), + proj_data_info_ptr->get_max_tangential_pos_num()); +} + + +void +DataSymmetriesForBins:: + get_related_bins_factorised(vector& ax_tang_poss, const Bin& b) const +{ + get_related_bins_factorised(ax_tang_poss, b, + proj_data_info_ptr->get_min_axial_pos_num(b.segment_num()), + proj_data_info_ptr->get_max_axial_pos_num(b.segment_num()), + proj_data_info_ptr->get_min_tangential_pos_num(), + proj_data_info_ptr->get_max_tangential_pos_num()); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h b/src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h new file mode 100644 index 0000000000..cfc7558a17 --- /dev/null +++ b/src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h @@ -0,0 +1,224 @@ +// +// +/*! + + \file + \ingroup symmetries + + \brief Declaration of class stir::DataSymmetriesForBins_PET_CartesianGrid + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_recon_buildblock_DataSymmetriesForBins_PET_CartesianGrid_H__ +#define __stir_recon_buildblock_DataSymmetriesForBins_PET_CartesianGrid_H__ + + +#include "stir/recon_buildblock/DataSymmetriesForBins.h" +//#include "stir/SymmetryOperations_PET_CartesianGrid.h" +//#include "stir/ViewSegmentNumbers.h" +//#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Bin.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class DiscretisedDensity; +template class DiscretisedDensityOnCartesianGrid; + +/*! + \ingroup symmetries + \brief Symmetries appropriate for a (cylindrical) PET scanner, and + a discretised density on a Cartesian grid. + + Nearly all operations (except the constructor) are inline as timing of + the methods of this class is critical. +*/ +class DataSymmetriesForBins_PET_CartesianGrid : public DataSymmetriesForBins +{ +private: + typedef DataSymmetriesForBins base_type; + typedef DataSymmetriesForBins_PET_CartesianGrid self_type; + +public: + + //! Constructor with optional selection of symmetries + /*! For the azimuthal angle phi, the following angles are symmetry related for a square grid: + {phi, 180-phi, 90-phi, 90+phi}. + The boolean parameters allow to select which angles should be considered as related:
        +
          +
        • azimuthal
        • +
            +
          • all 4: + (\a do_symmetry_90degrees_min_phi=true)
          • +
          • only {phi, 180-phi} : + (\a do_symmetry_90degrees_min_phi=false, + \a do_symmetry_180degrees_min_phi = true)
          • +
          • none: + (\a do_symmetry_90degrees_min_phi=false, + \a do_symmetry_180degrees_min_phi = false)
          • +
          +
        • axial (i.e. positive vs. negative segment): \a do_symmetry_swap_segment
        • +
        • tangential (i.e. positive vs negative s): \a do_symmetry_swap_s
        • +
        • axial shift \a do_symmetry_shift_z
        • +
        + + Note that when \a do_symmetry_90degrees_min_phi=true, the value of + \a do_symmetry_180degrees_min_phi is irrelevant. This is because otherwise a + non-consecutive range in phi would have to be used.
        + + The symmetry in phi is automatically reduced for non-square grids or when the number of + views is not a multiple of 4. + */ + DataSymmetriesForBins_PET_CartesianGrid(const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr, + const bool do_symmetry_90degrees_min_phi = true, + const bool do_symmetry_180degrees_min_phi = true, + const bool do_symmetry_swap_segment = true, + const bool do_symmetry_swap_s = true, + const bool do_symmetry_shift_z = true); + + + virtual +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + DataSymmetriesForBins_PET_CartesianGrid +#else + DataSymmetriesForViewSegmentNumbers +#endif + * clone() const; + + //! Check equality + virtual bool operator==(const DataSymmetriesForBins_PET_CartesianGrid&) const; + +#if 0 + TODO! + //! returns the range of the indices for basic bins + virtual BinIndexRange + get_basic_bin_index_range() const; +#endif + + inline void + get_related_bins_factorised(vector&, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + + inline int + num_related_bins(const Bin& b) const; + + inline auto_ptr + find_symmetry_operation_from_basic_bin(Bin&) const; + + inline bool + find_basic_bin(Bin& b) const; + + inline int + num_related_view_segment_numbers(const ViewSegmentNumbers& vs) const; + + inline void + get_related_view_segment_numbers(vector& rel_vs, const ViewSegmentNumbers& vs) const; + + inline bool + find_basic_view_segment_numbers(ViewSegmentNumbers& v_s) const; + + //! find out how many image planes there are for every scanner ring + inline float get_num_planes_per_scanner_ring() const; + + + + //! find correspondence between axial_pos_num and image coordinates + /*! z = num_planes_per_axial_pos * axial_pos_num + axial_pos_to_z_offset + + compute the offset by matching up the centre of the scanner + in the 2 coordinate systems + */ + inline float get_num_planes_per_axial_pos(const int segment_num) const; + inline float get_axial_pos_to_z_offset(const int segment_num) const; + + //! \name Methods to find out which symmetries are used + //@{ + inline bool using_symmetry_90degrees_min_phi() const + { return do_symmetry_90degrees_min_phi; } + inline bool using_symmetry_180degrees_min_phi() const + { return do_symmetry_180degrees_min_phi; } + inline bool using_symmetry_swap_segment() const + { return do_symmetry_swap_segment; } + inline bool using_symmetry_swap_s() const + { return do_symmetry_swap_s; } + inline bool using_symmetry_shift_z() const + { return do_symmetry_shift_z; } + //@} + +private: + bool do_symmetry_90degrees_min_phi; + bool do_symmetry_180degrees_min_phi; + bool do_symmetry_swap_segment; + bool do_symmetry_swap_s; + bool do_symmetry_shift_z; + //const shared_ptr& proj_data_info_ptr; + int num_views; + int num_planes_per_scanner_ring; + //! a list of values for every segment_num + VectorWithOffset num_planes_per_axial_pos; + //! a list of values for every segment_num + VectorWithOffset axial_pos_to_z_offset; + +#if 0 + // at the moment, we don't need the following 2 members + + // TODO somehow store only the info + shared_ptr > image_info_ptr; + + // a convenience function that does the dynamic_cast from the above + inline const DiscretisedDensityOnCartesianGrid<3,float> * + cartesian_grid_info_ptr() const; +#endif + + virtual bool blindly_equals(const root_type * const) const; + + + inline bool + find_basic_bin(int &segment_num, int &view_num, int &axial_pos_num, int &tangential_pos_num) const; + + + inline int find_transform_z( + const int segment_num, + const int axial_pos_num) const; + + inline SymmetryOperation* + find_sym_op_general_bin( + int s, + int seg, + int view_num, + int axial_pos_num) const; + + inline SymmetryOperation* + find_sym_op_bin0( + int seg, + int view_num, + int axial_pos_num) const; + +}; + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.inl b/src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.inl new file mode 100644 index 0000000000..1d54bfa2ea --- /dev/null +++ b/src/include/stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.inl @@ -0,0 +1,491 @@ +// +// +/*! + \file + \ingroup symmetries + \brief inline implementations for class stir::DataSymmetriesForBins_PET_CartesianGrid + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + Modification history: + + KT 30/05/2002 added possibility for reduced symmetry in view_num +*/ +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.h" + + +START_NAMESPACE_STIR + +#if 0 +const DiscretisedDensityOnCartesianGrid<3,float> * +DataSymmetriesForBins_PET_CartesianGrid:: +cartesian_grid_info_ptr() const +{ + // we can use static_cast here, as the constructor already checked that it is type-safe + return static_cast *> + (image_info_ptr.get()); +} +#endif + +float +DataSymmetriesForBins_PET_CartesianGrid:: +get_num_planes_per_axial_pos(const int segment_num) const +{ + return static_cast(num_planes_per_axial_pos[segment_num]); +} + +float +DataSymmetriesForBins_PET_CartesianGrid:: +get_num_planes_per_scanner_ring() const +{ + return static_cast(num_planes_per_scanner_ring); +} + +float +DataSymmetriesForBins_PET_CartesianGrid:: +get_axial_pos_to_z_offset(const int segment_num) const +{ + return axial_pos_to_z_offset[segment_num]; +} + +int +DataSymmetriesForBins_PET_CartesianGrid:: +find_transform_z( + const int segment_num, + const int axial_pos_num) const +{ + ProjDataInfoCylindrical* proj_data_info_cyl_ptr = + static_cast(proj_data_info_ptr.get()); + + const float delta = proj_data_info_cyl_ptr->get_average_ring_difference(segment_num); + + + // Find symmetric value in Z by 'mirroring' it around the centre z of the LOR: + // Z+Q = 2*centre_of_LOR_in_image_coordinates == transform_z + { + // first compute it as floating point (although it has to be an int really) + const float transform_z_float = (2*num_planes_per_axial_pos[segment_num]*(axial_pos_num) + + num_planes_per_scanner_ring*delta + + 2*axial_pos_to_z_offset[segment_num]); + // now use rounding to be safe + int transform_z = (int)floor(transform_z_float + 0.5); + assert(fabs(transform_z-transform_z_float) < 10E-4); + + return transform_z; + } +} + +SymmetryOperation* +DataSymmetriesForBins_PET_CartesianGrid:: +find_sym_op_bin0( + int segment_num, + int view_num, + int axial_pos_num) const +{ + // note: if do_symmetry_shift_z==true, then basic axial_pos_num will be 0 + const int transform_z = + find_transform_z(abs(segment_num), + do_symmetry_shift_z ? 0 : axial_pos_num); + + const int z_shift = + do_symmetry_shift_z ? + num_planes_per_axial_pos[segment_num]*axial_pos_num + : 0; + + const int view180 = num_views; + + // TODO get rid of next 2 restrictions + assert(!do_symmetry_180degrees_min_phi || view_num>=0); + assert(!do_symmetry_180degrees_min_phi || view_num view90 && view_num <= view135) { //(90, 135 ] + if ( !do_symmetry_swap_segment || segment_num >= 0) + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(view180, axial_pos_num, z_shift); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq(view180, axial_pos_num, z_shift, transform_z); // seg < 0 + } + else if ( do_symmetry_90degrees_min_phi && view_num > view45 && view_num <= view90 ) { // [ 45, 90] + if ( !do_symmetry_swap_segment || segment_num >= 0) + return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq(view180, axial_pos_num, z_shift, transform_z); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx(view180, axial_pos_num, z_shift); // seg < 0 //KT???????????? different for view90, TODO + } + else if( do_symmetry_180degrees_min_phi && view_num > view90/* && view_num <= view180 */){ // (135, 180) but (90,180) for reduced symmetry case + if( !do_symmetry_swap_segment || segment_num >= 0) + return new SymmetryOperation_PET_CartesianGrid_swap_xmx_zq(view180, axial_pos_num, z_shift, transform_z); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xmx(view180, axial_pos_num, z_shift); // seg < 0 + } + else + { + assert( !do_symmetry_90degrees_min_phi || (view_num >= view0 && view_num <= view45)); + assert( !do_symmetry_180degrees_min_phi || (view_num >= view0 && view_num <= view90)); + if ( do_symmetry_swap_segment && segment_num < 0) + return new SymmetryOperation_PET_CartesianGrid_swap_zq(view180, axial_pos_num, z_shift, transform_z); + else + { + if (z_shift==0) + return new TrivialSymmetryOperation(); + else + return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_num, z_shift); + } + } +} + +// from symmetries +SymmetryOperation* +DataSymmetriesForBins_PET_CartesianGrid:: +find_sym_op_general_bin( + int s, + int segment_num, + int view_num, + int axial_pos_num) const +{ + // note: if do_symmetry_shift_z==true, then basic axial_pos_num will be 0 + const int transform_z = + find_transform_z(abs(segment_num), + do_symmetry_shift_z ? 0 : axial_pos_num); + + const int z_shift = + do_symmetry_shift_z ? + num_planes_per_axial_pos[segment_num]*axial_pos_num + : 0; + +// TODO get rid of next 2 restrictions + assert(!do_symmetry_180degrees_min_phi || view_num>=0); + assert(!do_symmetry_180degrees_min_phi || view_num view90 && view_num <= view135) { //(90, 135 ] + if ( !do_symmetry_swap_segment || segment_num > 0) { // pos_plus90 + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(view180, axial_pos_num, z_shift); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq(view180, axial_pos_num, z_shift, transform_z); // s < 0 + } + else // neg_plus90 + ///// + if ( segment_num < 0 ) { + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq(view180, axial_pos_num, z_shift, transform_z); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xy_ymx(view180, axial_pos_num, z_shift); + } + else { // segment_num == 0 + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(view180, axial_pos_num, z_shift); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xy_ymx(view180, axial_pos_num, z_shift); + } + } + else if ( do_symmetry_90degrees_min_phi && view_num > view45 && view_num <= view90 ) // [ 45, 90] + { + if ( !do_symmetry_swap_segment || segment_num > 0){ + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq(view180, axial_pos_num, z_shift, transform_z); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx(view180, axial_pos_num, z_shift); + } + else if ( segment_num < 0 ) { // {//101 segment_num < 0 + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx(view180, axial_pos_num, z_shift); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq(view180, axial_pos_num, z_shift, transform_z); + + } + else // segment_num == 0 + { + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx(view180, axial_pos_num, z_shift); + else + return new SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx(view180, axial_pos_num, z_shift); + } + } + else if( do_symmetry_180degrees_min_phi && view_num > view90/* && view_num <= view180 */) // (135, 180) but (90,180) for reduced symmetry case + { + if( !do_symmetry_swap_segment || segment_num > 0){ + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xmx_zq(view180, axial_pos_num, z_shift, transform_z); + else + return new SymmetryOperation_PET_CartesianGrid_swap_ymy(view180, axial_pos_num, z_shift); // s <= 0 + } + else //if ( segment_num < 0 ) + {// segment_num <= 0 + if ( !do_symmetry_swap_s || s > 0 ) + return new SymmetryOperation_PET_CartesianGrid_swap_xmx(view180, axial_pos_num, z_shift); + else + return new SymmetryOperation_PET_CartesianGrid_swap_ymy_zq(view180, axial_pos_num, z_shift, transform_z); + }// segment_num == 0 + // /*else{ if ( !do_symmetry_swap_s || s > 0 ) return new SymmetryOperation_PET_CartesianGrid_swap_xmx(); else return new SymmetryOperation_PET_CartesianGrid_swap_ymy(view180, axial_pos_num, z_shift);}*/ + } + else + { + assert( !do_symmetry_90degrees_min_phi || (view_num >= view0 && view_num <= view45)); + assert( !do_symmetry_180degrees_min_phi || (view_num >= view0 && view_num <= view90)); + if ( !do_symmetry_swap_segment || segment_num > 0) + { + if ( do_symmetry_swap_s && s < 0) + return new SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq(view180, axial_pos_num, z_shift, transform_z); + else + { + if (z_shift==0) + return new TrivialSymmetryOperation(); + else + return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_num, z_shift); + } + } + else + if ( segment_num < 0 ) + { + /*KT if ( s == 0) + return new SymmetryOperation_PET_CartesianGrid_swap_zq(view180, axial_pos_num, z_shift, transform_z); + else*/ + if ( do_symmetry_swap_s && s < 0) + return new SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy(view180, axial_pos_num, z_shift); + else + return new SymmetryOperation_PET_CartesianGrid_swap_zq(view180, axial_pos_num, z_shift, transform_z); // s > 0 + } + else // segment_num = 0 + { + if ( do_symmetry_swap_s && s < 0) return new SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy(view180, axial_pos_num, z_shift); + else + { + if (z_shift==0) + return new TrivialSymmetryOperation(); + else + return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_num, z_shift); + } + } + } +} + + +bool +DataSymmetriesForBins_PET_CartesianGrid:: +find_basic_view_segment_numbers(ViewSegmentNumbers& v_s) const +{ + bool change=false; + // TODO get rid of next 2 restrictions + assert(!do_symmetry_180degrees_min_phi || v_s.view_num()>=0); + assert(!do_symmetry_180degrees_min_phi || v_s.view_num()>1; + const int view45 = view90>>1; + const int view135 = view90+view45; + + if ( do_symmetry_swap_segment && v_s.segment_num() < 0 ) { v_s.segment_num() = -v_s.segment_num(); change=true;} + + if (do_symmetry_90degrees_min_phi) + { + //if ( v_s.view_num() == num_views ) v_s.view_num() =0; // KT 30/05/2002 disabled as it should never happen + //else + if (v_s.view_num() >= view135) + { v_s.view_num() = num_views - v_s.view_num(); return true; } + else if (v_s.view_num() >= view90 ) + { v_s.view_num() = v_s.view_num() - view90; return true; } + else if (v_s.view_num() > view45 ) + { v_s.view_num() = view90 - v_s.view_num() ; return true; } + } + else if (do_symmetry_180degrees_min_phi) + { + if (v_s.view_num() > view90 ) + { v_s.view_num() = num_views - v_s.view_num(); return true; } + } + + return change; +} + +bool +DataSymmetriesForBins_PET_CartesianGrid:: +find_basic_bin(int &segment_num, int &view_num, int &axial_pos_num, int &tangential_pos_num) const +{ + ViewSegmentNumbers v_s(view_num, segment_num); + + bool change=find_basic_view_segment_numbers(v_s); + + view_num = v_s.view_num(); + segment_num = v_s.segment_num(); + + if ( do_symmetry_swap_s && tangential_pos_num < 0 ) { tangential_pos_num = - tangential_pos_num ; change=true;}; + if ( do_symmetry_shift_z && axial_pos_num != 0 ) { axial_pos_num = 0; change = true; } + + return change; +} + +bool +DataSymmetriesForBins_PET_CartesianGrid:: +find_basic_bin(Bin& b) const +{ + return + find_basic_bin(b.segment_num(), b.view_num(), b.axial_pos_num(), b.tangential_pos_num()); +} + + +// TODO, optimise +auto_ptr +DataSymmetriesForBins_PET_CartesianGrid:: + find_symmetry_operation_from_basic_bin(Bin& b) const +{ + auto_ptr + sym_op( + (b.tangential_pos_num()==0) ? + find_sym_op_bin0(b.segment_num(), b.view_num(), b.axial_pos_num()) : + find_sym_op_general_bin(b.tangential_pos_num(), b.segment_num(), b.view_num(), b.axial_pos_num()) + ); + find_basic_bin(b); + return sym_op; +} + + +int +DataSymmetriesForBins_PET_CartesianGrid:: +num_related_view_segment_numbers(const ViewSegmentNumbers& vs) const +{ + int num = do_symmetry_180degrees_min_phi && (vs.view_num() % (num_views/2)) != 0 ? 2 : 1; + if (do_symmetry_90degrees_min_phi && (vs.view_num() % (num_views/2)) != num_views/4) + num *= 2; + if (do_symmetry_swap_segment && vs.segment_num() != 0) + num *= 2; + return num; +} + + +int +DataSymmetriesForBins_PET_CartesianGrid:: +num_related_bins(const Bin& b) const +{ + int num = do_symmetry_180degrees_min_phi && (b.view_num() % (num_views/2)) != 0 ? 2 : 1; + if (do_symmetry_90degrees_min_phi && (b.view_num() % (num_views/2)) != num_views/4) + num *= 2; + if (do_symmetry_swap_segment && b.segment_num() != 0) + num *= 2; + + if (do_symmetry_swap_s && b.tangential_pos_num() != 0) + num *= 2; + + if (do_symmetry_shift_z) + num *= proj_data_info_ptr->get_num_axial_poss(b.segment_num()); + return num; +} + +void +DataSymmetriesForBins_PET_CartesianGrid:: +get_related_bins_factorised(vector& ax_tang_poss, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + for (int axial_pos_num=do_symmetry_shift_z?min_axial_pos_num:b.axial_pos_num(); + axial_pos_num <= (do_symmetry_shift_z?max_axial_pos_num:b.axial_pos_num()); + ++axial_pos_num) + { + if (b.tangential_pos_num() >= min_tangential_pos_num && + b.tangential_pos_num() <= max_tangential_pos_num) + ax_tang_poss.push_back(AxTangPosNumbers(axial_pos_num, b.tangential_pos_num())); + if (do_symmetry_swap_s && b.tangential_pos_num()!=0 && + -b.tangential_pos_num() >= min_tangential_pos_num && + -b.tangential_pos_num() <= max_tangential_pos_num) + ax_tang_poss.push_back(AxTangPosNumbers(axial_pos_num, -b.tangential_pos_num())); + } +} + +void +DataSymmetriesForBins_PET_CartesianGrid:: +get_related_view_segment_numbers(vector& rel_vs, const ViewSegmentNumbers& vs) const +{ +#ifndef NDEBUG + { + ViewSegmentNumbers vstest=vs; + assert(find_basic_view_segment_numbers(vstest)==false); + } +#endif + + const int segment_num = vs.segment_num(); + const int view_num = vs.view_num(); + + const bool symz = + do_symmetry_swap_segment && (segment_num != 0); + + rel_vs.reserve(num_related_view_segment_numbers(vs)); + rel_vs.resize(0); + + rel_vs.push_back(ViewSegmentNumbers(view_num,segment_num)); + + if (symz) + rel_vs.push_back(ViewSegmentNumbers(view_num,-segment_num)); + + if (do_symmetry_180degrees_min_phi && do_symmetry_90degrees_min_phi && (view_num % (num_views/2)) != num_views/4) + { + const int related_view_num = + view_num < num_views/2 ? + view_num + num_views/2 : + view_num - num_views/2; + rel_vs.push_back(ViewSegmentNumbers( related_view_num,segment_num)); + if (symz) + rel_vs.push_back(ViewSegmentNumbers( related_view_num,-segment_num)); + } + + if (do_symmetry_180degrees_min_phi && (view_num % (num_views/2)) != 0) + { + rel_vs.push_back(ViewSegmentNumbers( num_views - view_num,segment_num)); + if (symz) + rel_vs.push_back(ViewSegmentNumbers( num_views - view_num,-segment_num)); + } + if (do_symmetry_90degrees_min_phi && (view_num % (num_views/4)) != 0) + { + // use trick to get related_view_num between 0 and num_views: + // use modulo num_views (but add num_views first to ensure positivity) + const int related_view_num = + (num_views/2 - view_num + num_views) % num_views; + rel_vs.push_back(ViewSegmentNumbers( related_view_num,segment_num)); + if (symz) + rel_vs.push_back(ViewSegmentNumbers( related_view_num,-segment_num)); + } + + + assert(rel_vs.size() == + static_cast(num_related_view_segment_numbers(vs))); +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/DataSymmetriesForDensels.h b/src/include/stir/recon_buildblock/DataSymmetriesForDensels.h new file mode 100644 index 0000000000..737c04956b --- /dev/null +++ b/src/include/stir/recon_buildblock/DataSymmetriesForDensels.h @@ -0,0 +1,141 @@ +// +// +/* + Copyright (C) 2001- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup symmetries + + \brief Declaration of class stir::DataSymmetriesForDensels + + \author Kris Thielemans + +*/ +#ifndef __stir_recon_buildblock_DataSymmetriesForDensels_H__ +#define __stir_recon_buildblock_DataSymmetriesForDensels_H__ + +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +#include "stir/Densel.h" +#include +#include + +#include "stir/Coordinate2D.h" + +#ifndef STIR_NO_NAMESPACES +using std::vector; +#ifndef STIR_NO_AUTO_PTR +using std::auto_ptr; +#endif +#endif + + +START_NAMESPACE_STIR + +//class Densel; +class SymmetryOperation; + + +#if 0 +class DenselIndexRange; +#endif + + + +/*! + \ingroup symmetries + \brief A class for encoding/finding symmetries common to the geometry + of the projection data and the discretised density. + + This class is mainly (only?) useful for ProjMatrixByDensel classes and their + 'users'. Together with SymmetryOperation, it provides the basic + way to be able to write generic code without knowing which + particular symmetries the data have. + +*/ +class DataSymmetriesForDensels +{ +public: + DataSymmetriesForDensels(); + + virtual ~DataSymmetriesForDensels() {}; + + virtual + DataSymmetriesForDensels + * clone() const = 0; + + bool operator ==(const DataSymmetriesForDensels&) const; + + bool operator !=(const DataSymmetriesForDensels&) const; + +#if 0 + TODO! + //! returns the range of the indices for basic Densels + virtual DenselIndexRange + get_basic_densel_index_range() const = 0; +#endif + + //! fills in a vector with all the Densels that are related to 'b' (including itself) + /*! + \warning \c b has to be a 'basic' Densel + */ + // next return value could be a RelatedDensels ??? + virtual void + get_related_densels(vector&, const Densel& b) const = 0; + +#if 0 + //! fills in a vector with all the Densels (within the range) that are related to 'b' + /*! \warning \c b has to be a 'basic' Densel + */ + virtual void + get_related_densels(vector&, const Densel& b, + const int min_axial_pos_num, const int max_axial_pos_num) const; +#endif + + //! returns the number of Densels related to 'b' + virtual int + num_related_densels(const Densel& b) const; + + /*! \brief given an arbitrary Densel 'b', find the basic Densel + + sets 'b' to the corresponding 'basic' Densel and returns the symmetry + transformation from 'basic' to 'b'. + */ + virtual auto_ptr + find_symmetry_operation_from_basic_densel(Densel&) const = 0; + + /*! \brief given an arbitrary Densel 'b', find the basic Densel + + sets 'b' to the corresponding 'basic' Densel and returns true if + 'b' is changed (i.e. it was NOT a basic Densel). + */ + virtual bool + find_basic_densel(Densel& b) const; + + protected: + typedef DataSymmetriesForDensels root_type; + + virtual bool blindly_equals(const root_type * const) const = 0; + +}; + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/DataSymmetriesForDensels.inl" + + +#endif + diff --git a/src/include/stir/recon_buildblock/DataSymmetriesForDensels.inl b/src/include/stir/recon_buildblock/DataSymmetriesForDensels.inl new file mode 100644 index 0000000000..242fe009b7 --- /dev/null +++ b/src/include/stir/recon_buildblock/DataSymmetriesForDensels.inl @@ -0,0 +1,46 @@ +// +// +/*! + + \file + \ingroup buildblock + + \brief inline implementations for class stir::DataSymmetriesForDensels + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2001- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Densel.h" + +START_NAMESPACE_STIR +void +DataSymmetriesForDensels:: + get_related_densels(vector& rel_b, const Densel& b) const +{ + get_related_densels(rel_b, b, + proj_data_info_ptr->get_min_axial_pos_num(b.segment_num()), + proj_data_info_ptr->get_max_axial_pos_num(b.segment_num()), + proj_data_info_ptr->get_min_tangential_pos_num(), + proj_data_info_ptr->get_max_tangential_pos_num()); +} + + + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/DistributedCachingInformation.h b/src/include/stir/recon_buildblock/DistributedCachingInformation.h new file mode 100644 index 0000000000..e54c3b1c50 --- /dev/null +++ b/src/include/stir/recon_buildblock/DistributedCachingInformation.h @@ -0,0 +1,170 @@ +// +// +/* + Copyright (C) 2007- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_DistributedCachingInformation_h__ +#define __stir_recon_buildblock_DistributedCachingInformation_h__ + +/*! + \ingroup distributable + + \brief Declaration of class stir::DistributedCachingInformation + + \author Tobias Beisel + \author Kris Thielemans + +*/ + +#include "stir/ViewSegmentNumbers.h" +#include +#include + +START_NAMESPACE_STIR + +/*! + \ingroup distributable + \brief This class implements the logic needed to support caching in a distributed manner. + + To enable distributed caching, the master needs to store how the view segment numbers or the + related viewgrams respectively were distributed between the workers. Doing that, the master + is able to send those viegrams to a slave requesting for work, which that specific slave already + handled before and still has cached locally. + Additionally it is possible to only send the view segment number instead of the whole projection + data, if the the worker stores the recieved related viewgrams. + + This class stores all needed information to determine a not yet processed view segment number + that will be sent to the requesting slave in such a way that the belonging data most likely + is stored in the slaves cache. + + The function \c get_unprocessed_vs_num() can be called by the master, passing the requesting worker + and the current subset to determine the next processed view segment number + + The logic is a bit sophisticated, as it has to make sure, that every vs_num is + only processed once and that load balancing is forced. T + + Process numbers are expected to be between 0 and \c num_workers + + Whether to use the cache enabled function or not can be set by the parsing parameter +\verbatim + enable distributed caching := 0 +\endverbatim + within the parameter specification for the objective function, where 1 activates it and 0 deactivates + caching. The default is set to 0. + + */ +class DistributedCachingInformation +{ +public: + //! constructor, calls initialise() + explicit DistributedCachingInformation(const int num_processors); + + //! destructor to clean up data structures + virtual ~DistributedCachingInformation(); + + /*! \brief initialise all data structures + * called by the constructor, but should be called before processing a new set of data. + * calls initialise_new_subiteration() with an empty vector + */ + void initialise(); + /*! \brief to be called at the beginning of the processing of a set of data + * The caching data is kept, such that the cache will be re-used over multiple runs. + */ + void initialise_new_subiteration(const std::vector& vs_nums_to_process); + + /*! \brief get the next work-package for a given processor + * \warning this must only be called if there for sure is an unprocessed vs_num left, + * otherwise it will call stir::error(). + * \param[out] vs_num will be set accordingly + * \param[in] proc the processor for which the View-Segment-Numbers are calculated + * \return \c true if the vs_num was not in the cache of the processor + * This function updates internal cache values etc. The user can just repeatedly call + * the function without worrying about the caching algorithm. + */ + bool get_unprocessed_vs_num(ViewSegmentNumbers& vs_num, int proc); + +private: + + //! Number of processors available + int num_workers; + + //! stores which data that have to be processed in this subiteration + std::vector vs_nums_to_process; + + //!stores the vs_nums in the cache of every processor + std::vector > proc_vs_nums; + + //! marks the vs_num that still need to be processed + /*! Has the same length as vs_nums_to_process */ + std::vector still_to_process; + + //! \brief find where \a vs_num is in vs_nums_to_process + int find_vs_num_position_in_list_to_process(const ViewSegmentNumbers& vs_num) const; + + //! \brief find the first vs_num which has not be processed at all + int find_position_of_first_unprocessed() const; + + //! count how many data-sets that are cached remain to be processed by processor \a proc + int get_num_remaining_cached_data_to_process(int proc) const; + + /*! \brief store the work-package in the cache-list of the processor + * \param proc the processor to whose list the View-Segment-Numbers is saved + * \param vs_num the vs_number to be saved to the processors list of cached numbers + * Calls set_processed() to make sure we do not process it again. + */ + void add_vs_num_to_proc(int proc, const ViewSegmentNumbers& vs_num); + + /*! \brief gets the vs_num which is (most likely) the oldest in cache of the specific processor + * \param[out] vs_num will be set accordingly + * \param[in] proc the processor for which the View-Segment-Numbers are calculated + * \return \c true if there was an unprocessed data-set in the cache of processor \a proc + * This is called by get_unprocessed_vs_num + */ + bool get_oldest_unprocessed_vs_num(ViewSegmentNumbers& vs_num, int proc) const; + + + /*! \brief gets a vs_num of the processor, which has the most work left + * \param proc processor that will not be checked (i.e. the one for which + * we are trying to find some work) + * + * this function is called if a processor requests work and already accomplished + * everything in its cache. Allocating work from the slave with most work left + * encourages load balancing without having a lot of extra communicatrions. + * That way the probability of requesting already cached work is kept high. + */ + ViewSegmentNumbers get_vs_num_of_proc_with_most_work_left(int proc) const; + + /*! \brief set a ViewSegmentNumbers as already processed + * \param vs_num the vs_num to be set processed + */ + void set_processed(const ViewSegmentNumbers& vs_num); + + /*! \brief reset all data to unprocessed + */ + void set_all_vs_num_unprocessed(); + + /*! \brief check if a vs_num is still to be processed or not + * \param vs_num the view segment number to be checked + * Also returns false if the \a vs_num is not in the list to process at all. + */ + bool is_still_to_be_processed(const ViewSegmentNumbers& vs_num) const; + +}; + +END_NAMESPACE_STIR + +#endif /*__stir_recon_buildblock_DistributedCachingInformation_h__*/ diff --git a/src/include/stir/recon_buildblock/DistributedWorker.h b/src/include/stir/recon_buildblock/DistributedWorker.h new file mode 100644 index 0000000000..279a930c18 --- /dev/null +++ b/src/include/stir/recon_buildblock/DistributedWorker.h @@ -0,0 +1,139 @@ +/* + Copyright (C) 2007 - 2011-02-23, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_DistributedWorker_h__ +#define __stir_recon_buildblock_DistributedWorker_h__ + + +/*! + \file + \ingroup recon_buildblock + + \brief declares the stir::DistributedWorker class + + \author Tobias Beisel + \author Kris Thielemans +*/ + +#include "stir/shared_ptr.h" +#include "stir/TimedObject.h" +//#include "stir/ParsingObject.h" +#include "stir/ProjData.h" +#include "stir/recon_buildblock/ProjectorByBinPair.h" +#include "stir/recon_buildblock/distributable.h" +#include +#include + +START_NAMESPACE_STIR + +class ExamInfo; + +/*! + \ingroup distributable + \brief This implements the Worker for the stir::distributable_computation() function. + + The start() method is an infinite loop waiting for a task from the master. Very few tasks + are implemented at the moment: set_up, compute, stop. + + The \c distributable_computation() function does the actual work. It is the slave-part + of stir::distributable_computation() which runs on the master. It is a loop receiving the related + viewgrams and calling an RPC_process_related_viewgrams_type function + with the received values. When an end_iteration_notification is received, it calls the + reduction of the output_image. + + In each inner loop the worker first receives the vs_num and the information whether this is a + new viewgram or a previously received viewgram. The latter case only emerges if distributed caching is + enabled. If so, the worker does not have to receive the related viewgrams, but just gets it from + its saved viewgrams. + + \todo The log_likelihood_ptr argument to the RPC function is currently always NULL. + \todo Currently the only computation that is supported corresponds to the gradient computation. + It would be trivial to add others. +*/ +template +class DistributedWorker : public TimedObject //, public ParsingObject +{ + private: + + double* log_likelihood_ptr; + bool zero_seg0_end_planes; + shared_ptr proj_pair_sptr; + shared_ptr exam_info_sptr; + shared_ptr proj_data_info_sptr; + shared_ptr target_sptr; + + int image_buffer_size; //to save the image_size + + // cache variables + bool cache_enabled; + shared_ptr proj_data_ptr; + shared_ptr binwise_correction; + shared_ptr mult_proj_data_sptr; + + int my_rank; //rank of the worker + + + public: + + //Default constructor + DistributedWorker(); + + //Default destructor + ~DistributedWorker() ; + + /*! + \brief Infinite loop waiting for tasks from the master + */ + void start(); + + protected: + + /*! + \brief sets defaults for this object + */ + void set_defaults(); + + /*! + \brief Get basic information from the master. + + It sets up all needed objects by communicating with the + master. + + The following objects are set up: + - bool zero_seg0_end_planes + - target_image_sptr + - ProjDataInfo pointer + - ProjectorByBinPair pointer + - ProjDataInMemory to save the received related viewgrams + + Additionally some values for testing are set up. + + */ + void setup_distributable_computation(); + /*! + \brief this does the actual computation corresponding to distributable_computation() + */ + void distributable_computation(RPC_process_related_viewgrams_type * RPC_process_related_viewgrams); +}; + + +END_NAMESPACE_STIR + +#endif +// __DistributedWorker_h__ + diff --git a/src/include/stir/recon_buildblock/FilterRootPrior.h b/src/include/stir/recon_buildblock/FilterRootPrior.h new file mode 100644 index 0000000000..b029a7c85f --- /dev/null +++ b/src/include/stir/recon_buildblock/FilterRootPrior.h @@ -0,0 +1,121 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup priors + \brief Declaration of class stir::FilterRootPriot + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#ifndef __stir_recon_buildblock_FilterRootPrior_H__ +#define __stir_recon_buildblock_FilterRootPrior_H__ + + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/GeneralisedPrior.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class DataProcessor; + +/*! + \ingroup priors + \brief + A class in the GeneralisedPrior hierarchy. This implements 'generalised' + priors a la the Median Root Prior (which was invented by + Sakari Alenius). + + This class takes an DataProcessor object (i.e. a filter), and computes + the prior 'gradient' as + \f[ G_v = \beta ( {\lambda_v \over F_v} - 1) \f] + where \f$ \lambda\f$ is the data where to compute the gradient, and + \f$F\f$ is the data obtained by filtering \f$\lambda\f$. + + However, we need to avoid division by 0, as it might cause a NaN or an + 'infinity'. So, we replace the quotient above by
        + if \f$|\lambda_v| < M*|F_v| \f$ + then \f${\lambda_v \over F_v}\f$ + else \f$M*\rm{sign}(F_v)*\rm{sign}(lambda_v)\f$,
        + where \f$M\f$ is an arbitrary threshold on the quotient (fixed to 1000 when + I wrote this documentation, but check FilterRootPrior.cxx if you want to be sure). + + Note that for nearly all filters, this is not a real prior, as this + 'gradient' is \e not the gradient of a function. This can be checked + by computing the 'Hessian' (i.e. the partial derivatives of the components + of the gradient). For most (interesting) filters, the Hessian will no be + symmetric. + + The Median Root Prior is obtained by using a MedianImageFilter3D as + DataProcessor. +*/ +template +class FilterRootPrior: public + RegisteredParsingObject< + FilterRootPrior, + GeneralisedPrior, + GeneralisedPrior + > +{ + private: + typedef + RegisteredParsingObject< + FilterRootPrior, + GeneralisedPrior, + GeneralisedPrior + > + base_type; +public: + //! Name which will be used when parsing a GeneralisedPrior object + static const char * const registered_name; + + //! Default constructor (no filter) + FilterRootPrior(); + + //! Constructs it explicitly + FilterRootPrior(shared_ptr >const&, + const float penalization_factor); + + //! compute the value of the function + /*! \warning Generally there is no function associated to this prior, + so we just return 0 and write a warning the first time it's called. + */ + virtual double + compute_value(const DataT ¤t_estimate); + + //! compute gradient by applying the filter + void compute_gradient(DataT& prior_gradient, + const DataT ¤t_estimate); + + +private: + shared_ptr > filter_ptr; + virtual void set_defaults(); + virtual void initialise_keymap(); + +}; + + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/recon_buildblock/ForwardProjectorByBin.h b/src/include/stir/recon_buildblock/ForwardProjectorByBin.h new file mode 100644 index 0000000000..1fc37ee1c4 --- /dev/null +++ b/src/include/stir/recon_buildblock/ForwardProjectorByBin.h @@ -0,0 +1,117 @@ +// +// + +#ifndef __stir_recon_buildblock_ForwardProjectorByBin_h__ +#define __stir_recon_buildblock_ForwardProjectorByBin_h__ +/*! + \file + \ingroup projection + + \brief Base class for forward projectors which work on 'large' collections of bins: given the whole image, fill in a stir::RelatedViewgrams object. + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/RegisteredObject.h" +#include "stir/TimedObject.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + + +template class RelatedViewgrams; +template class DiscretisedDensity; +class ProjDataInfo; +class ProjData; +class DataSymmetriesForViewSegmentNumbers; + + +/*! + \ingroup projection + \brief Abstract base class for all forward projectors +*/ +class ForwardProjectorByBin : + public TimedObject, + public RegisteredObject +{ +public: + + //! Default constructor calls reset_timers() + //inline + ForwardProjectorByBin(); + + //! Stores all necessary geometric info + /*! + If necessary, set_up() can be called more than once. + + Derived classes can assume that forward_project() will be called + with input corresponding to the arguments of the last call to set_up(). + + \warning there is currently no check on this. + */ +virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ) =0; + + //! Informs on which symmetries the projector handles + /*! It should get data related by at least those symmetries. + Otherwise, a run-time error will occur (unless the derived + class has other behaviour). + */ + virtual const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const = 0; + + //! project the volume into the whole proj_data + /*! it overwrites the data already present in the projection data */ + void forward_project(ProjData&, + const DiscretisedDensity<3,float>& ); + + //! project the volume into the viewgrams + /*! it overwrites the data already present in the viewgram */ + void forward_project(RelatedViewgrams&, + const DiscretisedDensity<3,float>&); + + void forward_project(RelatedViewgrams&, + const DiscretisedDensity<3,float>&, + const int min_axial_pos_num, const int max_axial_pos_num); + + void forward_project(RelatedViewgrams&, + const DiscretisedDensity<3,float>&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + virtual ~ForwardProjectorByBin(); + +protected: + //! This virtual function has to be implemented by the derived class. + virtual void actual_forward_project(RelatedViewgrams&, + const DiscretisedDensity<3,float>&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) = 0; + +}; + +END_NAMESPACE_STIR + +#endif // __stir_recon_buildblock_ForwardProjectorByBin_h__ diff --git a/src/include/stir/recon_buildblock/ForwardProjectorByBin.inl b/src/include/stir/recon_buildblock/ForwardProjectorByBin.inl new file mode 100644 index 0000000000..0d04c81498 --- /dev/null +++ b/src/include/stir/recon_buildblock/ForwardProjectorByBin.inl @@ -0,0 +1,83 @@ +// +// +/*! + + \file + \ingroup projection + + \brief Inline implementations for stir::ForwardProjectorByBin + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/RelatedViewgrams.h" + +START_NAMESPACE_STIR + + +#if 0 +ForwardProjectorByBin::ForwardProjectorByBin() +{ +} + +void +ForwardProjectorByBin::forward_project(RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& image) +{ + forward_project(viewgrams, image, + viewgrams.get_min_axial_pos_num(), + viewgrams.get_max_axial_pos_num(), + viewgrams.get_min_tangential_pos_num(), + viewgrams.get_max_tangential_pos_num()); +} + +void ForwardProjectorByBin::forward_project + (RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& image, + const int min_axial_pos_num, + const int max_axial_pos_num) +{ + forward_project(viewgrams, image, + min_axial_pos_num, + max_axial_pos_num, + viewgrams.get_min_tangential_pos_num(), + viewgrams.get_max_tangential_pos_num()); +} + +void +ForwardProjectorByBin:: +forward_project(RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& density, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) +{ + actual_forward_project(viewgrams, density, + min_axial_pos_num, + max_axial_pos_num, + min_tangential_pos_num, + max_tangential_pos_num); +} + +#endif + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h b/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h new file mode 100644 index 0000000000..c0743e306d --- /dev/null +++ b/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h @@ -0,0 +1,104 @@ +// +// +#ifndef _ForwardProjectorByBinUsingProjMatrixByBin_ +#define _ForwardProjectorByBinUsingProjMatrixByBin_ + +/*! + + \file + \ingroup projection + + \brief definition of stir::ForwardProjectorByBinUsingProjMatrixByBin + + \author Kris Thielemans + \author Sanida Mustafovic + \author Mustapha Sadki + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/recon_buildblock/ForwardProjectorByBin.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/shared_ptr.h" + + + +START_NAMESPACE_STIR + +template class RelatedViewgrams; + +/*! + \brief This implements the ForwardProjectorByBin interface, given any + ProjMatrixByBin object + \ingroup projection + + It stores a shared_ptr to a ProjMatrixByBin object, which will be used + to get the relevant elements of the projection matrix. + */ +class ForwardProjectorByBinUsingProjMatrixByBin: + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a ForwardProjectorByBin object + static const char * const registered_name; + + ForwardProjectorByBinUsingProjMatrixByBin(); + + ForwardProjectorByBinUsingProjMatrixByBin( + const shared_ptr& proj_matrix_ptr + ); + + //! Stores all necessary geometric info + /*! Note that the density_info_ptr is not stored in this object. It's only used to get some info on sizes etc. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + + + const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const; + + +private: + shared_ptr proj_matrix_ptr; + + + void actual_forward_project(RelatedViewgrams&, + const DiscretisedDensity<3,float>& image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + + +END_NAMESPACE_STIR + + +#endif + + diff --git a/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h b/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h new file mode 100644 index 0000000000..ad723fad18 --- /dev/null +++ b/src/include/stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h @@ -0,0 +1,253 @@ +// +// +/*! + + \file + \ingroup projection + + \brief Declaration of class stir::ForwardProjectorByBinUsingRayTracing + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_ForwardProjectorByBinUsingRayTracing__H__ +#define __stir_recon_buildblock_ForwardProjectorByBinUsingRayTracing__H__ + +#include "stir/recon_buildblock/ForwardProjectorByBin.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/shared_ptr.h" +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +#include "stir/shared_ptr.h" +START_NAMESPACE_STIR + +template class Viewgram; +template class RelatedViewgrams; +template class VoxelsOnCartesianGrid; +template class Array; +class ProjDataInfo; +class ProjDataInfoCylindrical; + + +/*! + \ingroup projection + \brief This class implements forward projection using Siddon's algorithm for + ray tracing. That is, it computes length of intersection with the voxels. + + Currently, the LOIs are divided by voxel_size.x(), unless NEWSCALE is + #defined during compilation time of ForwardProjectorByBinUsingRayTracing_Siddon.cxx. + + If the z voxel size is exactly twice the sampling in axial direction, + multiple LORs are used, to avoid missing voxels. (TODOdoc describe how). + + Currently, a FOV is used which is circular, and is slightly 'inside' the + image (i.e. the radius is about 1 voxel smaller than the maximum possible). + + \warning Current implementation assumes that x,y voxel sizes are at least as + large as the sampling in tangential direction, and that z voxel size is either + equal to or exactly twice the sampling in axial direction of the segments. + + \warning For each bin, maximum 3 LORs are 'traced' + \warning The image forward projected HAS to be of type VoxelsOnCartesianGrid. + \warning The projection data info HAS to be of type ProjDataInfoCylindrical + \warning The implementation assumes that the \c s -coordinate is antisymmetric + in terms of the tangential_pos_num, i.e. + \code + proj_data_info_ptr->get_s(Bin(...,tang_pos_num)) == + - proj_data_info_ptr->get_s(Bin(...,-tang_pos_num)) + \endcode +*/ + +class ForwardProjectorByBinUsingRayTracing : + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a ForwardProjectorByBin object + static const char * const registered_name; + + + ForwardProjectorByBinUsingRayTracing(); + + //! Constructor + /*! \warning Obsolete */ + ForwardProjectorByBinUsingRayTracing( + const shared_ptr&, + const shared_ptr >&); + //! Stores all necessary geometric info + /*! Note that the density_info_ptr is not stored in this object. It's only used to get some info on sizes etc. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + + virtual const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const; + + protected: + //! variable that determines if a cylindrical FOV or the whole image will be handled + bool restrict_to_cylindrical_FOV; + + +private: + void actual_forward_project(RelatedViewgrams&, + const DiscretisedDensity<3,float>&, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num); + + + // KT 20/06/2001 changed type from 'const DataSymmetriesForViewSegmentNumbers *' + shared_ptr symmetries_ptr; + /* + The version which uses all possible symmetries. + Here 0<=view < num_views/4 (= 45 degrees) + */ + + void + forward_project_all_symmetries( + Viewgram & pos_view, + Viewgram & neg_view, + Viewgram & pos_plus90, + Viewgram & neg_plus90, + Viewgram & pos_min180, + Viewgram & neg_min180, + Viewgram & pos_min90, + Viewgram & neg_min90, + const VoxelsOnCartesianGrid& image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + + + /* + This function projects 4 viewgrams related by symmetry. + It will be used for view=0 or 45 degrees + (or others if the number of views is not a multiple of 4) + Here 0<=view < num_views/2 (= 90 degrees) + */ + void + forward_project_view_plus_90_and_delta( + Viewgram & pos_view, + Viewgram & neg_view, + Viewgram & pos_plus90, + Viewgram & neg_plus90, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + /* + This function projects 4 viewgrams related by symmetry. + It will be used for view=0 or 45 degrees + (or others if the number of views is not a multiple of 4) + Here 0<=view < num_views/2 (= 90 degrees) + */ + void + forward_project_view_min_180_and_delta( + Viewgram & pos_view, + Viewgram & neg_view, + Viewgram & pos_min180, + Viewgram & neg_min180, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + + /* + This function projects 4 viewgrams related by symmetry. + It will be used for view=0 or 45 degrees + (or others if the number of views is not a multiple of 4) + Here 0<=view < num_views/2 (= 90 degrees) + */ + void + forward_project_delta( + Viewgram & pos_view, + Viewgram & neg_view, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + + //////////////// 2D + void forward_project_all_symmetries_2D( + Viewgram & pos_view, + Viewgram & pos_plus90, + Viewgram & pos_min180, + Viewgram & pos_min90, + const VoxelsOnCartesianGrid& image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + void +forward_project_view_plus_90_2D(Viewgram & pos_view, + Viewgram & pos_plus90, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; +void +forward_project_view_min_180_2D(Viewgram & pos_view, + Viewgram & pos_min180, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; +// no symmetries +void +forward_project_view_2D(Viewgram & pos_view, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; +#if defined(_MSC_VER) && _MSC_VER<1310 +/* VC 6.0 (and 7.0 ?) cannot use the normal syntax unfortunately + See also http://www.boost.org/more/microsoft_vcpp.html + + So, we forget about the template in this case. + Sigh +*/ +#define STIR_SIDDON_NO_TEMPLATE +#endif + +#ifndef STIR_SIDDON_NO_TEMPLATE + //! The actual implementation of Siddon's algorithm + /*! \return true if the LOR intersected the image, i.e. of Projptr (potentially) changed */ + template + static bool + proj_Siddon(Array<4,float> &Projptr, const VoxelsOnCartesianGrid &, + const ProjDataInfoCylindrical* proj_data_info_ptr, + const float cphi, const float sphi, const float delta, + const float s_in_mm, + const float R, const int min_ax_pos_num, const int max_ax_pos_num, const float offset, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset, + const float norm_factor, + const bool restrict_to_cylindrical_FOV); +#else + static bool + proj_Siddon(int symmetry_type, + Array<4,float> &Projptr, const VoxelsOnCartesianGrid &, + const ProjDataInfoCylindrical* proj_data_info_ptr, + const float cphi, const float sphi, const float delta, + const float s_in_mm, + const float R, const int min_ax_pos_num, const int max_ax_pos_num, const float offset, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset, + const float norm_factor, + const bool restrict_to_cylindrical_FOV); +#endif + + virtual void set_defaults(); + virtual void initialise_keymap(); +}; +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/recon_buildblock/FourierRebinning.h b/src/include/stir/recon_buildblock/FourierRebinning.h new file mode 100644 index 0000000000..f72f8cd898 --- /dev/null +++ b/src/include/stir/recon_buildblock/FourierRebinning.h @@ -0,0 +1,234 @@ +// +// + +/*! + \file + \brief Class for FORE Reconstruction + \ingroup recon_buildblock + \author Claire LABBE + \author Kris Thielemans + \author Oliver Nix + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2003 - 2005, Hammersmith Imanet Ltd + Copyright (C) 2004 - 2005 DKFZ Heidelberg, Germany + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_FourierRebinning_H__ +#define __stir_recon_buildblock_FourierRebinning_H__ + +#include "stir/recon_buildblock/ProjDataRebinning.h" +#include "stir/RegisteredParsingObject.h" +#include + + +START_NAMESPACE_STIR +template class SegmentByView; +template class SegmentBySinogram; +//template class Sinogram; +template class Array; +class Succeeded; + +/* + \class PETCount_rebinned + \brief Class for rebinned elements counter + \ingroup recon_buildblock +*/ +class PETCount_rebinned +{ + + public: +//! Total rebinned elements + int total; +//! Total missed rebinned elements + int miss; +//! Total SSRB rebinned elements + int ssrb; + +#ifdef PARALLEL + friend PMessage& operator<<(PMessage&, PETCount_rebinned&); + friend PMessage& operator>>(PMessage&, PETCount_rebinned&); + + PETCount_rebinned & operator+= (const PETCount_rebinned &rebin) + { + total += rebin.total; + miss += rebin.miss; + ssrb += rebin.ssrb; + return *this; + } +#endif +// Default constructor by initialising all the elements conter to null + explicit PETCount_rebinned(int total_v=0, int miss_v =0, int ssrb_v = 0) + :total(total_v), miss(miss_v), ssrb(ssrb_v) + {} + + ; +}; + +/*! + \class FourierRebinning + \ingroup recon_buildblock + \brief Class for Serial FORE Reconstruction. + + + The digital implementation of the rebinning is done as follows: + + a) Initialise the 2D Fourier transform of all rebinned sinograms Pr(w,k);
        + b) Process sequentially each pair of oblique sinograms pij and pji for i,j (= 0..2*num_rings-2) as:
        + - merge pij and pji to get a sinogram sampled over 2p;
        + - calculates the 2D FFT Pij(w,k) of the merged sinogram;
        + - assign each frequency component (w,k) to the rebinned sinogram of the slice lying closest axially to + z - (tk/w): Pr(w,k) = Pr(w,k) + Pij(w,k), where r is the nearest integer to (i+j) - k(i-j)/wR;
        + c) Normalise Pr(w,k) for the variable number of contributions to each w, k, r ;
        + d) Calculate the 2D inverse FFT of each Pr(w,k) to get the rebinned sinogram Pr(s,f); + + As FORE is based on a high frequency approximation, it is necessary to handle separately low and high frequencies. + This is done by subdividing the (w,k) plane into three sub regions defined by two parameters + in Fourier space, w (the continuous frequency corresponding to the radial coordinates s) and k + (the integer Fourier index corresponding to the azimuthal angle f), and by applying in each region + a different method to estimated the rebinned sinogram. + + KTTODO ^A in the next sentence? + + The rebinned data are represented by  in spatial space with |s|\<=R, 0<=f\=R; |w|\>wlim or |k|\>klim. + Finally, in the low-frequency (region 3), Fourier rebinning is not applicable. + Therefore the rebinned data are estimated using only the oblique sinograms with + a small value of d : dlim. Owing to the small value of d, the axial shift can be + neglected as in the SSRB approximation. +*/ + +class FourierRebinning : public RegisteredParsingObject< + FourierRebinning, + ProjDataRebinning, + ProjDataRebinning> +{ + private: + typedef ProjDataRebinning base_type; + public: + //! Name which will be used when parsing a ProjDataRebinning object + static const char * const registered_name; + virtual void set_defaults(); + + protected: +//! Smallest angular freq. index minimum 2 ( 1 is zero frequency) + int kmin; +//! Smallest transax. freq. index minimum 2 ( 1 is zero frequency) + int wmin; +//! Delta max for small omega limiting delta for SSRB for small freq. + int deltamin; +//! kc index for consistency + int kc; +//! fore_debug_level. Setting it to >0 will produce some debug information + int fore_debug_level; + + public: +//! default constructor calls set_defaults(); + FourierRebinning(); + +//! This method returns the type of the algorithm for the rebinning + string method_info() const + { return("FORE"); } + + +//! This method creates a stack of 2D rebinned sinograms from the whole 3D data set (i.e. the ProjData data) and saves it. + Succeeded rebin(); + +//! A set of get and set utility functions to access the rebinning parameters + inline void set_kmin(int km){kmin = km;} + inline void set_wmin(int wm){wmin = wm;} + inline void set_deltamin(int dm){deltamin = dm;} + inline void set_kc(int kcc) {kc = kcc;} + inline void set_fore_debug_level(int fdebug){fore_debug_level = fdebug;} + + inline int get_kmin(){return kmin;} + inline int get_wmin(){return wmin;} + inline int get_deltamin(){return deltamin;} + inline int get_kc() {return kc;} + inline int get_fore_debug_level(){return fore_debug_level;} + + private: + +/*! + \brief Fourier rebinning + + This method takes as input the 3D data set (Array3D) in Fourier space of one sinogram + for a given delta as the data dimension are (1,fft_size,nviews_pow2), the scanner informations + and returns the updated stack of 2D rebinned sinograms still in Fourier space, + the updated weigthing factors as well as the new rebinned elements counter. + + +*/ + void rebinning(Array<3,std::complex > &FT_rebinned_data, Array<3,float> &Weights_for_FT_rebinned_data, + PETCount_rebinned &num_rebinned, const Array<2,std::complex > &FT_current_sinogram, const float z, + const float average_ring_difference_in_segment, const int num_views_pow2, const int num_tang_poss_pow2, + const float half_distance_between_rings, const float sampling_distance_in_s, const float radial_sampling_freq_w, + const float R_field_of_view_mm, const float ratio_ring_spacing_to_ring_radius); + +/*! + \brief This method takes as input the real 3D data set + (in which the number of views have been extended to a number of power of 2) + and returns the rebinned sinograms in Fourier space, their weighting factors + as well as the counter rebinned elements + + \b Rebinning
        + Assign each frequency component (w,k) to the rebinned sinogram of the slice lying closest axially to + z - (tk/w) with t=((ring0 -ring1)*ring_spacing/(2*R) with R=ring_radius, + Pm(w,k) = Pm(w,k) + Pij(w,k) (i=ring0 and j=ring1), and m is the nearest integer to (i+j) -k(i-j)/(Rw)). +*/ + + void do_rebinning(Array<3,std::complex > &FT_rebinned_data, Array<3,float> &Weights_for_FT_rebinned_data, + PETCount_rebinned &count_rebinned, const SegmentBySinogram &segment, const int num_tang_poss_pow2, + const int num_views_pow2, const int num_planes, const float average_ring_difference_in_segment, + const float half_distance_between_rings, const float sampling_distance_in_s, + const float radial_sampling_freq_w, const float R_field_of_view_mm, + const float ratio_ring_spacing_to_ring_radius); + +/*! + This method takes as input the information of the 3D data set (ProjData) + as well as the reconstruction parameters and prints out the informations of reconstruction + parameters implemented in FORE as well as the CPU and relative timing of differents process + (i.e I/O, rebinning, backprojection, matrix handling). + fore_debug_level must be set to a integer value > 0 +*/ + void do_log_file(); + +//! This is a function to display the current counter of all rebinned elements + void do_display_count(PETCount_rebinned &num_rebinned_total); + + +//! This is a function to adjust the number of views of a segment to the next power of 2 + void do_adjust_nb_views_to_pow2(SegmentBySinogram &segment) ; + +//! This function checks if the steering and input paramters for FORE are inside the possible range of parameters + Succeeded fore_check_parameters(int num_tang_poss_pow2, int num_views_pow2, int max_segment_num_to_process); + + + protected: + virtual bool post_processing(); + virtual void initialise_keymap(); + +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/recon_buildblock/GeneralisedObjectiveFunction.h b/src/include/stir/recon_buildblock/GeneralisedObjectiveFunction.h new file mode 100644 index 0000000000..1bb8ff2b0e --- /dev/null +++ b/src/include/stir/recon_buildblock/GeneralisedObjectiveFunction.h @@ -0,0 +1,360 @@ +// +// +/* + Copyright (C) 2003- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class stir::GeneralisedObjectiveFunction + + \author Kris Thielemans + \author Sanida Mustafovic + \author Nicolas A Karakatsanis + +*/ +#ifndef __stir_recon_buildblock_GeneralisedObjectiveFunction_H__ +#define __stir_recon_buildblock_GeneralisedObjectiveFunction_H__ + + +#include "stir/RegisteredObject.h" +#include "stir/ParsingObject.h" +#include "stir/shared_ptr.h" +#include "stir/recon_buildblock/GeneralisedPrior.h" +#include +START_NAMESPACE_STIR + + +class Succeeded; + +/*! + \ingroup GeneralisedObjectiveFunction + \brief + A base class for 'generalised' objective functions, i.e. objective + functions for which at least a 'gradient' is defined. + + Some iterative algorithms use an 'objective function' only in a + loose sense. They might for instance allow generalisations + which no longer optimise a function. For example in the case + of PoissonLogLikelihoodWithLinearModelForMeanAndProjData + with non-matching forward and back projectors, the 'gradient' + that is computed is generally not the gradient of the + log-likelihood that corresponds to the forward projector. + However, one hopes that it still points towards the optimum. + + Often, one includes a penalty (or prior) in the objective function. This + class uses a GeneralisedPrior object for this. Note that we use the convention that + the objective function is maximised. The penalty is expected to + be a function that increases with higher penalty, so it will be subtracted + from the unregularised case. + + In tomography, we often use subsets, where the objective function + is written as a sum of sub-objective functions. This class has some + subset functionality. When using subsets, the + penalty will be distributed evenly over all subsets. While this increases + the computational cost, it makes the subsets more 'balanced' which + is best for most algorithms. + + \see IterativeReconstruction + + + \todo Currently, there is subset code in both IterativeReconstruction and here. + This is confusing and leads to repetition. It probably should all be moved here. + + \par Parameters for parsing + + \verbatim + ; specify prior, see GeneralisedObjectiveFunction hierarchy for possible values + prior type := + \endverbatim +*/ +template +class GeneralisedObjectiveFunction: + public RegisteredObject >, + public ParsingObject +{ +public: + + //GeneralisedObjectiveFunction(); + + virtual ~GeneralisedObjectiveFunction(); + + + //! Creates a suitable target as determined by the parameters + virtual TargetT * + construct_target_ptr() const = 0; + + //! Has to be called before using this object + virtual Succeeded + set_up(shared_ptr const& target_sptr); + + //! This should compute the sub-gradient of the objective function at the \a current_estimate + /*! The subgradient is the gradient of the objective function restricted to the + subset specified. What this means depends on how this function is implemented later + on in the hierarchy. + + Computed as the difference of + compute_sub_gradient_without_penalty + and + get_prior_ptr()->compute_gradient()/num_subsets. + + \warning Any data in \a gradient will be overwritten. + */ + virtual void + compute_sub_gradient(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num); + + //! This should compute the sub-gradient of the unregularised objective function at the \a current_estimate + /*! + \warning The derived class should overwrite any data in \a gradient. + */ + virtual void + compute_sub_gradient_without_penalty(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) =0; + + //! Compute the value of the unregularised sub-objective function at the \a current_estimate + /*! Implemented in terms of actual_compute_objective_function_without_penalty. */ + virtual double + compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num); + + //! Compute the value of the unregularised objective function at the \a current_estimate + /*! Computed by summing over all subsets. + */ + virtual double + compute_objective_function_without_penalty(const TargetT& current_estimate); + + //! Compute the value of the sub-penalty at the \a current_estimate + /*! As each subset contains the same penalty, this function returns + the same as + \code + compute_penalty(current_estimate)/num_subsets + \endcode + Implemented in terms of GeneralisedPrior::compute_value. + \see compute_objective_function(const TargetT&) for sign conventions. + */ + double + compute_penalty(const TargetT& current_estimate, + const int subset_num); + //! Compute the value of the penalty at the \a current_estimate + /*! Implemented in terms of GeneralisedPrior::compute_value. */ + double + compute_penalty(const TargetT& current_estimate); + + //! Compute the value of the sub-objective function at the \a current_estimate + /*! Computed as the difference of + compute_objective_function_without_penalty + and + compute_penalty. + */ + double + compute_objective_function(const TargetT& current_estimate, + const int subset_num); + + //! Compute the value of the objective function at the \a current_estimate + /*! Computed as the difference of + compute_objective_function_without_penalty + and + compute_penalty. + */ + double + compute_objective_function(const TargetT& current_estimate); + + //! Fill any elements that we cannot estimate with a fixed value + /*! In many cases, it is easier to use a larger target than what we can + actually estimate. For instance, using a rectangular image while we estimate + only a circular region. + + For some algorithms, it is important that the parameters that cannot be + estimate are set to 0 (or some other value). For example, if the outer voxels + contribute to the forward projection of an image, but not to a backprojection. + + This function allows you to do that. Its default implementation is to do nothing. + It is up to the derived class to implement this sensible. + + \todo The type of the value should really be derived from e.g. TargetT::full_iterator. + */ + virtual void + fill_nonidentifiable_target_parameters(TargetT& target, const float value ) const + {} + + //! \name multiplication with (sub)Hessian + /*! \brief Functions that multiply the (sub)Hessian with a \'vector\'. + + All these functions add their result to any existing data in \a output. + + They all call actual_add_multiplication_with_approximate_sub_Hessian_without_penalty. + */ + //@{ + Succeeded + add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const; + Succeeded + add_multiplication_with_approximate_sub_Hessian(TargetT& output, + const TargetT& input, + const int subset_num) const; + Succeeded + add_multiplication_with_approximate_Hessian_without_penalty(TargetT& output, + const TargetT& input) const; + Succeeded + add_multiplication_with_approximate_Hessian(TargetT& output, + const TargetT& input) const; + //@} + + //! Construct a string with info on the value of objective function with and without penalty + std::string + get_objective_function_values_report(const TargetT& current_estimate); + + //! Return the number of subsets in-use + int get_num_subsets() const; + + + //! Attempts to change the number of subsets. + /*! \return The number of subsets that will be used later, which is not + guaranteed to be what you asked for. */ + virtual int set_num_subsets(const int num_subsets) = 0; + + //! Checks of the current subset scheme is approximately balanced + /*! Balanced subsets means that the sub-gradients point all roughly in the + same direction (at least when far from the optimum). + + This function tests if this is approximately true, such that a reconstruction + algorithm can either adapt or abort. + + Implemented in terms of actual_subsets_are_approximately_balanced(std::string&). + */ + bool subsets_are_approximately_balanced() const; + //! Checks of the current subset scheme is approximately balanced and constructs a warning message + /*! + \see subsets_are_approximately_balanced() + \param warning_message A string variable. If the subsets are not (approx.) + balanced, this function will append + a warning message explaining why. + */ + bool subsets_are_approximately_balanced(std::string& warning_message) const; + + //! check if the prior is set (or the penalisation factor is 0) + bool prior_is_zero() const; + + //! check if the objective function is nested + bool is_nested() const; + + // Nicolas A. Karakatsanis: Sets the file name prefix for the nested images estimated within a global iteration. + // Useful for nested obj function when storing multiple files of nested image updates belonging to the same global iteration. + void set_nested_output_filename_prefix(std::string& filename_prefix, + int global_subiterations_num); + + // A string variable to save the filename prefix of the nested image estimates, + // can be utilized if the obj function is nested + std::string nested_output_filename_prefix; + + //Number of nested iterations + int num_nested_subiterations; + + //Number of nested iterations for proper initialization of the estimates + //with another kinetic model prior to the application of the expected model + int num_nested_initialization_subiterations; + + //Number of required complete initial (sub)iterations required to initialize the 4D reconstruction + int num_initialization_subiterations; + + //Counter of the number of global (not nested) (sub)iterations performed under initialization mode only + //Utilized to determine whether the current (sub)iteration is performed under initialization mode + int initialization_subiterations_counter; + + //Counter of the total number of global (not nested) (sub)iterations performed (initialization + regular reconstruction mode) + //Utilized to determine whether the current (sub)iteration is performed under initialization mode + int subiterations_counter; + + //Define a shared pointer for the estimate image from the last update of the nested iterations + shared_ptr last_nested_estimate_sptr; + + //! Read-only access to the prior + /*! \todo It would be nicer to not return a pointer. + */ + GeneralisedPrior * const + get_prior_ptr() const; + + //! Change the prior + /*! \warning You should call set_up() again after using this function. + */ + void set_prior_sptr(const shared_ptr >&); + +protected: + int num_subsets; + + shared_ptr > prior_sptr; + + //! sets any default values + /*! Has to be called by set_defaults in the leaf-class */ + virtual void set_defaults(); + //! sets parsing keys + /*! Has to be called by initialise_keymap in the leaf-class */ + virtual void initialise_keymap(); + + //virtual bool post_processing(); + + //! Implementation of function that checks subset balancing + /*! + \see subsets_are_approximately_balanced(std::string&) + + \par Developer\'s note + + The reason we have this function is that overloading + subsets_are_approximately_balanced(std::string&) in a derived class + would hide subsets_are_approximately_balanced(). + */ + virtual bool actual_subsets_are_approximately_balanced(std::string& warning_message) const = 0; + + //! Implementation of function that computes the objective function for the current subset + /*! + \see compute_objective_function_without_penalty(const Target&,const int) + + \par Developer\'s note + + The reason we have this function is that overloading a function + in a derived class, hides all functions of the + same name. + */ + virtual double + actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num) = 0; + + //! Implementation of the function that multiplies the sub-Hessian with a vector. + /*! + \see multiplication_with_approximate_sub_Hessian_without_penalty(TargetT&,const TargetT&, const int). + + \warning The default implementation just calls error(). This behaviour has to be + overloaded by the derived classes. + + \par Developer\'s note + + The reason we have this function is that overloading a function + in a derived class, hides all functions of the + same name. + */ + virtual Succeeded + actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const; +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/GeneralisedPrior.h b/src/include/stir/recon_buildblock/GeneralisedPrior.h new file mode 100644 index 0000000000..557ca98a46 --- /dev/null +++ b/src/include/stir/recon_buildblock/GeneralisedPrior.h @@ -0,0 +1,102 @@ +// +// +/* + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup priors + \brief Declaration of class stir::GeneralisedPrior + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#ifndef __stir_recon_buildblock_GeneralisedPrior_H__ +#define __stir_recon_buildblock_GeneralisedPrior_H__ + + +#include "stir/RegisteredObject.h" +#include "stir/ParsingObject.h" + +START_NAMESPACE_STIR + +class Succeeded; + +/*! + \ingroup priors + \brief + A base class for 'generalised' priors, i.e. priors for which at least + a 'gradient' is defined. + + This class exists to accomodate FilterRootPrior. Otherwise we could + just live with Prior as a base class. +*/ +template +class GeneralisedPrior: + public RegisteredObject >, + public ParsingObject + +{ +public: + + inline GeneralisedPrior(); + + //! compute the value of the function + /*! For derived classes where this doesn't make sense, it's recommended to return 0. + */ + virtual double + compute_value(const DataT ¤t_estimate) = 0; + + //! This should compute the gradient of the log of the prior function at the \a current_estimate + /*! The gradient is already multiplied with the penalisation_factor. + \warning The derived class should overwrite any data in \a prior_gradient. + */ + virtual void compute_gradient(DataT& prior_gradient, + const DataT ¤t_estimate) =0; + + //! This should compute the multiplication of the Hessian with a vector and add it to \a output + /*! Default implementation just call error(). This function needs to be overriden by the + derived class. + */ + virtual Succeeded + add_multiplication_with_approximate_Hessian(DataT& output, + const DataT& input) const; + + inline float get_penalisation_factor() const; + inline void set_penalisation_factor(float new_penalisation_factor); + + //! Has to be called before using this object + virtual Succeeded + set_up(shared_ptr const& target_sptr); + +protected: + float penalisation_factor; + //! sets value for penalisation factor + /*! Has to be called by set_defaults in the leaf-class */ + virtual void set_defaults(); + //! sets key for penalisation factor + /*! Has to be called by initialise_keymap in the leaf-class */ + virtual void initialise_keymap(); + +}; + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/GeneralisedPrior.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/GeneralisedPrior.inl b/src/include/stir/recon_buildblock/GeneralisedPrior.inl new file mode 100644 index 0000000000..9a84a21261 --- /dev/null +++ b/src/include/stir/recon_buildblock/GeneralisedPrior.inl @@ -0,0 +1,52 @@ +// +// +/*! + \file + \ingroup priors + \brief Inline implementations for class stir::GeneralisedPrior + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + + +template +GeneralisedPrior::GeneralisedPrior() +{ + penalisation_factor =0; +} + + +template +float +GeneralisedPrior:: +get_penalisation_factor() const +{ return penalisation_factor; } + +template +void +GeneralisedPrior:: +set_penalisation_factor(const float new_penalisation_factor) +{ penalisation_factor = new_penalisation_factor; } + +END_NAMESPACE_STIR + diff --git a/src/include/stir/recon_buildblock/IterativeReconstruction.h b/src/include/stir/recon_buildblock/IterativeReconstruction.h new file mode 100644 index 0000000000..89a0ad1706 --- /dev/null +++ b/src/include/stir/recon_buildblock/IterativeReconstruction.h @@ -0,0 +1,345 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_recon_buildblock_IterativeReconstruction_h__ +#define __stir_recon_buildblock_IterativeReconstruction_h__ + +/*! + \file + \ingroup recon_buildblock + + \brief declares the stir::IterativeReconstruction class + + + \author Matthew Jacobson + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project + +*/ +/* Modification history + + KT 10122001 + - added get_initial_data_ptr and 0 argument reconstruct() +*/ +#include "stir/recon_buildblock/Reconstruction.h" +#include "stir/shared_ptr.h" +#include "stir/DataProcessor.h" +#include "stir/recon_buildblock/GeneralisedObjectiveFunction.h" + +START_NAMESPACE_STIR + +/*! + \brief base class for iterative reconstruction objects + \ingroup recon_buildblock + + This is the base class for all iterative reconstruction methods. + It provides the basic iteration mechanisms. What each iteration + does has to be implemented in a derived class. + + \par Parsing parameters + + \verbatim + ; any parameters from Reconstruction + + ; see GeneralisedObjectiveFunction + objective function type:= + + + number of subsets:= 1 + start at subset:= 0 + number of subiterations:= 1 + save images at subiteration intervals:= 1 + start at subiteration number:=2 + + initial image := + enforce initial positivity condition:=1 + + ; specify processing after every few subiterations, see DataProcessor + inter-iteration filter subiteration interval:= + inter-iteration filter type := + + ; write objective function value to stderr at certain subiterations + ; default value of 0 means: do not write it at all. + report_objective_function_values_interval:=0 + \endverbatim + + \todo move subset things somewhere else + \todo all the compute functions should be const. + */ + +template +class IterativeReconstruction : public Reconstruction +{ + private: + typedef + Reconstruction + base_type; +public: + + //! accessor for the subiteration counter + int get_subiteration_num() const + {return subiteration_num;} + + //! accessor for finding the current subset number + /*! The subset number is determined from the subiteration number. + If randomise_subset_order is false, the subset number is found + as follows: + \code + (subiteration_num+start_subset_num-1)%num_subsets + \endcode + When randomise subsets are used, a new random order is initialised + before every full iteration. In this case, start_subset_num is ignored + (as it doesn't make any sense). + */ + int get_subset_num(); + + //! Gets a pointer to the initial data + /*! This is either read from file, or constructed by construct_target_ptr(). + In the latter case, its values are set to 0 or 1, depending on the value + of IterativeReconstruction::initial_data_filename. + + \todo Dependency on explicit strings "1" or "0" in + IterativeReconstruction::initial_data_filename is not nice. + \todo should not return a 'bare' pointer. + */ + virtual TargetT * + get_initial_data_ptr() const; + + //! executes the reconstruction + /*! + Calls get_initial_data_ptr() and then + reconstruct(shared_ptrconst&). + See end_of_iteration_processing() for info on saving to file. + + \return Succeeded::yes if everything was alright. + */ + virtual Succeeded + reconstruct(); + + //! executes the reconstruction with \a target_data_sptr as initial value + /*! After calling set_up(), repeatedly calls update_estimate(); end_of_iteration_processing(); + See end_of_iteration_processing() for info on saving to file. + + Final reconstruction is saved in \a target_data_sptr + */ + virtual Succeeded + reconstruct(shared_ptr const& target_data_sptr); + + + + //! A utility function that creates a filename_prefix by appending the current subiteration number + /*! Only works when no extension is present. + */ + std::string + make_filename_prefix_subiteration_num(const std::string& filename_prefix) const; + + //! A utility function that creates the output filename_prefix for the current subiteration number + /*! Uses \a output_filename_prefix. Only works when no extension is present. + */ + std::string + make_filename_prefix_subiteration_num() const; + + /*! \name Functions to get parameters + \warning Be careful with changing shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + GeneralisedObjectiveFunction const& + get_objective_function() const; + + shared_ptr > + get_objective_function_sptr() const; + + //! the maximum allowed number of full iterations + const int get_max_num_full_iterations() const; + + //! the number of ordered subsets + const int get_num_subsets() const; + + //! the number of subiterations + const int get_num_subiterations() const; + + //! value with which to initialize the subiteration counter + const int get_start_subiteration_num() const; + + //! the starting subset number + const int get_start_subset_num() const; + + //TODO rename + //! subiteration interval at which data will be saved + const int get_save_interval() const; + + //! signals whether to randomise the subset order in each iteration + const bool get_randomise_subset_order() const; + + //! inter-iteration filter + const DataProcessor& get_inter_iteration_filter() const; + + //! subiteration interval at which to apply inter-iteration filters + const int get_inter_iteration_filter_interval() const; + + //! subiteration interval at which to report the values of the objective function + const int get_report_objective_function_values_interval() const; + //@} + + /*! \name Functions to set parameters + This can be used as alternative to the parsing mechanism. + \warning Be careful with changing shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + //! The objective function that will be optimised + void set_objective_function_sptr(const shared_ptr >&); + + //! the maximum allowed number of full iterations + void set_max_num_full_iterations(const int); + + //! the number of ordered subsets + void set_num_subsets(const int); + + //! the number of subiterations + void set_num_subiterations(const int); + + //! value with which to initialize the subiteration counter + void set_start_subiteration_num(const int); + + //! the starting subset number + void set_start_subset_num(const int); + + //TODO rename + //! subiteration interval at which data will be saved + void set_save_interval(const int); + + //! signals whether to randomise the subset order in each iteration + void set_randomise_subset_order(const bool); + + //! inter-iteration filter + void set_inter_iteration_filter_ptr(const shared_ptr >&); + + //! subiteration interval at which to apply inter-iteration filters + void set_inter_iteration_filter_interval(const int); + + //! subiteration interval at which to report the values of the objective function + void set_report_objective_function_values_interval(const int); + //@} + +protected: + + IterativeReconstruction(); + + virtual Succeeded set_up(shared_ptr const& target_data_ptr); + + //! the principal operations for updating the data iterates at each iteration + virtual void update_estimate(TargetT ¤t_estimate)=0; + + //! operations for the end of the iteration + /*! At specific subiteration numbers, this +
          +
        • applies the inter-filtering and/or post-filtering data processor,
        • +
        • writes the current data to file at the designated subiteration numbers + (including the final one). Filenames used are determined by + Reconstruction::output_filename_prefix,
        • +
        • writes the objective function values (using + GeneralisedObjectiveFunction::report_objective_function_values) to stderr.
        • +
        + If your derived class redefines this virtual function, you will + probably want to call + IterativeReconstruction::end_of_iteration_processing() in there anyway. + */ + // KT 14/12/2001 remove =0 as it's not a pure virtual and the default implementation is usually fine. + virtual void end_of_iteration_processing(TargetT ¤t_estimate); + + shared_ptr > + objective_function_sptr; + + //! the subiteration counter + int subiteration_num; + + //! used to abort the loop over iterations + bool terminate_iterations; + + + // parameters + protected: + //! the maximum allowed number of full iterations + int max_num_full_iterations; + + //! the number of ordered subsets + int num_subsets; + + //! the number of subiterations + int num_subiterations; + + //! value with which to initialize the subiteration counter + int start_subiteration_num; + + //! name of the file containing the data for intializing the reconstruction + string initial_data_filename; + + //! the starting subset number + int start_subset_num; + + //TODO rename + + //! subiteration interval at which data will be saved + int save_interval; + + //! signals whether to randomise the subset order in each iteration + bool randomise_subset_order; + + + //! inter-iteration filter + shared_ptr > inter_iteration_filter_ptr; + + + + + //! subiteration interval at which to apply inter-iteration filters + int inter_iteration_filter_interval; + + //! subiteration interval at which to report the values of the objective function + /*! \warning This is generally time-consuming. + */ + int report_objective_function_values_interval; + + //! prompts the user to enter parameter values manually + virtual void ask_parameters(); + + virtual void set_defaults(); + virtual void initialise_keymap(); + //! used to check acceptable parameter ranges, etc... + virtual bool post_processing(); + + private: + //! member storing the order in which the subsets will be traversed in this iteration + /*! Initialised and used by get_subset_num() */ + VectorWithOffset _current_subset_array; + //! used to randomly generate a subset sequence order for the current iteration + VectorWithOffset randomly_permute_subset_order() const; + + +}; + +END_NAMESPACE_STIR + +#endif +// __IterativeReconstruction_h__ + + diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.h b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.h new file mode 100644 index 0000000000..eb11d3445f --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.h @@ -0,0 +1,201 @@ +// +// +/* + Copyright (C) 2006- 2013, Hammersmith Imanet Ltd + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \ingroup modelling + \brief Declaration of class stir::PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData + + \author Kris Thielemans + \author Sanida Mustafovic + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_recon_buildblock_PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData_H__ +#define __stir_recon_buildblock_PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData_H__ +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h" +#include "stir/VectorWithOffset.h" +#include "stir/DynamicProjData.h" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" +#include "stir/modelling/PatlakPlot.h" + +START_NAMESPACE_STIR + +/*! + \ingroup GeneralisedObjectiveFunction + \ingroup modelling + \brief a base class for LogLikelihood of independent Poisson variables + where the mean values are linear combinations of the kinetic parameters. + + \par Parameters for parsing + +*/ + +template +class PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData: +public RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMean > +{ + private: + typedef RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMean > base_type; + typedef PoissonLogLikelihoodWithLinearModelForMeanAndProjData > SingleFrameObjFunc ; + VectorWithOffset _single_frame_obj_funcs; + public: + + //! Name which will be used when parsing a GeneralisedObjectiveFunction object + static const char * const registered_name; + + PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData(); + + //! Returns a pointer to a newly allocated target object (with 0 data). + /*! Dimensions etc are set from the \a dyn_proj_data_sptr and other information set by parsing, + such as \c zoom, \c output_image_size_z etc. + */ + virtual TargetT * + construct_target_ptr() const; + virtual void + compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num); + + protected: + virtual double + actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num); + + virtual Succeeded set_up_before_sensitivity(shared_ptr const& target_sptr); + + //! Add subset sensitivity to existing data + /*! \todo Current implementation does NOT add to the subset sensitivity, but overwrites + */ + virtual void + add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const; + + virtual Succeeded + actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const; + public: + /*! \name Functions to get parameters + \warning Be careful with changing shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + const DynamicProjData& get_dyn_proj_data() const; + const shared_ptr& get_dyn_proj_data_sptr() const; + const int get_max_segment_num_to_process() const; + const bool get_zero_seg0_end_planes() const; + const DynamicProjData& get_additive_dyn_proj_data() const; + const shared_ptr& get_additive_dyn_proj_data_sptr() const; + const ProjectorByBinPair& get_projector_pair() const; + const shared_ptr& get_projector_pair_sptr() const; + const BinNormalisation& get_normalisation() const; + const shared_ptr& get_normalisation_sptr() const; + //@} + + /*! \name Functions to set parameters + This can be used as alternative to the parsing mechanism. + \warning After using any of these, you have to call set_up(). + \warning Be careful with setting shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + void set_recompute_sensitivity(const bool); + void set_sensitivity_sptr(const shared_ptr&); + virtual int set_num_subsets(const int num_subsets); + //@} + protected: + //! Filename with input projection data + string _input_filename; + + //! points to the object for the total input projection data + shared_ptr _dyn_proj_data_sptr; + + //! the maximum absolute ring difference number to use in the reconstruction + /*! convention: if -1, use get_max_segment_num()*/ + int _max_segment_num_to_process; + + /**********************/ + // image stuff + // TODO to be replaced with single class or so (TargetT obviously) + //! the output image size in x and y direction + /*! convention: if -1, use a size such that the whole FOV is covered + */ + int _output_image_size_xy; // KT 10122001 appended _xy + + //! the output image size in z direction + /*! convention: if -1, use default as provided by VoxelsOnCartesianGrid constructor + */ + int _output_image_size_z; // KT 10122001 new + + //! the zoom factor + double _zoom; + + //! offset in the x-direction + double _Xoffset; + + //! offset in the y-direction + double _Yoffset; + + // KT 20/06/2001 new + //! offset in the z-direction + double _Zoffset; + + /********************************/ + //! name of file in which additive projection data are stored + string _additive_dyn_proj_data_filename; + //! points to the additive projection data + /*! the projection data in this file is bin-wise added to forward projection results*/ + shared_ptr _additive_dyn_proj_data_sptr; + /*! the normalisation or/and attenuation data */ + shared_ptr _normalisation_sptr; + //! Stores the projectors that are used for the computations + shared_ptr _projector_pair_ptr; + //! signals whether to zero the data in the end planes of the projection data + bool _zero_seg0_end_planes; + // Patlak Plot Parameters + /*! the patlak plot pointer where all the parameters are stored */ + shared_ptr _patlak_plot_sptr; + //! dynamic image template + DynamicDiscretisedDensity _dyn_image_template; + + bool actual_subsets_are_approximately_balanced(string& warning_message) const; + + //! Sets defaults for parsing + /*! Resets \c sensitivity_filename and \c sensitivity_sptr and + \c recompute_sensitivity to \c false. + */ + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.txx b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.txx new file mode 100644 index 0000000000..fffc5928f7 --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.txx @@ -0,0 +1,604 @@ +// +// PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.txx +// +/* + Copyright (C) 2006 - 2011-01-14 Hammersmith Imanet Ltd + Copyright (C) 2011 Kris Thielemans + Copyright (C) 2013 University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \ingroup modelling + \brief Implementation of class stir::PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData + + \author Kris Thielemans + \author Sanida Mustafovic + \author Charalampos Tsoumpas +*/ +#include "stir/DiscretisedDensity.h" +#include "stir/is_null_ptr.h" +#include "stir/recon_buildblock/TrivialBinNormalisation.h" +#include "stir/Succeeded.h" +#include "stir/recon_buildblock/ProjectorByBinPair.h" + +// include the following to set defaults +#ifndef USE_PMRT +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#else +#include "stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#endif +#include "stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h" + +#include +#include +// For the Patlak Plot Modelling +#include "stir/modelling/ModelMatrix.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.h" +#ifndef NDEBUG +#include "stir/IO/OutputFileFormat.h" +#endif + +START_NAMESPACE_STIR + +template +const char * const +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +registered_name = +"PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData"; + +template +void +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +set_defaults() +{ + base_type::set_defaults(); + + this->_input_filename=""; + this->_max_segment_num_to_process=-1; // use all segments + //num_views_to_add=1; // KT 20/06/2001 disabled + + this->_dyn_proj_data_sptr.reset(); + this->_zero_seg0_end_planes = 0; + + this->_additive_dyn_proj_data_filename = "0"; + this->_additive_dyn_proj_data_sptr.reset(); + +#ifndef USE_PMRT // set default for _projector_pair_ptr + shared_ptr forward_projector_ptr(new ForwardProjectorByBinUsingRayTracing()); + shared_ptr back_projector_ptr(new BackProjectorByBinUsingInterpolation()); +#else + shared_ptr PM(new ProjMatrixByBinUsingRayTracing()); + shared_ptr forward_projector_ptr(new ForwardProjectorByBinUsingProjMatrixByBin(PM)); + shared_ptr back_projector_ptr(new BackProjectorByBinUsingProjMatrixByBin(PM)); +#endif + + this->_projector_pair_ptr. + reset(new ProjectorByBinPairUsingSeparateProjectors(forward_projector_ptr, back_projector_ptr)); + this->_normalisation_sptr.reset(new TrivialBinNormalisation); + + // image stuff + this->_output_image_size_xy=-1; + this->_output_image_size_z=-1; + this->_zoom=1.F; + this->_Xoffset=0.F; + this->_Yoffset=0.F; + this->_Zoffset=0.F; // KT 20/06/2001 new + + // Modelling Stuff + this->_patlak_plot_sptr.reset(); +} + +template +void +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters"); + this->parser.add_stop_key("End PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters"); + this->parser.add_key("input file",&this->_input_filename); + + // parser.add_key("mash x views", &num_views_to_add); // KT 20/06/2001 disabled + this->parser.add_key("maximum absolute segment number to process", &this->_max_segment_num_to_process); + this->parser.add_key("zero end planes of segment 0", &this->_zero_seg0_end_planes); + + // image stuff + this->parser.add_key("zoom", &this->_zoom); + this->parser.add_key("XY output image size (in pixels)",&this->_output_image_size_xy); + this->parser.add_key("Z output image size (in pixels)",&this->_output_image_size_z); + + // parser.add_key("X offset (in mm)", &this->Xoffset); // KT 10122001 added spaces + // parser.add_key("Y offset (in mm)", &this->Yoffset); + this->parser.add_key("Z offset (in mm)", &this->_Zoffset); + this->parser.add_parsing_key("Projector pair type", &this->_projector_pair_ptr); + + // Scatter correction + this->parser.add_key("additive sinograms",&this->_additive_dyn_proj_data_filename); + + // normalisation (and attenuation correction) + this->parser.add_parsing_key("Bin Normalisation type", &this->_normalisation_sptr); + + // Modelling Information + this->parser.add_parsing_key("Kinetic Model Type", &this->_patlak_plot_sptr); // Do sth with dynamic_cast to get the PatlakPlot + + // Regularization Information + // this->parser.add_parsing_key("prior type", &this->_prior_sptr); +} + +template +bool +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +post_processing() +{ + if (base_type::post_processing() == true) + return true; + if (this->_input_filename.length() == 0) + { warning("You need to specify an input filename"); return true; } + +#if 0 // KT 20/06/2001 disabled as not functional yet + if (num_views_to_add!=1 && (num_views_to_add<=0 || num_views_to_add%2 != 0)) + { warning("The 'mash x views' key has an invalid value (must be 1 or even number)"); return true; } +#endif + + this->_dyn_proj_data_sptr.reset(DynamicProjData::read_from_file(_input_filename)); + if (is_null_ptr(this->_dyn_proj_data_sptr)) + { warning("Error reading input file %s", _input_filename.c_str()); return true; } + // image stuff + if (this->_zoom <= 0) + { warning("zoom should be positive"); return true; } + + if (this->_output_image_size_xy!=-1 && this->_output_image_size_xy<1) // KT 10122001 appended_xy + { warning("output image size xy must be positive (or -1 as default)"); return true; } + if (this->_output_image_size_z!=-1 && this->_output_image_size_z<1) // KT 10122001 new + { warning("output image size z must be positive (or -1 as default)"); return true; } + + + if (this->_additive_dyn_proj_data_filename != "0") + { + std::cerr << "\nReading additive projdata data " + << this->_additive_dyn_proj_data_filename + << std::endl; + this->_additive_dyn_proj_data_sptr.reset(DynamicProjData::read_from_file(this->_additive_dyn_proj_data_filename)); + if (is_null_ptr(this->_additive_dyn_proj_data_sptr)) + { warning("Error reading additive input file %s", _additive_dyn_proj_data_filename.c_str()); return true; } + + } + return false; +} + +template +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData() +{ + this->set_defaults(); +} + +template +TargetT * +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +construct_target_ptr() const +{ + return + new ParametricVoxelsOnCartesianGrid(ParametricVoxelsOnCartesianGridBaseType( + *(this->_dyn_proj_data_sptr->get_proj_data_info_ptr()), + static_cast(this->_zoom), + CartesianCoordinate3D(static_cast(this->_Zoffset), + static_cast(this->_Yoffset), + static_cast(this->_Xoffset)), + CartesianCoordinate3D(this->_output_image_size_z, + this->_output_image_size_xy, + this->_output_image_size_xy))); +} +/*************************************************************** + subset balancing +***************************************************************/ + +template +bool +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +actual_subsets_are_approximately_balanced(std::string& warning_message) const +{ // call actual_subsets_are_approximately_balanced( for first single_frame_obj_func + if (this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames() == 0 || this->_single_frame_obj_funcs.size() == 0) + error("PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:\n" + "actual_subsets_are_approximately_balanced called but not frames yet.\n"); + else if(this->_single_frame_obj_funcs.size() != 0) + { + bool frames_are_balanced=true; + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame();frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames();++frame_num) + frames_are_balanced &= this->_single_frame_obj_funcs[frame_num].subsets_are_approximately_balanced(warning_message); + return frames_are_balanced; + } + else + error("Something strange happened in PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:\n" + "actual_subsets_are_approximately_balanced called before setup()?\n"); + return + false; +} + +/*************************************************************** + get_ functions +***************************************************************/ +template +const DynamicProjData& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_dyn_proj_data() const +{ return *this->_dyn_proj_data_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_dyn_proj_data_sptr() const +{ return this->_dyn_proj_data_sptr; } + +template +const int +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_max_segment_num_to_process() const +{ return this->_max_segment_num_to_process; } + +template +const bool +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_zero_seg0_end_planes() const +{ return this->_zero_seg0_end_planes; } + +template +const DynamicProjData& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_additive_dyn_proj_data() const +{ return *this->_additive_dyn_proj_data_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_additive_dyn_proj_data_sptr() const +{ return this->_additive_dyn_proj_data_sptr; } + +template +const ProjectorByBinPair& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_projector_pair() const +{ return *this->_projector_pair_ptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_projector_pair_sptr() const +{ return this->_projector_pair_ptr; } + +template +const BinNormalisation& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_normalisation() const +{ return *this->_normalisation_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +get_normalisation_sptr() const +{ return this->_normalisation_sptr; } + + +/*************************************************************** + set_ functions +***************************************************************/ +template +int +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +set_num_subsets(const int num_subsets) +{ + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame();frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames();++frame_num) + { + if(this->_single_frame_obj_funcs.size() != 0) + if(this->_single_frame_obj_funcs[frame_num].set_num_subsets(num_subsets) != num_subsets) + error("set_num_subsets didn't work"); + } + this->num_subsets=num_subsets; + return this->num_subsets; +} + +/*************************************************************** + set_up() +***************************************************************/ +template +Succeeded +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +set_up_before_sensitivity(shared_ptr const& target_sptr) +{ + if (this->_max_segment_num_to_process==-1) + this->_max_segment_num_to_process = + (this->_dyn_proj_data_sptr)->get_proj_data_sptr(1)->get_max_segment_num(); + + if (this->_max_segment_num_to_process > (this->_dyn_proj_data_sptr)->get_proj_data_sptr(1)->get_max_segment_num()) + { + warning("_max_segment_num_to_process (%d) is too large", + this->_max_segment_num_to_process); + return Succeeded::no; + } + + shared_ptr proj_data_info_sptr( + (this->_dyn_proj_data_sptr->get_proj_data_sptr(1))->get_proj_data_info_ptr()->clone()); + proj_data_info_sptr-> + reduce_segment_range(-this->_max_segment_num_to_process, + +this->_max_segment_num_to_process); + + if (is_null_ptr(this->_projector_pair_ptr)) + { warning("You need to specify a projector pair"); return Succeeded::no; } + + if (this->num_subsets <= 0) + { + warning("Number of subsets %d should be larger than 0.", + this->num_subsets); + return Succeeded::no; + } + + if (is_null_ptr(this->_normalisation_sptr)) + { + warning("Invalid normalisation object"); + return Succeeded::no; + } + + if (this->_normalisation_sptr->set_up(proj_data_info_sptr) == Succeeded::no) + return Succeeded::no; + + if (this->_patlak_plot_sptr->set_up() == Succeeded::no) + return Succeeded::no; + + if (this->_patlak_plot_sptr->get_starting_frame()<=0 || this->_patlak_plot_sptr->get_starting_frame()>this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames()) + { + warning("Starting frame is %d. Generally, it should be a late frame,\nbut in any case it should be less than the number of frames %d\nand at least 1.",this->_patlak_plot_sptr->get_starting_frame(), this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames()); + return Succeeded::no; + } + { + const shared_ptr > + density_template_sptr((target_sptr->construct_single_density(1)).get_empty_copy()); + const shared_ptr scanner_sptr(new Scanner(*proj_data_info_sptr->get_scanner_ptr())); + this->_dyn_image_template= + DynamicDiscretisedDensity(this->_patlak_plot_sptr->get_time_frame_definitions(), + this->_dyn_proj_data_sptr->get_start_time_in_secs_since_1970(), + scanner_sptr, + density_template_sptr); + + // construct _single_frame_obj_funcs + this->_single_frame_obj_funcs.resize(this->_patlak_plot_sptr->get_starting_frame(),this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames()); + + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame();frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames();++frame_num) + { + this->_single_frame_obj_funcs[frame_num].set_projector_pair_sptr(this->_projector_pair_ptr); + this->_single_frame_obj_funcs[frame_num].set_proj_data_sptr(this->_dyn_proj_data_sptr->get_proj_data_sptr(frame_num)); + this->_single_frame_obj_funcs[frame_num].set_max_segment_num_to_process(this->_max_segment_num_to_process); + this->_single_frame_obj_funcs[frame_num].set_zero_seg0_end_planes(this->_zero_seg0_end_planes!=0); + if(this->_additive_dyn_proj_data_sptr!=NULL) + this->_single_frame_obj_funcs[frame_num].set_additive_proj_data_sptr(this->_additive_dyn_proj_data_sptr->get_proj_data_sptr(frame_num)); + this->_single_frame_obj_funcs[frame_num].set_num_subsets(this->num_subsets); + this->_single_frame_obj_funcs[frame_num].set_frame_num(frame_num); + this->_single_frame_obj_funcs[frame_num].set_frame_definitions(this->_patlak_plot_sptr->get_time_frame_definitions()); + this->_single_frame_obj_funcs[frame_num].set_normalisation_sptr(this->_normalisation_sptr); + this->_single_frame_obj_funcs[frame_num].set_recompute_sensitivity(this->get_recompute_sensitivity()); + this->_single_frame_obj_funcs[frame_num].set_use_subset_sensitivities(this->get_use_subset_sensitivities()); + if(this->_single_frame_obj_funcs[frame_num].set_up(density_template_sptr) != Succeeded::yes) + error("Single frame objective functions is not set correctly!"); + } + }//_single_frame_obj_funcs[frame_num] + + return Succeeded::yes; +} + +/************************************************************************* + functions that compute the value/gradient of the objective function etc +*************************************************************************/ + +template +void +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) +{ + assert(subset_num>=0); + assert(subset_numnum_subsets); + + DynamicDiscretisedDensity dyn_gradient=this->_dyn_image_template; + DynamicDiscretisedDensity dyn_image_estimate=this->_dyn_image_template; + + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame();frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames();++frame_num) + std::fill(dyn_image_estimate[frame_num].begin_all(), + dyn_image_estimate[frame_num].end_all(), + 1.F); + + this->_patlak_plot_sptr->get_dynamic_image_from_parametric_image(dyn_image_estimate,current_estimate) ; + + // loop over single_frame and use model_matrix + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame();frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames();++frame_num) + { + std::fill(dyn_gradient[frame_num].begin_all(), + dyn_gradient[frame_num].end_all(), + 1.F); + + + this->_single_frame_obj_funcs[frame_num]. + compute_sub_gradient_without_penalty_plus_sensitivity(dyn_gradient[frame_num], + dyn_image_estimate[frame_num], + subset_num); + } + + this->_patlak_plot_sptr->multiply_dynamic_image_with_model_gradient(gradient, + dyn_gradient) ; +} + +template +double +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num) +{ + assert(subset_num>=0); + assert(subset_numnum_subsets); + + double result = 0.; + DynamicDiscretisedDensity dyn_image_estimate=this->_dyn_image_template; + + // TODO why fill with 1? + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame();frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames();++frame_num) + std::fill(dyn_image_estimate[frame_num].begin_all(), + dyn_image_estimate[frame_num].end_all(), + 1.F); + this->_patlak_plot_sptr->get_dynamic_image_from_parametric_image(dyn_image_estimate,current_estimate) ; + + // loop over single_frame + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame(); + frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames(); + ++frame_num) + { + result += + this->_single_frame_obj_funcs[frame_num]. + compute_objective_function_without_penalty(dyn_image_estimate[frame_num], + subset_num); + } + return result; +} + +template +void +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const +{ + DynamicDiscretisedDensity dyn_sensitivity=this->_dyn_image_template; + + // loop over single_frame and use model_matrix + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame();frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames();++frame_num) + { + dyn_sensitivity[frame_num]=this->_single_frame_obj_funcs[frame_num].get_subset_sensitivity(subset_num); + // add_subset_sensitivity(dyn_sensitivity[frame_num],subset_num); + } + + this->_patlak_plot_sptr->multiply_dynamic_image_with_model_gradient_and_add_to_input(sensitivity, + dyn_sensitivity) ; +} + +template +Succeeded +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:: +actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const +{ + { + string explanation; + if (!input.has_same_characteristics(this->get_sensitivity(), + explanation)) + { + warning("PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData:\n" + "sensitivity and input for add_multiplication_with_approximate_Hessian_without_penalty\n" + "should have the same characteristics.\n%s", + explanation.c_str()); + return Succeeded::no; + } + } +#ifndef NDEBUG + std::cerr << "INPUT max: (" << input.construct_single_density(1).find_max() + << " , " << input.construct_single_density(2).find_max() + << ")\n"; +#endif //NDEBUG + DynamicDiscretisedDensity dyn_input=this->_dyn_image_template; + DynamicDiscretisedDensity dyn_output=this->_dyn_image_template; + this->_patlak_plot_sptr->get_dynamic_image_from_parametric_image(dyn_input,input) ; + + VectorWithOffset scale_factor(this->_patlak_plot_sptr->get_starting_frame(),this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames()); + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame(); + frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames(); + ++frame_num) + { + assert(dyn_input[frame_num].find_max()==dyn_input[frame_num].find_min()); + if (dyn_input[frame_num].find_max()==dyn_input[frame_num].find_min() && dyn_input[frame_num].find_min()>0.F) + scale_factor[frame_num]=dyn_input[frame_num].find_max(); + else + error("The input image should be uniform even after multiplying with the Patlak Plot.\n"); + +/*! /note This is used to avoid higher values than these set in the precompute_denominator_of_conditioner_without_penalty() function. +/sa for more information see the recon_array_functions.cxx and the value of the max_quotient (originaly set to 10000.F) +*/ + dyn_input[frame_num]/=scale_factor[frame_num]; +#ifndef NDEBUG + std::cerr << "scale factor[" << frame_num << "] " << scale_factor[frame_num] << "\n"; + std::cerr << "dyn_input[" << frame_num << "] max after scale: " + << dyn_input[frame_num].find_max() << "\n"; +#endif //NDEBUG + this->_single_frame_obj_funcs[frame_num]. + add_multiplication_with_approximate_sub_Hessian_without_penalty(dyn_output[frame_num], + dyn_input[frame_num], + subset_num); +#ifndef NDEBUG + std::cerr << "dyn_output[" << frame_num << "] max before scale: (" + << dyn_output[frame_num].find_max() << "\n"; +#endif //NDEBUG + dyn_output[frame_num]*=scale_factor[frame_num]; +#ifndef NDEBUG + std::cerr << "dyn_output[" << frame_num << "] max after scale: (" + << dyn_output[frame_num].find_max() << "\n"; +#endif //NDEBUG + } // end of loop over frames + shared_ptr unnormalised_temp(output.get_empty_copy()); + shared_ptr temp(output.get_empty_copy()); + this->_patlak_plot_sptr->multiply_dynamic_image_with_model_gradient(*unnormalised_temp, + dyn_output) ; + // Trick to use a better step size for the two parameters. + (this->_patlak_plot_sptr->get_model_matrix()).normalise_parametric_image_with_model_sum(*temp,*unnormalised_temp) ; +#ifndef NDEBUG + std::cerr << "TEMP max: (" << temp->construct_single_density(1).find_max() + << " , " << temp->construct_single_density(2).find_max() + << ")\n"; + // Writing images + OutputFileFormat::default_sptr()->write_to_file("all_params_one_input.img", input); + OutputFileFormat::default_sptr()->write_to_file("temp_denominator.img", *temp); + dyn_input.write_to_ecat7("dynamic_input_from_all_params_one.img"); + dyn_output.write_to_ecat7("dynamic_precomputed_denominator.img"); + DynamicProjData temp_projdata = this->get_dyn_proj_data(); + for(unsigned int frame_num=this->_patlak_plot_sptr->get_starting_frame(); + frame_num<=this->_patlak_plot_sptr->get_time_frame_definitions().get_num_frames(); + ++frame_num) + temp_projdata.set_proj_data_sptr(this->_single_frame_obj_funcs[frame_num].get_proj_data_sptr(),frame_num); + + temp_projdata.write_to_ecat7("DynamicProjections.S"); +#endif // NDEBUG + // output += temp + typename TargetT::full_iterator out_iter = output.begin_all(); + typename TargetT::full_iterator out_end = output.end_all(); + typename TargetT::const_full_iterator temp_iter = temp->begin_all_const(); + while (out_iter != out_end) + { + *out_iter += *temp_iter; + ++out_iter; ++temp_iter; + } +#ifndef NDEBUG + std::cerr << "OUTPUT max: (" << output.construct_single_density(1).find_max() + << " , " << output.construct_single_density(2).find_max() + << ")\n"; +#endif // NDEBUG + + + return Succeeded::yes; +} + + +END_NAMESPACE_STIR + + diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h new file mode 100644 index 0000000000..c6edfec7a8 --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h @@ -0,0 +1,289 @@ +/* + Copyright (C) 2003 - 2011-01-14, Hammersmith Imanet Ltd + Copyright (C) 2012, Kris Thielemans + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class stir::PoissonLogLikelihoodWithLinearModelForMean + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +#ifndef __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMean_H__ +#define __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMean_H__ + +#include "stir/recon_buildblock/GeneralisedObjectiveFunction.h" + +START_NAMESPACE_STIR + + +/*! + \ingroup GeneralisedObjectiveFunction + \brief a base class for LogLikelihood of independent Poisson variables + where the mean values are linear combinations of the parameters. + + Suppose the measured data \f$y\f$ are statistically independent and + Poisson distributed with mean \f$\bar y\f$. The log likelihood is then + given by + + \f[ L(y\;\bar y) = \sum_b y_b log \bar y_b - \mathrm{log} y_b! - \bar y_b \f] + + If the means are modeled by some functions of some parameters + \f$Y(\lambda)\f$, the gradient w.r.t. those parameters follows + immediately as + + \f[ {\partial L \over \partial \lambda_v} = + \sum_b \left( {y_b \over Y_b} - 1 \right) + {\partial Y_b \over \partial \lambda_v } + \f] + + In this class, it is assumed that the means are linear functions of + the parameters, which using matrices and vectors can be written + (in a notation familiar to PET people) as + + \f[ Y = P \lambda + r \f] + + If the background term \f$r\f$ is 0, \f$P_{bv}\f$ gives + the conditional probability of detecting a count in bin \f$b\f$ + if the parameter \f$\lambda_v\f$ is 1 and all others 0. + + In this case, the gradient is given by + \f[ {\partial L \over \partial \lambda_v} = + \sum_b P_{bv} {y_b \over Y_b} - P_v + \f] + where + \f[ + P_v = \sum_b P_{bv} + \f] + where the sum is over all possible bins (not only those where + any counts were detected). We call the vector given by \f$P_v\f$ + the sensitivity because (if \f$r=0\f$) it is the total + probability of detecting a count (in any bin) originating from \f$v\f$. + + This class computes the gradient as a sum of these two terms. The + sensitivity has to be computed by the virtual function + \c add_subset_sensitivity(). The sum is computed by + \c compute_sub_gradient_without_penalty_plus_sensitivity(). + + The reason for this is that the sensitivity is data-independent, and + can be computed only once. See also + PoissonLogLikelihoodWithLinearModelForMeanAndListModeData. + + \par Relation with Kullback-Leibler distance + + Note that up to terms independent of \f$\bar y\f$, the log likelihood + is equal to minus the + Kullback-Leibler generalised distance + + \f[ \mathrm{KL}(y,\bar y) = \sum_b y_b \mathrm{log}(y_b/\bar y_b) + \bar y_b - y_b \f] + + which has the nice property that \f$\mathrm{KL}(y,\bar y)=0\f$ implies that + \f$y=\bar y\f$. + + \par Parameters for parsing + Defaults are indicated below + \verbatim + ; specifies if we keep separate sensitivity images (which is more accurate and is + ; recommended) or if we assume the subsets are exactly balanced + ; and hence compute the subset-senstivity as sensitivity/num_subsets (this uses less memory). + use_subset_sensitivities := 1 + ; for recomputing sensitivity, even if a filename is specified + recompute sensitivity:= 0 + ; filename for reading the sensitivity, or writing if it is recomputed + ; if use_subset_sensitivities=0 + sensitivity filename:= + ; pattern for filename for reading the subset sensitivities, or writing if recomputed + ; if use_subset_sensitivities=1 + ; e.g. subsens_%d.hv + ; boost::format is used with the pattern (which means you can use it like sprintf) + subset sensitivity filenames:= + \endverbatim + + \par Terminology + We currently use \c sub_gradient for the gradient of the likelihood of the subset (not + the mathematical subgradient). +*/ +template +class PoissonLogLikelihoodWithLinearModelForMean: +public GeneralisedObjectiveFunction +{ + private: + typedef GeneralisedObjectiveFunction base_type; + + public: + + //PoissonLogLikelihoodWithLinearModelForMean(); + + //! Implementation in terms of compute_sub_gradient_without_penalty_plus_sensitivity() + /*! \warning If separate subsensitivities are not used, we just subtract the total + sensitivity divided by the number of subsets. + This is fine for some algorithms as the sum over all the subsets is + equal to gradient of the objective function (without prior). + Other algorithms do not behave very stable under this approximation + however. So, currently setup() will return an error if + !subsets_are_approximately_balanced() and subset sensitivities + are not used. + + \see get_use_subset_sensitivities() + */ + virtual void + compute_sub_gradient_without_penalty(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num); + + //! This should compute the gradient of the (unregularised) objective function plus the (sub)sensitivity + /*! + This function is used for instance by OSMAPOSL. + + This computes + \f[ {\partial L \over \partial \lambda_v} + P_v = + \sum_b P_{bv} {y_b \over Y_b} + \f] + (see the class general documentation). + The sum will however be restricted to a subset. + */ + virtual void + compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) =0; + + //! set-up sensitivity etc if possible + /*! If \c recompute_sensitivity is \c false, we will try to + read it from either \c subset_sensitivity_filenames or \c sensitivity_filename, + depending on the setting of get_use_subset_sensitivities(). + + If \c sensitivity_filename is equal + to "1", all data are + set to \c 1. + + \deprecated This special handling of the string "1" will be removed later. + + Calls set_up_before_sensitivity(). + */ + virtual Succeeded set_up(shared_ptr const& target_sptr); + + //! Get a const reference to the total sensitivity + const TargetT& get_sensitivity() const; + //! Get a const reference to the sensitivity for a subset + const TargetT& get_subset_sensitivity(const int subset_num) const; + + //! Add subset sensitivity to existing data + virtual void + add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const = 0; + + //! find out if subset_sensitivities are used + /*! If \c true, the sub_gradient and subset_sensitivity functions use the sensitivity + for the given subset, otherwise, we use the total sensitivity divided by the number + of subsets. The latter uses less memory, but is less stable for most (all?) algorithms. + */ + bool get_use_subset_sensitivities() const; + + //! find current value of recompute_sensitivity + bool get_recompute_sensitivity() const; + + //! get filename to read (or write) the total sensitivity + /*! will be a zero string if not set */ + std::string get_sensitivity_filename() const; + //! get filename pattern to read (or write) the subset sensitivities + /*! will be a zero string if not set. + Could be e.g. "subsens_%d.hv" + boost::format is used with the pattern (which means you can use it like sprintf) + */ + std::string get_subsensitivity_filenames() const; + + /*! \name Functions to set parameters + This can be used as alternative to the parsing mechanism. + \warning After using any of these, you have to call set_up(). + \warning Be careful with setting shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + void set_recompute_sensitivity(const bool); + void set_subset_sensitivity_sptr(const shared_ptr&, const int subset_num); + + //! See get_use_subset_sensitivities() + void set_use_subset_sensitivities(const bool); + + //! set filename to read (or write) the total sensitivity + /*! set to a zero-length string to avoid reading/writing a file */ + void set_sensitivity_filename(const std::string&); + //! set filename pattern to read (or write) the subset sensitivities + /*! set to a zero-length string to avoid reading/writing a file + Could be e.g. "subsens_%d.hv" + boost::format is used with the pattern (which means you can use it like sprintf) + + Calls error() if the pattern is invalid. + */ + void set_subsensitivity_filenames(const std::string&); + //@} + + /*! The implementation checks if the sensitivity of a voxel is zero. If so, + it will the target voxel will be assigned the desired value. + */ + void + fill_nonidentifiable_target_parameters(TargetT& target, const float value ) const; + + private: + + std::string sensitivity_filename; + std::string subsensitivity_filenames; + bool recompute_sensitivity; + bool use_subset_sensitivities; + + VectorWithOffset > subsensitivity_sptrs; + shared_ptr sensitivity_sptr; + + //! Get the subset sensitivity sptr + shared_ptr + get_subset_sensitivity_sptr(const int subset_num) const; + //! compute total from subsensitivity or vice versa + /*! This function will be called by set_up() after reading new images, and/or + by compute_sensitivities(). + + if get_use_subset_sensitivities() is true, the total sensitivity is computed + by adding the subset sensitivities, otherwise, the subset sensitivities are + computed by dividng the total sensitivity by \c num_subsets. + */ + void set_total_or_subset_sensitivities(); + +protected: + //! set-up specifics for the derived class + virtual Succeeded + set_up_before_sensitivity(shared_ptr const& target_sptr) = 0; + + //! compute subset and total sensitivity + /*! This function fills in the sensitivity data by calling add_subset_sensitivity() + for all subsets. It assumes that the subsensitivity for the 1st subset has been + allocated already (and is the correct size). + */ + void compute_sensitivities(); + + //! Sets defaults for parsing + /*! Resets \c sensitivity_filename, \c subset_sensitivity_filenames to empty, + \c recompute_sensitivity to \c false, and \c use_subset_sensitivities to false. + */ + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.h b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.h new file mode 100644 index 0000000000..05c7fd11fa --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.h @@ -0,0 +1,216 @@ +/* + Copyright (C) 2006- 2009, Hammersmith Imanet Ltd + Copyright (C) 2010- 2013, King's College London + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class stir::PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion + + \author Charalampos Tsoumpas + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#ifndef __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion_H__ +#define __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion_H__ +#include "stir/shared_ptr.h" +#include "stir/RegisteredObject.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h" +#include "stir/VectorWithOffset.h" +#include "stir/GatedProjData.h" +#include "stir/GatedDiscretisedDensity.h" +#include "stir/spatial_transformation/GatedSpatialTransformation.h" + +START_NAMESPACE_STIR + +/*! + \ingroup GeneralisedObjectiveFunction + \brief a base class for LogLikelihood of independent Poisson variables + where the mean values are linear combinations of the gated images. + + \f[ + \begin{array}{lcl} + \Lambda_{\nu}^{(s+1)}&&=\Lambda_{\nu}^{(s)} \frac{1}{ \sum\limits_{b\in S_{l}, g} \sum\limits_{\nu'} \hat{W}^{-1} _{\nu'g\rightarrow \nu}P_{\nu' b}A_{bg}+\beta \nabla_{\Lambda_{\nu}} E_{\nu}^{(s)}}\\ + &&\times \sum\limits_{b\in S_{l}, g} \sum\limits_{\nu'}\left(\hat{W}^{-1} _{\nu'g\rightarrow \nu}P_{\nu' b}\frac{Y_{bg}}{\sum\limits_{\tilde{\nu}}P_{b\tilde{\nu}}\sum\limits_{\tilde{\nu}'}\hat{W} _{\tilde{\nu}'\rightarrow \tilde{\nu}g}\Lambda_{\tilde{\nu}'}^{(s)}+\frac{B_{bg}}{A_{bg}}}\right) + \end{array} +\f] + \par Parameters for parsing + + For more information: Tsoumpas et al (2013) Physics in Medicine and Biology + +*/ + +template +class PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion: +public RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMean > +{ + private: + typedef RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMean > base_type; + typedef PoissonLogLikelihoodWithLinearModelForMeanAndProjData > SingleGateObjFunc ; + VectorWithOffset _single_gate_obj_funcs; + + TimeGateDefinitions _time_gate_definitions; + + public: + + //! Name which will be used when parsing a GeneralisedObjectiveFunction object + static const char * const registered_name; + + PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion(); + + //! Returns a pointer to a newly allocated target object (with 0 data). + /*! Dimensions etc are set from the \a gated_proj_data_sptr and other information set by parsing, + such as \c zoom, \c output_image_size_z etc. + */ + virtual TargetT * + construct_target_ptr() const; + + virtual void + compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num); + + virtual double + actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num); + + virtual Succeeded set_up_before_sensitivity(shared_ptr const& target_sptr); + + //! Add subset sensitivity to existing data + virtual void + add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const; + + virtual Succeeded + actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const; + + void set_time_gate_definitions(const TimeGateDefinitions & time_gate_definitions); + + /*! \name Functions to get parameters + \warning Be careful with changing shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + const GatedProjData& get_gated_proj_data() const; + const shared_ptr& get_gated_proj_data_sptr() const; + const int get_max_segment_num_to_process() const; + const bool get_zero_seg0_end_planes() const; + const GatedProjData& get_additive_gated_proj_data() const; + const shared_ptr& get_additive_gated_proj_data_sptr() const; + const GatedProjData& get_normalisation_gated_proj_data() const; + const shared_ptr& get_normalisation_gated_proj_data_sptr() const; + const ProjectorByBinPair& get_projector_pair() const; + const shared_ptr& get_projector_pair_sptr() const; + //@} + + /*! \name Functions to set parameters + This can be used as alternative to the parsing mechanism. + \warning After using any of these, you have to call set_up(). + \warning Be careful with setting shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + void set_recompute_sensitivity(const bool); + void set_sensitivity_sptr(const shared_ptr&); + virtual int set_num_subsets(const int num_subsets); + //@} + protected: + //! Filename with input projection data + string _input_filename; + string _motion_vectors_filename_prefix; + string _reverse_motion_vectors_filename_prefix; + string _gate_definitions_filename; + + //! points to the object for the total input projection data + shared_ptr _gated_proj_data_sptr; + + //! the maximum absolute ring difference number to use in the reconstruction + /*! convention: if -1, use get_max_segment_num()*/ + int _max_segment_num_to_process; + + const TimeGateDefinitions & + get_time_gate_definitions() const ; + + /**********************/ + // image stuff + // TODO to be replaced with single class or so (TargetT obviously) + //! the output image size in x and y direction + /*! convention: if -1, use a size such that the whole FOV is covered + */ + int _output_image_size_xy; // KT 10122001 appended _xy + + //! the output image size in z direction + /*! convention: if -1, use default as provided by VoxelsOnCartesianGrid constructor + */ + int _output_image_size_z; // KT 10122001 new + + //! the zoom factor + double _zoom; + + //! offset in the x-direction + double _Xoffset; + + //! offset in the y-direction + double _Yoffset; + + // KT 20/06/2001 new + //! offset in the z-direction + double _Zoffset; + + /********************************/ + //! name of file in which additive projection data are stored + string _additive_gated_proj_data_filename; + + //! name of file in which normalisation projection data are stored + string _normalisation_gated_proj_data_filename; + + //! points to the additive projection data + /*! the projection data in this file is bin-wise added to forward projection results*/ + shared_ptr _additive_gated_proj_data_sptr; + shared_ptr _normalisation_gated_proj_data_sptr; + /*! the normalisation or/and attenuation data */ + string _normalisation_filename_prefix; + //! Stores the projectors that are used for the computations + shared_ptr _projector_pair_ptr; + //! signals whether to zero the data in the end planes of the projection data + bool _zero_seg0_end_planes; + /*! the motion vectors where all information is stored */ + int _motion_correction_type; // This could be set up in a more generic way in order to choose how motion correction will be applied// + GatedSpatialTransformation _motion_vectors; + GatedSpatialTransformation _reverse_motion_vectors; + + //! gated image template + GatedDiscretisedDensity _gated_image_template; + bool actual_subsets_are_approximately_balanced(string& warning_message) const; + + //! Sets defaults before parsing + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.txx b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.txx new file mode 100644 index 0000000000..a2ef68b8e6 --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.txx @@ -0,0 +1,544 @@ +/* + Copyright (C) 2006- 2009, Hammersmith Imanet Ltd + Copyright (C) 2011 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Implementation of class stir::PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion + + \author Charalampos Tsoumpas + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +#include "stir/DiscretisedDensity.h" +#include "stir/is_null_ptr.h" +#include "stir/recon_buildblock/TrivialBinNormalisation.h" +#include "stir/Succeeded.h" +#include "stir/recon_buildblock/ProjectorByBinPair.h" + +// include the following to set defaults +#ifndef USE_PMRT +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#else +#include "stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#endif +#include "stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h" + +#include +#include +// For Motion +#include "stir/spatial_transformation/GatedSpatialTransformation.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.h" +#include "stir/recon_buildblock/BinNormalisationFromProjData.h" + +START_NAMESPACE_STIR + +template +const char * const +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +registered_name = +"PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion"; + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +set_defaults() +{ + base_type::set_defaults(); + + this->_input_filename=""; + this->_max_segment_num_to_process=-1; // use all segments + //num_views_to_add=1; // KT 20/06/2001 disabled + + this->_gated_proj_data_sptr.reset(); + this->_zero_seg0_end_planes = 0; + this->_reverse_motion_vectors_filename_prefix="0"; + this->_normalisation_gated_proj_data_filename="1"; + this->_normalisation_gated_proj_data_sptr.reset(); + // this->_reverse_motion_vectors_sptr=NULL; + this->_motion_vectors_filename_prefix="0"; + // this->_motion_vectors_sptr=NULL; + this->_gate_definitions_filename="0"; + // this->_time_gate_definitions_sptr=NULL; + this->_additive_gated_proj_data_filename = "0"; + this->_additive_gated_proj_data_sptr.reset(); + +#ifndef USE_PMRT // set default for _projector_pair_ptr + shared_ptr forward_projector_ptr + (new ForwardProjectorByBinUsingRayTracing()); + shared_ptr back_projector_ptr + (new BackProjectorByBinUsingInterpolation()); +#else + shared_ptr PM + (new ProjMatrixByBinUsingRayTracing()); + shared_ptr forward_projector_ptr + (new ForwardProjectorByBinUsingProjMatrixByBin(PM)); + shared_ptr back_projector_ptr + (new BackProjectorByBinUsingProjMatrixByBin(PM)); +#endif + + this->_projector_pair_ptr.reset( + new ProjectorByBinPairUsingSeparateProjectors(forward_projector_ptr, back_projector_ptr)); + + // image stuff + this->_output_image_size_xy=-1; + this->_output_image_size_z=-1; + this->_zoom=1.F; + this->_Xoffset=0.F; + this->_Yoffset=0.F; + this->_Zoffset=0.F; // KT 20/06/2001 new +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion Parameters"); + this->parser.add_stop_key("End PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion Parameters"); + this->parser.add_key("input filename",&this->_input_filename); + + // parser.add_key("mash x views", &num_views_to_add); // KT 20/06/2001 disabled + this->parser.add_key("maximum absolute segment number to process", &this->_max_segment_num_to_process); + this->parser.add_key("zero end planes of segment 0", &this->_zero_seg0_end_planes); + + // image stuff + this->parser.add_key("zoom", &this->_zoom); + this->parser.add_key("XY output image size (in pixels)",&this->_output_image_size_xy); + this->parser.add_key("Z output image size (in pixels)",&this->_output_image_size_z); + + // parser.add_key("X offset (in mm)", &this->Xoffset); // KT 10122001 added spaces + // parser.add_key("Y offset (in mm)", &this->Yoffset); + this->parser.add_key("Z offset (in mm)", &this->_Zoffset); + this->parser.add_parsing_key("Projector pair type", &this->_projector_pair_ptr); + + // Scatter correction + this->parser.add_key("additive sinograms",&this->_additive_gated_proj_data_filename); + + // normalisation (and attenuation correction) + this->parser.add_key("normalisation sinograms", &this->_normalisation_gated_proj_data_filename); + + // Motion Information + this->parser.add_key("Gate Definitions filename", &this->_gate_definitions_filename); + this->parser.add_key("Motion Vectors filename prefix", &this->_motion_vectors_filename_prefix); + this->parser.add_key("Reverse Motion Vectors filename prefix", &this->_reverse_motion_vectors_filename_prefix); +} + +template +bool +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +post_processing() +{ + if (base_type::post_processing() == true) + return true; + if (this->_input_filename.length() == 0) + { warning("You need to specify an input filename"); return true; } + + this->_gated_proj_data_sptr.reset(GatedProjData::read_from_file(this->_input_filename)); + + // image stuff + if (this->_zoom <= 0) + { warning("zoom should be positive"); return true; } + + if (this->_output_image_size_xy!=-1 && this->_output_image_size_xy<1) // KT 10122001 appended_xy + { warning("output image size xy must be positive (or -1 as default)"); return true; } + if (this->_output_image_size_z!=-1 && this->_output_image_size_z<1) // KT 10122001 new + { warning("output image size z must be positive (or -1 as default)"); return true; } + + if (this->_additive_gated_proj_data_filename != "0") + { + std::cerr << "\nReading additive projdata data " + << this->_additive_gated_proj_data_filename + << std::endl; + this->_additive_gated_proj_data_sptr.reset( + GatedProjData::read_from_file(this->_additive_gated_proj_data_filename)); + } + if (this->_normalisation_gated_proj_data_filename != "1") + { + std::cerr << "\nReading normalisation projdata data " + << this->_normalisation_gated_proj_data_filename + << std::endl; + this->_normalisation_gated_proj_data_sptr.reset( + GatedProjData::read_from_file(this->_normalisation_gated_proj_data_filename)); + } + + this->_time_gate_definitions.read_gdef_file(this->_gate_definitions_filename); + + if (this->_reverse_motion_vectors_filename_prefix != "0") + this->_reverse_motion_vectors.read_from_files(this->_reverse_motion_vectors_filename_prefix); + if (this->_motion_vectors_filename_prefix != "0") + this->_motion_vectors.read_from_files(this->_motion_vectors_filename_prefix); + return false; +} + +template +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion() +{ + this->set_defaults(); +} + +template +TargetT * +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +construct_target_ptr() const +{ + return + new VoxelsOnCartesianGrid (*this->_gated_proj_data_sptr->get_proj_data_info_ptr(), + static_cast(this->_zoom), + CartesianCoordinate3D(static_cast(this->_Zoffset), + static_cast(this->_Yoffset), + static_cast(this->_Xoffset)), + CartesianCoordinate3D(this->_output_image_size_z, + this->_output_image_size_xy, + this->_output_image_size_xy) + ); +} +/*************************************************************** + subset balancing +***************************************************************/ + +template +bool +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +actual_subsets_are_approximately_balanced(std::string& warning_message) const +{ // call actual_subsets_are_approximately_balanced() for first single_gate_obj_func + if (this->get_time_gate_definitions().get_num_gates() == 0 || this->_single_gate_obj_funcs.size() == 0) + error("PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:\n" + "actual_subsets_are_approximately_balanced called but no gates yet."); + else if(this->_single_gate_obj_funcs.size() != 0) + { + bool gates_are_balanced=true; + for(unsigned int gate_num=1;gate_num<=this->get_time_gate_definitions().get_num_gates();++gate_num) + gates_are_balanced &= this->_single_gate_obj_funcs[gate_num].subsets_are_approximately_balanced(warning_message); + return gates_are_balanced; + } + else + error("Something strange happened in PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:\n" + "actual_subsets_are_approximately_balanced called before setup()?"); + return + false; +} + +/*************************************************************** + get_ functions +***************************************************************/ +template +const TimeGateDefinitions & +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_time_gate_definitions() const +{ return this->_time_gate_definitions; } + +template +const GatedProjData& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_gated_proj_data() const +{ return *this->_gated_proj_data_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_gated_proj_data_sptr() const +{ return this->_gated_proj_data_sptr; } + +template +const int +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_max_segment_num_to_process() const +{ return this->_max_segment_num_to_process; } + +template +const bool +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_zero_seg0_end_planes() const +{ return this->_zero_seg0_end_planes; } + +template +const GatedProjData& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_additive_gated_proj_data() const +{ return *this->_additive_gated_proj_data_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_additive_gated_proj_data_sptr() const +{ return this->_additive_gated_proj_data_sptr; } + +template +const GatedProjData& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_normalisation_gated_proj_data() const +{ return *this->_normalisation_gated_proj_data_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_normalisation_gated_proj_data_sptr() const +{ return this->_normalisation_gated_proj_data_sptr; } + +template +const ProjectorByBinPair& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_projector_pair() const +{ return *this->_projector_pair_ptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +get_projector_pair_sptr() const +{ return this->_projector_pair_ptr; } + +/*************************************************************** + set_ functions +***************************************************************/ +template +int +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +set_num_subsets(const int num_subsets) +{ + for(unsigned int gate_num=1;gate_num<=this->get_time_gate_definitions().get_num_gates();++gate_num) + { + if(this->_single_gate_obj_funcs.size() != 0) + if(this->_single_gate_obj_funcs[gate_num].set_num_subsets(num_subsets) != num_subsets) + error("set_num_subsets didn't work"); + } + this->num_subsets=num_subsets; + return this->num_subsets; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +set_time_gate_definitions(const TimeGateDefinitions & time_gate_definitions) +{ this->_time_gate_definitions=time_gate_definitions; } + + +/*************************************************************** + set_up() +***************************************************************/ +template +Succeeded +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +set_up_before_sensitivity(shared_ptr const& target_sptr) +{ + /*!todo define in the PoissonLogLikelihoodWithLinearModelForMean class to return Succeeded::yes + if (base_type::set_up_before_sensitivity(target_sptr) != Succeeded::yes) + return Succeeded::no; + */ + if (this->_max_segment_num_to_process==-1) + this->_max_segment_num_to_process = + (this->_gated_proj_data_sptr)->get_proj_data_sptr(1)->get_max_segment_num(); + + if (this->_max_segment_num_to_process > (this->_gated_proj_data_sptr)->get_proj_data_sptr(1)->get_max_segment_num()) + { + warning("_max_segment_num_to_process (%d) is too large", + this->_max_segment_num_to_process); + return Succeeded::no; + } + + shared_ptr proj_data_info_sptr( + (this->_gated_proj_data_sptr->get_proj_data_sptr(1))->get_proj_data_info_ptr()->clone()); + proj_data_info_sptr-> + reduce_segment_range(-this->_max_segment_num_to_process, + +this->_max_segment_num_to_process); + + if (is_null_ptr(this->_projector_pair_ptr)) + { warning("You need to specify a projector pair"); return Succeeded::no; } + + if (this->num_subsets <= 0) + { + warning("Number of subsets %d should be larger than 0.", + this->num_subsets); + return Succeeded::no; + } + { + const shared_ptr > density_template_sptr(target_sptr->get_empty_copy()); // target_sptr appears not to be set up correctly + const shared_ptr scanner_sptr(new Scanner(*proj_data_info_sptr->get_scanner_ptr())); + this->_gated_image_template=GatedDiscretisedDensity(this->get_time_gate_definitions(), density_template_sptr); + + // construct _single_gate_obj_funcs + this->_single_gate_obj_funcs.resize(1,this->get_time_gate_definitions().get_num_gates()); + + for(unsigned int gate_num=1;gate_num<=this->get_time_gate_definitions().get_num_gates();++gate_num) + { + std::cerr << "Objective Function for Gate Number: " << gate_num << "\n"; + this->_single_gate_obj_funcs[gate_num].set_projector_pair_sptr(this->_projector_pair_ptr); + this->_single_gate_obj_funcs[gate_num].set_proj_data_sptr(this->_gated_proj_data_sptr->get_proj_data_sptr(gate_num)); + this->_single_gate_obj_funcs[gate_num].set_max_segment_num_to_process(this->_max_segment_num_to_process); + this->_single_gate_obj_funcs[gate_num].set_zero_seg0_end_planes(this->_zero_seg0_end_planes!=0); + if(this->_additive_gated_proj_data_sptr!=NULL) + this->_single_gate_obj_funcs[gate_num].set_additive_proj_data_sptr(this->_additive_gated_proj_data_sptr->get_proj_data_sptr(gate_num)); + this->_single_gate_obj_funcs[gate_num].set_num_subsets(this->num_subsets); + this->_single_gate_obj_funcs[gate_num].set_frame_num(1);//This should be gate... + vector > frame_times(1, pair(0,1)); + this->_single_gate_obj_funcs[gate_num].set_frame_definitions(TimeFrameDefinitions(frame_times)); + + shared_ptr current_gate_norm_factors_sptr; + if (is_null_ptr(this->_normalisation_gated_proj_data_sptr)) + current_gate_norm_factors_sptr.reset(new TrivialBinNormalisation); + else { + shared_ptr norm_data_sptr(this->_normalisation_gated_proj_data_sptr->get_proj_data_sptr(gate_num)); + current_gate_norm_factors_sptr.reset( + new BinNormalisationFromProjData(norm_data_sptr)); + } + this->_single_gate_obj_funcs[gate_num].set_normalisation_sptr(current_gate_norm_factors_sptr); + this->_single_gate_obj_funcs[gate_num].set_recompute_sensitivity(this->get_recompute_sensitivity()); + this->_single_gate_obj_funcs[gate_num].set_use_subset_sensitivities(this->get_use_subset_sensitivities()); + + if(this->_single_gate_obj_funcs[gate_num].set_up(density_template_sptr) != Succeeded::yes) + error("Single gate objective functions is not set correctly!"); + } + }//_single_gate_obj_funcs[gate_num] + return Succeeded::yes; +} + +/************************************************************************* + functions that compute the value/gradient of the objective function etc +*************************************************************************/ + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) +{ + assert(subset_num>=0); + assert(subset_numnum_subsets); + + GatedDiscretisedDensity gated_gradient=this->_gated_image_template; + GatedDiscretisedDensity gated_image_estimate=this->_gated_image_template; + // The following initialization doesn't stabilize reconstruction. + for(unsigned int gate_num=1;gate_num<=this->get_time_gate_definitions().get_num_gates();++gate_num) + std::fill(gated_image_estimate[gate_num].begin_all(), + gated_image_estimate[gate_num].end_all(), + 0.F); + this->_motion_vectors.warp_image(gated_image_estimate,current_estimate); + for(unsigned int gate_num=1;gate_num<=this->get_time_gate_definitions().get_num_gates();++gate_num) { + std::fill(gated_gradient[gate_num].begin_all(), + gated_gradient[gate_num].end_all(), + 0.F); + this->_single_gate_obj_funcs[gate_num]. + compute_sub_gradient_without_penalty_plus_sensitivity(gated_gradient[gate_num], + gated_image_estimate[gate_num], + subset_num); + } + // if(this->_motion_correction_type==-1) + this->_reverse_motion_vectors.warp_image(gradient,gated_gradient) ; + // else + // this->_motion_vectors.warp_image(gradient,gated_gradient) ; +} + +template +double +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num) +{ + assert(subset_num>=0); + assert(subset_numnum_subsets); + + double result = 0.; + GatedDiscretisedDensity gated_image_estimate=this->_gated_image_template; + // The following initialization doesn't stabilize reconstruction. + for(unsigned int gate_num=1; gate_num<=this->get_time_gate_definitions().get_num_gates(); ++gate_num) + std::fill(gated_image_estimate[gate_num].begin_all(), + gated_image_estimate[gate_num].end_all(), + 0.F); + this->_motion_vectors.warp_image(gated_image_estimate,current_estimate) ; + // loop over single_gate + for(unsigned int gate_num=1 ; + gate_num<=this->get_time_gate_definitions().get_num_gates(); + ++gate_num) + { + result += this->_single_gate_obj_funcs[gate_num]. + compute_objective_function_without_penalty(gated_image_estimate[gate_num], + subset_num); + } + return result; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const +{ + GatedDiscretisedDensity gated_subset_sensitivity=this->_gated_image_template; + + // loop over single_gate to get original subset sensitivity + for(unsigned int gate_num=1;gate_num<=this->get_time_gate_definitions().get_num_gates();++gate_num) + { + const shared_ptr > single_gate_subsensitivity_sptr( + this->_single_gate_obj_funcs[gate_num].get_subset_sensitivity(subset_num).clone()); + gated_subset_sensitivity.set_density_sptr(single_gate_subsensitivity_sptr,gate_num); + } + + // perform warp + this->_reverse_motion_vectors.accumulate_warp_image(sensitivity,gated_subset_sensitivity) ; +} +//! /todo The PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion::actual_add_multiplication_with_approximate_sub_Hessian_without_penalty is not validated and at the moment OSSPS does not converge with motion correction. +template +Succeeded +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:: +actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const +{ + // TODO this does not add but replace + { + string explanation; + if (!input.has_same_characteristics(this->get_subset_sensitivity(0), //////////////////// + explanation)) + { + warning("PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion:\n" + "sensitivity and input for add_multiplication_with_approximate_Hessian_without_penalty\n" + "should have the same characteristics.\n%s", + explanation.c_str()); + return Succeeded::no; + } + } + GatedDiscretisedDensity gated_input=this->_gated_image_template; + GatedDiscretisedDensity gated_output=this->_gated_image_template; + this->_motion_vectors.warp_image(gated_input,input) ; + + VectorWithOffset scale_factor(1,this->get_time_gate_definitions().get_num_gates()); + for(unsigned int gate_num=1; + gate_num<=this->get_time_gate_definitions().get_num_gates(); + ++gate_num) + { + scale_factor[gate_num]=gated_input[gate_num].find_max(); + /*! /note This is used to avoid higher values than these set in the precompute_denominator_of_conditioner_without_penalty() function. + /sa for more information see the recon_array_functions.cxx and the value of the max_quotient (originaly set to 10000.F) */ + gated_input[gate_num]/=scale_factor[gate_num]; + this->_single_gate_obj_funcs[gate_num]. + add_multiplication_with_approximate_sub_Hessian_without_penalty(gated_output[gate_num], + gated_input[gate_num], + subset_num); + gated_output[gate_num]*=scale_factor[gate_num]; + } // end of loop over gates + this->_reverse_motion_vectors.warp_image(output,gated_output); + output/=this->get_time_gate_definitions().get_num_gates(); //Normalizing to get the average value to test if OSSPS works. + return Succeeded::yes; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.h b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.h new file mode 100644 index 0000000000..1d1c4f85b1 --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.h @@ -0,0 +1,144 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class + stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeData + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#ifndef __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndListModeData_H__ +#define __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndListModeData_H__ + + +//#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h" +#include "stir/listmode/CListModeData.h" +#include "stir/TimeFrameDefinitions.h" + +START_NAMESPACE_STIR + +/*! + \ingroup GeneralisedObjectiveFunction + \brief An objective function class appropriate for PET list mode data + + The statistics for list mode data is slightly different from having a set + of counts, see the paper + H. H. Barrett, L. Parra, and T. White, + List-mode likelihood, J. Optical Soc. Amer. A, vol. 14, no. 11, 1997. + + However, it is intuitive that the list mode likelihood can be + derived from that 'binned' likelihood by taking smaller and smaller + time bins. One can then see that the gradient of the list mode + likelihood can be computed similar to the 'binned' case, but now + with a sum over events. The sensitivity still needs a sum (or integral) + over all possible detections. + + At present, STIR does not contain any classes to forward/back + project list mode data explictly. So, the sum over events cannot + be computed for arbitrary list mode data. This is currently + done in derived classes. + + For list mode reconstructions, computing the sensitivity is sometimes + conceptually very difficult (how to compute the integral) or impractical. + So, even if we will be abel to compute the sum over events in a generic way, + the add_subset_sensitivity() function will have to be implemented by + a derived class, specific for the measurement. + +*/ +template +class PoissonLogLikelihoodWithLinearModelForMeanAndListModeData: +public PoissonLogLikelihoodWithLinearModelForMean +{ +private: + + typedef PoissonLogLikelihoodWithLinearModelForMean base_type; + +public: + + + PoissonLogLikelihoodWithLinearModelForMeanAndListModeData(); + + //virtual TargetT * construct_target_ptr(); + + //virtual Succeeded + //set_up(shared_ptr const& target_sptr); + + virtual + void compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num)=0; + //! time frame definitions + /*! \todo This is currently used to be able to compute the gradient for + one time frame. However, it probably does not belong here. + For instance when fitting kinetic model parameters from list + mode data, time frames are in principle irrelevant. So, we will + probably shift this to the derived class. + */ + TimeFrameDefinitions frame_defs; +protected: + string frame_defs_filename; + + //! Filename with input projection data + string list_mode_filename; + + //! Listmode pointer + shared_ptr list_mode_data_sptr; + + int current_frame_num; + + //! sets any default values + /*! Has to be called by set_defaults in the leaf-class */ + virtual void set_defaults(); + //! sets keys + /*! Has to be called by initialise_keymap in the leaf-class */ + virtual void initialise_keymap(); + + virtual bool post_processing(); + + int output_image_size_xy; + + //! the output image size in z direction + /*! convention: if -1, use default as provided by VoxelsOnCartesianGrid constructor + */ + int output_image_size_z; + + //! the zoom factor + double zoom; + + //! offset in the x-direction + double Xoffset; + + //! offset in the y-direction + double Yoffset; + + // KT 20/06/2001 new + //! offset in the z-direction + double Zoffset; +}; + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.h b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.h new file mode 100644 index 0000000000..fe488b3d3f --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.h @@ -0,0 +1,131 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class + stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +#ifndef __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin_H__ +#define __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin_H__ + + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.h" +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/ProjDataInMemory.h" +START_NAMESPACE_STIR + + +/*! + \ingroup GeneralisedObjectiveFunction + \brief Class for PET list mode data from static images for a scanner with discrete detectors. + + If the scanner has discrete (and stationary) detectors, it can be modeled via ProjMatrixByBin and BinNormalisation. + + \see PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + If the list mode data is binned (with LmToProjData) without merging + any bins, then the log likelihood computed from list mode data and + projection data will be identical. +*/ + +template +class PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin: +public RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMeanAndListModeData > + +{ + +private: +typedef RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMeanAndListModeData > + base_type; + +public: + + //! Name which will be used when parsing a GeneralisedObjectiveFunction object + static const char * const registered_name; + + PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin(); + + //! This should compute the gradient of the objective function at the current_image_estimate + virtual + void compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num); + virtual TargetT * construct_target_ptr() const; + + int set_num_subsets(const int new_num_subsets); + +protected: + virtual double + actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num) + { // TODO + error("compute_objective_function_without_penalty Not implemented yet"); + return 0; + } + + virtual Succeeded + set_up_before_sensitivity(shared_ptr const& target_sptr); + + // TODO + virtual void + add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const + { + error("add_subset_sensitivity not implemented yet"); + } + + //! Maximum ring difference to take into account + /*! \todo Might be removed */ + int max_ring_difference_num_to_process; + + //! Stores the projectors that are used for the computations + shared_ptr PM_sptr; + //shared_ptr projector_by_bin_pair; + + //! points to the additive projection data + shared_ptr additive_proj_data_sptr; + + string additive_projection_data_filename ; + //! ProjDataInfo + shared_ptr proj_data_info_cyl_uncompressed_ptr; + + //! sets any default values + /*! Has to be called by set_defaults in the leaf-class */ + virtual void set_defaults(); + //! sets keys + /*! Has to be called by initialise_keymap in the leaf-class */ + virtual void initialise_keymap(); + virtual bool post_processing(); + + virtual bool actual_subsets_are_approximately_balanced(std::string& warning_message) const; +}; + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h new file mode 100644 index 0000000000..17132f822b --- /dev/null +++ b/src/include/stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h @@ -0,0 +1,371 @@ +/* + Copyright (C) 2003 - 2011-02-23, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#ifndef __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndProjData_H__ +#define __stir_recon_buildblock_PoissonLogLikelihoodWithLinearModelForMeanAndProjData_H__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h" +#include "stir/ProjData.h" +#include "stir/recon_buildblock/ProjectorByBinPair.h" +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/TimeFrameDefinitions.h" +#ifdef STIR_MPI +#include "stir/recon_buildblock/distributable.h" // for RPC_process_related_viewgrams_type +#endif + +START_NAMESPACE_STIR + +class DistributedCachingInformation; + +//#ifdef STIR_MPI_CLASS_DEFINITION +//#define PoissonLogLikelihoodWithLinearModelForMeanAndProjData PoissonLogLikelihoodWithLinearModelForMeanAndProjData_MPI +//#endif + + + +/*! + \ingroup GeneralisedObjectiveFunction + \brief An objective function class appropriate for PET emission data + + Measured data is given by a ProjData object, and the linear operations + necessary for computing the gradient of the objective function + are performed via a ProjectorByBinPair object together with + a BinNormalisation object. + + \see PoissonLogLikelihoodWithLinearModelForMean for notation. + + Often, the probability matrix \f$P\f$ can be written as the product + of a diagonal matrix \f$D\f$ and another matrix \f$F\f$ + \f[ P = D G \f] + The measurement model can then be written as + + \f[ P \lambda + r = D ( F \lambda + a ) \f] + + and backprojection is obviously + + \f[ P' y = F' D y \f] + + This can be generalised by using a different matrix \f$B\f$ to perform + the backprojection. + + The expression for the gradient becomes + + \f[ B D \left[ y / \left( D (F \lambda + a) \right) \right] - B D 1 = + B \left[ y / \left(F \lambda + a \right) \right] - B D 1 + \f] + + where \f$D\f$ dropped from the first term. This was probably noticed + for the first time in the context of MLEM by Hebert and Leahy, but + is in fact a feature of the gradient (and indeed log-likelihood). + This was first brought to Kris Thielemans' attention by + Michael Zibulevsky and Arkady Nemirovsky. + + Note that if \f$F\f$ and \f$B\f$ are not exact transposed operations, the + gradient does no longer correspond to the gradient + of a well-defined function. + + In this class, the operation of multiplying with \f$F\f$ is performed + by the forward projector, and with \f$B\f$ by the back projector. + Multiplying with \f$D\f$ corresponds to the BinNormalisation::undo() + function. Finally, the background term \f$a\f$ is stored in + \c additive_proj_data_sptr (note: this is not \f$r\f$). + + \par Parameters for parsing + + \verbatim + PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + + ; emission projection data + input file := + + maximum absolute segment number to process := + zero end planes of segment 0 := + + ; see ProjectorByBinPair hierarchy for possible values + Projector pair type := + + ; reserved value: 0 means none + ; see PoissonLogLikelihoodWithLinearModelForMeanAndProjData + ; class documentation + additive sinogram := + + ; normalisation (and attenuation correction) + ; time info can be used for dead-time correction + + ; see TimeFrameDefinitions + time frame definition filename := + time frame number := + ; see BinNormalisation hierarchy for possible values + Bin Normalisation type := + + End PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters := + \endverbatim +*/ +template +class PoissonLogLikelihoodWithLinearModelForMeanAndProjData: +public RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMean > +{ + private: + typedef RegisteredParsingObject, + GeneralisedObjectiveFunction, + PoissonLogLikelihoodWithLinearModelForMean > + base_type; + +public: + + //! Name which will be used when parsing a GeneralisedObjectiveFunction object + static const char * const registered_name; + + // + /*! \name Variables for STIR_MPI + + Only used when STIR_MPI is enabled. + \todo move to protected area + */ + //@{ + //! points to the information object needed to support distributed caching + DistributedCachingInformation * caching_info_ptr; + //#ifdef STIR_MPI + //!enable/disable key for distributed caching + bool distributed_cache_enabled; + bool distributed_tests_enabled; + bool message_timings_enabled; + double message_timings_threshold; + bool rpc_timings_enabled; + //#endif + //@} + + + //! Default constructor calls set_defaults() + PoissonLogLikelihoodWithLinearModelForMeanAndProjData(); + + //! Destructor + /*! Calls end_distributable_computation() + */ + ~PoissonLogLikelihoodWithLinearModelForMeanAndProjData(); + + //! Returns a pointer to a newly allocated target object (with 0 data). + /*! Dimensions etc are set from the \a proj_data_sptr and other information set by parsing, + such as \c zoom, \c output_image_size_z etc. + */ + virtual TargetT * + construct_target_ptr() const; + + /*! \name Functions to get parameters + \warning Be careful with changing shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + const ProjData& get_proj_data() const; + const shared_ptr& get_proj_data_sptr() const; + const int get_max_segment_num_to_process() const; + const bool get_zero_seg0_end_planes() const; + const ProjData& get_additive_proj_data() const; + const shared_ptr& get_additive_proj_data_sptr() const; + const ProjectorByBinPair& get_projector_pair() const; + const shared_ptr& get_projector_pair_sptr() const; + const int get_time_frame_num() const; + const TimeFrameDefinitions& get_time_frame_definitions() const; + const BinNormalisation& get_normalisation() const; + const shared_ptr& get_normalisation_sptr() const; + //@} + /*! \name Functions to set parameters + This can be used as alternative to the parsing mechanism. + \warning After using any of these, you have to call set_up(). + \warning Be careful with changing shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + + */ + //@{ + int set_num_subsets(const int num_subsets); + void set_proj_data_sptr(const shared_ptr&); + void set_max_segment_num_to_process(const int); + void set_zero_seg0_end_planes(const bool); + void set_additive_proj_data_sptr(const shared_ptr&); + void set_projector_pair_sptr(const shared_ptr&) ; + void set_frame_num(const int); + void set_frame_definitions(const TimeFrameDefinitions&); + void set_normalisation_sptr(const shared_ptr&); + //@} + + virtual void + compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num); + +#if 0 + // currently not used + float sum_projection_data() const; +#endif + virtual void + add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const; + + protected: + virtual Succeeded + set_up_before_sensitivity(shared_ptr const& target_sptr); + + virtual double + actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num); + + /*! + The Hessian (without penalty) is approximatelly given by: + \f[ H_{jk} = - \sum_i P_{ij} h_i^{''}(y_i) P_{ik} \f] + where + \f[ h_i(l) = y_i log (l) - l; h_i^{''}(y_i) ~= -1/y_i; \f] + and \f$P_{ij} \f$ is the probability matrix. + Hence + \f[ H_{jk} = \sum_i P_{ij}(1/y_i) P_{ik} \f] + + In the above, we've used the plug-in approximation by replacing + forward projection of the true image by the measured data. However, the + later are noisy and this can create problems. + + \todo Two work-arounds for the noisy estimate of the Hessian are listed below, + but they are currently not implemented. + + One could smooth the data before performing the quotient. This should be done + after normalisation to avoid problems with the high-frequency components in + the normalisation factors: + \f[ H_{jk} = \sum_i G_{ij}{1 \over n_i \mathrm{smooth}( n_i y_i)} G_{ik} \f] + where the probability matrix is factorised in a detection efficiency part (i.e. the + normalisation factors \f$n_i\f$) times a geometric part: + \f[ P_{ij} = {1 \over n_i } G_{ij}\f] + + It has also been suggested to use \f$1 \over y_i+1 \f$ (at least if the data are still Poisson. + */ + virtual Succeeded + actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const; + +protected: + //! Filename with input projection data + string input_filename; + + //! points to the object for the total input projection data + shared_ptr proj_data_sptr; + + //! the maximum absolute ring difference number to use in the reconstruction + /*! convention: if -1, use get_max_segment_num()*/ + int max_segment_num_to_process; + + /**********************/ + // image stuff + // TODO to be replaced with single class or so (TargetT obviously) + //! the output image size in x and y direction + /*! convention: if -1, use a size such that the whole FOV is covered + */ + int output_image_size_xy; // KT 10122001 appended _xy + + //! the output image size in z direction + /*! convention: if -1, use default as provided by VoxelsOnCartesianGrid constructor + */ + int output_image_size_z; // KT 10122001 new + + //! the zoom factor + double zoom; + + //! offset in the x-direction + double Xoffset; + + //! offset in the y-direction + double Yoffset; + + // KT 20/06/2001 new + //! offset in the z-direction + double Zoffset; + /********************************/ + + + //! Stores the projectors that are used for the computations + shared_ptr projector_pair_ptr; + + //! signals whether to zero the data in the end planes of the projection data + bool zero_seg0_end_planes; + + //! name of file in which additive projection data are stored + string additive_projection_data_filename; + //! points to the additive projection data + /*! the projection data in this file is bin-wise added to forward projection results*/ + shared_ptr additive_proj_data_sptr; + + // TODO doc + int frame_num; + string frame_definition_filename; + TimeFrameDefinitions frame_defs; + shared_ptr normalisation_sptr; + + +//Loglikelihood computation parameters + // TODO rename and move higher up in the hierarchy + //! subiteration interval at which the loglikelihood function is evaluated + int loglikelihood_computation_interval; + + //! indicates whether to evaluate the loglikelihood function for all bins or the current subset + bool compute_total_loglikelihood; + + //! name of file in which loglikelihood measurements are stored + string loglikelihood_data_filename; + + //! sets any default values + /*! Has to be called by set_defaults in the leaf-class */ + virtual void set_defaults(); + //! sets keys for parsing + /*! Has to be called by initialise_keymap in the leaf-class */ + virtual void initialise_keymap(); + //! checks values after parsing + /*! Has to be called by post_processing in the leaf-class */ + virtual bool post_processing(); + + //! Checks of the current subset scheme is approximately balanced + /*! For this class, this means that the sub-sensitivities are + approximately the same. The test simply looks at the number + of views etc. It ignores unbalancing caused by normalisation_sptr + (e.g. for instance when using asymmetric attenuation). + */ + bool actual_subsets_are_approximately_balanced(string& warning_message) const; + private: + shared_ptr symmetries_sptr; + + void + add_view_seg_to_sensitivity(TargetT& sensitivity, const ViewSegmentNumbers& view_seg_nums) const; +}; + +#ifdef STIR_MPI +//made available to be called from DistributedWorker object +RPC_process_related_viewgrams_type RPC_process_related_viewgrams_gradient; +RPC_process_related_viewgrams_type RPC_process_related_viewgrams_accumulate_loglikelihood; +#endif + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/PriorWithParabolicSurrogate.h b/src/include/stir/recon_buildblock/PriorWithParabolicSurrogate.h new file mode 100644 index 0000000000..8786db6c3f --- /dev/null +++ b/src/include/stir/recon_buildblock/PriorWithParabolicSurrogate.h @@ -0,0 +1,78 @@ +// +// +/*! + \file + \ingroup priors + \brief Declaration of class stir::PriorWithParabolicSurrogate + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#ifndef __stir_recon_buildblock_PriorWithParabolicSurrogate_H__ +#define __stir_recon_buildblock_PriorWithParabolicSurrogate_H__ + +#include "stir/recon_buildblock/GeneralisedPrior.h" +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR + +/*! + \ingroup priors + \brief + this class implements priors with a parabolic surrogate curvature + + See for example Erdogan and Fessler, Ordered subsets algorithms for + transmission tomography, PMB, 44 (1999) 2835. + +*/ +template +class PriorWithParabolicSurrogate: + public GeneralisedPrior +{ +public: + + //!this should calculate the parabolic surrogate curvature + virtual void + parabolic_surrogate_curvature(TargetT& parabolic_surrogate_curvature, + const TargetT ¤t_estimate) = 0; + + //! A function that allows skipping some computations if the curvature is independent of the \c current_estimate + /*! Defaults to return \c true, but can be overloaded by the derived class. + */ + virtual bool + parabolic_surrogate_curvature_depends_on_argument() const + { return true; } +#if 0 + // TODO this does not work for arbitrary TargetT, but only 3-dimensional things + // maybe we could have a TargetT::index_type or so + virtual void + compute_Hessian(TargetT& prior_Hessian_for_single_densel, + const BasicCoordinate<3,int>& coords, + const TargetT ¤t_estimate) =0; +#endif + +}; + + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/ProjDataRebinning.h b/src/include/stir/recon_buildblock/ProjDataRebinning.h new file mode 100644 index 0000000000..a70f0ae014 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjDataRebinning.h @@ -0,0 +1,174 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details. +*/ +#ifndef __stir_recon_buildblock_ProjDataRebinning_H__ +#define __stir_recon_buildblock_ProjDataRebinning_H__ +/*! + \file + \ingroup recon_buildblock + + \brief declares the stir::ProjDataRebinning class + + \author Kris Thielemans + +*/ +/* Modification history +*/ + + +#include "stir/RegisteredObject.h" +#include "stir/TimedObject.h" +#include "stir/ParsingObject.h" +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +#include + + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + + +START_NAMESPACE_STIR + + +class Succeeded; + +/*! + \brief base class for all rebinning algorithms for 3D PET data + \ingroup recon_buildblock + + TODO describe what rebinning is and why you need it + + \par Usage + + The utility rebin_projdata provides the user interface to this class. + What follows is for developers. + + Parameters need to be initialised somehow. This is usually done using the + parse() member functions (see ParsingObject). + For some parameters, set_some_parameter() + methods are provided. + + Normal usage is for example as follows + \code + shared_ptr rebinning_sptr; + // set parameters somehow + if (rebinning_sptr->set_up()!= Succeeded::yes) + error("Disaster. Presumably data are inconsistent") + if (rebinning_sptr->rebin()!= Succeeded::yes) + error("Disaster. Presumably run-time error or so"); + \endcode + + \par Info for developers + + For convenience, the class is derived from TimedObject. It is the + responsibility of the derived class to run these timers though. + + \todo there should be a method to rebin the data without writing the result to disk +*/ + + +class ProjDataRebinning : + public TimedObject, public ParsingObject , + public RegisteredObject +{ +public: + //! virtual destructor + virtual ~ProjDataRebinning(); + + //! gives method information + virtual string method_info() const = 0; + + //! executes the rebinning + /*! + At the end of the rebinning, the final 2D projection data are saved to file as given in + output_filename_prefix. + \return Succeeded::yes if everything was alright. + */ + virtual Succeeded + rebin()=0; + + /*! \name get/set the number of segments to process + + \see max_segment_num_to_process + */ + //@{ + void set_max_segment_num_to_process(int ns); + int get_max_segment_num_to_process() const; + //@} + /*! get/set file name for output projdata (should be without extension) + */ + //@{ + void set_output_filename_prefix(const string& s); + string get_output_filename_prefix() const; + //@} + + //! set projection data that will be rebinned + /*! Usually this will be set via a call to parse() */ + void set_input_proj_data_sptr(const shared_ptr&); + // KTTODO I'm not enthousiastic about the next function + // why would you need this? + shared_ptr get_proj_data_sptr(); + + // TODO needed at all? + // KTTODO: yes, and change parameters + //! operations prior to the rebinning + virtual Succeeded set_up(); + + // parameters + protected: + + //! file name for output projdata (should be without extension) + string output_filename_prefix; + //! file name for input projdata + string input_filename; + //! the maximum absolute segment number to use in the reconstruction + /*! convention: if -1, use get_max_segment_num()*/ + int max_segment_num_to_process; + +protected: +#if 0 + /*! + \brief + This function initialises all parameters, either via parsing, + or by calling ask_parameters() (when parameter_filename is the empty string). + + It should be called in the constructor of the last class in the + hierarchy. At that time, all Interfile keys will have been + initialised, and ask_parameters() will be the appropriate virtual + function, such that questions are asked for all parameters. + */ + void initialise(const string& parameter_filename); +#endif + + //! used to check acceptable parameter ranges, etc... + virtual bool post_processing(); + virtual void set_defaults(); + virtual void initialise_keymap(); + + protected: // members + + shared_ptr proj_data_sptr; +}; + +END_NAMESPACE_STIR + + +#endif + diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBin.h b/src/include/stir/recon_buildblock/ProjMatrixByBin.h new file mode 100644 index 0000000000..a1840f000d --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixByBin.h @@ -0,0 +1,240 @@ +#ifndef __stir_recon_buildblock_ProjMatrixByBin_H__ +#define __stir_recon_buildblock_ProjMatrixByBin_H__ + +/*! + + \file + \ingroup projection + \brief declaration of stir::ProjMatrixByBin and its helpers classes + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/RegisteredObject.h" +#include "stir/ParsingObject.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/recon_buildblock/DataSymmetriesForBins.h" +#include "stir/shared_ptr.h" +#include "stir/TimedObject.h" +#include +//#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::map; +#endif + +// define a local preprocessor symbol to keep code relatively clean +#ifdef STIR_NO_MUTABLE +#define STIR_MUTABLE_CONST +#else +#define STIR_MUTABLE_CONST const +#endif + +START_NAMESPACE_STIR + +/* TODO +class ProjMatrixElemsForOneViewgram; +class SubsetInfo; +*/ + +class Bin; + +/*! +\ingroup projection +\brief + This is the (abstract) base class for all projection matrices + which are organised by 'bin'. + + This class provides essentially only 2 public members: a method to get a + 'row' of the matrix, and a method to get information on the symmetries. + + Currently, the class provides for some (basic) caching. + This functionality will probably be moved to a new class + ProjMatrixByBinWithCache. (TODO) + + \par Parsing parameters + + The following parameters can be set (default values are indicated): + \verbatim + disable caching := false + store only basic bins in cache := true + \endverbatim + The 2nd option allows to cache the whole matrix. This results in the fastest + behaviour IF your system does not start swapping. The default choice caches + only the 'basic' bins, and computes symmetry related bins from the 'basic' ones. +*/ +class ProjMatrixByBin : + public RegisteredObject, + public ParsingObject, + public TimedObject +{ +public: + + virtual ~ProjMatrixByBin() {} + + //! To be called before any calculation is performed + /*! Note that get_proj_matrix_elems_for_one_bin() will expect objects of + compatible sizes and other info. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ) = 0; + + //! get a pointer to an object encoding all symmetries that are used by this ProjMatrixByBin + inline const DataSymmetriesForBins* get_symmetries_ptr() const; + + + //! The main method for getting a row of the matrix. + /*! + The ProjMatrixElemsForOneBin argument will be overwritten + (i.e. data is NOT appended). + + The implementation is inline as it just gets it in + terms of the cached_proj_matrix_elems_for_one_bin or + calculate_proj_matrix_elems_for_one_bin.*/ + inline void + get_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin&, + const Bin&) STIR_MUTABLE_CONST; + +#if 0 + // TODO + /*! \brief Facility to write the 'independent' part of the matrix to file. + + This is useful for versions for which computation is very slow. + \warning Format has to be compatible with ProjMatrixByBinFromFile + */ + virtual void write_to_file_by_bin( + const char * const file_name_without_extension) const; +#endif + // TODO implement this one at some point ? + /* + virtual void write_to_file_by_voxel( + const char * const file_name_without_extension); + */ + + //void set_maximum_cache_size(const unsigned long size){;} + /* TODO + void set_subset_usage(const SubsetInfo&, const int num_access_times); + */ + void enable_cache(const bool v = true); + void store_only_basic_bins_in_cache(const bool v = true) ; + + bool is_cache_enabled() const; + bool does_cache_store_only_basic_bins() const; + + // void reserve_num_elements_in_cache(const std::size_t); + //! Remove all elements from the cache + void clear_cache() STIR_MUTABLE_CONST; + + +protected: + shared_ptr symmetries_ptr; + + //! default ctor (calls set_defaults()) + /*! Note that due to the C++ definition (and some good reasons), + ProjMatrixByBin::set_defaults() is called, + even though this is a virtual function. + */ + ProjMatrixByBin(); + + /*! \brief This method needs to be implemented in the derived class. + + bin-coordinates are obtained via the ProjMatrixElemsForOneBin::get_bin() method. + + Note that 'calculate' could just as well mean 'get from file' + */ + virtual void + calculate_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& + ) const = 0; + + /////////////////////////////// parsing stuff ////////////////////// + + //! sets value for caching configuration (enables caching, but for 'basic' bins only) + /*! Has to be called by set_defaults in the leaf-class */ + virtual void set_defaults(); + //! sets keys for caching configuration + /*! Has to be called by initialise_keymap in the leaf-class */ + virtual void initialise_keymap(); + //! Checks if parameters have sensible values + /*! Has to be called by post_processing in the leaf-class */ + virtual bool post_processing(); + + /////////////////////////////// caching stuff ////////////////////// + + bool cache_disabled; + bool cache_stores_only_basic_bins; + + /*! \brief The method that tries to get data from the cache. + + If it succeeds, it overwrites the ProjMatrixElemsForOneBin parameter and + returns Succeeded::yes, otherwise it does not touch the ProjMatrixElemsForOneBin + and returns Succeeded::false. + */ + Succeeded get_cached_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& + ) const; + + //! The method to store data in the cache. + inline void cache_proj_matrix_elems_for_one_bin( const ProjMatrixElemsForOneBin&) + STIR_MUTABLE_CONST; + +private: + + //KTBMCHANGE typedef unsigned int CacheKey; + typedef boost::uint64_t CacheKey; + + // typedef std::map MapProjMatrixElemsForOneBin; + typedef boost::unordered_map MapProjMatrixElemsForOneBin; + typedef MapProjMatrixElemsForOneBin::iterator MapProjMatrixElemsForOneBinIterator; + typedef MapProjMatrixElemsForOneBin::const_iterator const_MapProjMatrixElemsForOneBinIterator; + + //! collection of ProjMatrixElemsForOneBin (internal cache ) +#ifndef STIR_NO_MUTABLE + mutable +#endif + MapProjMatrixElemsForOneBin cache_collection; + + //! create the key for caching + // KT 15/05/2002 not static anymore as it uses cache_stores_only_basic_bins + inline CacheKey cache_key(const Bin& bin) const; + + +}; + + + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/ProjMatrixByBin.inl" + +#undef STIR_MUTABLE_CONST + +#endif // __ProjMatrixByBin_H__ + + + diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBin.inl b/src/include/stir/recon_buildblock/ProjMatrixByBin.inl new file mode 100644 index 0000000000..91447507e9 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixByBin.inl @@ -0,0 +1,198 @@ +// +// +/*! + + \file + \ingroup projection + + \brief Implementations of inline functions for class stir::ProjMatrixByBin + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/Succeeded.h" +#include "stir/recon_buildblock/SymmetryOperation.h" + +START_NAMESPACE_STIR + +const DataSymmetriesForBins* +ProjMatrixByBin:: get_symmetries_ptr() const +{ + return symmetries_ptr.get(); +} + +#if 0 + \warning Preconditions when cache_stores_only_basic_bins==true +
        • all coordinates non-negative +
        • segment_num coded in 8 bits +
        • view coded in 9 bits +
        • axial_pos_num in 6 bits +
        • tangential_pos_num in 9 bits +
        + Preconditions when cache_stores_only_basic_bins==false +#endif +/*! + \warning Preconditions +
        • abs(segment_num) coded in 7 bits +
        • view non-negative and coded in 9 bits +
        • axial_pos_num non-negative and in 6 bits +
        • abs(tangential_pos_num) in 8 bits + */ +ProjMatrixByBin::CacheKey +ProjMatrixByBin::cache_key(const Bin& bin) const +{ +#if 0 + // this was an attempt to allow more bits for certain numbers by relying on + // the fact that segment_num and tangetnail_pos_num was always positive. + // However, this depends on which symmetries you are using. + if (cache_stores_only_basic_bins) + { + assert(bin.segment_num()>=0); + assert(bin.segment_num() < (1<<8)); + assert(bin.view_num() >= 0); + assert(bin.view_num() < (1<<9)); + assert(bin.axial_pos_num() >= 0); + assert(bin.axial_pos_num() < (1<<6)); + assert(bin.tangential_pos_num() >= 0); + assert(bin.tangential_pos_num() < (1<<9)); + return (CacheKey)( + (static_cast(bin.axial_pos_num())<<26) + | (static_cast(bin.view_num()) << 17) + | (static_cast(bin.segment_num())) << 9) + | static_cast(bin.tangential_pos_num() ); + } + else +#endif +{ + //KTBMCHANGE allow more entries by going to 64-bit +#if 0 + assert(abs(bin.segment_num()) < (1<<7)); + assert(bin.view_num() >= 0); + assert(bin.view_num() < (1<<9)); + assert(bin.axial_pos_num() >= 0); + assert(bin.axial_pos_num() < (1<<6)); + assert(abs(bin.tangential_pos_num()) < (1<<8)); + return (CacheKey)( + (static_cast(bin.axial_pos_num())<<26) + | (static_cast(bin.view_num()) << 17) + | (static_cast(bin.segment_num()>=0?0:1) << 16) + | (static_cast(abs(bin.segment_num())) << 9) + | (static_cast(bin.tangential_pos_num()>=0?0:1) << 8) + | static_cast(abs(bin.tangential_pos_num())) ); + } +#else + assert(abs(bin.segment_num()) < (1<<7)); + assert(bin.view_num() >= 0); + assert(bin.view_num() < (1<<9)); + assert(bin.axial_pos_num() >= 0); + assert(static_cast(bin.axial_pos_num()) < (static_cast(1)<<38)); + assert(abs(bin.tangential_pos_num()) < (1<<8)); + return (CacheKey)( + (static_cast(bin.axial_pos_num())<<26) + | (static_cast(bin.view_num()) << 17) + | (static_cast(bin.segment_num()>=0?0:1) << 16) + | (static_cast(abs(bin.segment_num())) << 9) + | (static_cast(bin.tangential_pos_num()>=0?0:1) << 8) + | static_cast(abs(bin.tangential_pos_num())) ); + } +#endif + } + +void +ProjMatrixByBin:: +cache_proj_matrix_elems_for_one_bin( + const ProjMatrixElemsForOneBin& probabilities) STIR_MUTABLE_CONST +{ + if ( cache_disabled ) return; + + //std::cerr << "cached lor size " << probabilities.size() << " capacity " << probabilities.capacity() << std::endl; + // insert probabilities into the collection + cache_collection.insert(MapProjMatrixElemsForOneBin::value_type( cache_key(probabilities.get_bin()), + probabilities)); +} + +inline void +ProjMatrixByBin:: +get_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& probabilities, + const Bin& bin) STIR_MUTABLE_CONST +{ + // start_timers(); TODO, can't do this in a const member + + // set to empty + probabilities.erase(); + + if (cache_stores_only_basic_bins) + { + // find basic bin + Bin basic_bin = bin; + auto_ptr symm_ptr = + symmetries_ptr->find_symmetry_operation_from_basic_bin(basic_bin); + + probabilities.set_bin(basic_bin); + // check if basic bin is in cache + if (get_cached_proj_matrix_elems_for_one_bin(probabilities) == + Succeeded::no) + { + // call 'calculate' just for the basic bin + calculate_proj_matrix_elems_for_one_bin(probabilities); +#ifndef NDEBUG + probabilities.check_state(); +#endif + cache_proj_matrix_elems_for_one_bin(probabilities); + } + + // now transform to original bin + symm_ptr->transform_proj_matrix_elems_for_one_bin(probabilities); + } + else // !cache_stores_only_basic_bins + { + probabilities.set_bin(bin); + // check if in cache + if (get_cached_proj_matrix_elems_for_one_bin(probabilities) == + Succeeded::no) + { + // find basic bin + Bin basic_bin = bin; + auto_ptr symm_ptr = + symmetries_ptr->find_symmetry_operation_from_basic_bin(basic_bin); + + probabilities.set_bin(basic_bin); + // check if basic bin is in cache + if (get_cached_proj_matrix_elems_for_one_bin(probabilities) == + Succeeded::no) + { + // call 'calculate' just for the basic bin + calculate_proj_matrix_elems_for_one_bin(probabilities); +#ifndef NDEBUG + probabilities.check_state(); +#endif + cache_proj_matrix_elems_for_one_bin(probabilities); + } + symm_ptr->transform_proj_matrix_elems_for_one_bin(probabilities); + cache_proj_matrix_elems_for_one_bin(probabilities); + } + } + // stop_timers(); TODO, can't do this in a const member +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBinFromFile.h b/src/include/stir/recon_buildblock/ProjMatrixByBinFromFile.h new file mode 100644 index 0000000000..9427bf9470 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixByBinFromFile.h @@ -0,0 +1,153 @@ +// +// +/* + Copyright (C) 2004- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projection + + \brief stir::ProjMatrixByBinFromFile's definition + + \author Kris Thielemans + +*/ +#ifndef __stir_recon_buildblock_ProjMatrixByBinFromFile__ +#define __stir_recon_buildblock_ProjMatrixByBinFromFile__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/ProjDataInfo.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/IndexRange.h" +#include "stir/shared_ptr.h" +#include + + + +START_NAMESPACE_STIR + +template class DiscretisedDensity; +class Bin; +/*! + \ingroup projection + \brief Reads/writes a projection matrix from/to file + + The only supported file format consists of an Interfile-type header + and a binary file which stores the 'basic' elements in a sparse form, + i.e. only the elements that cannot by constructed via symmetries. + + \todo this class currently only works with VoxelsOnCartesianGrid. + To fix this, we would need a DiscretisedDensityInfo class, and be able + to have constructed the appropriate symmetries object by parsing the + .par file + + \par Example .par file + \verbatim + ProjMatrixByBinFromFile Parameters:= + Version := 1.0 + symmetries type := PET_CartesianGrid + PET_CartesianGrid symmetries parameters:= + do_symmetry_90degrees_min_phi:= + do_symmetry_180degrees_min_phi:= + do_symmetry_swap_segment:= + do_symmetry_swap_s:= + do_symmetry_shift_z:= + End PET_CartesianGrid symmetries parameters:= + ; example projection data of the same dimensions as used when constructing the matrix + template proj data filename:= + ; example image of the same dimensions as used when constructing the matrix + template density filename:= + ; binary data with projection matrix elements + data_filename:= + End ProjMatrixByBinFromFile Parameters:= + \endverbatim +*/ + +class ProjMatrixByBinFromFile : + public RegisteredParsingObject< + ProjMatrixByBinFromFile, + ProjMatrixByBin, + ProjMatrixByBin + > +{ +public : + //! Name which will be used when parsing a ProjMatrixByBin object + static const char * const registered_name; + + //! Writes a projection matrix to file in a format such that this class can read it back + /*! Currently this will write an interfile-type header, a file with the binary data, + a template image and template sinogram. You will need all 4 to be able to read the + matrix back in. + */ +static Succeeded + write_to_file(const string& output_filename_prefix, + const ProjMatrixByBin& proj_matrix, + const shared_ptr& proj_data_info_sptr, + const DiscretisedDensity<3,float>& template_density); + + //! Default constructor (calls set_defaults()) + ProjMatrixByBinFromFile(); + + //! Checks all necessary geometric info + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + +private: + + string parsed_version; + string template_density_filename; + string template_proj_data_filename; + string data_filename; + + string symmetries_type; + // should be in symmetries + bool do_symmetry_90degrees_min_phi; + bool do_symmetry_180degrees_min_phi; + bool do_symmetry_swap_segment; + bool do_symmetry_swap_s; + bool do_symmetry_shift_z; + + // TODO this only works as long as we only have VoxelsOnCartesianGrid + // explicitly list necessary members for image details (should use an Info object instead) + CartesianCoordinate3D voxel_size; + CartesianCoordinate3D origin; + IndexRange<3> densel_range; + + + shared_ptr proj_data_info_ptr; + + + virtual void + calculate_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin&) const; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + Succeeded read_data(); + +}; + +END_NAMESPACE_STIR + +#endif + + + diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBinSPECTUB.h b/src/include/stir/recon_buildblock/ProjMatrixByBinSPECTUB.h new file mode 100644 index 0000000000..f906cc038e --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixByBinSPECTUB.h @@ -0,0 +1,177 @@ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projection + + \brief stir::ProjMatrixByBinSPECTUB's definition + + \author Berta Marti Fuster + \author Kris Thielemans +*/ +#ifndef __stir_recon_buildblock_ProjMatrixByBinSPECTUB__ +#define __stir_recon_buildblock_ProjMatrixByBinSPECTUB__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/ProjDataInfo.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/IndexRange.h" +#include "stir/shared_ptr.h" +#include + + +#include "stir/recon_buildblock/SPECTUB_Tools.h" + +START_NAMESPACE_STIR + +template class DiscretisedDensity; +class Bin; +/*! + \ingroup projection + \brief generates projection matrix for SPECT studies + + This functionality is described in + Berta Marti Fuster, Carles Falcon, Charalampos Tsoumpas, Lefteris Livieratos, Pablo Aguiar, Albert Cot, Domenec Ros and Kris Thielemans, + Integration of advanced 3D SPECT modeling into the open-source STIR framework, + Med. Phys. 40, 092502 (2013); http://dx.doi.org/10.1118/1.4816676 + + \warning this class currently only works with VoxelsOnCartesianGrid. + + \par Sample parameter file + +\verbatim + Projection Matrix By Bin SPECT UB Parameters:= + ; width of PSF + maximum number of sigmas:= 2.0 + + ;PSF type of correction { 2D // 3D // Geometrical } + psf type:= 2D + ; next 2 parameters define the PSF. They are ignored if psf_type is "Geometrical" + ; the PSF is modelled as a Gaussian with sigma dependent on the distance from the collimator + ; sigma_at_depth = collimator_slope * depth_in_cm + collimator sigma 0(cm) + collimator slope := 0.0163 + collimator sigma 0(cm) := 0.1466 + + ;Attenuation correction { Simple // Full // No } + attenuation type := Simple + ;Values in attenuation map in cm-1 + attenuation map := attMapRec.hv + + ;Mask properties { Cylinder // Attenuation Map // Explicit Mask // No} + mask type := Explicit Mask + mask file := mask.hv + + ; if next variable is set to 0, only a single view is kept in memory + keep all views in cache:=1 + +End Projection Matrix By Bin SPECT UB Parameters:= +\endverbatim +*/ + +class ProjMatrixByBinSPECTUB : + public RegisteredParsingObject< + ProjMatrixByBinSPECTUB, + ProjMatrixByBin, + ProjMatrixByBin + > +{ + public : + //! Name which will be used when parsing a ProjMatrixByBin object + static const char * const registered_name; + + //! Default constructor (calls set_defaults()) + ProjMatrixByBinSPECTUB(); + + //! Destructor (deallocates UB SPECT memory) + ~ProjMatrixByBinSPECTUB(); + + //! Checks all necessary geometric info + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + + private: + + // parameters that will be parsed + + float minimum_weight; + float maximum_number_of_sigmas; + float spatial_resolution_PSF; + string psf_type; + float collimator_sigma_0; + float collimator_slope; + string attenuation_type; + string attenuation_map; + string mask_type; + string mask_file; + bool keep_all_views_in_cache; //!< if set to false, only a single view is kept in memory + + // explicitly list necessary members for image details (should use an Info object instead) + CartesianCoordinate3D voxel_size; + CartesianCoordinate3D origin; + IndexRange<3> densel_range; + + shared_ptr proj_data_info_ptr; + + bool already_setup; + + + virtual void + calculate_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin&) const; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + // wm_SPECT starts here --------------------------------------------------------------------------------------------- + bool *msk_3d; //!< voxels to be included in matrix (no weight calculated outside the mask) + bool *msk_2d; //!< 2d collapse of msk_3d. + + //... variables for estimated sizes of arrays to allocate ................................ + int **NITEMS; //!< number of non-zero elements for each weight matrix row + + //... user defined structures (types defined in SPECTUB_Tools.h) ..................................... + + SPECTUB::volume_type vol; //!< structure with volume (image) information + SPECTUB::proj_type prj; //!< structure with projection information + + SPECTUB::voxel_type vox; //!< structure with voxel information + SPECTUB::bin_type bin; //!< structure with bin information + + SPECTUB::angle_type * ang; //!< structure with angle indices, values, ratios and voxel projections + float *attmap; //!< attenuation map (copied as float array) + + SPECTUB::discrf_type gaussdens; //!< structure with gaussian density function + + int maxszb; + + + void compute_one_subset(const int kOS) const; + void delete_UB_SPECT_arrays(); + mutable std::vector subset_already_processed; +}; + +END_NAMESPACE_STIR + +#endif + + + diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBinUsingInterpolation.h b/src/include/stir/recon_buildblock/ProjMatrixByBinUsingInterpolation.h new file mode 100644 index 0000000000..62a9da20a3 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixByBinUsingInterpolation.h @@ -0,0 +1,183 @@ +// +// +/* + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projection + + \brief stir::ProjMatrixByBinUsingInterpolation's definition + + \author Kris Thielemans + +*/ +#ifndef __stir_recon_buildblock_ProjMatrixByBinUsingInterpolation__ +#define __stir_recon_buildblock_ProjMatrixByBinUsingInterpolation__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/shared_ptr.h" + + + +START_NAMESPACE_STIR + +template class DiscretisedDensity; +class Bin; +/*! + \ingroup projection + \brief Computes projection matrix elements for VoxelsOnCartesianGrid images + by using an interpolation model. + + This class implements a projection model that interpolates in projection space. + When used for back-projection, it should give the same results as + BackProjectorByByUsingInterpolation, but is probably much slower. + + The current implementation uses some quite generic code to handle symmetries, but + is very very slow to compute the elements. Once they are cached, performance is + as usual of course. + + \warning Preliminary code, not tested to usual STIR standards. +*/ + +class ProjMatrixByBinUsingInterpolation : + public RegisteredParsingObject< + ProjMatrixByBinUsingInterpolation, + ProjMatrixByBin, + ProjMatrixByBin + > +{ +public : + //! Name which will be used when parsing a ProjMatrixByBin object + static const char * const registered_name; + + //! Default constructor (calls set_defaults()) + ProjMatrixByBinUsingInterpolation(); + + //! Stores all necessary geometric info + /*! Note that the density_info_ptr is not stored in this object. It's only used to get some info on sizes etc. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + +private: + bool do_symmetry_90degrees_min_phi; + bool do_symmetry_180degrees_min_phi; + bool do_symmetry_swap_segment; + bool do_symmetry_swap_s; + bool do_symmetry_shift_z; + + // explicitly list necessary members for image details (should use an Info object instead) + CartesianCoordinate3D voxel_size; + CartesianCoordinate3D origin; + IndexRange<3> densel_range; + + + shared_ptr proj_data_info_ptr; + + // for Jacobian + const ProjDataInfoCylindrical& + proj_data_info_cyl() const + { return static_cast(*proj_data_info_ptr); } +/*! + \brief + The next class is used + to take geometric things + into account. It also includes some normalisation. (internal use only). + + \internal + + Use as follows: + TODO incorrect (also in original) + \code + const JacobianForIntBP jacobian(*(segment.scanner)); + jacobian(segment.get_average_delta(), s+ 0.5); + \endcode + */ + + +class JacobianForIntBP +{ +private: + // store some scanner related data to avoid recomputation + float R2; + float ring_spacing2; + bool arccor; + // total normalisation of backprojection, 3 factors: + // (_Pi/scanner.num_views) for discretisation of integral over phi + // scanner.ring_spacing for discretisation of integral over delta + // normalisation of projection space integral: 1/(2 Pi) + + float backprojection_normalisation; + + bool use_exact_Jacobian_now; + +public: + // default constructor needed as now member of projector class (better to make set_up) + JacobianForIntBP() {} + explicit JacobianForIntBP(const ProjDataInfoCylindrical* proj_data_info_ptr, bool exact); + // s in mm here! + float operator()(const float delta, const float s) const + { + float tmp; + if (use_exact_Jacobian_now) + tmp = 4*(R2 - s*s); + else + tmp = 4*R2; + if (!arccor) + tmp *= sqrt(tmp); + return + (arccor ? tmp : pow(tmp,1.5F)) / + pow(tmp + ring_spacing2*delta*delta, 1.5F)* backprojection_normalisation; + } +}; + + + JacobianForIntBP jacobian; + bool use_piecewise_linear_interpolation_now; + bool use_exact_Jacobian_now; + + virtual void + calculate_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin&) const; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + + float + get_element(const Bin& bin, + const CartesianCoordinate3D& densel_ctr) const; + private: + void + find_tang_ax_pos_diff(float& tang_pos_diff, + float& ax_pos_diff, + const Bin& bin, + const CartesianCoordinate3D& point) const; + +}; + +END_NAMESPACE_STIR + +#endif + + + diff --git a/src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h b/src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h new file mode 100644 index 0000000000..dface8d895 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h @@ -0,0 +1,220 @@ +/*! + \file + \ingroup projection + + \brief stir::ProjMatrixByBinUsingRayTracing's definition + + \author Kris Thielemans + \author Mustapha Sadki + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __ProjMatrixByBinUsingRayTracing__ +#define __ProjMatrixByBinUsingRayTracing__ + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/shared_ptr.h" + + + +START_NAMESPACE_STIR + +template class DiscretisedDensity; +class ProjDataInfo; + +/*! + \ingroup projection + \brief Computes projection matrix elements for VoxelsOnCartesianGrid images + by using a Length of Intersection (LOI) model. + + Currently, the LOIs are divided by voxel_size.x(), unless NEWSCALE is + #defined during compilation time of ProjMatrixByBinUsingRayTracing.cxx. + + It is possible to use multiple LORs in tangential direction. The result + will then be the average of the various contributions. Currently all these + LORs are parallel. For a very high number of LORs, the result approximates + a strip integral (in tangential direction). + + If the z voxel size is exactly twice the sampling in axial direction, + 2 or 3 LORs are used, to avoid missing voxels. (TODOdoc describe how). + + If use_actual_detector_boundaries is set (currently only possible + for non-arccorrected data, without mashing and/or axial compression), + the detectors are assumed to be on a cylinder. If only a single LOR + in tangential direction is used for ray tracing, + the centre of those detectors is used, which is slightly different from + the 'usual' LOR (due to interleaving of the sinogram). When multiple + LORs are used, the actual detector sizes are used, such that the resulting + strip is twice as wide. + + It is possible to use a cylindrical or cuboid FOV (in the latter case it + is going to be square in transaxial direction). In both cases, the FOV is + slightly 'inside' the image (i.e. it is about 1 voxel at each side + smaller than the maximum possible). + + \par Symmetries + + For the azimuthal angle phi, the following angles are symmetry related for a square grid: + {phi, 180-phi, 90-phi, 90+phi}. + The boolean parameters "do symmetry 90degrees min phi", "do symmetry 180degrees min phi" + allow to select if all 4 angles should be considered as related. + + Enabling more symmetries (from DataSymmetriesForBins_PET_CartesianGrid) means that less memory is + needed to store the matrix (when caching), less time to compute it, but using the matrix might be + slightly slower. By default, as many symmetries as possible are enabled. + + \par Parsing parameters + + The following parameters can be set (default values are indicated): + \verbatim + Ray Tracing Matrix Parameters := + ; any parameters appropriate for class ProjMatrixByBin + restrict to cylindrical FOV := 1 + number of rays in tangential direction to trace for each bin := 1 + use actual detector boundaries := 0 + do symmetry 90degrees min phi := 1 + do symmetry 180degrees min phi := 1 + do_symmetry_swap_segment := 1 + do_symmetry_swap_s := 1 + do_symmetry_shift_z := 1 + End Ray Tracing Matrix Parameters := + \endverbatim + + \par Implementation details + + The implementation uses RayTraceVoxelsOnCartesianGrid(). + + \warning After calling any of the \c set functions or parsing, you have to call setup(), otherwise + using the matrix will result in a call to error(). + + \warning Only appropriate for VoxelsOnCartesianGrid type of images + (otherwise error() will be called). + + \warning Care should be taken to select the number of rays in tangential direction + such that the sampling is at least as small as the x,y voxel sizes. + \warning Current implementation assumes that z voxel size is either + smaller than or exactly twice the sampling in axial direction of the segments. + + \bug Currently, strange things happen if the z voxel size is not exactly equal to half + the ring spacing of the scanner. +*/ + +class ProjMatrixByBinUsingRayTracing : + public RegisteredParsingObject< + ProjMatrixByBinUsingRayTracing, + ProjMatrixByBin, + ProjMatrixByBin + > +{ +public : + //! Name which will be used when parsing a ProjMatrixByBin object + static const char * const registered_name; + + //! Default constructor (calls set_defaults()) + ProjMatrixByBinUsingRayTracing(); + + //! Stores all necessary geometric info + /*! Note that the density_info_ptr is not stored in this object. It's only used to get some info on sizes etc. + */ + virtual void set_up( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& density_info_ptr // TODO should be Info only + ); + + //! \name If a cylindrical FOV or the whole image will be handled + //!@{ + bool get_restrict_to_cylindrical_FOV() const; + void set_restrict_to_cylindrical_FOV(bool); + //!@} + //! \name How many rays will be traced in tangential direction for one bin + //!@{ + int get_num_tangential_LORs() const; + void set_num_tangential_LORs(int); + //!@} + + //! \name If interleaved sinogram coordinates are used or not. + //!@{ + bool get_use_actual_detector_boundaries() const; + void set_use_actual_detector_boundaries(bool); + //@} + + //! \name Which symmetries will be used + //!@{ + bool get_do_symmetry_90degrees_min_phi() const; + void set_do_symmetry_90degrees_min_phi(bool); + + bool get_do_symmetry_180degrees_min_phi() const; + void set_do_symmetry_180degrees_min_phi(bool); + + bool get_do_symmetry_swap_segment() const; + void set_do_symmetry_swap_segment(bool); + + bool get_do_symmetry_swap_s() const; + void set_do_symmetry_swap_s(bool); + + bool get_do_symmetry_shift_z() const; + void set_do_symmetry_shift_z(bool); + //!@} + +private: + //! variable to keep track if setup is called already + /*! Using any of the \c set function will set it to false, so you will have to call setup() again. + */ + bool already_setup; + + //! variable that determines if a cylindrical FOV or the whole image will be handled + bool restrict_to_cylindrical_FOV; + //! variable that determines how many rays will be traced in tangential direction for one bin + int num_tangential_LORs; + //! variable that determines if interleaved sinogram coordinates are used or not. + bool use_actual_detector_boundaries; + bool do_symmetry_90degrees_min_phi; + bool do_symmetry_180degrees_min_phi; + bool do_symmetry_swap_segment; + bool do_symmetry_swap_s; + bool do_symmetry_shift_z; + + // explicitly list necessary members for image details (should use an Info object instead) + CartesianCoordinate3D voxel_size; + CartesianCoordinate3D origin; + CartesianCoordinate3D min_index; + CartesianCoordinate3D max_index; + + shared_ptr proj_data_info_ptr; + + + virtual void + calculate_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin&) const; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +END_NAMESPACE_STIR + +#endif + + + diff --git a/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.h b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.h new file mode 100644 index 0000000000..6443403aee --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.h @@ -0,0 +1,229 @@ +// +// + +#ifndef __stir_recon_buildblock_ProjMatrixElemsForOneBin__ +#define __stir_recon_buildblock_ProjMatrixElemsForOneBin__ + +/*! + + \file + \ingroup projection + + \brief Declaration of class stir::ProjMatrixElemsForOneBin + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + + +#include "stir/recon_buildblock/ProjMatrixElemsForOneBinValue.h" +#include "stir/Bin.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +using std::fstream; +using std::random_access_iterator_tag; +#endif + + + +START_NAMESPACE_STIR + +class Succeeded; +class RelatedBins; +template class DiscretisedDensity; + + + + +/*! +\brief This stores the non-zero projection matrix elements + for every 'densel' that contributes to a given bin. + + In the usual terminology, this class implements a Line (or Tube) + of Response (LOR, or TOR). + + \todo Most of the members of this class would work just as well + for a (not yet existing) class ProjMatrixElemsForOneDensel. + This means that we should derived both from a common + base class, templated in the type of element. + + \todo + It might be useful to template this class in terms of the + element-type as well. That way, we could have 'compact' + elements, efficient elements, etc. However, doing this + will probably only be useful if all ProjMatrixByBin classes + are then templated as well, which would be a pain. +*/ + +/* + it might be a bit faster to derive this (privately) from + vector as opposed to having a member of + that type. + TODO: check +*/ +class ProjMatrixElemsForOneBin +{ +public: + /*! \brief Recommended way to call the type of the elements, instead of + referring to the actual classname. + + Think about this name as 'the type of the value of a ProjMatrixElemsForOneBin::iterator *'. + + This typedef is also required for 'standard' iterators. + */ + typedef ProjMatrixElemsForOneBinValue value_type; +private: + //! shorthand to keep typedefs below concise + typedef vector Element_vector; + +public: + //! typedefs for iterator support + typedef Element_vector::iterator iterator; + typedef Element_vector::const_iterator const_iterator; + typedef Element_vector::size_type size_type; + typedef Element_vector::difference_type difference_type; + typedef random_access_iterator_tag iterator_category; + + typedef value_type& reference; + typedef const value_type& const_reference; + + + //! constructor + /*! + \param bin effectively calls set_bin(bin) + \param default_capacity effectively calls reserve(default_capacity) + */ + explicit ProjMatrixElemsForOneBin(const Bin& bin= Bin(), const int default_capacity = 0); + + /* rely on compiler-generated versions + ProjMatrixElemsForOneBin( const ProjMatrixElemsForOneBin&); + ProjMatrixElemsForOneBin& operator=(const ProjMatrixElemsForOneBin&) ; + */ + + //! check if each voxel occurs only once + Succeeded check_state() const; + + //! get the bin coordinates corresponding to this row + inline Bin get_bin() const; + //! and set the bin coordinates + inline void set_bin(const Bin&); + + //! functions for allowing iterator access + inline iterator begin() ; + inline const_iterator begin() const; + inline iterator end(); + inline const_iterator end() const; + + //! reset lor to 0 length + void erase(); + //! add a new value_type object at the end + /*! + \warning For future compatibility, it is required + (but not checked) that the elements are added such + that calling sort() after the push_back() would not change + the order of the elements. Otherwise, schemes for + 'incremental' storing of coordinates would require too + much overhead. + */ + inline void push_back( const value_type&); + //! reserve enough space for max_number elements (but don't fill them in) + void reserve(size_type max_number); + //! number of non-zero elements + inline size_type size() const; + //! number of allocated elements + size_type capacity() const; + //! Multiplies all values with a constant + ProjMatrixElemsForOneBin& operator*=(const float d); + //! Divides all values with a constant + ProjMatrixElemsForOneBin& operator/=(const float d); + + //! Sort the elements on coordinates of the voxels + /*! Uses value_type::coordinates_less as ordering function. + */ + void sort(); + + //! merge 2nd lor into current object + /*! This makes sure that in the result, no duplicate coordinates occur. + \warning This currently modifies the argument \c lor. + */ + // TODO make sure we can have a const argument + void merge(ProjMatrixElemsForOneBin &lor ); + + //! Compare 2 lors to see if they are equal + /*! \warning Compares element by element. Does not sort first or so. + \warning Compares float values, so uses a tolerance. This tolerance + is currently set to a fraction of the maximum value in the first lor. + \warning this is a fairly CPU intensive operation. + */ + bool operator==(const ProjMatrixElemsForOneBin&) const; + //! Compare 2 lors + bool operator!=(const ProjMatrixElemsForOneBin&) const; + + +#if 0 + void write(fstream&fst) const; + void read(fstream&fst ); +#endif + + + //! Return sum of squares of all values + /*! \warning This sums over all elements in the LOR, irrespective if they + are inside the FOV or not + */ + float square_sum() const; + + //******************** projection operations ********************// + + //! back project a single bin + void back_project(DiscretisedDensity<3,float>&, + const Bin&) const; + + //! forward project into a single bin + void forward_project(Bin&, + const DiscretisedDensity<3,float>&) const; + //! back project related bins + void back_project(DiscretisedDensity<3,float>&, + const RelatedBins&) const; + //! forward project related bins + void forward_project(RelatedBins&, + const DiscretisedDensity<3,float>&) const; + + +private: + vector elements; + Bin bin; + + + //! remove a single value_type + inline iterator erase(iterator it); +}; + + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.inl b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.inl new file mode 100644 index 0000000000..4fac67243c --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBin.inl @@ -0,0 +1,101 @@ +// +// +/*! + + \file + \ingroup projection + + \brief Inline implementations for class stir::ProjMatrixelemesForOneBin + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +Bin +ProjMatrixElemsForOneBin:: +get_bin() const +{ + return bin; +} + +void +ProjMatrixElemsForOneBin:: +set_bin(const Bin& new_bin) +{ + bin = new_bin; +} + +void ProjMatrixElemsForOneBin::push_back( const ProjMatrixElemsForOneBin::value_type& el) +{ + elements.push_back(el); +} + + +ProjMatrixElemsForOneBin::size_type +ProjMatrixElemsForOneBin:: +size() const +{ + return elements.size(); +} + +ProjMatrixElemsForOneBin::iterator +ProjMatrixElemsForOneBin::begin() + { return elements.begin(); } + +ProjMatrixElemsForOneBin::const_iterator +ProjMatrixElemsForOneBin:: +begin() const + { return elements.begin(); }; + +ProjMatrixElemsForOneBin::iterator +ProjMatrixElemsForOneBin:: +end() + { return elements.end(); }; + +ProjMatrixElemsForOneBin::const_iterator +ProjMatrixElemsForOneBin:: +end() const + { return elements.end(); }; + +ProjMatrixElemsForOneBin::iterator +ProjMatrixElemsForOneBin:: +erase(iterator it){ + return elements.erase(it); + } + +#if 0 +unsigned int ProjMatrixElemsForOneBin::make_key(int X,int Y,int Z) +{ + // make x and y positive + // min_x and min_y is supposed to be > -300 + X+= 300; // assert : mix_x >= -300, max_x < 2^10 -300 + Y+= 300; // .... + assert ( X >=0 && X < 0x03FF -300); + assert ( Y >=0 && Y < 0x03FF -300); + assert ( Z >= 0 && Z < 0x03FF ); // Z >=0 & < 2^10 + return ( ((unsigned int)X<<20) | ((unsigned int)Y<<10) | (unsigned int)Z ); +} +#endif +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.h b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.h new file mode 100644 index 0000000000..b21cf3a65a --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.h @@ -0,0 +1,115 @@ +// +// +/*! + \file + \ingroup projection + + \brief Declaration of class stir::ProjMatrixElemsForOneBinValue + + \author Kris Thielemans + \author Mustapha Sadki + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __ProjMatrixElemsForOneBinValue_H__ +#define __ProjMatrixElemsForOneBinValue_H__ + + +#include "stir/common.h" + +START_NAMESPACE_STIR + +template class BasicCoordinate; + +/*! + \ingroup projection + \brief Stores voxel coordinates and the value of the matrix element. + + (Probably) only useful in class ProjMatrixElemsForOneBin. + + \warning It is recommended never to use this class name directly, but + always use the typedef ProjMatrixElemsForOneBin::value_type. + + \warning Voxel coordinates are currently stored as shorts for saving memory. + + */ +class ProjMatrixElemsForOneBinValue +{ +public: + explicit inline + ProjMatrixElemsForOneBinValue(const BasicCoordinate<3,int>& coords, + const float ivalue=0); + + inline ProjMatrixElemsForOneBinValue(); + + + //! get the coordinates + inline BasicCoordinate<3,int> get_coords() const; + + //! In effect the same as get_coords()[1] (but faster) + inline int coord1() const; + //! In effect the same as get_coords()[2] (but faster) + inline int coord2() const; + //! In effect the same as get_coords()[3] (but faster) + inline int coord3() const; + + //! Get the value of the matrix element + inline float get_value() const; + + //! Adds el2.get_value() to the value of the current object + inline ProjMatrixElemsForOneBinValue& operator+=(const ProjMatrixElemsForOneBinValue& el2); + //! Multiplies the value of with a float + inline ProjMatrixElemsForOneBinValue& operator*=(const float d); + //! Adds a float to the value + inline ProjMatrixElemsForOneBinValue& operator+=(const float d); + //! Divides the value of with a float + inline ProjMatrixElemsForOneBinValue& operator/=(const float d); + + + //////// comparison functions + + //! Checks if the coordinates are equal + /*! This function and the next one below are implemented as static members, + such that you can pass them (as functoon objects) to std::sort. + */ + static inline bool coordinates_equal(const ProjMatrixElemsForOneBinValue& el1, const ProjMatrixElemsForOneBinValue& el2); + + //! Checks lexicographical order of the coordinates + static inline bool coordinates_less(const ProjMatrixElemsForOneBinValue& el1, const ProjMatrixElemsForOneBinValue& el2); + + //! Checks coordinates and value are equal + friend inline bool operator==(const ProjMatrixElemsForOneBinValue& el1, const ProjMatrixElemsForOneBinValue& el2); + + //! Checks lexicographical order of the coordinates and the value + friend inline bool operator<(const ProjMatrixElemsForOneBinValue& el1, const ProjMatrixElemsForOneBinValue& el2); + +private: + short c3,c2,c1; + float value; + +}; + + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/ProjMatrixElemsForOneBinValue.inl" + +#endif // __ProjMatrixElemsForOneBinValue_H__ diff --git a/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.inl b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.inl new file mode 100644 index 0000000000..6fd22eb4c3 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneBinValue.inl @@ -0,0 +1,163 @@ +// +// +/*! + \file + \ingroup projection + + \brief Inline implementations for class stir::ProjMatrixElemsForOneBinValue + + \author Kris Thielemans + \author Mustapha Sadki + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Coordinate3D.h" + +//for SHRT_MAX etc +#ifndef NDEBUG +#include +#endif + +START_NAMESPACE_STIR + +ProjMatrixElemsForOneBinValue:: +ProjMatrixElemsForOneBinValue(const BasicCoordinate<3,int>& coords, + const float ivalue) + : c3(static_cast(coords[3])), + c2(static_cast(coords[2])), + c1(static_cast(coords[1])), + value(ivalue) +{ + assert(coords[3] <= SHRT_MAX); + assert(coords[3] >= SHRT_MIN); + assert(coords[2] <= SHRT_MAX); + assert(coords[2] >= SHRT_MIN); + assert(coords[1] <= SHRT_MAX); + assert(coords[1] >= SHRT_MIN); +} + +ProjMatrixElemsForOneBinValue:: +ProjMatrixElemsForOneBinValue() + : c3(0), + c2(0), + c1(0), + value(0) +{} + +BasicCoordinate<3,int> +ProjMatrixElemsForOneBinValue:: +get_coords() const +{ + return Coordinate3D(c1,c2,c3); +} + +int +ProjMatrixElemsForOneBinValue:: +coord1() const +{ return static_cast(c1); } + +int +ProjMatrixElemsForOneBinValue:: +coord2() const +{ return static_cast(c2); } + +int +ProjMatrixElemsForOneBinValue:: +coord3() const +{ return static_cast(c3); } + +float +ProjMatrixElemsForOneBinValue:: +get_value() const +{ return value; } + + +ProjMatrixElemsForOneBinValue& +ProjMatrixElemsForOneBinValue:: +operator+=(const ProjMatrixElemsForOneBinValue& el2) +{ + assert(get_coords() == el2.get_coords()); + value += el2.value; + return *this; +} + +ProjMatrixElemsForOneBinValue& +ProjMatrixElemsForOneBinValue:: +operator+=(const float d) +{ + value += d; + return *this; +} + +ProjMatrixElemsForOneBinValue& +ProjMatrixElemsForOneBinValue:: +operator*=(const float d) +{ + value *= d; + return *this; +} + +ProjMatrixElemsForOneBinValue& +ProjMatrixElemsForOneBinValue:: +operator/=(const float d) +{ + value /= d; + return *this; +} + +bool +ProjMatrixElemsForOneBinValue:: +coordinates_equal(const ProjMatrixElemsForOneBinValue& el1, const ProjMatrixElemsForOneBinValue& el2) +{ + return el1.c3==el2.c3 && el1.c2==el2.c2 && el1.c1==el2.c1; +} + +bool +ProjMatrixElemsForOneBinValue:: +coordinates_less(const ProjMatrixElemsForOneBinValue& el1, const ProjMatrixElemsForOneBinValue& el2) +{ + return el1.c1 +//#include + +#ifndef STIR_NO_NAMESPACES +using std::vector; +//using std::fstream; +using std::random_access_iterator_tag; +#endif + + + +START_NAMESPACE_STIR + +class RelatedDensels; +template class DiscretisedDensity; +class Succeeded; + + + +/*! \ingroup projection +\brief This stores the non-zero projection matrix elements + for every 'voxel'. + + Most of the members of this class would work just as well + for a (not yet existing) class ProjMatrixElemsForOneVoxel. + This means that we should derived both from a common + base class, templated in the type of element (TODO). + + It might be useful to template this class in terms of the + element-type as well. That way, we could have 'compact' + elements, efficient elements, etc. However, doing this + will probably only be useful if all ProjMatrixByDensel classes + are then templated as well (TODO?). +*/ + +/* + it might be a bit faster to derive this (privately) from + vector as opposed to having a member of + that type. + TODO: check +*/ +class ProjMatrixElemsForOneDensel +{ +public: + /*! \brief Recommended way to call the type of the elements, instead of + referring to the actual classname. + + Think about this name as 'the type of the value of a ProjMatrixElemsForOneDensel::iterator *'. + + This typedef is also required for 'standard' iterators. + */ + typedef ProjMatrixElemsForOneDenselValue value_type; +private: + //! shorthand to keep typedefs below concise + typedef vector Element_vector; + +public: + //! typedefs for iterator support + typedef Element_vector::iterator iterator; + typedef Element_vector::const_iterator const_iterator; + typedef Element_vector::size_type size_type; + typedef Element_vector::difference_type difference_type; + typedef random_access_iterator_tag iterator_category; + + typedef value_type& reference; + typedef const value_type& const_reference; + + + //! constructor + ProjMatrixElemsForOneDensel(); + /*! + \param Densel effectively calls set_densel(Densel) + \param default_capacity effectively calls reserve(default_capacity) + */ + explicit ProjMatrixElemsForOneDensel(const Densel& Densel, const int default_capacity = 300); + + /* rely on compiler-generated versions + ProjMatrixElemsForOneDensel( const ProjMatrixElemsForOneDensel&); + ProjMatrixElemsForOneDensel& operator=(const ProjMatrixElemsForOneDensel&) ; + */ + + //! check if each voxel occurs only once + Succeeded check_state() const; + + //! get the Densel coordinates corresponding to this row + inline Densel get_densel() const; + //! and set the Densel coordinates + inline void set_densel(const Densel&); + + //! functions for allowing iterator access + inline iterator begin() ; + inline const_iterator begin() const; + inline iterator end(); + inline const_iterator end() const; + + //! reset lor to 0 length + void erase(); + //! add a new value_type object at the end + /*! + \warning For future compatibility, it is required + (but not checked) that the elements are added such + that calling sort() after the push_back() would not change + the order of the elements. Otherwise, schemes for + 'incremental' storing of coordinates would require too + much overhead. + */ + inline void push_back( const value_type&); + //! reserve enough space for max_number elements (but don't fill them in) + void reserve(size_type max_number); + //! number of non-zero elements + inline size_type size() const; + + //! Multiplies all values with a constant + ProjMatrixElemsForOneDensel& operator*=(const float d); + //! Divides all values with a constant + ProjMatrixElemsForOneDensel& operator/=(const float d); + + //! Sort the elements on coordinates of the voxels + /*! Uses value_type::coordinates_less as ordering function. + */ + void sort(); + + //! merge 2nd lor into current object + /*! This makes sure that in the result, no duplicate coordinates occur. + \warning This currently modifies the argument \c lor. + */ + // TODO make sure we can have a const argument + void merge(ProjMatrixElemsForOneDensel &lor ); + +#if 0 + void write(fstream&fst) const; + void read(fstream&fst ); +#endif + + + //! Return sum of squares of all values + /*! \warning This sums over all elements in the LOR, irrespective if they + are inside the FOV or not + */ + float square_sum() const; + + //******************** projection operations ********************// +#if 0 + //! back project a single Densel + void back_project(DiscretisedDensity<3,float>&, + const Densel&) const; + + //! forward project into a single Densel + void forward_project(Densel&, + const DiscretisedDensity<3,float>&) const; + //! back project related Densels + void back_project(DiscretisedDensity<3,float>&, + const RelatedDensels&) const; + //! forward project related Densels + void forward_project(RelatedDensels&, + const DiscretisedDensity<3,float>&) const; + +#endif + +private: + vector elements; + Densel densel; + + + //! remove a single value_type + inline iterator erase(iterator it); +}; + + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/ProjMatrixElemsForOneDensel.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDensel.inl b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDensel.inl new file mode 100644 index 0000000000..8ce19fc05c --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDensel.inl @@ -0,0 +1,86 @@ +// +// +/*! + + \file + \ingroup projection + + \brief Inline implementations for class stir::ProjMatrixElemsForOneDensel + + \author Kris Thielemans + + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +Densel +ProjMatrixElemsForOneDensel:: +get_densel() const +{ + return densel; +} + +void +ProjMatrixElemsForOneDensel:: +set_densel(const Densel& new_densel) +{ + densel = new_densel; +} + +void ProjMatrixElemsForOneDensel::push_back( const ProjMatrixElemsForOneDensel::value_type& el) +{ + elements.push_back(el); +} + + +ProjMatrixElemsForOneDensel::size_type +ProjMatrixElemsForOneDensel:: +size() const +{ + return elements.size(); +} + +ProjMatrixElemsForOneDensel::iterator +ProjMatrixElemsForOneDensel::begin() + { return elements.begin(); } + +ProjMatrixElemsForOneDensel::const_iterator +ProjMatrixElemsForOneDensel:: +begin() const + { return elements.begin(); }; + +ProjMatrixElemsForOneDensel::iterator +ProjMatrixElemsForOneDensel:: +end() + { return elements.end(); }; + +ProjMatrixElemsForOneDensel::const_iterator +ProjMatrixElemsForOneDensel:: +end() const + { return elements.end(); }; + +ProjMatrixElemsForOneDensel::iterator +ProjMatrixElemsForOneDensel:: +erase(iterator it){ + return elements.erase(it); + } + + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDenselValue.h b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDenselValue.h new file mode 100644 index 0000000000..6448711c96 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDenselValue.h @@ -0,0 +1,96 @@ +// +// +/*! + \file + \ingroup projection + + \brief Declaration of class stir::ProjMatrixElemsForOneDenselValue + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_ProjMatrixElemsForOneDenselValue_H__ +#define __stir_recon_buildblock_ProjMatrixElemsForOneDenselValue_H__ + +#include "stir/Bin.h" + +START_NAMESPACE_STIR + + +/*! + \ingroup projection + \brief Stores voxel coordinates and the value of the matrix element. + + (Probably) only useful in class ProjMatrixElemsForOneDensel. + + \warning It is recommended never to use this class name directly, but + always use the typedef ProjMatrixElemsForOneDensel::value_type. + + + \todo Simply derived from Bin for now. + + */ + class ProjMatrixElemsForOneDenselValue : public Bin +{ +public: + explicit inline + ProjMatrixElemsForOneDenselValue(const Bin&); + + inline ProjMatrixElemsForOneDenselValue(); + + //! Adds el2.get_value() to the value of the current object + inline ProjMatrixElemsForOneDenselValue& operator+=(const ProjMatrixElemsForOneDenselValue& el2); + //! Multiplies the value of with a float + inline ProjMatrixElemsForOneDenselValue& operator*=(const float d); + //! Adds a float to the value + inline ProjMatrixElemsForOneDenselValue& operator+=(const float d); + //! Divides the value of with a float + inline ProjMatrixElemsForOneDenselValue& operator/=(const float d); + + // TODO + inline float get_value() const { return get_bin_value(); } + inline void set_value(const float v) { set_bin_value(v); } + + //////// comparison functions + + //! Checks if the coordinates are equal + /*! This function and the next one below are implemented as static members, + such that you can pass them (as function objects) to std::sort. + */ + static inline bool coordinates_equal(const ProjMatrixElemsForOneDenselValue& el1, const ProjMatrixElemsForOneDenselValue& el2); + + //! Checks lexicographical order of the coordinates + static inline bool coordinates_less(const ProjMatrixElemsForOneDenselValue& el1, const ProjMatrixElemsForOneDenselValue& el2); + + //! Checks coordinates and value are equal + friend inline bool operator==(const ProjMatrixElemsForOneDenselValue& el1, const ProjMatrixElemsForOneDenselValue& el2); + + //! Checks lexicographical order of the coordinates and the value + friend inline bool operator<(const ProjMatrixElemsForOneDenselValue& el1, const ProjMatrixElemsForOneDenselValue& el2); + + +}; + + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/ProjMatrixElemsForOneDenselValue.inl" + +#endif // __ProjMatrixElemsForOneDenselValue_H__ diff --git a/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDenselValue.inl b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDenselValue.inl new file mode 100644 index 0000000000..d13ca2c919 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjMatrixElemsForOneDenselValue.inl @@ -0,0 +1,130 @@ +// +// +/*! + \file + \ingroup projection + + \brief Inline implementations for class stir::ProjMatrixElemsForOneDenselValue + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +START_NAMESPACE_STIR + +ProjMatrixElemsForOneDenselValue:: +ProjMatrixElemsForOneDenselValue(const Bin& bin) +: Bin(bin) +{ +} + +ProjMatrixElemsForOneDenselValue:: +ProjMatrixElemsForOneDenselValue() + : Bin() +{} + + + +ProjMatrixElemsForOneDenselValue& +ProjMatrixElemsForOneDenselValue:: +operator+=(const ProjMatrixElemsForOneDenselValue& el2) +{ + //TODO assert(get_coords() == el2.get_coords()); + //*this += static_cast(el2); + set_bin_value(get_bin_value() + el2.get_bin_value()); + return *this; +} + +ProjMatrixElemsForOneDenselValue& +ProjMatrixElemsForOneDenselValue:: +operator+=(const float d) +{ + static_cast(*this) += d; + return *this; +} + +ProjMatrixElemsForOneDenselValue& +ProjMatrixElemsForOneDenselValue:: +operator*=(const float d) +{ + set_bin_value(get_bin_value() * d); + return *this; +} + +ProjMatrixElemsForOneDenselValue& +ProjMatrixElemsForOneDenselValue:: +operator/=(const float d) +{ + set_bin_value(get_bin_value() / d); + return *this; +} + +bool +ProjMatrixElemsForOneDenselValue:: +coordinates_equal(const ProjMatrixElemsForOneDenselValue& el1, const ProjMatrixElemsForOneDenselValue& el2) +{ + return + el1.segment_num() == el2.segment_num() && + el1.view_num() == el2.view_num() && + el1.axial_pos_num() == el2.axial_pos_num() && + el1.tangential_pos_num() == el2.tangential_pos_num(); +} + +bool +ProjMatrixElemsForOneDenselValue:: +coordinates_less(const ProjMatrixElemsForOneDenselValue& el1, const ProjMatrixElemsForOneDenselValue& el2) +{ + return + el1.segment_num() < el2.segment_num() || + (el1.segment_num() == el2.segment_num() && + (el1.view_num() < el2.view_num() || + (el1.view_num() == el2.view_num() && + (el1.axial_pos_num() < el2.axial_pos_num() || + (el1.axial_pos_num() == el2.axial_pos_num() && + el1.tangential_pos_num() < el2.tangential_pos_num()))))); +} + + + +bool +operator==(const ProjMatrixElemsForOneDenselValue& el1, + const ProjMatrixElemsForOneDenselValue& el2) +{ + return static_cast(el1) == static_cast(el2); +} + + +bool +operator<(const ProjMatrixElemsForOneDenselValue& el1, + const ProjMatrixElemsForOneDenselValue& el2) +{ + return + el1.segment_num() < el2.segment_num() || + (el1.segment_num() == el2.segment_num() && + (el1.view_num() < el2.view_num() || + (el1.view_num() == el2.view_num() && + (el1.axial_pos_num() < el2.axial_pos_num() || + (el1.axial_pos_num() == el2.axial_pos_num() && + (el1.tangential_pos_num() < el2.tangential_pos_num() || + (el1.tangential_pos_num() < el2.tangential_pos_num() && + el1.get_bin_value() class DiscretisedDensity; +class ProjDataInfo; + + +/*! + \ingroup projection + \brief Abstract base class for all projector pairs + + This class is useful for all algorithms which need both a forward + and back projector. It's only purpose in that case is to provide the + parsing mechanisms, such that the projectors can be defined in a .par + file. +*/ +class ProjectorByBinPair : +public RegisteredObject , +public ParsingObject +{ +public: + + //! Default constructor + ProjectorByBinPair(); + + virtual ~ProjectorByBinPair() {} + + //! Stores all necessary geometric info + /*! + If necessary, set_up() can be called more than once. + + Derived classes can assume that the projectors will be called + with input corresponding to the arguments of the last call to set_up(). + */ + virtual Succeeded + set_up( + const shared_ptr&, + const shared_ptr >& // TODO should be Info only + ); + + + //ForwardProjectorByBin const * + const shared_ptr + get_forward_projector_sptr() const; + + //BackProjectorByBin const * + const shared_ptr + get_back_projector_sptr() const; + + + //! Provide access to the (minimal) symmetries used by the projectors + /*! It is expected that the forward and back projector can handle the same + symmetries. + + \warning There is currently no check that this is the case, and we just return + the symmetries returned by the back projector. + \todo determine set of minimal symmetries + */ + const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const + { + return get_back_projector_sptr()->get_symmetries_used(); + } + +protected: + + shared_ptr forward_projector_sptr; + shared_ptr back_projector_sptr; + +}; + +END_NAMESPACE_STIR + + +#endif // __stir_recon_buildblock_ProjectorByBinPair_h_ diff --git a/src/include/stir/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.h b/src/include/stir/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.h new file mode 100644 index 0000000000..6c01d0611f --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.h @@ -0,0 +1,84 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projection + + \brief Declares class stir::ProjectorByBinPairUsingProjMatrixByBin + + \author Kris Thielemans + +*/ +#ifndef __stir_recon_buildblock_ProjectorByBinPairUsingProjMatrixByBin_h_ +#define __stir_recon_buildblock_ProjectorByBinPairUsingProjMatrixByBin_h_ + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/ProjectorByBinPair.h" +#include "stir/recon_buildblock/ProjMatrixByBin.h" + +START_NAMESPACE_STIR + +class Succeeded; +/*! + \ingroup projection + \brief A projector pair based on a single matrix +*/ +class ProjectorByBinPairUsingProjMatrixByBin : + public RegisteredParsingObject +{ + private: + typedef + RegisteredParsingObject + base_type; +public: + //! Name which will be used when parsing a ProjectorByBinPair object + static const char * const registered_name; + + //! Default constructor + ProjectorByBinPairUsingProjMatrixByBin(); + + //! Constructor that sets the projection matrix + ProjectorByBinPairUsingProjMatrixByBin(const shared_ptr& proj_matrix_sptr); + + //! Stores all necessary geometric info + /*! First constructs forward and back projectors and then calls base_type::setup */ + virtual Succeeded set_up( + const shared_ptr& proj_data_info_sptr, + const shared_ptr >& density_info_sptr // TODO should be Info only + ); + + ProjMatrixByBin const * + get_proj_matrix_ptr() const; + +private: + + shared_ptr proj_matrix_sptr; + void set_defaults(); + void initialise_keymap(); + bool post_processing(); +}; + +END_NAMESPACE_STIR + + +#endif // __stir_recon_buildblock_ProjectorByBinPairUsingProjMatrixByBin_h_ diff --git a/src/include/stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h b/src/include/stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h new file mode 100644 index 0000000000..f8bf5b8df6 --- /dev/null +++ b/src/include/stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h @@ -0,0 +1,74 @@ +// +// +/*! + \file + \ingroup projection + + \brief Declares class stir::ProjectorByBinPairUsingSeparateProjectors + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_recon_buildblock_ProjectorByBinPairUsingSeparateProjectors_h_ +#define __stir_recon_buildblock_ProjectorByBinPairUsingSeparateProjectors_h_ + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/ProjectorByBinPair.h" + +START_NAMESPACE_STIR + + +/*! + \ingroup projection + \brief A projector pair based on a single matrix +*/ +class ProjectorByBinPairUsingSeparateProjectors : + public RegisteredParsingObject +{ + private: + typedef + RegisteredParsingObject + base_type; +public: + //! Name which will be used when parsing a ProjectorByBinPair object + static const char * const registered_name; + + //! Default constructor + ProjectorByBinPairUsingSeparateProjectors(); + + //! Constructor that sets the pair + ProjectorByBinPairUsingSeparateProjectors(const shared_ptr& forward_projector_sptr, + const shared_ptr& back_projector_sptr); + + +private: + + void set_defaults(); + void initialise_keymap(); + bool post_processing(); +}; + +END_NAMESPACE_STIR + + +#endif // __stir_recon_buildblock_ProjectorByBinPairUsingSeparateProjectors_h_ diff --git a/src/include/stir/recon_buildblock/QuadraticPrior.h b/src/include/stir/recon_buildblock/QuadraticPrior.h new file mode 100644 index 0000000000..db685ce890 --- /dev/null +++ b/src/include/stir/recon_buildblock/QuadraticPrior.h @@ -0,0 +1,182 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details. +*/ +/*! + \file + \ingroup priors + \brief Declaration of class stir::QuadraticPrior + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + + +#ifndef __stir_recon_buildblock_QuadraticPrior_H__ +#define __stir_recon_buildblock_QuadraticPrior_H__ + + +#include "stir/RegisteredParsingObject.h" +#include "stir/recon_buildblock/PriorWithParabolicSurrogate.h" +#include "stir/Array.h" +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include + +START_NAMESPACE_STIR + + +/*! + \ingroup priors + \brief + A class in the GeneralisedPrior hierarchy. This implements a quadratic Gibbs prior. + + The gradient of the prior is computed as follows: + + \f[ + g_r = \sum_dr w_{dr} (\lambda_r - \lambda_{r+dr}) * \kappa_r * \kappa_{r+dr} + \f] + where \f$\lambda\f$ is the image and \f$r\f$ and \f$dr\f$ are indices and the sum + is over the neighbourhood where the weights \f$w_{dr}\f$ are non-zero. + + The \f$\kappa\f$ image can be used to have spatially-varying penalties such as in + Jeff Fessler's papers. It should have identical dimensions to the image for which the + penalty is computed. If \f$\kappa\f$ is not set, this class will effectively + use 1 for all \f$\kappa\f$'s. + + By default, a 3x3 or 3x3x3 neigbourhood is used where the weights are set to + x-voxel_size divided by the Euclidean distance between the points. + + \par Parsing + These are the keywords that can be used in addition to the ones in GeneralPrior. + \verbatim + Quadratic Prior Parameters:= + ; next defaults to 0, set to 1 for 2D inverse Euclidean weights, 0 for 3D + only 2D:= 0 + ; next can be used to set weights explicitly. Needs to be a 3D array (of floats). + ' value of only_2D is ignored + ; following example uses 2D 'nearest neighbour' penalty + ; weights:={{{0,1,0},{1,0,1},{0,1,0}}} + ; use next parameter to specify an image with penalisation factors (a la Fessler) + ; see class documentation for more info + ; kappa filename:= + ; use next parameter to get gradient images at every subiteration + ; see class documentation + gradient filename prefix:= + END Quadratic Prior Parameters:= + \endverbatim + + +*/ +template +class QuadraticPrior: public + RegisteredParsingObject< QuadraticPrior, + GeneralisedPrior >, + PriorWithParabolicSurrogate > + > +{ + private: + typedef + RegisteredParsingObject< QuadraticPrior, + GeneralisedPrior >, + PriorWithParabolicSurrogate > > + base_type; + + public: + //! Name which will be used when parsing a GeneralisedPrior object + static const char * const registered_name; + + //! Default constructor + QuadraticPrior(); + + //! Constructs it explicitly + QuadraticPrior(const bool only_2D, float penalization_factor); + + virtual bool + parabolic_surrogate_curvature_depends_on_argument() const + { return false; } + + //! compute the value of the function + double + compute_value(const DiscretisedDensity<3,elemT> ¤t_image_estimate); + + //! compute gradient + void compute_gradient(DiscretisedDensity<3,elemT>& prior_gradient, + const DiscretisedDensity<3,elemT> ¤t_image_estimate); + + //! compute the parabolic surrogate for the prior + /*! in the case of quadratic priors this will just be the sum of weighting coefficients*/ + void parabolic_surrogate_curvature(DiscretisedDensity<3,elemT>& parabolic_surrogate_curvature, + const DiscretisedDensity<3,elemT> ¤t_image_estimate); + + //! compute Hessian + void compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel, + const BasicCoordinate<3,int>& coords, + const DiscretisedDensity<3,elemT> ¤t_image_estimate); + + virtual Succeeded + add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output, + const DiscretisedDensity<3,elemT>& input) const; + + //! get penalty weights for the neigbourhood + Array<3,float> get_weights() const; + + //! set penalty weights for the neigbourhood + void set_weights(const Array<3,float>&); + + //! get current kappa image + /*! \warning As this function returns a shared_ptr, this is dangerous. You should not + modify the image by manipulating the image refered to by this pointer. + Unpredictable results will occur. + */ + shared_ptr > get_kappa_sptr() const; + + //! set kappa image + void set_kappa_sptr(const shared_ptr >&); + +protected: + //! can be set during parsing to restrict the weights to the 2D case + bool only_2D; + //! filename prefix for outputing the gradient whenever compute_gradient() is called. + /*! An internal counter is used to keep track of the number of times the + gradient is computed. The filename will be constructed by concatenating + gradient_filename_prefix and the counter. + */ + string gradient_filename_prefix; + + //! penalty weights + /*! + \todo This member is mutable at present because some const functions initialise it. + That initialisation should be moved to a new set_up() function. + */ + mutable Array<3,float> weights; + //! Filename for the \f$\kappa\f$ image that will be read by post_processing() + std::string kappa_filename; + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + private: + shared_ptr > kappa_ptr; +}; + + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/recon_buildblock/RayTraceVoxelsOnCartesianGrid.h b/src/include/stir/recon_buildblock/RayTraceVoxelsOnCartesianGrid.h new file mode 100644 index 0000000000..f2528d6ae5 --- /dev/null +++ b/src/include/stir/recon_buildblock/RayTraceVoxelsOnCartesianGrid.h @@ -0,0 +1,83 @@ +// +// +/*! + + \file + \ingroup recon_buildblock + \brief Declaration of stir::RayTraceVoxelsOnCartesianGrid + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/common.h" + +START_NAMESPACE_STIR + +class ProjMatrixElemsForOneBin; +template class CartesianCoordinate3D; + +/*! \ingroup recon_buildblock + + \brief RayTraceVoxelsOnCartesianGrid finds the Length of Intersections (LOIs) + of an LOR with a grid of voxels and appends them to + the ProjMatrixElemsForOneBin object. + + \param lor object to which the intersected voxels and the LOI will be appended + \param start_point first point on the LOR. The first voxel will contain this point. + \param end_point last point on the LOR. The last voxel will contain this point. + \param voxel_size normally in mm + \param normalisation_constant LOIs will be multiplied with this constant + + start_point and end_point have to be given in 'voxel grid + units' (i.e. voxels are spaced 1 unit apart). The centre + of the voxels are assumed to be at integer coordinates + (e.g. (0,0,0) is the centre of a voxel). + + For the start voxel, the intersection length of the LOR with the + whole voxel is computed, not just from the start_point to the next edge. The + same is true for the end voxel. + + \warning RayTraceVoxelsOnCartesianGrid appends voxels and intersection lengths to the lor. + It does NOT reset it first. + + RayTraceVoxelsOnCartesianGrid is based on Siddon's algorithm. + + Siddon's algorithm works by looking at intersections of the + 'intra-voxel' planes with the LOR. + + The LORs is parametrised as + \code + (x,y,z) = a (1/inc_x, 1/inc_y, 1/inc_z) + start_point + \endcode + Then values of 'a' are computed where the LOR intersects an intra-voxel plane. + For example, 'ax' are the values where x= n + 0.5 (for integer n). + Finally, we can go along the LOR and check which of the ax,ay,az is smallest, + as this determines which plane the LOR intersects at this point. + +*/ +void +RayTraceVoxelsOnCartesianGrid(ProjMatrixElemsForOneBin& lor, + const CartesianCoordinate3D& start_point, + const CartesianCoordinate3D& end_point, + const CartesianCoordinate3D& voxel_size, + const float normalisation_constant = 1.F); + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/Reconstruction.h b/src/include/stir/recon_buildblock/Reconstruction.h new file mode 100644 index 0000000000..40ae697e3f --- /dev/null +++ b/src/include/stir/recon_buildblock/Reconstruction.h @@ -0,0 +1,193 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_recon_buildblock_Reconstruction_H__ +#define __stir_recon_buildblock_Reconstruction_H__ +/*! + \file + \ingroup recon_buildblock + + \brief declares the stir::Reconstruction class + + \author Kris Thielemans + \author Matthew Jacobson + \author Claire Labbe + \author PARAPET project + +*/ + +#include "stir/TimedObject.h" +#include "stir/ParsingObject.h" +#include "stir/shared_ptr.h" +#include "stir/DataProcessor.h" +#include "stir/IO/OutputFileFormat.h" +#include + + +#ifndef STIR_NO_NAMESPACES +using std::string; +#endif + +START_NAMESPACE_STIR + + +class Succeeded; + +/*! + \brief base class for all Reconstructions + \ingroup recon_buildblock + As there is not a lot of commonality between different reconstruction algorithms, + this base class is rather basic. It essentially takes care of constructing a target + image, calls the virtual reconstruct() function, and writes the result to file. + + For convenience, the class is derived from TimedObject. It is the + responsibility of the derived class to run these timers though. + + \par Parsing parameters + + \verbatim + ; post-processing after image reconstruction,see DataProcessor + ; defaults to no processing ("None") + post-filter type := + + ; output file(s) will be written with the following file name + output filename prefix := + ; output file(s) will use the following file format + ; see OutputFileFormat + output file format := + \endverbatim + + \todo Currently reconstruct() always write to an output_file, which is not desirable + when running a reconstruction inside some other code. Maybe this should + be moved into post_filter_sptr? + +*/ + +template +class Reconstruction : public TimedObject, public ParsingObject +{ +public: + //! virtual destructor + virtual ~Reconstruction() {}; + + //! gives method information + virtual string method_info() const = 0; + + //! executes the reconstruction + /*! + \return Succeeded::yes if everything was alright. + */ + virtual Succeeded + reconstruct() = 0; + + //! executes the reconstruction storing result in \c target_image_sptr + /*! + \param target_image_sptr The result of the reconstruction is stored in + \c *target_image_sptr. + \return Succeeded::yes if everything was alright. + + \par Developer\'s note + + Because of C++ rules, overloading one of the reconstruct() functions + in a derived class, will hide the other. So you have to overload both. + */ + virtual Succeeded + reconstruct(shared_ptr const& target_image_sptr) = 0; + + //! operations prior to the reconstruction + /*! Will do various consistency checks and return Succeeded::no + if something is wrong. + + \todo Currently, set_up() is called by reconstruct(). This is in + contrast with some other class hierarchies in STIR where set_up() + has to be called before any actual processing. Maybe this should + be made consistent. + */ + virtual Succeeded set_up(shared_ptr const& target_data_sptr); + + /*! \name Functions to set parameters + This can be used as alternative to the parsing mechanism. + \warning Be careful with setting shared pointers. If you modify the objects in + one place, all objects that use the shared pointer will be affected. + */ + //@{ + + //! file name for output reconstructed images + void set_output_filename_prefix(const string&); + + //! defines the format of the output files + void set_output_file_format_ptr(const shared_ptr >&); + + //! post-filter + void set_post_processor_sptr(const shared_ptr > &); + //@} + + // parameters + protected: + + //! file name for output reconstructed images + string output_filename_prefix; + + //! defines the format of the output files + shared_ptr > output_file_format_ptr; + + //! post-filter + shared_ptr > post_filter_sptr; + +protected: + + /*! + \brief + This function initialises all parameters, either via parsing, + or by calling ask_parameters() (when parameter_filename is the empty string). + + It should be called in the constructor of the last class in the + hierarchy. At that time, all Interfile keys will have been + initialised, and ask_parameters() will be the appropriate virtual + function, such that questions are asked for all parameters. + + \todo It currently calls error() when something goes wrong. It should + return Succeeded (or throw an exception). + */ + void initialise(const string& parameter_filename); + + virtual void set_defaults(); + virtual void initialise_keymap(); + //! used to check acceptable parameters after parsing + /*! + The function should be used to set members that have + are not set directly by the parsing. For example, + parsing might set \c input_filename, and \c post_processing() + might then read in the data and set the corresponding + Reconstruction parameter. + + Consistency checks mostly belong in \c set_up(). The reason for this + is that for instance a GUI might not use the parsing mechanism and + set parameters by calling various \c set_ functions (such as + \c set_post_processor_sptr() ). + */ + virtual bool post_processing(); + + +}; + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/recon_buildblock/RelatedBins.h b/src/include/stir/recon_buildblock/RelatedBins.h new file mode 100644 index 0000000000..14c61c70a9 --- /dev/null +++ b/src/include/stir/recon_buildblock/RelatedBins.h @@ -0,0 +1,125 @@ +// +// +/*! + + \file + \ingroup recon_buildblock + + \brief Declaration of class stir::RelatedBins + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __RelatedBins_H__ +#define __RelatedBins_H__ + +#include "stir/shared_ptr.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::size_t; +using std::ptrdiff_t; +using std::random_access_iterator_tag; +using std::vector; +#endif + +START_NAMESPACE_STIR + +class ProjData; +class Bin; +class DataSymmetriesForBins; +/*! + \ingroup recon_buildblock + \brief This class contains all information about a set of bins related + by symmetry. +*/ + +class RelatedBins +{ +public: + //! typedefs for iterator support + + + typedef random_access_iterator_tag iterator_category; + typedef Bin value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + + //! typedefs to make it partly comply with STL requirements +#ifndef STIR_NO_NAMESPACES + typedef std::vector::iterator iterator; + typedef std::vector::const_iterator const_iterator; +#else + typedef vector::iterator iterator; + typedef vector::const_iterator const_iterator; +#endif + //!Default constructor: creates no bins, no symmetries + inline RelatedBins(); + + //! get the number of related bins + inline int get_num_related_bins() const; + + //! get 'basic' bin coordinates + inline Bin get_basic_bin() const; + + // get the pointer to a ProjDataInfo class + // inline const ProjDataInfo * get_proj_data_info_ptr() const; + + //! return the symmetries used + inline const DataSymmetriesForBins* get_symmetries_ptr() const ; + + //! get an empty copy + RelatedBins get_empty_copy() const; + + // basic iterator support + + //! use to initialise an iterator to the first element of the vector + inline iterator begin(); + //! iterator 'past' the last element of the vector + inline iterator end(); + //! use to initialise an iterator to the first element of the (const) vector + inline const_iterator begin() const; + //! iterator 'past' the last element of the (const) vector + inline const_iterator end() const; + + + +private: + vector related_bins; + shared_ptr symmetries; + //! a private constructor which sets the members + inline RelatedBins(const vector& related_bins, + const shared_ptr& symmetries_used); + + +}; + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/RelatedBins.inl" + +#endif //__RelatedBins_H__ + + diff --git a/src/include/stir/recon_buildblock/RelatedBins.inl b/src/include/stir/recon_buildblock/RelatedBins.inl new file mode 100644 index 0000000000..be925be596 --- /dev/null +++ b/src/include/stir/recon_buildblock/RelatedBins.inl @@ -0,0 +1,97 @@ +// +// +/*! + + \file + \ingroup recon_buildblock + + \brief Implementations of inline functions of class stir::RelatedBins + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/Bin.h" +#include "stir/recon_buildblock/DataSymmetriesForBins.h" + +START_NAMESPACE_STIR + + + +RelatedBins::RelatedBins() +:related_bins(),symmetries() +{} + +RelatedBins::RelatedBins(const vector< Bin>& related_bins_v, + const shared_ptr& symmetries_used) +:related_bins(related_bins_v),symmetries(symmetries_used) +{} + +int +RelatedBins::get_num_related_bins() const +{ + return related_bins.size(); +} + +Bin +RelatedBins::get_basic_bin() const +{ + assert(related_bins.size() != 0); + return related_bins[0]; +} + + +#if 0 +const ProjDataInfo * +RelatedBins:: get_proj_data_info_ptr() const +{ + + return related_bins[0].get_proj_data_info_ptr(); +} +#endif + + +const DataSymmetriesForBins* +RelatedBins::get_symmetries_ptr() const +{ + return symmetries.get(); +} + + +RelatedBins::iterator +RelatedBins::begin() +{ return related_bins.begin();} + +RelatedBins::iterator +RelatedBins::end() +{return related_bins.end();} + +RelatedBins::const_iterator +RelatedBins::begin() const +{return related_bins.begin();} + +RelatedBins::const_iterator +RelatedBins::end() const +{return related_bins.end();} + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/recon_buildblock/RelatedDensels.h b/src/include/stir/recon_buildblock/RelatedDensels.h new file mode 100644 index 0000000000..354f85c8d6 --- /dev/null +++ b/src/include/stir/recon_buildblock/RelatedDensels.h @@ -0,0 +1,123 @@ +// +// +/*! + + \file + \ingroup symmetries + + \brief Declaration of class stir::RelatedDensels + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __RelatedDensels_H__ +#define __RelatedDensels_H__ + +#include "stir/shared_ptr.h" +#include "stir/Densel.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::size_t; +using std::ptrdiff_t; +using std::random_access_iterator_tag; +using std::vector; +#endif + +START_NAMESPACE_STIR + +class DataSymmetriesForDensels; +/*! + \ingroup symmetries + \brief This class contains all information about a set of densels related + by symmetry. +*/ +class RelatedDensels +{ +public: + //! typedefs for iterator support + + + typedef random_access_iterator_tag iterator_category; + typedef Densel value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + + //! typedefs to make it partly comply with STL requirements +#ifndef STIR_NO_NAMESPACES + typedef std::vector::iterator iterator; + typedef std::vector::const_iterator const_iterator; +#else + typedef vector::iterator iterator; + typedef vector::const_iterator const_iterator; +#endif + //!Default constructor: creates no densels, no symmetries + inline RelatedDensels(); + + //! get the number of related densels + inline int get_num_related_densels() const; + + //! get 'basic' densel coordinates + inline Densel get_basic_densel() const; + + // get the pointer to a ProjDataInfo class + // inline const ProjDataInfo * get_proj_data_info_ptr() const; + + //! return the symmetries used + inline const DataSymmetriesForDensels* get_symmetries_ptr() const ; + + //! get an empty copy + RelatedDensels get_empty_copy() const; + + // basic iterator support + + //! use to initialise an iterator to the first element of the vector + inline iterator begin(); + //! iterator 'past' the last element of the vector + inline iterator end(); + //! use to initialise an iterator to the first element of the (const) vector + inline const_iterator begin() const; + //! iterator 'past' the last element of the (const) vector + inline const_iterator end() const; + + + +private: + vector related_densels; + shared_ptr symmetries; + //! a private constructor which sets the members + inline RelatedDensels(const vector& related_densels, + const shared_ptr& symmetries_used); + + +}; + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/RelatedDensels.inl" + +#endif //__RelatedDensels_H__ + + diff --git a/src/include/stir/recon_buildblock/RelatedDensels.inl b/src/include/stir/recon_buildblock/RelatedDensels.inl new file mode 100644 index 0000000000..f4b0ba1d8a --- /dev/null +++ b/src/include/stir/recon_buildblock/RelatedDensels.inl @@ -0,0 +1,97 @@ +// +// +/*! + + \file + \ingroup symmetries + + \brief Implementations of inline functions of class stir::RelatedDensels + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/Densel.h" +#include "stir/recon_buildblock/DataSymmetriesForDensels.h" + +START_NAMESPACE_STIR + + + +RelatedDensels::RelatedDensels() +:related_densels(),symmetries() +{} + +RelatedDensels::RelatedDensels(const vector< Densel>& related_densels_v, + const shared_ptr& symmetries_used) +:related_densels(related_densels_v),symmetries(symmetries_used) +{} + +int +RelatedDensels::get_num_related_densels() const +{ + return related_densels.size(); +} + +Densel +RelatedDensels::get_basic_densel() const +{ + assert(related_densels.size() != 0); + return related_densels[0]; +} + + +#if 0 +const ProjDataInfo * +RelatedDensels:: get_proj_data_info_ptr() const +{ + + return related_densels[0].get_proj_data_info_ptr(); +} +#endif + + +const DataSymmetriesForDensels* +RelatedDensels::get_symmetries_ptr() const +{ + return symmetries.get(); +} + + +RelatedDensels::iterator +RelatedDensels::begin() +{ return related_densels.begin();} + +RelatedDensels::iterator +RelatedDensels::end() +{return related_densels.end();} + +RelatedDensels::const_iterator +RelatedDensels::begin() const +{return related_densels.begin();} + +RelatedDensels::const_iterator +RelatedDensels::end() const +{return related_densels.end();} + + +END_NAMESPACE_STIR + diff --git a/src/include/stir/recon_buildblock/SPECTUB_Tools.h b/src/include/stir/recon_buildblock/SPECTUB_Tools.h new file mode 100644 index 0000000000..13e686e81f --- /dev/null +++ b/src/include/stir/recon_buildblock/SPECTUB_Tools.h @@ -0,0 +1,404 @@ +/* + Copyright (c) 2013, Biomedical Image Group (GIB), Universitat de Barcelona, Barcelona, Spain. + Copyright (c) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \author Carles Falcon +*/ + +#ifndef _WM_SPECTUB_H +#define _WM_SPECTUB_H + +#include +#include + +#include + +namespace SPECTUB { + +//::: srtuctures :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +//! collimator parameters structure +typedef struct +{ + int num; // number of collimator (see weight_64.cpp for options) + bool do_fb; // true: fanbeam collimator || false: parallel collimator + + //... parallel collimator parameters ..................... + + float A; // linear factor for dependency of sigma on distance: sigma=A*dist+B (parallel, fanbeam-vertical) + float B; // independent factor for dependency of sigma on distance: sigma=A*dist+B (parallel, fanbeam-vertical) + + //... fanbeam collimator parameters ...................... + + float F; // Focal length (fanbeam) + float L; // collimator to detector distance (?) (fanbeam) + float A_h; // linear factor for dependency of sigma on distance (fanbeam horizontal) + float A_v; // linear factor for dependency of sigma on distance (fanbeam horizontal) + float D; // collimator thicknes?? (fanbeam) + float w; // collimator thickness (?) (fanbeam) + float insgm; // intrinsic sigma (cristal resolution) (fanbeam) + +} collim_type; + +//! structure for bin information +typedef struct +{ + int Nrow; // number of rows + int Ncol; // number of columns + int Nsli; // number of slices + int Npix; // number of pixels (axial planes) + int Nvox; // number of voxels (the whole volume) + + int first_sl; // first slice to reconstruct (0->Nslic-1) + int last_sl; // last slice to reconstruct + 1 (end of the 'for' loop) (1->Nslic) + + float Nrowd2; // half of Nrow + float Ncold2; // half of Ncol + float Nslid2; // half of Nsli + + float Xcmd2; // Half of the size of the volume, dimension x (cm); + float Ycmd2; // Half of the size of the volume, dimension y (cm); + float Zcmd2; // Half of the size of the volume, dimension z (cm); + + float szcm; // voxel size (side length in cm) + float thcm; // voxel thickness (cm) + + float x0; // x coordinate (cm, ref center of volume) of the first voxel + float y0; // y coordinate (cm, ref center of volume) of the first voxel + float z0; // z coordinate (cm, ref center of volume) of the first voxel + + float *val; // array of values + +} volume_type; + + +//! structure for projection information +typedef struct +{ + int Nbin; // length of the detection line in bins (number of bins per line) + float lngcm; // length of the detection line in cm. + float szcm; // bin size in cm + + int Nsli; // number of slices + float thcm; // slice thickness in cm + + int Nang; // number of projection angles + float ang0; // initial projection angle. degrees from upper detection plane (parallel to table). Negative for CW rotacions (see manual) + float incr; // angle increment between two consecutive projection angles. Degrees. Negative for CW, Positive for CCW + + int NOS; // number of subsets in which to split the matrix + int NangOS; // Number of angles in each subset = Nang/NOS + int Nbp; // number of bins in a 2D projection=lng*Nsli + int Nbt; // total number of bins= Nbp*Nang + int NbOS; // total number of bins per subset= Nbp*NangOS = Nbt/NOS + int *order; // order of the angles of projection (array formed by indexs of angles belonging to consecutive subsets) + + float Nbind2; // length of the detection line (in bins) divided by 2 + float lngcmd2; // length of the detection line in cm divided by 2 + float Nslid2; // number of slices divided by 2 + +} proj_type; + +//! complementary information (matrix header) +typedef struct +{ + int subset_ind; // subset index of this matrix (-1: all subsets in a single file) + int *index; // included angles into this subset (index. Multiply by increm to get corresponding angles in degrees) + + float *Rrad; // Rotation radius (one value for each projection angle) + float min_w; // minimum weight to be taken into account + float psfres; // spatial resolution of continous distributions in PSF calculation + float maxsigm; // maximum number of sigmas in PSF calculation + + bool fixed_Rrad; // true: fixed radius of projection || false: variable radius of projection + bool do_psf; // true: to correct for PSF || false: do not correct for PSF + bool do_psf_3d; // true: 3d correction for PSF || false: 2d correction for PSF + bool predef_col; // true: predefined collimator || false: user defined PSF parametres + bool do_att; // true: to correct for attenuation || false: do not correct for attenuation + bool do_full_att; // true: diff att for each PSF bin || false: the whole PSF has the same att. factor (central line) + bool do_msk; // true: weights just inside msk || false: weights for the whole FOV + bool do_msk_slc; // true: weights for several slices || false: weights for all slices + bool do_msk_cyl; // true: to use cylinder as a mask || false: not to use cylinder as a mask + bool do_msk_att; // true: to use att map as a mask || false: not to use att map as a mask + bool do_msk_file; // true: explicit mask || false: not to use explicit mask + + std::string att_fn; // attenuation map filename + std::string msk_fn; // explicit mask filename + std::string col_fn; // collimator parameters filename + std::string Rrad_fn; // rotation radius file name + + volume_type vol; // + proj_type prj; // + collim_type COL; // collimator structure (see weight3d_64b.cpp for options) + +} wmh_type; + +//! weight_mat structure definition. Structure for reading weight matrix +typedef struct +{ + //weight matrix dimensions + + int ne; //nonzero elements + int NbOS; //dimension 1 (rows) of the weight matrix (NbOS or NBt) + int Nvox; //dimension 2 (columns) of the weight matrix (Nvox) + + //weight matrix values + + float *ar; //array of nonzero elements of weight matrix (by rows) + int *ja; //array of the column index of the above elements + int *ia; //array containing the indexes of the previous vector where a row change happens + + bool do_save_wmh; //to save or not to save weight_mat header info into weight_mat file + +} wm_type; + +//! weight_mat_da structure definition. Structure for generating weight matrix +typedef struct +{ + int NbOS; // dimension 1 (rows) of the weight matrix (NbOS or NBt) + int Nvox; // dimension 2 (columns) of the weight matrix (Nvox) + float **val; // double array to store weights (index of the projection element, number of weight for that element) + int **col; // double array to store column indexs of the above element (index of the projection element, number of weight for that element) + int *ne; // array indicating how many elements has been stored for each element of projection + + //... filename ............................................. + + std::string fn; // matrix base name (filename without extension index) + std::string OSfn; // matrix filename + std::string fn_hdr; // matrix header file name + + //... indexs for STIR format ............................... + + int *na, *nb, *ns; //indexs for projection elements (angle, bin, slice respec.) + short int *nx, *ny, *nz; //indexs for image elements (x,y,z) + + //... format ............................................... + + bool do_save_wmh; // to save or not to save weight_mat header info into weight_mat file + bool do_save_STIR; // to save weight matrix with STIR format + +} wm_da_type; + +//! structure for distribution function information +typedef struct +{ + int lng; // length (in discretization intervals) (odd number) + int lngd2; // half of the length (in discretization intervals) (lng-1)/2 + float res; // spatial resolution of distfunc (discretization interval) + float *val; // array of values + float *acu; // distribution function values (cumulative sum) + +} discrf_type; + +//! structure for PSF information +typedef struct +{ + int maxszb; // maximum size in bins (for allocation purposes) + + int di; // discretization interval (to reduce spatial resolution to bin resolution). (int: #points) + int *ind; // projection indexs for the bins of the PSF (horizontal) + int Nib; // actual number of bins forming the PSF (length of PSF in bins) + + float sgmcm; // sigma of the PSF in cm + float lngcm; // length of PSF (in cm) + float lngcmd2; // half of the length of PSF (in cm) + float *val; // array of values + float efres; // effective resolution (psfres rescaled to real psf length) + +} psf1d_type; + +//! structure for distribution function information +typedef struct +{ + int maxszb_h; // maximum size in bins horizontal (for allocation purposes) + int maxszb_v; // maximum size in bins vertical (for allocation purposes) + int maxszb_t; // maximum size in bins total (for allocation purposes) + + int *ib; // projection indexs for the bins of the PSF (horizontal) + int *jb; // projection indexs for the bins of the PSF (vertical) + int Nib; // actual number of bins forming the PSF (length of PSF in bins) + + float *val; // array of values + +} psf2da_type; + +//! structure to store angles values, indices and ratios +typedef struct +{ + int ind; // index of angle considering the whole set of projections (sequential order: 0->Nang-1) + int indOS; // index of angle considering the subjet + int iOS_proj; // index of the first bin for this angle (in subset of projections) + + float cos; // coninus of the angle + float sin; // sinus of the angle + + // parametres for describng the trapezoidal projection of a square voxel + + float p; // plateau higness + float m; // slope of the trapezoid + float n; // independent term of the slope + int N1; // index of the first vertice (end of plateau) in DX units + int N2; // index of the second vertice (end of the slope) in DX units + discrf_type vxprj; // projection of a square voxel in this direction (for no PSF) + + // variable rotation radius + + float Rrad ; // rotation radius for this angle + + // first bin position and increments + + float xbin0; // x coordinate for the first bin of the detection line corresponding to this angle + float ybin0; // y coordinate for the first bin of the detection line corresponding to this angle + float incx; // increment in x to the following bin in detection line + float incy; // increment in y to the following bin in detection line + +} angle_type; + + +//! structure for voxel information +typedef struct +{ + float szcm; // voxel size (side length in cm) + float thcm; // voxel thickness (cm) + + int irow; // row index + int icol; // column index + int islc; // slice index + int ip; // in plane index (considering the slice as an array) of the voxel + int iv; // volume index (considering the volume as an array) of the voxel + + float x; // x coordinate (cm, ref center of volume) + float y; // y coordinate (cm, ref center of volume) + float z; // z coordinate (cm, ref center of volume) + float x1; // x coordinade in rotated framework + + float dv2dp; // distance from voxel to detection plane + float costhe; // cosinus of theta (angle between focal-voxel line and line perpendicular to detection plane) (fanbeam) + float xdc; // distance (cm over detection line) from projected voxel to the center of the detection line + float xd0; // distance (cm over detection line) from projected voxel to the begin of the detection line + float zd0; // distance (cm) to the lowest plane of the volume + +} voxel_type; + +//! structure for bin information +typedef struct +{ + float szcm; // bin size (cm) + float szcmd2; // half of the above value + float thcm; // bin thickness (cm) + float thcmd2; // bin thickness (cm) + + float x; // x coordinate (cm, ref center of volume) + float y; // y coordinate (cm, ref center of volume) + float z; // z coordinate (cm, ref center of volume) + + float szdx; // bin size in resolution units + float thdx; // bin thickness in resolution units + +} bin_type; + +//! structure for attenuation calculus +typedef struct +{ + float *dl; // distance of attenuation path on each crossed voxel of the attenuation map + int *iv; // in-plane index (considering slices of attmap as an array) of any crossed voxel of the attenuation map + int lng; // number of elements in the attenuation path + int maxlng; // maximum number of elements in the attenuation path (for allocation) + +} attpth_type; + + +//::: functions ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + + +//... functions from wmtools_SPECT.cpp ......................................... + + +void write_wm_FC (); // to write double array weight matrix + +void write_wm_hdr (); // to write header of a matrix + +void write_wm_STIR (); // to write matrix in STIR format + + +void index_calc ( int *indexs ); // to calculate projection index order in subsets + +void read_Rrad (); // to read variable rotation radius from a text file (1 radius per line) + +// +//void col_params ( collim_type *COL ); // to fill collimator structure +// +//void read_col_params ( collim_type *COL); // to read collimator parameters from a file + + +void fill_ang ( angle_type *ang ); // to fill angle structure + +void generate_msk ( bool *msk_3d, bool *msk_2d, float *att, volume_type *vol); // to create a boolean mask for wm (no weights outside the msk) + +void read_msk_file ( bool * msk ); // to read mask from a file + + +void read_att_map ( float *attmap ); // to read attenuation map from a file + + +int max_psf_szb ( angle_type *ang ); + +float calc_sigma_h ( voxel_type vox, collim_type COL); + +float calc_sigma_v ( voxel_type vox, collim_type COL); + + +char *itoa ( int n, char *s); // to conver integer to ascii + +void free_wm ( wm_type *f ); // to free weight_mat + +void free_wm_da ( wm_da_type *f ); // to free weight_mat_da + + +void error_wmtools_SPECT(int nerr, std::string txt); // error messages in wm_SPECT + + +//... functions from wm_SPECT.2.0............................ + +//int wm_SPECT( std::string inputFile); + +// void error_wm_SPECT( int nerr, std::string txt); //list of error messages + +////void wm_inputs( std::string fileName, proj_type * prj, volume_type *vol, voxel_type *vox, bin_type *bin ); +//void wm_inputs(char **argv, +// int argc, +// proj_type *prj, +// volume_type *vol, +// voxel_type *vox, +// bin_type *bin); +// +// +////void read_inputs( std::string param, proj_type * prj, volume_type *vol, voxel_type *vox, bin_type *bin ); +//void read_inputs(vector param, +// proj_type *prj, +// volume_type *vol, +// voxel_type *vox, +//// bin_type *bin); +// +//extern wmh_type wmh; // weight matrix header. Global variable +// +//extern wm_da_type wm; // double array weight matrix structure. Global variable +// +//extern float * Rrad; // variable projection radius (in acquisition order) + +} // namespace SPECTUB + +#endif //_WM_SPECT_H diff --git a/src/include/stir/recon_buildblock/SPECTUB_Weight3d.h b/src/include/stir/recon_buildblock/SPECTUB_Weight3d.h new file mode 100644 index 0000000000..3595256d44 --- /dev/null +++ b/src/include/stir/recon_buildblock/SPECTUB_Weight3d.h @@ -0,0 +1,116 @@ + /* + Copyright (c) 2013, Biomedical Image Group (GIB), Universitat de Barcelona, Barcelona, Spain. + Copyright (c) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \author Carles Falcon + +*/ + +#ifndef _WEIGHT3D_SPECTUB_H +#define _WEIGHT3D_SPECTUB_H + +/*! \namespace SPECTUB + \brief Namespace for the SPECT library from University of Barcelona + + This namespace encompasses function to construct a projection matrix suitable for SPECT. + The integration of this library into STIR is described in + + Berta Marti Fuster, Carles Falcon, Charalampos Tsoumpas, Lefteris Livieratos, Pablo Aguiar, Albert Cot, Domenec Ros and Kris Thielemans, + Integration of advanced 3D SPECT modeling into the open-source STIR framework, + Med. Phys. 40, 092502 (2013); http://dx.doi.org/10.1118/1.4816676 + + \todo Variables wm, wmh and Rrad are currently global variables. This means that this code would be very dangerous + in a parallel setting. +*/ + +namespace SPECTUB { + +/* Global variables: the matrix etc TODO + Need to be defined elsewhere + + A lot of the functions below modify these variables. +*/ + extern wm_da_type wm; //! weight (or probability) matrix + extern wmh_type wmh; //! information to construct wm + extern float * Rrad; //! radii per view + + +void wm_calculation( const int kOS, + const angle_type *const ang, + voxel_type vox, + bin_type bin, + const volume_type& vol, + const proj_type& prj, + const float *attmap, + const bool *msk_3d, + const bool *msk_2d, + const int maxszb, + const discrf_type *const gaussdens, + const int *const NITEMS + ); + +void wm_size_estimation (int kOS, + const angle_type * const ang, + voxel_type vox, + bin_type bin, + const volume_type& vol, + const proj_type& prj, + const bool * const msk_3d, + const bool *const msk_2d, + const int maxszb, + const discrf_type * const gaussdens, + int *NITEMS); + + +//... geometric component ............................................ + +void calc_gauss ( discrf_type *gaussdens ); + +void calc_vxprj ( angle_type *ang ); + +void voxel_projection ( voxel_type *vox, float * eff, float lngcmd2 ); + +void fill_psf_no( psf2da_type *psf, psf1d_type *psf1d_h, const voxel_type& vox, const angle_type * const ang, float szdx ); + +void fill_psf_2d( psf2da_type *psf, psf1d_type *psf1d_h, const voxel_type& vox, discrf_type const*const gaussdens, float szdx ); + +void fill_psf_3d(psf2da_type *psf, + psf1d_type *psf1d_h, + psf1d_type *psf1d_v, + const voxel_type& vox, discrf_type const * const gaussdens, float szdx, float thdx, float thcmd2 ); + +void calc_psf_bin ( float center_psf, float binszcm, discrf_type const * const vxprj, psf1d_type *psf ); + + +//... attenuation................................................... + +// not used +//void size_attpth_simple( psf2da_type *psf, voxel_type vox, volume_type vol, float *att, angle_type *ang ); + +//void size_attpth_full( psf2da_type *psf, voxel_type vox, volume_type vol, float *att, angle_type *ang ); + +void calc_att_path ( const bin_type& bin, const voxel_type& vox, const volume_type& vol, attpth_type *attpth ); + +float calc_att ( const attpth_type *const attpth, const float *const attmap, int islc ); + +int comp_dist ( float dx, float dy, float dz, float dlast ); + + +void error_weight3d ( int nerr, const std::string& txt); // error messages in weight3d_SPECT + +} // napespace SPECTUB + +#endif diff --git a/src/include/stir/recon_buildblock/SumOfGeneralisedObjectiveFunctions.h b/src/include/stir/recon_buildblock/SumOfGeneralisedObjectiveFunctions.h new file mode 100644 index 0000000000..0340a1080f --- /dev/null +++ b/src/include/stir/recon_buildblock/SumOfGeneralisedObjectiveFunctions.h @@ -0,0 +1,126 @@ +// +// +/* + Copyright (C) 2005- 2008, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup recon_buildblock + \brief Declaration of class stir::SumOfGeneralisedObjectiveFunctions + + \author Kris Thielemans + +*/ + +#ifndef __stir_recon_buildblock_SumOfGeneralisedObjectiveFunctions_H__ +#define __stir_recon_buildblock_SumOfGeneralisedObjectiveFunctions_H__ + + +#include "stir/shared_ptr.h" +#include "stir/recon_buildblock/GeneralisedObjectiveFunction.h" +#include + +START_NAMESPACE_STIR + +/*! + \ingroup recon_buildblock + \brief + A base class for sums of 'generalised' objective functions, i.e. objective + functions for which at least a 'gradient' is defined. + \todo document why use of ParentT template + \todo doc subsets +*/ +template > +class SumOfGeneralisedObjectiveFunctions : + public ParentT +{ + typedef ParentT base_type; + typedef SumOfGeneralisedObjectiveFunctions self_type; +public: + + inline + SumOfGeneralisedObjectiveFunctions(); + + template + inline + SumOfGeneralisedObjectiveFunctions(IterT begin, IterT end); + + inline virtual + ~SumOfGeneralisedObjectiveFunctions(); + + template + inline + void set_functions(IterT begin, IterT end); + +#if 0 + //! Creates a suitable target as determined by the parameters + /*! \return construct_target_ptr() of the first term in the sum, or + 0 if there are no terms in the sum. + */ + inline virtual + TargetT * + construct_target_ptr() const; +#endif + + //! Has to be called before using this object + /*! Will call set_up() for all terms in the sum, but will stop as soon as + one set_up() fails. + */ + inline virtual + Succeeded + set_up(shared_ptr const& target_sptr); + + //! This computes the gradient of the unregularised objective function at the \a current_estimate + /*! It is computed as the sum of the subgradients for each term, depending on the subset scheme. + */ + inline virtual + void + compute_sub_gradient_without_penalty(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num); + + inline virtual + double + actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num); + + //! Attempts to change the number of subsets. + /*! \return The number of subsets that will be used later, which is not + guaranteed to be what you asked for. */ + inline virtual + int set_num_subsets(const int num_subsets) ; + +protected: + + typedef std::vector _functions_type; + typedef typename _functions_type::iterator _functions_iterator_type; + typedef typename _functions_type::const_iterator _functions_const_iterator_type; + _functions_type _functions; + //! Implementation of function that checks subset balancing + /*! + \todo doc subset + */ + inline virtual + bool actual_subsets_are_approximately_balanced(std::string& warning_message) const; +}; + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/SumOfGeneralisedObjectiveFunctions.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/SumOfGeneralisedObjectiveFunctions.inl b/src/include/stir/recon_buildblock/SumOfGeneralisedObjectiveFunctions.inl new file mode 100644 index 0000000000..7b861ac022 --- /dev/null +++ b/src/include/stir/recon_buildblock/SumOfGeneralisedObjectiveFunctions.inl @@ -0,0 +1,167 @@ +// +// +/* + Copyright (C) 2005- 2008, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup recon_buildblock + \brief Implementation of class stir::SumOfGeneralisedObjectiveFunctions + + \author Kris Thielemans + +*/ +#include "stir/Succeeded.h" +#include + +START_NAMESPACE_STIR +template +template +void +SumOfGeneralisedObjectiveFunctions:: +set_functions(IterT begin, IterT end) +{ + this->_functions.resize(0); + std::copy(begin, end, this->_functions.begin()); +} + +template +SumOfGeneralisedObjectiveFunctions:: +SumOfGeneralisedObjectiveFunctions() +{} + +template +template +SumOfGeneralisedObjectiveFunctions:: +SumOfGeneralisedObjectiveFunctions(IterT begin, IterT end) +{ + set_functions(begin, end); +} + +template +SumOfGeneralisedObjectiveFunctions:: +~SumOfGeneralisedObjectiveFunctions() +{} + + +#if 0 +// this fails, as _functions might only be balid after set_up +template +TargetT * +SumOfGeneralisedObjectiveFunctions:: +construct_target_ptr() const +{ + if (this->_functions.size() == 0) + return 0; + else + return this->_functions[0].construct_target_ptr(); +} +#endif + +template +Succeeded +SumOfGeneralisedObjectiveFunctions:: +set_up(shared_ptr const& target_sptr) +{ + if (base_type::set_up(target_sptr) != Succeeded::yes) + return Succeeded::no; + + _functions_iterator_type iter = this->_functions.begin(); + _functions_iterator_type end_iter = this->_functions.end(); + while (iter != end_iter) + { + if (iter->set_up(target_sptr) == Succeeded::no) + return Succeeded::no; + ++iter; + } + return Succeeded::yes; +} + +template +void +SumOfGeneralisedObjectiveFunctions:: +compute_sub_gradient_without_penalty(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) +{ + _functions_iterator_type iter = this->_functions.begin(); + _functions_iterator_type end_iter = this->_functions.end(); + while (iter != end_iter) + { + iter->compute_sub_gradient_without_penalty(gradient, + current_estimate, + subset_num); + + ++iter; + } +} + +template +double +SumOfGeneralisedObjectiveFunctions:: +actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num) +{ + _functions_iterator_type iter = this->_functions.begin(); + _functions_iterator_type end_iter = this->_functions.end(); + double result = 0; + while (iter != end_iter) + { + result += + iter->compute_objective_function_without_penalty(current_estimate, + subset_num); + + ++iter; + } + return result; +} + + +template +int +SumOfGeneralisedObjectiveFunctions:: +set_num_subsets(const int new_num_subsets) +{ + this->num_subsets = new_num_subsets; + _functions_iterator_type iter = this->_functions.begin(); + _functions_iterator_type end_iter = this->_functions.end(); + while (iter != end_iter) + { + // we could check if they all return the same num_subsets, but cannot be bothered now + if (iter->set_num_subsets(this->num_subsets) != this->num_subsets) + error("set_num_subsets failed to set to %d subsets", this->num_subsets); + ++iter; + } + return this->num_subsets; +} + +template +bool +SumOfGeneralisedObjectiveFunctions:: +actual_subsets_are_approximately_balanced(std::string& warning_message) const +{ + _functions_const_iterator_type iter = this->_functions.begin(); + _functions_const_iterator_type end_iter = this->_functions.end(); + while (iter != end_iter) + { + if (!iter->subsets_are_approximately_balanced(warning_message)) + return false; + ++iter; + } + return true; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/SymmetryOperation.h b/src/include/stir/recon_buildblock/SymmetryOperation.h new file mode 100644 index 0000000000..7e2424262e --- /dev/null +++ b/src/include/stir/recon_buildblock/SymmetryOperation.h @@ -0,0 +1,128 @@ +// +// +/*! + \file + \ingroup symmetries + + \brief Declaration of 2 classes: stir::SymmetryOperation and stir::TrivialSymmetryOperation + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_recon_buildblock_SymmetryOperation_H__ +#define __stir_recon_buildblock_SymmetryOperation_H__ + +#include "stir/common.h" + + +START_NAMESPACE_STIR + +template class BasicCoordinate; +class ViewSegmentNumbers; +class ProjMatrixElemsForOneBin; +class ProjMatrixElemsForOneDensel; +class Bin; + + +/*! + \ingroup buildblock + \brief Encodes symmetry operation on image coordinates and projection + data coordinates + + This class is mainly (only?) useful for ProjMatrix classes and their + 'users'. Together with DataSymmetriesForBins, it provides the basic + way to be able to write generic code without knowing which + particular symmetries the data have. + + Ideally, there would be no reference here to ProjMatrixElemsForOneBin, + but we have to do this for efficiency. Overriding the virtual function + will allow the compiler to inline the symmetry operations, resulting + in a dramatic speed-up. + + Price to pay (aside from some tedious repetition in the derived classes): + the need for a + SymmetryOperation::transform_proj_matrix_elems_for_one_bin member, + and hence knowledge of the ProjMatrixElemsForOneBin class + (This is the reason why the DataSymmetriesForBins* and + SymmetryOperation* classes are in recon_buildblock.) + + See recon_buildblock/SymmetryOperations_PET_CartesianGrid.cxx for + some more info. +*/ +class SymmetryOperation +{ +public: + virtual inline ~SymmetryOperation() {} + virtual inline bool is_trivial() const { return false;} + virtual void + transform_bin_coordinates(Bin&) const = 0; + virtual void + transform_view_segment_indices(ViewSegmentNumbers&) const = 0; + virtual void + transform_image_coordinates(BasicCoordinate<3,int>&) const = 0; +#if 0 + // would be useful at some point + virtual void + transform_incremental_image_coordinates(BasicCoordinate<3,int>&) const = 0; +#endif + + virtual void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +}; + + + +/*! + \ingroup symmetries + \brief A class implementing the trivial case where the symmetry operation + does nothing at all. +*/ +class TrivialSymmetryOperation : public SymmetryOperation +{ +public: + inline bool is_trivial() const { return true;} + inline void + transform_bin_coordinates(Bin& b) const {} + inline void + transform_view_segment_indices(ViewSegmentNumbers& n) const {} + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const {} + inline void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const {} + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const {} +}; + + +END_NAMESPACE_STIR + +//#include "stir/recon_buildblock/SymmetryOperation.inl" + +#endif diff --git a/src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.h b/src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.h new file mode 100644 index 0000000000..ff5d96a123 --- /dev/null +++ b/src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.h @@ -0,0 +1,573 @@ +// +// +/*! + + \file + \ingroup symmetries + + \brief Declaration of all symmetry classes for PET (cylindrical) scanners and cartesian images + + \see class stir::DataSymmetriesForBins_PET_CartesianGrid + + \warning These classes should only be used by the + stir::DataSymmetriesForBins_PET_CartesianGrid class. + + \warning It is strongly recommended not to derive from any of these + classes. If you do, you have to reimplement the + transform_proj_matrix_elems_for_one_bin() member, or the wrong + implementations will be called. + + All these classes have transform_proj_matrix_elems_for_one_bin() + members which essentially repeats just the default + implementation. This is for efficiency. See + recon_buildblock/SymmetryOperations_PET_CartesianGrid.cxx for + more info. + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#ifndef __SymmetryOperations_PET_CartesianGrid_H__ +#define __SymmetryOperations_PET_CartesianGrid_H__ + +#include "stir/recon_buildblock/SymmetryOperation.h" + +START_NAMESPACE_STIR + +class SymmetryOperation_PET_CartesianGrid_z_shift : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_z_shift self; +public: + SymmetryOperation_PET_CartesianGrid_z_shift(const int axial_pos_shift, const int z_shift) + : axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& ) const; + +private: + int axial_pos_shift; + int z_shift; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xmx_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmx_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmx_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + + +/////////////////////////////////////// + +class SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + + +class SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xmy_yx : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmy_yx self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(const int num_views, const int axial_pos_shift, const int z_shift) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; +}; + + +class SymmetryOperation_PET_CartesianGrid_swap_xy_yx : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xy_yx self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xy_yx(const int num_views, const int axial_pos_shift, const int z_shift) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; +}; + + + +class SymmetryOperation_PET_CartesianGrid_swap_xmx : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmx self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmx(const int num_views, const int axial_pos_shift, const int z_shift) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_ymy : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_ymy self; +public: + SymmetryOperation_PET_CartesianGrid_swap_ymy(const int num_views, const int axial_pos_shift, const int z_shift) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + }; + +class SymmetryOperation_PET_CartesianGrid_swap_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xy_ymx : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xy_ymx self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xy_ymx(const int num_views, const int axial_pos_shift, const int z_shift) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx(const int num_views, const int axial_pos_shift, const int z_shift) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_ymy_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_ymy_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_ymy_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy(const int num_views, const int axial_pos_shift, const int z_shift) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; +}; + +class SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq : public SymmetryOperation +{ +private: + typedef SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq self; +public: + SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq(const int num_views, const int axial_pos_shift, const int z_shift, const int q) + : view180(num_views), axial_pos_shift(axial_pos_shift), z_shift(z_shift), q(q) + {} + + inline void + transform_bin_coordinates(Bin&) const; + inline void + transform_view_segment_indices(ViewSegmentNumbers&) const; + inline void + transform_image_coordinates(BasicCoordinate<3,int>& c) const; + + void + transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const; + + + virtual void + transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel&) const; + +private: + int view180; + int axial_pos_shift; + int z_shift; + int q; +}; + + + +END_NAMESPACE_STIR + +#include "stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.inl" + + +#endif diff --git a/src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.inl b/src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.inl new file mode 100644 index 0000000000..5bcccd1213 --- /dev/null +++ b/src/include/stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.inl @@ -0,0 +1,611 @@ +// +// +/*! + + \file + \ingroup symmetries + + \brief Implementation of all symmetry classes for PET scanners and cartesian images + + \author Kris Thielemans + \author Mustapha Sadki + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* History: + KT 07/10/2001: + made sure that the resulting view_num is in the allowed range + use that an LOR at {theta,phi,m,s} is equal to the one at {-theta, phi+Pi,m, -s} + TODO, didn't do it for the _zq symmetries, as I don't need it there yet + */ + +#include "stir/BasicCoordinate.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/Bin.h" + +START_NAMESPACE_STIR + +void +SymmetryOperation_PET_CartesianGrid_z_shift:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; +} + +void +SymmetryOperation_PET_CartesianGrid_z_shift:: + transform_view_segment_indices(ViewSegmentNumbers& vs) const +{ +} + +void SymmetryOperation_PET_CartesianGrid_z_shift::transform_image_coordinates(BasicCoordinate<3,int>&c) const +{ + c[1] += z_shift; +} + +////////////////////////////////////////// + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.view_num() = view180 - b.view_num(); + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + c[3] = -c[3]; + c[1] = q - c[1] + z_shift; +} + +////////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.segment_num() *= -1; + b.view_num() += view180/2; + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = -c[2]; + c[2] = tmp; + c[1] = q - c[1] + z_shift; +} + +/////////////////////////////////////// + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.view_num() = view180/2 - b.view_num(); + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = c[2]; + c[2] = tmp; + c[1] = q - c[1] + z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_yx:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + if (b.view_num() < view180/2) + { + b.view_num() += view180/2; + } + else + { + b.segment_num() *= -1; + b.view_num() -= view180/2; + b.tangential_pos_num() *= -1; + } + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = -c[2]; + c[2] = tmp; + c[1] += z_shift; +} + +/////////////////////////////////////// +void +SymmetryOperation_PET_CartesianGrid_swap_xy_yx:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + if (b.view_num() <= view180/2) + { + b.segment_num() *= -1; + b.view_num() = view180/2 - b.view_num(); + } + else + { + b.view_num() = 3*view180/2 - b.view_num(); + b.tangential_pos_num() *= -1; + } + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = c[2]; + c[2] = tmp; + c[1] += z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + if (b.view_num()!=0) + { + b.segment_num() *= -1; + b.view_num() = view180 - b.view_num(); + } + else + { + b.tangential_pos_num() *= -1; + } + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + c[3] = -c[3]; + c[1] += z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_ymy:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + if (b.view_num()!=0) + { + b.view_num() = view180 - b.view_num(); + b.tangential_pos_num() *= -1; + } + else + { + b.segment_num() *= -1; + } + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + c[2] = -c[2]; + c[1] += z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.segment_num() *= -1; +} + +void +SymmetryOperation_PET_CartesianGrid_swap_zq:: + transform_view_segment_indices(ViewSegmentNumbers& vs) const +{ + vs.segment_num() *= -1; +} + + +void SymmetryOperation_PET_CartesianGrid_swap_zq::transform_image_coordinates(BasicCoordinate<3,int>&c) const +{ + c[1] = q - c[1] + z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.tangential_pos_num() *= -1; +} + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq:: + transform_view_segment_indices(ViewSegmentNumbers& vs) const +{ + +} + + +void SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq::transform_image_coordinates(BasicCoordinate<3,int>&c) const +{ + c[3] = -c[3]; + c[2] = -c[2]; + c[1] = q - c[1] + z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + if (b.view_num() < view180/2) + { + b.view_num() += view180/2; + b.tangential_pos_num() *= -1; + } + else + { + b.segment_num() *= -1; + b.view_num() -= view180/2; + } + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = c[2]; + c[2] = -tmp; + c[1] = q - c[1] + z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_ymx:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + if (b.view_num() < view180/2) + { + b.segment_num() *= -1; + b.view_num() += view180/2; + b.tangential_pos_num() *= -1; + } + else + { + b.view_num() -= view180/2; + } + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = c[2]; + c[2] = -tmp; + c[1] += z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + if (b.view_num() <= view180/2) + { + b.view_num() = view180/2 - b.view_num(); + b.tangential_pos_num() *= -1; + } + else + { + b.segment_num() *= -1; + b.view_num() = 3*view180/2 - b.view_num(); + } + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = -c[2]; + c[2] = -tmp; + c[1] += z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_ymy_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.segment_num() *= -1; + b.view_num() = view180 - b.view_num(); + b.tangential_pos_num() *= -1; + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + c[2] = -c[2]; + c[1] = q - c[1] + z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.segment_num() *= -1; + b.tangential_pos_num() *= -1; +} +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy:: + transform_view_segment_indices(ViewSegmentNumbers& vs) const +{ + vs.segment_num() *= -1; +} + +void SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy::transform_image_coordinates(BasicCoordinate<3,int>&c) const +{ + c[3] = -c[3]; + c[2] = -c[2]; + c[1] += z_shift; +} + +/////////////////////////////////////// + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq:: + transform_bin_coordinates(Bin& b) const +{ + b.axial_pos_num() += axial_pos_shift; + b.segment_num() *= -1; + b.view_num() = view180/2 - b.view_num(); + b.tangential_pos_num() *= -1; + assert(0<=b.view_num()); + assert(b.view_num()&c) const +{ + const int tmp = c[3]; + c[3] = -c[2]; + c[2] = -tmp; + c[1] = q - c[1] + z_shift; +} + +END_NAMESPACE_STIR diff --git a/src/include/stir/recon_buildblock/TrivialBinNormalisation.h b/src/include/stir/recon_buildblock/TrivialBinNormalisation.h new file mode 100644 index 0000000000..663cc10712 --- /dev/null +++ b/src/include/stir/recon_buildblock/TrivialBinNormalisation.h @@ -0,0 +1,64 @@ +// +// +/*! + \file + \ingroup normalisation + + \brief Declaration of class stir::TrivialBinNormalisation + + \author Kris Thielemans +*/ +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_TrivialBinNormalisation_H__ +#define __stir_recon_buildblock_TrivialBinNormalisation_H__ + +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +/*! + \ingroup normalisation + \brief Trivial class which does not do any normalisation whatsoever. + \todo Make sure that the keyword value \c None corresponds to this class. + +*/ +class TrivialBinNormalisation : + public RegisteredParsingObject +{ +public: + //! Name which will be used when parsing a BinNormalisation object + static const char * const registered_name; + + virtual inline void apply(RelatedViewgrams&,const double start_time, const double end_time) const {} + virtual inline void undo(RelatedViewgrams&,const double start_time, const double end_time) const {} + + virtual inline float get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const { return 1;} + + virtual inline bool is_trivial() const { return true;} + +private: + virtual inline void set_defaults() {} + virtual inline void initialise_keymap() {} + +}; + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/recon_buildblock/TrivialDataSymmetriesForBins.h b/src/include/stir/recon_buildblock/TrivialDataSymmetriesForBins.h new file mode 100644 index 0000000000..756f3cdf4f --- /dev/null +++ b/src/include/stir/recon_buildblock/TrivialDataSymmetriesForBins.h @@ -0,0 +1,97 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup symmetries + + \brief Declaration of class stir::TrivialDataSymmetriesForBins + + \author Kris Thielemans + +*/ +#ifndef __stir_recon_buildblock_TrivialDataSymmetriesForBins_H__ +#define __stir_recon_buildblock_TrivialDataSymmetriesForBins_H__ + +#include "stir/recon_buildblock/DataSymmetriesForBins.h" + +START_NAMESPACE_STIR + + +/*! + \ingroup symmetries + \brief A class derived from DataSymmetriesForBins that says that there are + no symmetries at all. + +*/ +class TrivialDataSymmetriesForBins : public DataSymmetriesForBins +{ +public: + TrivialDataSymmetriesForBins(const shared_ptr& proj_data_info_ptr); + + virtual +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + TrivialDataSymmetriesForBins +#else + DataSymmetriesForViewSegmentNumbers +#endif + * clone() const; + + virtual void + get_related_bins(vector&, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + + virtual void + get_related_bins_factorised(vector&, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const; + + virtual int + num_related_bins(const Bin& b) const; + + virtual auto_ptr + find_symmetry_operation_from_basic_bin(Bin&) const; + + virtual bool + find_basic_bin(Bin& b) const; + + virtual bool + is_basic(const Bin& v_s) const; + + virtual auto_ptr + find_symmetry_operation_from_basic_view_segment_numbers(ViewSegmentNumbers&) const; + + virtual void + get_related_view_segment_numbers(vector&, const ViewSegmentNumbers&) const; + + virtual int + num_related_view_segment_numbers(const ViewSegmentNumbers&) const; + virtual bool + find_basic_view_segment_numbers(ViewSegmentNumbers&) const; + +private: + virtual bool blindly_equals(const root_type * const) const; +}; + +END_NAMESPACE_STIR + + +#endif + diff --git a/src/include/stir/recon_buildblock/distributable.h b/src/include/stir/recon_buildblock/distributable.h new file mode 100644 index 0000000000..4b34075e48 --- /dev/null +++ b/src/include/stir/recon_buildblock/distributable.h @@ -0,0 +1,208 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_DISTRIBUTABLE_H__ +#define __stir_recon_buildblock_DISTRIBUTABLE_H__ + +/*! + \file + \ingroup distributable + + \brief Declaration of the main functions that perform parallel processing + + \author Alexey Zverovich + \author Kris Thielemans + \author Matthew Jacobson + \author Tobias Beisel + \author PARAPET project +*/ +#include "stir/shared_ptr.h" + +START_NAMESPACE_STIR + +template class RelatedViewgrams; +template class DiscretisedDensity; +class BinNormalisation; +class ProjData; +class ProjDataInfo; +class ExamInfo; +class DataSymmetriesForViewSegmentNumbers; +class ForwardProjectorByBin; +class BackProjectorByBin; +class ProjectorByBinPair; +class DistributedCachingInformation; + + +//! \name Task-ids currently understood by stir::DistributedWorker +/*! \ingroup distributable */ +//!@{ +const int task_stop_processing=0; +const int task_setup_distributable_computation=200; +const int task_do_distributable_gradient_computation=42; +const int task_do_distributable_loglikelihood_computation=43; +const int task_do_distributable_sensitivity_computation=44; +//!@} + +//! set-up parameters before calling distributable_computation() +/*! + \ingroup distributable + Empty unless STIR_MPI is defined, in which case it sends parameters to the + slaves (see stir::DistributedWorker). + + \todo currently uses some global variables for configuration in the distributed + namespace. This needs to be converted to a class, e.g. \c DistributedMaster +*/ +void setup_distributable_computation( + const shared_ptr& proj_pair_sptr, + const shared_ptr& exam_info_sptr, + const ProjDataInfo * const proj_data_info_ptr, + const shared_ptr >& target_sptr, + const bool zero_seg0_end_planes, + const bool distributed_cache_enabled); + +//! clean-up after a sequence of computations +/*! \ingroup distributable + Empty unless STIR_MPI is defined, in which case it sends the "stop" task to + the slaves (see stir::DistributedWorker) +*/ +void end_distributable_computation(); + +//! typedef for callback functions for distributable_computation() +/*! \ingroup distributable + Pointers will be NULL when they are not to be used by the callback function. + + \a count and \a count2 are normally incremental counters that accumulate over the loop + in distributable_computation(). + + \warning The data in *measured_viewgrams_ptr are allowed to be overwritten, but the new data + will not be used. +*/ +typedef void RPC_process_related_viewgrams_type ( + const shared_ptr& forward_projector_sptr, + const shared_ptr& back_projector_sptr, + DiscretisedDensity<3,float>* output_image_ptr, + const DiscretisedDensity<3,float>* input_image_ptr, + RelatedViewgrams* measured_viewgrams_ptr, + int& count, int& count2, double* log_likelihood_ptr, + const RelatedViewgrams* additive_binwise_correction_ptr, + const RelatedViewgrams* mult_viewgrams_ptr); + +/*! + \brief This function essentially implements a loop over segments and all views in the current subset. + \ingroup distributable + + Output is in output_image_ptr and in float_out_ptr (but only if they are not NULL). + What the output is, is really determined by the call-back function + RPC_process_related_viewgrams. + + If STIR_MPI is defined, this function distributes the computation over the slaves. + + Subsets are currently defined on views. A particular \a subset_num contains all views which are symmetry related to + \code + proj_data_ptr->min_view_num()+subset_num + n*num_subsets + \endcode + for n=0,1,,.. \c and for which the above view_num is 'basic' (for some segment_num in the range). + + Symmetries are determined by using the 3rd argument to set_projectors_and_symmetries(). + + \par Usage + + You first need to call setup_distributable_computation(), then you can do multiple calls + to distributable_computation() with different images (but the same projection data, as + this is potentially cached). If you want to change the image characteristics (e.g. + size, or origin so), you have to call setup_distributable_computation() again. Finally, + end the sequence of computations by a call to end_distributable_computation(). + + \param output_image_ptr will store the output image if non-zero. + \param input_image_ptr input when non-zero. + \param proj_data_ptr input projection data + \param read_from_proj_data if true, the \a measured_viewgrams_ptr argument of the call_back function + will be constructed using ProjData::get_related_viewgrams, otherwise + ProjData::get_empty_related_viewgrams is used. + \param subset_num the number of the current subset (see above). Should be between 0 and num_subsets-1. + \param num_subsets the number of subsets to consider. 1 will process all data. + \param min_segment_num Minimum segment_num to process. + \param max_segment_num Maximum segment_num to process. + \param zero_seg0_end_planes if true, the end planes for segment_num=0 in measured_viewgrams_ptr + (and additive_binwise_correction_ptr when applicable) will be set to 0. + \param double_out_ptr a potential double output parameter for the call back function (which needs to be accumulated). + \param additive_binwise_correction Additional input projection data (when the shared_ptr is not 0). + \param normalise_sptr normalisation pointer that, if non-zero, will be used to construct the "multiplicative" viewgrams + (by using normalise_sptr->undo() on viewgrams filled with 1) that are then passed to RPC_process_related_viewgrams. + This is useful for e.g. log-likelihood computations. + \param start_time_of_frame is passed to normalise_sptr + \param end_time_of_frame is passed to normalise_sptr + \param RPC_process_related_viewgrams function that does the actual work. + \param caching_info_ptr ignored unless STIR_MPI=1, in which case it enables caching of viewgrams at the slave side + \warning There is NO check that the resulting subsets are balanced. + + \warning The function assumes that \a min_segment_num, \a max_segment_num are such that + symmetries map this range onto itself (i.e. no segment_num is obtained outside the range). + This usually means that \a min_segment_num = -\a max_segment_num. This assumption is checked with + assert(). + + \todo The subset-scheme should be moved somewhere else (a Subset class?). + + \warning If STIR_MPI is defined, there can only be one set_up active, as the + slaves use only one set of variabiles to store projectors etc. + + \see DistributedWorker for how the slaves perform the computation if STIR_MPI is defined. + */ +void distributable_computation( + const shared_ptr& forward_projector_sptr, + const shared_ptr& back_projector_sptr, + const shared_ptr& symmetries_sptr, + DiscretisedDensity<3,float>* output_image_ptr, + const DiscretisedDensity<3,float>* input_image_ptr, + const shared_ptr& proj_data_ptr, + const bool read_from_proj_data, + int subset_num, int num_subsets, + int min_segment_num, int max_segment_num, + bool zero_seg0_end_planes, + double* double_out_ptr, + const shared_ptr& additive_binwise_correction, + const shared_ptr normalise_sptr, + const double start_time_of_frame, + const double end_time_of_frame, + RPC_process_related_viewgrams_type * RPC_process_related_viewgrams, + DistributedCachingInformation* caching_info_ptr); + + + /*! \name Tag-names currently used by stir::distributable_computation and related functions0 + \ingroup distributable + */ + //!@{ + const int AVAILABLE_NOTIFICATION_TAG=2; + const int END_ITERATION_TAG=3; + const int END_RECONSTRUCTION_TAG=4; + const int END_NOTIFICATION_TAG=5; + const int BINWISE_CORRECTION_TAG=6; + const int BINWISE_MULT_TAG=66; + const int REUSE_VIEWGRAM_TAG=10; + const int NEW_VIEWGRAM_TAG=11; + const int USE_DOUBLE_ARG_TAG=70; + const int USE_OUTPUT_IMAGE_ARG_TAG=71; + + //!@} + + +END_NAMESPACE_STIR + +#endif // __stir_recon_buildblock_DISTRIBUTABLE_H__ + diff --git a/src/include/stir/recon_buildblock/distributableMPICacheEnabled.h b/src/include/stir/recon_buildblock/distributableMPICacheEnabled.h new file mode 100644 index 0000000000..fc0ecd046b --- /dev/null +++ b/src/include/stir/recon_buildblock/distributableMPICacheEnabled.h @@ -0,0 +1,86 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_DISTRIBUTABLEMPI_H__ +#define __stir_recon_buildblock_DISTRIBUTABLEMPI_H__ + +/*! + \file + \ingroup distributable + + \brief Declaration of the main function that performs parallel processing + + \author Alexey Zverovich + \author Kris Thielemans + \author Matthew Jacobson + \author PARAPET project + \author Tobias Beisel + +*/ +#include "stir/recon_buildblock/distributable.h" + +START_NAMESPACE_STIR + +class DistributedCachingInformation; + + +//!@{ +//! \ingroup distributable + + +/*! + \brief This function essentially implements a loop over segments and all views in the current subset in the parallel case + + This provides the same functionality as distributable_computation(), but enables caching of + RelatedViewgrams such that they don't need to be sent multiple times. + + \warning Do not call this function directly. Use distributable_computation() instead. + \todo Merge this functionality into distributable_computation() + + \internal + */ +void distributable_computation_cache_enabled( + const shared_ptr& forward_projector_ptr, + const shared_ptr& back_projector_ptr, + const shared_ptr& symmetries_ptr, + DiscretisedDensity<3,float>* output_image_ptr, + const DiscretisedDensity<3,float>* input_image_ptr, + const shared_ptr& proj_data_sptr, + const bool read_from_proj_data, + int subset_num, int num_subsets, + int min_segment_num, int max_segment_num, + bool zero_seg0_end_planes, + double* double_out_ptr, + const shared_ptr& additive_binwise_correction, + const shared_ptr normalise_sptr, + const double start_time_of_frame, + const double end_time_of_frame, + RPC_process_related_viewgrams_type * RPC_process_related_viewgrams, + DistributedCachingInformation* caching_info_ptr + ); + + +void test_image_estimate(shared_ptr > input_image_ptr); +//!@} + +END_NAMESPACE_STIR + +#endif // __stir_recon_buildblock_DISTRIBUTABLEMPI_H__ + diff --git a/src/include/stir/recon_buildblock/distributable_main.h b/src/include/stir/recon_buildblock/distributable_main.h new file mode 100644 index 0000000000..a190a4d7b8 --- /dev/null +++ b/src/include/stir/recon_buildblock/distributable_main.h @@ -0,0 +1,67 @@ +// +// +/* + Copyright (C) 2011- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_DISTRIBUTABLE_main_H__ +#define __stir_recon_buildblock_DISTRIBUTABLE_main_H__ + +/*! + \file + \ingroup distributable + + \brief Declaration of the stir::distributable_main function + + \author Kris Thielemans + \author Alexey Zverovich + \author PARAPET project +*/ +#include "stir/common.h" + +START_NAMESPACE_STIR + +//!@{ +//! \ingroup distributable + +//! main function that starts processing on the master or slave as appropriate +/*! This function should be implemented by the application, replacing the usual ::main(). + + DistributedWorker.cxx provides a ::main() function that will set-up everything for + parallel processing (as appropriate on the master and slaves), and then calls + distributable_main() on the master (passing any arguments along). + + If STIR_MPI is not defined, ::main() will simply call distributable_main(). + + Skeleton of a program that uses this module: + \code + #include "stir/recon_buildblock/distributable_main.h" + + int stir::distributable_main(int argc, char** argv) + { + // master node code goes here + } + \endcode + +*/ +int distributable_main(int argc, char **argv); + +//!@} + +END_NAMESPACE_STIR + +#endif // __stir_recon_buildblock_DISTRIBUTABLE_main_H__ + diff --git a/src/include/stir/recon_buildblock/distributed_functions.h b/src/include/stir/recon_buildblock/distributed_functions.h new file mode 100644 index 0000000000..c328b1aa8a --- /dev/null +++ b/src/include/stir/recon_buildblock/distributed_functions.h @@ -0,0 +1,442 @@ +/* + Copyright (C) 2007 - 2011/03/02, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_DistributedFunctions_h__ +#define __stir_recon_buildblock_DistributedFunctions_h__ + +/*! + \file + \ingroup distributable + + \brief Declaration of functions in the distributed namespace + + \author Tobias Beisel + \author Kris Thielemans +*/ + +/*! + \namespace distributed + \brief Namespace for distributed computation with MPI + + This is a collection of functions to send and receive objects and data + needed for distributed computation with MPI. They all come in a separate + namespace "distributed". There was no need to have an object providing this + functionality as that would have been more costly. + + Note that every send function has a corresponding receive function. + + \see STIR_MPI + \see STIR_MPI_TIMINGS + + Compilation instructions are in the Users Guide. +*/ +#ifdef DOXYGEN_SKIP +// need to define the following to get the documentation +#define STIR_MPI +#define STIR_MPI_TIMINGS +#endif +/*! + \def STIR_MPI + \brief Precompiler-define that needs to be set to enable the parallel version of stir::distributable_computation */ + +/*! + \def STIR_MPI_TIMINGS + \brief Precompiler-define that needs to be set to enable timings in the parallel version of stir::distributable_computation. + + The functions in the distributable namespace can include run-time + measurements included which print times from start to end of a single + Send or Receive command. This will uncover some maybe unnecessary long waiting times. + It was actually used while developing the parallel version to check whether some code + rearrangements would lead to faster computation. + To enable these timings, compile the MPI-Version with the preprocessor variable + STIR_MPI_TIMINGS defined. + + If compiled with STIR_MPI_TIMINGS defined, you still have the possibility to enable/disable the timings by + using the parsing parameter (for stir::stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData). + \verbatim + enable message timings := 1 + \endverbatim + To give the printed times a threshold use + \verbatim + message timings threshold := 0.1 + \endverbatim +*/ + +#include "mpi.h" +#include "stir/shared_ptr.h" +#include "stir/recon_buildblock/ProjectorByBinPair.h" +#include "stir/DiscretisedDensity.h" +#include "stir/RelatedViewgrams.h" +#include "stir/Viewgram.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ProjDataInfo.h" + +namespace stir { + class ExamInfo; +} + +namespace distributed +{ + /*! \name Global variables used for STIR_MPI + */ + //@{ + //!the number of processes used for distributed computation + extern int num_processors; + + //!some stuff in distributable_computation needs to be done only in the first iteration + extern bool first_iteration; + + //!enable/disable tests + extern bool test; + + //for timings + extern bool rpc_time; //!enable timings for PRC_process_related_viewgrams_gradient() computation + extern bool test_send_receive_times; //!enable timings for every single send/receive operation + + extern double total_rpc_time; //!adding up the time used for PRC_process_related_viewgrams_gradient() computation at all slaves + extern double total_rpc_time_2; //!adding up the time used for PRC_process_related_viewgrams_gradient() computation at a single slave + extern double total_rpc_time_slaves; //!value to reduce the total_rpc_time values + extern double min_threshold; //!threshold for displaying send/receive times, initially set to 0.1 seconds + + + //----------------------Send operations---------------------------------- + + /*! \brief sends or broadcasts an integer value + * \param value the int value to be sent + * \param destination the process id where to send the interger value. If set to -1 a Broadcast will be done + */ + void send_int_value(int value, int destination); + + + /*! \brief sends or broadcasts a string + * \param str the string to be sent + * \param tag identifier to associate messages + * \param destination the process id where to send the string. If set to -1 a Broadcast will be done + */ + void send_string(const string& str, int tag, int destination); + + + /*! \brief send or broadcast a bool value + * \param value the bool value to be sent + * \param tag identifier to associate messages. If the tag is -1 a Broadcast will be done + * \param destination the process id where to send the bool value. If set to -1 a Broadcast will be done + * + * This function actually sends an integer value (0 or 1) as there is no bool datatype in MPI + */ + void send_bool_value(bool value, int tag, int destination); + + + /*! \brief sends or broadcasts some integer values + * \param values pointer to integer values to be sent + * \param count the count of integer values to be sent + * \param tag identifier to associate messages + * \param destination the process id where to send the int values. If set to -1 a Broadcast will be done + */ + void send_int_values(int * values, int count, int tag, int destination); + + + /*! \brief send or broadcast double values + * \param values pointer to the double values to be sent + * \param count the count of double values to be sent + * \param tag identifier to associate messages + * \param destination the process id where to send the double values. If set to -1 a Broadcast will be done + */ + void send_double_values(double * values, int count, int tag, int destination); + + /*! \brief send or broadcast ViewSegmentNumbers object + * \param vs_num value to be sent + * \param tag identifier to associate messages + * \param destination the process id where to send the double values. If set to -1 a Broadcast will be done + */ + void send_view_segment_numbers(const stir::ViewSegmentNumbers& vs_num, int tag, int destination); + + /*! \brief send or broadcast a projector-pair object + * \param proj_pair_sptr value to be sent + * \param destination the process id where to send the double values. If set to -1 a Broadcast will be done + * + * \warning This function works by sending the parameter_info. Therefore, if file-names are used (e.g. for + * a projection matrix on disk) this will only work on systems with shared file systems. + */ + void send_projectors(const stir::shared_ptr &proj_pair_sptr, int destination); + + /*! \brief sends or broadcasts the parameters of a DiscretisedDensity object + * \param input_image_ptr the image_ptr to be sent + * \param tag identifier to associate messages + * \param destination the process id where to send the image parameters. If set to -1 a Broadcast will be done + * + * This function sends all parameters needed to construct a corresponding image object at the + * slave. The image values are sent separately. This is done, as sending the parameters is not + * needed everytime the values are sent. The slave needs to receive the current_image_estimate + * every iteration, but he already knows the parameters. + * + * The actual parameters sent are the image dimensions, the origin and the grid_spacing + */ + void send_image_parameters(const stir::DiscretisedDensity<3,float>* input_image_ptr, int tag, int destination); + + + /*! \brief sends or broadcasts the values of a DiscretisedDensity object + * \param input_image_ptr the image_ptr to be sent + * \param destination the process id where to send the image values. If set to -1 a Broadcast will be done + * + * This function sends the values of an image. The values are serialized to a one-dimensional array + * as MPI only sends that kind of data structures. + */ + void send_image_estimate(const stir::DiscretisedDensity<3,float>* input_image_ptr, int destination); + + + /*! \brief sends or broadcasts the information from ExamInfo and ProjDataInfo + * \param exam_info the ExamInfo pointer to be sent + * \param proj_data_info the ProjDataInfo pointer to be sent + * \param destination the process id where to send the values. If set to -1 a Broadcast will be done + * + * For sending the objects a rather "dirty trick" is used: + * Instead of sending all needed data for constructing the objects, + * the information is temporarily stored as ProjDataInterfile and then buffered + * as text from the file. Afterwards, that is sent to the slave. + * + * Doing this, the slave is able to construct the objects by using the received information. + * The sent char-array is used as stream-input to the parse() function of InterfileHeader. + * + * \warning Creates a temporary Interfile header in the local working directory. + */ + void send_exam_and_proj_data_info(const stir::ExamInfo& exam_info, const stir::ProjDataInfo& proj_data_info, int destination); + + + /*! \brief sends a RelatedViegrams object + * \param viewgrams the viewgrams to be sent + * \param destination the process id where to send the related viewgrams + * + * This function iterates through the relatedviewgrams object and calls \c send_viewgram() + * for each comprised viewgram. + * The only value sent is the count of viewgrams contained within the related_viewgrams object + * to make sure that the worker knows how many viewgrams he has to receive. + */ + void send_related_viewgrams(stir::RelatedViewgrams* viewgrams, int destination); + + + /*! \brief sends a Viewgram object + * \param viewgram the viewgrams to be sent + * \param destination the process id where to send the viewgram + * + * This function sends all parameters needed for the construction of the viewgram at the worker, + * as well as the actual values of the viewgram. That would mean that 2 Messages are sent: + * 1. The dimensions of the viewgram and the vs_num + * 2. The values detwermined by iterating through the viewgram and serializing it to a one-dimensional array + */ + void send_viewgram(const stir::Viewgram& viewgram, int destination); + + + //----------------------Receive operations---------------------------------- + + + /*! \brief receives a single integer value + * \param source the process id from which to receive the interger value. If set to -1 the receive will be done from broadcast + * \returns the received int value + */ + int receive_int_value(int source); + + + /*! \brief receives a string + * \param tag unique identifier to associate messages + * \param source the process id from which to receive the string + * \returns the received string + */ + string receive_string(int tag, int source); + + + /*! \brief receives all needed information to subsequently construct a ProjectorByBinPair object + * \param projector_pair_ptr address pointer of the new ProjectorByBinPair pointer + * \param source the process id from which to receive the ProjectorByBinPair + * + * First the registered_name string of the ProjectorByBinPair is received. + * Then the parameter_info() of the masters ProjectorByBinPair is received. + * Using the registered_name and the parameter_info() as stream, both can be used as + * input to the read_registered_object function, which then constructs the new ProjectorByBinPair pointer. + * + * The passed address pointer parameter will then be redirected to the address of ProjectorByBinPair created + * using the received parameters. + */ + void receive_and_initialize_projectors(stir::shared_ptr &projector_pair_ptr, int source); + + + /*! \brief receives a bool value + * \param tag unique identifier to associate messages + * \param source the process id from which to receive the bool value + * \returns the received bool value + * + * This function actually receives an integer value (0 or 1) + * as there is no bool datatype in MPI, but it will return a bool value + */ + bool receive_bool_value(int tag, int source); + + + /*! \brief receives some integer values + * \param values pointer to the receive buffer + * \param count the count of integer values to be received + * \param tag identifier to associate messages + * \returns MPI_Status object to query the source of the message + * + * The tag needs to be set to ARBITRARY_TAG (=8) if MPI_ANY_TAG shall be used + */ + MPI_Status receive_int_values(int * values, int count, int tag); + + + /*! \brief receives some double values + * \param values pointer to the receive buffer + * \param count the count of double values to be received + * \param tag identifier to associate messages + * \returns MPI_Status object to query the source of the message + * + * The tag needs to be set to ARBITRARY_TAG (=8) if MPI_ANY_TAG shall be used + */ + MPI_Status receive_double_values(double* values, int count, int tag); + + /*! \brief receive a ViewSegmentNumbers object + * \param[out] vs_num value that will be set + * \param tag identifier to associate messages + * \returns MPI_Status object to query the source of the message + * + * The tag needs to be set to ARBITRARY_TAG (=8) if MPI_ANY_TAG shall be used + */ + MPI_Status receive_view_segment_numbers(stir::ViewSegmentNumbers& vs_num, int tag); + + /*! \brief receives the parameters of a DiscretisedDensity object + * \param image_ptr address pointer of the new DiscretisedDensity + * \param buffer saves the image buffer size to be reused when receiving the image values + * \param tag identifier to associate messages. If set to -1 a Broadcast will be done + * \param source the process id from which to receive the image parameters. + * + * This function receives all parameters needed to construct an image object at the + * slave. The image values are sent separately. + * + * The actual parameters received are the image dimensions, the origin and the grid_spacing + * + * The function currently only supports VoxelsOnCartesianGrid + */ + void receive_and_set_image_parameters(stir::shared_ptr > &image_ptr, int &buffer, int tag, int source); + + + /*! \brief receives the values of a DiscretisedDensity object + * \param image_ptr the image_ptr to be sent + * \param buffer_size gives the needed size of the receive buffer + * \param source the process id from which to receive the image values. + * \returns MPI_Status object to query the source of the message + * + * The image_ptr is filled by iterating through the target pointer and copying + * the single values from the receive buffer. + * + * The buffer_size is used again to reduce the image values + */ + MPI_Status receive_image_values_and_fill_image_ptr(stir::shared_ptr > &image_ptr, int buffer_size, int source); + + + /*! \brief receives information of ExamInfo and ProjDataInfo objects and constructs new ones from it + * \param exam_info_sptr the new ExamInfo pointer to be set up + * \param proj_data_info_sptr the new ProjDataInfo pointer to be set up + * \param source the process id from which to receive from + * + * The parameter info is received as a Interfile Header string. That way the slave is able + * to construct a ProjDataInfo within a InterfilePDFSHeader using the received + * char-array as stream-input to the parse() function of InterfilePDFSHeader. + */ + void receive_and_construct_exam_and_proj_data_info_ptr(stir::shared_ptr& exam_info_sptr, + stir::shared_ptr& proj_data_info_sptr, + int source); + + + /*! \brief receives and constructs a RelatedViewgrams object + * \param viewgrams object that will be filled with the data + * \param proj_data_info_ptr the ProjDataInfo pointer describing the data + * \param symmetries_sptr the symmetries pointer constructed when setting up the projectors + * \param source the process id from which to receive the ProjDataInfo + * + * First of all it is important to notice, that this function is not independent. To construct + * a new RelatedViegrams object, the symmetries_ptr must be available. That would mean, + * that the slave has to call \c receive_and_initialize_projectors() to set up the symmetries_ptr + * before the related_vewgrams can be received. + * Additionally the ProjDataInfo-pointer must be available for receiving a single viewgrams. + * That implies calling \c receive_and_construct_proj_data_info_ptr() before. + * To make this function independent, both of these objects have to be sent here. On the other hand + * that would lead to the overhead of sending it everytime a related_viewgram is sent, + * which is really expensive. + * + * This function receives the count of viewgrams to be received and calls + * \c receive_and_construct_viewgram that often. Every received viewgram is pushed back + * to a viewgram vector, which afterwards is used with the symmetries to construct + * a RelatedViewgrams object. + */ + void receive_and_construct_related_viewgrams(stir::RelatedViewgrams*& viewgrams, + const stir::shared_ptr& proj_data_info_ptr, + const stir::shared_ptr symmetries_sptr, + int source); + + /*! \brief receives a Viewgram object + * \param viewgram the viewgrams to be constructed + * \param proj_data_info_ptr the ProjDataInfo pointer describing the data + * \param source the process id from which to receive the ProjDataInfo + * + * This function received all parameters needed for the construction of the viewgram at the worker, + * as well as the actual values of the viewgram. That would mean that 2 Messages are received: + * 1. The dimensions of the viewgram and the vs_num + * 2. The values of the viewgram + * + * The buffer_size needed to receive the values is calculated from the dimensions received. + * The viewgram is filled by iterating througn it and copying the values of the received values. + */ + void receive_and_construct_viewgram(stir::Viewgram*& viewgram, + const stir::shared_ptr& proj_data_info_ptr, + int source); + + //-----------------------reduce operations------------------------------------- + + /*! \brief the function called by the master to reduce the output image + * \param output_image_ptr the image pointer where the reduced image is saved + * \param destination the process id where the output_image is reduced + */ + void reduce_received_output_image(stir::DiscretisedDensity<3,float>* output_image_ptr, int destination); + + /*! \brief the function called by the slaves to reduce the output image + * \param output_image_ptr the image pointer where the reduced image is saved + * \param image_buffer_size the buffer size needed for the image + * \param my_rank rank of the slave, only used for screen output + * \param destination the process id where the output_image is reduced + * + * The buffer size was calculated in \c receive_image_values_and_fill_image_ptr(). + * Alternatively it can be calculated by the image parameters. + */ + void reduce_output_image(stir::shared_ptr > &output_image_ptr, int image_buffer_size, int my_rank, int destination); + + /*! \name Tag-names currently used by functions in the distributed namespace + */ + //!@{ + const int INT_TAG=7; + const int ARBITRARY_TAG=8; //!< special tag, equivalent to MPI_ANY_TAG in some functions + const int STIR_MPI_CONF_TAG=9; + const int IMAGE_ESTIMATE_TAG=23; + const int IMAGE_PARAMETER_TAG=24; + const int VIEWGRAM_DIMENSIONS_TAG=27; + const int VIEWGRAM_TAG=28; + const int VIEWGRAM_COUNT_TAG=29; + const int PROJECTION_DATA_INFO_TAG=30; + const int PARAMETER_INFO_TAG=21; + const int REGISTERED_NAME_TAG=25; + //!@} +} + +#endif + diff --git a/src/include/stir/recon_buildblock/distributed_test_functions.h b/src/include/stir/recon_buildblock/distributed_test_functions.h new file mode 100644 index 0000000000..cd7b230f81 --- /dev/null +++ b/src/include/stir/recon_buildblock/distributed_test_functions.h @@ -0,0 +1,104 @@ +// +// +/* + Copyright (C) 2007- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_recon_buildblock_DistributedTestFunctions_h__ +#define __stir_recon_buildblock_DistributedTestFunctions_h__ + +/*! + \file + \ingroup distributable + + \brief Declaration of test functions for the distributed namespace + + This is a collection of functions to test the function implemented + in DistributedFunction.cxx . Each of the possible tests consists of a + master and a slave function to be called by different processes. + + Note that every master function has a corresponding slave function. + + \todo Currently no independent test functions are implemented. The tests are used + by embedding them into the reconstruction functions and calling them once. + + This is only done in debug mode and can be enabled/disabled with the following + parsing parameter: + \verbatim + enable distributed tests := 1 + \endverbatim + The default value is 0. + + This obviously not a good way to do testing, so there is a need to write independent + test functions. The problem with that is, that all needed objects have to be set up. + The function headers give an idea of what would have to be constructed. + + \author Tobias Beisel + +*/ + + +#include "mpi.h" +#include "stir/shared_ptr.h" +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +#include "stir/DiscretisedDensity.h" +#include "stir/RelatedViewgrams.h" +#include "stir/Viewgram.h" +#include "stir/ProjDataInfo.h" +#include +#include +#include + +namespace distributed +{ + //-----------------------test functions------------------------------------------ + + + void test_viewgram_slave(const stir::shared_ptr& proj_data_info_ptr); + + void test_viewgram_master(stir::Viewgram viewgram, const stir::shared_ptr& proj_data_info_ptr); + + void test_image_estimate_master(const stir::DiscretisedDensity<3,float>* input_image_ptr, int slave); + + void test_image_estimate_slave(); + + void test_related_viewgrams_master(const stir::shared_ptr& proj_data_info_ptr, + const stir::shared_ptr symmetries_sptr, + stir::RelatedViewgrams* y, int slave); + + void test_related_viewgrams_slave(const stir::shared_ptr& proj_data_info_ptr, + const stir::shared_ptr symmetries_sptr + ); + + void test_parameter_info_master(const string str, int slave, char const * const text); + + void test_parameter_info_slave(const string str); + + void test_bool_value_master(bool value, int slave); + + void test_bool_value_slave(); + + void test_int_value_master(int value, int slave); + + void test_int_value_slave(); + + void test_int_values_master(int slave); + + void test_int_values_slave(); +} + +#endif + diff --git a/src/include/stir/round.h b/src/include/stir/round.h new file mode 100644 index 0000000000..c3e9c44c53 --- /dev/null +++ b/src/include/stir/round.h @@ -0,0 +1,100 @@ +// +// +/* + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_round_H__ +#define __stir_round_H__ +/*! + \file + \ingroup buildblock + + \brief Declaration of the stir::round functions + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ +#include "stir/BasicCoordinate.h" + +START_NAMESPACE_STIR +/*! + \ingroup buildblock + \name Functions for rounding floating point numbers + */ + //@{ + +//! Implements rounding of floating point numbers +/*! + + round() has the property that + \code + round(x) == -round(-x) + \endcode + The usual (int)(x+.5) has machine dependent behaviour for + negative numbers. + + .5 is rounded to 1 (and hence -.5 to -1). + + \warning There is no check on overflow (i.e. if \a x is too + large to fit in an \c int). +*/ +inline int round(const float x); +//! Implements rounding of double numbers +/*! + \see round(const float) +*/ +inline int round(const double x); + +//! Implements rounding of a BasicCoordinate object +/*! + \see round(const float) +*/ +template +inline BasicCoordinate +round(const BasicCoordinate& x); + + +//! Implements rounding of floating point numbers to other integer types +/*! + This function is templated in the output type for convenience of implementation. + + \warning if an unsigned type is used for \c integerT, the result for negative \a x + will be system dependent + + \see round(const float) + + \todo add code to check that \c integerT is really an integer type at compilation time + */ +template +inline void +round_to(integerT& result, const float x); + +//! Implements rounding of a BasicCoordinate object to other integer types +/*! \see round_to(integerT, float) + */ +template +inline void +round_to(BasicCoordinate& result, + const BasicCoordinate& x); + +//@} + +END_NAMESPACE_STIR + +#include "stir/round.inl" + +#endif diff --git a/src/include/stir/round.inl b/src/include/stir/round.inl new file mode 100644 index 0000000000..7a7da9f5ed --- /dev/null +++ b/src/include/stir/round.inl @@ -0,0 +1,103 @@ +// +// +/*! + \file + \ingroup buildblock + + \brief Implementation of the stir::round functions + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ +/* + Copyright (C) 2000- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +START_NAMESPACE_STIR + +template +inline void +round_to(integerT& result, const float x) +{ + if (x>=0) + result = static_cast(x+0.5F); + else + result = -static_cast(-x+0.5F); +} + + +template +inline void +round_to(integerT& result, const double x) +{ + if (x>=0) + result = static_cast(x+0.5); + else + result = -static_cast(-x+0.5); +} + +/* next 2 are just to avoid compiler warnings about using - on an unsigned type */ +inline void +round_to(unsigned& result, const double x) +{ + result = static_cast(x+0.5); +} + +inline void +round_to(unsigned long& result, const double x) +{ + result = static_cast(x+0.5); +} + +/* could be implemented in terms of the above */ +int round(const float x) +{ + if (x>=0) + return static_cast(x+0.5F); + else + return -static_cast(-x+0.5F); +} + +int round(const double x) +{ + if (x>=0) + return static_cast(x+0.5); + else + return -static_cast(-x+0.5); +} + +template +BasicCoordinate +round(const BasicCoordinate& x) +{ + BasicCoordinate rnd_x; + for(int i=1;i<=num_dimensions;++i) + rnd_x[i]=round(x[i]); + return rnd_x; +} + +template +inline void +round_to(BasicCoordinate& result, + const BasicCoordinate& x) +{ + for(int i=1;i<=num_dimensions;++i) + round_to(result[i], x[i]); +} + +END_NAMESPACE_STIR + diff --git a/src/include/stir/scale_sinograms.h b/src/include/stir/scale_sinograms.h new file mode 100644 index 0000000000..ba2f724ada --- /dev/null +++ b/src/include/stir/scale_sinograms.h @@ -0,0 +1,66 @@ +// +// +/* + Copyright (C) 2004 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projdata + \brief declaration of stir::scale_sinograms and stir::get_scale_factors_per_sinogram + + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ +#include "stir/Array.h" + +START_NAMESPACE_STIR +class ProjData; +class Succeeded; + +//! apply a scale factor for every sinogram +/*! \ingroup projdata + \param[out] output_proj_data is were the new sinograms will be stored + \param[in] input_proj_data input + \param[in] scale_factors_per_sinogram array with the scale factors. The first index + corresponds to segments, the second to axial positions. + \return indicates if writing failed or not +*/ +Succeeded scale_sinograms(ProjData& output_proj_data, + const ProjData& input_proj_data, + const Array<2,float> scale_factors_per_sinogram); + +//! find scale factors between two different sinograms +/*! \ingroup projdata + \param[in] numerator_proj_data input data + \param[in] denominator_proj_data input data + \param[in] weights_proj_data weights to be taken into account + \return scale_factors_per_sinogram array with the scale factors. The first index + corresponds to segments, the second to axial positions. + + scale factors are found for every sinogram such that + \code + scale_factor = sum(numerator * weights) / sum(denominator * weights) + \endcode + + \todo currently this function calls error() when the denominator gets too small +*/ +Array<2,float> + get_scale_factors_per_sinogram(const ProjData& numerator_proj_data, + const ProjData& denominator_proj_data, + const ProjData& weights_proj_data); + +END_NAMESPACE_STIR diff --git a/src/include/stir/scatter/ScatterEstimationByBin.h b/src/include/stir/scatter/ScatterEstimationByBin.h new file mode 100644 index 0000000000..16f0c76e9e --- /dev/null +++ b/src/include/stir/scatter/ScatterEstimationByBin.h @@ -0,0 +1,397 @@ +#ifndef __stir_scatter_ScatterEstimationByBin_H__ +#define __stir_scatter_ScatterEstimationByBin_H__ + +/* + Copyright (C) 2004 - 2009 Hammersmith Imanet Ltd + Copyright (C) 2013 University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Definition of class stir::ScatterEstimationByBin. + + \author Charalampos Tsoumpas + \author Nikolaos Dikaios + \author Kris Thielemans +*/ + +#include "stir/shared_ptr.h" +#include "stir/DiscretisedDensity.h" +#include "stir/ProjData.h" +#include "stir/ParsingObject.h" +#include "stir/numerics/BSplines.h" +#include +#include "stir/CartesianCoordinate3D.h" + +START_NAMESPACE_STIR + +class Succeeded; +class ProjDataInfoCylindricalNoArcCorr; +class ViewSegmentNumbers; + +/*! + \ingroup scatter + \brief Estimate the scatter probability using a model-based approach + + This class computes the single Compton scatter estimate for PET data using an analytical + approximation of an integral. It takes as input an emission image and an attenuation image. + This is effectively an implementation of the simulation part of the algorithms of + Watson and Ollinger. + + One non-standard feature is that you can specify a different attenuation image to find the + scatter points and one to compute the integrals over the attenuation image. The idea is that + maybe you want to compute the integrals on a finer grid than you sample the attenuation image. + This is probably not very useful though. + + \todo Currently this can only be run by initialising it via parsing of a file. We need + to add a lot of set/get members. + + \todo This class currently uses a simple Gaussian model for the energy resolution. This model + and its parameters (\a reference_energy and \a energy_resolution) really should be moved the + the Scanner class. Also the \a lower_energy_threshold and \a upper_energy_threshold should + be read from the emission data, as opposed to setting them here. + + \todo detector coordinates are derived from ProjDataInfo, but areas and orientations are + determined by using a cylindrical scanner. + + \todo This class should be split into a generic class and one specific to PET single scatter. + + \par References + This implementation is described in the following +
            +
          1. C. Tsoumpas, P. Aguiar, K. S. Nikita, D. Ros, K. Thielemans, + Evaluation of the Single Scatter Simulation Algorithm Implemented in the STIR Library, + Proc. of IEEE Medical Imaging Conf. 2004, vol. 6 pp. 3361 - 3365. +
          2. +
          + Please refer to the above if you use this implementation. + + See also these papers for extra evaluation + +
            +
          1. N. Dikaios , T. J. Spinks , K. Nikita , K. Thielemans, + Evaluation of the Scatter Simulation Algorithm Implemented in STIR, + proc. 5th ESBME, Patras, Greece. +
          2. +
          3. P. Aguiar, Ch. Tsoumpas, C. Crespo, J. Pavia, C. Falcon, A. Cot, K. Thielemans and D. Ros, + Assessment of scattered photons in the quantification of the small animal PET studies, + Eur J Nucl Med Mol I 33:S315-S315 Sep 2006, Proc. EANM 2006, Athens, Greece. +
          4. +
          +*/ +class ScatterEstimationByBin : public ParsingObject +{ + public: + //! upsample coarse scatter estimate and fit it to tails of the emission data + /*! Current procedure: + 1. interpolate segment 0 of \a scatter_proj_data to size of segment 0 of \a emission_proj_data + 2. inverseSSRB to create oblique segments + 3. find scale factors with get_scale_factors_per_sinogram() + 4. apply thresholds + 5. filter scale-factors in axial direction (independently for every segment) + 6. apply scale factors using scale_sinograms() + */ + static void + upsample_and_fit_scatter_estimate(ProjData& scaled_scatter_proj_data, + const ProjData& emission_proj_data, + const ProjData& scatter_proj_data, + const ProjData& weights_proj_data, + const float min_scale_factor, + const float max_scale_factor, + const unsigned half_filter_width, + BSpline::BSplineType spline_type, + const bool remove_interleaving = true); + + + //! Default constructor (calls set_defaults()) + ScatterEstimationByBin(); + + /*! \name functions to (re)set images or projection data + These functions also invalidate cached activity integrals such that the cache will be recomputed. + + The functions that read a file call error() if the reading failed. + */ + //@{ + void set_activity_image_sptr(const shared_ptr >&); + void set_activity_image(const std::string& filename); + + void set_density_image_sptr(const shared_ptr >&); + void set_density_image(const std::string& filename); + + //! set the image that determines where the scatter points are + /*! Also calls sample_scatter_points() + \warning Uses attenuation_threshold member variable + */ + void set_density_image_for_scatter_points_sptr(const shared_ptr >&); + + //! set the image that determines where the scatter points are + /*! Calls set_density_image_for_scatter_points_sptr() to make sure all other variables are ok. */ + void set_density_image_for_scatter_points(const std::string& filename); + + void set_template_proj_data_info_sptr(const shared_ptr&); + void set_template_proj_data_info(const std::string& filename); + + //void set_output_proj_data_sptr(const shared_ptr& new_sptr); + //! create output projection data of same size as template_proj_data_info + /*! \warning use set_template_proj_data_info() first. + + Currently always uses Interfile output. + */ + void set_output_proj_data(const std::string& filename); + + + //@} + + virtual Succeeded process_data(); + + // TODO write_log can't be const because parameter_info isn't const + virtual void + write_log(const double simulation_time, + const float total_scatter); + + protected: + void set_defaults(); + void initialise_keymap(); + bool post_processing(); + + //! threshold below which a voxel in the attenuation image will not be considered as a candidate scatter point + float attenuation_threshold; + + //! boolean to see if we need to move the scatter point randomly within in its voxel + /*! This was first recommended by Watson. It is recommended to leave this on, as otherwise + discretisation errors are more obvious. + + Note that the random generator is seeded via date/time, so re-running the scatter + simulation will give a slightly different result if this boolean is on. + */ + bool random; + //! boolean to see if we need to cache the integrals + /*! By default, we cache the integrals over the emission and attenuation image. If you run out + of memory, you can switch this off, but performance will suffer dramatically. + */ + bool use_cache; + + //! \name Parameters determining the energy detection efficiency of the scanner + //@{ + //! reference energy used when specifying the energy resolution of the detectors (in units of keV) + float reference_energy; + //! resolution of the detectors at \a reference_energy + /*! specify as a fraction of the \a reference_energy. For example, a Discovery STE has an energy + resolution of about .16 at 511 keV. + */ + float energy_resolution; + + //! Lower energy threshold set during acquisition + float lower_energy_threshold; + //! Upper energy threshold set during acquisition + float upper_energy_threshold; + //@} + + std::string activity_image_filename; + std::string density_image_filename; + std::string density_image_for_scatter_points_filename; + std::string template_proj_data_filename; + std::string output_proj_data_filename; + + shared_ptr > density_image_for_scatter_points_sptr; + shared_ptr > density_image_sptr; + shared_ptr > activity_image_sptr; + shared_ptr output_proj_data_sptr; + + + /*************** functions that do the work **********/ + + enum image_type{act_image_type, att_image_type}; + struct ScatterPoint + { + CartesianCoordinate3D coord; + float mu_value; + }; + + std::vector< ScatterPoint> scatt_points_vector; + float scatter_volume; + + //! find scatter points + /*! This function sets scatt_points_vector and scatter_volume. It will also + remove any cached integrals as they would be incorrect otherwise. + */ + void + sample_scatter_points(); + + + /************************************************************************/ + + //! \name detection related functions + //@{ + //! energy-dependent detection efficiency (Gaussian model) + float + detection_efficiency(const float energy) const; + + + //! maximum angle to consider above which detection after Compton scatter is considered too small + static + float + max_cos_angle(const float low, const float approx, const float resolution_at_511keV); + + //! mimumum energy to consider above which detection after Compton scatter is considered too small + static + float + energy_lower_limit(const float low, const float approx, const float resolution_at_511keV); + + virtual + void + find_detectors(unsigned& det_num_A, unsigned& det_num_B, const Bin& bin) const; + + unsigned + find_in_detection_points_vector(const CartesianCoordinate3D& coord) const; + // private: + const ProjDataInfoCylindricalNoArcCorr * proj_data_info_ptr; + CartesianCoordinate3D shift_detector_coordinates_to_origin; + + //! average detection efficiency of unscattered counts + double + detection_efficiency_no_scatter(const unsigned det_num_A, + const unsigned det_num_B) const; + + // next needs to be mutable because find_in_detection_points_vector is const + mutable std::vector > detection_points_vector; + private: + int total_detectors; + + //@} + protected: + //! computes scatter for one viewgram + /*! \return total scatter estimated for this viewgram */ + virtual double + process_data_for_view_segment_num(const ViewSegmentNumbers& vs_num); + + /************************************************************************/ + + //! \name integrating functions + //@{ + static + float + integral_between_2_points(const DiscretisedDensity<3,float>& density, + const CartesianCoordinate3D& point1, + const CartesianCoordinate3D& point2); + + float + exp_integral_over_attenuation_image_between_scattpoint_det (const CartesianCoordinate3D& scatter_point, + const CartesianCoordinate3D& detector_coord); + + + + float + integral_over_activity_image_between_scattpoint_det (const CartesianCoordinate3D& scatter_point, + const CartesianCoordinate3D& detector_coord); + + + + float + cached_integral_over_activity_image_between_scattpoint_det(const unsigned scatter_point_num, + const unsigned det_num); + + float + cached_exp_integral_over_attenuation_image_between_scattpoint_det(const unsigned scatter_point_num, + const unsigned det_num); + //@} + + /************************************************************************/ + + float + single_scatter_estimate_for_one_scatter_point(const std::size_t scatter_point_num, + const unsigned det_num_A, + const unsigned det_num_B); + + + void + single_scatter_estimate(double& scatter_ratio_singles, + const unsigned det_num_A, + const unsigned det_num_B); + + + virtual double + scatter_estimate(const unsigned det_num_A, + const unsigned det_num_B); + + + + public: + /************************************************************************/ + + //! \name Compton scatter cross sections + //@{ + static + inline float + dif_Compton_cross_section(const float cos_theta, float energy); + + + static + inline float + total_Compton_cross_section(float energy); + + static + inline float + photon_energy_after_Compton_scatter(const float cos_theta, const float energy); + + static + inline float + photon_energy_after_Compton_scatter_511keV(const float cos_theta); + + static + inline float + total_Compton_cross_section_relative_to_511keV(const float energy); + //@} + /************************************************************************/ + protected: + + float + compute_emis_to_det_points_solid_angle_factor(const CartesianCoordinate3D& emis_point, + const CartesianCoordinate3D& detector_coord) ; + + protected: + //! remove cached attenuation integrals + /*! should be used before recalculating scatter for a new attenuation image or + when changing the sampling of the detector etc */ + virtual void remove_cache_for_integrals_over_attenuation(); + //! reset cached activity integrals + /*! should be used before recalculating scatter for a new activity image or + when changing the sampling of the detector etc */ + virtual void remove_cache_for_integrals_over_activity(); + + private: + Array<2,float> cached_activity_integral_scattpoint_det; + Array<2,float> cached_attenuation_integral_scattpoint_det; + + + //! set-up cache for attenuation integrals + /*! \warning This will not remove existing cached data (if the sizes match). If you need this, + call remove_cache_for_scattpoint_det_integrals_over_attenuation() first. + */ + void initialise_cache_for_scattpoint_det_integrals_over_attenuation(); + //! set-up cache for activity integrals + /*! \warning This will not remove existing cached data (if the sizes match). If you need this, + call remove_cache_for_scattpoint_det_integrals_over_activity() first. + */ + void initialise_cache_for_scattpoint_det_integrals_over_activity(); +}; + + +END_NAMESPACE_STIR + +#include "stir/scatter/ScatterEstimationByBin.inl" + +#endif diff --git a/src/include/stir/scatter/ScatterEstimationByBin.inl b/src/include/stir/scatter/ScatterEstimationByBin.inl new file mode 100644 index 0000000000..69d49f734b --- /dev/null +++ b/src/include/stir/scatter/ScatterEstimationByBin.inl @@ -0,0 +1,84 @@ +// +// +/* + Copyright (C) 2004 - 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Inline implementations of class stir::ScatterEstimationByBin (cross sections) + + \author Nikolaos Dikaios + \author Charalampos Tsoumpas + \author Kris Thielemans + +*/ +START_NAMESPACE_STIR + + +float +ScatterEstimationByBin:: +dif_Compton_cross_section(const float cos_theta, float energy) +{ + const double Re = 2.818E-13; // aktina peristrofis electroniou gia to atomo tou H + const double sin_theta_2= 1-cos_theta*cos_theta ; + const double P= 1/(1+(energy/511.0)*(1-cos_theta)); + return static_cast( (Re*Re/2) * P * (1 - P * sin_theta_2 + P * P)); +} + +float +ScatterEstimationByBin:: +photon_energy_after_Compton_scatter(const float cos_theta, const float energy) +{ + return static_cast(energy/(1+(energy/511.0)*(1-cos_theta))); // For an arbitrary energy +} + +float +ScatterEstimationByBin:: +photon_energy_after_Compton_scatter_511keV(const float cos_theta) +{ + return 511/(2-cos_theta); // for a given energy, energy := 511 keV +} + +float +ScatterEstimationByBin:: +total_Compton_cross_section(const float energy) +{ + const double a= energy/511.0; + const double l= log(1.0+2.0*a); + const double sigma0= 6.65E-25; // sigma0=8*pi*a*a/(3*m*m) + return static_cast( 0.75*sigma0 * ( (1.0+a)/(a*a)*( 2.0*(1.0+a)/(1.0+2.0*a)- l/a ) + l/(2.0*a) - (1.0+3.0*a)/(1.0+2.0*a)/(1.0+2.0*a) ) ); // Klein - Nishina formula = sigma / sigma0 +} + + +float +ScatterEstimationByBin:: +total_Compton_cross_section_relative_to_511keV(const float energy) +{ + const double a= energy/511.0; + static const double prefactor = 9/(-40 + 27*log(3.)); //Klein-Nishina formula for a=1 & devided with 0.75 == (40 - 27*log(3)) / 9 + + return //checked this in Mathematica + static_cast + (prefactor* + (((-4 - a*(16 + a*(18 + 2*a)))/square(1 + 2*a) + + ((2 + (2 - a)*a)*log(1 + 2*a))/a)/square(a) + )); +} + + + +END_NAMESPACE_STIR diff --git a/src/include/stir/shared_ptr.h b/src/include/stir/shared_ptr.h new file mode 100644 index 0000000000..0a4be21eed --- /dev/null +++ b/src/include/stir/shared_ptr.h @@ -0,0 +1,37 @@ +// +// +/*! + \file + \ingroup buildblock + + \brief Import of boost::shared_ptr into stir namespace + +*/ +/* + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifndef __stir_SHARED_PTR__ +#define __stir_SHARED_PTR__ + +// include this as stir/common.h has to be included by any stir .h file +#include "stir/common.h" +#include "boost/shared_ptr.hpp" +namespace stir { +using boost::shared_ptr; +} + +#endif diff --git a/src/include/stir/spatial_transformation/GatedSpatialTransformation.h b/src/include/stir/spatial_transformation/GatedSpatialTransformation.h new file mode 100644 index 0000000000..6fd1bc2dd0 --- /dev/null +++ b/src/include/stir/spatial_transformation/GatedSpatialTransformation.h @@ -0,0 +1,128 @@ +// +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup spatial_transformation + \brief Declaration of class stir::GatedSpatialTransformation + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_spatial_transformation_GatedSpatialTransformation_H__ +#define __stir_spatial_transformation_GatedSpatialTransformation_H__ + +#include "stir/GatedDiscretisedDensity.h" +#include "stir/DiscretisedDensity.h" +#include "stir/spatial_transformation/SpatialTransformation.h" +#include "stir/numerics/BSplinesRegularGrid.h" +#include "stir/RegisteredParsingObject.h" +#include "stir/Succeeded.h" +#include +#include + +START_NAMESPACE_STIR + +//! Class for spatial transformations for gated images +/*! + \ingroup spatial_transformation +*/ +class GatedSpatialTransformation: public RegisteredParsingObject +{ + public: + static const char * const registered_name; + + GatedSpatialTransformation(); //!< default constructor + ~GatedSpatialTransformation(); //!< default destructor + //! Construct an empty GatedSpatialTransformation based on a shared_ptr > + GatedSpatialTransformation(const TimeGateDefinitions& time_gate_definitions, + const shared_ptr >& density_sptr); + + void read_from_files(const std::string input_string); + void write_to_files(const std::string output_string); + + //! \name Functions to get parameters @{ + GatedDiscretisedDensity get_spatial_transformation_z() const; + GatedDiscretisedDensity get_spatial_transformation_y() const; + GatedDiscretisedDensity get_spatial_transformation_x() const; + const TimeGateDefinitions & get_time_gate_definitions() const; + //!@} + //! \name Functions to set parameters @{ + void set_spatial_transformations(const GatedDiscretisedDensity & motion_z, + const GatedDiscretisedDensity & motion_y, + const GatedDiscretisedDensity & motion_x); + void set_gate_defs(const TimeGateDefinitions & gate_defs); + //!@} + + //! Warping functions from to gated images. @{ + void + warp_image(GatedDiscretisedDensity & new_gated_image, + const GatedDiscretisedDensity & gated_image) const ; + void + warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const ; + void + warp_image(GatedDiscretisedDensity & gated_image, + const DiscretisedDensity<3, float> & reference_image) const; + void + accumulate_warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const ; + + // Nicolas A Karakatsanis: After warping of each gate, averaging (instead of accumulation) takes place + void + average_warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const ; + + // Nicolas A Karakatsanis: After warping of each gate, averaging (instead of accumulation) takes place + // and accumulates over previous calls of the same function + void + accumulate_average_warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const ; + + //@} + + //! Nicolas A Karakatsanis: Warping functions from to non-gated images. + // Create a convolved (motion-blurred) image according to the designated motion vectors + // Designed for use within Richardson-Lucy deconvolution EM iterative process for intra-gate/frame motion correction + void + average_warp_image(DiscretisedDensity<3, float> & avg_warped_image, + const DiscretisedDensity<3, float> & reference_image) const; + + void + accumulate_average_warp_image(DiscretisedDensity<3, float> & avg_warped_image, + const DiscretisedDensity<3, float> & reference_image) const; + + void set_defaults(); + Succeeded set_up(); + + private: + typedef RegisteredParsingObject base_type; + void initialise_keymap(); + bool post_processing(); + std::string _transformation_filename_prefix; + GatedDiscretisedDensity _spatial_transformation_z; + GatedDiscretisedDensity _spatial_transformation_y; + GatedDiscretisedDensity _spatial_transformation_x; + std::string _spline_level_number; + bool _spatial_transformations_are_stored; + BSpline::BSplineType _spline_type; + std::string _time_gate_definition_filename; + TimeGateDefinitions _gate_defs; +}; + +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/spatial_transformation/SpatialTransformation.h b/src/include/stir/spatial_transformation/SpatialTransformation.h new file mode 100644 index 0000000000..377c3b88c4 --- /dev/null +++ b/src/include/stir/spatial_transformation/SpatialTransformation.h @@ -0,0 +1,54 @@ +// +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup spatial_transformation + \brief Definition of class stir::SpatialTransformation + \author Charalampos Tsoumpas + +*/ + +#ifndef __stir_spatial_transformation_SpatialTransformation_H__ +#define __stir_spatial_transformation_SpatialTransformation_H__ + +#include "stir/RegisteredObject.h" +#include "stir/RegisteredParsingObject.h" + +START_NAMESPACE_STIR + +/*! + \brief base class for any type of motion fields + \ingroup spatial_transformation + At present very basic. It just provides the parsing mechanism. +*/ +class SpatialTransformation: public RegisteredObject +{ + public: + static const char * const registered_name ; + //! default constructor + SpatialTransformation(); + + //! default destructor + virtual ~SpatialTransformation(); + + virtual Succeeded set_up() = 0; +}; + +END_NAMESPACE_STIR + +#endif //__stir_spatial_transformation_SpatialTransformation_H__ diff --git a/src/include/stir/spatial_transformation/warp_image.h b/src/include/stir/spatial_transformation/warp_image.h new file mode 100644 index 0000000000..28dd2ca621 --- /dev/null +++ b/src/include/stir/spatial_transformation/warp_image.h @@ -0,0 +1,43 @@ +// +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup spatial_transformation + + \brief This warps an image. + \author Charalampos Tsoumpas +*/ + +#ifndef __stir_warp_image_H__ +#define __stir_warp_image_H__ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/numerics/BSplinesRegularGrid.h" + +START_NAMESPACE_STIR + +VoxelsOnCartesianGrid +warp_image(const shared_ptr > & density_sptr, + const shared_ptr > & motion_x_sptr, + const shared_ptr > & motion_y_sptr, + const shared_ptr > & motion_z_sptr, + const BSpline::BSplineType spline_type, const bool extend_borders); + +END_NAMESPACE_STIR + +#endif diff --git a/src/include/stir/stream.h b/src/include/stir/stream.h new file mode 100644 index 0000000000..54b7fad6f2 --- /dev/null +++ b/src/include/stir/stream.h @@ -0,0 +1,168 @@ +// +// +/*! + \file + \ingroup buildblock + + \brief Input/output of basic vector-like types to/from streams + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009 Hammersmith Imanet Ltd + Copyright (C) 2013 Kris Thielemans + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_stream_H__ +#define __stir_stream_H__ + +#include "stir/VectorWithOffset.h" +#include "stir/BasicCoordinate.h" +#include +#include + +START_NAMESPACE_STIR + +/*! + \brief Outputs a VectorWithOffset to a stream. + + Output is of the form + \verbatim + {1, 2, 3} + \endverbatim + with an endl at the end. + + This can be used for higher dimensional arrays as well, where each 1D subobject + will be on its own line. +*/ + + +template +inline +std::ostream& +operator<<(std::ostream& str, const VectorWithOffset& v); + +/*! + \brief Outputs a BasicCoordinate to a stream. + + Output is of the form + \verbatim + {1, 2, 3} + \endverbatim + with no endl at the end. + */ +template +inline +std::ostream& +operator<<(std::ostream& str, const BasicCoordinate& v); + + +/*! + \brief Outputs a vector to a stream. + + Output is of the form + \verbatim + {1, 2, 3} + \endverbatim + with an endl at the end. + + For each element of the vector std::ostream::operator<<() will be called. +*/ +template +inline +std::ostream& +operator<<(std::ostream& str, const std::vector& v); + +/*! + \brief Inputs a vector from a stream. + + Input is of the form + \verbatim + {1, 2, 3} + \endverbatim + + Input is stopped when either the beginning '{', an intermediate ',' or the + trailing '}' is not found. The size of the vector will be the number of + correctly read elemT elements. + + For each element of the vector std::istream::operator>>(element) will be called. + + elemT needs to have a default constructor. +*/ +template +inline +std::istream& +operator>>(std::istream& str, std::vector& v); + +/*! + \brief Inputs a VectorWithOffset from a stream. + + Input is of the form + \verbatim + {1, 2, 3} + \endverbatim + As Array<>'s are constructed from nested VectorWithOffset objects, you can input + say a 2d array as + \verbatim + {{1,2}, {2,4,5}, {5}} + \endverbatim + + + Input is stopped when either the beginning '{', an intermediate ',' or the + trailing '}' is not found. The size of the vector will be the number of + correctly read elemT elements. + + v.get_min_index() will be 0 at the end of the call. + + For each element of the vector std::istream::operator>>(element) will be called. + + elemT needs to have a default constructor. +*/ +template +inline +std::istream& +operator>>(std::istream& str, VectorWithOffset& v); + +/*! + \brief Inputs a coordinate from a stream. + + Input is of the form + \verbatim + {1, 2, 3} + \endverbatim + + Input is stopped when either the beginning '{', an intermediate ',' or the + trailing '}' is not found. If the number of correctly read elements is not \a num_dimensions, + the last few will have undefined values. + + For each element of the vector std::istream::operator>>(element) will be called. + + elemT needs to have a default constructor. +*/ +template +inline +std::istream& +operator>>(std::istream& str, BasicCoordinate& v); + +END_NAMESPACE_STIR + +#include "stir/stream.inl" + +#endif + diff --git a/src/include/stir/stream.inl b/src/include/stir/stream.inl new file mode 100644 index 0000000000..058e62c064 --- /dev/null +++ b/src/include/stir/stream.inl @@ -0,0 +1,171 @@ +// +// +/*! + \file + \ingroup buildblock + + \brief Input/output of basic vector-like types to/from streams + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009 Hammersmith Imanet Ltd + Copyright (C) 2013 Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* History: + KT 08/12/2000 corrected cases in operator<< for 0 length + KT 29/08/2001 added operator>> + KT 07/10/2002 corrected case in operator>> for 0 length and added more checking on stream state +*/ + +#include + +START_NAMESPACE_STIR + +template +std::ostream& +operator<<(std::ostream& str, const VectorWithOffset& v) +{ + str << '{'; + for (int i=v.get_min_index(); i0) + str << v[v.get_max_index()]; + str << '}' << std::endl; + return str; +} + +template +std::ostream& +operator<<(std::ostream& str, const BasicCoordinate& v) +{ + str << '{'; + for (int i=1; i0) + str << v[num_dimensions]; + str << '}'; + return str; +} + + +template +std::ostream& +operator<<(std::ostream& str, const std::vector& v) +{ + str << '{'; + // slightly different from above because vector::size() is unsigned + // so 0-1 == 0xFFFFFFFF (and not -1) + if (v.size()>0) + { + for (unsigned int i=0; i +std::istream& +operator>>(std::istream& str, std::vector& v) +{ + v.resize(0); + char c; + str >> std::ws >> c; + if (!str || c != '{') + return str; + + elemT t; + do + { + str >> t; + if (!str.fail()) + { + v.push_back(t); + str >> std::ws >> c; + } + else + break; + } + while (str && c == ','); + + if (str.fail()) + { + str.clear(); + str >> std::ws >> c; + } + if (!str) + { + warning("\nreading a vector, expected closing }, but found EOF or worse. Length of vector returned is %ud\n", v.size()); + return str; + } + + if (c!= '}') + warning("\nreading a vector, expected closing }, found %c instead. Length of vector returned is %u\n", c, v.size()); + return str; +} + +template +std::istream& +operator>>(std::istream& str, VectorWithOffset& v) +{ + std::vector vv; + str >> vv; + v = VectorWithOffset(static_cast(vv.size())); + std::copy(vv.begin(), vv.end(), v.begin()); + return str; +} + +template +std::istream& +operator>>(std::istream& str, BasicCoordinate& v) +{ + char c = '\0'; + str >> std::ws >> c; + if (!str || c != '{') + { + warning("reading a coordinate of dimension %d, expected opening {, found %c instead.\n" + "Elements will be undefined", num_dimensions, c); + return str; + } + for (int i=1; i<=num_dimensions; i++) + { + c = '\0'; + str >> v[i]; + str >> std::ws >> c; + if (i + +#ifndef STIR_NO_NAMESPACES +using std::fill; +#endif + +START_NAMESPACE_STIR +/*! \ingroup buildblock + \name Functions for thresholding numbers and sequences +*/ +//@{ + +//! Threshold a sequence from above and below +/*! + \par Type requirements: + +
            +
          • \c forw_iterT is a forward iterator +
          • \c elemT must be assignable to *forw_iterT +
          • bool operator>(*forw_iterT, elemT) must exist +
          +*/ +template +inline void +threshold_upper_lower(forw_iterT begin, forw_iterT end, + const elemT new_min, const elemT new_max) +{ + for (forw_iterT iter = begin; iter != end; ++iter) + { + if (*iter > new_max) + *iter = new_max; + else + if (new_min > *iter) + *iter = new_min; + } +} + +// Nicolas A Karakatsanis: Zero thresholding +//! Set all values of a sequence exceeding range [low_thresh, upper_thresh] to zero +template +inline void +zero_threshold_upper_lower(forw_iterT begin, forw_iterT end, + const elemT new_min, const elemT new_max) +{ + for (forw_iterT iter = begin; iter != end; ++iter) + { + if (*iter > new_max) + *iter = 0; + else + if (new_min > *iter) + *iter = 0; + } +} + +//! Threshold a sequence from above +/*! + \see threshold_upper_lower for type requirements */ +template +inline void +threshold_upper(forw_iterT begin, forw_iterT end, + const elemT new_max) +{ + for (forw_iterT iter = begin; iter != end; ++iter) + { + if (*iter > new_max) + *iter = new_max; + } +} + +//! Threshold a sequence from below +/*! + \see threshold_upper_lower for type requirements */ +template +inline void +threshold_lower(forw_iterT begin, forw_iterT end, + const elemT new_min) +{ + for (forw_iterT iter = begin; iter != end; ++iter) + { + if (new_min > *iter) + *iter = new_min; + } +} + +//! sets non-positive values in the sequence to small positive ones +/*! + Thresholds the sequence from below to + *min_positive_element()*small_number. + However, if all values are less than or equal to 0, they are + set to \a small_number. + + \param begin start of the sequence. Usually object.begin(). + \param end end of the sequence in iterator sense (so actually one beyond + the last element). Usually object.end(). + \param small_number see above + + The iterator type has to satisfy the requirements of a forward iterator, + and its value_type has to be comparable using < and <=. +*/ +template +void +threshold_min_to_small_positive_value(ForwardIter_t begin, ForwardIter_t end, + const elemT& small_number) +{ + const ForwardIter_t smallest_positive_element_iter = + min_positive_element(begin, end); + + if (smallest_positive_element_iter!= end) + threshold_lower(begin, end, (*smallest_positive_element_iter)*small_number); + else + fill(begin, end, small_number); +} + +//@} + +END_NAMESPACE_STIR + +#endif + diff --git a/src/include/stir/utilities.h b/src/include/stir/utilities.h new file mode 100644 index 0000000000..d7d2dd94e8 --- /dev/null +++ b/src/include/stir/utilities.h @@ -0,0 +1,407 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_UTILITIES_H__ +#define __stir_UTILITIES_H__ +/*! + \file + \ingroup buildblock + \brief This file declares various utility functions. + + \author Kris Thielemans + \author PARAPET project +*/ +#include "stir/common.h" +#include +#include +#include + +START_NAMESPACE_STIR + + +/******************************************************/ +/*! \ingroup buildblock + \name Functions for user input +*/ +//@{ +//! A function to ask a number from the user +template +inline NUMBER +ask_num (const std::string& prompt, + NUMBER minimum_value, + NUMBER maximum_value, + NUMBER default_value); + +//! A function to ask a string from the user +std::string +ask_string(const std::string& prompt, const std::string& default_value = ""); + +/*! + \brief A function to ask a yes/no question from the user + + \param prompt a text string which is supposed to be a question + \param default_value When set to \c true , the default is Yes. + + The question is currently presented as + \verbatim + prompt [Y/N D:default_value]: + \endverbatim + Simply pressing 'enter' will select the default value. Otherwise, + the first charachter of the response will be checked against + y/Y/n/N to determine the return value. If it is none of these, + the question will be asked again. + */ +bool +ask (const std::string& prompt, bool default_value); + + +/***** filename functions ****/ + +/*! + \brief + Asks for a filename (appending an extension if none is provided) + and stores the string where file_in_directory_name points to. + + \deprecated Use ask_filename_with_extension(const std::string&, const std::string&); + + Example: + \code + char filename[max_filename_length]; + ask_filename_with_extension(filename, "Input file name ?", ".img"); + \endcode + \warning \a file_in_directory_name has to be preallocated + (with size \c max_filename_length) + \warning starting or ending spaces are NOT stripped. + */ +char * +ask_filename_with_extension(char *file_in_directory_name, + const std::string& prompt, + const std::string& default_extension); + +/*! + \brief + Asks for a filename (appending an extension if none is provided). + + Example: + \code + std::string filename = + ask_filename_with_extension("Input file name ?", ".img"); + \endcode + \warning starting or ending spaces are NOT stripped. + */ +std::string +ask_filename_with_extension(const std::string& prompt, + const std::string& default_extension); + +/*! + \brief + Asks for a filename (with default extension) and opens the stream \a s + with \a mode giving the specifics. + + Example: open a binary input file, aborting if it is not found + \code + ifstream in; + ask_filename_and_open(s, "Input file ?", ".hv", std::ios::in | std::ios::binary); + \endcode + Note: this function is templated to allow \a s to be of different + types \c ifstream, \c ofstream, \c fstream +*/ +// Implementation note: gcc 2.8.1 seems to have problems with default +// values when templates are around, so I overload the function +template +void +ask_filename_and_open(FSTREAM& s, + const std::string& prompt, + const std::string& default_extension, + std::ios::openmode mode, + bool abort_if_failed); + +//! as above, but with default \c abort_if_failed = true +template +void +inline +ask_filename_and_open(FSTREAM& s, + const std::string& prompt, + const std::string& default_extension, + std::ios::openmode mode) +{ + ask_filename_and_open(s, prompt, default_extension, mode, true); +} + +//@} + +/******************************************************/ +/*! \ingroup buildblock + \name Functions for stream/file manipulations +*/ +//@{ +/*! + \brief reads data into memory, returning a pointer to the memory + + If the file_size parameter is zero, the stream is read till EOF + and 'file_size' is set to the number of bytes in the file. + Otherwise 'file_size' bytes are read. + + The data is read from the current position in the stream. + At the end of this function, the 'input' stream will be positioned + at original_position + file_size. + */ +void * read_stream_in_memory(std::istream& input, std::streamsize& file_size); + +/*! + \brief Find number of remaining characters in the stream + + At the end of this function, the 'input' stream will be positioned + at the original_position. + \warning Works only properly for binary streams. + */ +std::streamsize find_remaining_size (std::istream& input); + +//! opens a stream for reading binary data. Calls error() when it does not succeed. +/*! \warning probably does not work if you are not in the C-locale */ +template +inline IFSTREAM& open_read_binary(IFSTREAM& s, + const std::string& name); +//! opens a FILE for reading binary data. Calls error() when it does not succeed. +/*! \warning probably does not work if you are not in the C-locale*/ +FILE*& open_read_binary(FILE*& fptr, + const std::string& name); + +//! opens a stream for writing binary data. Calls error() when it does not succeed. +/*! + Templated such that it works on std::ofstream and std::fstream. + \warning probably does not work if you are not in the C-locale + */ +template +inline OFSTREAM& open_write_binary(OFSTREAM& s, + const std::string& name); +//! opens a FILE for writing binary data. Calls error() when it does not succeed. +/*! \warning probably does not work if you are not in the C-locale*/ +FILE*& open_write_binary(FILE*& fptr, + const std::string& name); + + +//! closes a stream without error checking. +/*! + Templated such that it works on std::ofstream, std::ifstream and std::fstream. + + This function is only provided in case you need to write code that works with + both std::fstream and stdio FILE. + */ +template +inline void close_file(FSTREAM& s); + +//! closes a FILE without error checking. +/*! + This function is only provided in case you need to write code that works with + both std::fstream and stdio FILE. + */ +void close_file(FILE*& fptr); + +//@} + +/*! \brief + some large value to say how long filenames can be in + the (deprecated) function + ask_filename_with_extension(char *,const std::string&, const std::string&) + \ingroup buildblock + */ +const int max_filename_length = 1000; + +/******************************************************/ +/*! \ingroup buildblock + \name Functions for filename manipulations + + These functions work on different platforms, i.e. Unix, VAX, Windows. Also on + older MacOS versions. + + \warning Functions that work on char* might be removed at some point. +*/ +//@{ + +//! return a pointer to the start of the filename (i.e. after directory specifications) +/*! The returned pointer is between filename_with_directory and + (filename_with_directory+strlen(filename_with_directory)+1). This + highest value is used when it looks like a directory name. + + \deprecated use find_pos_of_filename() + \warning This function works only with string manipulations. There is no check + if the 'filename' part actually corresponds to a directory on disk. +*/ +extern const char * +find_filename(const char * const filename_with_directory); + +//! return the position of the start of the filename (i.e. after directory specifications) +/*! The returned number is between 0 and filename_with_directory.size()+1. This + highest value is used when it's a directory name. + \warning This function works only with string manipulations. There is no check + if the 'filename' part actually corresponds to a directory on disk. +*/ +std::string::size_type +find_pos_of_filename(const std::string& filename_with_directory); + +//! return a std::string containing only the filename (i.e. after directory specifications) +/*! + \warning This function works only with string manipulations. There is no check + if the 'filename' part actually corresponds to a directory on disk. +*/ +std::string +get_filename(const std::string& filename_with_directory); + +/*! + \brief + Copies the directory part from 'filename_with_directory' + into 'directory_name' and returns the 'directory_name' pointer. + \warning This function works only with string manipulations. There is no check + if the 'filename' part actually corresponds to a directory on disk. + + \warning assumes that directory_name points to enough allocated space + \deprecated Use get_directory_name(const std::string&) +*/ +char * +get_directory_name(char *directory_name, + const char * const filename_with_directory); + +//! Returns a string with the directory part from 'filename_with_directory'. +/*! + If there was no directory information present, the return value is the string "." (i.e. the current directory). + (It was the empty string prior to STIR 3.0). + + \warning This function works only with string manipulations. There is no check + if the 'filename' part actually corresponds to a directory on disk. +*/ +std::string +get_directory_name(const std::string& filename_with_directory); + +/*! + \brief + Checks if the filename points to an absolute location, or is + a relative (e.g. to current directory) pathname. + */ +extern bool +is_absolute_pathname(const std::string& filename_with_directory); + +/*! + \brief + Checks if the filename points to an absolute location, or is + a relative (e.g. to current directory) pathname. + */ +extern bool +is_absolute_pathname(const char * const filename_with_directory); + + +/*! + \brief + Prepend directory_name to the filename, but only + if !is_absolute_pathname(filename_with_directory) + + If necessary, a directory separator is inserted. + If 'directory_name' == 0, nothing happens. + \return a pointer to the start of the new filename + \warning this function assumes that filename_with_directory + points to sufficient allocated space to contain the new string. + */ +extern char * +prepend_directory_name(char * filename_with_directory, + const char * const directory_name); + +//! find the position of the '.' of the extension +/*! + If no '.' is found in the filename part (i.e. ignoring the + directory name), the function returns \c std::string::npos +*/ +std::string::size_type +find_pos_of_extension(const std::string& file_in_directory_name); +#if 0 +// terribly dangerous for memory overrun. + +/*! +\brief + Append \a extension to \a filename_with_directory + if no '.' is found in \a filename_with_directory + (excluding the directory part) + \return the \a filename_with_directory pointer. + + Example (on Unix): + \code + char filename[max_filename_length] = "dir.name/filename"; + add_extension(filename, ".img"); + \endcode + results in 'filename' pointing to "dir.name/filename.img" + + \deprecated + */ +extern char * +add_extension(char * file_in_directory_name, + const char * const extension); +#endif + +//! Append extension if none present +std::string& +add_extension(std::string& file_in_directory_name, + const std::string& extension); + +#if 0 +// disabled because possible memory overrun + +/*! + \brief + Replace extension in \a filename_with_directory with \a extension. + + if no extension is found in 'filename_with_directory', + 'extension' is appended. + \return the 'filename_with_directory' pointer. + + Example (on Unix): + \code + char filename[max_filename_length] = "dir.name/filename.v"; + replace_extension(filename, ".img"); + \endcode + results in 'filename' pointing to "dir.name/filename.img" + \deprecated + */ +extern char * +replace_extension(char *file_in_directory_name, + const char * const extension); +#endif + +//! Replace extension (or append if none present) +std::string& +replace_extension(std::string& file_in_directory_name, + const std::string& extension); + + +//@} + +/********************************************************************** + C-string manipulation function +***********************************************************************/ +#ifndef _MSC_VER + +//! make C-string uppercase +/*! \ingroup buildblock +*/ +inline char *strupr(char * const str); +#else +#define strupr _strupr +#endif + +END_NAMESPACE_STIR + +#include "stir/utilities.inl" + +#endif // __UTILITIES_H__ diff --git a/src/include/stir/utilities.inl b/src/include/stir/utilities.inl new file mode 100644 index 0000000000..84ddedd578 --- /dev/null +++ b/src/include/stir/utilities.inl @@ -0,0 +1,122 @@ +/*! + \file + \ingroup buildblock + \brief inline implementations for utility.h + + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + +START_NAMESPACE_STIR +/*! + The question is currently presented as + \verbatim + str_text : [minimum_value, maximum_value, D: default_value]: + \endverbatim + Simply pressing 'enter' will select the default value. Otherwise, range + checking is performed, and the question asked again if necessary. +*/ +template +inline NUMBER +ask_num (const std::string& str, + NUMBER minimum_value, + NUMBER maximum_value, + NUMBER default_value) +{ + + while(1) + { + std::string input; + std::cerr << "\n" << str + << "[" << minimum_value << "," << maximum_value + << " D:" << default_value << "]: "; + std::getline(std::cin, input); +#ifdef BOOST_NO_STRINGSTREAM + istrstream ss(input.c_str()); +#else + std::istringstream ss(input.c_str()); +#endif + + NUMBER value = default_value; + ss >> value; + if ((value>=minimum_value) && (maximum_value>=value)) + return value; + std::cerr << "\nOut of bounds. Try again."; + } +} + + + +template +inline IFSTREAM& open_read_binary(IFSTREAM& s, + const std::string& name) +{ +#if 0 + //KT 30/07/98 The next lines are only necessary (in VC 5.0) when importing + // . We use now, so they are disabled. + + // Visual C++ does not complain when opening a nonexisting file for reading, + // unless using std::ios::nocreate + s.open(name.c_str(), std::ios::in | std::ios::binary | std::ios::nocreate); +#else + s.open(name.c_str(), std::ios::in | std::ios::binary); +#endif + // KT 14/01/2000 added name of file in error message + if (s.fail() || s.bad()) + { error("Error opening file %s\n", name.c_str()); } + return s; +} + +template +inline OFSTREAM& open_write_binary(OFSTREAM& s, + const std::string& name) +{ + s.open(name.c_str(), std::ios::out | std::ios::binary); + // KT 14/01/2000 added name of file in error message + if (s.fail() || s.bad()) + { error("Error opening file %s\n", name.c_str()); } + return s; +} + +template +inline void close_file(FSTREAM& s) +{ + s.close(); +} + + +#ifndef _MSC_VER +char *strupr(char * const str) +{ + for (char *a = str; *a; a++) + { + if ((*a >= 'a')&&(*a <= 'z')) *a += 'A'-'a'; + }; + return str; +} +#endif + +END_NAMESPACE_STIR diff --git a/src/include/stir/warning.h b/src/include/stir/warning.h new file mode 100644 index 0000000000..81aaba9985 --- /dev/null +++ b/src/include/stir/warning.h @@ -0,0 +1,80 @@ +// +// +#ifndef __stir_warning_H__ +#define __stir_warning_H__ +/* + Copyright (C) 2010- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup buildblock + \brief Declaration of stir::warning() + + \author Kris Thielemans + +*/ +#include "stir/common.h" +#include + +START_NAMESPACE_STIR + +//! Print warning with format string a la \c printf +/*! \ingroup buildblock + + The arguments are the same as if you would call printf(). The warning message is written to stderr, + preceeded by "WARNING:". + + \par Example + \code + warning("Cannot open file %s, but I will work around it", filename); + \endcode + + \deprecated (use 1 argument version instead) +*/ +void +warning(const char *const s, ...); + + +//! Use this function for writing warning messages +/*! \ingroup buildblock + + The argument is expected to be a string, but could be anything for which + std::ostream::operator\<\< would work. + + This function currently first writes a newline, then \c WARNING:, then \c string + and then another newline to std::cerr. + + \todo At a later stage, it will also write to a log-file. + + \c boost::format is useful in this context. + + \par Example + \code + warning(boost::format("Type is like this: %1%. Not sure if that will work.") % projdata_info.parameter_info()); + + warning("This might not work"); + \endcode +*/ + +template +inline void +warning(const STRING& string) +{ + std::cerr << "\nWARNING: " + << string + << std::endl; +} +END_NAMESPACE_STIR +#endif diff --git a/src/include/stir/zoom.h b/src/include/stir/zoom.h new file mode 100644 index 0000000000..c056e0bf91 --- /dev/null +++ b/src/include/stir/zoom.h @@ -0,0 +1,234 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#ifndef __stir_ZOOM_H__ +#define __stir_ZOOM_H__ + +/*! + \file + + \brief This file declares various zooming functions. + \ingroup buildblock + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project + + + + These functions can be used for zooming of projection data or image data. + Zooming requires interpolation. Currently, this is done using + stir::overlap_interpolate. + + The first set of functions allows zooming and translation in transaxial + planes only. These parameters are the same for projection data or image data. + That is, zoomed projection data are (approximately) the forward projections + of zoomed images with the same parameters. These functions have the following + parameters: + + \param zoom scales the projection bins (zoom larger than 1 means more detail, so smaller pixels) + \param x_offset_in_mm x-coordinate of new origin (in mm) + \param y_offset_in_mm y-coordinate of new origin (in mm) + + \par Projection data + + This allows 2-dimensional + zooming and translation on arccorrected data, here translation means a translation in + 'image' space which gives a \c sin shift of origin in the \c s - coordinate in + projection space. + The new range of \c s coordinates is given by + \param min_tang_pos_num [for projection data only] the minimum tangential position number in the new + projection line + \param max_tang_pos_num [for projection data only] the maximum tangential position number in the new + projection line + Note that the (projection of the) centre of the scanner axis is supposed to be + at \a tang_pos_num = 0. + + \par images + + It allows three-dimensional + zooming and translation. Parameters are derived either from + stir::CartesianCoordinate3D objects, or from the information in the \a in and \a out + images. + + In the case that the offsets are 0, the following holds: +
            +
          • If \c size is equal to \c zoom*old_size, the same amount of data is represented. +
          • If it is less, data are truncated. +
          • If it is larger, the outer ends are filled with 0. +
          + + + \warning Because overlap_interpolate is used, the zooming is 'count-preserving', + i.e. when the output range is large enough, the in.sum() == out.sum(). + + \warning In STIR 1.x, origins were taken relative to the centre of the coordinate range: +\code + x_in_mm = (x_index - x_ctr_index) * voxel_size.x() + origin.x() +\endcode + where +\code + x_ctr_index = (x_max_index + x_min_index)/2 +\endcode + This is no longer true. Instead we use + DiscretisedDensity\<3,float\>::get_physical_coordinates_for_indices. +*/ + +#include "stir/common.h" + +START_NAMESPACE_STIR + +template class Viewgram; +template class RelatedViewgrams; +template class VoxelsOnCartesianGrid; +template class PixelsOnCartesianGrid; +template class CartesianCoordinate3D; +template class BasicCoordinate; + +/*! + \ingroup buildblock + \name Functions for interpolating data to new pixel/bin sizes +*/ +//@{ + +/*! + \brief zoom a RelatedViewgrams object, replacing it with the new data + \see zoom.h for parameter info +*/ +void +zoom_viewgrams (RelatedViewgrams& viewgrams, + const float zoom, + const int min_tang_pos_num, const int max_tang_pos_num, + const float x_offset_in_mm = 0, const float y_offset_in_mm = 0); + +/*! + \brief zoom \a viewgram, replacing it with the new data + \see zoom.h for parameter info +*/ +void +zoom_viewgram (Viewgram& viewgram, + const float zoom, + const int min_tang_pos_num, const int max_tang_pos_num, + const float x_offset_in_mm = 0, const float y_offset_in_mm = 0); +/*! + \brief zoom \a in_viewgram, replacing \a out_viewgram with the new data + + This version of zoom_viewgram gets the info on the new sizes, sampling etc. + from \a out_viewgram. + \see zoom.h for parameter info +*/ +void +zoom_viewgram (Viewgram& out_viewgram, + const Viewgram& in_viewgram, + const float x_offset_in_mm = 0, const float y_offset_in_mm = 0); + + + +/*! + \brief zoom \a image, returning the new image + \see zoom.h for parameter info + + \see zoom_image_in_place +*/ +VoxelsOnCartesianGrid +zoom_image(const VoxelsOnCartesianGrid &image, + const CartesianCoordinate3D& zooms, + const CartesianCoordinate3D& offsets_in_mm, + const BasicCoordinate<3,int>& new_sizes); + +/*! + \brief + zoom \a image, replacing the first argument with the new data. + Full 3D shifts and zooms. + \see zoom.h for parameter info. + + Zooming is done such that the physical coordinates of a point + (as returned by + DiscretisedDensity\<3,float\>::get_physical_coordinates_for_indices) + remain the same. + + The index range of the new image is according to the standard STIR + conventions (z starts from 0, but x and y from -(new_size/2)). + The origin is then chosen such that the geometric centres of the + images satisfy + \verbatim + offsets_in_mm == new_middle - old_middle + \endverbatim + The geometric centre is determined by the average of the physical + coordinates of the min and max indices. + + \warning: For even-sized images, this convention can lead to somewhat + non-intuitive results (half-pixel shifts etc). +*/ +void +zoom_image_in_place(VoxelsOnCartesianGrid &image, + const CartesianCoordinate3D& zooms, + const CartesianCoordinate3D& offsets_in_mm, + const BasicCoordinate<3,int>& new_sizes); + +/*! + \brief zoom \a image_in according to dimensions, origin and voxel_size of \a image_out. + \see zoom.h for parameter info + + Zooming is done such that the physical coordinates of a point + (as returned by + DiscretisedDensity\<3,float\>::get_physical_coordinates_for_indices) + remain the same. +*/ +void +zoom_image(VoxelsOnCartesianGrid &image_out, + const VoxelsOnCartesianGrid &image_in); + +//------------------ 2D zooms--------------------- + +/*! +\brief +zoom \a image2D_in according to dimensions, origin and pixel_size of +\a image2D_out. + \see zoom.h for parameter info +*/ +void +zoom_image(PixelsOnCartesianGrid &image2D_out, + const PixelsOnCartesianGrid &image2D_in); + +/*! + \brief zoom \a image, replacing the first argument with the new data + \see zoom.h for parameter info +*/ +VoxelsOnCartesianGrid +zoom_image(const VoxelsOnCartesianGrid &image, + const float zoom, + const float x_offset_in_mm, const float y_offset_in_mm, + const int new_size); + +/*! + \brief zoom \a image, replacing the first argument with the new data + \see zoom.h for parameter info +*/ +void +zoom_image_in_place(VoxelsOnCartesianGrid &image, + const float zoom, + const float x_offset_in_mm, const float y_offset_in_mm, + const int new_size); + +//@} + +END_NAMESPACE_STIR + +#endif + diff --git a/src/iterative/OSMAPOSL/CMakeLists.txt b/src/iterative/OSMAPOSL/CMakeLists.txt new file mode 100644 index 0000000000..bc8fb36108 --- /dev/null +++ b/src/iterative/OSMAPOSL/CMakeLists.txt @@ -0,0 +1,27 @@ + +set(dir iterative_OSMAPOSL) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + OSMAPOSLReconstruction +) + +#$(dir)_REGISTRY_SOURCES:= + +include(stir_lib_target) + +set (dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + OSMAPOSL +) + +include(stir_exe_targets) + +if (STIR_MPI) + SET_PROPERTY(TARGET OSMAPOSL PROPERTY LINK_FLAGS ${MPI_CXX_LINK_FLAGS}) +endif() + +target_link_libraries(iterative_OSMAPOSL recon_buildblock ) + diff --git a/src/iterative/OSMAPOSL/OSMAPOSL.cxx b/src/iterative/OSMAPOSL/OSMAPOSL.cxx new file mode 100644 index 0000000000..13ff863f15 --- /dev/null +++ b/src/iterative/OSMAPOSL/OSMAPOSL.cxx @@ -0,0 +1,72 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2012 Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup main_programs + \brief main() for OSMAPOSLReconstruction + + \author Matthew Jacobson + \author Kris Thielemans + \author PARAPET project + +*/ +#include "stir/OSMAPOSL/OSMAPOSLReconstruction.h" +#include "stir/DiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/CPUTimer.h" +#include "stir/HighResWallClockTimer.h" +#include "stir/recon_buildblock/distributable_main.h" +#include +using std::cerr; +using std::cout; +using std::endl; + +#ifdef STIR_MPI +int stir::distributable_main(int argc, char **argv) +#else +int main(int argc, char **argv) +#endif +{ + + USING_NAMESPACE_STIR + + HighResWallClockTimer t; + t.reset(); + t.start(); + + OSMAPOSLReconstruction > + reconstruction_object(argc>1?argv[1]:""); + + + //return reconstruction_object.reconstruct() == Succeeded::yes ? + // EXIT_SUCCESS : EXIT_FAILURE; + if (reconstruction_object.reconstruct() == Succeeded::yes) + { + t.stop(); + cout << "Total Wall clock time: " << t.value() << " seconds" << endl; + return EXIT_SUCCESS; + } + else + { + t.stop(); + return EXIT_FAILURE; + } + +} diff --git a/src/iterative/OSMAPOSL/OSMAPOSLReconstruction.cxx b/src/iterative/OSMAPOSL/OSMAPOSLReconstruction.cxx new file mode 100644 index 0000000000..ad84ba2724 --- /dev/null +++ b/src/iterative/OSMAPOSL/OSMAPOSLReconstruction.cxx @@ -0,0 +1,590 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011-12-31, Hammersmith Imanet Ltd + Copyright (C) 2012-06-05 - 2012, Kris Thielemans + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup OSMAPOSL + \ingroup reconstructors + \brief implementation of the stir::OSMAPOSLReconstruction class + + \author Matthew Jacobson + \author Sanida Mustafovic + \author Kris Thielemans + \author Nicolas A Karakatsanis + \author PARAPET project + +*/ + +#include "stir/OSMAPOSL/OSMAPOSLReconstruction.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h" +#include "stir/DiscretisedDensity.h" +//#include "stir/LogLikBased/common.h" +#include "stir/ThresholdMinToSmallPositiveValueDataProcessor.h" +#include "stir/ChainedDataProcessor.h" +#include "stir/Succeeded.h" +#include "stir/numerics/divide.h" +#include "stir/thresholding.h" +#include "stir/is_null_ptr.h" +#include "stir/NumericInfo.h" +#include "stir/utilities.h" +// for get_symmetries_ptr() +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +#include "stir/ViewSegmentNumbers.h" + + +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" + +#include +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif + +#ifndef STIR_NO_NAMESPACES +using std::auto_ptr; +using std::cerr; +using std::endl; +#endif + + +START_NAMESPACE_STIR + +template +PoissonLogLikelihoodWithLinearModelForMean& +OSMAPOSLReconstruction:: +objective_function() +{ + return + static_cast&> + (*this->objective_function_sptr); +} + +template +PoissonLogLikelihoodWithLinearModelForMean const& +OSMAPOSLReconstruction:: +objective_function() const +{ + return + static_cast&> + (*this->objective_function_sptr); +} + +template +PoissonLogLikelihoodWithLinearModelForMean const& +OSMAPOSLReconstruction:: +get_objective_function() const +{ + // just use the above (private) function + return this->objective_function(); +} + +//*********** parameters *********** + +template +void +OSMAPOSLReconstruction:: +set_defaults() +{ + base_type::set_defaults(); + enforce_initial_positivity = true; + maximum_relative_change = NumericInfo().max_value(); + minimum_relative_change = 0; + write_update_image = 0; + inter_update_filter_interval = 0; + inter_update_filter_ptr.reset(); + MAP_model="additive"; +} + +template +void +OSMAPOSLReconstruction:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("OSMAPOSLParameters"); + this->parser.add_stop_key("End"); + + this->parser.add_key("enforce initial positivity condition",&this->enforce_initial_positivity); + this->parser.add_key("inter-update filter subiteration interval",&this->inter_update_filter_interval); + this->parser.add_parsing_key("inter-update filter type", &this->inter_update_filter_ptr); + this->parser.add_key("MAP_model", &this->MAP_model); + this->parser.add_key("maximum relative change", &this->maximum_relative_change); + this->parser.add_key("minimum relative change",&this->minimum_relative_change); + this->parser.add_key("write update image",&this->write_update_image); +} + + +template +void OSMAPOSLReconstruction:: +ask_parameters() +{ + + base_type::ask_parameters(); + + enforce_initial_positivity= + ask("Enforce initial positivity condition?",true); + + inter_update_filter_interval= + ask_num("Do inter-update filtering at sub-iteration intervals of: ", + 0, this->num_subiterations, 0); + + if(inter_update_filter_interval>0) + { + + cerr<::list_registered_names(cerr); + + const string inter_update_filter_type = ask_string(""); + + inter_update_filter_ptr.reset(DataProcessor::read_registered_object(0, inter_update_filter_type)); + + } + + if (!this->objective_function_sptr->prior_is_zero()) + MAP_model = + ask_string("Use additive or multiplicative form of MAP-OSL ('additive' or 'multiplicative')","additive"); + + // KT 17/08/2000 3 new parameters + const double max_in_double = static_cast(NumericInfo().max_value()); + maximum_relative_change = ask_num("maximum relative change", + 1.,max_in_double,max_in_double); + minimum_relative_change = ask_num("minimum relative change", + 0.,1.,0.); + + write_update_image = ask_num("write update image", 0,1,0); + +} + + + + +template +bool OSMAPOSLReconstruction:: +post_processing() +{ + if (base_type::post_processing()) + return true; + + if (!this->objective_function_sptr->prior_is_zero()) + { + // TODO MAP_model really should be an ASCIIlist, without automatic checking on values + if (MAP_model != "additive" && MAP_model != "multiplicative") + { + warning("MAP model should have as value 'additive' or 'multiplicative', while it is '%s'", + MAP_model.c_str()); + return true; + } + } + return false; +} + +//*********** set_ functions *********** +template +void +OSMAPOSLReconstruction:: +set_inter_update_filter_interval(const int arg) +{ + this->inter_update_filter_interval = arg; +} + +template +void +OSMAPOSLReconstruction:: +set_inter_update_filter_ptr(const shared_ptr > & arg) +{ + this->inter_update_filter_ptr = arg; +} + +template +void +OSMAPOSLReconstruction:: +set_maximum_relative_change(const double arg) +{ + this->maximum_relative_change = arg; +} + +template +void +OSMAPOSLReconstruction:: +set_minimum_relative_change(const double arg) +{ + this->minimum_relative_change = arg; +} + +template +void +OSMAPOSLReconstruction:: +set_write_update_image(const int arg) +{ + this->write_update_image = arg; +} + +template +void +OSMAPOSLReconstruction:: +set_MAP_model(const string& arg) +{ + this->MAP_model = arg; +} + +//*********** other functions *********** + + + +template +OSMAPOSLReconstruction:: +OSMAPOSLReconstruction() +{ + set_defaults(); +} + +template +OSMAPOSLReconstruction:: +OSMAPOSLReconstruction(const string& parameter_filename) +{ + this->initialise(parameter_filename); + std::cerr<parameter_info(); +} + +template +std::string +OSMAPOSLReconstruction:: +method_info() const +{ + + // TODO add prior name? + +#ifdef BOOST_NO_STRINGSTREAM + // dangerous for out-of-range, but 'old-style' ostrstream seems to need this + char str[10000]; + ostrstream s(str, 10000); +#else + std::ostringstream s; +#endif + + if(this->inter_update_filter_interval>0) s<<"IUF-"; + if(this->num_subsets>1) s<<"OS"; + if (this->objective_function_sptr->prior_is_zero()) + s<<"EM"; + else + s << "MAPOSL"; + if(this->inter_iteration_filter_interval>0) s<<"S"; + + return s.str(); + +} + +template +Succeeded +OSMAPOSLReconstruction:: +set_up(shared_ptr const& target_image_ptr) +{ + // TODO should use something like iterator_traits to figure out the + // type instead of hard-wiring float + static const float small_num = 0.000001F; + + if (base_type::set_up(target_image_ptr) == Succeeded::no) + return Succeeded::no; + + if (is_null_ptr(dynamic_cast const *> + (this->objective_function_sptr.get()))) + { warning("OSMAPOSL can only work with an objective function of type PoissonLogLikelihoodWithLinearModelForMean"); return Succeeded::no; } + + // check subset balancing + { + std::string warning_message = "OSMAPOSL\n"; + if (!this->objective_function().subsets_are_approximately_balanced(warning_message)) + { + warning("%s\nOSMAPOSL cannot handle this.", + warning_message.c_str()); + return Succeeded::no; + } + } // end check balancing + + + if(this->enforce_initial_positivity) + threshold_min_to_small_positive_value(target_image_ptr->begin_all(), + target_image_ptr->end_all(), + small_num); + + if (this->inter_update_filter_interval<0) + { warning("Range error in inter-update filter interval"); return Succeeded::no; } + + if(this->inter_update_filter_interval>0 && + !is_null_ptr(this->inter_update_filter_ptr)) + { + // ensure that the result image of the filter is positive + shared_ptr > + thresholding_sptr(new ThresholdMinToSmallPositiveValueDataProcessor); + this->inter_update_filter_ptr.reset( + new ChainedDataProcessor( + this->inter_update_filter_ptr, + thresholding_sptr)); + // KT 04/06/2003 moved set_up after chaining the filter. Otherwise it would be + // called again later on anyway. + // Note however that at present, + cerr<inter_update_filter_ptr->set_up(*target_image_ptr) + == Succeeded::no) + { + warning("Error building inter-update filter"); + return Succeeded::no; + } + + } + if (this->inter_iteration_filter_interval>0 && + !is_null_ptr(this->inter_iteration_filter_ptr)) + { + // ensure that the result image of the filter is positive + shared_ptr > + thresholding_sptr(new ThresholdMinToSmallPositiveValueDataProcessor); + this->inter_iteration_filter_ptr.reset( + new ChainedDataProcessor( + this->inter_iteration_filter_ptr, + thresholding_sptr + )); + // KT 04/06/2003 moved set_up after chaining the filter (and removed it from IterativeReconstruction) + cerr<inter_iteration_filter_ptr->set_up(*target_image_ptr) + == Succeeded::no) + { + warning("Error building inter iteration filter"); + return Succeeded::no; + } + + } + + return Succeeded::yes; +} + + + + +template +void +OSMAPOSLReconstruction:: +update_estimate(TargetT ¤t_image_estimate) +{ + // TODO should use something like iterator_traits to figure out the + // type instead of hard-wiring float + static const float small_num = 0.000001F; + +#ifndef PARALLEL + //CPUTimer subset_timer; + //subset_timer.start(); +#else // PARALLEL + PTimer timerSubset; + timerSubset.Start(); +#endif // PARALLEL + + // Nicolas A Karakatsanis: Pass the name and the subiteration number to the obj function + // as a new output filename prefix for the multiple nested images within the same global iteration + // This can be utilized by nested obj functions for many purposes + this->objective_function(). + set_nested_output_filename_prefix(this->output_filename_prefix, + this->subiteration_num); + + // TODO make member parameter to avoid reallocation all the time + auto_ptr< TargetT > multiplicative_update_image_ptr = + auto_ptr< TargetT >(current_image_estimate.get_empty_copy()); + + const int subset_num=this->get_subset_num(); + cerr<objective_function(). + compute_sub_gradient_without_penalty_plus_sensitivity(*multiplicative_update_image_ptr, + current_image_estimate, + subset_num); + + if (this->objective_function_sptr->is_nested()) + { + // If nested EM algorithm has been selected a new estimate is already computed + // from method: compute_sub_gradient_without_penalty_plus_sensitivity + cerr << endl << "Update mechanism is nested" << endl; + current_image_estimate=*this->objective_function_sptr->last_nested_estimate_sptr; + } + + else + // divide subset gradient by subset sensitivity to obtain update image + // and multuply previous estimate with update image to obtain new estimate + { + const TargetT& sensitivity = + this->objective_function().get_subset_sensitivity(subset_num); + + + int count = 0; + + //std::cerr <MAP_model << std::endl; + + if (this->objective_function_sptr->prior_is_zero()) + { + divide(multiplicative_update_image_ptr->begin_all(), + multiplicative_update_image_ptr->end_all(), + sensitivity.begin_all(), + small_num); + + } + else + { + auto_ptr< TargetT > denominator_ptr = + auto_ptr< TargetT >(current_image_estimate.get_empty_copy()); + + + this->objective_function_sptr-> + get_prior_ptr()->compute_gradient(*denominator_ptr, current_image_estimate); + + typename TargetT::full_iterator denominator_iter = denominator_ptr->begin_all(); + const typename TargetT::full_iterator denominator_end = denominator_ptr->end_all(); + typename TargetT::const_full_iterator sensitivity_iter = sensitivity.begin_all(); + + if(this->MAP_model =="additive" ) + { + // lambda_new = lambda / (p_v + beta*prior_gradient/ num_subsets) * + // sum_subset backproj(measured/forwproj(lambda)) + // with p_v = sum_{b in subset} p_bv + // actually, we restrict 1 + beta*prior_gradient/num_subsets/p_v between .1 and 10 + while (denominator_iter != denominator_end) + { + *denominator_iter = *denominator_iter/this->get_num_subsets() + (*sensitivity_iter); + // bound denominator between (*sensitivity_iter)/10 and (*sensitivity_iter)*10 + *denominator_iter = + std::max(std::min(*denominator_iter, (*sensitivity_iter)*10),(*sensitivity_iter)/10); + ++denominator_iter; + ++sensitivity_iter; + } + } + else + { + if(this->MAP_model =="multiplicative" ) + { + // multiplicative form + // lambda_new = lambda / (p_v*(1 + beta*prior_gradient)) * + // sum_subset backproj(measured/forwproj(lambda)) + // with p_v = sum_{b in subset} p_bv + // actually, we restrict 1 + beta*prior_gradient between .1 and 10 + while (denominator_iter != denominator_end) + { + *denominator_iter += 1; + // bound denominator between 1/10 and 1*10 + // TODO code will fail if *denominator_iter is not a float + *denominator_iter = + std::max(std::min(*denominator_iter, 10.F),1/10.F); + *denominator_iter *= (*sensitivity_iter); + ++denominator_iter; + ++sensitivity_iter; + } + } + } + divide(multiplicative_update_image_ptr->begin_all(), + multiplicative_update_image_ptr->end_all(), + denominator_ptr->begin_all(), + small_num); + } + + cerr<<"Number of (cancelled) singularities in Sensitivity division: " + <inter_update_filter_interval>0 && + !is_null_ptr(this->inter_update_filter_ptr) && + !(this->subiteration_num%this->inter_update_filter_interval)) + { + + cerr<inter_update_filter_ptr->apply(current_image_estimate); + + } + + // KT 17/08/2000 limit update + // TODO move below thresholding? + if (this->write_update_image) + { + // allocate space for the filename assuming that + // we never have more than 10^49 subiterations ... + char * fname = new char[this->output_filename_prefix.size() + 60]; + sprintf(fname, "%s_update_%d", this->output_filename_prefix.c_str(), this->subiteration_num); + + // Write it to file + this->output_file_format_ptr-> + write_to_file(fname, *multiplicative_update_image_ptr); + delete[] fname; + } + + if (this->subiteration_num != 1) + { + const float current_min = + *std::min_element(multiplicative_update_image_ptr->begin_all(), + multiplicative_update_image_ptr->end_all()); + const float current_max = + *std::max_element(multiplicative_update_image_ptr->begin_all(), + multiplicative_update_image_ptr->end_all()); + const float new_min = + static_cast(this->minimum_relative_change); + const float new_max = + static_cast(this->maximum_relative_change); + cerr << "Update image old min,max: " + << current_min + << ", " + << current_max + << ", new min,max " + << max(current_min, new_min) << ", " << min(current_max, new_max) + << endl; + + threshold_upper_lower(multiplicative_update_image_ptr->begin_all(), + multiplicative_update_image_ptr->end_all(), + new_min, new_max); + } + + //current_image_estimate *= *multiplicative_update_image_ptr; + { + typename TargetT::const_full_iterator multiplicative_update_image_iter = multiplicative_update_image_ptr->begin_all_const(); + const typename TargetT::const_full_iterator end_multiplicative_update_image_iter = multiplicative_update_image_ptr->end_all_const(); + typename TargetT::full_iterator current_image_estimate_iter = current_image_estimate.begin_all(); + + while (multiplicative_update_image_iter!=end_multiplicative_update_image_iter) + { + *current_image_estimate_iter *= (*multiplicative_update_image_iter); + ++current_image_estimate_iter; ++multiplicative_update_image_iter; + } + } + } + +#ifndef PARALLEL + //cerr << "Subset : " << subset_timer.value() << "secs " < >; +template class OSMAPOSLReconstruction; +template class OSMAPOSLReconstruction; + + +END_NAMESPACE_STIR + + diff --git a/src/iterative/OSMAPOSL/exe.mk b/src/iterative/OSMAPOSL/exe.mk new file mode 100644 index 0000000000..95d0d909b3 --- /dev/null +++ b/src/iterative/OSMAPOSL/exe.mk @@ -0,0 +1,12 @@ +# +# +dir := iterative/OSMAPOSL + +$(dir)_SOURCES := \ + OSMAPOSL.cxx + +include $(WORKSPACE)/exe.mk + + + + diff --git a/src/iterative/OSMAPOSL/lib.mk b/src/iterative/OSMAPOSL/lib.mk new file mode 100644 index 0000000000..4452e38f88 --- /dev/null +++ b/src/iterative/OSMAPOSL/lib.mk @@ -0,0 +1,13 @@ +# +# +dir := iterative/OSMAPOSL + +$(dir)_LIB_SOURCES = \ + OSMAPOSLReconstruction.cxx + + +include $(WORKSPACE)/lib.mk + + + + diff --git a/src/iterative/OSSPS/CMakeLists.txt b/src/iterative/OSSPS/CMakeLists.txt new file mode 100644 index 0000000000..4b5ba24ed4 --- /dev/null +++ b/src/iterative/OSSPS/CMakeLists.txt @@ -0,0 +1,27 @@ + +set(dir iterative_OSSPS) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + OSSPSReconstruction +) + +#$(dir)_REGISTRY_SOURCES:= + +include(stir_lib_target) + +set (dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + OSSPS +) + + +include(stir_exe_targets) + +if (STIR_MPI) + SET_PROPERTY(TARGET OSSPS PROPERTY LINK_FLAGS ${MPI_CXX_LINK_FLAGS}) +endif() + +target_link_libraries(iterative_OSSPS recon_buildblock ) diff --git a/src/iterative/OSSPS/OSSPS.cxx b/src/iterative/OSSPS/OSSPS.cxx new file mode 100644 index 0000000000..54f4968eb5 --- /dev/null +++ b/src/iterative/OSSPS/OSSPS.cxx @@ -0,0 +1,50 @@ +// +/* + Copyright (C) 2002- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup OSSPS + \brief main() for stir::OSSPSReconstruction + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +#include "stir/OSSPS/OSSPSReconstruction.h" +#include "stir/DiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/recon_buildblock/distributable_main.h" + +USING_NAMESPACE_STIR + +#ifdef STIR_MPI +int stir::distributable_main(int argc, char **argv) +#else +int main(int argc, char **argv) +#endif +{ + + OSSPSReconstruction > reconstruction_object(argc>1?argv[1]:""); + + + return reconstruction_object.reconstruct() == Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; + + +} + diff --git a/src/iterative/OSSPS/OSSPSReconstruction.cxx b/src/iterative/OSSPS/OSSPSReconstruction.cxx new file mode 100644 index 0000000000..3c9f189191 --- /dev/null +++ b/src/iterative/OSSPS/OSSPSReconstruction.cxx @@ -0,0 +1,506 @@ +// +// +/* + Copyright (C) 2002- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! +\file +\ingroup OSSPS +\ingroup reconstructors +\brief implementation of the stir::OSSPSReconstruction class + +\author Sanida Mustafovic +\author Kris Thielemans + +*/ + +#include "stir/OSSPS/OSSPSReconstruction.h" +#include "stir/min_positive_element.h" +#include "stir/recon_array_functions.h" +#include "stir/recon_buildblock/PriorWithParabolicSurrogate.h" +#include "stir/Succeeded.h" +#include "stir/recon_array_functions.h" +#include "stir/thresholding.h" +#include "stir/is_null_ptr.h" +#include "stir/NumericInfo.h" +#include "stir/utilities.h" +#include "stir/IO/read_from_file.h" + +#include +#include +#include +#include +#ifdef BOOST_NO_STRINGSTREAM +#include +#else +#include +#endif +#include "boost/lambda/lambda.hpp" + +#ifndef STIR_NO_NAMESPACES +using std::auto_ptr; +using std::cerr; +using std::endl; +using boost::lambda::_1; +using boost::lambda::_2; +#endif + + +START_NAMESPACE_STIR + +//*************** parameters ************* + + +template +void +OSSPSReconstruction:: +set_defaults() +{ + base_type::set_defaults(); + enforce_initial_positivity = 0; + upper_bound = NumericInfo().max_value(); + write_update_image = 0; + precomputed_denominator_filename = ""; + + //MAP_model="additive"; + relaxation_parameter = 1; + relaxation_gamma = 0.1F; + +#if 0 + this->do_line_search = false; +#endif + +} + +template +void +OSSPSReconstruction:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("OSSPSParameters"); + this->parser.add_stop_key("End"); + + this->parser.add_key("enforce initial positivity condition",&enforce_initial_positivity); + //this->parser.add_key("MAP_model", &MAP_model); + this->parser.add_key("upper bound", &upper_bound); + this->parser.add_key("write update image",&write_update_image); + this->parser.add_key("precomputed denominator", &precomputed_denominator_filename); + + this->parser.add_key("relaxation parameter", &relaxation_parameter); + this->parser.add_key("relaxation gamma", &relaxation_gamma); +#if 0 + this->parser.add_key("do_line_search", &this->do_line_search); +#endif +} + + +template +void +OSSPSReconstruction:: +ask_parameters() +{ + error("Currently incomplete code. Use a parameter file. Sorry."); + + base_type::ask_parameters(); + + // KT 05/07/2000 made enforce_initial_positivity int + enforce_initial_positivity= + ask("Enforce initial positivity condition?",true) ? 1 : 0; + + char precomputed_denominator_filename_char[max_filename_length]; + + ask_filename_with_extension(precomputed_denominator_filename_char,"Enter file name of precomputed denominator (1 = 1's): ", ""); + + precomputed_denominator_filename=precomputed_denominator_filename_char; + + + + { + + cerr<::list_registered_names(cerr); + const string objective_function_type = ask_string(""); + + this->objective_function_sptr. + reset(GeneralisedObjectiveFunction::read_registered_object(0, objective_function_type)); + + } + + // KT 17/08/2000 3 new parameters + const double max_in_double = static_cast(NumericInfo().max_value()); + upper_bound = ask_num("upper bound", + 1.,max_in_double,max_in_double); + + write_update_image = ask_num("write update image", 0,1,0); + + // TODO some more parameters here (relaxation et al) +} + + + + +template +bool +OSSPSReconstruction:: +post_processing() +{ + if (base_type::post_processing()) + return true; + return false; +} + +//*************** other functions ************* + +template +OSSPSReconstruction:: +OSSPSReconstruction() +{ + set_defaults(); +} + +template +OSSPSReconstruction:: +OSSPSReconstruction(const string& parameter_filename) +{ + this->initialise(parameter_filename); + cerr<parameter_info(); +} + +template +std::string +OSSPSReconstruction:: +method_info() const +{ + + // TODO add prior name? + +#ifdef BOOST_NO_STRINGSTREAM + char str[10000]; + ostrstream s(str, 10000); +#else + std::ostringstream s; +#endif + + // if(inter_update_filter_interval>0) s<<"IUF-"; + if (!this->objective_function_sptr->prior_is_zero()) + s << "MAP-"; + if(this->num_subsets>1) + s<<"OS-"; + s << "SPS"; + if(this->inter_iteration_filter_interval>0) s<<"S"; + + return s.str(); +} + +template +Succeeded +OSSPSReconstruction:: +precompute_denominator_of_conditioner_without_penalty() +{ + + CPUTimer timer; + timer.reset(); + timer.start(); + + assert(*std::max_element(precomputed_denominator_ptr->begin_all(), precomputed_denominator_ptr->end_all()) == 0); + assert(*std::min_element(precomputed_denominator_ptr->begin_all(), precomputed_denominator_ptr->end_all()) == 0); + + // TODO replace by boost::scoped_ptr + std::auto_ptr data_full_of_ones_aptr = + std::auto_ptr + ( precomputed_denominator_ptr->clone()); + std::fill(data_full_of_ones_aptr->begin_all(), + data_full_of_ones_aptr->end_all(), + 1); + + this->objective_function_sptr-> + add_multiplication_with_approximate_Hessian_without_penalty( + *precomputed_denominator_ptr, + *data_full_of_ones_aptr); + timer.stop(); + cerr << "Precomputing denominator took " << timer.value() << " s CPU time\n"; + cerr << "min and max in precomputed denominator " + << *std::min_element(precomputed_denominator_ptr->begin_all(), precomputed_denominator_ptr->end_all()) + << ", " + << *std::max_element(precomputed_denominator_ptr->begin_all(), precomputed_denominator_ptr->end_all()) + << std::endl; + + + // Write it to file + { + std::string fname = + this->output_filename_prefix + + "_precomputed_denominator"; + + cerr <<" - Saving " << fname << endl; + this->output_file_format_ptr-> + write_to_file(fname, *precomputed_denominator_ptr); + } + + return Succeeded::yes; +} + +template +Succeeded +OSSPSReconstruction:: +set_up(shared_ptr const& target_image_ptr) +{ + if (base_type::set_up(target_image_ptr) == Succeeded::no) + return Succeeded::no; + + if (this->relaxation_parameter<=0) + { + warning("OSSPS: relaxation parameter should be positive but is %g", + this->relaxation_parameter); + return Succeeded::no; + } + if (this->relaxation_gamma<0) + { + warning("OSSPS: relaxation_gamma parameter should be non-negative but is %g", + this->relaxation_gamma); + return Succeeded::no; + } + + if (!is_null_ptr(this->get_prior_ptr())&& + dynamic_cast*>(this->get_prior_ptr())==0) + { + warning("OSSPS: Prior must be of a type derived from PriorWithParabolicSurrogate\n"); + return Succeeded::no; + } + + if(enforce_initial_positivity) + threshold_min_to_small_positive_value(target_image_ptr->begin_all(), + target_image_ptr->end_all(), + 10.E-6F); + + if(this->precomputed_denominator_filename=="") + { + precomputed_denominator_ptr.reset(target_image_ptr->get_empty_copy()); + precompute_denominator_of_conditioner_without_penalty(); + } + else if(this->precomputed_denominator_filename=="1") + { + precomputed_denominator_ptr.reset(target_image_ptr->get_empty_copy()); + std::fill(precomputed_denominator_ptr->begin_all(), precomputed_denominator_ptr->end_all(), 1.F); + } + else + { + precomputed_denominator_ptr = + read_from_file(this->precomputed_denominator_filename); + { + string explanation; + if (!precomputed_denominator_ptr->has_same_characteristics(*target_image_ptr, explanation)) + { + warning("OSSPS: precomputed_denominator should have same characteristics as target image: %s", + explanation.c_str()); + return Succeeded::no; + } + } + } + return Succeeded::yes; +} + + + +/*! \brief OSSPS additive update at every subiteration + \warning This modifies *precomputed_denominator_ptr. So, you have to + call set_up() before running a new reconstruction. + */ +template +void +OSSPSReconstruction:: +update_estimate(TargetT ¤t_image_estimate) +{ + if (this->get_subiteration_num() == this->get_start_subiteration_num()) + { + // set all voxels to 0 that cannot be estimated. + this->objective_function_sptr-> + fill_nonidentifiable_target_parameters(current_image_estimate, 0); + } + // Check if we need to recompute the penalty term in the denominator during iterations . + // For the quadratic prior, this is independent of the image (only on kappa's) + // And of course, it's also independent when there is no prior + // TODO by default, this should be off probably (to save time). + const bool recompute_penalty_term_in_denominator = + !this->objective_function_sptr->prior_is_zero() && + static_cast const&>(*this->get_prior_ptr()). + parabolic_surrogate_curvature_depends_on_argument(); +#ifndef PARALLEL + //CPUTimer subset_timer; + //subset_timer.start(); +#else // PARALLEL + PTimer timerSubset; + timerSubset.Start(); +#endif // PARALLEL + + const int subset_num=this->get_subset_num(); + cerr< numerator_ptr = + auto_ptr< TargetT >(current_image_estimate.get_empty_copy()); + + this->objective_function_sptr->compute_sub_gradient(*numerator_ptr, current_image_estimate, subset_num); + //*numerator_ptr *= this->num_subsets; + std::transform(numerator_ptr->begin_all(), numerator_ptr->end_all(), + numerator_ptr->begin_all(), + _1 * this->num_subsets); + + cerr<< "num subsets " << this->num_subsets << '\n'; + cerr << "this->num_subsets*subgradient : max " + << *std::max_element(numerator_ptr->begin_all(), numerator_ptr->end_all()); + cerr << ", min " + << *std::min_element(numerator_ptr->begin_all(), numerator_ptr->end_all()) + << endl; + + // now divide by denominator + + if (recompute_penalty_term_in_denominator || + (this->get_subiteration_num() == this->get_start_subiteration_num())) + { + auto_ptr< TargetT > work_image_ptr = + auto_ptr< TargetT >(current_image_estimate.get_empty_copy()); + + // avoid work (or crash) when penalty is 0 + if (!this->objective_function_sptr->prior_is_zero()) + { + static_cast&>(*get_prior_ptr()). + parabolic_surrogate_curvature(*work_image_ptr, current_image_estimate); + //*work_image_ptr *= 2; + //*work_image_ptr += *precomputed_denominator_ptr ; + std::transform(work_image_ptr->begin_all(), work_image_ptr->end_all(), + precomputed_denominator_ptr->begin_all(), + work_image_ptr->begin_all(), + _1 * 2 + _2); + } + else + *work_image_ptr = *precomputed_denominator_ptr ; + + // KT 09/12/2002 new + // avoid division by 0 by thresholding the denominator to be strictly positive + threshold_min_to_small_positive_value(work_image_ptr->begin_all(), + work_image_ptr->end_all(), + 10.E-6F); + cerr << " denominator max " + << *std::max_element(work_image_ptr->begin_all(), work_image_ptr->end_all()); + cerr << ", min " + << *std::min_element(work_image_ptr->begin_all(), work_image_ptr->end_all()) + << endl; + + if (!recompute_penalty_term_in_denominator) + { + // store for future use + *precomputed_denominator_ptr = *work_image_ptr; + } + + //*numerator_ptr /= *work_image_ptr; + std::transform(numerator_ptr->begin_all(), numerator_ptr->end_all(), + work_image_ptr->begin_all(), + numerator_ptr->begin_all(), + _1 / _2); + + } + else + { + // we have computed the denominator already + //*numerator_ptr /= *precomputed_denominator_ptr; + std::transform(numerator_ptr->begin_all(), numerator_ptr->end_all(), + precomputed_denominator_ptr->begin_all(), + numerator_ptr->begin_all(), + _1 / _2); + + } + + //relaxation_parameter ~1/(1+n) where n is iteration number + const float relaxation_parameter = this->relaxation_parameter/ + (1+this->relaxation_gamma*(this->subiteration_num/this->num_subsets)); + + + std::cerr << "relaxation parameter = " << relaxation_parameter << '\n'; + + const float alpha = 1.F; // line_search(current_image_estimate, *numerator_ptr); + // *numerator_ptr *= relaxation_parameter * alpha; + std::transform(numerator_ptr->begin_all(), numerator_ptr->end_all(), + numerator_ptr->begin_all(), + _1 * relaxation_parameter * alpha); + + + if (write_update_image) + { + // Write it to file + const std::string fname = + this->make_filename_prefix_subiteration_num(this->output_filename_prefix + "_update"); + this->output_file_format_ptr-> + write_to_file(fname, *numerator_ptr); + } + + { + cerr << "additive update image min,max: " + << *std::min_element(numerator_ptr->begin_all(), numerator_ptr->end_all()) + << ", " + << *std::max_element(numerator_ptr->begin_all(), numerator_ptr->end_all()) + << endl; + } + current_image_estimate += *numerator_ptr; + + // now threshold image + { + const float current_min = + *std::min_element(current_image_estimate.begin_all(), + current_image_estimate.end_all()); + const float current_max = + *std::max_element(current_image_estimate.begin_all(), + current_image_estimate.end_all()); + const float new_min = 0.F; + const float new_max = + static_cast(upper_bound); + cerr << "current image old min,max: " + << current_min + << ", " + << current_max + << ", new min,max " + << max(current_min, new_min) << ", " << min(current_max, new_max) + << endl; + + threshold_upper_lower(current_image_estimate.begin_all(), + current_image_estimate.end_all(), + new_min, new_max); + } + +#ifndef PARALLEL + //cerr << "Subset : " << subset_timer.value() << "secs " < >; +template class OSSPSReconstruction; + +END_NAMESPACE_STIR + + diff --git a/src/iterative/OSSPS/exe.mk b/src/iterative/OSSPS/exe.mk new file mode 100644 index 0000000000..17c434c8fe --- /dev/null +++ b/src/iterative/OSSPS/exe.mk @@ -0,0 +1,9 @@ +# +# + +dir:=iterative/OSSPS + +$(dir)_SOURCES = \ + OSSPS.cxx + +include $(WORKSPACE)/exe.mk diff --git a/src/iterative/OSSPS/lib.mk b/src/iterative/OSSPS/lib.mk new file mode 100644 index 0000000000..c04f43be51 --- /dev/null +++ b/src/iterative/OSSPS/lib.mk @@ -0,0 +1,13 @@ +# +# + + +dir:=iterative/OSSPS + +$(dir)_LIB_SOURCES:= \ + OSSPSReconstruction.cxx + +#$(dir)_REGISTRY_SOURCES:= + +include $(WORKSPACE)/lib.mk + diff --git a/src/iterative/POSMAPOSL/CMakeLists.txt b/src/iterative/POSMAPOSL/CMakeLists.txt new file mode 100644 index 0000000000..3882467be0 --- /dev/null +++ b/src/iterative/POSMAPOSL/CMakeLists.txt @@ -0,0 +1,29 @@ +# +# +# Copyright 2011-07-01 - 2011 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake helper file for building STIR. + +set(dir iterative_POSMAPOSL) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + POSMAPOSL +) + +include(stir_exe_targets) diff --git a/src/iterative/POSMAPOSL/POSMAPOSL.cxx b/src/iterative/POSMAPOSL/POSMAPOSL.cxx new file mode 100644 index 0000000000..2a6911f6e8 --- /dev/null +++ b/src/iterative/POSMAPOSL/POSMAPOSL.cxx @@ -0,0 +1,47 @@ +/* + Copyright (C) 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2 of the License, or + (at your option) any later version. + + This file 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. + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup main_programs + \brief main() for stir::OSMAPOSLReconstruction on parametric images + + \author Kris Thielemans +*/ +#include "stir/Succeeded.h" +#include "stir/OSMAPOSL/OSMAPOSLReconstruction.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/recon_buildblock/distributable_main.h" + + + +#ifdef STIR_MPI +int stir::distributable_main(int argc, char **argv) +#else +int main(int argc, char **argv) +#endif +{ + using namespace stir; + + OSMAPOSLReconstruction + reconstruction_object(argc>1?argv[1]:""); + + return reconstruction_object.reconstruct() == Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; + + +} + diff --git a/src/iterative/POSMAPOSL/exe.mk b/src/iterative/POSMAPOSL/exe.mk new file mode 100644 index 0000000000..9710e60321 --- /dev/null +++ b/src/iterative/POSMAPOSL/exe.mk @@ -0,0 +1,12 @@ +# +# +dir := iterative/POSMAPOSL + +$(dir)_SOURCES := \ + POSMAPOSL.cxx + +include $(WORKSPACE)/exe.mk + + + + diff --git a/src/iterative/POSSPS/CMakeLists.txt b/src/iterative/POSSPS/CMakeLists.txt new file mode 100644 index 0000000000..cb0145c200 --- /dev/null +++ b/src/iterative/POSSPS/CMakeLists.txt @@ -0,0 +1,29 @@ +# +# +# Copyright 2011-07-01 - 2011 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake helper file for building STIR. + +set(dir iterative_POSSPS) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + POSSPS +) + +include(stir_exe_targets) diff --git a/src/iterative/POSSPS/POSSPS.cxx b/src/iterative/POSSPS/POSSPS.cxx new file mode 100644 index 0000000000..36b0d3d6b2 --- /dev/null +++ b/src/iterative/POSSPS/POSSPS.cxx @@ -0,0 +1,45 @@ +/* + Copyright (C) 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup OSSPS + \brief main() for stir::OSSPS for parametric images + + \author Sanida Mustafovic + \author Kris Thielemans + \author Charalampos Tsoumpas +*/ +#include "stir/OSSPS/OSSPSReconstruction.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/recon_buildblock/distributable_main.h" + + + +#ifdef STIR_MPI +int stir::distributable_main(int argc, char **argv) +#else +int main(int argc, char **argv) +#endif +{ + using namespace stir; + OSSPSReconstruction reconstruction_object(argc>1?argv[1]:""); + + return reconstruction_object.reconstruct() == Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/src/iterative/POSSPS/exe.mk b/src/iterative/POSSPS/exe.mk new file mode 100644 index 0000000000..732971eba0 --- /dev/null +++ b/src/iterative/POSSPS/exe.mk @@ -0,0 +1,12 @@ +# +# +dir := iterative/POSSPS + +$(dir)_SOURCES := \ + POSSPS.cxx + +include $(WORKSPACE)/exe.mk + + + + diff --git a/src/lib.mk b/src/lib.mk new file mode 100644 index 0000000000..4fda05b6da --- /dev/null +++ b/src/lib.mk @@ -0,0 +1,59 @@ +# +# Author Kris Thielemans +# Copyright 2004- 2004 Hammersmith Imanet Ltd +# This file is part of STIR, and is distributed under the +# terms of the GNU Lesser General Public Licence (LGPL) Version 2.1. +# +# This file will/can be included by a makefile skeleton in a subdirectory +# Requirements: +# the skeleton should set the following variables +# dir must be the subdirectory (relative to the root) +# $(dir)_LIB_SOURCES must be set to a list of .cxx or .c files (without path) +# $(dir)_REGISTRY_SOURCES must be set to a list of .cxx or .c files (without path) +# Result: +# targets clean_lib_$(dir) build_lib_$(dir) +# variables $(dir)_LIB_SOURCES, $(dir)_REGISTRY_OBJS (both with $dir)/ prepended) +# $(dir)_LIB_OBJS + + +#$(warning including lib.mk from $(dir)) + +.PHONY: clean_lib_$(dir) build_lib_$(dir) + + +$(dir)_LIB_SOURCES:= $(addprefix $(dir)/, $($(dir)_LIB_SOURCES)) +$(dir)_REGISTRY_SOURCES:= $(addprefix $(dir)/, $($(dir)_REGISTRY_SOURCES)) +$(dir)_LIB_OBJS:= \ + $(patsubst %.cxx, $(DEST)%${O_SUFFIX}, $(filter %.cxx, $($(dir)_LIB_SOURCES))) \ + $(patsubst %.c, $(DEST)%${O_SUFFIX}, $(filter %.c, $($(dir)_LIB_SOURCES))) +$(dir)_REGISTRY_OBJS:= \ + $(patsubst %.cxx, $(DEST)%${O_SUFFIX}, $(filter %.cxx, $($(dir)_REGISTRY_SOURCES))) \ + $(patsubst %.c, $(DEST)%${O_SUFFIX}, $(filter %.c, $($(dir)_REGISTRY_SOURCES))) + +build_lib_$(dir): $($(dir)_LIB_OBJS) $($(dir)_REGISTRY_OBJS) + +ifneq ($(MAKECMDGOALS:clean%=clean),clean) + $(dir)_ALL_SOURCES:=$($(dir)_LIB_SOURCES) $($(dir)_REGISTRY_SOURCES) + -include \ + $(patsubst %.cxx, $(DEST)%.P, $(filter %.cxx, $($(dir)_ALL_SOURCES))) \ + $(patsubst %.c, $(DEST)%.P, $(filter %.c, $($(dir)_ALL_SOURCES))) +endif + +.PRECIOUS: $($(dir)_REGISTRY_OBJS) + +# ideally we'd just have the following +# +#clean_lib_$(dir): +# rm -f $(DEST)$(dir)/*.[oP] +# this doesn't work, because $(dir) in the execution line is evaluated +# at the end of all Makefile reading. By that time, $(dir) will be something else. +# the following work-around by Paul D Smith does the trick + +clean_lib_$(dir): + rm -f $(DEST)$(@:clean_lib_%=%)/*.[P] + rm -f $(DEST)$(@:clean_lib_%=%)/*$(O_SUFFIX) + + + +# set to some garbage such that we get an error when the next skeleton forgets to set dir +dir := dir_not_set_in_lib.mk diff --git a/src/listmode_buildblock/CListEvent.cxx b/src/listmode_buildblock/CListEvent.cxx new file mode 100644 index 0000000000..ad801a2685 --- /dev/null +++ b/src/listmode_buildblock/CListEvent.cxx @@ -0,0 +1,51 @@ +// +// +/*! + \file + \ingroup listmode + \brief Implementations of class stir::CListEvent. + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/listmode/CListRecord.h" +#include "stir/ProjDataInfo.h" +#include "stir/Bin.h" +#include "stir/LORCoordinates.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +Succeeded +CListEvent:: +set_prompt(const bool) +{ + return Succeeded::no; +} + +void +CListEvent:: +get_bin(Bin& bin, const ProjDataInfo& proj_data_info) const +{ + bin = proj_data_info.get_bin(get_LOR()); +} + +END_NAMESPACE_STIR diff --git a/src/listmode_buildblock/CListModeData.cxx b/src/listmode_buildblock/CListModeData.cxx new file mode 100644 index 0000000000..135e5c1f58 --- /dev/null +++ b/src/listmode_buildblock/CListModeData.cxx @@ -0,0 +1,75 @@ +/*! + \file + \ingroup listmode + \brief Implementation of class stir::CListModeData + + \author Kris Thielemans +*/ +/* + Copyright (C) 2003, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/listmode/CListModeData.h" +#include "stir/ExamInfo.h" +#include "stir/is_null_ptr.h" + +START_NAMESPACE_STIR + +CListModeData:: +CListModeData() +{ +} + +CListModeData:: +~CListModeData() +{} + +const ExamInfo* +CListModeData::get_exam_info_ptr() const +{ + assert(!is_null_ptr(exam_info_sptr)); + return exam_info_sptr.get(); +} + +shared_ptr +CListModeData::get_exam_info_sptr() const +{ + return exam_info_sptr; +} + +const Scanner* +CListModeData:: +get_scanner_ptr() const +{ + assert(!is_null_ptr(exam_info_sptr)); + return this->scanner_sptr.get(); +} + +#if 0 +std::time_t +CListModeData:: +get_scan_start_time_in_secs_since_1970() const +{ + const double time = this->exam_info_sptr->start_time_in_secs_since_1970; + if (time<=0) + return std::time_t(-1); + else + return time; +} +#endif + +END_NAMESPACE_STIR diff --git a/src/listmode_buildblock/CListModeDataECAT.cxx b/src/listmode_buildblock/CListModeDataECAT.cxx new file mode 100644 index 0000000000..fae31ba9b2 --- /dev/null +++ b/src/listmode_buildblock/CListModeDataECAT.cxx @@ -0,0 +1,337 @@ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Implementation of class stir::CListModeDataECAT + + \author Kris Thielemans +*/ + + +#include "stir/listmode/CListModeDataECAT.h" +#include "stir/listmode/CListRecordECAT966.h" +#include "stir/listmode/CListRecordECAT962.h" +#include "stir/ExamInfo.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/stir_ecat7.h" +#else +#error Need HAVE_LLN_MATRIX +#endif +#include "boost/static_assert.hpp" +#include +#include +#include +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::ios; +using std::fstream; +using std::ifstream; +using std::istream; +#endif + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +// compile time asserts +BOOST_STATIC_ASSERT(sizeof(CListTimeDataECAT966)==4); +BOOST_STATIC_ASSERT(sizeof(CListEventDataECAT966)==4); +BOOST_STATIC_ASSERT(sizeof(CListTimeDataECAT962)==4); +BOOST_STATIC_ASSERT(sizeof(CListEventDataECAT962)==4); + +template +CListModeDataECAT:: +CListModeDataECAT(const std::string& listmode_filename_prefix) + : listmode_filename_prefix(listmode_filename_prefix) +{ + // initialise scanner_ptr before calling open_lm_file, as it is used in that function + + this->exam_info_sptr.reset(new ExamInfo); + ExamInfo& exam_info(*exam_info_sptr); + exam_info.imaging_modality = ImagingModality::PT; + // attempt to read the .sgl file + { + const string singles_filename = listmode_filename_prefix + "_1.sgl"; + ifstream singles_file(singles_filename.c_str(), ios::binary); + char buffer[sizeof(Main_header)]; + if (!singles_file) + { + warning("CListModeDataECAT: Couldn't read main_header from %s. We forge ahead anyway (assuming this is ECAT 962 data).", singles_filename.c_str()); + scanner_sptr.reset(new Scanner(Scanner::E962)); + // TODO invalidate other fields in singles header + } + else + { + Main_header singles_main_header; + singles_file.read(buffer, + sizeof(singles_main_header)); + unmap_main_header(buffer, &singles_main_header); + ecat::ecat7::find_scanner(scanner_sptr, singles_main_header); + + exam_info.start_time_in_secs_since_1970 = double(singles_main_header.scan_start_time); + + switch(singles_main_header.patient_orientation) + { + case FeetFirstProne: + exam_info.patient_position = PatientPosition(PatientPosition::FFP); break; + case HeadFirstProne: + exam_info.patient_position = PatientPosition(PatientPosition::HFP); break; + case FeetFirstSupine: + exam_info.patient_position = PatientPosition(PatientPosition::FFS); break; + case HeadFirstSupine: + exam_info.patient_position = PatientPosition(PatientPosition::HFS); break; + case FeetFirstRight: + exam_info.patient_position = PatientPosition(PatientPosition::FFDR); break; + case HeadFirstRight: + exam_info.patient_position = PatientPosition(PatientPosition::HFDR); break; + case FeetFirstLeft: + exam_info.patient_position = PatientPosition(PatientPosition::FFDL); break; + case HeadFirstLeft: + exam_info.patient_position = PatientPosition(PatientPosition::HFDL); break; + case UnknownOrientation: + default: + exam_info.patient_position = PatientPosition(PatientPosition::unknown_position); break; + } + } + } + + if ((scanner_sptr->get_type() == Scanner::E966 && typeid(CListRecordT) != typeid(CListRecordECAT966)) || + (scanner_sptr->get_type() == Scanner::E962 && typeid(CListRecordT) != typeid(CListRecordECAT962))) + { + error("Data in %s is from a %s scanner, but reading with wrong type of CListModeData", + listmode_filename_prefix.c_str(), scanner_sptr->get_name().c_str()); + } + else if (scanner_sptr->get_type() != Scanner::E966 && scanner_sptr->get_type() != Scanner::E962) + { + error("CListModeDataECAT: Unsupported scanner in %s", listmode_filename_prefix.c_str()); + } + + if (open_lm_file(1) == Succeeded::no) + error("CListModeDataECAT: error opening the first listmode file for filename %s\n", + listmode_filename_prefix.c_str()); +} + +template +std::string +CListModeDataECAT:: +get_name() const +{ + return listmode_filename_prefix + "_1.sgl"; +} + + +template +shared_ptr +CListModeDataECAT:: +get_empty_record_sptr() const +{ + shared_ptr sptr(new CListRecordT); + return sptr; +} + +template +Succeeded +CListModeDataECAT:: +open_lm_file(unsigned int new_lm_file) const +{ + // current_lm_file and new_lm_file are 1-based + assert(new_lm_file>0); + + if (is_null_ptr(current_lm_data_ptr) || new_lm_file != current_lm_file) + { + // first store saved_get_positions + if (!is_null_ptr(current_lm_data_ptr)) + { + assert(current_lm_file>0); + if (current_lm_file>=saved_get_positions_for_each_lm_data.size()) + saved_get_positions_for_each_lm_data.resize(current_lm_file); + + saved_get_positions_for_each_lm_data[current_lm_file-1] = + current_lm_data_ptr->get_saved_get_positions(); + } + + // now open new file + std::string filename = listmode_filename_prefix; + char rest[50]; + sprintf(rest, "_%d.lm", new_lm_file); + filename += rest; + cerr << "CListModeDataECAT: opening file " << filename << endl; + shared_ptr stream_ptr(new fstream(filename.c_str(), ios::in | ios::binary)); + if (!(*stream_ptr)) + { + warning("CListModeDataECAT: cannot open file %s (probably this is perfectly ok)\n ", filename.c_str()); + return Succeeded::no; + } + current_lm_data_ptr.reset( + new InputStreamWithRecords(stream_ptr, + sizeof(CListTimeDataECAT966), + sizeof(CListTimeDataECAT966), + ByteOrder::big_endian != ByteOrder::get_native_order())); + current_lm_file = new_lm_file; + + // now restore saved_get_positions for this file + if (!is_null_ptr(current_lm_data_ptr) && + current_lm_file + set_saved_get_positions(saved_get_positions_for_each_lm_data[current_lm_file-1]); + + return Succeeded::yes; + } + else + return current_lm_data_ptr->reset(); +} + +/*! \todo Currently switches over to the next .lm file whenever + get_next_record() on the current file fails. This even happens + when it failed not because of EOF, or if the listmode file is + shorter than 2 GB. +*/ +template +Succeeded +CListModeDataECAT:: +get_next_record(CListRecord& record_of_general_type) const +{ + CListRecordT& record = static_cast(record_of_general_type); + if (current_lm_data_ptr->get_next_record(record) == Succeeded::yes) + return Succeeded::yes; + else + { + // warning: do not modify current_lm_file here. This is done by open_lm_file + // open_lm_file uses current_lm_file as well + if (open_lm_file(current_lm_file+1) == Succeeded::yes) + return current_lm_data_ptr->get_next_record(record); + else + return Succeeded::no; + } +} + + + +template +Succeeded +CListModeDataECAT:: +reset() +{ + // current_lm_file and new_lm_file are 1-based + assert(current_lm_file>0); + if (current_lm_file!=1) + { + return open_lm_file(1); + } + else + { + return current_lm_data_ptr->reset(); + } +} + + +template +CListModeData::SavedPosition +CListModeDataECAT:: +save_get_position() +{ + GetPosition current_pos; + current_pos.first = current_lm_file; + current_pos.second = current_lm_data_ptr->save_get_position(); + saved_get_positions.push_back(current_pos); + return saved_get_positions.size()-1; +} + +template +Succeeded +CListModeDataECAT:: +set_get_position(const typename CListModeDataECAT::SavedPosition& pos) +{ + assert(pos < saved_get_positions.size()); + if (open_lm_file(saved_get_positions[pos].first) == Succeeded::no) + return Succeeded::no; + + return + current_lm_data_ptr->set_get_position(saved_get_positions[pos].second); +} +#if 0 +template +SavedPosition +CListModeDataECAT:: +save_get_pos_at_time(const double time) +{ + assert(time>=0); + shared_ptr record_sptr = get_empty_record_sptr(); + CListRecord& record = *record_sptr; + + // we first check if we can continue reading from the current point + // or have to go back to the start of the list mode data + { + bool we_read_one = false; + while (get_next_record(record) == Succeeded::yes) + { + we_read_one = true; + if(record.is_time()) + { + const double new_time = record.time().get_time_in_secs(); + if (new_time > time) + reset(); + break; + } + } + if (!we_read_one) + { + // we might have been at the end of file + reset(); + } + } + + while (get_next_record(record) == Succeeded::yes) + { + if(record.is_time()) + { + const double new_time = record.time().get_time_in_secs(); + if (new_time>=time) + { + return save_get_position(); + } + } + } + // TODO not nice: should flag EOF or so. + return save_get_position(); + +} + +#endif +#if 0 +template +unsigned long +CListModeDataECAT:: +get_num_records() const +{ +} + +#endif + + +// instantiations +template class CListModeDataECAT; +template class CListModeDataECAT; + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR diff --git a/src/listmode_buildblock/CListRecordECAT962.cxx b/src/listmode_buildblock/CListRecordECAT962.cxx new file mode 100644 index 0000000000..ce4fcda683 --- /dev/null +++ b/src/listmode_buildblock/CListRecordECAT962.cxx @@ -0,0 +1,91 @@ +// +// +/* + Copyright (C) 1998- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Implementation of classes CListEventECAT962 and CListRecordECAT962 + for listmode events for the ECAT 962 (aka Exact HR+). + + \author Kris Thielemans + +*/ + +#include "stir/listmode/CListRecordECAT962.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Bin.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + + +/* Global Definitions */ +static const int MAXPROJBIN = 512; +/* data for the 962 scanner */ +static const int CRYSTALRINGSPERDETECTOR = 8; +//TODO NK check +void +CListEventDataECAT962:: +get_sinogram_and_ring_coordinates( + int& view_num, int& tangential_pos_num, unsigned int& ring_a, unsigned int& ring_b) const +{ + const int NumProjBins = MAXPROJBIN; + const int NumProjBinsBy2 = MAXPROJBIN / 2; + + view_num = view; + tangential_pos_num = bin; + /* KT 31/05/98 use >= in comparison now */ + if ( tangential_pos_num >= NumProjBinsBy2 ) + tangential_pos_num -= NumProjBins ; + + ring_a = ( (block_A_ring_bit0 + 2*block_A_ring_bit1) + * CRYSTALRINGSPERDETECTOR ) + block_A_detector ; + ring_b = ( (block_B_ring_bit0 + 2*block_B_ring_bit1) + * CRYSTALRINGSPERDETECTOR ) + block_B_detector ; +} + +void +CListEventDataECAT962:: +set_sinogram_and_ring_coordinates( + const int view_num, const int tangential_pos_num, + const unsigned int ring_a, const unsigned int ring_b) +{ + const int NumProjBins = MAXPROJBIN; + type = 0; + const unsigned int block_A_ring = ring_a / CRYSTALRINGSPERDETECTOR; + block_A_detector = ring_a % CRYSTALRINGSPERDETECTOR; + const unsigned int block_B_ring = ring_b / CRYSTALRINGSPERDETECTOR; + block_B_detector = ring_b % CRYSTALRINGSPERDETECTOR; + + assert(block_A_ring<4); + block_A_ring_bit0 = block_A_ring | 0x1; + block_A_ring_bit1 = block_A_ring/2; + assert(block_B_ring<4); + block_B_ring_bit0 = block_B_ring | 0x1; + block_B_ring_bit1 = block_B_ring/2; + + bin = tangential_pos_num < 0 ? tangential_pos_num + NumProjBins : tangential_pos_num; + view = view_num; +} + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR diff --git a/src/listmode_buildblock/CListRecordECAT966.cxx b/src/listmode_buildblock/CListRecordECAT966.cxx new file mode 100644 index 0000000000..84fb644433 --- /dev/null +++ b/src/listmode_buildblock/CListRecordECAT966.cxx @@ -0,0 +1,85 @@ +// +// +/* + Copyright (C) 1998- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup listmode + \brief Implementation of classes CListEventECAT966 and CListRecordECAT966 + for listmode events for the ECAT 966 (aka Exact 3d). + + \author Kris Thielemans + +*/ + +#include "stir/listmode/CListRecordECAT966.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Bin.h" +#include "stir/Succeeded.h" + +#include + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + +// static members +/* Global Definitions */ +static const int MAXPROJBIN = 512; +/* data for the 966 scanner */ +static const int CRYSTALRINGSPERDETECTOR = 8; + +void +CListEventDataECAT966:: +get_sinogram_and_ring_coordinates( + int& view_num, int& tangential_pos_num, unsigned int& ring_a, unsigned int& ring_b) const +{ + const int NumProjBins = MAXPROJBIN; + const int NumProjBinsBy2 = MAXPROJBIN / 2; + + view_num = view; + tangential_pos_num = bin; + /* KT 31/05/98 use >= in comparison now */ + if ( tangential_pos_num >= NumProjBinsBy2 ) + tangential_pos_num -= NumProjBins ; + + ring_a = ( block_A_ring * CRYSTALRINGSPERDETECTOR ) + block_A_detector ; + ring_b = ( block_B_ring * CRYSTALRINGSPERDETECTOR ) + block_B_detector ; +} + +void +CListEventDataECAT966:: +set_sinogram_and_ring_coordinates( + const int view_num, const int tangential_pos_num, + const int ring_a, const int ring_b) +{ + const int NumProjBins = MAXPROJBIN; + type = 0; + block_A_ring = ring_a / CRYSTALRINGSPERDETECTOR; + block_A_detector = ring_a % CRYSTALRINGSPERDETECTOR; + block_B_ring = ring_b / CRYSTALRINGSPERDETECTOR; + block_B_detector = ring_b % CRYSTALRINGSPERDETECTOR; + + bin = tangential_pos_num < 0 ? tangential_pos_num + NumProjBins : tangential_pos_num; + view = view_num; +} + + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR diff --git a/src/listmode_buildblock/CMakeLists.txt b/src/listmode_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..613296cd82 --- /dev/null +++ b/src/listmode_buildblock/CMakeLists.txt @@ -0,0 +1,27 @@ +# +# +set(dir listmode_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + CListEvent + CListModeData + LmToProjData + LmToProjDataBootstrap +) + +if (HAVE_ECAT) + list(APPEND ${dir_LIB_SOURCES} + CListModeDataECAT + CListRecordECAT962 + CListRecordECAT966 + ) +endif() + +#$(dir)_REGISTRY_SOURCES:= $(dir)_registries + + +include(stir_lib_target) + +target_link_libraries(listmode_buildblock IO data_buildblock ) diff --git a/src/listmode_buildblock/LmToProjData.cxx b/src/listmode_buildblock/LmToProjData.cxx new file mode 100644 index 0000000000..2d342b1082 --- /dev/null +++ b/src/listmode_buildblock/LmToProjData.cxx @@ -0,0 +1,823 @@ +/*! + \file + \ingroup listmode + + \brief Implementation of class stir::LmToProjData + + \author Kris Thielemans + \author Sanida Mustafovic +*/ +/* + Copyright (C) 2000 - 2011-12-31, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/* Possible compilation switches: + +USE_SegmentByView + Currently our ProjData classes store segments as floats, which is a waste of + memory and time for simple binning of listmode data. This should be + remedied at some point by having member template functions to allow different + data types in ProjData et al. + Currently we work (somewhat tediously) around this problem by using Array classes directly. + If you want to use the Segment classes (safer and cleaner) + #define USE_SegmentByView + + +FRAME_BASED_DT_CORR: + dead-time correction based on the frame, or on the time of the event +*/ +// (Note: can currently NOT be disabled) +#define USE_SegmentByView + +//#define FRAME_BASED_DT_CORR + +// set elem_type to what you want to use for the sinogram elements +// we need a signed type, as randoms can be subtracted. However, signed char could do. + +#if defined(USE_SegmentByView) + typedef float elem_type; +# define OUTPUTNumericType NumericType::FLOAT +#else + #error currently problem with normalisation code! + typedef short elem_type; +# define OUTPUTNumericType NumericType::SHORT +#endif + + +#include "stir/utilities.h" + +#include "stir/listmode/LmToProjData.h" +#include "stir/listmode/CListRecord.h" +#include "stir/listmode/CListModeData.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" + +#include "stir/Scanner.h" +#ifdef USE_SegmentByView +#include "stir/ProjDataInterfile.h" +#include "stir/SegmentByView.h" +#else +#include "stir/ProjDataFromStream.h" +#include "stir/IO/interfile.h" +#include "stir/Array.h" +#include "stir/IndexRange3D.h" +#endif +#include "stir/IO/read_from_file.h" +#include "stir/ParsingObject.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/CPUTimer.h" +#include "stir/recon_buildblock/TrivialBinNormalisation.h" +#include "stir/is_null_ptr.h" + +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::fstream; +using std::ifstream; +using std::iostream; +using std::ofstream; +using std::ios; +using std::cerr; +using std::cout; +using std::flush; +using std::endl; +using std::min; +using std::max; +#endif + +START_NAMESPACE_STIR + +#ifdef USE_SegmentByView +typedef SegmentByView segment_type; +#else +#error does not work at the moment +#endif +/******************** Prototypes for local routines ************************/ + + + +static void +allocate_segments(VectorWithOffset& segments, + const int start_segment_index, + const int end_segment_index, + const ProjDataInfo* proj_data_info_ptr); + +// In the next 2 functions, the 'output' parameter needs to be passed +// because save_and_delete_segments needs it when we're not using SegmentByView + +/* last parameter only used if USE_SegmentByView + first parameter only used when not USE_SegmentByView + */ +static void +save_and_delete_segments(shared_ptr& output, + VectorWithOffset& segments, + const int start_segment_index, + const int end_segment_index, + ProjData& proj_data); +static +shared_ptr +construct_proj_data(shared_ptr& output, + const string& output_filename, + const ExamInfo& exam_info, + const shared_ptr& proj_data_info_ptr); + +/************************************************************** + The 3 parsing functions +***************************************************************/ +void +LmToProjData:: +set_defaults() +{ + max_segment_num_to_process = -1; + store_prompts = true; + store_delayeds = true; + interactive=false; + num_segments_in_memory = -1; + normalisation_ptr.reset(new TrivialBinNormalisation); + post_normalisation_ptr.reset(new TrivialBinNormalisation); + do_pre_normalisation =0; + num_events_to_store = 0; + +} + +void +LmToProjData:: +initialise_keymap() +{ + parser.add_start_key("lm_to_projdata Parameters"); + parser.add_key("input file",&input_filename); + parser.add_key("template_projdata", &template_proj_data_name); + parser.add_key("frame_definition file",&frame_definition_filename); + parser.add_key("num_events_to_store",&num_events_to_store); + parser.add_key("output filename prefix",&output_filename_prefix); + parser.add_parsing_key("Bin Normalisation type for pre-normalisation", &normalisation_ptr); + parser.add_parsing_key("Bin Normalisation type for post-normalisation", &post_normalisation_ptr); + parser.add_key("maximum absolute segment number to process", &max_segment_num_to_process); + parser.add_key("do pre normalisation ", &do_pre_normalisation); + parser.add_key("num_segments_in_memory", &num_segments_in_memory); + + //if (lm_data_ptr->has_delayeds()) TODO we haven't read the CListModeData yet, so cannot access has_delayeds() yet + // one could add the next 2 keywords as part of a callback function for the 'input file' keyword. + // That's a bit too much trouble for now though... + { + parser.add_key("Store prompts",&store_prompts); + parser.add_key("Store delayeds",&store_delayeds); + //parser.add_key("increment to use for 'delayeds'",&delayed_increment); + } + parser.add_key("List event coordinates",&interactive); + parser.add_stop_key("END"); + +} + + +bool +LmToProjData:: +post_processing() +{ + + if (input_filename.size()==0) + { + warning("You have to specify an input_filename\n"); + return true; + } + + if (!interactive && output_filename_prefix.size()==0) + { + warning("You have to specify an output_filename_prefix\n"); + return true; + } + + lm_data_ptr = stir::read_from_file(input_filename); + + if (template_proj_data_name.size()==0) + { + warning("You have to specify template_projdata\n"); + return true; + } + shared_ptr template_proj_data_ptr = + ProjData::read_from_file(template_proj_data_name); + + template_proj_data_info_ptr.reset(template_proj_data_ptr->get_proj_data_info_ptr()->clone()); + + // initialise segment_num related variables + + if (max_segment_num_to_process==-1) + max_segment_num_to_process = + template_proj_data_info_ptr->get_max_segment_num(); + else + { + max_segment_num_to_process = + min(max_segment_num_to_process, + template_proj_data_info_ptr->get_max_segment_num()); + template_proj_data_info_ptr-> + reduce_segment_range(-max_segment_num_to_process, + max_segment_num_to_process); + } + + const int num_segments = template_proj_data_info_ptr->get_num_segments(); + if (num_segments_in_memory == -1 || interactive) + num_segments_in_memory = num_segments; + else + num_segments_in_memory = + min(num_segments_in_memory, num_segments); + if (num_segments == 0) + { + warning("LmToProjData: num_segments_in_memory cannot be 0"); + return true; + } + + + + Scanner const * const scanner_ptr = + template_proj_data_info_ptr->get_scanner_ptr(); + + if (*scanner_ptr != *lm_data_ptr->get_scanner_ptr()) + { + warning("LmToProjData:\nScanner from list mode data (%s) is different from\n" + "scanner from template projdata (%s).\n" + "Full definition of scanner from list mode data:\n%s\n" + "Full definition of scanner from template:\n%s\n", + lm_data_ptr->get_scanner_ptr()->get_name().c_str(), + scanner_ptr->get_name().c_str(), + lm_data_ptr->get_scanner_ptr()->parameter_info().c_str(), + scanner_ptr->parameter_info().c_str()); + return true; + } + + // handle store_prompts and store_delayeds + + if (lm_data_ptr->has_delayeds()==false && store_delayeds==true) + { + warning("This list mode data does not seem to have delayed events.\n" + "Setting store_delayeds to false."); + store_delayeds=true; + } + + if (store_prompts) + { + if (store_delayeds) + delayed_increment = -1; + else + delayed_increment = 0; + } + else + { + if (store_delayeds) + delayed_increment = 1; + else + { + warning("At least one of store_prompts or store_delayeds should be true"); + return true; + } + } + + // set up normalisation objects + + if (is_null_ptr(normalisation_ptr)) + { + warning("Invalid pre-normalisation object\n"); + return true; + } + if (is_null_ptr(post_normalisation_ptr)) + { + warning("Invalid post-normalisation object\n"); + return true; + } + + if (do_pre_normalisation) + { + shared_ptr scanner_sptr(new Scanner(*scanner_ptr)); + // TODO this won't work for the HiDAC or so + proj_data_info_cyl_uncompressed_ptr. + reset(dynamic_cast( + ProjDataInfo::ProjDataInfoCTI(scanner_sptr, + 1, scanner_ptr->get_num_rings()-1, + scanner_ptr->get_num_detectors_per_ring()/2, + scanner_ptr->get_default_num_arccorrected_bins(), + false))); + + if ( normalisation_ptr->set_up(proj_data_info_cyl_uncompressed_ptr) + != Succeeded::yes) + error("LmToProjData: set-up of pre-normalisation failed\n"); + } + else + { + if ( post_normalisation_ptr->set_up(template_proj_data_info_ptr) + != Succeeded::yes) + error("LmToProjData: set-up of post-normalisation failed\n"); + } + + // handle time frame definitions etc + + do_time_frame = num_events_to_store<=0; + + if (do_time_frame && frame_definition_filename.size()==0) + { + warning("Have to specify either 'frame_definition_filename' or 'num_events_to_store'\n"); + return true; + } + + if (frame_definition_filename.size()!=0) + frame_defs = TimeFrameDefinitions(frame_definition_filename); + else + { + // make a single frame starting from 0. End value will be ignored. + vector > frame_times(1, pair(0,1)); + frame_defs = TimeFrameDefinitions(frame_times); + } + +#ifdef FRAME_BASED_DT_CORR + cerr << "LmToProjData Using FRAME_BASED_DT_CORR\n"; +#else + cerr << "LmToProjData NOT Using FRAME_BASED_DT_CORR\n"; +#endif + + return false; +} + +/************************************************************** + Constructors +***************************************************************/ + +LmToProjData:: +LmToProjData() +{ + set_defaults(); +} + +LmToProjData:: +LmToProjData(const char * const par_filename) +{ + set_defaults(); + if (par_filename!=0) + { + if (parse(par_filename)==false) + error("Exiting\n"); + } + else + ask_parameters(); +} + +/************************************************************** + Here follows the implementation of get_bin_from_event + + this function is complicated because of the normalisation stuff. sorry +***************************************************************/ +void +LmToProjData:: +get_bin_from_event(Bin& bin, const CListEvent& event) const +{ + if (do_pre_normalisation) + { + Bin uncompressed_bin; + event.get_bin(uncompressed_bin, *proj_data_info_cyl_uncompressed_ptr); + if (uncompressed_bin.get_bin_value()<=0) + return; // rejected for some strange reason + + + // do_normalisation +#ifndef FRAME_BASED_DT_CORR + const double start_time = current_time; + const double end_time = current_time; +#else + const double start_time = frame_defs.get_start_time(current_frame_num); + const double end_time =frame_defs.get_end_time(current_frame_num); +#endif + + const float bin_efficiency = + normalisation_ptr->get_bin_efficiency(uncompressed_bin,start_time,end_time); + // TODO remove arbitrary number. Supposes that these bin_efficiencies are around 1 + if (bin_efficiency < 1.E-10) + { + warning("\nBin_efficiency %g too low for uncompressed bin (s:%d,v:%d,ax_pos:%d,tang_pos:%d). Event ignored\n", + bin_efficiency, + uncompressed_bin.segment_num(), uncompressed_bin.view_num(), + uncompressed_bin.axial_pos_num(), uncompressed_bin.tangential_pos_num()); + bin.set_bin_value(-1); + return; + } + + // now find 'compressed' bin, i.e. taking mashing, span etc into account + // Also, adjust the normalisation factor according to the number of + // uncompressed bins in a compressed bin + + const float bin_value = 1/bin_efficiency; + // TODO wasteful: we decode the event twice. replace by something like + // template_proj_data_info_ptr->get_bin_from_uncompressed(bin, uncompressed_bin); + event.get_bin(bin, *template_proj_data_info_ptr); + + if (bin.get_bin_value()>0) + { + bin.set_bin_value(bin_value); + } + + } + else + { + event.get_bin(bin, *template_proj_data_info_ptr); + } + +} + +/************************************************************** + Here follows the post_normalisation related stuff. +***************************************************************/ +void +LmToProjData:: +do_post_normalisation(Bin& bin) const +{ + if (bin.get_bin_value()>0) + { + if (do_pre_normalisation) + { + bin.set_bin_value(bin.get_bin_value()/get_compression_count(bin)); + } + else + { +#ifndef FRAME_BASED_DT_CORR + const double start_time = current_time; + const double end_time = current_time; +#else + const double start_time = frame_defs.get_start_time(current_frame_num); + const double end_time =frame_defs.get_end_time(current_frame_num); +#endif + const float bin_efficiency = post_normalisation_ptr->get_bin_efficiency(bin,start_time,end_time); + // TODO remove arbitrary number. Supposes that these bin_efficiencies are around 1 + if (bin_efficiency < 1.E-10) + { + warning("\nBin_efficiency %g too low for bin (s:%d,v:%d,ax_pos:%d,tang_pos:%d). Event ignored\n", + bin_efficiency, + bin.segment_num(), bin.view_num(), bin.axial_pos_num(), bin.tangential_pos_num()); + bin.set_bin_value(-1); + } + else + { + bin.set_bin_value(1/bin_efficiency); + } + } + } +} + + +int +LmToProjData:: +get_compression_count(const Bin& bin) const +{ + // TODO this currently works ONLY for cylindrical PET scanners + + const ProjDataInfoCylindrical& proj_data_info = + dynamic_cast(*template_proj_data_info_ptr); + + return proj_data_info.get_num_ring_pairs_for_segment_axial_pos_num(bin.segment_num(),bin.axial_pos_num())* + proj_data_info.get_view_mashing_factor(); + +} + +/************************************************************** + Empty functions for new time events and new time frames. +***************************************************************/ +void +LmToProjData:: +process_new_time_event(const CListTime&) +{} + + +void +LmToProjData:: +start_new_time_frame(const unsigned int) +{} + +/************************************************************** + Here follows the actual rebinning code (finally). + + It's essentially simple, but is in fact complicated because of the facility + to store only part of the segments in memory. +***************************************************************/ +void +LmToProjData:: +process_data() +{ + CPUTimer timer; + timer.start(); + + // assume list mode data starts at time 0 + // we have to do this because the first time tag might occur only after a + // few coincidence events (as happens with ECAT scanners) + current_time = 0; + + double time_of_last_stored_event = 0; + long num_stored_events = 0; + VectorWithOffset + segments (template_proj_data_info_ptr->get_min_segment_num(), + template_proj_data_info_ptr->get_max_segment_num()); + + VectorWithOffset + frame_start_positions(1, frame_defs.get_num_frames()); + shared_ptr record_sptr = lm_data_ptr->get_empty_record_sptr(); + CListRecord& record = *record_sptr; + + /* Here starts the main loop which will store the listmode data. */ + for (current_frame_num = 1; + current_frame_num<=frame_defs.get_num_frames(); + ++current_frame_num) + { + start_new_time_frame(current_frame_num); + + // construct ExamInfo appropriate for a single projdata with this time frame + ExamInfo this_frame_exam_info(*lm_data_ptr->get_exam_info_ptr()); + { + TimeFrameDefinitions this_time_frame_defs(frame_defs, current_frame_num); + this_frame_exam_info.set_time_frame_definitions(this_time_frame_defs); + } + + // *********** open output file + shared_ptr output; + shared_ptr proj_data_ptr; + + { + char rest[50]; + sprintf(rest, "_f%dg1d0b0", current_frame_num); + const string output_filename = output_filename_prefix + rest; + + proj_data_ptr = + construct_proj_data(output, output_filename, this_frame_exam_info, template_proj_data_info_ptr); + } + + long num_prompts_in_frame = 0; + long num_delayeds_in_frame = 0; + + const double start_time = frame_defs.get_start_time(current_frame_num); + const double end_time = frame_defs.get_end_time(current_frame_num); + + /* + For each start_segment_index, we check which events occur in the + segments between start_segment_index and + start_segment_index+num_segments_in_memory. + */ + for (int start_segment_index = proj_data_ptr->get_min_segment_num(); + start_segment_index <= proj_data_ptr->get_max_segment_num(); + start_segment_index += num_segments_in_memory) + { + + const int end_segment_index = + min( proj_data_ptr->get_max_segment_num()+1, start_segment_index + num_segments_in_memory) - 1; + + if (!interactive) + allocate_segments(segments, start_segment_index, end_segment_index, proj_data_ptr->get_proj_data_info_ptr()); + + // the next variable is used to see if there are more events to store for the current segments + // num_events_to_store-more_events will be the number of allowed coincidence events currently seen in the file + // ('allowed' independent on the fact of we have its segment in memory or not) + // When do_time_frame=true, the number of events is irrelevant, so we + // just set more_events to 1, and never change it + long more_events = + do_time_frame? 1 : num_events_to_store; + + if (start_segment_index != proj_data_ptr->get_min_segment_num()) + { + // we're going once more through the data (for the next batch of segments) + cerr << "\nProcessing next batch of segments\n"; + // go to the beginning of the listmode data for this frame + lm_data_ptr->set_get_position(frame_start_positions[current_frame_num]); + current_time = start_time; + } + else + { + cerr << "\nProcessing time frame " << current_frame_num << '\n'; + + // Note: we already have current_time from previous frame, so don't + // need to set it. In fact, setting it to start_time would be wrong + // as we first might have to skip some events before we get to start_time. + // So, let's do that now. + while (current_time < start_time && + lm_data_ptr->get_next_record(record) == Succeeded::yes) + { + if (record.is_time()) + current_time = record.time().get_time_in_secs(); + } + // now save position such that we can go back + frame_start_positions[current_frame_num] = + lm_data_ptr->save_get_position(); + } + { + // loop over all events in the listmode file + while (more_events) + { + if (lm_data_ptr->get_next_record(record) == Succeeded::no) + { + // no more events in file for some reason + break; //get out of while loop + } + if (record.is_time()) + { + current_time = record.time().get_time_in_secs(); + if (do_time_frame && current_time >= end_time) + break; // get out of while loop + assert(current_time>=start_time); + process_new_time_event(record.time()); + } + // note: could do "else if" here if we would be sure that + // a record can never be both timing and coincidence event + // and there might be a scanner around that has them both combined. + if (record.is_event()) + { + assert(start_time <= current_time); + Bin bin; + // set value in case the event decoder doesn't touch it + // otherwise it would be 0 and all events will be ignored + bin.set_bin_value(1); + get_bin_from_event(bin, record.event()); + + // check if it's inside the range we want to store + if (bin.get_bin_value()>0 + && bin.tangential_pos_num()>= proj_data_ptr->get_min_tangential_pos_num() + && bin.tangential_pos_num()<= proj_data_ptr->get_max_tangential_pos_num() + && bin.axial_pos_num()>=proj_data_ptr->get_min_axial_pos_num(bin.segment_num()) + && bin.axial_pos_num()<=proj_data_ptr->get_max_axial_pos_num(bin.segment_num()) + ) + { + assert(bin.view_num()>=proj_data_ptr->get_min_view_num()); + assert(bin.view_num()<=proj_data_ptr->get_max_view_num()); + + // see if we increment or decrement the value in the sinogram + const int event_increment = + record.event().is_prompt() + ? ( store_prompts ? 1 : 0 ) // it's a prompt + : delayed_increment;//it is a delayed-coincidence event + + if (event_increment==0) + continue; + + if (!do_time_frame) + more_events-= event_increment; + + // now check if we have its segment in memory + if (bin.segment_num() >= start_segment_index && bin.segment_num()<=end_segment_index) + { + do_post_normalisation(bin); + + num_stored_events += event_increment; + if (record.event().is_prompt()) + ++num_prompts_in_frame; + else + ++num_delayeds_in_frame; + + if (num_stored_events%500000L==0) cout << "\r" << num_stored_events << " events stored" << flush; + + if (interactive) + printf("Seg %4d view %4d ax_pos %4d tang_pos %4d time %8g stored with incr %d \n", + bin.segment_num(), bin.view_num(), bin.axial_pos_num(), bin.tangential_pos_num(), + current_time, event_increment); + else + (*segments[bin.segment_num()])[bin.view_num()][bin.axial_pos_num()][bin.tangential_pos_num()] += + bin.get_bin_value() * + event_increment; + } + } + else // event is rejected for some reason + { + if (interactive) + printf("Seg %4d view %4d ax_pos %4d tang_pos %4d time %8g ignored\n", + bin.segment_num(), bin.view_num(), bin.axial_pos_num(), bin.tangential_pos_num(), current_time); + } + } // end of spatial event processing + } // end of while loop over all events + + time_of_last_stored_event = + max(time_of_last_stored_event,current_time); + } + + if (!interactive) + save_and_delete_segments(output, segments, + start_segment_index, end_segment_index, + *proj_data_ptr); + } // end of for loop for segment range + cerr << "\nNumber of prompts stored in this time period : " << num_prompts_in_frame + << "\nNumber of delayeds stored in this time period: " << num_delayeds_in_frame + << '\n'; + } // end of loop over frames + + timer.stop(); + + cerr << "Last stored event was recorded before time-tick at " << time_of_last_stored_event << " secs\n"; + if (!do_time_frame && + (num_stored_events<=0 || + /*static_cast*/(num_stored_events)& segments, + const int start_segment_index, + const int end_segment_index, + const ProjDataInfo* proj_data_info_ptr) +{ + + for (int seg=start_segment_index ; seg<=end_segment_index; seg++) + { +#ifdef USE_SegmentByView + segments[seg] = new SegmentByView( + proj_data_info_ptr->get_empty_segment_by_view (seg)); +#else + segments[seg] = + new Array<3,elem_type>(IndexRange3D(0, proj_data_info_ptr->get_num_views()-1, + 0, proj_data_info_ptr->get_num_axial_poss(seg)-1, + -(proj_data_info_ptr->get_num_tangential_poss()/2), + proj_data_info_ptr->get_num_tangential_poss()-(proj_data_info_ptr->get_num_tangential_poss()/2)-1)); +#endif + } +} + +void +save_and_delete_segments(shared_ptr& output, + VectorWithOffset& segments, + const int start_segment_index, + const int end_segment_index, + ProjData& proj_data) +{ + + for (int seg=start_segment_index; seg<=end_segment_index; seg++) + { + { +#ifdef USE_SegmentByView + proj_data.set_segment(*segments[seg]); +#else + (*segments[seg]).write_data(*output); +#endif + delete segments[seg]; + } + + } +} + + + +static +shared_ptr +construct_proj_data(shared_ptr& output, + const string& output_filename, + const ExamInfo& exam_info, + const shared_ptr& proj_data_info_ptr) +{ + shared_ptr exam_info_sptr(new ExamInfo(exam_info)); + +#ifdef USE_SegmentByView + // don't need output stream in this case + shared_ptr proj_data_sptr(new ProjDataInterfile(exam_info_sptr, + proj_data_info_ptr, output_filename, ios::out, + ProjDataFromStream::Segment_View_AxialPos_TangPos, + OUTPUTNumericType)); + return proj_data_sptr; +#else + // this code would work for USE_SegmentByView as well, but the above is far simpler... + vector segment_sequence_in_stream(proj_data_info_ptr->get_num_segments()); + { + std::vector::iterator current_segment_iter = + segment_sequence_in_stream.begin(); + for (int segment_num=proj_data_info_ptr->get_min_segment_num(); + segment_num<=proj_data_info_ptr->get_max_segment_num(); + ++segment_num) + *current_segment_iter++ = segment_num; + } + output = new fstream (output_filename.c_str(), ios::out|ios::binary); + if (!*output) + error("Error opening output file %s\n",output_filename.c_str()); + shared_ptr proj_data_ptr( + new ProjDataFromStream(exam_info_sptr, proj_data_info_ptr, output, + /*offset=*/std::streamoff(0), + segment_sequence_in_stream, + ProjDataFromStream::Segment_View_AxialPos_TangPos, + OUTPUTNumericType)); + write_basic_interfile_PDFS_header(output_filename, *proj_data_ptr); + return proj_data_ptr; +#endif +} + + +END_NAMESPACE_STIR diff --git a/src/listmode_buildblock/LmToProjDataBootstrap.cxx b/src/listmode_buildblock/LmToProjDataBootstrap.cxx new file mode 100644 index 0000000000..c882e4fe2c --- /dev/null +++ b/src/listmode_buildblock/LmToProjDataBootstrap.cxx @@ -0,0 +1,254 @@ +// +// +/*! + + \file + \ingroup listmode + \brief Class stir::LmToProjDataBootstrap for rebinning listmode files with the bootstrap method + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/listmode/LmToProjDataBootstrap.h" +#include "stir/listmode/CListRecord.h" +#include "stir/Succeeded.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + +#include +#include +#include + + + +START_NAMESPACE_STIR + +template +void +LmToProjDataBootstrap::set_defaults() +{ + LmToProjData::set_defaults(); + seed = 42; +} + +template +void +LmToProjDataBootstrap::initialise_keymap() +{ + LmToProjData::initialise_keymap(); + this->parser.add_start_key("LmToProjDataBootstrap Parameters"); + this->parser.add_key("seed", reinterpret_cast(&seed)); // TODO get rid of cast +} + +template +LmToProjDataBootstrap:: +LmToProjDataBootstrap(const char * const par_filename) +{ + set_defaults(); + if (par_filename!=0) + this->parse(par_filename) ; + else + this->ask_parameters(); +} + +template +LmToProjDataBootstrap:: +LmToProjDataBootstrap(const char * const par_filename, const unsigned int seed_v) +{ + set_defaults(); + seed = seed_v; + if (par_filename!=0) + { + this->parse(par_filename); + // make sure that seed_v parameter overrides whatever was in the par file + if (seed != seed_v) + { + warning("LmToProjDataBootstrap: parameter file %s contains seed (%u) which is\n" + "different from the seed value (%u) passed to me.\n" + "I will use the latter.\n", + par_filename, seed, seed_v); + seed = seed_v; + } + } + else + this->ask_parameters(); +} + +template +bool +LmToProjDataBootstrap:: +post_processing() +{ + if (LmToProjData::post_processing()) + return true; + + if (seed == 0) + return true; + + return false; +} + + + +template +void +LmToProjDataBootstrap:: +start_new_time_frame(const unsigned int new_frame_num) +{ + + base_type::start_new_time_frame(new_frame_num); + + const double start_time = this->frame_defs.get_start_time(new_frame_num); + const double end_time = this->frame_defs.get_end_time(new_frame_num); + // When do_time_frame=true, the number of events is irrelevant, so we + // just set more_events to 1, and never change it + long more_events = + this->do_time_frame? 1 : this->num_events_to_store; + + unsigned int total_num_events_in_this_frame = 0; + + // loop over all events in the listmode file + shared_ptr record_sptr = this->lm_data_ptr->get_empty_record_sptr(); + CListRecord& record = *record_sptr; + + cerr << "\nGoing through listmode file to find number of events in this frame" << endl; + double current_time = start_time; + while (more_events) + { + if (this->lm_data_ptr->get_next_record(record) == Succeeded::no) + { + // no more events in file for some reason + break; //get out of while loop + } + if (record.is_time()) + { + const double new_time = record.time().get_time_in_secs(); + if (this->do_time_frame && new_time >= end_time) + break; // get out of while loop + current_time = new_time; + } + else if (record.is_event() && start_time <= current_time) + { + ++total_num_events_in_this_frame; + + if (!this->do_time_frame) + { + // painful business to decrement more_events + + // TODO optimisation possible: + // if we reject an event below, we could force its replication count to 0 + // That way, we will not call get_bin_from_event for it anymore. + + Bin bin; + // set value in case the event decoder doesn't touch it + // otherwise it would be 0 and all events will be ignored + bin.set_bin_value(1); + base_type::get_bin_from_event(bin, record.event()); + // check if it's inside the range we want to store + if (bin.get_bin_value()>0 + && bin.tangential_pos_num()>= this->template_proj_data_info_ptr->get_min_tangential_pos_num() + && bin.tangential_pos_num()<= this->template_proj_data_info_ptr->get_max_tangential_pos_num() + && bin.axial_pos_num()>=this->template_proj_data_info_ptr->get_min_axial_pos_num(bin.segment_num()) + && bin.axial_pos_num()<=this->template_proj_data_info_ptr->get_max_axial_pos_num(bin.segment_num()) + && bin.segment_num()>=this->template_proj_data_info_ptr->get_min_segment_num() + && bin.segment_num()<=this->template_proj_data_info_ptr->get_max_segment_num() + ) + { + assert(bin.view_num()>=this->template_proj_data_info_ptr->get_min_view_num()); + assert(bin.view_num()<=this->template_proj_data_info_ptr->get_max_view_num()); + + // see if we increment or decrement the value in the sinogram + const int event_increment = + record.event().is_prompt() + ? ( this->store_prompts ? 1 : 0 ) // it's a prompt + : this->delayed_increment;//it is a delayed-coincidence event + + if (event_increment==0) + continue; + + + more_events-= event_increment; + } + } // !do_time_frame + } // if (record.is_event()) + } // while (more_events) + + // now initialise num_times_to_replicate + + typedef boost::mt19937 base_generator_type; + base_generator_type generator; + generator.seed(static_cast(seed)); + + boost::uniform_int + uniform_int_distribution(0U, total_num_events_in_this_frame-1); + boost::variate_generator > + random_int(generator, + uniform_int_distribution); + + num_times_to_replicate.resize(total_num_events_in_this_frame); + + std::fill( num_times_to_replicate.begin(), num_times_to_replicate.end(), + static_cast(0)); + for (unsigned int i=total_num_events_in_this_frame; i!=0; --i) + { + const unsigned int event_num = random_int(); + num_times_to_replicate[event_num] += 1; + // warning this did not check for overflow + } + + assert(std::accumulate(num_times_to_replicate.begin(), + num_times_to_replicate.end(), + 0U) == + total_num_events_in_this_frame); + + num_times_to_replicate_iter = num_times_to_replicate.begin(); + + cerr << "\nFilled in replication vector for " << total_num_events_in_this_frame + << " events." << endl; +} + +template +void +LmToProjDataBootstrap:: +get_bin_from_event(Bin& bin, const CListEvent& event) const +{ + assert(num_times_to_replicate_iter != num_times_to_replicate.end()); + if (*num_times_to_replicate_iter > 0) + { + base_type::get_bin_from_event(bin, event); + bin.set_bin_value(bin.get_bin_value() * *num_times_to_replicate_iter); + } + else + bin.set_bin_value(-1); + ++num_times_to_replicate_iter; +} + + +// instantiation +template class LmToProjDataBootstrap; + + + +END_NAMESPACE_STIR diff --git a/src/listmode_buildblock/lib.mk b/src/listmode_buildblock/lib.mk new file mode 100644 index 0000000000..b67fbbcd9c --- /dev/null +++ b/src/listmode_buildblock/lib.mk @@ -0,0 +1,20 @@ +# +# +dir := listmode_buildblock + +$(dir)_LIB_SOURCES = \ + CListEvent.cxx \ + CListModeData.cxx \ + LmToProjData.cxx \ + LmToProjDataBootstrap.cxx + +ifeq ($(HAVE_LLN_MATRIX),1) + $(dir)_LIB_SOURCES += \ + CListModeDataECAT.cxx \ + CListRecordECAT962.cxx \ + CListRecordECAT966.cxx +endif + +#$(dir)_REGISTRY_SOURCES:= $(dir)_registries.cxx + +include $(WORKSPACE)/lib.mk diff --git a/src/listmode_utilities/CMakeLists.txt b/src/listmode_utilities/CMakeLists.txt new file mode 100644 index 0000000000..0251dfb429 --- /dev/null +++ b/src/listmode_utilities/CMakeLists.txt @@ -0,0 +1,44 @@ +# +# +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2011 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. +set(dir listmode_utilities) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + lm_to_projdata + lm_to_projdata_bootstrap + lm_fansums + list_lm_events +) + +if (HAVE_ECAT) + # yes, the LLN files seem to be there, so we can compile more + list(APPEND ${dir_EXE_SOURCES} + scan_sgl_file + print_sgl_values + rebin_sgl_file + add_ecat7_header_to_sgl + ) +endif() + + + +include(stir_exe_targets) diff --git a/src/listmode_utilities/add_ecat7_header_to_sgl.cxx b/src/listmode_utilities/add_ecat7_header_to_sgl.cxx new file mode 100644 index 0000000000..0c67f41353 --- /dev/null +++ b/src/listmode_utilities/add_ecat7_header_to_sgl.cxx @@ -0,0 +1,150 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for more details. +*/ + +/*! +\file +\ingroup utilities +\ingroup ECAT +\brief Prepend contents of ECAT7 header to a new sgl file (from list mode acquisition) +\author Kris Thielemans +\author Nacer Kerrouche +*/ + + +#include "stir/IO/stir_ecat7.h" + +#include +#include +#include + +USING_NAMESPACE_STIR +USING_NAMESPACE_ECAT +USING_NAMESPACE_ECAT7 + +static void update_main_header(Main_header& mh, const bool is_3d_scan) + { + strcpy(mh.study_description, "listmode"); + mh.acquisition_type = DynamicEmission; + mh.septa_state = + is_3d_scan ? SeptaRetracted : SeptaExtended; + // we set this to a sinogram-type such that header_doc can display the data + mh.file_type = Short3dSinogram; + } + + +void print_usage_and_exit(const char * const program_name) + { + std::cerr<< "\nPrepend contents of ECAT7 header to a sgl file.\n" + << "Usage: \n" + << "\t" << program_name << " [--2d|--3d] output_sgl_name input_sgl_name input_ECAT7_name \n" + << "Defaults to 3D (is used to set septa_state)\n"; + exit(EXIT_FAILURE); + } + + +int main(int argc, char *argv[]) +{ + + bool is_3d_scan = true; + const char * const program_name = argv[0]; + + if (argc >= 3 && argv[1][0] == '-') + { + if (strcmp(argv[1], "--2d") == 0) + { + is_3d_scan = false; + --argc; ++argv; + } + else if (strcmp(argv[1], "--3d") == 0) + { + is_3d_scan = true; + --argc; ++argv; + } + else + print_usage_and_exit(program_name); + } + if(argc!=4) + print_usage_and_exit(program_name); + + const std::string output_name = argv[1]; + const std::string input_name_sgl = argv[2]; + const std::string input_name_ecat7 = argv[3]; + + { + FILE * sgl_fptr = fopen(input_name_sgl.c_str(), "rb"); + if (!sgl_fptr) + { + error("Error opening '%s' for reading: %s", + input_name_sgl.c_str(), strerror(errno)); + } + FILE * out_fptr = fopen(output_name.c_str(), "wb"); + if (!out_fptr) + { + error("Error opening '%s' for writing: %s", + output_name.c_str(), strerror(errno)); + } + // get ECAT7 header + Main_header mh_in; + { + FILE * ecat7_fptr = fopen(input_name_ecat7.c_str(), "rb"); + if (!ecat7_fptr) + { + error("Error opening '%s' for reading: %s", + input_name_ecat7.c_str(), strerror(errno)); + } + if (mat_read_main_header(ecat7_fptr, &mh_in)!=0) + error("Error reading main header from %s", input_name_ecat7.c_str()); + fclose(ecat7_fptr); + } + + update_main_header(mh_in, is_3d_scan); + if (mat_write_main_header(out_fptr, &mh_in)) + error("Error writing main header to %s", output_name.c_str()); + // copy rest of sgl file into output + + char buffer[512]; + int success = EXIT_SUCCESS; + while (!feof(sgl_fptr)) + { + size_t num_read = + fread(buffer, 1, 512, sgl_fptr); + if (ferror(sgl_fptr)) + { + warning("Error reading '%s' : %s", + input_name_sgl.c_str(), strerror(errno)); + success = EXIT_FAILURE; + break; + } + size_t num_written = + fwrite(buffer, 1, num_read, out_fptr); + if (ferror(sgl_fptr) || num_read!=num_written) + { + warning("Error writing '%s' : %s", + output_name.c_str(), strerror(errno)); + success = EXIT_FAILURE; + break; + } + } + + fclose(out_fptr); + fclose(sgl_fptr); + return success; + } + +} diff --git a/src/listmode_utilities/exe.mk b/src/listmode_utilities/exe.mk new file mode 100644 index 0000000000..7ac97e7ec0 --- /dev/null +++ b/src/listmode_utilities/exe.mk @@ -0,0 +1,21 @@ +# +# + +dir:=listmode_utilities + +$(dir)_SOURCES = lm_to_projdata.cxx \ + lm_to_projdata_bootstrap.cxx \ + lm_fansums.cxx \ + list_lm_events.cxx + +ifeq ($(HAVE_LLN_MATRIX),1) + # yes, the LLN files seem to be there, so we can compile more + +$(dir)_SOURCES += \ + scan_sgl_file.cxx \ + print_sgl_values.cxx \ + rebin_sgl_file.cxx \ + add_ecat7_header_to_sgl.cxx +endif + +include $(WORKSPACE)/exe.mk diff --git a/src/listmode_utilities/list_lm_events.cxx b/src/listmode_utilities/list_lm_events.cxx new file mode 100644 index 0000000000..33ee97d4c1 --- /dev/null +++ b/src/listmode_utilities/list_lm_events.cxx @@ -0,0 +1,183 @@ +/* + Copyright (C) 2003-2011 Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + +*/ +/*! + \file + \ingroup listmode_utilities + + \brief Program to show info about listmode data + + \author Kris Thielemans +*/ + + +#include "stir/listmode/CListRecord.h" +#include "stir/listmode/CListModeData.h" +#include "stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.h" +#include "stir/Succeeded.h" +#include "stir/IO/read_from_file.h" + +#include "stir/Scanner.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::cout; +using std::endl; +using std::vector; +#endif + + + +USING_NAMESPACE_STIR + +int main(int argc, char *argv[]) +{ + const char * const program_name = argv[0]; + // skip program name + --argc; + ++argv; + + bool list_time=true; + bool list_coincidence=false; + bool list_gating=true; + bool list_unknown=false; + unsigned long num_events_to_list = 0; + while (argc>1 && argv[0][0]=='-') + { + if (strcmp(argv[0], "--num-events-to-list")==0) + { + num_events_to_list = atol(argv[1]); + } + else if (strcmp(argv[0], "--time")==0) + { + list_time = atoi(argv[1])!=0; + } + else if (strcmp(argv[0], "--gating")==0) + { + list_gating = atoi(argv[1])!=0; + } + else if (strcmp(argv[0], "--coincidence")==0) + { + list_coincidence = atoi(argv[1])!=0; + } + else if (strcmp(argv[0], "--unknown")==0) + { + list_unknown = atoi(argv[1])!=0; + } + else + { + cerr << "Unrecognised option\n"; + return EXIT_FAILURE; + } + argc-=2; argv+=2; + } + + if (argc!=1) + { + cerr << "Usage: " << program_name << "[options] lm_filename\n" + << "Options:\n" + << "--time 0|1 : list time events or not (default: 1)\n" + << "--gating 0|1 : list gating events or not (default: 1)\n" + << "--coincidence 0|1 : list coincidence events or not (default: 0)\n" + << "--unknown 0|1 : list if event of unknown type encountered or not (default: 0)\n" + << "--num-events-to-list : limit number of events written to stdout\n"; + return EXIT_FAILURE; + } + + shared_ptr lm_data_ptr(read_from_file(argv[0])); + + cout << "Scanner: " << lm_data_ptr->get_scanner_ptr()->get_name() << endl; + + unsigned long num_listed_events = 0; + { + // loop over all events in the listmode file + shared_ptr record_sptr = lm_data_ptr->get_empty_record_sptr(); + CListRecord& record = *record_sptr; + + while (num_events_to_list==0 || num_events_to_list!=num_listed_events) + { + bool recognised = false; + bool listed = false; + if (lm_data_ptr->get_next_record(record) == Succeeded::no) + { + // no more events in file for some reason + break; //get out of while loop + } + if (record.is_time()) + { + recognised=true; + if (list_time) + { + cout << "Time " << record.time().get_time_in_millisecs(); + listed = true; + } + } + { + CListRecordWithGatingInput * record_ptr = dynamic_cast(&record); + if (record_ptr!=0 && record_ptr->is_gating_input()) + { + recognised=true; + if (list_gating) + { + cout << "Gating " << std::hex << record_ptr->gating_input().get_gating() << std::dec; + listed = true; + } + } + } + if (record.is_event()) + { + recognised=true; + if (list_coincidence) + {CListEventCylindricalScannerWithDiscreteDetectors * event_ptr = + dynamic_cast(&record.event()); + if (event_ptr!=0) + { + DetectionPositionPair<> det_pos; + event_ptr->get_detection_position(det_pos); + cout << "Coincidence " << (event_ptr->is_prompt() ? "p " : "d ") + << "(c:" << det_pos.pos1().tangential_coord() + << ",r:" << det_pos.pos1().axial_coord() + << ",l:" << det_pos.pos1().radial_coord() + << ")-" + << "(c:" << det_pos.pos2().tangential_coord() + << ",r:" << det_pos.pos2().axial_coord() + << ",l:" << det_pos.pos2().radial_coord() + << ")"; + listed = true; + } + } + } + if (!recognised && list_unknown) + { + cout << "Unknown type"; + listed = true; + } + if (listed) + { + ++num_listed_events; + cout << '\n'; + } + } + cout << '\n'; + + } + + return EXIT_SUCCESS; +} + diff --git a/src/listmode_utilities/lm_fansums.cxx b/src/listmode_utilities/lm_fansums.cxx new file mode 100644 index 0000000000..1573adb058 --- /dev/null +++ b/src/listmode_utilities/lm_fansums.cxx @@ -0,0 +1,329 @@ +// +// +/*! + \file + \ingroup listmode + + \brief Program to compute detector fansums directly from listmode data + + \author Kris Thielemans + + $Revision $ +*/ +/* + Copyright (C) 2002- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/utilities.h" +#include "stir/shared_ptr.h" +#include "stir/ParsingObject.h" +#include "stir/listmode/CListRecord.h" +#include "stir/listmode/CListEventCylindricalScannerWithDiscreteDetectors.h" +#include "stir/listmode/CListModeData.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/Scanner.h" +#include "stir/Array.h" +#include "stir/IndexRange2D.h" +#include "stir/stream.h" +#include "stir/CPUTimer.h" +#include "stir/IO/read_from_file.h" + +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::fstream; +using std::ifstream; +using std::ofstream; +using std::cerr; +using std::cout; +using std::flush; +using std::endl; +using std::min; +using std::max; +using std::vector; +#endif + +START_NAMESPACE_STIR + + +class LmFansums : public ParsingObject +{ +public: + + LmFansums(const char * const par_filename); + + int max_segment_num_to_process; + int fan_size; + shared_ptr lm_data_ptr; + TimeFrameDefinitions frame_defs; + + void compute(); +private: + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + string input_filename; + string output_filename_prefix; + string frame_definition_filename; + bool store_prompts; +int delayed_increment; + int current_frame; + + bool interactive; + + void write_fan_sums(const Array<2,float>& data_fan_sums, + const unsigned current_frame_num) const; +}; + +void +LmFansums:: +set_defaults() +{ + max_segment_num_to_process = -1; + fan_size = -1; + store_prompts = true; + delayed_increment = -1; + interactive=false; +} + +void +LmFansums:: +initialise_keymap() +{ + parser.add_start_key("lm_fansums Parameters"); + parser.add_key("input file",&input_filename); + parser.add_key("frame_definition file",&frame_definition_filename); + parser.add_key("output filename prefix",&output_filename_prefix); + parser.add_key("tangential fan_size", &fan_size); + parser.add_key("maximum absolute segment number to process", &max_segment_num_to_process); + // TODO can't do this yet + // if (CListEvent::has_delayeds()) + { + parser.add_key("Store 'prompts'",&store_prompts); + parser.add_key("increment to use for 'delayeds'",&delayed_increment); + } + parser.add_key("List event coordinates",&interactive); + parser.add_stop_key("END"); + +} + + +bool +LmFansums:: +post_processing() +{ + lm_data_ptr = + read_from_file(input_filename); + + const int num_rings = + lm_data_ptr->get_scanner_ptr()->get_num_rings(); + if (max_segment_num_to_process==-1) + max_segment_num_to_process = num_rings-1; + else + max_segment_num_to_process = + min(max_segment_num_to_process, num_rings-1); + + const int max_fan_size = + lm_data_ptr->get_scanner_ptr()->get_max_num_non_arccorrected_bins(); + if (fan_size==-1) + fan_size = max_fan_size; + else + fan_size = + min(fan_size, max_fan_size); + + frame_defs = TimeFrameDefinitions(frame_definition_filename); + return false; +} + +LmFansums:: +LmFansums(const char * const par_filename) +{ + set_defaults(); + if (par_filename!=0) + parse(par_filename) ; + else + ask_parameters(); + +} + + +void +LmFansums:: +compute() +{ + + //*********** get Scanner details + const int num_rings = + lm_data_ptr->get_scanner_ptr()->get_num_rings(); + const int num_detectors_per_ring = + lm_data_ptr->get_scanner_ptr()->get_num_detectors_per_ring(); + + + //*********** Finally, do the real work + + CPUTimer timer; + timer.start(); + + double time_of_last_stored_event = 0; + long num_stored_events = 0; + Array<2,float> data_fan_sums(IndexRange2D(num_rings, num_detectors_per_ring)); + + // go to the beginning of the binary data + lm_data_ptr->reset(); + + unsigned int current_frame_num = 1; + { + // loop over all events in the listmode file + shared_ptr record_sptr = + lm_data_ptr->get_empty_record_sptr(); + CListRecord& record = *record_sptr; + + bool first_event=true; + + double current_time = 0; + while (true) + { + if (lm_data_ptr->get_next_record(record) == Succeeded::no) + { + // no more events in file for some reason + write_fan_sums(data_fan_sums, current_frame_num); + break; //get out of while loop + } + if (record.is_time()) + { + const double new_time = record.time().get_time_in_secs(); + if (new_time >= frame_defs.get_end_time(current_frame_num)) + { + while (current_frame_num <= frame_defs.get_num_frames() && + new_time >= frame_defs.get_end_time(current_frame_num)) + { + write_fan_sums(data_fan_sums, current_frame_num++); + data_fan_sums.fill(0); + } + if (current_frame_num > frame_defs.get_num_frames()) + break; // get out of while loop + } + current_time = new_time; + } + else if (record.is_event() && frame_defs.get_start_time(current_frame_num) <= current_time) + { + // do a consistency check with dynamic_cast first + if (first_event && dynamic_cast(&record.event()) == 0) + error("Currently only works for scanners with discrete detectors."); + first_event=false; + + // see if we increment or decrement the value in the sinogram + const int event_increment = + record.event().is_prompt() + ? ( store_prompts ? 1 : 0 ) // it's a prompt + : delayed_increment;//it is a delayed-coincidence event + + if (event_increment==0) + continue; + + DetectionPositionPair<> det_pos; + // because of above consistency check, we can use static_cast here (saving a bit of time) + static_cast(record.event()). + get_detection_position(det_pos); + const int ra = det_pos.pos1().axial_coord(); + const int rb = det_pos.pos2().axial_coord(); + const int a = det_pos.pos1().tangential_coord(); + const int b = det_pos.pos2().tangential_coord(); + if (abs(ra-rb)<=max_segment_num_to_process) + { + const int det_num_diff = + (a-b+3*num_detectors_per_ring/2)%num_detectors_per_ring; + if (det_num_diff<=fan_size/2 || + det_num_diff>=num_detectors_per_ring-fan_size/2) + { + data_fan_sums[ra][a] += event_increment; + data_fan_sums[rb][b] += event_increment; + num_stored_events += event_increment; + } + else + { + } + } + else + { + } + + } // end of spatial event processing + } // end of while loop over all events + + time_of_last_stored_event = + max(time_of_last_stored_event,current_time); + } + + + timer.stop(); + + cerr << "Last stored event was recorded after time-tick at " << time_of_last_stored_event << " secs\n"; + if (current_frame_num <= frame_defs.get_num_frames()) + cerr << "Early stop due to EOF. " << endl; + cerr << "Total number of prompts/trues/delayed stored: " << num_stored_events << endl; + + cerr << "\nThis took " << timer.value() << "s CPU time." << endl; +} + + +// write fan sums to file +void +LmFansums:: +write_fan_sums(const Array<2,float>& data_fan_sums, + const unsigned current_frame_num) const +{ + char txt[50]; + sprintf(txt, "_f%d.dat", current_frame_num); + string filename = output_filename_prefix; + filename += txt; + ofstream out(filename.c_str()); + out << data_fan_sums; + cerr << "Frame " << current_frame_num << " finished" << endl; +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + + + + + +/************************ main ************************/ + + +int main(int argc, char * argv[]) +{ + + if (argc!=1 && argc!=2) { + cerr << "Usage: " << argv[0] << " [par_file]\n"; + exit(EXIT_FAILURE); + } + LmFansums lm_fansums(argc==2 ? argv[1] : 0); + lm_fansums.compute(); + + return EXIT_SUCCESS; +} + + + diff --git a/src/listmode_utilities/lm_to_projdata.cxx b/src/listmode_utilities/lm_to_projdata.cxx new file mode 100644 index 0000000000..1238743cbc --- /dev/null +++ b/src/listmode_utilities/lm_to_projdata.cxx @@ -0,0 +1,54 @@ +// +// +/*! + \file + \ingroup listmode_utilities + + \brief Program to bin listmode data to 3d sinograms + + \see class stir::LmToProjData for info on parameter file format + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/listmode/LmToProjData.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +USING_NAMESPACE_STIR + + + +int main(int argc, char * argv[]) +{ + + if (argc!=1 && argc!=2) { + cerr << "Usage: " << argv[0] << " [par_file]\n"; + exit(EXIT_FAILURE); + } + LmToProjData application(argc==2 ? argv[1] : 0); + application.process_data(); + + return EXIT_SUCCESS; +} + diff --git a/src/listmode_utilities/lm_to_projdata_bootstrap.cxx b/src/listmode_utilities/lm_to_projdata_bootstrap.cxx new file mode 100644 index 0000000000..d85e8ead13 --- /dev/null +++ b/src/listmode_utilities/lm_to_projdata_bootstrap.cxx @@ -0,0 +1,60 @@ +// +// +/*! + \file + \ingroup listmode + + \brief Program to bin listmode data to projection data using bootstrapping (uses stir::LmToProjDataBootstrap) + + \author Kris Thielemans + + $Revision $ +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/listmode/LmToProjDataBootstrap.h" + +USING_NAMESPACE_STIR + + + +int main(int argc, char * argv[]) +{ + + if (argc<1 && argc>3) { + std::cerr << "Usage: " << argv[0] << " [par_file [seed]]\n"; + exit(EXIT_FAILURE); + } + + // clumsy way of having extra argument + if (argc==3) + { + LmToProjDataBootstrap + application(argc>=2 ? argv[1] : 0, + atoi(argv[2])); + application.process_data(); + } + else + { + LmToProjDataBootstrap + application(argc==2 ? argv[1] : 0); + application.process_data(); + } + return EXIT_SUCCESS; +} + diff --git a/src/listmode_utilities/print_sgl_values.cxx b/src/listmode_utilities/print_sgl_values.cxx new file mode 100644 index 0000000000..c68fd12e27 --- /dev/null +++ b/src/listmode_utilities/print_sgl_values.cxx @@ -0,0 +1,130 @@ +/* + Copyright (C) 2004-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup utilities + \brief Utility program that prints out values from an sgl file. + + \author Kris Thielemans + \author Tim Borgeaud +*/ + + +#include "stir/data/SinglesRatesFromSglFile.h" + + +#include +#include +#include +#include + + +#ifndef STIR_NO_NAMESPACES +using std::cout; +using std::cerr; +using std::endl; +using std::setw; +using std::string; +using std::vector; +#endif + +USING_NAMESPACE_STIR + + + + +int +main (int argc, char **argv) +{ + + vector columns; + + // Check arguments. + // Singles filename + optional bin indices. + if (argc < 2) { + cerr << "Program to print out values from a singles file.\n\n"; + cerr << "Usage: " << argv[0] << " sgl_filename [bin_index ...]\n\n"; + cerr << "If no bin index values are supplied, all bins are output.\n\n"; + exit(EXIT_FAILURE); + } + + const string sgl_filename = argv[1]; + + for (int arg = 2 ; arg < argc ; ++arg) { + columns.push_back(atoi(argv[arg])); + } + + + // Singles file object. + ecat::ecat7::SinglesRatesFromSglFile singles_from_sgl; + + // Read the singles file. + singles_from_sgl.read_singles_from_sgl_file(sgl_filename); + + const vector times = singles_from_sgl.get_times(); + + + + // Get total number of time slices. + int num_time_slices = singles_from_sgl.get_num_time_slices(); + + // Get scanner details and, from these, the number of singles units. + const Scanner *scanner = singles_from_sgl.get_scanner_ptr(); + int total_singles_units = scanner->get_num_singles_units(); + + + // If no columns are set. Create a vector with all columns. + if ( columns.size() == 0 ) { + for (int singles_bin = 0 ; singles_bin < total_singles_units ; ++singles_bin) { + columns.push_back(singles_bin); + } + } + + + // Print columns + cout << "# Time "; + for (vector::iterator col = columns.begin() ; col < columns.end() ; ++col) { + cout << setw(9) << *col << " "; + } + cout << "\n"; + + + // Loop over all time slices. + for (int time_slice = 0 ; time_slice < num_time_slices ; ++time_slice) { + + // Output time. + cout << setw(8) << times[time_slice] << " "; + + for (vector::iterator col = columns.begin() ; col < columns.end() ; ++col) { + + if ( *col >= 0 && *col < total_singles_units ) { + int val = singles_from_sgl.get_singles_rate(*col, time_slice); + + cout << setw(9) << val << " "; + } + } + + // Output the end of line. + cout << "\n"; + + } + + + + return EXIT_SUCCESS; +} diff --git a/src/listmode_utilities/rebin_sgl_file.cxx b/src/listmode_utilities/rebin_sgl_file.cxx new file mode 100644 index 0000000000..6994e7b385 --- /dev/null +++ b/src/listmode_utilities/rebin_sgl_file.cxx @@ -0,0 +1,173 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup utilities + \brief Utility program scans the singles file looking for anomalous values + + \author Kris Thielemans + \author Tim Borgeaud +*/ + + +#include "stir/data/SinglesRatesFromSglFile.h" +#include "stir/TimeFrameDefinitions.h" + +#include +#include +#include + + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::string; +using std::vector; +#endif + +USING_NAMESPACE_STIR + + + +void +usage(const char *progname) { + cerr << "A program to rebin an sgl file.\n\n"; + cerr << "There are two ways to use this program.\n"; + cerr << "1) " << progname + << " sgl_input_file sgl_output_file frame_end [frame_ends ...]\n\n"; + cerr << "2) " << progname + << " -f frame_definition_file sgl_input_file sgl_output_file\n\n"; + cerr << "Frame end times are floating point numbers of seconds\n"; +} + + + +int +main(int argc, char **argv) +{ + + // Check arguments. + // Singles filename + optional output filename + if (argc < 4 ) { + usage(argv[0]); + exit(EXIT_FAILURE); + } + + + + string input_filename; + string output_filename; + vector new_times; + + + + // Check to see if -f was supplied as the first argument. + if ( argv[1][0] == '-' ) { + // Option supplied + + int arg_len = strlen(argv[1]); + + if ( arg_len != 2 || argv[1][1] != 'f' ) { + + for (int i = 1 ; i < arg_len ; ++i ) { + if ( argv[1][i] != 'f' ) { + cerr << "Unknown option " << argv[1][i] << endl; + } + } + + usage(argv[0]); + exit(EXIT_FAILURE); + } + + const string fdef_filename = argv[2]; + input_filename = argv[3]; + output_filename = argv[4]; + + + TimeFrameDefinitions time_frames(fdef_filename); + + double last_end = 0.0; + + // Create the new ending times by looping over the frames. + for (unsigned int frame = 1 ; frame <= time_frames.get_num_frames() ; ++frame) { + + double frame_start = time_frames.get_start_time(frame); + double frame_end = time_frames.get_end_time(frame); + + //cerr << "Start: " << frame_start << " End: " << frame_end << endl; + + if ( frame_start != last_end ) { + //cerr << "Added frame at: " << frame_start << endl; + // Add an additional frame that ends at the start of this frame. + new_times.push_back(frame_start); + } + + // Add the frame end. + new_times.push_back(frame_end); + + last_end = frame_end; + } + + + } else { + + input_filename = argv[1]; + output_filename = argv[2]; + + // Set up vector of new ending times. + new_times = vector(argc - 3); + + // Read frame end times + for(int arg = 3 ; arg < argc ; arg++) { + new_times[arg - 3] = atof(argv[arg]); + } + + } + + + + + // Singles file object. + ecat::ecat7::SinglesRatesFromSglFile singles_from_sgl; + + // Read the singles file. + singles_from_sgl.read_singles_from_sgl_file(input_filename); + + + + std::ofstream output; + + // If necessary, open the output file. + output.open(output_filename.c_str(), std::ios_base::out); + + if (!output.good()) { + error("Error opening output file\n"); + } + + + // rebin + singles_from_sgl.rebin(new_times); + + // Output. + singles_from_sgl.write(output); + + + return EXIT_SUCCESS; +} diff --git a/src/listmode_utilities/scan_sgl_file.cxx b/src/listmode_utilities/scan_sgl_file.cxx new file mode 100644 index 0000000000..30663c3338 --- /dev/null +++ b/src/listmode_utilities/scan_sgl_file.cxx @@ -0,0 +1,413 @@ +/* + Copyright (C) 2004-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \brief Utility program scans the singles file looking for anomalous values + + \author Kris Thielemans + \author Tim Borgeaud +*/ + + +#include "stir/data/SinglesRatesFromSglFile.h" + +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cout; +using std::cerr; +using std::endl; +using std::string; +using std::vector; +#endif + +USING_NAMESPACE_STIR + + + +const int MAX_VALID_VALUE = 1000000; + + +// Minimum allowed fraction of previous value. +const float MIN_PREVIOUS_FRACTION = 0.225; + +// Max allowed multiple of previous value. +const float MAX_PREVIOUS_MULTIPLE = 3.0; + +// Minimum allowed fraction of median of next set of values. +const float MIN_MEDIAN_FRACTION = 0.2; + +// Max allowed multiple of median of next set of values. +const float MAX_MEDIAN_MULTIPLE = 3.5; + + + +// Tolerance between adjacent bins. +const float ADJACENT_TOLERANCE = 0.75; + +const int MEDIAN_SIZE = 7; // Number of elements forward for which the median is calculated. + + + +// +// Function to calculate the median of singles values from +// start_index to end_index (inclusive). +// +int +calcMedian(const ecat::ecat7::SinglesRatesFromSglFile& singles_rates, + int singles_bin_index, int start_slice, int end_slice) { + + int num_elements = end_slice - start_slice + 1; + + // Create a new temporary vector. + vector elements(num_elements); + + // Fill the temporary vector. + for(int index = 0 ; index < num_elements ; index++) { + elements[index] = singles_rates.get_singles_rate(singles_bin_index, + start_slice + index); + } + + // Calculate which element, of the sorted set, will be the median. + vector::iterator median = elements.begin() + (num_elements / 2); + + // Partially sort the elements. + nth_element(elements.begin(), median, elements.end()); + + // Return the element at the median position. + return(*median); + +} + + + + + +// +// Function to calculate a median of up to MEDIAN_SIZE values +// starting from start_slice. +// +int +getMedian(const ecat::ecat7::SinglesRatesFromSglFile& singles_rates, + int singles_bin_index, int start_slice) { + + int num_slices = singles_rates.get_num_time_slices(); + + int end_slice = start_slice + MEDIAN_SIZE - 1; + if ( end_slice >= num_slices ) { + end_slice = num_slices - 1; + } + + return(calcMedian(singles_rates, singles_bin_index, start_slice, end_slice)); +} + + + +bool +compareAdjacentBin(int value, int slice, int singles_bin_index, + const ecat::ecat7::SinglesRatesFromSglFile& singles_rates, + int transaxial_offset) { + + const Scanner *scanner = singles_rates.get_scanner_ptr(); + int axial = scanner->get_axial_singles_unit(singles_bin_index); + int num_transaxial = scanner->get_num_transaxial_singles_units(); + int transaxial = scanner->get_transaxial_singles_unit(singles_bin_index); + + transaxial = (transaxial + transaxial_offset) % num_transaxial; + + if ( transaxial < 0 ) { + transaxial += num_transaxial; + } + + + int bin_index = scanner->get_singles_bin_index(axial, transaxial); + + int rate = singles_rates.get_singles_rate(bin_index, slice); + + if ( (value >= (1.0 - ADJACENT_TOLERANCE) * rate) && + (value <= (1.0 + ADJACENT_TOLERANCE) * rate) ) { + return(true); + } + + return(false); +} + + + + +// +// Check a rate against transaxially adjacent bins. +// +// Note that a single bucket controller encompasses a number of +// axial singles units, so checking bins with the same transaxial +// position may result checking bins from the same bucket. +// +bool +checkAdjacentBins(int value, int slice, int singles_bin_index, + const ecat::ecat7::SinglesRatesFromSglFile& singles_rates) { + + if ( compareAdjacentBin(value, slice, singles_bin_index, singles_rates, -1) ) { + if ( compareAdjacentBin(value, slice, singles_bin_index, singles_rates, -2) || + compareAdjacentBin(value, slice, singles_bin_index, singles_rates, 1)) { + return(true); + } + } else if ( compareAdjacentBin(value, slice, singles_bin_index, singles_rates, 1) && + compareAdjacentBin(value, slice, singles_bin_index, singles_rates, 2) ) { + return(true); + } + + return(false); +} + + + + + +// +// Check that a value is either within a tolerance of the median +// value of the next MEDIAN_SIZE values or is between the median +// value and a supplied value. +// +// Returns true if the value is ok. +// +bool +checkValue(int value, int slice, int singles_bin_index, + const ecat::ecat7::SinglesRatesFromSglFile& singles_rates, + int previous_value) { + + + // Check absolute range ( 0 <= Value <= MAX_VALID_VALUE ). + if ( value > 0 && value < MAX_VALID_VALUE ) { + + // Check against previous value. + if ( ((MIN_PREVIOUS_FRACTION * previous_value) - value) <= 0 && + ((MAX_PREVIOUS_MULTIPLE * previous_value) - value) >= 0 ) { + // Value is good. + return(true); + } + + + // Check against values from adjacent (transaxial) bins. + if ( checkAdjacentBins(value, slice, singles_bin_index, singles_rates) ) { + // Value is good. + return(true); + } + + + + // See if there are any further values to compare the current value with. + int num_slices = singles_rates.get_num_time_slices(); + + if ( slice < num_slices - 1 ) { + + // Calculate the median (should work for only one value). + int median = getMedian(singles_rates, singles_bin_index, slice + 1); + + + // Check against median value. Note that the first slice only needs be less than + // median * MAX_MULTIPLE. + if ( (slice == 0 || ((MIN_MEDIAN_FRACTION * median - value)) <= 0) && + ((MAX_MEDIAN_MULTIPLE * median) - value) >= 0 ) { + // Value is good. + return(true); + } + + + // Check to see if the value lies between previous and median. + if ( ((previous_value > median) && (value >= median && value <= previous_value)) || + (value >= previous_value && value <= median) ) { + // Value is good. + return(true); + } + } + } + + return(false); +} + + + + + + + +// +// Function to check and correct a particular value. +// +// Returns true if a value was corrected. +bool +correctSinglesValue(int value, int slice, int singles_bin_index, + ecat::ecat7::SinglesRatesFromSglFile& singles_rates) { + + + // Previous value. Set to 0 for the first slice. + int previous = 0; + + + if ( slice > 0 ) { + previous = singles_rates.get_singles_rate(singles_bin_index, slice - 1); + } + + + if ( checkValue(value, slice, singles_bin_index, singles_rates, previous) == true ) { + return(false); + } + + + // The value is not good. Therefore, correct the value using + // the previous value (which must be good) and the next good value. + int num_slices = singles_rates.get_num_time_slices(); + int next_slice; + int next_value; + + for(next_slice = slice + 1; next_slice < num_slices ; ++next_slice ) { + next_value = singles_rates.get_singles_rate(singles_bin_index, next_slice); + + if ( checkValue(next_value, next_slice, singles_bin_index, singles_rates, previous) ) { + break; + } + } + + if ( next_slice < num_slices ) { + // Correct using previous and next_slice. + int next_sep = next_slice - slice; + + // Adjust value. + value = ((previous * next_sep) + next_value) / (1 + next_sep); + + singles_rates.set_singles_rate(singles_bin_index, slice, value); + } + + // Value was bad so return true. + return(true); + +} + + + + + + +// +// check and correct all the singles values. Return true if any values were corrected. +// +// +bool +correctAllValues(ecat::ecat7::SinglesRatesFromSglFile& singles_rates, + std::ostream& output) { + + bool changed = false; + + // Get scanner details and, from these, the number of singles units. + const Scanner *scanner = singles_rates.get_scanner_ptr(); + int total_singles_units = scanner->get_num_singles_units(); + + // Get total number of time slices. + int num_slices = singles_rates.get_num_time_slices(); + + // Loop over all bins. + for(int singles_bin = 0 ; singles_bin < total_singles_units ; ++singles_bin) { + + // Loop over each time slice. + for(int slice = 0 ; slice < num_slices ; ++slice) { + + int value = singles_rates.get_singles_rate(singles_bin, slice); + + if ( correctSinglesValue(value, slice, singles_bin, singles_rates) ) { + + changed = true; + int new_value = singles_rates.get_singles_rate(singles_bin, slice); + + // Print details of the change to the output. + output << "Bin " << singles_bin + << " Slice index: " << slice + << " Rate: " << value + << " New estimate: " << new_value + << "\n"; + } + + } + + } + + return(changed); + +} + + + + + + + +int +main (int argc, char **argv) +{ + + // Check arguments. + // Singles filename + optional output filename + if (argc > 3 || argc < 2) { + cerr << "Usage: " << argv[0] << " sgl_filename [output_filename]\n"; + exit(EXIT_FAILURE); + } + + + const string sgl_filename = argv[1]; + + bool write_file = false; + string output_filename = ""; + if ( argc == 3 ) { + write_file = true; + output_filename = argv[2]; + } + + + // Singles file object. + ecat::ecat7::SinglesRatesFromSglFile singles_from_sgl; + + // Read the singles file. + singles_from_sgl.read_singles_from_sgl_file(sgl_filename); + + + const vector times = singles_from_sgl.get_times(); + + + + std::ofstream output; + + // If necessary, open the output file. + if ( output_filename.length() ) { + + output.open(output_filename.c_str(), std::ios_base::out); + + if (!output.good()) + error("Error opening output file\n"); + } + + + + if ( correctAllValues(singles_from_sgl, cout) && write_file ) { + // Write data to output file. + singles_from_sgl.write(output); + } + + + return EXIT_SUCCESS; +} diff --git a/src/modelling_buildblock/CMakeLists.txt b/src/modelling_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..b820a9a5b7 --- /dev/null +++ b/src/modelling_buildblock/CMakeLists.txt @@ -0,0 +1,19 @@ +# +# + +set(dir modelling_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + KineticModel + PatlakPlot + GeneralizedPatlakPlot + ParametricDiscretisedDensity +) + +#$(dir)_REGISTRY_SOURCES:= modelling_registries + +include(stir_lib_target) + +target_link_libraries(modelling_buildblock buildblock) diff --git a/src/modelling_buildblock/KineticModel.cxx b/src/modelling_buildblock/KineticModel.cxx new file mode 100644 index 0000000000..94c21f9e07 --- /dev/null +++ b/src/modelling_buildblock/KineticModel.cxx @@ -0,0 +1,43 @@ +// +// +/* + Copyright (C) 2006 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \file + \ingroup modelling + \brief Implementations of inline functions of class stir::KineticModel + + \author Charalampos Tsoumpas + + This is the most basic class for including kinetic models. + +*/ + + +#include "stir/modelling/KineticModel.h" + + +START_NAMESPACE_STIR + +const char * const +KineticModel::registered_name = "Kinetic Model Type"; + +KineticModel::KineticModel() //!< default constructor +{ } +KineticModel::~KineticModel() //!< default destructor +{ } + +END_NAMESPACE_STIR diff --git a/src/modelling_buildblock/ParametricDiscretisedDensity.cxx b/src/modelling_buildblock/ParametricDiscretisedDensity.cxx new file mode 100644 index 0000000000..5403f24813 --- /dev/null +++ b/src/modelling_buildblock/ParametricDiscretisedDensity.cxx @@ -0,0 +1,345 @@ +// +// +/* + Copyright (C) 2006 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + + \brief Declaration of class stir::ParametricDiscretisedDensity + + \author Kris Thielemans + \author Nicolas A Karakatsanis + +*/ + +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" +#include "boost/lambda/lambda.hpp" +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/IO/read_from_file.h" +#include + +START_NAMESPACE_STIR + +//#define TEMPLATE template +#define TEMPLATE template +//#define ParamDiscDensity ParametricDiscretisedDensity +#define ParamDiscDensity ParametricDiscretisedDensity + +///////////////////////////////////////////////////////////////////////////////////// +TEMPLATE +unsigned int +ParamDiscDensity:: +get_num_params() +{ + // somewhat naughty trick to get elemT of DiscDensityT + typedef typename DiscDensityT::full_value_type KinParsT; + const KinParsT dummy; + return dummy.size(); +} + +#if 0 +// implementation works, although only for VoxelsOnCartesianGrid , but not needed for now +TEMPLATE +ParamDiscDensity:: +ParametricDiscretisedDensity(const VectorWithOffset > & densities) + // TODO this will only work for VoxelsOnCartesianGrid + : base_type(densities[1]->get_index_range(), + densities[1]->get_origin(), + densities[1]->get_grid_spacing()) +{ + + assert(densities.size()==this->get_num_params()); + for (unsigned f=1; f<= this->get_num_params(); ++f) + { + assert(densities[1]->get_grid_spacing()==densities[f]->get_grid_spacing()); + assert(densities[1]->get_index_range()==densities[f]->get_index_range()); + assert(densities[1]->get_origin()==densities[f]->get_origin()); + } + + for (unsigned f=1; f<= this->get_num_params(); ++f) + { +#if 1 + // for some reason, the following gives a segmentation fault in gcc 4.1 optimised mode. + // Maybe because we're calling a member function in the constructor? + this->update_parametric_image(*densities[f], f); +#else + // alternative (untested) + const SingleDiscretisedDensityType& current_density = + dynamic_cast(*densities[f]); + typename SingleDiscretisedDensityType::const_full_iterator single_density_iter = + current_density.begin_all(); + const typename SingleDiscretisedDensityType::const_full_iterator end_single_density_iter = + current_density.end_all(); + typename ParamDiscDensity::full_densel_iterator parametric_density_iter = + this->begin_all_densel(); + + while (single_density_iter!=end_single_density_iter) + { (*parametric_density_iter)[f] = *single_density_iter; + ++single_density_iter; ++parametric_density_iter; + } +#endif + } +} +#endif + +#if 0 +// implementation works, but not needed for now +TEMPLATE +void +ParamDiscDensity:: +update_parametric_image(const VectorWithOffset > & densities) +{ + assert(densities.size()==this->get_num_params()); + for (unsigned f=1; f<= this->get_num_params(); ++f) + { + assert(densities[1]->get_grid_spacing()==densities[f]->get_grid_spacing()); + assert(densities[1]->get_index_range()==densities[f]->get_index_range()); + assert(densities[1]->get_origin()==densities[f]->get_origin()); + } + for (unsigned f=1; f<= this->get_num_params(); ++f) + { + this->update_parametric_image(*densities[f], f); + } + +} +#endif + +TEMPLATE +void +ParamDiscDensity:: +update_parametric_image(const SingleDiscretisedDensityType & single_density, const unsigned int param_num) +{ + assert(param_num<=this->get_num_params()); + assert(single_density.get_index_range() == this->get_index_range()); + + const unsigned int f=param_num; + typename SingleDiscretisedDensityType::const_full_iterator single_density_iter = + single_density.begin_all(); + const typename SingleDiscretisedDensityType::const_full_iterator end_single_density_iter = + single_density.end_all(); + typename ParamDiscDensity::full_densel_iterator parametric_density_iter = + this->begin_all_densel(); + while (single_density_iter!=end_single_density_iter) + { + if (parametric_density_iter == this->end_all_densel()) + error("update ITER"); + //(*parametric_density_iter)[f] = *single_density_iter; + const float tmp = *single_density_iter; + (*parametric_density_iter)[f] = tmp; + ++single_density_iter; ++parametric_density_iter; + } + // TODO Currently need this to avoid segmentation fault with 4.1... + // std::cerr << " Done\n"; +} + +TEMPLATE +ParamDiscDensity * +ParamDiscDensity:: +read_from_file(const std::string& filename) +{ + // TODO this will only work for elemT==float + shared_ptr multi_sptr( + stir::read_from_file(filename)); + + using namespace boost::lambda; + + // somewhat naughty trick to get elemT of DiscDensityT + typedef typename DiscDensityT::full_value_type KinParsT; + + // check size + { + KinParsT dummy; + const unsigned num_pars = dummy.size(); + + if (num_pars != multi_sptr->get_num_time_frames()) + error("I expect %d 'time frames' when reading %s. Exiting", + num_pars, filename.c_str()); + } + + if (dynamic_cast * >(&(*multi_sptr)[1])==0) + error("ParametricDiscretisedDensity::read_from_file only supports VoxelsOnCartesianGrid"); + + CartesianCoordinate3D grid_spacing = + static_cast *>(&(*multi_sptr)[1])->get_grid_spacing(); + // TODO this will only work for VoxelsOnCartesianGrid + ParamDiscDensity * parametric_density_ptr = + new ParamDiscDensity(DiscDensityT((*multi_sptr)[1].get_index_range(), + (*multi_sptr)[1].get_origin(), + grid_spacing)); + + for (unsigned f=1; f<= multi_sptr->get_num_time_frames(); ++f) + { + const SingleDiscretisedDensityType& current_density = + dynamic_cast((*multi_sptr)[f]); + typename SingleDiscretisedDensityType::const_full_iterator single_density_iter = + current_density.begin_all(); + const typename SingleDiscretisedDensityType::const_full_iterator end_single_density_iter = + current_density.end_all(); + typename ParamDiscDensity::full_densel_iterator parametric_density_iter = + parametric_density_ptr->begin_all_densel(); + + while (single_density_iter!=end_single_density_iter) + { + (*parametric_density_iter)[f] = *single_density_iter; + ++single_density_iter; ++parametric_density_iter; + } + } + return parametric_density_ptr; +} + + +TEMPLATE +ParamDiscDensity * +ParamDiscDensity:: +get_empty_copy() const +{ + // TODO maybe this can be done smarter by using base_type::get_empty_copy. Doesn't matter too much though. + ParamDiscDensity * res = this->clone(); + typename ParamDiscDensity::iterator parametric_density_iter = + res->begin(); + while (parametric_density_iter!=res->end()) + { + assign(*parametric_density_iter++, 0); + } + return res; +} + +TEMPLATE +ParamDiscDensity * +ParamDiscDensity:: +clone() const +{ + return new ParamDiscDensity(*this); +} + +TEMPLATE +template +void +ParamDiscDensity:: +construct_single_density_using_function(typename ParamDiscDensity::SingleDiscretisedDensityType& density, KPFunctionObject f) const +{ + std::transform(this->begin_all_densel(), + this->end_all_densel(), + density.begin_all(), + f); +} + + +TEMPLATE +template +const typename ParamDiscDensity::SingleDiscretisedDensityType +ParamDiscDensity:: +construct_single_density_using_function(KPFunctionObject f) const +{ + // TODO this will only work for VoxelsOnCartesianGrid + SingleDiscretisedDensityType + density(this->get_index_range(), + this->get_origin(), + this->get_grid_spacing()); + this->construct_single_density_using_function(density, f); + return density; +} + +TEMPLATE +void +ParamDiscDensity:: +construct_single_density(typename ParamDiscDensity::SingleDiscretisedDensityType& density, const int index) const +{ + using namespace boost::lambda; + + // TODO this will only work for elemT==float + this->construct_single_density_using_function(density, ret(_1[index])); +} + + +TEMPLATE +const typename ParamDiscDensity::SingleDiscretisedDensityType +ParamDiscDensity:: +construct_single_density(const int index) const +{ + using namespace boost::lambda; + // TODO this will only work for elemT==float + return this->construct_single_density_using_function(ret(_1[index])); +} + +/////////////////////////////// +#if 0 //!< Implementation of non-const functions - which should be able to update a single parameter of a parametric image. +TEMPLATE +template +void +ParamDiscDensity:: +construct_single_density_using_function(typename ParamDiscDensity::SingleDiscretisedDensityType& density, KPFunctionObject f) +{ + std::transform(this->begin_all_densel(), + this->end_all_densel(), + density.begin_all(), + f); +} + + +TEMPLATE +template +typename ParamDiscDensity::SingleDiscretisedDensityType & +ParamDiscDensity:: +construct_single_density_using_function(KPFunctionObject f) +{ + // TODO this will only work for VoxelsOnCartesianGrid + SingleDiscretisedDensityType + density(this->get_index_range(), + this->get_origin(), + this->get_grid_spacing()); + this->construct_single_density_using_function(density, f); + return density; +} + +TEMPLATE +void +ParamDiscDensity:: +construct_single_density(typename ParamDiscDensity::SingleDiscretisedDensityType& density, const int index) +{ + using namespace boost::lambda; + + // TODO this will only work for elemT==float + this->construct_single_density_using_function(density, ret(_1[index])); +} + +TEMPLATE +typename ParamDiscDensity::SingleDiscretisedDensityType & +ParamDiscDensity:: +construct_single_density(const int index) +{ + using namespace boost::lambda; + // TODO this will only work for elemT==float + return this->construct_single_density_using_function(ret(_1[index])); +} + +#endif + + +#undef ParamDiscDensity +#undef TEMPLATE +// instantiations + +// template class ParametricDiscretisedDensity<3,KineticParameters >; + template class ParametricDiscretisedDensity; + + template class ParametricDiscretisedDensity; + +END_NAMESPACE_STIR + diff --git a/src/modelling_buildblock/PatlakPlot.cxx b/src/modelling_buildblock/PatlakPlot.cxx new file mode 100644 index 0000000000..9c89a470d5 --- /dev/null +++ b/src/modelling_buildblock/PatlakPlot.cxx @@ -0,0 +1,589 @@ +// +// +/* + Copyright (C) 2006 - 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \file + \ingroup modelling + \brief Implementations of inline functions of class stir::PatlakPlot + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + + \sa PatlakPlot.h, ModelMatrix.h and KineticModel.h + +*/ + + +#include "stir/modelling/PatlakPlot.h" +#include "stir/linear_regression.h" + +START_NAMESPACE_STIR + +void +PatlakPlot:: +set_defaults() +{ + base_type::set_defaults(); + this->_blood_data_filename=""; + this->_cal_factor=1.F; + this->_starting_frame=0; + this->_time_shift=0.; + this->_in_correct_scale=false; + this->_in_total_cnt=false; + this->_plasma_in_total_cnt=false; +} + +const char * const +PatlakPlot::registered_name = "Patlak Plot"; + +//! default constructor +PatlakPlot::PatlakPlot() +{ + this->_matrix_is_stored=false; + this->set_defaults(); +} + +PatlakPlot::~PatlakPlot() //!< default destructor +{ } + + //! Simply get model matrix if it has been already stored +ModelMatrix<2> +PatlakPlot:: +get_model_matrix() const +{ + if(_matrix_is_stored==false) + error("It seems that ModelMatrix has not been set, yet. "); + + return _model_matrix ; +} + +//! Simply set model matrix +void PatlakPlot::set_model_matrix(ModelMatrix<2> model_matrix) +{ + this->_model_matrix=model_matrix; + this->_matrix_is_stored=true; +} + +//! Create model matrix from plasma data (has to be in appropriate frames) +ModelMatrix<2> +PatlakPlot:: +get_model_matrix(const PlasmaData& plasma_data,const TimeFrameDefinitions& time_frame_definitions,const unsigned int starting_frame) +{ + assert(starting_frame>0); + + if(_matrix_is_stored==false) + { + this->_starting_frame=starting_frame; + BasicCoordinate<2,int> min_range; + BasicCoordinate<2,int> max_range; + min_range[1]=1; min_range[2]=starting_frame; + max_range[1]=2; max_range[2]=plasma_data.size(); + IndexRange<2> data_range(min_range,max_range); + Array<2,float> patlak_array(data_range); + VectorWithOffset time_vector(min_range[2],max_range[2]); + PlasmaData::const_iterator cur_iter=plasma_data.begin(); + + double integral_step=0.; + double sum_value=0.; + unsigned int sample_num; + // std::cerr << "\n" << cur_iter->get_plasma_counts_in_kBq() << " " << cur_iter->get_time_in_s() << "\n"; + // std::cerr << "\nFrame-PlasmaStart-TimeFrameFileStart-PlasmaDuration-TimeFrameFileDuration-PlasmaEnd-TimeFrameFileEnd\n" ; + for(sample_num=1 ; sample_numget_plasma_counts_in_kBq()*plasma_data.get_time_frame_definitions().get_duration(sample_num); + } + + assert(cur_iter==plasma_data.begin()+starting_frame-1); + + for(sample_num=starting_frame ; cur_iter!=plasma_data.end() ; ++sample_num, ++cur_iter ) + { + integral_step=cur_iter->get_plasma_counts_in_kBq()*plasma_data.get_time_frame_definitions().get_duration(sample_num); + // Calculation of the plasma integral only up to the mid time of the current plasma frame + sum_value+=0.5*integral_step; + // Fillling of the Patlak array. First column is filled with plasma integral, second column with plasma activity + patlak_array[1][sample_num]= static_cast(sum_value); + patlak_array[2][sample_num]=cur_iter->get_plasma_counts_in_kBq(); + if(plasma_data.get_if_decay_corrected()) + { + const float dec_fact= + static_cast(decay_correction_factor(plasma_data.get_isotope_halflife(),plasma_data.get_time_frame_definitions().get_start_time(sample_num), + plasma_data.get_time_frame_definitions().get_end_time(sample_num))); + patlak_array[1][sample_num]/=dec_fact; + patlak_array[2][sample_num]/=dec_fact; + time_vector[sample_num]= static_cast(0.5*(time_frame_definitions.get_end_time(sample_num)+time_frame_definitions.get_start_time(sample_num))); + } + // Completion of integral calculation before moving to the next plasma frame + sum_value+=0.5*integral_step; + } + if(plasma_data.get_if_decay_corrected()) + warning("Uncorrecting previous decay correction, while putting the plasma_data into the model_matrix."); + else if(!plasma_data.get_if_decay_corrected()) + warning("plasma_data have not been corrected during the process, which might create wrong results!!!"); + + assert(sample_num-1==plasma_data.size()); + this->_model_matrix.set_model_array(patlak_array); + this->_model_matrix.set_time_vector(time_vector); + this->_model_matrix.set_if_in_correct_scale(this->_in_correct_scale); + this->_model_matrix.threshold_model_array(.0000001F); + this->_matrix_is_stored=true; + } + return _model_matrix ; +} + + //! Create model matrix from private members +void +PatlakPlot:: +create_model_matrix() +{ + if(_matrix_is_stored==false) + { + BasicCoordinate<2,int> min_range; + BasicCoordinate<2,int> max_range; + min_range[1]=1; min_range[2]=this->_starting_frame; + max_range[1]=2; max_range[2]=this->_plasma_frame_data.size(); + IndexRange<2> data_range(min_range,max_range); + Array<2,float> patlak_array(data_range); + VectorWithOffset time_vector(min_range[2],max_range[2]); + VectorWithOffset dec_fact(min_range[2],max_range[2]); + PlasmaData::const_iterator cur_iter=this->_plasma_frame_data.begin(); + + double integral_step=0.; + double sum_value=0.; + unsigned int sample_num; + + if(this->_plasma_frame_data.get_if_decay_corrected()) + warning("Uncorrecting previous decay correction, while putting the plasma_data into the model_matrix."); + else if(!this->_plasma_frame_data.get_if_decay_corrected()) + error("plasma_data have not been corrected during the process, which will create wrong results!!!"); + + for(sample_num=1 ; sample_num_starting_frame; ++sample_num, ++cur_iter ) + sum_value+=cur_iter->get_plasma_counts_in_kBq()*this->_plasma_frame_data.get_time_frame_definitions().get_duration(sample_num); + + std::cout << "\nInitial plasma integral: " << sum_value << "\n"; + assert(cur_iter==this->_plasma_frame_data.begin()+this->_starting_frame-1); + + std::cout << "Creating Model Matrix" << "\n" << "Column 1: plasma integral Column 2: plasma (Reference frame index)" << "\n"; + + for(sample_num=this->_starting_frame ; cur_iter!=this->_plasma_frame_data.end() ; ++sample_num, ++cur_iter ) + { + integral_step=cur_iter->get_plasma_counts_in_kBq()*this->_plasma_frame_data.get_time_frame_definitions().get_duration(sample_num); + // Calculation of the plasma integral only up to the mid time of the current plasma frame + sum_value+=0.5*integral_step; + // Fillling of the Patlak array. First column is filled with plasma integral, second column with plasma activity + patlak_array[1][sample_num]= static_cast(sum_value); + patlak_array[2][sample_num]=cur_iter->get_plasma_counts_in_kBq(); + + if(this->_plasma_frame_data.get_if_decay_corrected()) + { + dec_fact[sample_num]= + static_cast(decay_correction_factor(this->_plasma_frame_data.get_isotope_halflife(),this->_plasma_frame_data.get_time_frame_definitions().get_start_time(sample_num), + this->_plasma_frame_data.get_time_frame_definitions().get_end_time(sample_num))); + patlak_array[1][sample_num]/=dec_fact[sample_num]; + patlak_array[2][sample_num]/=dec_fact[sample_num]; + time_vector[sample_num]= static_cast(0.5*(this->_frame_defs.get_end_time(sample_num)+this->_frame_defs.get_start_time(sample_num))); + } + // Completion of integral calculation before moving to the next plasma frame + sum_value+=0.5*integral_step; + //Print out the model matrix + std::cout << patlak_array[1][sample_num] << " " << patlak_array[2][sample_num] << " (" << sample_num << ")\n"; + + } + + if(this->_plasma_frame_data.get_if_decay_corrected()) + { + std::cout << "\n\nFrame Index Start Time End Time Decay correction factor\n"; + cur_iter=this->_plasma_frame_data.begin()+this->_starting_frame-1; + for(sample_num=this->_starting_frame ; cur_iter!=this->_plasma_frame_data.end() ; ++sample_num, ++cur_iter ) + { + //Print out the frame indices, start and time points and the decay correction factors + std::cout << sample_num << " " + << _plasma_frame_data.get_time_frame_definitions().get_start_time(sample_num) << " " + << _plasma_frame_data.get_time_frame_definitions().get_end_time(sample_num) << " " + << dec_fact[sample_num] + << "\n"; + } + } + + assert(sample_num-1==this->_plasma_frame_data.size()); + this->_model_matrix.set_model_array(patlak_array); + this->_model_matrix.set_time_vector(time_vector); + // Uncalibrate the ModelMatrix instead of Calibrating all the Dynamic Images. This should make faster the computation. + // Supposes the images are not calibrated. + this->_model_matrix.uncalibrate(this->_cal_factor); + this->_model_matrix.set_matrix_in_total_frame_counts(this->_plasma_in_total_cnt); + if(this->_in_total_cnt) + this->_model_matrix.convert_to_total_frame_counts(this->_frame_defs); + this->_model_matrix.set_if_in_correct_scale(this->_in_correct_scale); + this->_model_matrix.threshold_model_array(.000000001F); + this->_matrix_is_stored=true; + } + else + warning("ModelMatrix has been already created"); +} + +Succeeded +PatlakPlot::set_up() +{ + // if (base_type::set_up() != Succeeded::yes) + // return Succeeded::no; + + this->create_model_matrix(); + if (this->_matrix_is_stored==true) + { + std::cout << "Set up of Patlak Plot is successful.\n"; + return Succeeded::yes; + } + else + { + std::cout << "Set up of Patlak Plot has failed.\n"; + return Succeeded::no; +} +} + +void +PatlakPlot::apply_linear_regression(ParametricVoxelsOnCartesianGrid & par_image, const DynamicDiscretisedDensity & dyn_image) const +{ + if (!this->_in_correct_scale) + { +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_not_in_correct_scale.txt"); +#endif //NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (((dyn_image.get_densities())[0]).get()); + const BasicCoordinate<3,float> this_grid_spacing = image_cartesian_ptr->get_grid_spacing(); + this->_model_matrix.scale_model_matrix(this_grid_spacing[2]/dyn_image.get_scanner_default_bin_size()); +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_in_correct_scale.txt"); +#endif //NDEBUG + } + // const DynamicDiscretisedDensity & dyn_image=this->_dyn_image; + const unsigned int num_frames=(this->_frame_defs).get_num_frames(); + unsigned int frame_num; + unsigned int starting_frame= this->_starting_frame; + Array<2,float> brain_patlak_model_array=this->_model_matrix.get_model_array(); + VectorWithOffset patlak_x(starting_frame-1,num_frames-1); + VectorWithOffset patlak_y(starting_frame-1,num_frames-1); + VectorWithOffset weights(starting_frame-1,num_frames-1); + + std::cout << "\nFrame " << " Plasma Integral " << " Plasma " << " Patlak X\n"; + + for(unsigned int frame_num = starting_frame; + frame_num<=num_frames ; ++frame_num ) + { + patlak_x[frame_num-1]=brain_patlak_model_array[1][frame_num]/brain_patlak_model_array[2][frame_num]; + weights[frame_num-1]=1; + std::cout << frame_num << " " + << brain_patlak_model_array[1][frame_num] << " " + << brain_patlak_model_array[2][frame_num] << " " + << patlak_x[frame_num-1] << "\n"; + } + { // Do linear_regression for each voxel // for k j i + float slope=0.F; + float y_intersection=0.F; + float variance_of_slope=0.F; + float variance_of_y_intersection=0.F; + float covariance_of_y_intersection_with_slope=0.F; + float chi_square = 0.F; + + const int min_k_index = dyn_image[1].get_min_index(); + const int max_k_index = dyn_image[1].get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = dyn_image[1][k].get_min_index(); + const int max_j_index = dyn_image[1][k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = dyn_image[1][k][j].get_min_index(); + const int max_i_index = dyn_image[1][k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + { + for ( frame_num = starting_frame; + frame_num<=num_frames ; ++frame_num ) + patlak_y[frame_num-1]=dyn_image[frame_num][k][j][i]/brain_patlak_model_array[2][frame_num]; + linear_regression(y_intersection, slope, + chi_square, + variance_of_y_intersection, + variance_of_slope, + covariance_of_y_intersection_with_slope, + patlak_y, + patlak_x, + weights); + par_image[k][j][i][2]=y_intersection; + par_image[k][j][i][1]=slope; + } + } + } + } +} + +void +PatlakPlot::multiply_dynamic_image_with_model_gradient(ParametricVoxelsOnCartesianGrid & par_image, + const DynamicDiscretisedDensity & dyn_image) const +{ + if (!this->_in_correct_scale) + { +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_not_in_correct_scale.txt"); +#endif //NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (((dyn_image.get_densities())[0]).get()); + const BasicCoordinate<3,float> this_grid_spacing = image_cartesian_ptr->get_grid_spacing(); + this->_model_matrix.scale_model_matrix(this_grid_spacing[2]/dyn_image.get_scanner_default_bin_size()); +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_in_correct_scale.txt"); +#endif //NDEBUG + } + this->_model_matrix.multiply_dynamic_image_with_model(par_image,dyn_image); +} + +void +PatlakPlot::multiply_dynamic_image_with_model_gradient_and_add_to_input(ParametricVoxelsOnCartesianGrid & par_image, + const DynamicDiscretisedDensity & dyn_image) const +{ + if (!this->_in_correct_scale) + { +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_not_in_correct_scale.txt"); +#endif //NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (((dyn_image.get_densities())[0]).get()); + const BasicCoordinate<3,float> this_grid_spacing = image_cartesian_ptr->get_grid_spacing(); + this->_model_matrix.scale_model_matrix(this_grid_spacing[2]/dyn_image.get_scanner_default_bin_size()); +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_in_correct_scale.txt"); +#endif //NDEBUG + } + this->_model_matrix.multiply_dynamic_image_with_model_and_add_to_input(par_image,dyn_image); +} + +// Should be a virtual function declared in the KineticModels or better to the LinearModels +void +PatlakPlot::get_dynamic_image_from_parametric_image(DynamicDiscretisedDensity & dyn_image, + const ParametricVoxelsOnCartesianGrid & par_image) const +{ + if (!this->_in_correct_scale) + { +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_not_in_correct_scale.txt"); +#endif //NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (((dyn_image.get_densities())[0]).get()); + const BasicCoordinate<3,float> this_grid_spacing = image_cartesian_ptr->get_grid_spacing(); + this->_model_matrix.scale_model_matrix(this_grid_spacing[2]/dyn_image.get_scanner_default_bin_size()); +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_in_correct_scale.txt"); +#endif //NDEBUG + } + + this->_model_matrix.multiply_parametric_image_with_model(dyn_image,par_image); +} + +// Currently not used but retained for future potential usage. +// The initialization of generalized Patlak nested estimates is performed by GeneralizedPatlakPlot equivalent method +void +PatlakPlot::multiply_dynamic_image_with_initialization_model_gradient(GeneralizedPatlakVoxelsOnCartesianGrid & par_image, + const DynamicDiscretisedDensity & dyn_image) const +{ + if (!this->_in_correct_scale) + { +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_not_in_correct_scale.txt"); +#endif //NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (((dyn_image.get_densities())[0]).get()); + const BasicCoordinate<3,float> this_grid_spacing = image_cartesian_ptr->get_grid_spacing(); + this->_model_matrix.scale_model_matrix(this_grid_spacing[2]/dyn_image.get_scanner_default_bin_size()); +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_in_correct_scale.txt"); +#endif //NDEBUG + } + this->_model_matrix.multiply_dynamic_image_with_initialization_model(par_image,dyn_image); +} + +// Currently not used but retained for future potential usage. +// The initialization of generalized Patlak nested estimates is performed by GeneralizedPatlakPlot equivalent method +void +PatlakPlot::multiply_dynamic_image_with_initialization_model_gradient_and_add_to_input(GeneralizedPatlakVoxelsOnCartesianGrid & par_image, + const DynamicDiscretisedDensity & dyn_image) const +{ + if (!this->_in_correct_scale) + { +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_not_in_correct_scale.txt"); +#endif //NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (((dyn_image.get_densities())[0]).get()); + const BasicCoordinate<3,float> this_grid_spacing = image_cartesian_ptr->get_grid_spacing(); + this->_model_matrix.scale_model_matrix(this_grid_spacing[2]/dyn_image.get_scanner_default_bin_size()); +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_in_correct_scale.txt"); +#endif //NDEBUG + } + this->_model_matrix.multiply_dynamic_image_with_initialization_model_and_add_to_input(par_image,dyn_image); +} + +// Should be a virtual function declared in the KineticModels or better to the LinearModels +// Currently not used but retained for future potential usage. +// The initialization of generalized Patlak nested estimates is performed by GeneralizedPatlakPlot equivalent method +void +PatlakPlot::get_dynamic_image_from_initialization_parametric_image(DynamicDiscretisedDensity & dyn_image, + const GeneralizedPatlakVoxelsOnCartesianGrid & par_image) const +{ + if (!this->_in_correct_scale) + { +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_not_in_correct_scale.txt"); +#endif //NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (((dyn_image.get_densities())[0]).get()); + const BasicCoordinate<3,float> this_grid_spacing = image_cartesian_ptr->get_grid_spacing(); + this->_model_matrix.scale_model_matrix(this_grid_spacing[2]/dyn_image.get_scanner_default_bin_size()); +#ifndef NDEBUG + this->_model_matrix.write_to_file("patlak_matrix_in_correct_scale.txt"); +#endif //NDEBUG + } + + this->_model_matrix.multiply_parametric_image_with_initialization_model(dyn_image,par_image); +} + + +unsigned int +PatlakPlot::get_starting_frame() const +{ + return this->_starting_frame; +} + +TimeFrameDefinitions +PatlakPlot::get_time_frame_definitions() const +{ + return this->_frame_defs; +} +void +PatlakPlot:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Patlak Plot Parameters"); + this->parser.add_key("Blood Data Filename", &this->_blood_data_filename); + this->parser.add_key("Calibration Factor", &this->_cal_factor); + this->parser.add_key("Starting Frame", &this->_starting_frame); + this->parser.add_key("Time Shift", &this->_time_shift); + this->parser.add_key("In total counts", &this->_in_total_cnt); + this->parser.add_key("Plasma in total counts", &this->_plasma_in_total_cnt); + this->parser.add_key("In correct scale", &this->_in_correct_scale); + this->parser.add_key("Time Frame Definition Filename", &this->_time_frame_definition_filename); + this->parser.add_stop_key("end Patlak Plot Parameters"); +} + +/*! \todo This currently hard-wired F-18 decay for the plasma data */ +bool +PatlakPlot:: +post_processing() +{ + if (base_type::post_processing() == true) + return true; + + // read time frame def + if (this->_time_frame_definition_filename.size()!=0) + this->_frame_defs=TimeFrameDefinitions(this->_time_frame_definition_filename); + else + { + error("No Time Frames Definitions available!!!\n "); + return true; + } + // Reading the input function + if(this->_blood_data_filename=="0") + { + warning("You need to specify a file for the input function."); + return true; + } + else + { + this->_if_cardiac=false; + PlasmaData plasma_data_temp; + plasma_data_temp.read_plasma_data(this->_blood_data_filename); // The implementation assumes three list file. + // TODO have parameter + warning("Assuming F-18 tracer for plasma data!!!"); + plasma_data_temp.set_isotope_halflife(6586.2F); + plasma_data_temp.shift_time(this->_time_shift); + this->_plasma_frame_data=plasma_data_temp.get_sample_data_in_frames(this->_frame_defs); + } +return false; +} + +//! Create model matrix from blood frame data +#if 0 +ModelMatrix<2> +PatlakPlot:: +get_model_matrix(const BloodFrameData& blood_frame_data, const unsigned int starting_frame) +{ + assert(starting_frame>0); + if(_matrix_is_stored==false) + { + BasicCoordinate<2,int> min_range; + BasicCoordinate<2,int> max_range; + min_range[1]=1; min_range[2]=starting_frame; + max_range[1]=2; max_range[2]=blood_frame_data.size(); + IndexRange<2> data_range(min_range,max_range); + Array<2,float> patlak_array(data_range); + VectorWithOffset time_vector(min_range[2],max_range[2]); + BloodFrameData::const_iterator cur_iter=blood_frame_data.begin(); + + float sum_value=0.F; + unsigned int sample_num; + + for(sample_num=1 ; sample_numget_blood_counts_in_kBq(); + const float durat=(cur_iter->get_frame_end_time_in_s()-cur_iter->get_frame_start_time_in_s()); + sum_value+=blood*durat + *decay_correct_factor(this->_plasma_frame_data.get_isotope_halflife(), + cur_iter->get_frame_start_time_in_s(), + cur_iter->get_frame_end_time_in_s()) ; + } + assert(cur_iter==blood_frame_data.begin()+starting_frame-1); + for(sample_num=starting_frame ; cur_iter!=blood_frame_data.end(); ++sample_num, ++cur_iter ) + { + const float blood=cur_iter->get_blood_counts_in_kBq(); + const float durat=(cur_iter->get_frame_end_time_in_s()-cur_iter->get_frame_start_time_in_s()); + // Calculation of the plasma integral only up to the mid time of the current plasma frame + sum_value+=0.5*blood*durat + *decay_correct_factor(this->_plasma_frame_data.get_isotope_halflife(), + cur_iter->get_frame_start_time_in_s(), + cur_iter->get_frame_end_time_in_s()) ; + // Normalize with the decay correct factor now. + patlak_array[1][sample_num]=sum_value/decay_correct_factor(this->_plasma_frame_data.get_isotope_halflife(), + cur_iter->get_frame_start_time_in_s(), + cur_iter->get_frame_end_time_in_s()) ; + patlak_array[2][sample_num]=blood/decay_correct_factor(this->_plasma_frame_data.get_isotope_halflife(), + cur_iter->get_frame_start_time_in_s(), + cur_iter->get_frame_end_time_in_s()); + time_vector[sample_num]=0.5*(cur_iter->get_frame_start_time_in_s()+cur_iter->get_frame_end_time_in_s()) ; + // Completion of integral calculation before moving to the next plasma frame + sum_value+=0.5*blood*durat; + } + + assert(sample_num-1==blood_frame_data.size()); + + this->_model_matrix.set_model_array(patlak_array); + this->_model_matrix.set_time_vector(time_vector); + this->_matrix_is_stored=true; + } + return _model_matrix ; +} +#endif + +END_NAMESPACE_STIR diff --git a/src/modelling_buildblock/lib.mk b/src/modelling_buildblock/lib.mk new file mode 100644 index 0000000000..a653d7692f --- /dev/null +++ b/src/modelling_buildblock/lib.mk @@ -0,0 +1,14 @@ +# +# + +dir := modelling_buildblock +$(dir)_LIB_SOURCES:= \ + KineticModel.cxx \ + PatlakPlot.cxx \ + GeneralizedPatlakPlot.cxx \ + ParametricDiscretisedDensity.cxx + +$(dir)_REGISTRY_SOURCES:= modelling_registries.cxx + +include $(WORKSPACE)/lib.mk + diff --git a/src/modelling_buildblock/modelling_registries.cxx b/src/modelling_buildblock/modelling_registries.cxx new file mode 100644 index 0000000000..9f8aafb167 --- /dev/null +++ b/src/modelling_buildblock/modelling_registries.cxx @@ -0,0 +1,42 @@ +// +// +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + Some parts of this file originate in CTI code, distributed as + part of the matrix library from Louvain-la-Neuve, and hence carries + its restrictive license. Affected parts are the dead-time correction + in get_deadtime_efficiency and geo_Z_corr related code. + + Most of this file is free software; you can redistribute that part and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup modelling + \brief File that registers all stir::RegisterObject children in modelling + + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + +*/ +#include "stir/modelling/PatlakPlot.h" +#include "stir/modelling/GeneralizedPatlakPlot.h" + +START_NAMESPACE_STIR + +static PatlakPlot::RegisterIt dummy113; +static GeneralizedPatlakPlot::RegisterIt dummysss; + +END_NAMESPACE_STIR + diff --git a/src/modelling_utilities/CMakeLists.txt b/src/modelling_utilities/CMakeLists.txt new file mode 100644 index 0000000000..9ae0130520 --- /dev/null +++ b/src/modelling_utilities/CMakeLists.txt @@ -0,0 +1,33 @@ +# +# +# Copyright 2011-07-01 - 2011 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake helper file for building STIR. + +set(dir modelling_utilities) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + apply_patlak_to_images + get_dynamic_images_from_parametric_images + mult_model_with_dyn_images + write_patlak_matrix + mult_image_parameters +) + +include(stir_exe_targets) diff --git a/src/modelling_utilities/apply_patlak_to_images.cxx b/src/modelling_utilities/apply_patlak_to_images.cxx new file mode 100644 index 0000000000..073c788e08 --- /dev/null +++ b/src/modelling_utilities/apply_patlak_to_images.cxx @@ -0,0 +1,112 @@ +// +// +/* + Copyright (C) 2005- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \brief Apply the Patlak linear fit using Dynamic Images + \author Charalampos Tsoumpas + \author Nicolas A Karakatsanis + + + \par Usage: + \code + apply_patlak_to_images output_parametric_image input_dynamic_image [par_file] + \endcode + + \par + - The dynamic images will be calibrated only if the calibration factor is given. + - The \a if_total_cnt is set to true the Dynamic Image will have the total number of + counts while if set to false it will have the \a total_number_of_counts/get_duration(frame_num). + - The dynamic images will always be in decaying counts. + - The plasma data is assumed to be in decaying counts. + + \sa PatlakPlot.h for the \a par_file + + \note This implementation does not use wighted least squares because for Patlak Plot only the last frames are used, which they usually have the same duration and similar number of counts. + + \todo Reimplement the method for image-based input function. + + \todo Add to the Doxygen documentation a reference to their paper and how exactly this utility works. +*/ + +#include "stir/CPUTimer.h" +#include "stir/modelling/PlasmaData.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/PatlakPlot.h" +#include "stir/shared_ptr.h" +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ +USING_NAMESPACE_STIR + warning("About to begin Patlak application"); + PatlakPlot indirect_patlak; + + if (argc==4) + { + if (indirect_patlak.parse(argv[3]) == false) + return EXIT_FAILURE; + } + + if (argc!=3 && argc!=4) + { + std::cerr << "Usage:" << argv[0] << " output_parametric_image input_dynamic_image [par_file] \n"; + return EXIT_FAILURE; + } + if (argc==3) + indirect_patlak.ask_parameters(); + CPUTimer timer; + timer.start(); + if (indirect_patlak.set_up()==Succeeded::no) + return EXIT_FAILURE ; + else + { + shared_ptr + dyn_image_sptr(read_from_file(argv[2])); + const DynamicDiscretisedDensity & dyn_image= *dyn_image_sptr; +#if 1 + shared_ptr + par_image_sptr(ParametricVoxelsOnCartesianGrid::read_from_file(argv[1])); + ParametricVoxelsOnCartesianGrid par_image = *par_image_sptr; +#else + ParametricVoxelsOnCartesianGrid par_image(dyn_image[1]); +#endif + //ToDo: Assertion for the dyn-par images, sizes I have to create from one to the other image, so then it should be OK... + assert(indirect_patlak.get_time_frame_definitions().get_num_frames()==dyn_image.get_time_frame_definitions().get_num_frames()); + indirect_patlak.apply_linear_regression(par_image,dyn_image); + + // Writing image + std::cerr << "Writing parametric-image in '"<< argv[1] << "'\n"; + const Succeeded writing_succeeded=OutputFileFormat::default_sptr()-> + write_to_file(argv[1], par_image); + std::cerr << "Total time for Image-Based Patlak in sec: " << timer.value() <<"\n"; + timer.stop(); + + if(writing_succeeded==Succeeded::yes) + return EXIT_SUCCESS ; + else + return EXIT_FAILURE ; + } +} + diff --git a/src/modelling_utilities/exe.mk b/src/modelling_utilities/exe.mk new file mode 100644 index 0000000000..717b6248ca --- /dev/null +++ b/src/modelling_utilities/exe.mk @@ -0,0 +1,16 @@ +# +# + +dir:=modelling_utilities + +$(dir)_SOURCES = \ + apply_patlak_to_images.cxx \ + get_dynamic_images_from_parametric_images.cxx \ + mult_model_with_dyn_images.cxx \ + write_patlak_matrix.cxx \ + mult_image_parameters.cxx +#read_input_function.cxx + + + +include $(WORKSPACE)/exe.mk diff --git a/src/modelling_utilities/get_dynamic_images_from_parametric_images.cxx b/src/modelling_utilities/get_dynamic_images_from_parametric_images.cxx new file mode 100644 index 0000000000..144b7c1f91 --- /dev/null +++ b/src/modelling_utilities/get_dynamic_images_from_parametric_images.cxx @@ -0,0 +1,109 @@ +// +// +/* + Copyright (C) 2005- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + \brief Multiplies Parametric Images with the Model Matrix creating Dynamic Images + \author Charalampos Tsoumpas + + \par Usage: + \code + get_dynamic_images_from_parametric_images output_parametric_image input_dynamic_image [par_file] + \endcode + + \par + - The dynamic images will be calibrated only if the calibration factor is given. + - The dynamic images will be in decaying counts if the plasma data are in decaying counts. + + \sa PatlakPlot.h for the \a par_file + + \todo Add to the Doxygen documentation how exactly this utility works. + +*/ + +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/PatlakPlot.h" +#include "stir/shared_ptr.h" +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + USING_NAMESPACE_STIR + +// Impelemented only for the linear Patlak Plot so far. +// In the future I should implement the KineticModels with the "linear" specification +// for patlak, logan etc... PatlakPlot patlak_plot; + PatlakPlot patlak_plot; + + if (argc==4) + { + if (patlak_plot.parse(argv[3]) == false) + return EXIT_FAILURE; + } + if (argc!=3 && argc!=4) + { + std::cerr << "Usage:" << argv[0] << " output_dynamic_image input_parametric_image [par_file] \n"; + return EXIT_FAILURE; + } + if (argc==3) + patlak_plot.ask_parameters(); + if (patlak_plot.set_up()==Succeeded::no) + return EXIT_FAILURE ; + else + { + shared_ptr + par_image_sptr(ParametricVoxelsOnCartesianGrid::read_from_file(argv[2])); + const ParametricVoxelsOnCartesianGrid & par_image = *par_image_sptr; +#if 1 + shared_ptr + dyn_image_sptr(read_from_file(argv[1])); + DynamicDiscretisedDensity & dyn_image= *dyn_image_sptr; +#else + // At the moment it is impossible to have the scanner information without extra prior information. + const shared_ptr > density_template_sptr((par_image_sptr->construct_single_density(1)).clone()); + DynamicDiscretisedDensity dyn_image=DynamicDiscretisedDensity(patlak_plot.get_time_frame_definitions(), scanner_sptr, density_template_sptr); +#endif + //ToDo: Assertion for the dyn-par images, sizes I have to create from one to the other image, so then it should be OK... + assert(patlak_plot.get_time_frame_definitions().get_num_frames()==dyn_image.get_time_frame_definitions().get_num_frames()); +#ifndef NDEBUG + const DiscretisedDensityOnCartesianGrid <3,float>* cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>*> (&dyn_image[1]); + assert(par_image.get_voxel_size()==cartesian_ptr->get_grid_spacing()); +#endif + patlak_plot.get_dynamic_image_from_parametric_image(dyn_image,par_image); + + // Writing image + std::cerr << "Writing dynamic-image in '"<< argv[1] << "'\n"; + Succeeded writing_succeeded=dyn_image.write_to_ecat7(argv[1]); + + if(writing_succeeded==Succeeded::yes) + return EXIT_SUCCESS ; + else + return EXIT_FAILURE ; + } +} + + diff --git a/src/modelling_utilities/mult_image_parameters.cxx b/src/modelling_utilities/mult_image_parameters.cxx new file mode 100644 index 0000000000..5465690693 --- /dev/null +++ b/src/modelling_utilities/mult_image_parameters.cxx @@ -0,0 +1,116 @@ +// +// +/* + Copyright (C) 2006- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \brief It multiplies the two parametric images and produces one-parameter image. + \author Charalampos Tsoumpas + \author Kris Thielemans + + \par Usage: + \code + mult_image_parameters -o output_filename -i input_filename + \endcode + + \attention Assumes that only two parameters exist. + \todo Make a generic utility which will multiply all the parameters together and store them in a multiple image file. + \todo It might be possible to integrate it into the stir_math.cxx, in the future. + + \note It is useful to estimate the covariance between the two parameters of the parametric images. + +*/ +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/DiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/getopt.h" +#include + +int main(int argc, char * argv[]) +{ + + USING_NAMESPACE_STIR; + const char * output_filename = 0; + const char * input_filename = 0; + + const char * const usage = "mult_image_parameters -o output_filename -i input_filename\n"; + opterr = 0; + { + char c; + + while ((c = getopt (argc, argv, "i:o:p")) != -1) + switch (c) + { + case 'i': + input_filename = optarg; + break; + case 'o': + output_filename = optarg; + break; + case '?': + std::cerr << usage; + return EXIT_FAILURE; + default: + if (isprint (optopt)) + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf (stderr, + "Unknown option character `\\x%x'.\n", + optopt); + std::cerr << usage; + return EXIT_FAILURE; + } + } + + if (output_filename==0 || input_filename==0) + { + std::cerr << usage; + return EXIT_FAILURE; + } + + const shared_ptr + input_image_sptr(ParametricVoxelsOnCartesianGrid::read_from_file(input_filename)); + const ParametricVoxelsOnCartesianGrid & input_image = *input_image_sptr; + + shared_ptr > + output_image_sptr((input_image_sptr->construct_single_density(1)).clone()); + DiscretisedDensity<3,float>& output_image = *output_image_sptr; + + const int min_k_index = output_image.get_min_index(); + const int max_k_index = output_image.get_max_index(); + for ( int k = min_k_index; k<= max_k_index; ++k) + { + const int min_j_index = output_image[k].get_min_index(); + const int max_j_index = output_image[k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index; ++j) + { + const int min_i_index = output_image[k][j].get_min_index(); + const int max_i_index = output_image[k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index; ++i) + output_image[k][j][i]=input_image[k][j][i][1]*input_image[k][j][i][2]; + } + } + Succeeded success = + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, *output_image_sptr); + + return success==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} + diff --git a/src/modelling_utilities/mult_model_with_dyn_images.cxx b/src/modelling_utilities/mult_model_with_dyn_images.cxx new file mode 100644 index 0000000000..36b77f7642 --- /dev/null +++ b/src/modelling_utilities/mult_model_with_dyn_images.cxx @@ -0,0 +1,99 @@ +// +// +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + \brief Multiplies Dynamic Images with the Model Matrix creating image in the Parametric Space + \author Charalampos Tsoumpas + + \par Usage: + \code + mult_model_with_dyn_images output_parametric_image input_dynamic_image [par_file] + \endcode + + \par + - The dynamic images will be calibrated only if the calibration factor is given. + - The dynamic images and the plasma data must be both either in decaying counts or in decay-corrected counts. + + \sa PatlakPlot.h for the \a par_file + + \todo Add to the Doxygen documentation how exactly this utility works. + +*/ + +#include "stir/modelling/PlasmaData.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/PatlakPlot.h" +#include "stir/shared_ptr.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + USING_NAMESPACE_STIR + +// Impelemented only for the linear Patlak Plot so far. +// In the future I should implement the KineticModels with the "linear" specification +// for patlak, logan etc... + PatlakPlot patlak_plot; + + if (argc==4) + { + if (patlak_plot.parse(argv[3]) == false) + { + std::cerr << "Usage:" << argv[0] << " output_parametric_image input_dynamic_image [par_file] \n"; + return EXIT_FAILURE; + } + } + if (argc!=3 && argc!=4) + return EXIT_FAILURE; + if (argc==3) + patlak_plot.ask_parameters(); + if (patlak_plot.set_up()==Succeeded::no) + return EXIT_FAILURE ; + else + { + shared_ptr + par_image_sptr(ParametricVoxelsOnCartesianGrid::read_from_file(argv[1])); + ParametricVoxelsOnCartesianGrid par_image = *par_image_sptr; + + shared_ptr + dyn_image_sptr(read_from_file(argv[2])); + const DynamicDiscretisedDensity & dyn_image= *dyn_image_sptr; + + //NotToDo: Assertion for the dyn-par images, sizes should not be ncessary ONLY WHEN I will create from dyn_image the par_image... + assert(patlak_plot.get_time_frame_definitions().get_num_frames()==dyn_image.get_time_frame_definitions().get_num_frames()); + patlak_plot.multiply_dynamic_image_with_model_gradient(par_image,dyn_image); + + // Writing image + std::cerr << "Writing parametric-image in '"<< argv[1] << "'\n"; + const Succeeded writing_succeeded=OutputFileFormat::default_sptr()-> + write_to_file(argv[1], par_image); + + if(writing_succeeded==Succeeded::yes) + return EXIT_SUCCESS ; + else + return EXIT_FAILURE ; + } +} + diff --git a/src/modelling_utilities/write_patlak_matrix.cxx b/src/modelling_utilities/write_patlak_matrix.cxx new file mode 100644 index 0000000000..1c1db8729a --- /dev/null +++ b/src/modelling_utilities/write_patlak_matrix.cxx @@ -0,0 +1,80 @@ +// +// +/* + Copyright (C) 2006- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + \brief Multiplies Dynamic Images with the Model Matrix creating image in the Parametric Space + \author Charalampos Tsoumpas + + + \par Usage: + \code + write_patlak_matrix [par_file] + \endcode + \note It writes it always to the text file: "model_matrix.out" of the working directory + + \sa PatlakPlot.h for the \a par_file + + +*/ + +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/PatlakPlot.h" +#include "stir/shared_ptr.h" +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include +#include +#include + +int main(int argc, char *argv[]) +{ + USING_NAMESPACE_STIR + +// Impelemented only for the linear Patlak Plot so far. +// In the future I should implement the KineticModels with the "linear" specification +// for patlak, logan etc... + PatlakPlot patlak_plot; + + if (argc==2) + { + if (patlak_plot.parse(argv[1]) == false) + return EXIT_FAILURE; + } + else + patlak_plot.ask_parameters(); + if (patlak_plot.set_up()==Succeeded::no) + { + std::cerr << "Usage:" << argv[0] << " [par_file] \n"; + return EXIT_FAILURE ; + } + else + { + // Writing model matrix + std::cerr << "Writing Patlak Model Matrix in file 'model_matrix.out'" << "\n"; + Succeeded writing_succeeded=(patlak_plot.get_model_matrix().write_to_file("model_matrix.out")); + + if(writing_succeeded==Succeeded::yes) + return EXIT_SUCCESS ; + else + return EXIT_FAILURE ; + } +} + diff --git a/src/numerics_buildblock/CMakeLists.txt b/src/numerics_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..b8b4693e04 --- /dev/null +++ b/src/numerics_buildblock/CMakeLists.txt @@ -0,0 +1,16 @@ +# +# +set(dir numerics_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + fourier + determinant +) + +#$(dir)_REGISTRY_SOURCES:= $(dir)_registries.cxx + +include(stir_lib_target) + +target_link_libraries(${dir} buildblock) diff --git a/src/numerics_buildblock/determinant.cxx b/src/numerics_buildblock/determinant.cxx new file mode 100644 index 0000000000..7f3212754d --- /dev/null +++ b/src/numerics_buildblock/determinant.cxx @@ -0,0 +1,99 @@ +// +// +/* + Copyright (C) 2004- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics + + \brief Implementation of stir::determinant() function for matrices + + \author Kris Thielemans + +*/ +#include "stir/Array.h" +#include "stir/numerics/determinant.h" +#include +#include "stir/Array_complex_numbers.h" + +START_NAMESPACE_STIR + +namespace detail +{ + + template + static elemT + determinant_size3(const Array<2,elemT>& m) + { + const int i0 = m.get_min_index(); + const int j0 = m[i0].get_min_index(); + return + m[i0+0][j0+0]*m[i0+1][j0+1]*m[i0+2][j0+2] + + m[i0+0][j0+1]*m[i0+1][j0+2]*m[i0+2][j0+0] + + m[i0+0][j0+2]*m[i0+1][j0+0]*m[i0+2][j0+1] - + m[i0+0][j0+2]*m[i0+1][j0+1]*m[i0+2][j0+0] - + m[i0+0][j0+1]*m[i0+1][j0+0]*m[i0+2][j0+2] - + m[i0+0][j0+0]*m[i0+1][j0+2]*m[i0+2][j0+1]; + } + + template + static elemT + determinant_size2(const Array<2,elemT>& m) + { + const int i0 = m.get_min_index(); + const int j0 = m[i0].get_min_index(); + return + m[i0+0][j0+0]*m[i0+1][j0+1] - + m[i0+0][j0+2]*m[i0+1][j0+1]; + } + + template + static elemT + determinant_size1(const Array<2,elemT>& m) + { + const int i0 = m.get_min_index(); + const int j0 = m[i0].get_min_index(); + return + m[i0][j0]; + } +} + +template +elemT +determinant(const Array<2,elemT>& m) +{ + assert(m.is_regular()); + if (m.size() == 1) + return detail::determinant_size1(m); + if (m.size() == 2) + return detail::determinant_size2(m); + if (m.size() == 3) + return detail::determinant_size3(m); + error("determinant called for size larger than 3. Code in file %s needs work", + __FILE__); + // return to avoid compiler warning + return 0; +} + +// +// instantiations +// +template float determinant(const Array<2,float>&); +template double determinant(const Array<2,double>&); +template std::complex determinant(const Array<2,std::complex >&); +template std::complex determinant(const Array<2,std::complex >&); +END_NAMESPACE_STIR diff --git a/src/numerics_buildblock/fourier.cxx b/src/numerics_buildblock/fourier.cxx new file mode 100644 index 0000000000..6546dddab1 --- /dev/null +++ b/src/numerics_buildblock/fourier.cxx @@ -0,0 +1,545 @@ +/*! + \file + \ingroup DFT + \brief Functions for computing discrete fourier transforms + + \author Kris Thielemans +*/ +/* + Copyright (C) 2003 - 2005-01-17, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/numerics/fourier.h" +#include "stir/round.h" +#include "stir/modulo.h" +#include "stir/array_index_functions.h" +START_NAMESPACE_STIR + + +template +static void bitreversal(VectorWithOffset& data) +{ + const int n=data.get_length(); + int j=1; + for (int i=0;i i) { + std::swap(data[j/2],data[i]); + } + int m=n; + while (m >= 2 && j > m) { + j -= m; + m >>= 1; + } + j += m; + } +} + +/* We cache factors exp(i*_PI/pow(2,k)). They will be computed during the first + call of the Fourier functions, and then stored in static arrays. +*/ +// exparray[k][i] = exp(i*_PI/pow(2,k)) +typedef VectorWithOffset > > exparray_t; +static exparray_t exparray; + +static void init_exparray(const int k, const int pow2k) +{ + if (exparray.get_max_index() >= k && exparray[k].size()>0) + return; + + if (exparray.get_max_index() (0, static_cast((i*_PI)/pow2k))); +} + +// expminarray[k][i] = exp(-i*_PI/pow(2,k)) +// obviously just the complex conjugate of exparray +static exparray_t expminarray; + +static void init_expminarray(const int k, const int pow2k) +{ + if (expminarray.get_max_index() >= k && expminarray[k].size()>0) + return; + + if (expminarray.get_max_index() (0, static_cast(-(i*_PI)/pow2k))); +} + + +/* First we define 1D fourier transforms of vectors with almost arbitrary + element types. + This is almost a straightforward 1D FFT implementation. The only tricky bit + is to make sure that all operations are written in a way that is defined + (and efficient) in the case that the element type is a vector again. +*/ + +template +void fourier_1d(T& c, const int sign) +{ + if (c.size()==0) return; + assert(c.get_min_index()==0); + assert(sign==1 || sign ==-1); + bitreversal(c); + // find 'nn' which is such that length==2^nn + const int nn=round(log(static_cast(c.size()))/log(2.)); + if (c.get_length()!= round(pow(2.,nn))) + error ("fourier_1d called with array length %d which is not 2^%d\n", c.size(), nn); + + int k=0; + int pow2k = 1; // will be updated to be round(pow(2,k)) + const int pow2nn=c.get_length(); // ==round(pow(2,nn)); + for (; k +struct fourier_auxiliary +{ + static void + do_fourier(VectorWithOffset& c, const int sign) + { + fourier_1d(c, sign); + const typename VectorWithOffset::iterator iter_end = c.end(); + for (typename VectorWithOffset::iterator iter = c.begin(); + iter != iter_end; + ++iter) + fourier(*iter, sign); + } +}; + +// specialisation for the one-dimensional case +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +template +struct fourier_auxiliary > +{ + static void + do_fourier(VectorWithOffset >& c, const int sign) + { + fourier_1d(c, sign); + } +}; + + +#else //no partial template specialisation + +// we just list float and double explicitly +struct fourier_auxiliary > +{ + static void + do_fourier(VectorWithOffset >& c, const int sign) + { + fourier_1d(c, sign); + } +}; + +struct fourier_auxiliary > +{ + static void + do_fourier(VectorWithOffset >& c, const int sign) + { + fourier_1d(c, sign); + } +}; +#endif + +} // end of namespace detail + +// now the fourier function is easy to define in terms of the class above +template +void +fourier(T& c, const int sign) +{ +#if !defined(_MSC_VER) || _MSC_VER>1200 + detail::fourier_auxiliary::do_fourier(c,sign); +#else + detail::fourier_auxiliary::do_fourier(c,sign); +#endif +} + + +/****************************************************************** + DFT of real data +*****************************************************************/ + + + +template +Array<1,std::complex > +fourier_1d_for_real_data(const Array<1,T>& v, const int sign) +//Array<1,std::complex > +//fourier_1d_for_real_data(const T& v, const int sign) +{ + //typedef std::complex complex_t; + typedef std::complex complex_t; + if (v.size()==0) return Array<1,complex_t>(); + assert(v.get_min_index()==0); + assert(sign==1 || sign ==-1); + if (v.size()%2!=0) + error("fourier_1d_of_real can only handle arrays of even length.\n"); + + Array<1,complex_t> c; + const unsigned int n = static_cast(v.size()/2); + // we reserve a range of 0,n here, such that + // resize(n) later doesn't reallocate and copy + c.reserve(n+1); + c.resize(n); + // fill in complex numbers. + // note: we need to divide by 2 in the final result. To save + // some time, we do that already here. + for (int i=0; i(sign*(i*_PI)/n-_PI/2)))* + (c[i]-std::conj(c[n-i])); + + c[i] = (t1 + t2); + c[n-i] = std::conj(t1-t2); + } + { + const complex_t c0_copy = c[0]; + c[0]=(c0_copy.real() + c0_copy.imag())*2; + c[n]=(c0_copy.real() - c0_copy.imag())*2; + } + return c; +} + + +template +Array<1,T> +inverse_fourier_1d_for_real_data_corrupting_input(Array<1,std::complex >& c, const int sign) +{ + typedef std::complex complex_t; + if (c.size()==0) return Array<1,T>(); + assert(c.get_min_index()==0); + assert(sign==1 || sign ==-1); + const int n = c.get_length()-1; + if (n%2!=0) + error("inverse_fourier_1d_of_real_data can only handle arrays of even length.\n"); + + /* Problematic asserts to check that the imaginary part of c[0] and c[n] is 0 + Trouble is that it could be only approximately 0 (e.g. when calling + inverse_fourier_real_data on multi-dimensional arrays). + The version below tries to circumvent this problem by comparing with the + norm of c. That fails however when c is zero (up to numerical precision). + We can only know this by looking at the higher dimensional array, but + we don't have that one to our disposal in this function. + So, I disabled the asserts. + */ + //assert(fabs(c[0].imag())<=.001*norm(c.begin_all(),c.end_all())/sqrt(n+1.)); // note divide by n+1 to avoid division by 0 + //assert(fabs(c[n].imag())<=.001*norm(c.begin_all(),c.end_all())/sqrt(n+1.)); + for (int i=1; i<=n/2; ++i) + { + const complex_t t1 = (c[i]+std::conj(c[n-i])); + // TODO could get exp() from static exparray + const complex_t t2 = + std::exp(complex_t(0, static_cast(-sign*(i*_PI)/n+_PI/2)))* + (c[i]-std::conj(c[n-i])); + + c[i] = (t1 + t2); + c[n-i] = std::conj(t1-t2); + } + { + c[0]=complex_t((c[0].real() + c[n].real()), + (c[0].real() - c[n].real()) + ); + } + + // now get rid of c[n] + c.resize(n); + //cout << "\nC: " << c/4; + inverse_fourier(c, sign); + // extract real numbers. + Array<1,T> v(2*n); + for (int i=0; i +Array<1,T> +inverse_fourier_1d_for_real_data(const Array<1,std::complex >& c, const int sign) +{ + Array<1,std::complex > tmp(c); + return inverse_fourier_1d_for_real_data_corrupting_input(tmp, sign); +} + + +// multi-dimensional case + +namespace detail { +/* A class that does the recursion for multi-dimensional arrays. + + This is done with a class because partial template specialisation is + more powerful than function overloading. +*/ +template +struct fourier_for_real_data_auxiliary +{ + static Array > + do_fourier_for_real_data(const Array& c, const int sign) + { + // complicated business to get index range which is as follows: + // outer_dimension = outer_dimension of c + // all other dimensions are as small as possible (to avoid reallocations) + BasicCoordinate min_index, max_index; + for (int d=2; d<=num_dimensions; ++d) + min_index[d] = max_index[d] = 0; + min_index[1] = c.get_min_index(); + max_index[1] = c.get_max_index(); + Array > array(IndexRange(min_index, max_index)); + for (int i=c.get_min_index(); i<=c.get_max_index(); ++i) + array[i] = fourier_for_real_data(c[i], sign); + fourier_1d(array, sign); + return array; + } + static Array + do_inverse_fourier_for_real_data_corrupting_input(Array >& c, const int sign) + { + inverse_fourier_1d(c, sign); + // complicated business to get index range which is as follows: + // outer_dimension = outer_dimension of c + // all other dimensions are as small as possible (to avoid reallocations) + BasicCoordinate min_index, max_index; + for (int d=2; d<=num_dimensions; ++d) + min_index[d] = max_index[d] = 0; + min_index[1] = c.get_min_index(); + max_index[1] = c.get_max_index(); + Array array(IndexRange(min_index, max_index)); + + for (int i=c.get_min_index(); i<=c.get_max_index(); ++i) + array[i] = inverse_fourier_for_real_data_corrupting_input(c[i], sign); + return array; + } +}; + +// specialisation for the one-dimensional case +#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +template +struct fourier_for_real_data_auxiliary<1,elemT> +{ + static Array<1,std::complex > + do_fourier_for_real_data(const Array<1,elemT>& c, const int sign) + { + return + fourier_1d_for_real_data(c, sign); + } + static Array<1,elemT> + do_inverse_fourier_for_real_data_corrupting_input(Array<1,std::complex >& c, const int sign) + { + return + inverse_fourier_1d_for_real_data_corrupting_input(c, sign); + } +}; + + +#else //no partial template specialisation + +// we just list float explicitly + +struct fourier_for_real_data_auxiliary<1,float> +{ + static Array<1,std::complex > + do_fourier_for_real_data(const Array<1,float>& c, const int sign) + { + return + fourier_1d_for_real_data(c, sign); + } + static Array<1,float> + do_inverse_fourier_for_real_data_corrupting_input(Array<1,std::complex >& c, const int sign) + { + return + inverse_fourier_1d_for_real_data_corrupting_input(c, sign); + } +}; + +#if 0 +/* Disabled double for now. + If you want to use double, you will probably have + to make sure that Array<1,std::complex > is instantiated. + At time of writing, you would do this at the end of Array.h + */ +struct fourier_for_real_data_auxiliary<1,double> +{ + static Array<1,std::complex > + do_fourier_for_real_data(const Array<1,double>& c, const int sign) + { + return + fourier_1d_for_real_data(c, sign); + } + static Array<1,double> + do_inverse_fourier_for_real_data_corrupting_input(Array<1,std::complex >& c, const int sign) + { + return + inverse_fourier_1d_for_real_data_corrupting_input(c, sign); + } +}; +#endif // end of double + +#endif // end of BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +} // end of namespace detail + + +// now the fourier_for_real_data function is easy to define in terms of the class above +template +Array > +fourier_for_real_data(const Array& c, const int sign) +{ + return + detail::fourier_for_real_data_auxiliary:: + do_fourier_for_real_data(c,sign); +} + + +template +Array +inverse_fourier_for_real_data_corrupting_input(Array >& c, const int sign) +{ + return + detail::fourier_for_real_data_auxiliary:: + do_inverse_fourier_for_real_data_corrupting_input(c,sign); +} + +template +Array +inverse_fourier_for_real_data(const Array >& c, const int sign) +{ + Array > tmp(c); + return inverse_fourier_for_real_data_corrupting_input(tmp, sign); +} + +template +Array > +pos_frequencies_to_all(const Array >& c) +{ + assert(c.is_regular()); + BasicCoordinate min_index, max_index; + c.get_regular_range(min_index, max_index); + // check min_indices are 0 + assert(min_index == (min_index*0)); + max_index[num_dimensions]=max_index[num_dimensions]*2-1; + Array > result(IndexRange(min_index, max_index)); + + BasicCoordinate index = min_index; + const BasicCoordinate sizes = max_index+1; + do + { + result[index] = c[index]; + if (index[num_dimensions]>0) + { + const BasicCoordinate related_index = + modulo(sizes-index, sizes); + result[related_index] = std::conj(c[index]); + } + } + while(next(index, c)); + return result; +} + + +/***************************************************************** + * INSTANTIATIONS + * add any you need + ******************************************************************/ + +// note: instantiate the highest dimension you need. That will do all lower dimensions +template +void +fourier<>(Array<3,std::complex >& c, const int sign); + +template +void +fourier<>(VectorWithOffset >& c, const int sign); + +#define INSTANTIATE(d,type) \ + template \ + Array > \ + fourier_for_real_data<>(const Array& v, const int sign); \ + template \ + Array \ + inverse_fourier_for_real_data_corrupting_input<>(Array >& c, const int sign); \ + template \ + Array \ + inverse_fourier_for_real_data<>(const Array >& c, const int sign); \ + template \ + Array > \ + pos_frequencies_to_all<>(const Array >& c); + +INSTANTIATE(1,float); +INSTANTIATE(2,float); +INSTANTIATE(3,float); +#undef INSTANTIATE + +END_NAMESPACE_STIR diff --git a/src/numerics_buildblock/lib.mk b/src/numerics_buildblock/lib.mk new file mode 100644 index 0000000000..108c409552 --- /dev/null +++ b/src/numerics_buildblock/lib.mk @@ -0,0 +1,13 @@ +# +# +dir:=numerics_buildblock + +$(dir)_LIB_SOURCES := \ + fourier.cxx \ + determinant.cxx + +#$(dir)_REGISTRY_SOURCES:= $(dir)_registries.cxx + +include $(WORKSPACE)/lib.mk + + diff --git a/src/recon_buildblock/AnalyticReconstruction.cxx b/src/recon_buildblock/AnalyticReconstruction.cxx new file mode 100644 index 0000000000..5b5cd6613b --- /dev/null +++ b/src/recon_buildblock/AnalyticReconstruction.cxx @@ -0,0 +1,236 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2006, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup recon_buildblock + + \brief implementation of the stir::AnalyticReconstruction class + + \author Matthew Jacobson + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project + +*/ + +#include "stir/recon_buildblock/AnalyticReconstruction.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/Succeeded.h" +#include "stir/utilities.h" +#include "stir/is_null_ptr.h" +#include +#include "stir/IO/OutputFileFormat.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::ends; +#endif + +START_NAMESPACE_STIR + + + +// parameters + +void +AnalyticReconstruction::set_defaults() +{ + base_type::set_defaults(); + input_filename=""; + max_segment_num_to_process=-1; + proj_data_ptr.reset(); + output_image_size_xy=-1; + output_image_size_z=-1; + zoom=1.F; + Xoffset=0.F; + Yoffset=0.F; + Zoffset=0.F; +} + + +void +AnalyticReconstruction::initialise_keymap() +{ + base_type::initialise_keymap(); + parser.add_key("input file",&input_filename); + // KT 20/06/2001 disabled + //parser.add_key("mash x views", &num_views_to_add); + + parser.add_key("maximum absolute segment number to process", &max_segment_num_to_process); + + parser.add_key("zoom", &zoom); + parser.add_key("XY output image size (in pixels)",&output_image_size_xy); + parser.add_key("Z output image size (in pixels)",&output_image_size_z); + //parser.add_key("X offset (in mm)", &Xoffset); // KT 10122001 added spaces + //parser.add_key("Y offset (in mm)", &Yoffset); + + parser.add_key("Z offset (in mm)", &Zoffset); + +// parser.add_key("END", &KeyParser::stop_parsing); + +} + +#if 0 +// disable ask_parameters (just use default version) +void AnalyticReconstruction::ask_parameters() +{ + + char output_filename_prefix_char[max_filename_length]; + char input_filename_char[max_filename_length]; + ask_filename_with_extension(input_filename_char,"Enter file name of 3D sinogram data : ", ".hs"); + cerr<get_max_segment_num(), 0); +#if 0 + // The angular compression consists of an average pairs of sinograms rows + // in order to reduce the number of views by a factor of 2 + // and therefore reduce the amount of data in a sinogram as well + // the reconstruction time by about the half of + // the total unmashed recontruction time + // By default, no mashing + // Note: The inclusion of angular compression has been shown in literature + // to have little effect near the center of the FOV. + // However, it could cause loss of precision + num_views_to_add= ask_num("Mashing views ? (1: No mashing, 2: By 2 , 4: By 4) : ",1,4,1); +#endif + + ask_filename_with_extension(output_filename_prefix_char,"Output filename prefix", ""); + + output_filename_prefix=output_filename_prefix_char; + + zoom= ask_num("Specify a zoom factor as magnification effect ? ",0.1,10.,1.); + + + output_image_size_xy = + ask_num("Final image size (-1 for default)? ", + -1, + 4*static_cast(proj_data_ptr->get_num_tangential_poss()*zoom), + -1); + +#if 0 + // This section enables you to position a reconstructed image + // along x (horizontal), y (vertical) and/or z (transverse) axes + // The default values is in the center of the FOV, + // the positve direction is + // for x-axis, toward the patient's left side (assuming typical spinal, head first position) + // for y-axis, toward the top of the FOV + // for z-axis, toward the patient's feet (assuming typical spinal, head first position) + + cout << endl << " Enter offset Xoff, Yoff (in pixels) :"; + Xoffset = ask_num(" X offset ",-old_size/2, old_size/2, 0); + Yoffset = ask_num(" Y offset ",-old_size/2, old_size/2, 0); +#endif + +} +#endif // ask_parameters disabled + + +bool AnalyticReconstruction::post_processing() +{ + if (base_type::post_processing()) + return true; + if (input_filename.length() == 0) + { warning("You need to specify an input file\n"); return true; } + // KT 20/06/2001 disabled as not functional yet +#if 0 + if (num_views_to_add!=1 && (num_views_to_add<=0 || num_views_to_add%2 != 0)) + { warning("The 'mash x views' key has an invalid value (must be 1 or even number)\n"); return true; } +#endif + + proj_data_ptr= ProjData::read_from_file(input_filename); + + if (zoom <= 0) + { warning("zoom should be positive\n"); return true; } + + if (output_image_size_xy!=-1 && output_image_size_xy<1) // KT 10122001 appended_xy + { warning("output image size xy must be positive (or -1 as default)\n"); return true; } + if (output_image_size_z!=-1 && output_image_size_z<1) // KT 10122001 new + { warning("output image size z must be positive (or -1 as default)\n"); return true; } + + + return false; +} + + +//************* other functions ************* + +DiscretisedDensity<3,float>* +AnalyticReconstruction:: +construct_target_image_ptr() const +{ + return + new VoxelsOnCartesianGrid (*this->proj_data_ptr->get_proj_data_info_ptr(), + static_cast(this->zoom), + CartesianCoordinate3D(static_cast(this->Zoffset), + static_cast(this->Yoffset), + static_cast(this->Xoffset)), + CartesianCoordinate3D(this->output_image_size_z, + this->output_image_size_xy, + this->output_image_size_xy) + ); +} + + + +Succeeded +AnalyticReconstruction:: +reconstruct() +{ + shared_ptr > target_image_ptr(construct_target_image_ptr()); + const Succeeded success = this->reconstruct(target_image_ptr); + if (success == Succeeded::yes) + { + this->output_file_format_ptr-> + write_to_file(this->output_filename_prefix, *target_image_ptr); + } + return success; +} + + +Succeeded +AnalyticReconstruction:: +reconstruct(shared_ptr const& target_image_sptr) +{ + const Succeeded success = this->actual_reconstruct(target_image_sptr); + if (success == Succeeded::yes) + { + if(!is_null_ptr(this->post_filter_sptr)) + { + std::cerr << "\nApplying post-filter"<post_filter_sptr->apply(*target_image_sptr); + + std::cerr << " min and max after post-filtering " << target_image_sptr->find_min() + << " " << target_image_sptr->find_max() << std::endl; + } + } + return success; +} + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/BackProjectorByBin.cxx b/src/recon_buildblock/BackProjectorByBin.cxx new file mode 100644 index 0000000000..476be61df3 --- /dev/null +++ b/src/recon_buildblock/BackProjectorByBin.cxx @@ -0,0 +1,135 @@ +// +// +/*! + \file + \ingroup projection + + \brief non-inline implementations for stir::BackProjectorByBin + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ProjData.h" + +START_NAMESPACE_STIR + +BackProjectorByBin::BackProjectorByBin() +{ +} + +BackProjectorByBin::~BackProjectorByBin() +{ +} + +void +BackProjectorByBin::back_project(DiscretisedDensity<3,float>& image, + const ProjData& proj_data) +{ + + shared_ptr + symmetries_sptr(this->get_symmetries_used()->clone()); + + for (int segment_num = proj_data.get_min_segment_num(); + segment_num <= proj_data.get_max_segment_num(); + ++segment_num) + for (int view_num= proj_data.get_min_view_num(); + view_num <= proj_data.get_max_view_num(); + ++view_num) + { + ViewSegmentNumbers vs(view_num, segment_num); + if (!symmetries_sptr->is_basic(vs)) + continue; + + const RelatedViewgrams viewgrams = + proj_data.get_related_viewgrams(vs, symmetries_sptr); + back_project(image, viewgrams); + } +} + +void +BackProjectorByBin::back_project( DiscretisedDensity<3,float>& image, + const RelatedViewgrams& viewgrams) +{ + back_project(image,viewgrams, + viewgrams.get_min_axial_pos_num(), + viewgrams.get_max_axial_pos_num(), + viewgrams.get_min_tangential_pos_num(), + viewgrams.get_max_tangential_pos_num()); +} + +void BackProjectorByBin::back_project + (DiscretisedDensity<3,float>& image, + const RelatedViewgrams& viewgrams, + const int min_axial_pos_num, + const int max_axial_pos_num) +{ + back_project(image,viewgrams, + min_axial_pos_num, + max_axial_pos_num, + viewgrams.get_min_tangential_pos_num(), + viewgrams.get_max_tangential_pos_num()); +} + +void +BackProjectorByBin:: +back_project(DiscretisedDensity<3,float>& density, + const RelatedViewgrams& viewgrams, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) +{ + if (viewgrams.get_num_viewgrams()==0) + return; + + start_timers(); + + // first check symmetries + { + const ViewSegmentNumbers basic_vs = viewgrams.get_basic_view_segment_num(); + + if (get_symmetries_used()->num_related_view_segment_numbers(basic_vs) != + viewgrams.get_num_viewgrams()) + error("BackProjectorByBin::back_project called with incorrect related_viewgrams. Problem with symmetries!\n"); + + for (RelatedViewgrams::const_iterator iter = viewgrams.begin(); + iter != viewgrams.end(); + ++iter) + { + ViewSegmentNumbers vs(iter->get_view_num(), iter->get_segment_num()); + get_symmetries_used()->find_basic_view_segment_numbers(vs); + if (vs != basic_vs) + error("BackProjectorByBin::back_project called with incorrect related_viewgrams. Problem with symmetries!\n"); + } + } + + actual_back_project(density,viewgrams, + min_axial_pos_num, + max_axial_pos_num, + min_tangential_pos_num, + max_tangential_pos_num); + stop_timers(); +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/BackProjectorByBinUsingInterpolation.cxx b/src/recon_buildblock/BackProjectorByBinUsingInterpolation.cxx new file mode 100644 index 0000000000..1f14ff2e5a --- /dev/null +++ b/src/recon_buildblock/BackProjectorByBinUsingInterpolation.cxx @@ -0,0 +1,1005 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projection + + \brief non-inline implementations for BackProjectorByBinUsingInterpolation + + \author Kris Thielemans + \author Claire Labbe + \author PARAPET project + +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +#include "stir/Array.h" +#include "stir/IndexRange4D.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/round.h" +#include "stir/shared_ptr.h" +#include "stir/zoom.h" +#include +#include + +#ifndef STIR_NAMESPACES +using std::auto_ptr; +#endif + +START_NAMESPACE_STIR + +JacobianForIntBP:: +JacobianForIntBP(const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, bool exact) + + : R2(square(proj_data_info_ptr->get_ring_radius())), + dxy2(square(proj_data_info_ptr->get_tangential_sampling())), + ring_spacing2 (square(proj_data_info_ptr->get_ring_spacing())), + backprojection_normalisation + (proj_data_info_ptr->get_ring_spacing()/2/proj_data_info_ptr->get_num_views()), + use_exact_Jacobian_now(exact) + {} + +const char * const +BackProjectorByBinUsingInterpolation::registered_name = + "Interpolation"; + + +void +BackProjectorByBinUsingInterpolation:: +set_defaults() +{ + use_piecewise_linear_interpolation_now = true; + use_exact_Jacobian_now = true; + + // next can be set to false, but with some rounding error problems (e.g. at 90 degrees) + do_symmetry_90degrees_min_phi = true; + // next 2 have to be true, otherwise breaks + do_symmetry_180degrees_min_phi = true; + do_symmetry_swap_segment = true; + // next 2 can be set to false but are ignored anyway + do_symmetry_swap_s = true; + do_symmetry_shift_z = true; + +} + +void +BackProjectorByBinUsingInterpolation:: +initialise_keymap() +{ + parser.add_start_key("Back Projector Using Interpolation Parameters"); + parser.add_stop_key("End Back Projector Using Interpolation Parameters"); + parser.add_key("use_piecewise_linear_interpolation", &use_piecewise_linear_interpolation_now); + parser.add_key("use_exact_Jacobian",&use_exact_Jacobian_now); +#ifdef STIR_DEVEL + // see set_defaults() + parser.add_key("do_symmetry_90degrees_min_phi", &do_symmetry_90degrees_min_phi); + parser.add_key("do_symmetry_180degrees_min_phi", &do_symmetry_180degrees_min_phi); + parser.add_key("do_symmetry_swap_segment", &do_symmetry_swap_segment); + parser.add_key("do_symmetry_swap_s", &do_symmetry_swap_s); + parser.add_key("do_symmetry_shift_z", &do_symmetry_shift_z); +#endif +} + +const DataSymmetriesForViewSegmentNumbers * + BackProjectorByBinUsingInterpolation::get_symmetries_used() const +{ return symmetries_ptr.get(); } + +BackProjectorByBinUsingInterpolation:: +BackProjectorByBinUsingInterpolation(const bool use_piecewise_linear_interpolation, + const bool use_exact_Jacobian) +{ + set_defaults(); + use_piecewise_linear_interpolation_now = use_piecewise_linear_interpolation; + use_exact_Jacobian_now = use_exact_Jacobian; +} + +BackProjectorByBinUsingInterpolation:: +BackProjectorByBinUsingInterpolation(shared_ptr const& proj_data_info_ptr, + shared_ptr > const& image_info_ptr, + const bool use_piecewise_linear_interpolation, + const bool use_exact_Jacobian) +{ + set_defaults(); + use_piecewise_linear_interpolation_now = use_piecewise_linear_interpolation; + use_exact_Jacobian_now = use_exact_Jacobian; + set_up(proj_data_info_ptr, image_info_ptr); +} + +void +BackProjectorByBinUsingInterpolation::set_up(shared_ptr const& proj_data_info_ptr, + shared_ptr > const& image_info_ptr) +{ + this->symmetries_ptr. + reset(new DataSymmetriesForBins_PET_CartesianGrid(proj_data_info_ptr, image_info_ptr, + do_symmetry_90degrees_min_phi, + do_symmetry_180degrees_min_phi, + do_symmetry_swap_segment, + do_symmetry_swap_s, + do_symmetry_shift_z)); + + // check if data are according to what we can handle + + const VoxelsOnCartesianGrid * vox_image_info_ptr = + dynamic_cast*> (image_info_ptr.get()); + + if (vox_image_info_ptr == NULL) + error("BackProjectorByBinUsingInterpolation initialised with a wrong type of DiscretisedDensity\n"); + + const CartesianCoordinate3D voxel_size = vox_image_info_ptr->get_voxel_size(); + + // z_origin_in_planes should be an integer + const float z_origin_in_planes = + image_info_ptr->get_origin().z()/voxel_size.z(); + if (fabs(round(z_origin_in_planes) - z_origin_in_planes) > 1.E-4) + error("BackProjectorByBinUsingInterpolation: the shift in the " + "z-direction of the origin (which is %g) should be a multiple of the plane " + "separation (%g)\n", + image_info_ptr->get_origin().z(), voxel_size.z()); + + // num_planes_per_axial_pos should currently be an integer + for (int segment_num = proj_data_info_ptr->get_min_segment_num(); + segment_num <= proj_data_info_ptr->get_max_segment_num(); + ++segment_num) + { + const float num_planes_per_axial_pos = + symmetries_ptr->get_num_planes_per_axial_pos(segment_num); + if (fabs(round(num_planes_per_axial_pos) - num_planes_per_axial_pos) > 1.E-4) + error("BackProjectorByBinUsingInterpolation: the number of image planes " + "per axial_pos (which is %g for segment %d) should be an integer\n", + num_planes_per_axial_pos, segment_num); + } + + +} + +void +BackProjectorByBinUsingInterpolation:: +use_exact_Jacobian(const bool use_exact_Jacobian) +{ + use_exact_Jacobian_now = use_exact_Jacobian; +} + + +void +BackProjectorByBinUsingInterpolation:: +use_piecewise_linear_interpolation(const bool use_piecewise_linear_interpolation) +{ + use_piecewise_linear_interpolation_now = use_piecewise_linear_interpolation; +} + +void BackProjectorByBinUsingInterpolation:: +actual_back_project(DiscretisedDensity<3,float>& density, + const RelatedViewgrams& viewgrams, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) + +{ + const ProjDataInfoCylindricalArcCorr* proj_data_info_cyl_ptr = + dynamic_cast (viewgrams.get_proj_data_info_ptr()); + + + if ( proj_data_info_cyl_ptr==NULL) + { + error("\nBackProjectorByBinUsingInterpolation:\n" + "can only handle arc-corrected data (cast to ProjDataInfoCylindricalArcCorr)!\n"); + } + // this will throw an exception when the cast does not work + VoxelsOnCartesianGrid& image = + dynamic_cast&>(density); + // TODO somehow check symmetry object in RelatedViewgrams + + const float zoom = + proj_data_info_cyl_ptr->get_tangential_sampling()/ + image.get_voxel_size().x(); + + // zoom the viewgrams if necessary + // if zoom==1 there's no need for allocation of a new + // RelatedViewgrams object, so we do some trickery with a pointer + const RelatedViewgrams* zoomed_viewgrams_ptr = 0; + // to make it exception-proof we need to use an auto_ptr or shared_ptr + shared_ptr > zoomed_viewgrams_sptr; + int zoomed_min_tangential_pos_num; + int zoomed_max_tangential_pos_num; + + // warning: this criterion has to be the same as the error-check in x,y voxel size + // (see lines around warning message 'must be equal to'... which occurs more than once) + if (fabs(zoom-1) > 1E-4) + { + zoomed_min_tangential_pos_num = + static_cast(ceil(min_tangential_pos_num*zoom)); + zoomed_max_tangential_pos_num = + static_cast(ceil(max_tangential_pos_num*zoom)); + // store it in a shared_ptr, such that it gets cleaned up correctly + zoomed_viewgrams_sptr.reset(new RelatedViewgrams(viewgrams)); + zoomed_viewgrams_ptr = zoomed_viewgrams_sptr.get(); + + zoom_viewgrams(*zoomed_viewgrams_sptr, zoom, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + else + { + zoomed_min_tangential_pos_num = + min_tangential_pos_num; + zoomed_max_tangential_pos_num = + max_tangential_pos_num; + // we cannot use the auto_ptr here, as that would try to free the + // viewgrams object + zoomed_viewgrams_ptr = &viewgrams; + } + + const int num_views = viewgrams.get_proj_data_info_ptr()->get_num_views(); + RelatedViewgrams::const_iterator r_viewgrams_iter = zoomed_viewgrams_ptr->begin(); + if (zoomed_viewgrams_ptr->get_basic_segment_num() == 0) + { + // no segment symmetry + const Viewgram & pos_view =*r_viewgrams_iter; + const Viewgram neg_view = pos_view.get_empty_copy(); + + if (zoomed_viewgrams_ptr->get_num_viewgrams() == 1) + { + const Viewgram pos_plus90 = pos_view.get_empty_copy(); + const Viewgram& neg_plus90 = pos_plus90; + back_project_view_plus_90_and_delta( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + else + { + r_viewgrams_iter++; + if (zoomed_viewgrams_ptr->get_num_viewgrams() == 2) + { + if (r_viewgrams_iter->get_view_num() == pos_view.get_view_num() + num_views/2) + { + const Viewgram & pos_plus90 =*r_viewgrams_iter; + const Viewgram neg_plus90 = pos_plus90.get_empty_copy(); + assert(pos_plus90.get_view_num() == num_views / 2 + pos_view.get_view_num()); + back_project_view_plus_90_and_delta( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + else if (r_viewgrams_iter->get_view_num() == num_views-pos_view.get_view_num()) + { + assert(zoomed_viewgrams_ptr->get_basic_view_num() != 0); + const Viewgram & pos_min180 =*r_viewgrams_iter; + const Viewgram neg_min180 = pos_min180.get_empty_copy(); + const Viewgram& pos_plus90 =neg_min180;// anything 0 really + const Viewgram& neg_plus90 = pos_plus90; + const Viewgram& pos_min90 =neg_min180;// anything 0 really + const Viewgram& neg_min90 = pos_min90; + + assert(pos_min180.get_view_num() == num_views - pos_view.get_view_num()); + + back_project_all_symmetries( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + pos_min180, neg_min180, pos_min90, neg_min90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + else + { + error("BackProjectorByBinUsingInterpolation: back_project called with RelatedViewgrams with inconsistent views"); + } + } + else + { + assert(zoomed_viewgrams_ptr->get_basic_view_num() != 0); + assert(zoomed_viewgrams_ptr->get_basic_view_num() != num_views/4); + const Viewgram & pos_plus90 =*r_viewgrams_iter; + const Viewgram neg_plus90 = pos_plus90.get_empty_copy(); + r_viewgrams_iter++;//2 + const Viewgram & pos_min180 =*r_viewgrams_iter; + r_viewgrams_iter++;//3 + const Viewgram & pos_min90 =*r_viewgrams_iter; + const Viewgram& neg_min180 = neg_plus90;//pos_min180.get_empty_copy(); + const Viewgram& neg_min90 = neg_plus90;//pos_min90.get_empty_copy(); + + assert(pos_plus90.get_view_num() == num_views / 2 + pos_view.get_view_num()); + assert(pos_min90.get_view_num() == num_views / 2 - pos_view.get_view_num()); + assert(pos_min180.get_view_num() == num_views - pos_view.get_view_num()); + + back_project_all_symmetries( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + pos_min180, neg_min180, pos_min90, neg_min90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + } + } + else + { + // segment symmetry + + if (zoomed_viewgrams_ptr->get_num_viewgrams() == 1) + error("BackProjectorByBinUsingInterpolation: back_project called with RelatedViewgrams with unexpect number of related viewgrams"); + + const Viewgram & pos_view = *r_viewgrams_iter;//0 + r_viewgrams_iter++; + const Viewgram & neg_view = *r_viewgrams_iter;//1 + assert(neg_view.get_view_num() == pos_view.get_view_num()); + + if (zoomed_viewgrams_ptr->get_num_viewgrams() == 2) + { + const Viewgram pos_plus90 = pos_view.get_empty_copy(); + const Viewgram& neg_plus90 = pos_plus90; + back_project_view_plus_90_and_delta( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + else if (zoomed_viewgrams_ptr->get_num_viewgrams() == 4) + { + r_viewgrams_iter++; + + if (r_viewgrams_iter->get_view_num() == pos_view.get_view_num() + num_views/2) + { + const Viewgram & pos_plus90 =*r_viewgrams_iter;//2 + r_viewgrams_iter++; + const Viewgram & neg_plus90 =*r_viewgrams_iter;//3 + + assert(pos_plus90.get_view_num() == num_views / 2 + pos_view.get_view_num()); + assert(neg_plus90.get_view_num() == num_views / 2 + pos_view.get_view_num()); + back_project_view_plus_90_and_delta( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + else if (r_viewgrams_iter->get_view_num() == num_views-pos_view.get_view_num()) + { + assert(zoomed_viewgrams_ptr->get_basic_view_num() != 0); + const Viewgram & pos_min180 =*r_viewgrams_iter; //2 + r_viewgrams_iter++; + const Viewgram & neg_min180 =*r_viewgrams_iter;//3 + const Viewgram& pos_plus90 =pos_view.get_empty_copy();// anything 0 really + const Viewgram& neg_plus90 = pos_plus90; + const Viewgram& pos_min90 = pos_plus90; + const Viewgram& neg_min90 = pos_plus90; + + assert(pos_min180.get_view_num() == num_views - pos_view.get_view_num()); + assert(neg_min180.get_view_num() == num_views - pos_view.get_view_num()); + + back_project_all_symmetries( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + pos_min180, neg_min180, pos_min90, neg_min90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + } + else + { + error("BackProjectorByBinUsingInterpolation: back_project called with RelatedViewgrams with inconsistent views"); + } + + } + else if (zoomed_viewgrams_ptr->get_num_viewgrams() == 8) + { + assert(zoomed_viewgrams_ptr->get_basic_view_num() != 0); + assert(zoomed_viewgrams_ptr->get_basic_view_num() != num_views/4); + r_viewgrams_iter++; + const Viewgram & pos_plus90 =*r_viewgrams_iter;//2 + r_viewgrams_iter++; + const Viewgram & neg_plus90 =*r_viewgrams_iter;//3 + r_viewgrams_iter++;//4 + const Viewgram & pos_min180 =*r_viewgrams_iter; + r_viewgrams_iter++;//5 + const Viewgram & neg_min180 =*r_viewgrams_iter; + r_viewgrams_iter++;//6 + const Viewgram & pos_min90 =*r_viewgrams_iter; + r_viewgrams_iter++;//7 + const Viewgram & neg_min90 =*r_viewgrams_iter; + + assert(pos_plus90.get_view_num() == num_views / 2 + pos_view.get_view_num()); + assert(pos_min90.get_view_num() == num_views / 2 - pos_view.get_view_num()); + assert(pos_min180.get_view_num() == num_views - pos_view.get_view_num()); + assert(neg_view.get_view_num() == pos_view.get_view_num()); + assert(neg_plus90.get_view_num() == pos_plus90.get_view_num()); + assert(neg_min90.get_view_num() == pos_min90.get_view_num()); + assert(neg_min180.get_view_num() == pos_min180.get_view_num()); + + back_project_all_symmetries( + image, + pos_view, neg_view, pos_plus90, neg_plus90, + pos_min180, neg_min180, pos_min90, neg_min90, + min_axial_pos_num, max_axial_pos_num, + zoomed_min_tangential_pos_num, zoomed_max_tangential_pos_num); + + } + } + +} + + + + + +#if 0 +/****************************************************************************** + 2D + ******************************************************************************/ + +// TODO rounding errors... + +void +BackProjectorByBinUsingInterpolation:: + back_project_2D_all_symmetries(const Sinogram &sino, PETPlane &image, int view, + const int min_tang_pos, const int max_tang_pos) +{ + start_timers(); + + assert(sino.get_min_bin() == - sino.get_max_bin()); + assert(min_tang_pos == -max_tang_pos); + assert(image.get_min_x() == - image.get_max_x()); + assert(image.get_min_y() == - image.get_max_y()); + assert(view < sino.get_num_views() / 4); + + assert(view != 0); + + const int nviews = sino.get_num_views(); + const int view90=(int)(nviews/2); + const JacobianForIntBP jacobian(sino.scan_info, use_exact_Jacobian_now); + + + const int min90 = view90 - view; + const int plus90 = view90 + view; + const int min180 = nviews - view; + + const double phi = _PI * view / nviews; + // sadly has to be float, otherwise rounding errors... + const float cphi = cos(phi); + const float sphi = sin(phi); + + + ProjDataForIntBP projs; + //TODO loop is wrong + for (int s = 0; s <= max_tang_pos - 2; s++) + { + const float jac = jacobian(0, s+ 0.5); + + projs.view__pos_s = sino[view][s] * jac; + projs.view__pos_sp1 =sino[view][s+1] * jac; + projs.view__neg_s = sino[view][-s] * jac; + projs.view__neg_sp1 = sino[view][-s-1] * jac; + + projs.min90__pos_s = sino[min90][s] * jac; + projs.min90__pos_sp1 =sino[min90][s+1] * jac; + projs.min90__neg_s = sino[min90][-s] * jac; + projs.min90__neg_sp1 = sino[min90][-s-1] * jac; + + projs.plus90__pos_s = sino[plus90][s] * jac; + projs.plus90__pos_sp1 =sino[plus90][s+1] * jac; + projs.plus90__neg_s = sino[plus90][-s] * jac; + projs.plus90__neg_sp1 = sino[plus90][-s-1] * jac; + + projs.min180__pos_s = sino[min180][s] * jac; + projs.min180__pos_sp1 =sino[min180][s+1] * jac; + projs.min180__neg_s = sino[min180][-s] * jac; + projs.min180__neg_sp1 = sino[min180][-s-1] * jac; + + backproj2D_Cho_view_viewplus90_180minview_90minview(image, projs, cphi, sphi, s); + } + + stop_timers(); +} + +void +BackProjectorByBinUsingInterpolation:: + back_project_2D_view_plus_90(const Sinogram &sino, PETPlane &image, int view, + const int min_tang_pos, const int max_tang_pos) +{ + start_timers(); + + assert(sino.get_min_bin() == - sino.get_max_bin()); + assert(min_tang_pos == -max_tang_pos); + assert(image.get_min_x() == - image.get_max_x()); + assert(image.get_min_y() == - image.get_max_y()); + assert(view < sino.get_num_views() / 2); + + assert(view >= 0); + assert(view < sino.get_num_views()/2); + + const int nviews = sino.get_num_views(); + const int view90 = nviews/2; + const JacobianForIntBP jacobian(sino.scan_info, use_exact_Jacobian_now); + + + const int min90 = view90 - view; + const int plus90 = view90 + view; + const int min180 = nviews - view; + + const double phi = _PI * view / nviews; + const float cphi = cos(phi); + const float sphi = sin(phi); + + + ProjDataForIntBP projs; + // TODO loop is wrong + for (int s = 0; s <= max_tang_pos - 2; s++) + { + const float jac = jacobian(0, s+ 0.5); + + projs.view__pos_s = sino[view][s] * jac; + projs.view__pos_sp1 =sino[view][s+1] * jac; + projs.view__neg_s = sino[view][-s] * jac; + projs.view__neg_sp1 = sino[view][-s-1] * jac; + + projs.plus90__pos_s = sino[plus90][s] * jac; + projs.plus90__pos_sp1 =sino[plus90][s+1] * jac; + projs.plus90__neg_s = sino[plus90][-s] * jac; + projs.plus90__neg_sp1 = sino[plus90][-s-1] * jac; + + backproj2D_Cho_view_viewplus90(image, projs, cphi, sphi, s); + } + + stop_timers(); +} + +#endif + + + +/**************************************************************************** + real work + ****************************************************************************/ + /* + The version which uses all possible symmetries. + Here 0<=view < num_views/4 (= 45 degrees) + */ + +void +BackProjectorByBinUsingInterpolation::back_project_all_symmetries( + VoxelsOnCartesianGrid& image, + const Viewgram & pos_view, + const Viewgram & neg_view, + const Viewgram & pos_plus90, + const Viewgram & neg_plus90, + const Viewgram & pos_min180, + const Viewgram & neg_min180, + const Viewgram & pos_min90, + const Viewgram & neg_min90, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) +{ + const ProjDataInfoCylindricalArcCorr* proj_data_info_cyl_ptr = + dynamic_cast (pos_view.get_proj_data_info_ptr()); + + + if ( proj_data_info_cyl_ptr==NULL) + { + error("\nBackProjectorByBinUsingInterpolation:\n\ +can only handle arc-corrected data (cast to ProjDataInfoCylindricalArcCorr)!\n"); + } + + assert(min_axial_pos_num >= pos_view. get_min_axial_pos_num()); + assert(max_axial_pos_num <= pos_view. get_max_axial_pos_num()); + assert(min_tangential_pos_num >= pos_view.get_min_tangential_pos_num()); + assert(max_tangential_pos_num <= pos_view.get_max_tangential_pos_num()); + + //KTxxx not necessary anymore + //assert(min_tangential_pos_num == - max_tangential_pos_num); + +#ifndef NDEBUG + // This variable is only used in assert() at the moment, so avoid compiler + // warning by defining it only when in debug mode + const int segment_num = pos_view.get_segment_num(); +#endif + + + assert(proj_data_info_cyl_ptr ->get_average_ring_difference(segment_num) >= 0); + assert(pos_view.get_view_num() > 0); + assert(pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()/4 || + (!symmetries_ptr->using_symmetry_90degrees_min_phi() && + pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()/2 && + pos_plus90.find_max()==0 && neg_plus90.find_max()==0 && + pos_min90.find_max()==0 && neg_min90.find_max()==0) ); + + const int nviews = pos_view.get_proj_data_info_ptr()->get_num_views(); + + // warning: error check has to be the same as what is used for the criterion to do the zooming + // (see lines concerning zoomed_viewgrams) + if(fabs(image.get_voxel_size().x()/proj_data_info_cyl_ptr->get_tangential_sampling() - 1) > 1E-4 + || fabs(image.get_voxel_size().y()/proj_data_info_cyl_ptr->get_tangential_sampling() - 1) > 1E-4) + error("BackProjectorByBinUsingInterpolation: x,y voxel size must be equal to bin size."); + + // KTxxx not necessary anymore + //assert(image.get_min_z() == 0); + + if (pos_view.get_view_num() == 0) + { + error("BackProjectorByBinUsingInterpolation: back_project_all_symmetries called with view 0 degrees.\n"); + } + if (symmetries_ptr->using_symmetry_90degrees_min_phi() && + pos_view.get_view_num() == nviews/4) + { + error("BackProjectorByBinUsingInterpolation: back_project_all_symmetries called with view 45 degrees.\n"); + } + + // KT XXX + const float fovrad_in_mm = + min((min(image.get_max_x(), -image.get_min_x()))*image.get_voxel_size().x(), + (min(image.get_max_y(), -image.get_min_y()))*image.get_voxel_size().y()); + const int fovrad = round(fovrad_in_mm/image.get_voxel_size().x()); + // TODO remove -2, it's there because otherwise find_start_values() goes crazy. + const int max_tang_pos_to_use = + min(max_tangential_pos_num, fovrad-2); + const int min_tang_pos_to_use = + max(min_tangential_pos_num, -(fovrad-2)); + + const int max_abs_tang_pos_to_use = + max(max_tang_pos_to_use, -min_tang_pos_to_use); + const int min_abs_tang_pos_to_use = + max_tang_pos_to_use<0 ? + -max_tang_pos_to_use + : (min_tang_pos_to_use>0 ? + min_tang_pos_to_use + : 0 ); + + + start_timers(); + + const JacobianForIntBP jacobian(proj_data_info_cyl_ptr, use_exact_Jacobian_now); + + Array<4, float > Proj2424(IndexRange4D(0, 1, 0, 3, 0, 1, 1, 4)); + // a variable which will be used in the loops over s to get s_in_mm + Bin bin(pos_view.get_segment_num(), pos_view.get_view_num(),min_axial_pos_num,0); + + // KT 20/06/2001 rewrite using get_phi + const float cphi = cos(proj_data_info_cyl_ptr->get_phi(bin)); + const float sphi = sin(proj_data_info_cyl_ptr->get_phi(bin)); + + + // Do a loop over all axial positions. However, because we use interpolation of + // a 'beam', each step takes elements from ax_pos and ax_pos+1. So, data in + // a ring influences beam ax_pos-1 and ax_pos. All this means that we + // have to let ax_pos run from min_axial_pos_num-1 to max_axial_pos_num. + for (int ax_pos = min_axial_pos_num-1; ax_pos <= max_axial_pos_num; ax_pos++) + { + const int ax_pos_plus = ax_pos + 1; + + // We have to fill with 0, as not all elements are set in the lines below + if (ax_pos==min_axial_pos_num-1 || ax_pos==max_axial_pos_num) + Proj2424.fill(0); + + for (int s = min_abs_tang_pos_to_use; s <= max_abs_tang_pos_to_use; s++) { + const int splus = s + 1; + const int ms = -s; + const int msplus = -splus; + + // now I have to check if ax_pos is in allowable range + if (ax_pos >= min_axial_pos_num) + { + Proj2424[0][0][0][1] = s>max_tang_pos_to_use ? 0 : pos_view[ax_pos][s]; + Proj2424[0][0][0][2] = splus>max_tang_pos_to_use ? 0 : pos_view[ax_pos][splus]; + Proj2424[0][1][0][3] = s>max_tang_pos_to_use ? 0 : pos_min90[ax_pos][s]; + Proj2424[0][1][0][4] = splus>max_tang_pos_to_use ? 0 : pos_min90[ax_pos][splus]; + Proj2424[0][2][0][1] = s>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos][s]; + Proj2424[0][2][0][2] = splus>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos][splus]; + Proj2424[0][3][0][3] = s>max_tang_pos_to_use ? 0 : pos_min180[ax_pos][s]; + Proj2424[0][3][0][4] = splus>max_tang_pos_to_use ? 0 : pos_min180[ax_pos][splus]; + Proj2424[1][0][0][3] = s>max_tang_pos_to_use ? 0 : neg_view[ax_pos][s]; + Proj2424[1][0][0][4] = splus>max_tang_pos_to_use ? 0 : neg_view[ax_pos][splus]; + Proj2424[1][1][0][1] = s>max_tang_pos_to_use ? 0 : neg_min90[ax_pos][s]; + Proj2424[1][1][0][2] = splus>max_tang_pos_to_use ? 0 : neg_min90[ax_pos][splus]; + Proj2424[1][2][0][3] = s>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos][s]; + Proj2424[1][2][0][4] = splus>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos][splus]; + Proj2424[1][3][0][1] = s>max_tang_pos_to_use ? 0 : neg_min180[ax_pos][s]; + Proj2424[1][3][0][2] = splus>max_tang_pos_to_use ? 0 : neg_min180[ax_pos][splus]; + + Proj2424[0][0][1][3] = msmax_tang_pos_to_use ? 0 : pos_view[ax_pos_plus][s]; + Proj2424[0][0][0][4] = splus>max_tang_pos_to_use ? 0 : pos_view[ax_pos_plus][splus]; + Proj2424[0][1][0][1] = s>max_tang_pos_to_use ? 0 : pos_min90[ax_pos_plus][s]; + Proj2424[0][1][0][2] = splus>max_tang_pos_to_use ? 0 : pos_min90[ax_pos_plus][splus]; + Proj2424[0][2][0][3] = s>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos_plus][s]; + Proj2424[0][2][0][4] = splus>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos_plus][splus]; + Proj2424[0][3][0][1] = s>max_tang_pos_to_use ? 0 : pos_min180[ax_pos_plus][s]; + Proj2424[0][3][0][2] = splus>max_tang_pos_to_use ? 0 : pos_min180[ax_pos_plus][splus]; + Proj2424[1][0][0][1] = s>max_tang_pos_to_use ? 0 : neg_view[ax_pos_plus][s]; + Proj2424[1][0][0][2] = splus>max_tang_pos_to_use ? 0 : neg_view[ax_pos_plus][splus]; + Proj2424[1][1][0][3] = s>max_tang_pos_to_use ? 0 : neg_min90[ax_pos_plus][s]; + Proj2424[1][1][0][4] = splus>max_tang_pos_to_use ? 0 : neg_min90[ax_pos_plus][splus]; + Proj2424[1][2][0][1] = s>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos_plus][s]; + Proj2424[1][2][0][2] = splus>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos_plus][splus]; + Proj2424[1][3][0][3] = s>max_tang_pos_to_use ? 0 : neg_min180[ax_pos_plus][s]; + Proj2424[1][3][0][4] = splus>max_tang_pos_to_use ? 0 : neg_min180[ax_pos_plus][splus]; + + Proj2424[0][0][1][1] = msget_average_ring_difference(segment_num); + + // take s+.5 as average for the beam (it's slowly varying in s anyway) + Proj2424 *= jacobian(delta, s+ 0.5F); + + // find correspondence between ax_pos coordinates and image coordinates: + // z = num_planes_per_axial_pos * ring + axial_pos_to_z_offset + // KT 20/06/2001 rewrote using symmetries_ptr + const int num_planes_per_axial_pos = + round(symmetries_ptr->get_num_planes_per_axial_pos(segment_num)); + const float axial_pos_to_z_offset = + symmetries_ptr->get_axial_pos_to_z_offset(segment_num); + + if (use_piecewise_linear_interpolation_now && num_planes_per_axial_pos>1) + piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview + (Proj2424, + image, + proj_data_info_cyl_ptr, + delta, + cphi, sphi, s, ax_pos, + num_planes_per_axial_pos, + axial_pos_to_z_offset); + else + linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview + (Proj2424, + image, + proj_data_info_cyl_ptr, + delta, + cphi, sphi, s, ax_pos, + num_planes_per_axial_pos, + axial_pos_to_z_offset); + } + } + stop_timers(); +} + +/* +This function projects 4 viewgrams related by symmetry. +It will be used for view=0 or 45 degrees +(or others if the 90degrees_min_phi symmetry is not used). + +Here 0<=view < num_views/2 (= 90 degrees) +*/ +void +BackProjectorByBinUsingInterpolation:: +back_project_view_plus_90_and_delta( + VoxelsOnCartesianGrid& image, + const Viewgram & pos_view, + const Viewgram & neg_view, + const Viewgram & pos_plus90, + const Viewgram & neg_plus90, + const int min_axial_pos_num, + const int max_axial_pos_num, + const int min_tangential_pos_num, + const int max_tangential_pos_num) +{ + const ProjDataInfoCylindricalArcCorr* proj_data_info_cyl_ptr = + dynamic_cast (pos_view.get_proj_data_info_ptr()); + + if ( proj_data_info_cyl_ptr==NULL) + { + error("\nBackProjectorByBinUsingInterpolation:,\n\ +can only handle arc-corrected data (cast to ProjDataInfoCylindricalArcCorr)!\n"); + } + + assert(min_axial_pos_num >= pos_view. get_min_axial_pos_num()); + assert(max_axial_pos_num <= pos_view. get_max_axial_pos_num()); + assert(min_tangential_pos_num >= pos_view.get_min_tangential_pos_num()); + assert(max_tangential_pos_num <= pos_view.get_max_tangential_pos_num()); + + // KTXXX not necessary anymore + //assert(min_tangential_pos_num == - max_tangential_pos_num); +#ifndef NDEBUG + // These variables are only used in assert() at the moment, so avoid compiler + // warning by defining it only when in debug mode + const int segment_num = pos_view.get_segment_num(); +#endif + + assert(proj_data_info_cyl_ptr ->get_average_ring_difference(segment_num) >= 0); + + const int num_views = pos_view.get_proj_data_info_ptr()->get_num_views(); + + assert(pos_view.get_view_num()>=0); + assert(pos_view.get_view_num() get_tangential_sampling() - 1) > 1E-4 + || fabs(image.get_voxel_size().y()/proj_data_info_cyl_ptr->get_tangential_sampling() - 1) > 1E-4) + error("BackProjectorByBinUsingInterpolation: x,y voxel size must be equal to bin size."); + + // KTXXX not necessary anymore + //assert(image.get_min_z() == 0); + + start_timers(); + + const JacobianForIntBP jacobian(proj_data_info_cyl_ptr, use_exact_Jacobian_now); + + Array<4, float > Proj2424(IndexRange4D(0, 1, 0, 3, 0, 1, 1, 4)); + + // a variable which will be used in the loops over s to get s_in_mm + Bin bin(pos_view.get_segment_num(), pos_view.get_view_num(),min_axial_pos_num,0); + + // compute cos(phi) and sin(phi) + /* KT included special cases for phi=0 and 90 degrees to try to avoid rounding problems + This is because the current low-level code has problems with e.g. cos(phi) being + a very small negative number.*/ + const float cphi = + bin.view_num()==0? 1 : + 2*bin.view_num()==num_views ? 0 : + cos(proj_data_info_cyl_ptr->get_phi(bin)); + const float sphi = + bin.view_num()==0? 0 : + 2*bin.view_num()==num_views ? 1 : + sin(proj_data_info_cyl_ptr->get_phi(bin)); + + assert(fabs(cphi-cos(proj_data_info_cyl_ptr->get_phi(bin)))<.001); + assert(fabs(sphi-sin(proj_data_info_cyl_ptr->get_phi(bin)))<.001); + // KT XXX + const float fovrad_in_mm = + min((min(image.get_max_x(), -image.get_min_x()))*image.get_voxel_size().x(), + (min(image.get_max_y(), -image.get_min_y()))*image.get_voxel_size().y()); + const int fovrad = round(fovrad_in_mm/image.get_voxel_size().x()); + // TODO remove -2, it's there because otherwise find_start_values() goes crazy. + const int max_tang_pos_to_use = + min(max_tangential_pos_num, fovrad-2); + const int min_tang_pos_to_use = + max(min_tangential_pos_num, -(fovrad-2)); + + + const int max_abs_tang_pos_to_use = + max(max_tang_pos_to_use, -min_tang_pos_to_use); + const int min_abs_tang_pos_to_use = + max_tang_pos_to_use<0 ? + -max_tang_pos_to_use + : (min_tang_pos_to_use>0 ? + min_tang_pos_to_use + : 0 ); + + // Do a loop over all axial positions. However, because we use interpolation of + // a 'beam', each step takes elements from ax_pos and ax_pos+1. So, data at + // ax_pos influences beam ax_pos-1 and ax_pos. All this means that we + // have to let ax_pos run from min_axial_pos_num-1 to max_axial_pos_num. + for (int ax_pos = min_axial_pos_num-1; ax_pos <= max_axial_pos_num; ax_pos++) + { + const int ax_pos_plus = ax_pos + 1; + + // We have to fill with 0, as not all elements are set in the lines below + if (ax_pos==min_axial_pos_num-1 || ax_pos==max_axial_pos_num) + Proj2424.fill(0); + for (int s = min_abs_tang_pos_to_use; s <= max_abs_tang_pos_to_use; s++) { + const int splus = s + 1; + const int ms = -s; + const int msplus = -splus; + + // now I have to check if ax_pos is in allowable range + if (ax_pos >= min_axial_pos_num) + { + Proj2424[0][0][0][1] = s>max_tang_pos_to_use ? 0 : pos_view[ax_pos][s]; + Proj2424[0][0][0][2] = splus>max_tang_pos_to_use ? 0 : pos_view[ax_pos][splus]; + Proj2424[0][2][0][1] = s>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos][s]; + Proj2424[0][2][0][2] = splus>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos][splus]; + Proj2424[1][0][0][3] = s>max_tang_pos_to_use ? 0 : neg_view[ax_pos][s]; + Proj2424[1][0][0][4] = splus>max_tang_pos_to_use ? 0 : neg_view[ax_pos][splus]; + Proj2424[1][2][0][3] = s>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos][s]; + Proj2424[1][2][0][4] = splus>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos][splus]; + + Proj2424[0][0][1][3] = msmax_tang_pos_to_use ? 0 : pos_view[ax_pos_plus][s]; + Proj2424[0][0][0][4] = splus>max_tang_pos_to_use ? 0 : pos_view[ax_pos_plus][splus]; + Proj2424[0][2][0][3] = s>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos_plus][s]; + Proj2424[0][2][0][4] = splus>max_tang_pos_to_use ? 0 : pos_plus90[ax_pos_plus][splus]; + Proj2424[1][0][0][1] = s>max_tang_pos_to_use ? 0 : neg_view[ax_pos_plus][s]; + Proj2424[1][0][0][2] = splus>max_tang_pos_to_use ? 0 : neg_view[ax_pos_plus][splus]; + Proj2424[1][2][0][1] = s>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos_plus][s]; + Proj2424[1][2][0][2] = splus>max_tang_pos_to_use ? 0 : neg_plus90[ax_pos_plus][splus]; + + Proj2424[0][0][1][1] = msget_average_ring_difference(segment_num); + + // take s+.5 as average for the beam (it's slowly varying in s anyway) + Proj2424 *= jacobian(delta, s+ 0.5F); + + // find correspondence between ax_pos coordinates and image coordinates: + // z = num_planes_per_axial_pos * ring + axial_pos_to_z_offset + // KT 20/06/2001 rewrote using symmetries_ptr + const int num_planes_per_axial_pos = + round(symmetries_ptr->get_num_planes_per_axial_pos(segment_num)); + const float axial_pos_to_z_offset = + symmetries_ptr->get_axial_pos_to_z_offset(segment_num); + + if (use_piecewise_linear_interpolation_now && num_planes_per_axial_pos>1) + piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90( Proj2424, image, + proj_data_info_cyl_ptr, + delta, + cphi, sphi, s, ax_pos, + num_planes_per_axial_pos, + axial_pos_to_z_offset); + else + linear_interpolation_backproj3D_Cho_view_viewplus90( Proj2424, image, + proj_data_info_cyl_ptr, + delta, + cphi, sphi, s, ax_pos, + num_planes_per_axial_pos, + axial_pos_to_z_offset); + } + } + stop_timers(); +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/BackProjectorByBinUsingInterpolation_3DCho.cxx b/src/recon_buildblock/BackProjectorByBinUsingInterpolation_3DCho.cxx new file mode 100644 index 0000000000..723accbc28 --- /dev/null +++ b/src/recon_buildblock/BackProjectorByBinUsingInterpolation_3DCho.cxx @@ -0,0 +1,2466 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projection + + \brief This file defines two private static functions from + stir::BackProjectorByBinUsingInterpolation. + + \warning This file is #included by BackProjectorByBinUsingInterpolation_linear.cxx + and BackProjectorByBinUsingInterpolation_piecewise_linear.cxx. It should NOT be added + to a Makefile (or project). + + + \author Kris Thielemans + \author Claire Labbe + \author (based on C version by Matthias Egger) + \author PARAPET project + +*/ + +// enable this variable if you need to handle very oblique LORs +#define MOREZ +//#define ALTERNATIVE +/* + + These functions use a 3D version of Cho's algorithm for backprojecting + incrementally. + See M. Egger's thesis for details. + + They use the following symmetries: + - opposite ring difference + - views : view, view+90 degrees, 180 degrees - view, 90 degrees - view + - s,-s symmetry (while being careful when s==0 to avoid self-symmetric + cases) + + For historical reasons, 'axial_pos_num' is here called 'ring'. + + Note: encoding used in Proj2424 + Proj2424[n][f][ms][b] + n : 1 : negative delta; 0 : positive delta + f : 0 : view; 1 : pi/2-view; 2 : pi/2+view; 3: pi-view + ms : 1 : negative s; 0 : positive s + b : 1 : r1,s; 2: r2,s+1; 3: r2,s 4: r1,s+1 + where r1=ring0, r2=ring0+1 when + (n==ms && f==0||2) || (n!=ms && f==1||3) + and the role of r1,r2 are reversed in the other cases + + Naming conventions for the incremental variables: + n==0 && ms==0: A'f' + n==0 && ms==1: P'f' + n==1 && ms==0: A'f'n + n==1 && ms==1: P'f'n + + Symmetries: + s-> -s changes dz->1-dz, ds->-ds + view->pi/2+view changes dz->dz, ds->ds + view->pi/2-view changes dz->1-dz, ds->ds + delta->-delta changes dz->1-dz, ds->ds + */ + + +#include "stir/ProjDataInfo.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#include "stir/round.h" +#include "stir/Succeeded.h" +#include +/* + KT 22/05/98 drastic revision + +cosmetic changes: + - removed lots of local variables which were not used (or are not used + anymore) + - moved most declarations of variables to the place where they are + initialised, and add const when possible + - added grouping {} to make variables local + - translated German and Afrikaans comments and added new comments + + - reordered the main loop to avoid repeating the 'voxel-updating' code + - moved the initialisation code (common to all symmetry cases) into the + find_start_values() function + +bugs removed: + - handle self-symmetric case at s==0 properly, this was only correct in + the 45 degrees case. This removed most of the bright spot in the + central pixel. + + - changed the condition to break out of the loop to avoid early stopping, + which gave artifacts at the border + + - attempt to take into account that calculations are done with finite precision + There used to be 'random' misplacements of data into neighboring voxels, + this happened in the central pixel and at 45 and 135 degrees. + * use double to prevent rounding errors, necessary for incremental + quantities + * change all comparisons with 0 to comparisons with a small number + 'epsilon' + +increased precision: + - use double for invariants as well + (otherwise computations of incremental constants would mean promoting + floats to doubles all the time) + +speed-up + - all these changes resulted in an (unexpected) speed-up of about a factor 2 + + KT&CL 22/12/99 +span works now by introducing offsets + + KT&SM +introduced MOREZ to handle very oblique segments. This handles the case where Z +needs to be incremented more than once to find the next voxel in the beam + + KT 25/09/2001 +make sure things are ok for any image size. The main change is +to let find_start_values return Succeeded::no if there's no voxel in +the FOV for this partiuclar tube. If so, we'll just exit. + +TODO: +solve remaining issues of rounding errors (see backproj2D) + +if we never parallelise 'beyond' viewgram level (that is, always execute +the calling back_project() and these functions at the same processor), +there is probably no point in using the Projptr parameter, and we could +use the viewgrams directly. +Indeed, each element in Projptr is accessed 2 (sometimes 3) times only. The +compiler probably optimises this to 1 (sometimes 2) accesses only. +So, it could be more expensive to construct the Projptr and fill it in from the +viewgrams, compared to use the viewgrams directly. +*/ + +START_NAMESPACE_STIR + +static const double epsilon = 1e-10; + +/* + This declares a local function that finds the first voxel in the beam, and + associated ds,dz etc. + It is implemented at the end of the file. + + image_rad: half the image size (in pixels) + d_sl : z-voxel size (in mm) + + It returns Succeeded::no when it couldn't find any voxel in the beam. + */ + +// KT 25/09/2001 changed return value +static Succeeded find_start_values(const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + const float delta, const double cphi, const double sphi, + const int s, const int ring0, + const float image_rad, + const double d_sl, + int&X1, int&Y1, int& Z1, + double& ds, double& dz, double& dzhor, double& dzvert, + const float num_planes_per_axial_pos, + const float axial_pos_to_z_offset); + + +inline void +check_values(const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + const float delta, const double cphi, const double sphi, + const int s, const int ring0, + const int X1, const int Y1, const int Z1, + const double ds, const double dz, + const float num_planes_per_axial_pos, + const float axial_pos_to_z_offset) +{ +#ifdef BPINT_CHECK + const double d_xy = proj_data_info_ptr->get_tangential_sampling(); + + const double R2 =square(proj_data_info_ptr->get_ring_radius()); + /* Radius of scanner squared in Pixel^2 */ + const double R2p = R2 / d_xy / d_xy; + // TODO remove assumption + const int num_planes_per_physical_ring = 2; + + const double t = s + 0.5; /* In a beam, not on a ray */ + //t=X1*cphi+Y1*sphi; + //ds=t-s; + + const double new_ds=X1*cphi+Y1*sphi-s;// Eq 6.13 in Egger thsis + const double root=sqrt(R2p-t*t);//CL 26/10/98 Put it back the original formula as before it was root=sqrt(R2p-s*s) + // Eq 6.15 from Egger Thesis + const double z=( Z1-num_planes_per_physical_ring*delta/2*( (-X1*sphi+Y1*cphi)/root + 1 ) - + axial_pos_to_z_offset)/num_planes_per_axial_pos; + const double new_dz=z-ring0; + + if (fabs(ds-new_ds)>.005 || fabs(dz - new_dz)>.005) + { + warning("Difference ds (%g,%g) dz (%g,%g) at X=%d,Y=%d,Z=%d\n", + ds,new_ds,dz,new_dz,X1,Y1,Z1); + } +#endif //BPINT_CHECK +} + +/**************************************************************************** + + backproj3D_Cho_view_viewplus90 backprojects 4 beams related by + symmetry (see bckproj.h) + + *****************************************************************************/ + +// KT 22/05/98 new, but extracted from backproj3D_ChoView45 +// (which used to be called Backproj_Cho_Symstheta_Phiplus90s0_P) +void +BackProjectorByBinUsingInterpolation:: +#if PIECEWISE_INTERPOLATION +piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90 +#else +linear_interpolation_backproj3D_Cho_view_viewplus90 +#endif +(Array<4, float > const &Projptr, + VoxelsOnCartesianGrid& image, + const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + float delta, + const double cphi, const double sphi, int s, int ring0, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset) +{ + // KT 04/05/2000 new check +#if PIECEWISE_INTERPOLATION + if (num_planes_per_axial_pos==1 && delta !=0) + error("This version of the backprojector cannot be used for span>1. \ +Recompile %s with PIECEWISE_INTERPOLATION=0", __FILE__); +#else +#ifdef ALTERNATIVE + // TODO + if (num_planes_per_axial_pos==1 && delta !=0) + error("This version of the backprojector cannot be used for span>1. \ +Recompile %s with ALTERNATIVE not #defined", __FILE__); +#endif +#endif + +#ifndef MOREZ + // below test was too conservative. We have to adjust it a bit +#error times sqrt(2)/iets met t + /* Check if delta is not too large. If the condition below is violated, + z might have to be incremented more than once to remain in the beam. + To do this, the code would have to be modified with while() instead of if(). + As this will slow it down, we just abort at the moment. + */ + + + + if (delta * proj_data_info_ptr_info_cyl_ptr->get_tangential_sampling() / proj_data_info_ptr_info_cyl_ptr->get_ring_radius() > 1) + { + error("This backprojector cannot handle such oblique segments: delta = %g. Sorry.\n",delta); + } +#endif + + // conditions on searching flow + assert(cphi>=0-.001); + assert(sphi>=0-.001); + assert(cphi+sphi>=1-.001); + + double dzvert,dzhor,ds; + double dsdiag,dzdiag,dz; + int X,Y,Z,Q; + + const float ring_unit = 1./num_planes_per_axial_pos; + + // in our current coordinate system, the following constant is always 2 + // TODO remove assumption + const int num_planes_per_physical_ring = 2; + assert(fabs(image.get_voxel_size().z() * num_planes_per_physical_ring/ proj_data_info_ptr->get_ring_spacing() -1) < 10E-4); + + /* FOV radius in voxel units */ + // KT 20/06/2001 change calculation of FOV such that even sized image will work + const float fovrad_in_mm = + min((min(image.get_max_x(), -image.get_min_x()))*image.get_voxel_size().x(), + (min(image.get_max_y(), -image.get_min_y()))*image.get_voxel_size().y()); + const float image_rad = fovrad_in_mm/image.get_voxel_size().x() - 2; + //const int image_rad = (int)((image.get_x_size()-1)/2); + + //KT 20/06/2001 allow min_z!=0 in all comparisons below + const int minplane = image.get_min_z(); + const int maxplane = image.get_max_z(); + + + if (find_start_values(proj_data_info_ptr, + delta, cphi, sphi, s, ring0, + image_rad, image.get_voxel_size().z(), + X, Y, Z, + ds, dz, dzhor, dzvert, + num_planes_per_axial_pos, + axial_pos_to_z_offset) == Succeeded::no) + { + // no voxels in the beam + return; + } + + /* + The formulas below give the values to update a pixel. + Things are then complicated by optimising this backprojection + by 'incrementalising' the formulas. + // linear (original) interpolation + double UpA0=Projptr[0][0][0][1]+ds*K1A0+dz*K2A0; + image[Z][Y][X]+= (UpA0+dsdz*K3A0); + + // new interpolation + double A0a0 = Projptr[0][0][0][1]+ds*K1A0; + double A0a1 = Projptr[0][0][0][3]+ds*(K1A0+K3A0); + double UpA0 = 2*(Projptr[0][0][0][1]+ds*K1A0+dz*K2A0) - (A0a0 + A0a1)/2; + image[Z][Y][X]+= (dz <= 0.25) ? A0a0 : UpA0+twodsdz*K3A0; + + incremental changes: + // original interpolation + UpA0inc=dsinc*K1A0+dzinc*K2A0; + // new interpolation + A0a0inc = dsinc*K1A0; + A0a1inc = dsinc*(K1A0+K3A0); + UpA0inc = A0a0inc - A0a1inc/2 +2*dzinc*K2A0 + + */ + + // K1, K2, K3 invariants + + const double K1A0=Projptr[0][0][0][2]-Projptr[0][0][0][1]; + const double K2A0=Projptr[0][0][0][3]-Projptr[0][0][0][1]; + const double K3A0=Projptr[0][0][0][4]-Projptr[0][0][0][2]-K2A0; + const double K1A2=Projptr[0][2][0][2]-Projptr[0][2][0][1]; + const double K2A2=Projptr[0][2][0][3]-Projptr[0][2][0][1]; + const double K3A2=Projptr[0][2][0][4]-Projptr[0][2][0][2]-K2A2; + + const double K1A0n=Projptr[1][0][0][2]-Projptr[1][0][0][1]; + const double K2A0n=Projptr[1][0][0][3]-Projptr[1][0][0][1]; + const double K3A0n=Projptr[1][0][0][4]-Projptr[1][0][0][2]-K2A0n; + const double K1A2n=Projptr[1][2][0][2]-Projptr[1][2][0][1]; + const double K2A2n=Projptr[1][2][0][3]-Projptr[1][2][0][1]; + const double K3A2n=Projptr[1][2][0][4]-Projptr[1][2][0][2]-K2A2n; + + const double K1P0=Projptr[0][0][1][2]-Projptr[0][0][1][1]; + const double K2P0=Projptr[0][0][1][3]-Projptr[0][0][1][1]; + const double K3P0=Projptr[0][0][1][4]-Projptr[0][0][1][2]-K2P0; + const double K1P2=Projptr[0][2][1][2]-Projptr[0][2][1][1]; + const double K2P2=Projptr[0][2][1][3]-Projptr[0][2][1][1]; + const double K3P2=Projptr[0][2][1][4]-Projptr[0][2][1][2]-K2P2; + + const double K1P0n=Projptr[1][0][1][2]-Projptr[1][0][1][1]; + const double K2P0n=Projptr[1][0][1][3]-Projptr[1][0][1][1]; + const double K3P0n=Projptr[1][0][1][4]-Projptr[1][0][1][2]-K2P0n; + const double K1P2n=Projptr[1][2][1][2]-Projptr[1][2][1][1]; + const double K2P2n=Projptr[1][2][1][3]-Projptr[1][2][1][1]; + const double K3P2n=Projptr[1][2][1][4]-Projptr[1][2][1][2]-K2P2n; + + +#if !PIECEWISE_INTERPOLATION + + const double ZplusKorrA0=ring_unit*K2A0; + const double ZplusKorrA2=ring_unit*K2A2; + + const double ZplusKorrA0n=ring_unit*K2A0n; + const double ZplusKorrA2n=ring_unit*K2A2n; + + const double ZplusKorrP0=ring_unit*K2P0; + const double ZplusKorrP2=ring_unit*K2P2; + + const double ZplusKorrP0n=ring_unit*K2P0n; + const double ZplusKorrP2n=ring_unit*K2P2n; + + // V, H, D invariants + + const double VA0=dzvert*K2A0+sphi*K1A0; + const double HA0=dzhor*K2A0-cphi*K1A0; + const double DA0=VA0+HA0; + const double VZA0=VA0+ring_unit*K2A0; + const double HZA0=HA0+ring_unit*K2A0; + const double DZA0=DA0+ring_unit*K2A0; + const double VA2=dzvert*K2A2+sphi*K1A2; + const double HA2=dzhor*K2A2-cphi*K1A2; + const double DA2=VA2+HA2; + const double VZA2=VA2+ring_unit*K2A2; + const double HZA2=HA2+ring_unit*K2A2; + const double DZA2=DA2+ring_unit*K2A2; + + const double VA0n=dzvert*K2A0n+sphi*K1A0n; + const double HA0n=dzhor*K2A0n-cphi*K1A0n; + const double DA0n=VA0n+HA0n; + const double VZA0n=VA0n+ring_unit*K2A0n; + const double HZA0n=HA0n+ring_unit*K2A0n; + const double DZA0n=DA0n+ring_unit*K2A0n; + const double VA2n=dzvert*K2A2n+sphi*K1A2n; + const double HA2n=dzhor*K2A2n-cphi*K1A2n; + const double DA2n=VA2n+HA2n; + const double VZA2n=VA2n+ring_unit*K2A2n; + const double HZA2n=HA2n+ring_unit*K2A2n; + const double DZA2n=DA2n+ring_unit*K2A2n; + + const double VP0=dzvert*K2P0+sphi*K1P0; + const double HP0=dzhor*K2P0-cphi*K1P0; + const double DP0=VP0+HP0; + const double VZP0=VP0+ring_unit*K2P0; + const double HZP0=HP0+ring_unit*K2P0; + const double DZP0=DP0+ring_unit*K2P0; + const double VP2=dzvert*K2P2+sphi*K1P2; + const double HP2=dzhor*K2P2-cphi*K1P2; + const double DP2=VP2+HP2; + const double VZP2=VP2+ring_unit*K2P2; + const double HZP2=HP2+ring_unit*K2P2; + const double DZP2=DP2+ring_unit*K2P2; + + const double VP0n=dzvert*K2P0n+sphi*K1P0n; + const double HP0n=dzhor*K2P0n-cphi*K1P0n; + const double DP0n=VP0n+HP0n; + const double VZP0n=VP0n+ring_unit*K2P0n; + const double HZP0n=HP0n+ring_unit*K2P0n; + const double DZP0n=DP0n+ring_unit*K2P0n; + const double VP2n=dzvert*K2P2n+sphi*K1P2n; + const double HP2n=dzhor*K2P2n-cphi*K1P2n; + const double DP2n=VP2n+HP2n; + const double VZP2n=VP2n+ring_unit*K2P2n; + const double HZP2n=HP2n+ring_unit*K2P2n; + const double DZP2n=DP2n+ring_unit*K2P2n; + + + // Initial values of update values (Up) + + double UpA0=Projptr[0][0][0][1]+ds*K1A0+dz*K2A0; + double UpA2=Projptr[0][2][0][1]+ds*K1A2+dz*K2A2; + + double UpA0n=Projptr[1][0][0][1]+ds*K1A0n+dz*K2A0n; + double UpA2n=Projptr[1][2][0][1]+ds*K1A2n+dz*K2A2n; + + double UpP0=Projptr[0][0][1][1]+ds*K1P0+dz*K2P0; + double UpP2=Projptr[0][2][1][1]+ds*K1P2+dz*K2P2; + + double UpP0n=Projptr[1][0][1][1]+ds*K1P0n+dz*K2P0n; + double UpP2n=Projptr[1][2][1][1]+ds*K1P2n+dz*K2P2n; + +#else // PIECEWISE_INTERPOLATION + + const double ZplusKorrA0=K2A0; + const double ZplusKorrA2=K2A2; + + const double ZplusKorrA0n=K2A0n; + const double ZplusKorrA2n=K2A2n; + + const double ZplusKorrP0=K2P0; + const double ZplusKorrP2=K2P2; + + const double ZplusKorrP0n=K2P0n; + const double ZplusKorrP2n=K2P2n; + + // V, H, D invariants + + const double VA0a0=+sphi*K1A0; + const double HA0a0=-cphi*K1A0; + const double DA0a0=VA0a0+HA0a0; + const double VA2a0=+sphi*K1A2; + const double HA2a0=-cphi*K1A2; + const double DA2a0=VA2a0+HA2a0; + + const double VA0na0=+sphi*K1A0n; + const double HA0na0=-cphi*K1A0n; + const double DA0na0=VA0na0+HA0na0; + const double VA2na0=+sphi*K1A2n; + const double HA2na0=-cphi*K1A2n; + const double DA2na0=VA2na0+HA2na0; + + const double VP0a0=+sphi*K1P0; + const double HP0a0=-cphi*K1P0; + const double DP0a0=VP0a0+HP0a0; + const double VP2a0=+sphi*K1P2; + const double HP2a0=-cphi*K1P2; + const double DP2a0=VP2a0+HP2a0; + + const double VP0na0=+sphi*K1P0n; + const double HP0na0=-cphi*K1P0n; + const double DP0na0=VP0na0+HP0na0; + const double VP2na0=+sphi*K1P2n; + const double HP2na0=-cphi*K1P2n; + const double DP2na0=VP2na0+HP2na0; + + + const double VA0a1=+sphi*(K1A0+K3A0); + const double HA0a1=-cphi*(K1A0+K3A0); + const double DA0a1=VA0a1+HA0a1; + const double VA2a1=+sphi*(K1A2+K3A2); + const double HA2a1=-cphi*(K1A2+K3A2); + const double DA2a1=VA2a1+HA2a1; + + const double VA0na1=+sphi*(K1A0n+K3A0n); + const double HA0na1=-cphi*(K1A0n+K3A0n); + const double DA0na1=VA0na1+HA0na1; + const double VA2na1=+sphi*(K1A2n+K3A2n); + const double HA2na1=-cphi*(K1A2n+K3A2n); + const double DA2na1=VA2na1+HA2na1; + + const double VP0a1=+sphi*(K1P0+K3P0); + const double HP0a1=-cphi*(K1P0+K3P0); + const double DP0a1=VP0a1+HP0a1; + const double VP2a1=+sphi*(K1P2+K3P2); + const double HP2a1=-cphi*(K1P2+K3P2); + const double DP2a1=VP2a1+HP2a1; + + const double VP0na1=+sphi*(K1P0n+K3P0n); + const double HP0na1=-cphi*(K1P0n+K3P0n); + const double DP0na1=VP0na1+HP0na1; + const double VP2na1=+sphi*(K1P2n+K3P2n); + const double HP2na1=-cphi*(K1P2n+K3P2n); + const double DP2na1=VP2na1+HP2na1; + + + const double VA0=VA0a0*1.5 - VA0a1/2 + 2*dzvert*K2A0; + const double HA0=HA0a0*1.5 - HA0a1/2 + 2*dzhor*K2A0; + const double DA0=VA0+HA0; + const double VZA0=VA0+K2A0; + const double HZA0=HA0+K2A0; + const double DZA0=DA0+K2A0; + const double VA2=VA2a0*1.5 - VA2a1/2 + 2*dzvert*K2A2; + const double HA2=HA2a0*1.5 - HA2a1/2 + 2*dzhor*K2A2; + const double DA2=VA2+HA2; + const double VZA2=VA2+K2A2; + const double HZA2=HA2+K2A2; + const double DZA2=DA2+K2A2; + + const double VA0n=VA0na0*1.5 - VA0na1/2 + 2*dzvert*K2A0n; + const double HA0n=HA0na0*1.5 - HA0na1/2 + 2*dzhor*K2A0n; + const double DA0n=VA0n+HA0n; + const double VZA0n=VA0n+K2A0n; + const double HZA0n=HA0n+K2A0n; + const double DZA0n=DA0n+K2A0n; + const double VA2n=VA2na0*1.5 - VA2na1/2 + 2*dzvert*K2A2n; + const double HA2n=HA2na0*1.5 - HA2na1/2 + 2*dzhor*K2A2n; + const double DA2n=VA2n+HA2n; + const double VZA2n=VA2n+K2A2n; + const double HZA2n=HA2n+K2A2n; + const double DZA2n=DA2n+K2A2n; + + const double VP0=VP0a0*1.5 - VP0a1/2 + 2*dzvert*K2P0; + const double HP0=HP0a0*1.5 - HP0a1/2 + 2*dzhor*K2P0; + const double DP0=VP0+HP0; + const double VZP0=VP0+K2P0; + const double HZP0=HP0+K2P0; + const double DZP0=DP0+K2P0; + const double VP2=VP2a0*1.5 - VP2a1/2 + 2*dzvert*K2P2; + const double HP2=HP2a0*1.5 - HP2a1/2 + 2*dzhor*K2P2; + const double DP2=VP2+HP2; + const double VZP2=VP2+K2P2; + const double HZP2=HP2+K2P2; + const double DZP2=DP2+K2P2; + + const double VP0n=VP0na0*1.5 - VP0na1/2 + 2*dzvert*K2P0n; + const double HP0n=HP0na0*1.5 - HP0na1/2 + 2*dzhor*K2P0n; + const double DP0n=VP0n+HP0n; + const double VZP0n=VP0n+K2P0n; + const double HZP0n=HP0n+K2P0n; + const double DZP0n=DP0n+K2P0n; + const double VP2n=VP2na0*1.5 - VP2na1/2 + 2*dzvert*K2P2n; + const double HP2n=HP2na0*1.5 - HP2na1/2 + 2*dzhor*K2P2n; + const double DP2n=VP2n+HP2n; + const double VZP2n=VP2n+K2P2n; + const double HZP2n=HP2n+K2P2n; + const double DZP2n=DP2n+K2P2n; + + // Initial values of update values (Up) + double A0a0 = Projptr[0][0][0][1]+ds*K1A0; + double A0a1 = Projptr[0][0][0][3]+ds*(K1A0+K3A0); + double A2a0 = Projptr[0][2][0][1]+ds*K1A2; + double A2a1 = Projptr[0][2][0][3]+ds*(K1A2+K3A2); + + double P0na0 = Projptr[1][0][1][1]+ds*K1P0n; + double P0na1 = Projptr[1][0][1][3]+ds*(K1P0n+K3P0n); + double P2na0 = Projptr[1][2][1][1]+ds*K1P2n; + double P2na1 = Projptr[1][2][1][3]+ds*(K1P2n+K3P2n); + + double A0na0 = Projptr[1][0][0][1]+ds*K1A0n; + double A0na1 = Projptr[1][0][0][3]+ds*(K1A0n+K3A0n); + double A2na0 = Projptr[1][2][0][1]+ds*K1A2n; + double A2na1 = Projptr[1][2][0][3]+ds*(K1A2n+K3A2n); + + double P0a0 = Projptr[0][0][1][1]+ds*K1P0; + double P0a1 = Projptr[0][0][1][3]+ds*(K1P0+K3P0); + double P2a0 = Projptr[0][2][1][1]+ds*K1P2; + double P2a1 = Projptr[0][2][1][3]+ds*(K1P2+K3P2); + + + double UpA0 = 2*(Projptr[0][0][0][1]+ds*K1A0+dz*K2A0) - (A0a0 + A0a1)/2; + double UpA2 = 2*(Projptr[0][2][0][1]+ds*K1A2+dz*K2A2) - (A2a0 + A2a1)/2; + + double UpA0n = 2*(Projptr[1][0][0][1]+ds*K1A0n+dz*K2A0n) - (A0na0 + A0na1)/2; + double UpA2n = 2*(Projptr[1][2][0][1]+ds*K1A2n+dz*K2A2n) - (A2na0 + A2na1)/2; + + double UpP0 = 2*(Projptr[0][0][1][1]+ds*K1P0+dz*K2P0) - (P0a0 + P0a1)/2; + double UpP2 = 2*(Projptr[0][2][1][1]+ds*K1P2+dz*K2P2) - (P2a0 + P2a1)/2; + + double UpP0n = 2*(Projptr[1][0][1][1]+ds*K1P0n+dz*K2P0n) - (P0na0 + P0na1)/2; + double UpP2n = 2*(Projptr[1][2][1][1]+ds*K1P2n+dz*K2P2n) - (P2na0 + P2na1)/2; + +#endif // PIECEWISE_INTERPOLATION + + // some extra start values + + // Find symmetric value in Z by 'mirroring' it around the centre z of the LORs: + // Z+Q = 2*centre_of_LOR_in_image_coordinates + // Note that we are backprojecting ring0 and ring0+1, so we mirror around ring0+0.5 + // original Q = (int) (4*ring0+2*delta+2-Z + 0.5); + // CL&KT 21/12/99 added axial_pos_to_z_offset and num_planes_per_physical_ring + { + // first compute it as floating point (although it has to be an int really) + const float Qf = (2*num_planes_per_axial_pos*(ring0 + 0.5) + + num_planes_per_physical_ring*delta + + 2*axial_pos_to_z_offset + - Z); + // now use rounding to be safe + Q = (int)floor(Qf + 0.5); + assert(fabs(Q-Qf) < 10E-4); + } + + dzdiag=dzvert+dzhor; + dsdiag=-cphi+sphi; + + + /* KT 13/05/98 changed loop condition, originally a combination of + while (X>X2||YY2||Z>Z2) + } + this had problems for nearly horizontal or vertical lines. + For example, while Y==Y2+1, some extra iterations had to be done + on X. + Now I break out of the while when the voxel goes out of the cylinder, + which means I don't have to use X2,Y2,Z2 anymore + */ + do + { + assert(ds >= 0); + assert(ds <= 1); + assert(dz >= 0); + assert(dz <= ring_unit+epsilon); + + // Update voxel values for this X,Y,Z + // For 1 given (X,Y)-position, there are always 2 voxels along the z-axis + // in this beam + const int Zplus=Z+1; + const int Qmin=Q-1; + +#if PIECEWISE_INTERPOLATION + //KT&MJ 07/08/98 new + + // KT 16/06/98 changed check ds!=0 to fabs(ds)>epsilon for better rounding control + const bool do_s_symmetry = (s!=0 || fabs(ds) > epsilon); + const double twodsdz=2*ds*dz; + const double twodsdz2=2*ds*(dz+0.5); + + if (Z>=minplane&&Z<=maxplane) { + // original image[Z][Y][X]+=UpA0+dsdz*K3A0 + image[Z][Y][X]+= (dz <= 0.25) ? A0a0 : UpA0+twodsdz*K3A0; + image[Z][X][-Y]+=(dz <= 0.25) ? A2a0 : UpA2 +twodsdz*K3A2; + if (do_s_symmetry) { + image[Z][-Y][-X]+= (dz <= 0.25) ? P0na0 : UpP0n +twodsdz*K3P0n; + image[Z][-X][Y]+=(dz <= 0.25) ? P2na0 : UpP2n +twodsdz*K3P2n; + } + + } + if (Zplus>=minplane&&Zplus<=maxplane) { + image[Zplus][Y][X]+=(dz >= 0.25) ? A0a1 : UpA0+twodsdz2*K3A0 +ZplusKorrA0; + image[Zplus][X][-Y]+=(dz >= 0.25) ? A2a1 : UpA2+twodsdz2*K3A2 +ZplusKorrA2; + if (do_s_symmetry) { + image[Zplus][-Y][-X]+=(dz >= 0.25) ? P0na1 : UpP0n+twodsdz2*K3P0n +ZplusKorrP0n; + image[Zplus][-X][Y]+=(dz >= 0.25) ? P2na1 : UpP2n+twodsdz2*K3P2n +ZplusKorrP2n; + } + + } + if (Q>=minplane&&Q<=maxplane) { + image[Q][Y][X]+=(dz <= 0.25) ? A0na0 : UpA0n +twodsdz*K3A0n; + image[Q][X][-Y]+=(dz <= 0.25) ? A2na0 : UpA2n +twodsdz*K3A2n; + if (do_s_symmetry) { + image[Q][-Y][-X]+=(dz <= 0.25) ? P0a0 : UpP0 +twodsdz*K3P0; + image[Q][-X][Y]+=(dz <= 0.25) ? P2a0 : UpP2 +twodsdz*K3P2; + } + } + if (Qmin>=minplane&&Qmin<=maxplane) { + image[Qmin][Y][X]+=(dz >= 0.25) ? A0na1 : UpA0n+twodsdz2*K3A0n + ZplusKorrA0n; + image[Qmin][X][-Y]+=(dz >= 0.25) ? A2na1 : UpA2n+twodsdz2*K3A2n + ZplusKorrA2n; + if (do_s_symmetry) { + image[Qmin][-Y][-X]+=(dz >= 0.25) ? P0a1 : UpP0+twodsdz2*K3P0 + ZplusKorrP0; + image[Qmin][-X][Y]+=(dz >= 0.25) ? P2a1 : UpP2+twodsdz2*K3P2 + ZplusKorrP2; + } + } +#else // !PIECEWISE_INTERPOLATION +#ifdef ALTERNATIVE + // This code and the one after #else are equivalent. However, this version is + // shorter, while the other version looks 'more optimal'. + // TODO check which is faster. + // KT 16/06/98 changed check ds!=0 to fabs(ds)>epsilon for better rounding control + const bool do_s_symmetry = (s!=0 || fabs(ds) > epsilon); + const double dsdz=ds*dz; + const double dsdz2=ds*(dz+ring_unit); + + if (Z>=minplane&&Z<=maxplane) { + image[Z][Y][X]+=UpA0+dsdz*K3A0; + image[Z][X][-Y]+=UpA2+dsdz*K3A2; + if (do_s_symmetry) { + image[Z][-Y][-X]+=UpP0n+dsdz*K3P0n; + image[Z][-X][Y]+=UpP2n+dsdz*K3P2n; + } + + } + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) { + image[Zplus][Y][X]+=UpA0+dsdz2*K3A0+ZplusKorrA0; + image[Zplus][X][-Y]+=UpA2+dsdz2*K3A2+ZplusKorrA2; + if (do_s_symmetry) { + image[Zplus][-Y][-X]+=UpP0n+dsdz2*K3P0n+ZplusKorrP0n; + image[Zplus][-X][Y]+=UpP2n+dsdz2*K3P2n+ZplusKorrP2n; + } + + } + if (Q>=minplane&&Q<=maxplane) { + image[Q][Y][X]+=UpA0n+dsdz*K3A0n; + image[Q][X][-Y]+=UpA2n+dsdz*K3A2n; + if (do_s_symmetry) { + image[Q][-Y][-X]+=UpP0+dsdz*K3P0; + image[Q][-X][Y]+=UpP2+dsdz*K3P2; + } + } + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) { + image[Qmin][Y][X]+=UpA0n+dsdz2*K3A0n+ZplusKorrA0n; + image[Qmin][X][-Y]+=UpA2n+dsdz2*K3A2n+ZplusKorrA2n; + if (do_s_symmetry) { + image[Qmin][-Y][-X]+=UpP0+dsdz2*K3P0+ZplusKorrP0; + image[Qmin][-X][Y]+=UpP2+dsdz2*K3P2+ZplusKorrP2; + } + } +#else // ALTERNATIVE + double TMP1,TMP2; + + // if(Z == maxplane || Q == maxplane || Zplus == maxplane || Qmin == maxplane) + // cout << " " << ring0 ; + + TMP1=ds*K3A0; + TMP2=UpA0+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][Y][X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][Y][X]+=TMP2+ring_unit*TMP1+ZplusKorrA0; + TMP1=ds*K3A2; + TMP2=UpA2+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][X][-Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][X][-Y]+=TMP2+ring_unit*TMP1+ZplusKorrA2; + + TMP1=ds*K3A0n; + TMP2=UpA0n+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][Y][X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][Y][X]+=TMP2+ring_unit*TMP1+ZplusKorrA0n; + TMP1=ds*K3A2n; + TMP2=UpA2n+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][X][-Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][X][-Y]+=TMP2+ring_unit*TMP1+ZplusKorrA2n; + + // KT 14/05/98 changed X!=-Y to s!=0 || ds!=0 to make it work for view != view45 + // KT 16/06/98 changed check ds!=0 to fabs(ds)>epsilon for better rounding control + if (s!=0 || fabs(ds) > epsilon) { + TMP1=ds*K3P0; + TMP2=UpP0+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][-Y][-X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][-Y][-X]+=TMP2+ring_unit*TMP1+ZplusKorrP0; + TMP1=ds*K3P2; + TMP2=UpP2+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][-X][Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][-X][Y]+=TMP2+ring_unit*TMP1+ZplusKorrP2; + + TMP1=ds*K3P0n; + TMP2=UpP0n+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][-Y][-X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][-Y][-X]+=TMP2+ring_unit*TMP1+ZplusKorrP0n; + TMP1=ds*K3P2n; + TMP2=UpP2n+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][-X][Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][-X][Y]+=TMP2+ring_unit*TMP1+ZplusKorrP2n; + } +#endif // ALTERNATIVE +#endif // PIECEWISE_INTERPOLATION + + // Search for next pixel in the beam + + if (ds>=cphi) { + /* horizontal*/ + X-=1; + ds-=cphi; + dz+=dzhor; + if (dz=minplane)); + +} + +/***************************************************************************** + + backproj3D_Cho_view_viewplus90_180minview_90minview backprojects 8 beams + related by symmetry (see bckproj.h) + + The structure of this function is essentially the same as the previous one. + Only we have more variables because we are handling 8 viewgrams here. + *****************************************************************************/ + +// KT 22/05/98 new, but extracted from backproj3D_ChoViews +// (which used to be called Backproj_Cho_Symsphitheta_P) + +void +BackProjectorByBinUsingInterpolation:: +#if PIECEWISE_INTERPOLATION +piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview +#else +linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview +#endif + (Array<4, float > const& Projptr, + VoxelsOnCartesianGrid& image, + const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + float delta, + const double cphi, const double sphi, + int s, int ring0, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset) +{ + // KT 04/05/2000 new check +#if PIECEWISE_INTERPOLATION + if (num_planes_per_axial_pos==1 && delta !=0) + error("This version of the backprojector cannot be used for span>1. \ +Recompile %s with PIECEWISE_INTERPOLATION=0", __FILE__); +#else +#ifdef ALTERNATIVE + // TODO + if (num_planes_per_axial_pos==1 && delta !=0) + error("This version of the backprojector cannot be used for span>1. \ +Recompile %s with ALTERNATIVE not #defined", __FILE__); +#endif +#endif + +#ifndef MOREZ + // KT 14/04/2000 new check + /* Check if delta is not too large. If the condition below is violated, + z might have to be incremented more than once to remain in the beam. + To do this, the code would have to be modified with while() instead of if(). + As this will slow it down, we just abort at the moment. + */ + + + if (delta * proj_data_info_ptr_info_cyl_ptr->get_tangential_sampling() /proj_data_info_ptr_info_cyl_ptr->get_ring_radius() > 1) + { + error("This backprojector cannot handle such oblique segments: delta = %g. Sorry.\n",delta); + } +#endif + + // conditions on searching flow + assert(cphi>=0-.001); + assert(sphi>=0-.001); + assert(cphi+sphi>=1-.001); + + const float ring_unit = 1./num_planes_per_axial_pos; + // CL&KT 21/12/99 new + // in our current coordinate system, the following constant is always 2 + const int num_planes_per_physical_ring = 2; + assert(fabs(image.get_voxel_size().z() * num_planes_per_physical_ring/ proj_data_info_ptr->get_ring_spacing() -1) < 10E-4); + + double dzvert,dzhor,ds; + double dsdiag,dzdiag,dz; + int X,Y,Z,Q; + + /* FOV radius in voxel units */ + // KT 20/06/2001 change calculation of FOV such that even sized image will work + const float fovrad_in_mm = + min((min(image.get_max_x(), -image.get_min_x()))*image.get_voxel_size().x(), + (min(image.get_max_y(), -image.get_min_y()))*image.get_voxel_size().y()); + const float image_rad = fovrad_in_mm/image.get_voxel_size().x() - 2; + //const int image_rad = (int)((image.get_x_size()-1)/2); + //KT 20/06/2001 allow min_z!=0 in all comparisons below + const int minplane = image.get_min_z(); + const int maxplane = image.get_max_z(); + + + if(find_start_values(proj_data_info_ptr, + delta, cphi, sphi, s, ring0, + image_rad, image.get_voxel_size().z(), + X, Y, Z, + ds, dz, dzhor, dzvert, + num_planes_per_axial_pos, + axial_pos_to_z_offset) == Succeeded::no) + { + // no voxels in the beam + return; + } + + // K1, K2, K3 invariants + + const double K1A0=Projptr[0][0][0][2]-Projptr[0][0][0][1]; + const double K2A0=Projptr[0][0][0][3]-Projptr[0][0][0][1]; + const double K3A0=Projptr[0][0][0][4]-Projptr[0][0][0][2]-K2A0; + const double K1A1=Projptr[0][1][0][2]-Projptr[0][1][0][1]; + const double K2A1=Projptr[0][1][0][3]-Projptr[0][1][0][1]; + const double K3A1=Projptr[0][1][0][4]-Projptr[0][1][0][2]-K2A1; + const double K1A2=Projptr[0][2][0][2]-Projptr[0][2][0][1]; + const double K2A2=Projptr[0][2][0][3]-Projptr[0][2][0][1]; + const double K3A2=Projptr[0][2][0][4]-Projptr[0][2][0][2]-K2A2; + const double K1A3=Projptr[0][3][0][2]-Projptr[0][3][0][1]; + const double K2A3=Projptr[0][3][0][3]-Projptr[0][3][0][1]; + const double K3A3=Projptr[0][3][0][4]-Projptr[0][3][0][2]-K2A3; + + const double K1A0n=Projptr[1][0][0][2]-Projptr[1][0][0][1]; + const double K2A0n=Projptr[1][0][0][3]-Projptr[1][0][0][1]; + const double K3A0n=Projptr[1][0][0][4]-Projptr[1][0][0][2]-K2A0n; + const double K1A1n=Projptr[1][1][0][2]-Projptr[1][1][0][1]; + const double K2A1n=Projptr[1][1][0][3]-Projptr[1][1][0][1]; + const double K3A1n=Projptr[1][1][0][4]-Projptr[1][1][0][2]-K2A1n; + const double K1A2n=Projptr[1][2][0][2]-Projptr[1][2][0][1]; + const double K2A2n=Projptr[1][2][0][3]-Projptr[1][2][0][1]; + const double K3A2n=Projptr[1][2][0][4]-Projptr[1][2][0][2]-K2A2n; + const double K1A3n=Projptr[1][3][0][2]-Projptr[1][3][0][1]; + const double K2A3n=Projptr[1][3][0][3]-Projptr[1][3][0][1]; + const double K3A3n=Projptr[1][3][0][4]-Projptr[1][3][0][2]-K2A3n; + + const double K1P0=Projptr[0][0][1][2]-Projptr[0][0][1][1]; + const double K2P0=Projptr[0][0][1][3]-Projptr[0][0][1][1]; + const double K3P0=Projptr[0][0][1][4]-Projptr[0][0][1][2]-K2P0; + const double K1P1=Projptr[0][1][1][2]-Projptr[0][1][1][1]; + const double K2P1=Projptr[0][1][1][3]-Projptr[0][1][1][1]; + const double K3P1=Projptr[0][1][1][4]-Projptr[0][1][1][2]-K2P1; + const double K1P2=Projptr[0][2][1][2]-Projptr[0][2][1][1]; + const double K2P2=Projptr[0][2][1][3]-Projptr[0][2][1][1]; + const double K3P2=Projptr[0][2][1][4]-Projptr[0][2][1][2]-K2P2; + const double K1P3=Projptr[0][3][1][2]-Projptr[0][3][1][1]; + const double K2P3=Projptr[0][3][1][3]-Projptr[0][3][1][1]; + const double K3P3=Projptr[0][3][1][4]-Projptr[0][3][1][2]-K2P3; + + const double K1P0n=Projptr[1][0][1][2]-Projptr[1][0][1][1]; + const double K2P0n=Projptr[1][0][1][3]-Projptr[1][0][1][1]; + const double K3P0n=Projptr[1][0][1][4]-Projptr[1][0][1][2]-K2P0n; + const double K1P1n=Projptr[1][1][1][2]-Projptr[1][1][1][1]; + const double K2P1n=Projptr[1][1][1][3]-Projptr[1][1][1][1]; + const double K3P1n=Projptr[1][1][1][4]-Projptr[1][1][1][2]-K2P1n; + const double K1P2n=Projptr[1][2][1][2]-Projptr[1][2][1][1]; + const double K2P2n=Projptr[1][2][1][3]-Projptr[1][2][1][1]; + const double K3P2n=Projptr[1][2][1][4]-Projptr[1][2][1][2]-K2P2n; + const double K1P3n=Projptr[1][3][1][2]-Projptr[1][3][1][1]; + const double K2P3n=Projptr[1][3][1][3]-Projptr[1][3][1][1]; + const double K3P3n=Projptr[1][3][1][4]-Projptr[1][3][1][2]-K2P3n; + +#if !PIECEWISE_INTERPOLATION + + + const double ZplusKorrA0=ring_unit*K2A0; + const double ZplusKorrA1=ring_unit*K2A1; + const double ZplusKorrA2=ring_unit*K2A2; + const double ZplusKorrA3=ring_unit*K2A3; + + const double ZplusKorrA0n=ring_unit*K2A0n; + const double ZplusKorrA1n=ring_unit*K2A1n; + const double ZplusKorrA2n=ring_unit*K2A2n; + const double ZplusKorrA3n=ring_unit*K2A3n; + + const double ZplusKorrP0=ring_unit*K2P0; + const double ZplusKorrP1=ring_unit*K2P1; + const double ZplusKorrP2=ring_unit*K2P2; + const double ZplusKorrP3=ring_unit*K2P3; + + const double ZplusKorrP0n=ring_unit*K2P0n; + const double ZplusKorrP1n=ring_unit*K2P1n; + const double ZplusKorrP2n=ring_unit*K2P2n; + const double ZplusKorrP3n=ring_unit*K2P3n; + + // V, H, D invariants + + const double VA0=dzvert*K2A0+sphi*K1A0; + const double HA0=dzhor*K2A0-cphi*K1A0; + const double DA0=VA0+HA0; + const double VZA0=VA0+ring_unit*K2A0; + const double HZA0=HA0+ring_unit*K2A0; + const double DZA0=DA0+ring_unit*K2A0; + const double VA1=dzvert*K2A1+sphi*K1A1; + const double HA1=dzhor*K2A1-cphi*K1A1; + const double DA1=VA1+HA1; + const double VZA1=VA1+ring_unit*K2A1; + const double HZA1=HA1+ring_unit*K2A1; + const double DZA1=DA1+ring_unit*K2A1; + const double VA2=dzvert*K2A2+sphi*K1A2; + const double HA2=dzhor*K2A2-cphi*K1A2; + const double DA2=VA2+HA2; + const double VZA2=VA2+ring_unit*K2A2; + const double HZA2=HA2+ring_unit*K2A2; + const double DZA2=DA2+ring_unit*K2A2; + const double VA3=dzvert*K2A3+sphi*K1A3; + const double HA3=dzhor*K2A3-cphi*K1A3; + const double DA3=VA3+HA3; + const double VZA3=VA3+ring_unit*K2A3; + const double HZA3=HA3+ring_unit*K2A3; + const double DZA3=DA3+ring_unit*K2A3; + + const double VA0n=dzvert*K2A0n+sphi*K1A0n; + const double HA0n=dzhor*K2A0n-cphi*K1A0n; + const double DA0n=VA0n+HA0n; + const double VZA0n=VA0n+ring_unit*K2A0n; + const double HZA0n=HA0n+ring_unit*K2A0n; + const double DZA0n=DA0n+ring_unit*K2A0n; + const double VA1n=dzvert*K2A1n+sphi*K1A1n; + const double HA1n=dzhor*K2A1n-cphi*K1A1n; + const double DA1n=VA1n+HA1n; + const double VZA1n=VA1n+ring_unit*K2A1n; + const double HZA1n=HA1n+ring_unit*K2A1n; + const double DZA1n=DA1n+ring_unit*K2A1n; + const double VA2n=dzvert*K2A2n+sphi*K1A2n; + const double HA2n=dzhor*K2A2n-cphi*K1A2n; + const double DA2n=VA2n+HA2n; + const double VZA2n=VA2n+ring_unit*K2A2n; + const double HZA2n=HA2n+ring_unit*K2A2n; + const double DZA2n=DA2n+ring_unit*K2A2n; + const double VA3n=dzvert*K2A3n+sphi*K1A3n; + const double HA3n=dzhor*K2A3n-cphi*K1A3n; + const double DA3n=VA3n+HA3n; + const double VZA3n=VA3n+ring_unit*K2A3n; + const double HZA3n=HA3n+ring_unit*K2A3n; + const double DZA3n=DA3n+ring_unit*K2A3n; + + const double VP0=dzvert*K2P0+sphi*K1P0; + const double HP0=dzhor*K2P0-cphi*K1P0; + const double DP0=VP0+HP0; + const double VZP0=VP0+ring_unit*K2P0; + const double HZP0=HP0+ring_unit*K2P0; + const double DZP0=DP0+ring_unit*K2P0; + const double VP1=dzvert*K2P1+sphi*K1P1; + const double HP1=dzhor*K2P1-cphi*K1P1; + const double DP1=VP1+HP1; + const double VZP1=VP1+ring_unit*K2P1; + const double HZP1=HP1+ring_unit*K2P1; + const double DZP1=DP1+ring_unit*K2P1; + const double VP2=dzvert*K2P2+sphi*K1P2; + const double HP2=dzhor*K2P2-cphi*K1P2; + const double DP2=VP2+HP2; + const double VZP2=VP2+ring_unit*K2P2; + const double HZP2=HP2+ring_unit*K2P2; + const double DZP2=DP2+ring_unit*K2P2; + const double VP3=dzvert*K2P3+sphi*K1P3; + const double HP3=dzhor*K2P3-cphi*K1P3; + const double DP3=VP3+HP3; + const double VZP3=VP3+ring_unit*K2P3; + const double HZP3=HP3+ring_unit*K2P3; + const double DZP3=DP3+ring_unit*K2P3; + + const double VP0n=dzvert*K2P0n+sphi*K1P0n; + const double HP0n=dzhor*K2P0n-cphi*K1P0n; + const double DP0n=VP0n+HP0n; + const double VZP0n=VP0n+ring_unit*K2P0n; + const double HZP0n=HP0n+ring_unit*K2P0n; + const double DZP0n=DP0n+ring_unit*K2P0n; + const double VP1n=dzvert*K2P1n+sphi*K1P1n; + const double HP1n=dzhor*K2P1n-cphi*K1P1n; + const double DP1n=VP1n+HP1n; + const double VZP1n=VP1n+ring_unit*K2P1n; + const double HZP1n=HP1n+ring_unit*K2P1n; + const double DZP1n=DP1n+ring_unit*K2P1n; + const double VP2n=dzvert*K2P2n+sphi*K1P2n; + const double HP2n=dzhor*K2P2n-cphi*K1P2n; + const double DP2n=VP2n+HP2n; + const double VZP2n=VP2n+ring_unit*K2P2n; + const double HZP2n=HP2n+ring_unit*K2P2n; + const double DZP2n=DP2n+ring_unit*K2P2n; + const double VP3n=dzvert*K2P3n+sphi*K1P3n; + const double HP3n=dzhor*K2P3n-cphi*K1P3n; + const double DP3n=VP3n+HP3n; + const double VZP3n=VP3n+ring_unit*K2P3n; + const double HZP3n=HP3n+ring_unit*K2P3n; + const double DZP3n=DP3n+ring_unit*K2P3n; + + + // Initial values of update values (Up) + + double UpA0=Projptr[0][0][0][1]+ds*K1A0+dz*K2A0; + double UpA1=Projptr[0][1][0][1]+ds*K1A1+dz*K2A1; + double UpA2=Projptr[0][2][0][1]+ds*K1A2+dz*K2A2; + double UpA3=Projptr[0][3][0][1]+ds*K1A3+dz*K2A3; + + double UpA0n=Projptr[1][0][0][1]+ds*K1A0n+dz*K2A0n; + double UpA1n=Projptr[1][1][0][1]+ds*K1A1n+dz*K2A1n; + double UpA2n=Projptr[1][2][0][1]+ds*K1A2n+dz*K2A2n; + double UpA3n=Projptr[1][3][0][1]+ds*K1A3n+dz*K2A3n; + + double UpP0=Projptr[0][0][1][1]+ds*K1P0+dz*K2P0; + double UpP1=Projptr[0][1][1][1]+ds*K1P1+dz*K2P1; + double UpP2=Projptr[0][2][1][1]+ds*K1P2+dz*K2P2; + double UpP3=Projptr[0][3][1][1]+ds*K1P3+dz*K2P3; + + double UpP0n=Projptr[1][0][1][1]+ds*K1P0n+dz*K2P0n; + double UpP1n=Projptr[1][1][1][1]+ds*K1P1n+dz*K2P1n; + double UpP2n=Projptr[1][2][1][1]+ds*K1P2n+dz*K2P2n; + double UpP3n=Projptr[1][3][1][1]+ds*K1P3n+dz*K2P3n; + +#else // PIECEWISE_INTERPOLATION + + + const double ZplusKorrA0=K2A0; + const double ZplusKorrA1=K2A1; + const double ZplusKorrA2=K2A2; + const double ZplusKorrA3=K2A3; + + const double ZplusKorrA0n=K2A0n; + const double ZplusKorrA1n=K2A1n; + const double ZplusKorrA2n=K2A2n; + const double ZplusKorrA3n=K2A3n; + + const double ZplusKorrP0=K2P0; + const double ZplusKorrP1=K2P1; + const double ZplusKorrP2=K2P2; + const double ZplusKorrP3=K2P3; + + const double ZplusKorrP0n=K2P0n; + const double ZplusKorrP1n=K2P1n; + const double ZplusKorrP2n=K2P2n; + const double ZplusKorrP3n=K2P3n; + + // V, H, D invariants + + const double VA0a0=+sphi*K1A0; + const double HA0a0=-cphi*K1A0; + const double DA0a0=VA0a0+HA0a0; + const double VA1a0=+sphi*K1A1; + const double HA1a0=-cphi*K1A1; + const double DA1a0=VA1a0+HA1a0; + const double VA2a0=+sphi*K1A2; + const double HA2a0=-cphi*K1A2; + const double DA2a0=VA2a0+HA2a0; + const double VA3a0=+sphi*K1A3; + const double HA3a0=-cphi*K1A3; + const double DA3a0=VA3a0+HA3a0; + + const double VA0na0=+sphi*K1A0n; + const double HA0na0=-cphi*K1A0n; + const double DA0na0=VA0na0+HA0na0; + const double VA1na0=+sphi*K1A1n; + const double HA1na0=-cphi*K1A1n; + const double DA1na0=VA1na0+HA1na0; + const double VA2na0=+sphi*K1A2n; + const double HA2na0=-cphi*K1A2n; + const double DA2na0=VA2na0+HA2na0; + const double VA3na0=+sphi*K1A3n; + const double HA3na0=-cphi*K1A3n; + const double DA3na0=VA3na0+HA3na0; + + const double VP0a0=+sphi*K1P0; + const double HP0a0=-cphi*K1P0; + const double DP0a0=VP0a0+HP0a0; + const double VP1a0=+sphi*K1P1; + const double HP1a0=-cphi*K1P1; + const double DP1a0=VP1a0+HP1a0; + const double VP2a0=+sphi*K1P2; + const double HP2a0=-cphi*K1P2; + const double DP2a0=VP2a0+HP2a0; + const double VP3a0=+sphi*K1P3; + const double HP3a0=-cphi*K1P3; + const double DP3a0=VP3a0+HP3a0; + + const double VP0na0=+sphi*K1P0n; + const double HP0na0=-cphi*K1P0n; + const double DP0na0=VP0na0+HP0na0; + const double VP1na0=+sphi*K1P1n; + const double HP1na0=-cphi*K1P1n; + const double DP1na0=VP1na0+HP1na0; + const double VP2na0=+sphi*K1P2n; + const double HP2na0=-cphi*K1P2n; + const double DP2na0=VP2na0+HP2na0; + const double VP3na0=+sphi*K1P3n; + const double HP3na0=-cphi*K1P3n; + const double DP3na0=VP3na0+HP3na0; + + + + const double VA0a1=+sphi*(K1A0+K3A0); + const double HA0a1=-cphi*(K1A0+K3A0); + const double DA0a1=VA0a1+HA0a1; + const double VA1a1=+sphi*(K1A1+K3A1); + const double HA1a1=-cphi*(K1A1+K3A1); + const double DA1a1=VA1a1+HA1a1; + const double VA2a1=+sphi*(K1A2+K3A2); + const double HA2a1=-cphi*(K1A2+K3A2); + const double DA2a1=VA2a1+HA2a1; + const double VA3a1=+sphi*(K1A3+K3A3); + const double HA3a1=-cphi*(K1A3+K3A3); + const double DA3a1=VA3a1+HA3a1; + + const double VA0na1=+sphi*(K1A0n+K3A0n); + const double HA0na1=-cphi*(K1A0n+K3A0n); + const double DA0na1=VA0na1+HA0na1; + const double VA1na1=+sphi*(K1A1n+K3A1n); + const double HA1na1=-cphi*(K1A1n+K3A1n); + const double DA1na1=VA1na1+HA1na1; + const double VA2na1=+sphi*(K1A2n+K3A2n); + const double HA2na1=-cphi*(K1A2n+K3A2n); + const double DA2na1=VA2na1+HA2na1; + const double VA3na1=+sphi*(K1A3n+K3A3n); + const double HA3na1=-cphi*(K1A3n+K3A3n); + const double DA3na1=VA3na1+HA3na1; + + const double VP0a1=+sphi*(K1P0+K3P0); + const double HP0a1=-cphi*(K1P0+K3P0); + const double DP0a1=VP0a1+HP0a1; + const double VP1a1=+sphi*(K1P1+K3P1); + const double HP1a1=-cphi*(K1P1+K3P1); + const double DP1a1=VP1a1+HP1a1; + const double VP2a1=+sphi*(K1P2+K3P2); + const double HP2a1=-cphi*(K1P2+K3P2); + const double DP2a1=VP2a1+HP2a1; + const double VP3a1=+sphi*(K1P3+K3P3); + const double HP3a1=-cphi*(K1P3+K3P3); + const double DP3a1=VP3a1+HP3a1; + + const double VP0na1=+sphi*(K1P0n+K3P0n); + const double HP0na1=-cphi*(K1P0n+K3P0n); + const double DP0na1=VP0na1+HP0na1; + const double VP1na1=+sphi*(K1P1n+K3P1n); + const double HP1na1=-cphi*(K1P1n+K3P1n); + const double DP1na1=VP1na1+HP1na1; + const double VP2na1=+sphi*(K1P2n+K3P2n); + const double HP2na1=-cphi*(K1P2n+K3P2n); + const double DP2na1=VP2na1+HP2na1; + const double VP3na1=+sphi*(K1P3n+K3P3n); + const double HP3na1=-cphi*(K1P3n+K3P3n); + const double DP3na1=VP3na1+HP3na1; + + + const double VA0=VA0a0*1.5 - VA0a1/2 + 2*dzvert*K2A0; + const double HA0=HA0a0*1.5 - HA0a1/2 + 2*dzhor*K2A0; + const double DA0=VA0+HA0; + const double VZA0=VA0+K2A0; + const double HZA0=HA0+K2A0; + const double DZA0=DA0+K2A0; + const double VA1=VA1a0*1.5 - VA1a1/2 + 2*dzvert*K2A1; + const double HA1=HA1a0*1.5 - HA1a1/2 + 2*dzhor*K2A1; + const double DA1=VA1+HA1; + const double VZA1=VA1+K2A1; + const double HZA1=HA1+K2A1; + const double DZA1=DA1+K2A1; + const double VA2=VA2a0*1.5 - VA2a1/2 + 2*dzvert*K2A2; + const double HA2=HA2a0*1.5 - HA2a1/2 + 2*dzhor*K2A2; + const double DA2=VA2+HA2; + const double VZA2=VA2+K2A2; + const double HZA2=HA2+K2A2; + const double DZA2=DA2+K2A2; + const double VA3=VA3a0*1.5 - VA3a1/2 + 2*dzvert*K2A3; + const double HA3=HA3a0*1.5 - HA3a1/2 + 2*dzhor*K2A3; + const double DA3=VA3+HA3; + const double VZA3=VA3+K2A3; + const double HZA3=HA3+K2A3; + const double DZA3=DA3+K2A3; + + const double VA0n=VA0na0*1.5 - VA0na1/2 + 2*dzvert*K2A0n; + const double HA0n=HA0na0*1.5 - HA0na1/2 + 2*dzhor*K2A0n; + const double DA0n=VA0n+HA0n; + const double VZA0n=VA0n+K2A0n; + const double HZA0n=HA0n+K2A0n; + const double DZA0n=DA0n+K2A0n; + const double VA1n=VA1na0*1.5 - VA1na1/2 + 2*dzvert*K2A1n; + const double HA1n=HA1na0*1.5 - HA1na1/2 + 2*dzhor*K2A1n; + const double DA1n=VA1n+HA1n; + const double VZA1n=VA1n+K2A1n; + const double HZA1n=HA1n+K2A1n; + const double DZA1n=DA1n+K2A1n; + const double VA2n=VA2na0*1.5 - VA2na1/2 + 2*dzvert*K2A2n; + const double HA2n=HA2na0*1.5 - HA2na1/2 + 2*dzhor*K2A2n; + const double DA2n=VA2n+HA2n; + const double VZA2n=VA2n+K2A2n; + const double HZA2n=HA2n+K2A2n; + const double DZA2n=DA2n+K2A2n; + const double VA3n=VA3na0*1.5 - VA3na1/2 + 2*dzvert*K2A3n; + const double HA3n=HA3na0*1.5 - HA3na1/2 + 2*dzhor*K2A3n; + const double DA3n=VA3n+HA3n; + const double VZA3n=VA3n+K2A3n; + const double HZA3n=HA3n+K2A3n; + const double DZA3n=DA3n+K2A3n; + + const double VP0=VP0a0*1.5 - VP0a1/2 + 2*dzvert*K2P0; + const double HP0=HP0a0*1.5 - HP0a1/2 + 2*dzhor*K2P0; + const double DP0=VP0+HP0; + const double VZP0=VP0+K2P0; + const double HZP0=HP0+K2P0; + const double DZP0=DP0+K2P0; + const double VP1=VP1a0*1.5 - VP1a1/2 + 2*dzvert*K2P1; + const double HP1=HP1a0*1.5 - HP1a1/2 + 2*dzhor*K2P1; + const double DP1=VP1+HP1; + const double VZP1=VP1+K2P1; + const double HZP1=HP1+K2P1; + const double DZP1=DP1+K2P1; + const double VP2=VP2a0*1.5 - VP2a1/2 + 2*dzvert*K2P2; + const double HP2=HP2a0*1.5 - HP2a1/2 + 2*dzhor*K2P2; + const double DP2=VP2+HP2; + const double VZP2=VP2+K2P2; + const double HZP2=HP2+K2P2; + const double DZP2=DP2+K2P2; + const double VP3=VP3a0*1.5 - VP3a1/2 + 2*dzvert*K2P3; + const double HP3=HP3a0*1.5 - HP3a1/2 + 2*dzhor*K2P3; + const double DP3=VP3+HP3; + const double VZP3=VP3+K2P3; + const double HZP3=HP3+K2P3; + const double DZP3=DP3+K2P3; + + const double VP0n=VP0na0*1.5 - VP0na1/2 + 2*dzvert*K2P0n; + const double HP0n=HP0na0*1.5 - HP0na1/2 + 2*dzhor*K2P0n; + const double DP0n=VP0n+HP0n; + const double VZP0n=VP0n+K2P0n; + const double HZP0n=HP0n+K2P0n; + const double DZP0n=DP0n+K2P0n; + const double VP1n=VP1na0*1.5 - VP1na1/2 + 2*dzvert*K2P1n; + const double HP1n=HP1na0*1.5 - HP1na1/2 + 2*dzhor*K2P1n; + const double DP1n=VP1n+HP1n; + const double VZP1n=VP1n+K2P1n; + const double HZP1n=HP1n+K2P1n; + const double DZP1n=DP1n+K2P1n; + const double VP2n=VP2na0*1.5 - VP2na1/2 + 2*dzvert*K2P2n; + const double HP2n=HP2na0*1.5 - HP2na1/2 + 2*dzhor*K2P2n; + const double DP2n=VP2n+HP2n; + const double VZP2n=VP2n+K2P2n; + const double HZP2n=HP2n+K2P2n; + const double DZP2n=DP2n+K2P2n; + const double VP3n=VP3na0*1.5 - VP3na1/2 + 2*dzvert*K2P3n; + const double HP3n=HP3na0*1.5 - HP3na1/2 + 2*dzhor*K2P3n; + const double DP3n=VP3n+HP3n; + const double VZP3n=VP3n+K2P3n; + const double HZP3n=HP3n+K2P3n; + const double DZP3n=DP3n+K2P3n; + + + // Initial values of update values (Up) + + double A0a0 = Projptr[0][0][0][1]+ds*K1A0; + double A0a1 = Projptr[0][0][0][3]+ds*(K1A0+K3A0); + double A2a0 = Projptr[0][2][0][1]+ds*K1A2; + double A2a1 = Projptr[0][2][0][3]+ds*(K1A2+K3A2); + + double P0na0 = Projptr[1][0][1][1]+ds*K1P0n; + double P0na1 = Projptr[1][0][1][3]+ds*(K1P0n+K3P0n); + double P2na0 = Projptr[1][2][1][1]+ds*K1P2n; + double P2na1 = Projptr[1][2][1][3]+ds*(K1P2n+K3P2n); + + double A0na0 = Projptr[1][0][0][1]+ds*K1A0n; + double A0na1 = Projptr[1][0][0][3]+ds*(K1A0n+K3A0n); + double A2na0 = Projptr[1][2][0][1]+ds*K1A2n; + double A2na1 = Projptr[1][2][0][3]+ds*(K1A2n+K3A2n); + + double P0a0 = Projptr[0][0][1][1]+ds*K1P0; + double P0a1 = Projptr[0][0][1][3]+ds*(K1P0+K3P0); + double P2a0 = Projptr[0][2][1][1]+ds*K1P2; + double P2a1 = Projptr[0][2][1][3]+ds*(K1P2+K3P2); + + double A1a0 = Projptr[0][1][0][1]+ds*K1A1; + double A1a1 = Projptr[0][1][0][3]+ds*(K1A1+K3A1); + double A3a0 = Projptr[0][3][0][1]+ds*K1A3; + double A3a1 = Projptr[0][3][0][3]+ds*(K1A3+K3A3); + + double P1na0 = Projptr[1][1][1][1]+ds*K1P1n; + double P1na1 = Projptr[1][1][1][3]+ds*(K1P1n+K3P1n); + double P3na0 = Projptr[1][3][1][1]+ds*K1P3n; + double P3na1 = Projptr[1][3][1][3]+ds*(K1P3n+K3P3n); + + double A1na0 = Projptr[1][1][0][1]+ds*K1A1n; + double A1na1 = Projptr[1][1][0][3]+ds*(K1A1n+K3A1n); + double A3na0 = Projptr[1][3][0][1]+ds*K1A3n; + double A3na1 = Projptr[1][3][0][3]+ds*(K1A3n+K3A3n); + + double P1a0 = Projptr[0][1][1][1]+ds*K1P1; + double P1a1 = Projptr[0][1][1][3]+ds*(K1P1+K3P1); + double P3a0 = Projptr[0][3][1][1]+ds*K1P3; + double P3a1 = Projptr[0][3][1][3]+ds*(K1P3+K3P3); + + double UpA0 = 2*(Projptr[0][0][0][1]+ds*K1A0+dz*K2A0) - (A0a0 + A0a1)/2; + double UpA1 = 2*(Projptr[0][1][0][1]+ds*K1A1+dz*K2A1) - (A1a0 + A1a1)/2; + double UpA2 = 2*(Projptr[0][2][0][1]+ds*K1A2+dz*K2A2) - (A2a0 + A2a1)/2; + double UpA3 = 2*(Projptr[0][3][0][1]+ds*K1A3+dz*K2A3) - (A3a0 + A3a1)/2; + + double UpA0n = 2*(Projptr[1][0][0][1]+ds*K1A0n+dz*K2A0n) - (A0na0 + A0na1)/2; + double UpA1n = 2*(Projptr[1][1][0][1]+ds*K1A1n+dz*K2A1n) - (A1na0 + A1na1)/2; + double UpA2n = 2*(Projptr[1][2][0][1]+ds*K1A2n+dz*K2A2n) - (A2na0 + A2na1)/2; + double UpA3n = 2*(Projptr[1][3][0][1]+ds*K1A3n+dz*K2A3n) - (A3na0 + A3na1)/2; + + double UpP0 = 2*(Projptr[0][0][1][1]+ds*K1P0+dz*K2P0) - (P0a0 + P0a1)/2; + double UpP1 = 2*(Projptr[0][1][1][1]+ds*K1P1+dz*K2P1) - (P1a0 + P1a1)/2; + double UpP2 = 2*(Projptr[0][2][1][1]+ds*K1P2+dz*K2P2) - (P2a0 + P2a1)/2; + double UpP3 = 2*(Projptr[0][3][1][1]+ds*K1P3+dz*K2P3) - (P3a0 + P3a1)/2; + + double UpP0n = 2*(Projptr[1][0][1][1]+ds*K1P0n+dz*K2P0n) - (P0na0 + P0na1)/2; + double UpP1n = 2*(Projptr[1][1][1][1]+ds*K1P1n+dz*K2P1n) - (P1na0 + P1na1)/2; + double UpP2n = 2*(Projptr[1][2][1][1]+ds*K1P2n+dz*K2P2n) - (P2na0 + P2na1)/2; + double UpP3n = 2*(Projptr[1][3][1][1]+ds*K1P3n+dz*K2P3n) - (P3na0 + P3na1)/2; + +#endif + + // some extra start values + + // Find symmetric value in Z by 'mirroring' it around the centre z of the LORs: + // Z+Q = 2*centre_of_LOR_in_image_coordinates + // Note that we are backprojecting ring0 and ring0+1, so we mirror around ring0+0.5 + // original Q = (int) (4*ring0+2*delta+2-Z + 0.5); + // CL&KT 21/12/99 added axial_pos_to_z_offset and num_planes_per_physical_ring + { + // first compute it as floating point (although it has to be an int really) + const float Qf = (2*num_planes_per_axial_pos*(ring0 + 0.5) + + num_planes_per_physical_ring*delta + + 2*axial_pos_to_z_offset + - Z); + // now use rounding to be safe + Q = (int)floor(Qf + 0.5); + assert(fabs(Q-Qf) < 10E-4); + } + + dzdiag=dzvert+dzhor; + dsdiag=-cphi+sphi; + + + /* KT 13/05/98 changed loop condition, originally a combination of + while (X>X2||YY2||Z>Z2) + } + this had problems for nearly horizontal or vertical lines. + For example, while Y==Y2+1, some extra iterations had to be done + on X. + Now I break out of the while when the voxel goes out of the cylinder, + which means I don't have to use X2,Y2,Z2 anymore + */ + do + { + assert(ds >= 0); + assert(ds <= 1); + assert(dz >= 0); + assert(dz <= ring_unit+epsilon); + + // Update voxel values for this X,Y,Z + // For 1 given (X,Y)-position, there are always 2 voxels along the z-axis + // in this beam. + const int Zplus=Z+1; + const int Qmin=Q-1; + + +#if PIECEWISE_INTERPOLATION + + const double twodsdz=2*ds*dz; + const double twodsdz2=2*ds*(dz+0.5); + // KT 16/06/98 changed check ds!=0 to fabs(ds)>epsilon for better rounding control + const bool do_s_symmetry = (s!=0 || fabs(ds) > epsilon); + + + if (Z>=minplane&&Z<=maxplane) { + image[Z][Y][X]+=(dz <= 0.25) ? A0a0 : UpA0 +twodsdz*K3A0; + image[Z][X][-Y]+=(dz <= 0.25) ? A2a0 : UpA2 +twodsdz*K3A2; + image[Z][X][Y]+=(dz <= 0.25) ? A1na0 : UpA1n +twodsdz*K3A1n; + image[Z][Y][-X]+=(dz <= 0.25) ? A3na0 : UpA3n +twodsdz*K3A3n; + if (do_s_symmetry) + { + image[Z][-X][-Y]+=(dz <= 0.25) ? P1a0 : UpP1 +twodsdz*K3P1; + image[Z][-Y][X]+=(dz <= 0.25) ? P3a0 : UpP3 +twodsdz*K3P3; + image[Z][-Y][-X]+=(dz <= 0.25) ? P0na0 : UpP0n +twodsdz*K3P0n; + image[Z][-X][Y]+=(dz <= 0.25) ? P2na0 : UpP2n +twodsdz*K3P2n; + } + } + if (Zplus>=minplane&&Zplus<=maxplane) { + image[Zplus][Y][X]+=(dz >= 0.25) ? A0a1 : UpA0 +twodsdz2*K3A0+ZplusKorrA0; + image[Zplus][X][-Y]+=(dz >= 0.25) ? A2a1 : UpA2 +twodsdz2*K3A2+ZplusKorrA2; + image[Zplus][X][Y]+=(dz >= 0.25) ? A1na1 : UpA1n +twodsdz2*K3A1n+ZplusKorrA1n; + image[Zplus][Y][-X]+=(dz >= 0.25) ? A3na1 : UpA3n +twodsdz2*K3A3n+ZplusKorrA3n; + if (do_s_symmetry) + { + image[Zplus][-X][-Y]+=(dz >= 0.25) ? P1a1 : UpP1 +twodsdz2*K3P1+ZplusKorrP1; + image[Zplus][-Y][X]+=(dz >= 0.25) ? P3a1 : UpP3 +twodsdz2*K3P3+ZplusKorrP3; + image[Zplus][-Y][-X]+=(dz >= 0.25) ? P0na1 : UpP0n +twodsdz2*K3P0n+ZplusKorrP0n; + image[Zplus][-X][Y]+=(dz >= 0.25) ? P2na1 : UpP2n +twodsdz2*K3P2n+ZplusKorrP2n; + } + } + if (Q>=minplane&&Q<=maxplane) { + image[Q][Y][-X]+=(dz <= 0.25) ? A3a0 : UpA3 +twodsdz*K3A3; + image[Q][Y][X]+=(dz <= 0.25) ? A0na0 : UpA0n +twodsdz*K3A0n; + image[Q][X][-Y]+=(dz <= 0.25) ? A2na0 : UpA2n +twodsdz*K3A2n; + image[Q][X][Y]+=(dz <= 0.25) ? A1a0 : UpA1 +twodsdz*K3A1; + if (do_s_symmetry) + { + image[Q][-Y][-X]+=(dz <= 0.25) ? P0a0 : UpP0 +twodsdz*K3P0; + image[Q][-X][Y]+=(dz <= 0.25) ? P2a0 : UpP2 +twodsdz*K3P2; + image[Q][-X][-Y]+=(dz <= 0.25) ? P1na0 : UpP1n +twodsdz*K3P1n; + image[Q][-Y][X]+=(dz <= 0.25) ? P3na0 : UpP3n +twodsdz*K3P3n; + } + } + if (Qmin>=minplane&&Qmin<=maxplane) { + image[Qmin][Y][-X]+=(dz >= 0.25) ? A3a1 : UpA3 +twodsdz2*K3A3+ZplusKorrA3; + image[Qmin][Y][X]+=(dz >= 0.25) ? A0na1 : UpA0n +twodsdz2*K3A0n+ZplusKorrA0n; + image[Qmin][X][-Y]+=(dz >= 0.25) ? A2na1 : UpA2n +twodsdz2*K3A2n+ZplusKorrA2n; + image[Qmin][X][Y]+=(dz >= 0.25) ? A1a1 : UpA1 +twodsdz2*K3A1+ZplusKorrA1; + if (do_s_symmetry) + { + image[Qmin][-Y][-X]+=(dz >= 0.25) ? P0a1 : UpP0 +twodsdz2*K3P0+ZplusKorrP0; + image[Qmin][-X][Y]+=(dz >= 0.25) ? P2a1 : UpP2 +twodsdz2*K3P2+ZplusKorrP2; + image[Qmin][-X][-Y]+=(dz >= 0.25) ? P1na1 : UpP1n +twodsdz2*K3P1n+ZplusKorrP1n; + image[Qmin][-Y][X]+=(dz >= 0.25) ? P3na1 : UpP3n +twodsdz2*K3P3n+ZplusKorrP3n; + } + } +#else // !PIECEWISE_INTERPOLATION +#ifdef ALTERNATIVE + const double dsdz=ds*dz; + const double dsdz2=ds*(dz+0.5); + // KT 16/06/98 changed check ds!=0 to fabs(ds)>epsilon for better rounding control + const bool do_s_symmetry = (s!=0 || fabs(ds) > epsilon); + + if (Z>=minplane&&Z<=maxplane) { + image[Z][Y][X]+=UpA0+dsdz*K3A0; + image[Z][X][-Y]+=UpA2+dsdz*K3A2; + image[Z][X][Y]+=UpA1n+dsdz*K3A1n; + image[Z][Y][-X]+=UpA3n+dsdz*K3A3n; + if (do_s_symmetry) + { + image[Z][-X][-Y]+=UpP1+dsdz*K3P1; + image[Z][-Y][X]+=UpP3+dsdz*K3P3; + image[Z][-Y][-X]+=UpP0n+dsdz*K3P0n; + image[Z][-X][Y]+=UpP2n+dsdz*K3P2n; + } + } + if (Zplus>=minplane&&Zplus<=maxplane) { + image[Zplus][Y][X]+=UpA0+dsdz2*K3A0+ZplusKorrA0; + image[Zplus][X][-Y]+=UpA2+dsdz2*K3A2+ZplusKorrA2; + image[Zplus][X][Y]+=UpA1n+dsdz2*K3A1n+ZplusKorrA1n; + image[Zplus][Y][-X]+=UpA3n+dsdz2*K3A3n+ZplusKorrA3n; + if (do_s_symmetry) + { + image[Zplus][-X][-Y]+=UpP1+dsdz2*K3P1+ZplusKorrP1; + image[Zplus][-Y][X]+=UpP3+dsdz2*K3P3+ZplusKorrP3; + image[Zplus][-Y][-X]+=UpP0n+dsdz2*K3P0n+ZplusKorrP0n; + image[Zplus][-X][Y]+=UpP2n+dsdz2*K3P2n+ZplusKorrP2n; + } + } + if (Q>=minplane&&Q<=maxplane) { + image[Q][Y][-X]+=UpA3+dsdz*K3A3; + image[Q][Y][X]+=UpA0n+dsdz*K3A0n; + image[Q][X][-Y]+=UpA2n+dsdz*K3A2n; + image[Q][X][Y]+=UpA1+dsdz*K3A1; + if (do_s_symmetry) + { + image[Q][-Y][-X]+=UpP0+dsdz*K3P0; + image[Q][-X][Y]+=UpP2+dsdz*K3P2; + image[Q][-X][-Y]+=UpP1n+dsdz*K3P1n; + image[Q][-Y][X]+=UpP3n+dsdz*K3P3n; + } + } + if (Qmin>=minplane&&Qmin<=maxplane) { + image[Qmin][Y][-X]+=UpA3+dsdz2*K3A3+ZplusKorrA3; + image[Qmin][Y][X]+=UpA0n+dsdz2*K3A0n+ZplusKorrA0n; + image[Qmin][X][-Y]+=UpA2n+dsdz2*K3A2n+ZplusKorrA2n; + image[Qmin][X][Y]+=UpA1+dsdz2*K3A1+ZplusKorrA1; + if (do_s_symmetry) + { + image[Qmin][-Y][-X]+=UpP0+dsdz2*K3P0+ZplusKorrP0; + image[Qmin][-X][Y]+=UpP2+dsdz2*K3P2+ZplusKorrP2; + image[Qmin][-X][-Y]+=UpP1n+dsdz2*K3P1n+ZplusKorrP1n; + image[Qmin][-Y][X]+=UpP3n+dsdz2*K3P3n+ZplusKorrP3n; + } + } + #else // ALTERNATIVE + double TMP1,TMP2; + TMP1=ds*K3A0; + TMP2=UpA0+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][Y][X]+=TMP2; + + + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][Y][X]+=TMP2+ring_unit*TMP1+ZplusKorrA0; + + TMP1=ds*K3A1; + TMP2=UpA1+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][X][Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][X][Y]+=TMP2+ring_unit*TMP1+ZplusKorrA1; + + + TMP1=ds*K3A2; + TMP2=UpA2+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][X][-Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][X][-Y]+=TMP2+ring_unit*TMP1+ZplusKorrA2; + TMP1=ds*K3A3; + TMP2=UpA3+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][Y][-X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][Y][-X]+=TMP2+ring_unit*TMP1+ZplusKorrA3; + + TMP1=ds*K3A0n; + TMP2=UpA0n+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][Y][X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][Y][X]+=TMP2+ring_unit*TMP1+ZplusKorrA0n; + TMP1=ds*K3A1n; + TMP2=UpA1n+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][X][Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][X][Y]+=TMP2+ring_unit*TMP1+ZplusKorrA1n; + TMP1=ds*K3A2n; + TMP2=UpA2n+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][X][-Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][X][-Y]+=TMP2+ring_unit*TMP1+ZplusKorrA2n; + TMP1=ds*K3A3n; + TMP2=UpA3n+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][Y][-X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][Y][-X]+=TMP2+ring_unit*TMP1+ZplusKorrA3n; + + // KT 16/06/98 changed check ds!=0 to fabs(ds)>epsilon for better rounding control + if (s!=0 || fabs(ds) > epsilon) + { + TMP1=ds*K3P0; + TMP2=UpP0+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][-Y][-X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][-Y][-X]+=TMP2+ring_unit*TMP1+ZplusKorrP0; + TMP1=ds*K3P1; + TMP2=UpP1+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][-X][-Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][-X][-Y]+=TMP2+ring_unit*TMP1+ZplusKorrP1; + TMP1=ds*K3P2; + TMP2=UpP2+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][-X][Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][-X][Y]+=TMP2+ring_unit*TMP1+ZplusKorrP2; + TMP1=ds*K3P3; + TMP2=UpP3+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][-Y][X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][-Y][X]+=TMP2+ring_unit*TMP1+ZplusKorrP3; + + TMP1=ds*K3P0n; + TMP2=UpP0n+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][-Y][-X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][-Y][-X]+=TMP2+ring_unit*TMP1+ZplusKorrP0n; + TMP1=ds*K3P1n; + TMP2=UpP1n+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][-X][-Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][-X][-Y]+=TMP2+ring_unit*TMP1+ZplusKorrP1n; + TMP1=ds*K3P2n; + TMP2=UpP2n+dz*TMP1; + if (Z>=minplane&&Z<=maxplane) + image[Z][-X][Y]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Zplus>=minplane&&Zplus<=maxplane && ring_unit==0.5) + image[Zplus][-X][Y]+=TMP2+ring_unit*TMP1+ZplusKorrP2n; + TMP1=ds*K3P3n; + TMP2=UpP3n+dz*TMP1; + if (Q>=minplane&&Q<=maxplane) + image[Q][-Y][X]+=TMP2; + //CL SPAN 15/09/98 Add one more condition in order to skip the statement in case of span data + //as there is only one voxel in the beam in slice unit + if (Qmin>=minplane&&Qmin<=maxplane && ring_unit==0.5) + image[Qmin][-Y][X]+=TMP2+ring_unit*TMP1+ZplusKorrP3n; + } + +#endif // ALTERNATIVE +#endif //PIECEWISE_INTERPOLATION + + // Search for next pixel in the beam + + if (ds>=cphi) { + /* horizontal*/ + X-=1; + ds-=cphi; + dz+=dzhor; + if (dz=minplane)); + +} + + +/****************************************************************************************/ + + +static Succeeded +find_start_values(const ProjDataInfoCylindricalArcCorr* proj_data_info_ptr, + const float delta, const double cphi, const double sphi, + const int s, const int ring0, + const float image_rad, const double d_sl, + int&X1, int&Y1, int& Z1, + double& ds, double& dz, double& dzhor, double& dzvert, + const float num_planes_per_axial_pos, + const float axial_pos_to_z_offset) +{ + // use notations from Egger's thesis + + + const double d_p = proj_data_info_ptr->get_tangential_sampling(); + // d_xy = image.get_voxel_size().x, but we can use the bin_size here as + // the routines.work only when these 2 are equal + const double d_xy = proj_data_info_ptr->get_tangential_sampling(); + + const double R2 =square(proj_data_info_ptr->get_ring_radius()); + /* Radius of scanner squared in Pixel^2 */ + const double R2p = R2 / d_xy / d_xy; + + // TODO REMOVE ASSUMPTION + const int num_planes_per_physical_ring = 2; + assert(fabs(d_sl * num_planes_per_physical_ring/proj_data_info_ptr->get_ring_spacing() -1) < 10E-4); + + /* KT 16/06/98 + This code should select a pixel inside the FOV. + I tried to set rpix=image_rad, and + X1 = (int)(X1f<0 ? ceil(X1f) : floor(X1f)); + Y1 = (int)(Y1f<0 ? ceil(Y1f) : floor(Y1f)); + Up to this point it is fine. However, it would also require (messy?) + modifications of the 'push back into beam' code, so I gave up. + + So, now we simply take rpix=image_rad-1. This means that sometimes a + pixel close to the border is not selected. + Not that anyone cares... + */ + int rpix = round(image_rad-1); /* Radius of target image in voxel units */ + const double r2 = rpix * rpix * d_xy * d_xy; /* Radius squared of target image in mm^2 */ + + +//Formula in Eq 6.12 of Egger Matthias PhD + // First compute X1, Y1 + // KT 16/06/98 added const + const double t = s + 0.5; /* In a beam, not on a ray */ + + // KT 25/09/2001 replace assert() with return value + // check if there is any pixel in the beam + if (t > rpix) + return Succeeded::no; + + { + const double root = sqrt(rpix * rpix - t * t);// Eq 6.12 in EGger Thesis + const double X1f = t * cphi + sphi * root; /* Only valid if d_xy = d_p from Eq 6.12 in EGger Thesis */ + //const double X2f = t * cphi - sphi * root; + const double Y1f = t * sphi - cphi * root;// Eq 6.12 in EGger Thesis + //const double Y2f = t * sphi + cphi * root; + + // KTTODO when using even number of bins, this should be floor(X1f) + .5 + X1 = (int) floor(X1f + 0.5); + //X2 = (int) floor(X2f + 0.5); + Y1 = (int) floor(Y1f + 0.5); + //Y2 = (int) floor(Y2f + 0.5); + } + + + // Compute ds = difference between s and s-projection of selected voxel + // KT 22/05/98 we don't need t later on + //t=X1*cphi+Y1*sphi; + //ds=t-s; + ds=X1*cphi+Y1*sphi-s;// Eq 6.13 in Egger thsis + // Note that X1f*cphi+Y1f*sphi == t == s + 0.5, so + // ds == (X1-X1f)*cphi + (Y1-Y1f)*sphi + 0.5, hence + // -(cphi + sphi)/2 + 0.5 <= ds <= (cphi + sphi)/2 + 0.5 + + /* Push voxel back into beam */ + // KT 16/06/98 I now always use the cos(phi) case + // For example, when ds<0, adding sin(phi) is not guaranteed to make it positive + // (where the most obvious example was phi==0, although I did treat that correctly). + // On the other hand ds + cphi >= (cphi-sphi)/2 + 0.5, which is >=0.5 as + // 0<=phi<=45 (in fact, it is still >=0 if 45epsilon) + { + Y1++; + //Y2--; + //t+=sphi; + ds+=sphi; + } + else +#endif + { + X1++; + //X2--; + //t+=cphi; + ds+=cphi; + // Now 0.5 <= (cphi-sphi)/2 + 0.5 <= ds < cphi+epsilon + } + } else if (ds>=1.) + { +#if 0 + if(sphi>epsilon) + { + Y1--; + //Y2++; + //t-=sphi; + ds-=sphi; + } + else +#endif + { + X1--; + //X2++; + //t-=cphi; + ds-=cphi; + // Now 0 <= 1-cphi<= ds <= -(cphi-sphi)/2 + 0.5 <= 0.5 + } + } + // At the end of all this, 0 <= ds < 1 + + // Now find Z1 + // Note that t=s+.5 + { + const double t2dp2 = t * t * d_p * d_p;//Eq 6.12 in EGger thesis + //const double ttheta =(delta * d_sl / sqrt(R2 - t2dp2));//Equivalent to tan(theta) see Eq 6.10 in Egger thesis except that d_r/2 has been replaced to d_sl + + if (t2dp2 >= R2 || t2dp2 > r2) + return Succeeded::no; + + const double root1 = sqrt(R2 - t2dp2); + const double root2 = sqrt(r2 - t2dp2); + + // Eq 6.12 in Egger's thesis + // const double Z1f = 2 * ring0 + 1 + (ttheta * (root1 - root2))/d_sl: + // equivalent formula: + // Z1f = 2 * ring0 + 1 + delta * (1 - root2/root1) + // We convert this to 'general' sizes of planes w.r.t. rings + // KT&CL 22/12/99 inserted offset + const double Z1f = + num_planes_per_axial_pos*(ring0 + 0.5) + axial_pos_to_z_offset + + num_planes_per_physical_ring*delta/2 * (1 - root2/root1); + //const double Z2f = (ring0 + 0.5)/ring_unit + (ttheta * (root1 + root2))/d_sl; + // TODO possible problem for negative Z1f, use floor() instead + Z1 = (int) floor(Z1f); + + //Z2 = (int) Z2f; + } + { + + // Compute 'z' (formula 6.15 in Egger's thesis) which is the ring coordinate of the + // projection of the voxel X1,Y1,Z1 + const double root=sqrt(R2p-t*t);//CL 26/10/98 Put it back the original formula as before it was root=sqrt(R2p-s*s) + //const double z=ring_unit*( Z1-delta*( (-X1*sphi+Y1*cphi)/root + 1 ) );// Eq 6.15 from Egger Thesis//CL SPAN 14/09/98 2*delta + // KT&CL 22/12/99 inserted offset + const double z=( Z1-num_planes_per_physical_ring*delta/2*( (-X1*sphi+Y1*cphi)/root + 1 ) - + axial_pos_to_z_offset)/num_planes_per_axial_pos; + dz=z-ring0; + // Using the same formula (z=...) for X1f, Y1f, Z1f gives zf = ring0+ 0.5 + // As the difference between X1f, Y1f, Z1f and X1,Y1,Y2 is at most 1 in every coordinate, + // -1/2 - delta/root/2 <= z - zf <= delta/root/2, so + // -delta/root/2 <= dz <= 0.5 + delta/root/2 + // As delta < Rpix for most scanners, -1/num_planes_per_axial_pos < dz < 1 + // For some scanners though (e.g. HiDAC) this is not true, so we keep on checking if + // dz is in the appropriate range + + + /* Push voxel back into beam */ + // KT 01/06/98 added 'else' here for the case when dz=1/num_planes_per_axial_pos, the first step puts it to 0, + // the 2nd step shouldn't do anything (dz<0), but because we compare with epsilon, + // it got back to .5 + + // MOREZ: if ->while + if (dz>=1./num_planes_per_axial_pos) + { + while (dz>=1./num_planes_per_axial_pos) + { + Z1--; + //z-=1/num_planes_per_axial_pos; + dz-=1./num_planes_per_axial_pos; + } + } + else //if + { + while (dzproj_matrix_ptr.reset(); + //BackProjectorByBin::set_defaults(); +} + +void +BackProjectorByBinUsingProjMatrixByBin:: +initialise_keymap() +{ + parser.add_start_key("Back Projector Using Matrix Parameters"); + parser.add_stop_key("End Back Projector Using Matrix Parameters"); + parser.add_parsing_key("matrix type", &proj_matrix_ptr); + //BackProjectorByBin::initialise_keymap(); +} + + +bool +BackProjectorByBinUsingProjMatrixByBin:: +post_processing() +{ + //if (BackProjectorByBin::post_processing() == true) + // return true; + if (is_null_ptr(proj_matrix_ptr)) + { + warning("BackProjectorByBinUsingProjMatrixByBin: matrix not set.\n"); + return true; + } + return false; +} + +BackProjectorByBinUsingProjMatrixByBin:: +BackProjectorByBinUsingProjMatrixByBin() +{ + set_defaults(); +} + +BackProjectorByBinUsingProjMatrixByBin:: +BackProjectorByBinUsingProjMatrixByBin( + const shared_ptr& proj_matrix_ptr + ) + : proj_matrix_ptr(proj_matrix_ptr) +{ + assert(!is_null_ptr(proj_matrix_ptr)); +} + +void +BackProjectorByBinUsingProjMatrixByBin:: +set_up(const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr) + +{ + proj_matrix_ptr->set_up(proj_data_info_ptr, image_info_ptr); +} + +const DataSymmetriesForViewSegmentNumbers * +BackProjectorByBinUsingProjMatrixByBin::get_symmetries_used() const +{ + return proj_matrix_ptr->get_symmetries_ptr(); +} + +void +BackProjectorByBinUsingProjMatrixByBin:: +actual_back_project(DiscretisedDensity<3,float>& image, + const RelatedViewgrams& viewgrams, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) +{ + if (proj_matrix_ptr->is_cache_enabled()/* && + !proj_matrix_ptr->does_cache_store_only_basic_bins()*/) + { + // straightforward version which relies on ProjMatrixByBin to sort out all + // symmetries + // would be slow if there's no caching at all, but is very fast if everything is cached + + ProjMatrixElemsForOneBin proj_matrix_row; + + RelatedViewgrams::const_iterator r_viewgrams_iter = viewgrams.begin(); + + while( r_viewgrams_iter!=viewgrams.end()) + { + const Viewgram& viewgram = *r_viewgrams_iter; + const int view_num = viewgram.get_view_num(); + const int segment_num = viewgram.get_segment_num(); + + for ( int tang_pos = min_tangential_pos_num ;tang_pos <= max_tangential_pos_num ;++tang_pos) + for ( int ax_pos = min_axial_pos_num; ax_pos <= max_axial_pos_num ;++ax_pos) + { + // KT 21/02/2002 added check on 0 + if (viewgram[ax_pos][tang_pos] == 0) + continue; + Bin bin(segment_num, view_num, ax_pos, tang_pos, viewgram[ax_pos][tang_pos]); + proj_matrix_ptr->get_proj_matrix_elems_for_one_bin(proj_matrix_row, bin); + proj_matrix_row.back_project(image, bin); + } + ++r_viewgrams_iter; + } + } + else + { + // complicated version which handles the symmetries explicitly + // faster when no caching is performed, about just as fast when there is caching + ProjMatrixElemsForOneBin proj_matrix_row; + ProjMatrixElemsForOneBin proj_matrix_row_copy; + const DataSymmetriesForBins* symmetries = proj_matrix_ptr->get_symmetries_ptr(); + + Array<2,int> + already_processed(IndexRange2D(min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num)); + + vector related_ax_tang_poss; + for ( int tang_pos = min_tangential_pos_num ;tang_pos <= max_tangential_pos_num ;++tang_pos) + for ( int ax_pos = min_axial_pos_num; ax_pos <= max_axial_pos_num ;++ax_pos) + { + if (already_processed[ax_pos][tang_pos]) + continue; + + Bin basic_bin(viewgrams.get_basic_segment_num(), + viewgrams.get_basic_view_num(), + ax_pos, + tang_pos); + symmetries->find_basic_bin(basic_bin); + + proj_matrix_ptr->get_proj_matrix_elems_for_one_bin(proj_matrix_row, basic_bin); + + related_ax_tang_poss.resize(0); + symmetries->get_related_bins_factorised(related_ax_tang_poss,basic_bin, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + + for ( +#ifndef STIR_NO_NAMESPACES + std:: +#endif + vector::const_iterator r_ax_tang_poss_iter = related_ax_tang_poss.begin(); + r_ax_tang_poss_iter != related_ax_tang_poss.end(); + ++r_ax_tang_poss_iter) + { + const int axial_pos_tmp = (*r_ax_tang_poss_iter)[1]; + const int tang_pos_tmp = (*r_ax_tang_poss_iter)[2]; + + // symmetries might take the ranges out of what the user wants + if ( !(min_axial_pos_num <= axial_pos_tmp && axial_pos_tmp <= max_axial_pos_num && + min_tangential_pos_num <=tang_pos_tmp && tang_pos_tmp <= max_tangential_pos_num)) + continue; + + already_processed[axial_pos_tmp][tang_pos_tmp] = 1; + + + for (RelatedViewgrams::const_iterator viewgram_iter = viewgrams.begin(); + viewgram_iter != viewgrams.end(); + ++viewgram_iter) + { + // KT 21/02/2002 added check on 0 + if ((*viewgram_iter)[axial_pos_tmp][tang_pos_tmp] == 0) + continue; + proj_matrix_row_copy = proj_matrix_row; + Bin bin(viewgram_iter->get_segment_num(), + viewgram_iter->get_view_num(), + axial_pos_tmp, + tang_pos_tmp, + (*viewgram_iter)[axial_pos_tmp][tang_pos_tmp]); + + auto_ptr symm_op_ptr = + symmetries->find_symmetry_operation_from_basic_bin(bin); + // TODO replace with Bin::compare_coordinates or so + assert(bin.segment_num() == basic_bin.segment_num()); + assert(bin.view_num() == basic_bin.view_num()); + assert(bin.axial_pos_num() == basic_bin.axial_pos_num()); + assert(bin.tangential_pos_num() == basic_bin.tangential_pos_num()); + + symm_op_ptr->transform_proj_matrix_elems_for_one_bin(proj_matrix_row_copy); + proj_matrix_row_copy.back_project(image, bin); + } + } + } + assert(already_processed.sum() + == ( + (max_axial_pos_num - min_axial_pos_num + 1) * + (max_tangential_pos_num - min_tangential_pos_num + 1))); + } +} + + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.cxx b/src/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.cxx new file mode 100644 index 0000000000..8c624419be --- /dev/null +++ b/src/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.cxx @@ -0,0 +1,140 @@ + +// +// $Id: BackProjectorByBinUsingSquareProjMatrixByBin.cxx +// + +/*! + \file + \ingroup recon_buildblock + + \brief non-inline implementations for stir::BackProjectorByBinUsingSquareProjMatrixByBin + + \author Sanida Mustafovic + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/BackProjectorByBinUsingSquareProjMatrixByBin.h" +#include "stir/Viewgram.h" +#include "stir/RelatedViewgrams.h" +#include "stir/BasicCoordinate.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/is_null_ptr.h" + +START_NAMESPACE_STIR + +const char * const +BackProjectorByBinUsingSquareProjMatrixByBin::registered_name = + "Matrix Square"; + + +void +BackProjectorByBinUsingSquareProjMatrixByBin:: +set_defaults() +{ + this->proj_matrix_ptr.reset(); +} + + +BackProjectorByBinUsingSquareProjMatrixByBin:: +BackProjectorByBinUsingSquareProjMatrixByBin( + const shared_ptr& proj_matrix_ptr + ) + : proj_matrix_ptr(proj_matrix_ptr) + { + assert(!is_null_ptr(proj_matrix_ptr)); + + } + +const DataSymmetriesForViewSegmentNumbers * +BackProjectorByBinUsingSquareProjMatrixByBin::get_symmetries_used() const +{ + return proj_matrix_ptr->get_symmetries_ptr(); +} + +void +BackProjectorByBinUsingSquareProjMatrixByBin:: +actual_back_project(DiscretisedDensity<3,float>& image, + const RelatedViewgrams& viewgrams, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) +{ + ProjMatrixElemsForOneBin proj_matrix_row; + + + RelatedViewgrams::const_iterator r_viewgrams_iter = viewgrams.begin(); + + + while( r_viewgrams_iter!=viewgrams.end()) + { + const Viewgram& viewgram = *r_viewgrams_iter; + const int view_num = viewgram.get_view_num(); + const int segment_num = viewgram.get_segment_num(); + + for ( int tang_pos = min_tangential_pos_num ;tang_pos <= max_tangential_pos_num ;++tang_pos) + for ( int ax_pos = min_axial_pos_num; ax_pos <= max_axial_pos_num ;++ax_pos) + { + + Bin bin(segment_num, view_num, ax_pos, tang_pos, viewgram[ax_pos][tang_pos]); + proj_matrix_ptr->get_proj_matrix_elems_for_one_bin(proj_matrix_row, bin); + ProjMatrixElemsForOneBin::iterator element_ptr = + proj_matrix_row.begin(); + + // square matrix elements + while (element_ptr != proj_matrix_row.end()) + { + const float val=element_ptr->get_value(); + *element_ptr *=val; + element_ptr++; + } + + proj_matrix_row.back_project(image, bin); + } + ++r_viewgrams_iter; + } +} + + +void +BackProjectorByBinUsingSquareProjMatrixByBin:: +initialise_keymap() +{ + parser.add_start_key("Back Projector ( Square) Using Matrix Parameters"); + parser.add_stop_key("End Back Projector ( Square) Using Matrix Parameters"); + parser.add_parsing_key("matrix type", &proj_matrix_ptr); +} + +BackProjectorByBinUsingSquareProjMatrixByBin:: +BackProjectorByBinUsingSquareProjMatrixByBin() +{ + set_defaults(); +} + + +void +BackProjectorByBinUsingSquareProjMatrixByBin:: +set_up(const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr) + +{ + proj_matrix_ptr->set_up(proj_data_info_ptr, image_info_ptr); +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/BinNormalisation.cxx b/src/recon_buildblock/BinNormalisation.cxx new file mode 100644 index 0000000000..86deef0d3a --- /dev/null +++ b/src/recon_buildblock/BinNormalisation.cxx @@ -0,0 +1,86 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup normalisation + + \brief Implementation for class stir::BinNormalisation + + \author Kris Thielemans +*/ + + +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/RelatedViewgrams.h" +#include "stir/Bin.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +BinNormalisation:: +~BinNormalisation() +{} + +Succeeded +BinNormalisation:: +set_up(const shared_ptr& ) +{ + return Succeeded::yes; +} + + +void +BinNormalisation::apply(RelatedViewgrams& viewgrams, + const double start_time, const double end_time) const +{ + for (RelatedViewgrams::iterator iter = viewgrams.begin(); iter != viewgrams.end(); ++iter) + { + Bin bin(iter->get_segment_num(),iter->get_view_num(), 0,0); + for (bin.axial_pos_num()= iter->get_min_axial_pos_num(); + bin.axial_pos_num()<=iter->get_max_axial_pos_num(); + ++bin.axial_pos_num()) + for (bin.tangential_pos_num()= iter->get_min_tangential_pos_num(); + bin.tangential_pos_num()<=iter->get_max_tangential_pos_num(); + ++bin.tangential_pos_num()) + (*iter)[bin.axial_pos_num()][bin.tangential_pos_num()] /= + std::max(1.E-20F, get_bin_efficiency(bin, start_time, end_time)); + } +} + +void +BinNormalisation:: +undo(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const +{ + for (RelatedViewgrams::iterator iter = viewgrams.begin(); iter != viewgrams.end(); ++iter) + { + Bin bin(iter->get_segment_num(),iter->get_view_num(), 0,0); + for (bin.axial_pos_num()= iter->get_min_axial_pos_num(); + bin.axial_pos_num()<=iter->get_max_axial_pos_num(); + ++bin.axial_pos_num()) + for (bin.tangential_pos_num()= iter->get_min_tangential_pos_num(); + bin.tangential_pos_num()<=iter->get_max_tangential_pos_num(); + ++bin.tangential_pos_num()) + (*iter)[bin.axial_pos_num()][bin.tangential_pos_num()] *= + this->get_bin_efficiency(bin,start_time, end_time); + } + +} + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/BinNormalisationFromAttenuationImage.cxx b/src/recon_buildblock/BinNormalisationFromAttenuationImage.cxx new file mode 100644 index 0000000000..1e333fa3cb --- /dev/null +++ b/src/recon_buildblock/BinNormalisationFromAttenuationImage.cxx @@ -0,0 +1,183 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup normalisation + + \brief Implementation for class stir::BinNormalisationFromAttenuationImage + + \author Kris Thielemans +*/ + +#include "stir/recon_buildblock/BinNormalisationFromAttenuationImage.h" +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" // used for rescaling attenuation image +#include "stir/RelatedViewgrams.h" +#include "stir/ArrayFunction.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/IO/read_from_file.h" + +START_NAMESPACE_STIR + +const char * const +BinNormalisationFromAttenuationImage::registered_name = + "From Attenuation Image"; + + +void +BinNormalisationFromAttenuationImage::set_defaults() +{ + attenuation_image_ptr.reset(); + forward_projector_ptr.reset(); + attenuation_image_filename = ""; +} + +void +BinNormalisationFromAttenuationImage:: +initialise_keymap() +{ + parser.add_start_key("Bin Normalisation From Attenuation Image"); + parser.add_key("attenuation_image_filename", &attenuation_image_filename); + parser.add_parsing_key("forward projector type", &forward_projector_ptr); + parser.add_stop_key("End Bin Normalisation From Attenuation Image"); +} + +bool +BinNormalisationFromAttenuationImage:: +post_processing() +{ + // read attenuation_image + // we do this only when it isn't initialised yet, as this function can be called from a constructor + if (is_null_ptr(attenuation_image_ptr)) + attenuation_image_ptr = read_from_file >(attenuation_image_filename); + if (is_null_ptr(attenuation_image_ptr)) + { + warning("BinNormalisationFromAttenuationImage could not read attenuation image %s\n", + attenuation_image_filename.c_str()); + return true; + } + if (is_null_ptr(forward_projector_ptr)) + forward_projector_ptr.reset(new ForwardProjectorByBinUsingRayTracing()); + + warning("\nWARNING: BinNormalisationFromAttenuationImage:\n" + "\tattenuation image data are supposed to be in units cm^-1\n" + "\tReference: water has mu .096 cm^-1\n" + "\tMax in attenuation image: %g\n" , + attenuation_image_ptr->find_max()); +#ifndef NEWSCALE + /* + cerr << "WARNING: multiplying attenuation image by x-voxel size " + << " to correct for scale factor in forward projectors...\n"; + */ + // projectors work in pixel units, so convert attenuation data + // from cm^-1 to pixel_units^-1 + const float rescale = + dynamic_cast *>(attenuation_image_ptr.get())-> + get_grid_spacing()[3]/10; +#else + const float rescale = + 0.1F; +#endif + *attenuation_image_ptr *= rescale; + + return false; +} + + +BinNormalisationFromAttenuationImage:: +BinNormalisationFromAttenuationImage() +{ + set_defaults(); +} + +BinNormalisationFromAttenuationImage:: +BinNormalisationFromAttenuationImage(const string& filename, + shared_ptr const& forward_projector_ptr) + : forward_projector_ptr(forward_projector_ptr), + attenuation_image_filename(filename) +{ + attenuation_image_ptr.reset(); + post_processing(); +} + +BinNormalisationFromAttenuationImage:: +BinNormalisationFromAttenuationImage(shared_ptr > const& attenuation_image_ptr, + shared_ptr const& forward_projector_ptr) + : attenuation_image_ptr(attenuation_image_ptr), + forward_projector_ptr(forward_projector_ptr) +{ + post_processing(); +} + +Succeeded +BinNormalisationFromAttenuationImage:: +set_up(const shared_ptr& proj_data_info_ptr) +{ + forward_projector_ptr->set_up(proj_data_info_ptr, attenuation_image_ptr); + return Succeeded::yes; +} + + +void +BinNormalisationFromAttenuationImage::apply(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const +{ + RelatedViewgrams attenuation_viewgrams = viewgrams.get_empty_copy(); + forward_projector_ptr->forward_project(attenuation_viewgrams, *attenuation_image_ptr); + + // TODO cannot use std::transform ? + for (RelatedViewgrams::iterator viewgrams_iter = + attenuation_viewgrams.begin(); + viewgrams_iter != attenuation_viewgrams.end(); + ++viewgrams_iter) + { + in_place_exp(*viewgrams_iter); + } + viewgrams *= attenuation_viewgrams; +} + +void +BinNormalisationFromAttenuationImage:: +undo(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const +{ + RelatedViewgrams attenuation_viewgrams = viewgrams.get_empty_copy(); + forward_projector_ptr->forward_project(attenuation_viewgrams, *attenuation_image_ptr); + + // TODO cannot use std::transform ? + for (RelatedViewgrams::iterator viewgrams_iter = + attenuation_viewgrams.begin(); + viewgrams_iter != attenuation_viewgrams.end(); + ++viewgrams_iter) + { + in_place_exp(*viewgrams_iter); + } + viewgrams /= attenuation_viewgrams; +} + +float +BinNormalisationFromAttenuationImage::get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const +{ + //TODO + error("BinNormalisationFromAttenuationImage::get_bin_efficiency is not implemented"); + return 1; +} + + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/BinNormalisationFromECAT7.cxx b/src/recon_buildblock/BinNormalisationFromECAT7.cxx new file mode 100644 index 0000000000..e8a4fe0ba4 --- /dev/null +++ b/src/recon_buildblock/BinNormalisationFromECAT7.cxx @@ -0,0 +1,661 @@ +// +// +/* + Copyright (C) 2002- 2011, Hammersmith Imanet Ltd + Copyright CTI + This file is part of STIR. + + Some parts of this file originate in CTI code, distributed as + part of the matrix library from Louvain-la-Neuve, and hence carries + its restrictive license. Affected parts are the dead-time correction + in get_dead_time_efficiency and geo_Z_corr related code. + + Most of this file is free software; you can redistribute that part and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup recon_buildblock + \ingroup ECAT + + \brief Implementation for class stir::ecat::ecat7::BinNormalisationFromECAT7 + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +// enable if you want results identical to Peter Bloomfield's normalisation code +// (and hence old versions of Bkproj_3d) +// #define SAME_AS_PETER + +#include "stir/recon_buildblock/BinNormalisationFromECAT7.h" +#include "stir/DetectionPosition.h" +#include "stir/DetectionPositionPair.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/shared_ptr.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/IndexRange2D.h" +#include "stir/IndexRange.h" +#include "stir/Bin.h" +#include "stir/display.h" +#include "stir/is_null_ptr.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::ofstream; +using std::fstream; +#endif + +START_NAMESPACE_STIR +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 + + + +const char * const +BinNormalisationFromECAT7::registered_name = "From ECAT7"; + + +namespace detail +{ + +// +// helper functions used in this class. +// + +static +float +calc_geo_z_correction(const Bin& bin, int span) { + const int rtmp = abs(bin.segment_num() * span) ; + return( 1.0F + ( ( 0.007F - ( 0.000164F * rtmp ) ) * rtmp ) ); +} + + + + +static +int +calc_ring1_plus_ring2(const Bin& bin, + const ProjDataInfoCylindricalNoArcCorr *proj_data_cyl) { + + int segment_num = bin.segment_num(); + + const int min_ring_diff = proj_data_cyl->get_min_ring_difference(segment_num); + const int max_ring_diff = proj_data_cyl->get_max_ring_difference(segment_num); + + const int num_rings = proj_data_cyl->get_scanner_ptr()->get_num_rings(); + + return( (2 * bin.axial_pos_num() - + (proj_data_cyl->get_min_axial_pos_num(segment_num) + + proj_data_cyl->get_max_axial_pos_num(segment_num)) + ) / (min_ring_diff != max_ring_diff ? 2 : 1) + + num_rings - 1 ); + +} + + + +static +void +set_detection_tangential_coords(shared_ptr proj_data_cyl_uncomp, + const Bin& uncomp_bin, + DetectionPositionPair<>& detection_position_pair) { + int det1_num=0; + int det2_num=0; + + proj_data_cyl_uncomp->get_det_num_pair_for_view_tangential_pos_num(det1_num, det2_num, + uncomp_bin.view_num(), + uncomp_bin.tangential_pos_num()); + detection_position_pair.pos1().tangential_coord() = det1_num; + detection_position_pair.pos2().tangential_coord() = det2_num; + +} + + + +// Returns the sum of the two axial coordinates. Or -1 if the ring positions are +// out of range. +// sets axial_coord of detection_position_pair +static +int +set_detection_axial_coords(const ProjDataInfoCylindricalNoArcCorr *proj_data_info_cyl, + int ring1_plus_ring2, const Bin& uncomp_bin, + DetectionPositionPair<>& detection_position_pair) { + + const int num_rings = proj_data_info_cyl->get_scanner_ptr()->get_num_rings(); + + const int ring_diff = uncomp_bin.segment_num(); + + const int ring1 = (ring1_plus_ring2 - ring_diff)/2; + const int ring2 = (ring1_plus_ring2 + ring_diff)/2; + + if (ring1<0 || ring2 < 0 || ring1>=num_rings || ring2 >= num_rings) { + return(-1); + } + + assert((ring1_plus_ring2 + ring_diff)%2 == 0); + assert((ring1_plus_ring2 - ring_diff)%2 == 0); + + detection_position_pair.pos1().axial_coord() = ring1; + detection_position_pair.pos2().axial_coord() = ring2; + + + return(ring1 + ring2); +} + + + +} // end of namespace detail + + + + +// +// Member functions +// + + + +void +BinNormalisationFromECAT7::set_defaults() +{ + this->normalisation_ECAT7_filename = ""; + this->_use_detector_efficiencies = true; + this->_use_dead_time = true; + this->_use_geometric_factors = true; + this->_use_crystal_interference_factors = true; +} + +void +BinNormalisationFromECAT7:: +initialise_keymap() +{ + this->parser.add_start_key("Bin Normalisation From ECAT7"); + // todo remove obsolete keyword + this->parser.add_key("normalisation_ECAT7_filename", &this->normalisation_ECAT7_filename); + this->parser.add_key("normalisation_filename", &this->normalisation_ECAT7_filename); + this->parser.add_parsing_key("singles rates", &this->singles_rates_ptr); + this->parser.add_key("use_detector_efficiencies", &this->_use_detector_efficiencies); + this->parser.add_key("use_dead_time", &this->_use_dead_time); + this->parser.add_key("use_geometric_factors", &this->_use_geometric_factors); + this->parser.add_key("use_crystal_interference_factors", &this->_use_crystal_interference_factors); + this->parser.add_stop_key("End Bin Normalisation From ECAT7"); +} + +bool +BinNormalisationFromECAT7:: +post_processing() +{ + read_norm_data(normalisation_ECAT7_filename); + return false; +} + + +BinNormalisationFromECAT7:: +BinNormalisationFromECAT7() +{ + set_defaults(); +} + +BinNormalisationFromECAT7:: +BinNormalisationFromECAT7(const string& filename) +{ + read_norm_data(filename); +} + +Succeeded +BinNormalisationFromECAT7:: +set_up(const shared_ptr& proj_data_info_ptr_v) +{ + proj_data_info_ptr = proj_data_info_ptr_v; + proj_data_info_cyl_ptr = + dynamic_cast(proj_data_info_ptr.get()); + if (proj_data_info_cyl_ptr==0) + { + warning("BinNormalisationFromECAT7 can only be used on non-arccorrected data\n"); + return Succeeded::no; + } + if (*proj_data_info_ptr->get_scanner_ptr() != *scanner_ptr) + { + warning("BinNormalisationFromECAT7: scanner object from proj data is different from the one " + "from the normalisation file\n"); + return Succeeded::no; + } + + span = + proj_data_info_cyl_ptr->get_max_ring_difference(0) - + proj_data_info_cyl_ptr->get_min_ring_difference(0) + 1; + // TODO insert check all other segments are the same + + mash = scanner_ptr->get_num_detectors_per_ring()/2/proj_data_info_ptr->get_num_views(); + + return Succeeded::yes; +} + +void +BinNormalisationFromECAT7:: +read_norm_data(const string& filename) +{ + + MatrixFile* mptr = matrix_open(filename.c_str(), MAT_READ_ONLY, Norm3d); + if (mptr == 0) + error("BinNormalisationFromECAT7: error opening %s\n", filename.c_str()); + + scanner_ptr.reset( + find_scanner_from_ECAT_system_type(mptr->mhptr->system_type)); + + MatrixData* matrix = matrix_read( mptr, mat_numcod (1, 1, 1, 0, 0), + Norm3d /*= read data as well */); + if (matrix == 0) + error("BinNormalisationFromECAT7: error reading data in %s\n", filename.c_str()); + + Norm3D_subheader * nrm_subheader_ptr = + reinterpret_cast(matrix->shptr); + + num_transaxial_crystals_per_block = nrm_subheader_ptr->num_transaxial_crystals ; + + + // Calculate the number of axial blocks per singles unit and + // total number of blocks per singles unit. + int axial_crystals_per_singles_unit = + scanner_ptr->get_num_axial_crystals_per_singles_unit(); + + int transaxial_crystals_per_singles_unit = + scanner_ptr->get_num_transaxial_crystals_per_singles_unit(); + + int axial_crystals_per_block = + scanner_ptr->get_num_axial_crystals_per_block(); + + int transaxial_crystals_per_block = + scanner_ptr->get_num_transaxial_crystals_per_block(); + + // Axial blocks. + num_axial_blocks_per_singles_unit = + axial_crystals_per_singles_unit / axial_crystals_per_block; + + int transaxial_blocks_per_singles_unit = + transaxial_crystals_per_singles_unit / transaxial_crystals_per_block; + + // Total blocks. + num_blocks_per_singles_unit = + num_axial_blocks_per_singles_unit * transaxial_blocks_per_singles_unit; + + + + if (scanner_ptr->get_num_rings() != nrm_subheader_ptr->num_crystal_rings) + error("BinNormalisationFromECAT7: " + "number of rings determined from subheader is %d, while the scanner object says it is %d\n", + nrm_subheader_ptr->num_crystal_rings, scanner_ptr->get_num_rings()); + if (scanner_ptr->get_num_detectors_per_ring() != nrm_subheader_ptr->crystals_per_ring) + error("BinNormalisationFromECAT7: " + "number of detectors per ring determined from subheader is %d, while the scanner object says it is %d\n", + nrm_subheader_ptr->crystals_per_ring, scanner_ptr->get_num_detectors_per_ring()); + + proj_data_info_cyl_uncompressed_ptr.reset( + dynamic_cast( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span=*/1, scanner_ptr->get_num_rings()-1, + /*num_views,=*/scanner_ptr->get_num_detectors_per_ring()/2, + /*num_tangential_poss=*/nrm_subheader_ptr->num_r_elements, + /*arc_corrected =*/false) + )); + + /* + Extract geometrical & crystal interference, and crystal efficiencies from the + normalisation data. + */ + + // SM 13/02/2003 corrected number of min_tang_pos_num and max_tang_pos_num used get_max_num_non_arccorrected_bins() + // instead of get_num_detectors_per_ring() + //const int min_tang_pos_num = -(scanner_ptr->get_num_detectors_per_ring()/2); + //const int max_tang_pos_num = min_tang_pos_num + scanner_ptr->get_num_detectors_per_ring() - 1; + + const int min_tang_pos_num = -(scanner_ptr->get_max_num_non_arccorrected_bins())/2; + const int max_tang_pos_num = min_tang_pos_num +scanner_ptr->get_max_num_non_arccorrected_bins()- 1; + + /* The order of coefficients is as follows: + 1. geometric_factors (= number_of_corr_planes * number_of_bins) + 2. crystal_interference_factors (num_transaxial_crystals_per_block * number_of_bins) + 3. efficiency_factors (number_of_rings*number_of_crystals ) */ + + geometric_factors = + Array<2,float>(IndexRange2D(0,nrm_subheader_ptr->num_geo_corr_planes-1, + min_tang_pos_num, max_tang_pos_num)); + crystal_interference_factors = + Array<2,float>(IndexRange2D(min_tang_pos_num, max_tang_pos_num, + 0, num_transaxial_crystals_per_block-1)); + // SM 13/02/2003 + efficiency_factors = + Array<2,float>(IndexRange2D(0,scanner_ptr->get_num_rings()-1, + 0, scanner_ptr->get_num_detectors_per_ring()-1)); + + +#if 0 + int geom_test = nrm_subheader_ptr->num_geo_corr_planes * (max_tang_pos_num-min_tang_pos_num +1); + int cry_inter = num_transaxial_crystals_per_block * (max_tang_pos_num-min_tang_pos_num +1); + int eff_test = scanner_ptr->get_num_detectors_per_ring() * scanner_ptr->get_num_rings(); +#endif + + { + float const* data_ptr = reinterpret_cast(matrix->data_ptr); + for (Array<2,float>::full_iterator iter = geometric_factors.begin_all(); + iter != geometric_factors.end_all(); + ) + *iter++ = *data_ptr++; + for (Array<2,float>::full_iterator iter = crystal_interference_factors.begin_all(); + iter != crystal_interference_factors.end_all(); + ) + *iter++ = *data_ptr++; + for (Array<2,float>::full_iterator iter = efficiency_factors.begin_all(); + iter != efficiency_factors.end_all(); + ) + *iter++ = *data_ptr++; + } + // TODO mvoe dead-time stuff to a separate function + /* Set up equation parameters for dead_time correction */ + float *axial_t1 = nrm_subheader_ptr->ring_dtcor1 ; /* 'Paralyzing dead_times' for each axial Xstal */ + float *axial_t2 = nrm_subheader_ptr->ring_dtcor2 ; /* 'Non-paralyzing dead_times' for each axial Xstal */ + /* for 966 + 24 entries for axial_t1 & axial_t2 + Each entry accounts for 2 crystal rings + 0 <= iRing <= 23 for ring 0 --> 47 + */ + axial_t1_array = Array<1,float>(0,scanner_ptr->get_num_rings()/num_axial_blocks_per_singles_unit-1); + axial_t2_array = Array<1,float>(0,scanner_ptr->get_num_rings()/num_axial_blocks_per_singles_unit-1); + + for (Array<1,float>::full_iterator iter = axial_t1_array.begin_all(); + iter != axial_t1_array.end_all();) + *iter++ = *axial_t1++; + + for (Array<1,float>::full_iterator iter = axial_t2_array.begin_all(); + iter != axial_t2_array.end_all();) + *iter++ = *axial_t2++; +#if 0 + // this is currently not used by CTI and hence not by get_dead_time_efficiency + float *trans_t1 = nrm_subheader_ptr->crystal_dtcor ; /* 'Non-paralyzing dead_times' for each transaxial Xstal in block */ + trans_t1_array = Array<1,float>(0,num_transaxial_crystals_per_block-1); + for (Array<1,float>::full_iterator iter = trans_t1_array.begin_all(); + iter != trans_t1_array.end_all();) + *iter++ = *trans_t1++; +#endif + + + free_matrix_data(matrix); + matrix_close(mptr); +#if 0 + // to test pipe the obtained values into file + // char out_name[max_filename_length]; + char name[80]; + ofstream out_geom; + ofstream out_inter; + ofstream out_eff; + out_geom.open("geom_out.txt",ios::out); + out_inter.open("inter_out.txt",ios::out); + out_eff.open("eff_out.txt",ios::out); + + for ( int i = geometric_factors.get_min_index(); i<=geometric_factors.get_max_index();i++) + { + for ( int j =geometric_factors[i].get_min_index(); j <=geometric_factors[i].get_max_index(); j++) + { + out_geom << geometric_factors[i][j] << " " ; + } + out_geom << endl; + } + + + for ( int i = crystal_interference_factors.get_min_index(); i<=crystal_interference_factors.get_max_index();i++) + { + for ( int j =crystal_interference_factors[i].get_min_index(); j <=crystal_interference_factors[i].get_max_index(); j++) + { + out_inter << crystal_interference_factors[i][j] << " " ; + } + out_inter << endl << endl; + } + + for ( int i = efficiency_factors.get_min_index(); i<=efficiency_factors.get_max_index();i++) + { + for ( int j =efficiency_factors[i].get_min_index(); j <=efficiency_factors[i].get_max_index(); j++) + { + out_eff << efficiency_factors[i][j] << " " ; + } + out_eff << endl<< endl; + } + +#endif + +#if 0 + display(geometric_factors, "geo"); + display(efficiency_factors, "eff"); + display(crystal_interference_factors, "crystal_interference_factors"); +#endif +} + +bool +BinNormalisationFromECAT7:: +use_detector_efficiencies() const +{ + return this->_use_detector_efficiencies; +} + +bool +BinNormalisationFromECAT7:: +use_dead_time() const +{ + return this->_use_dead_time; +} + +bool +BinNormalisationFromECAT7:: +use_geometric_factors() const +{ + return this->_use_geometric_factors; +} + +bool +BinNormalisationFromECAT7:: +use_crystal_interference_factors() const +{ + return this->_use_crystal_interference_factors; +} + +#if 1 +float +BinNormalisationFromECAT7:: +get_bin_efficiency(const Bin& bin, const double start_time, const double end_time) const { + + + // TODO disable when not HR+ or HR++ + /* + Additional correction for HR+ and HR++ + ====================================== + Modification of the normalisation based on segment number + Due to the difference in efficiency for the trues and scatter as the axial + angle increases + Scatter has a higher efficiency than trues when the axial angle is 0 (direct + planes) + As the axial angle increase the difference in efficiencies between trues and + scatter become closer + */ + const float geo_Z_corr = detail::calc_geo_z_correction(bin, span); + + + float total_efficiency = 0 ; + + /* Correct dead time */ + const int start_view = bin.view_num() * mash ; + //SM removed bin.view_num() + mash ; + const int end_view = start_view + mash ; + //start_view +mash; + const int min_ring_diff = proj_data_info_cyl_ptr->get_min_ring_difference(bin.segment_num()); + const int max_ring_diff = proj_data_info_cyl_ptr->get_max_ring_difference(bin.segment_num()); + + + /* + ring1_plus_ring2 is the same for any ring pair that contributes to + this particular bin.segment_num(), bin.axial_pos_num(). + We determine it first here. See ProjDataInfoCylindrical for the + relevant formulas + */ + const int ring1_plus_ring2 = detail::calc_ring1_plus_ring2(bin, proj_data_info_cyl_ptr); + + + + DetectionPositionPair<> detection_position_pair; + Bin uncompressed_bin(0,0,0,bin.tangential_pos_num()); + + { + + float view_efficiency = 0.; + + + for(uncompressed_bin.view_num() = start_view; + uncompressed_bin.view_num() < end_view; + ++uncompressed_bin.view_num() ) { + + detail::set_detection_tangential_coords(proj_data_info_cyl_uncompressed_ptr, + uncompressed_bin, detection_position_pair); + + + + float lor_efficiency= 0.; + + /* + loop over ring differences that contribute to bin.segment_num() at the current + bin.axial_pos_num(). + The ring_difference increments with 2 as the other ring differences do + not give a ring pair with this axial_position. This is because + ring1_plus_ring2%2 == ring_diff%2 + (which easily follows by plugging in ring1+ring2 and ring1-ring2). + The starting ring_diff is determined such that the above condition + is satisfied. You can check it by noting that the + start_ring_diff%2 + == (min_ring_diff + (min_ring_diff+ring1_plus_ring2)%2)%2 + == (2*min_ring_diff+ring1_plus_ring2)%2 + == ring1_plus_ring2%2 + */ + for(uncompressed_bin.segment_num() = min_ring_diff + (min_ring_diff+ring1_plus_ring2)%2; + uncompressed_bin.segment_num() <= max_ring_diff; + uncompressed_bin.segment_num()+=2 ) { + + + int geo_plane_num = + detail::set_detection_axial_coords(proj_data_info_cyl_ptr, + ring1_plus_ring2, uncompressed_bin, + detection_position_pair); + if ( geo_plane_num < 0 ) { + // Ring numbers out of range. + continue; + } + + +#ifndef NDEBUG + Bin check_bin; + check_bin.set_bin_value(bin.get_bin_value()); + assert(proj_data_info_cyl_ptr->get_bin_for_det_pos_pair(check_bin, + detection_position_pair) == + Succeeded::yes); + assert(check_bin == bin); +#endif + + const DetectionPosition<>& pos1 = detection_position_pair.pos1(); + const DetectionPosition<>& pos2 = detection_position_pair.pos2(); + + float lor_efficiency_this_pair = 1.F; + if (this->use_detector_efficiencies()) + { + lor_efficiency_this_pair = + efficiency_factors[pos1.axial_coord()][pos1.tangential_coord()] * + efficiency_factors[pos2.axial_coord()][pos2.tangential_coord()]; + } + if (this->use_dead_time()) + { + lor_efficiency_this_pair *= + get_dead_time_efficiency(pos1, start_time, end_time) * + get_dead_time_efficiency(pos2, start_time, end_time); + } + if (this->use_geometric_factors()) + { + lor_efficiency_this_pair *= +#ifdef SAME_AS_PETER + 1.F; +#else // this is 3dbkproj (at the moment) + geometric_factors[geo_plane_num][uncompressed_bin.tangential_pos_num()]; +#endif + } + lor_efficiency += lor_efficiency_this_pair; + } + + if (this->use_crystal_interference_factors()) + { + view_efficiency += lor_efficiency * + crystal_interference_factors[uncompressed_bin.tangential_pos_num()][uncompressed_bin.view_num()%num_transaxial_crystals_per_block] ; + } + else + { + view_efficiency += lor_efficiency; + } + } + + if (this->use_geometric_factors()) + { + /* z==bin.get_axial_pos_num() only when min_axial_pos_num()==0*/ + // for oblique plaanes use the single radial profile from segment 0 + +#ifdef SAME_AS_PETER + const int geo_plane_num = 0; + + total_efficiency += view_efficiency * + geometric_factors[geo_plane_num][uncompressed_bin.tangential_pos_num()] * + geo_Z_corr; +#else + total_efficiency += view_efficiency * geo_Z_corr; +#endif + } + else + { + total_efficiency += view_efficiency; + } + } + return total_efficiency; +} +#endif + + +float +BinNormalisationFromECAT7::get_dead_time_efficiency (const DetectionPosition<>& det_pos, + const double start_time, + const double end_time) const +{ + if (is_null_ptr(singles_rates_ptr)) { + return 1; + } + + // Get singles rate per block (rate per singles unit / blocks per singles unit). + const float rate = singles_rates_ptr->get_singles_rate(det_pos, start_time, end_time) / + num_blocks_per_singles_unit; + + return + ( 1.0F + axial_t1_array[ det_pos.axial_coord()/num_axial_blocks_per_singles_unit] * rate + + axial_t2_array[ det_pos.axial_coord()/num_axial_blocks_per_singles_unit] * rate * rate ); + + //* ( 1. + ( trans_t1_array[ det_pos.tangential_coord() % num_transaxial_crystals_per_block ] * rate ) ) ; + +} + + + +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/BinNormalisationFromProjData.cxx b/src/recon_buildblock/BinNormalisationFromProjData.cxx new file mode 100644 index 0000000000..f2e964c068 --- /dev/null +++ b/src/recon_buildblock/BinNormalisationFromProjData.cxx @@ -0,0 +1,176 @@ +// +// +/* + Copyright (C) 2000- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup normalisation + + \brief Implementation for class stir::BinNormalisationFromProjData + + \author Kris Thielemans +*/ + +#include "stir/recon_buildblock/BinNormalisationFromProjData.h" +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/Succeeded.h" +#include "stir/warning.h" +#include "stir/error.h" +#include + +START_NAMESPACE_STIR + +const char * const +BinNormalisationFromProjData::registered_name = "From ProjData"; + + +void +BinNormalisationFromProjData::set_defaults() +{ + normalisation_projdata_filename = ""; +} + +void +BinNormalisationFromProjData:: +initialise_keymap() +{ + parser.add_start_key("Bin Normalisation From ProjData"); + parser.add_key("normalisation_projdata_filename", &normalisation_projdata_filename); + parser.add_stop_key("End Bin Normalisation From ProjData"); +} + +bool +BinNormalisationFromProjData:: +post_processing() +{ + norm_proj_data_ptr = ProjData::read_from_file(normalisation_projdata_filename); + return false; +} + +BinNormalisationFromProjData:: +BinNormalisationFromProjData() +{ + set_defaults(); +} + +BinNormalisationFromProjData:: +BinNormalisationFromProjData(const string& filename) + : norm_proj_data_ptr(ProjData::read_from_file(filename)) + {} + +BinNormalisationFromProjData:: +BinNormalisationFromProjData(const shared_ptr& norm_proj_data_ptr) + : norm_proj_data_ptr(norm_proj_data_ptr) + {} + +Succeeded +BinNormalisationFromProjData:: +set_up(const shared_ptr& proj_data_info_ptr) +{ + if (*(norm_proj_data_ptr->get_proj_data_info_ptr()) == *proj_data_info_ptr) + return Succeeded::yes; + else + { + const ProjDataInfo& norm_proj = *(norm_proj_data_ptr->get_proj_data_info_ptr()); + const ProjDataInfo& proj = *proj_data_info_ptr; + bool ok = + typeid(norm_proj) == typeid(proj) && + *norm_proj.get_scanner_ptr()== *(proj.get_scanner_ptr()) && + (norm_proj.get_min_view_num()==proj.get_min_view_num()) && + (norm_proj.get_max_view_num()==proj.get_max_view_num()) && + (norm_proj.get_min_tangential_pos_num() ==proj.get_min_tangential_pos_num())&& + (norm_proj.get_max_tangential_pos_num() ==proj.get_max_tangential_pos_num()) && + norm_proj.get_min_segment_num() <= proj.get_min_segment_num() && + norm_proj.get_max_segment_num() <= proj.get_max_segment_num(); + + for (int segment_num=proj.get_min_segment_num(); + ok && segment_num<=proj.get_max_segment_num(); + ++segment_num) + { + ok = + norm_proj.get_min_axial_pos_num(segment_num) == proj.get_min_axial_pos_num(segment_num) && + norm_proj.get_max_axial_pos_num(segment_num) == proj.get_max_axial_pos_num(segment_num); + } + if (ok) + return Succeeded::yes; + else + { + warning(boost::format("BinNormalisationFromProjData: incompatible projection data:\nNorm projdata info:\n%s\nEmission projdata info:\n%s\n--- (end of incompatible projection data info)---\n") + % norm_proj.parameter_info() + % proj.parameter_info()); + return Succeeded::no; + } + } +} + +bool +BinNormalisationFromProjData:: +is_trivial() const +{ + // check if all data is 1 (up to a tolerance of 1e-4) + for (int segment_num = this->norm_proj_data_ptr->get_min_segment_num(); + segment_num <= this->norm_proj_data_ptr->get_max_segment_num(); + ++segment_num) + { + for (int view_num = this->norm_proj_data_ptr->get_min_view_num(); + view_num <= this->norm_proj_data_ptr->get_max_view_num(); + ++view_num) + { + const Viewgram viewgram = + this->norm_proj_data_ptr->get_viewgram(view_num, segment_num); + if (fabs(viewgram.find_min()-1)>.0001 || fabs(viewgram.find_max()-1)>.0001) + return false; // return from function as we know not all data is 1 + } + } + // if we get here. they were all 1 + return true; +} + +void +BinNormalisationFromProjData::apply(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const + { + const ViewSegmentNumbers vs_num=viewgrams.get_basic_view_segment_num(); + shared_ptr symmetries_sptr(viewgrams.get_symmetries_ptr()->clone()); + viewgrams *= + norm_proj_data_ptr->get_related_viewgrams(vs_num,symmetries_sptr, false); + } + +void +BinNormalisationFromProjData:: +undo(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const + { + const ViewSegmentNumbers vs_num=viewgrams.get_basic_view_segment_num(); + shared_ptr symmetries_sptr(viewgrams.get_symmetries_ptr()->clone()); + viewgrams /= + norm_proj_data_ptr->get_related_viewgrams(vs_num,symmetries_sptr, false); + + } + +float +BinNormalisationFromProjData::get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const +{ + //TODO + error("BinNormalisationFromProjData::get_bin_efficiency is not implemented"); + return 1; + +} + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/CMakeLists.txt b/src/recon_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..5516f46986 --- /dev/null +++ b/src/recon_buildblock/CMakeLists.txt @@ -0,0 +1,110 @@ +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. + +set(dir recon_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + ForwardProjectorByBin + ForwardProjectorByBinUsingRayTracing + ForwardProjectorByBinUsingRayTracing_Siddon + BackProjectorByBin + BackProjectorByBinUsingInterpolation + BackProjectorByBinUsingInterpolation_linear + BackProjectorByBinUsingInterpolation_piecewise_linear + Reconstruction + AnalyticReconstruction + IterativeReconstruction + distributable + DataSymmetriesForBins + DataSymmetriesForDensels + TrivialDataSymmetriesForBins + DataSymmetriesForBins_PET_CartesianGrid + SymmetryOperation + SymmetryOperations_PET_CartesianGrid + ProjMatrixElemsForOneBin + ProjMatrixElemsForOneDensel + ProjMatrixByBin + ProjMatrixByBinUsingRayTracing + ProjMatrixByBinUsingInterpolation + ProjMatrixByBinFromFile + ProjMatrixByBinSPECTUB + SPECTUB_Tools + SPECTUB_Weight3d + ForwardProjectorByBinUsingProjMatrixByBin + BackProjectorByBinUsingProjMatrixByBin + BackProjectorByBinUsingSquareProjMatrixByBin + RayTraceVoxelsOnCartesianGrid + ProjectorByBinPair + ProjectorByBinPairUsingProjMatrixByBin + ProjectorByBinPairUsingSeparateProjectors + BinNormalisation + ChainedBinNormalisation + BinNormalisationFromProjData + TrivialBinNormalisation + BinNormalisationFromAttenuationImage + GeneralisedPrior + ProjDataRebinning + FourierRebinning + QuadraticPrior + FilterRootPrior + GeneralisedObjectiveFunction + PoissonLogLikelihoodWithLinearModelForMean + PoissonLogLikelihoodWithLinearModelForMeanAndProjData + PoissonLogLikelihoodWithLinearModelForMeanAndListModeData + PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin + PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData + PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion + PoissonNestedLogLikelihoodWithLinearKineticModelAndDynamicProjectionData + PoissonNestedLogLikelihoodWithGeneralizedPatlakAndDynamicProjectionData + PoissonNestedLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion + PoissonNestedLogLikelihoodWithLinearModelForMeanAndConvolvedProjDataWithMotion +) + +if (HAVE_ECAT) + list(APPEND ${dir_LIB_SOURCES} + BinNormalisationFromECAT7 + ) +endif() + +if(STIR_MPI) +set(${dir_LIB_SOURCES} + ${${dir_LIB_SOURCES}} + distributableMPICacheEnabled + distributed_functions + DistributedWorker + DistributedCachingInformation + distributed_test_functions +) +endif() + +include(stir_lib_target) + + +if (STIR_MPI) + target_link_libraries(recon_buildblock ${MPI_CXX_LIBRARIES}) +endif() + +# TODO what to do with IO? +# modelling_buildblock currently needed for ParametricDensity and Patlak (TODO get rid of this somehow?) +target_link_libraries(recon_buildblock modelling_buildblock display numerics_buildblock listmode_buildblock data_buildblock buildblock spatial_transformation_buildblock ) + + + diff --git a/src/recon_buildblock/ChainedBinNormalisation.cxx b/src/recon_buildblock/ChainedBinNormalisation.cxx new file mode 100644 index 0000000000..65cb120adb --- /dev/null +++ b/src/recon_buildblock/ChainedBinNormalisation.cxx @@ -0,0 +1,125 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup normalisation + + \brief Implementation for class ChainedBinNormalisation + + \author Kris Thielemans +*/ + + +#include "stir/recon_buildblock/ChainedBinNormalisation.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + +const char * const +ChainedBinNormalisation::registered_name = "Chained"; + +void +ChainedBinNormalisation::set_defaults() +{ + apply_first.reset(); + apply_second.reset(); +} + +void +ChainedBinNormalisation:: +initialise_keymap() +{ + parser.add_start_key("Chained Bin Normalisation Parameters"); + parser.add_parsing_key("Bin Normalisation to apply first", &apply_first); + parser.add_parsing_key("Bin Normalisation to apply second", &apply_second); + parser.add_stop_key("END Chained Bin Normalisation Parameters");} + +bool +ChainedBinNormalisation:: +post_processing() +{ + return false; +} + + +ChainedBinNormalisation:: +ChainedBinNormalisation() +{ + set_defaults(); +} + +ChainedBinNormalisation:: +ChainedBinNormalisation(shared_ptr const& apply_first_v, + shared_ptr const& apply_second_v) + : apply_first(apply_first_v), + apply_second(apply_second_v) +{ + post_processing(); +} + +Succeeded +ChainedBinNormalisation:: +set_up(const shared_ptr& proj_data_info_ptr) +{ + if (!is_null_ptr(apply_first)) + if (apply_first->set_up(proj_data_info_ptr) == Succeeded::no) + return Succeeded::no; + if (!is_null_ptr(apply_second)) + return apply_second->set_up(proj_data_info_ptr); + else + return Succeeded::yes; +} + + +void +ChainedBinNormalisation::apply(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const +{ + if (!is_null_ptr(apply_first)) + apply_first->apply(viewgrams,start_time,end_time); + if (!is_null_ptr(apply_second)) + apply_second->apply(viewgrams,start_time,end_time); +} + +void +ChainedBinNormalisation:: +undo(RelatedViewgrams& viewgrams,const double start_time, const double end_time) const +{ + if (!is_null_ptr(apply_first)) + apply_first->undo(viewgrams,start_time,end_time); + if (!is_null_ptr(apply_second)) + apply_second->undo(viewgrams,start_time,end_time); +} + +float +ChainedBinNormalisation:: get_bin_efficiency(const Bin& bin,const double start_time, const double end_time) const +{ + return + (!is_null_ptr(apply_first) + ? apply_first->get_bin_efficiency(bin,start_time,end_time) + : 1) + * + (!is_null_ptr(apply_second) + ? apply_second->get_bin_efficiency(bin,start_time,end_time) + : 1); +} + + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/DataSymmetriesForBins.cxx b/src/recon_buildblock/DataSymmetriesForBins.cxx new file mode 100644 index 0000000000..7f903f41c7 --- /dev/null +++ b/src/recon_buildblock/DataSymmetriesForBins.cxx @@ -0,0 +1,158 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup symmetries + + \brief implementations for class stir::DataSymmetriesForBins + + \author Kris Thielemans + \author PARAPET project + +*/ + +#include "stir/recon_buildblock/DataSymmetriesForBins.h" +#include "stir/Bin.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/BasicCoordinate.h" +#include "stir/recon_buildblock/SymmetryOperation.h" + +START_NAMESPACE_STIR + +DataSymmetriesForBins:: +~DataSymmetriesForBins() +{} + +DataSymmetriesForBins:: +DataSymmetriesForBins(const shared_ptr& proj_data_info_ptr) +: proj_data_info_ptr(proj_data_info_ptr) +{} + +bool +DataSymmetriesForBins:: +blindly_equals(const root_type * const sym_ptr) const +{ + if (!base_type::blindly_equals(sym_ptr)) + return false; + + return + *this->proj_data_info_ptr == + *static_cast(*sym_ptr).proj_data_info_ptr; +} + + +/*! default implementation in terms of get_related_bins, will be slow of course */ +int +DataSymmetriesForBins::num_related_bins(const Bin& b) const +{ + vector rel_b; + get_related_bins(rel_b, b); + return rel_b.size(); +} + +/*! default implementation in terms of find_symmetry_operation_from_basic_bin */ +bool DataSymmetriesForBins::find_basic_bin(Bin& b) const +{ + auto_ptr sym_op = + find_symmetry_operation_from_basic_bin(b); + return sym_op->is_trivial(); +} + + +bool +DataSymmetriesForBins:: +is_basic(const Bin& b) const +{ + Bin copy = b; + return !find_basic_bin(copy); +} + +/*! default implementation in terms of get_related_bins_factorised */ +void +DataSymmetriesForBins:: +get_related_bins(vector& rel_b, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ +#ifndef NDEBUG + Bin bin_copy = b; + assert(!find_basic_bin(bin_copy)); +#endif + + vector vs; + vector ax_tang_poss; + + get_related_bins_factorised(ax_tang_poss, b, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + + get_related_view_segment_numbers(vs, ViewSegmentNumbers(b.view_num(), b.segment_num())); + + rel_b.reserve(ax_tang_poss.size() * vs.size()); + rel_b.resize(0); + + for ( +#ifdef _MSC_VER + // VC bug work-around... + std:: +#endif + vector::const_iterator view_seg_ptr = vs.begin(); + view_seg_ptr != vs.end(); + ++view_seg_ptr) + { + for ( +#ifdef _MSC_VER + // VC bug work-around... + std:: +#endif + vector::const_iterator ax_tang_pos_ptr = ax_tang_poss.begin(); + ax_tang_pos_ptr != ax_tang_poss.end(); + ++ax_tang_pos_ptr) + { + rel_b.push_back(Bin(view_seg_ptr->segment_num(), view_seg_ptr->view_num(), + (*ax_tang_pos_ptr)[1], (*ax_tang_pos_ptr)[2])); + } + } +} + +auto_ptr +DataSymmetriesForBins:: +find_symmetry_operation_from_basic_view_segment_numbers(ViewSegmentNumbers& vs) const +{ + Bin bin(vs.segment_num(), vs.view_num(),0,0); +#ifndef NDEBUG + Bin bin_copy = bin; +#endif + + auto_ptr sym_op = + find_symmetry_operation_from_basic_bin(bin); + vs.segment_num() = bin.segment_num(); + vs.view_num() = bin.view_num(); + +#ifndef NDEBUG + sym_op->transform_bin_coordinates(bin); + assert(bin == bin_copy); +#endif + + return sym_op; +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.cxx b/src/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.cxx new file mode 100644 index 0000000000..e13700dae9 --- /dev/null +++ b/src/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.cxx @@ -0,0 +1,258 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup symmetries + \brief non-inline implementations for class stir::DataSymmetriesForBins_PET_CartesianGrid + + \author Kris Thielemans + \author PARAPET project + +*/ +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/shared_ptr.h" +#include "stir/round.h" +#include + +START_NAMESPACE_STIR + +//! find correspondence between axial_pos_num and image coordinates +/*! z = num_planes_per_axial_pos * axial_pos_num + axial_pos_to_z_offset + compute the offset by matching up the centre of the scanner + in the 2 coordinate systems +*/ +static void +find_relation_between_coordinate_systems(int& num_planes_per_scanner_ring, + VectorWithOffset& num_planes_per_axial_pos, + VectorWithOffset& axial_pos_to_z_offset, + const ProjDataInfoCylindrical* proj_data_info_cyl_ptr, + const DiscretisedDensityOnCartesianGrid<3,float> * cartesian_grid_info_ptr) + +{ + + const int min_segment_num = proj_data_info_cyl_ptr->get_min_segment_num(); + const int max_segment_num = proj_data_info_cyl_ptr->get_max_segment_num(); + + num_planes_per_axial_pos = VectorWithOffset(min_segment_num, max_segment_num); + axial_pos_to_z_offset = VectorWithOffset(min_segment_num, max_segment_num); + + // TODO and WARNING: get_grid_spacing()[1] is z() + const float image_plane_spacing = cartesian_grid_info_ptr->get_grid_spacing()[1]; + + { + const float num_planes_per_scanner_ring_float = + proj_data_info_cyl_ptr->get_ring_spacing() / image_plane_spacing; + + num_planes_per_scanner_ring = round(num_planes_per_scanner_ring_float); + + if (fabs(num_planes_per_scanner_ring_float - num_planes_per_scanner_ring) > 1.E-2) + error("DataSymmetriesForBins_PET_CartesianGrid can currently only support z-grid spacing " + "equal to the ring spacing of the scanner divided by an integer. Sorry\n"); + } + + /* disabled as we support this now + if (fabs( cartesian_grid_info_ptr->get_origin().x()) > 1.E-2) + error("DataSymmetriesForBins_PET_CartesianGrid can currently only support x-origin = 0 " + "Sorry\n"); + if (fabs( cartesian_grid_info_ptr->get_origin().y()) > 1.E-2) + error("DataSymmetriesForBins_PET_CartesianGrid can currently only support y-origin = 0 " + "Sorry\n"); + */ + + for (int segment_num=min_segment_num; segment_num<=max_segment_num; ++segment_num) + { + { + const float + num_planes_per_axial_pos_float = + proj_data_info_cyl_ptr->get_axial_sampling(segment_num)/image_plane_spacing; + + num_planes_per_axial_pos[segment_num] = round(num_planes_per_axial_pos_float); + + if (fabs(num_planes_per_axial_pos_float - num_planes_per_axial_pos[segment_num]) > 1.E-5) + error("DataSymmetriesForBins_PET_CartesianGrid can currently only support z-grid spacing " + "equal to the axial sampling in the projection data divided by an integer. Sorry\n"); + + } + + const float delta = proj_data_info_cyl_ptr->get_average_ring_difference(segment_num); + + // KT 20/06/2001 take origin.z() into account + axial_pos_to_z_offset[segment_num] = + (cartesian_grid_info_ptr->get_max_index() + cartesian_grid_info_ptr->get_min_index())/2.F + - cartesian_grid_info_ptr->get_origin().z()/image_plane_spacing + - + (num_planes_per_axial_pos[segment_num] + *(proj_data_info_cyl_ptr->get_max_axial_pos_num(segment_num) + + proj_data_info_cyl_ptr->get_min_axial_pos_num(segment_num)) + + num_planes_per_scanner_ring*delta)/2; + } +} + +/*! The DiscretisedDensity pointer has to point to an object of + type DiscretisedDensityOnCartesianGrid (or a derived type). + + We really need only the geometrical info from the image. At the moment + we have to use the data itself as well. +*/ +DataSymmetriesForBins_PET_CartesianGrid:: +DataSymmetriesForBins_PET_CartesianGrid +( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr, + const bool do_symmetry_90degrees_min_phi_v, + const bool do_symmetry_180degrees_min_phi_v, + const bool do_symmetry_swap_segment_v, + const bool do_symmetry_swap_s_v, + const bool do_symmetry_shift_z +) + : DataSymmetriesForBins(proj_data_info_ptr), + do_symmetry_90degrees_min_phi(do_symmetry_90degrees_min_phi_v), + do_symmetry_180degrees_min_phi(do_symmetry_90degrees_min_phi_v || do_symmetry_180degrees_min_phi_v), + do_symmetry_swap_segment(do_symmetry_swap_segment_v), + do_symmetry_swap_s(do_symmetry_swap_s_v), + do_symmetry_shift_z(do_symmetry_shift_z) +{ + if(dynamic_cast(proj_data_info_ptr.get()) == NULL) + error("DataSymmetriesForBins_PET_CartesianGrid constructed with wrong type of ProjDataInfo: %s\n" + "(can only handle projection data corresponding to a cylinder)\n", + typeid(*proj_data_info_ptr).name()); + + const DiscretisedDensityOnCartesianGrid<3,float> * + cartesian_grid_info_ptr = + dynamic_cast *> + (image_info_ptr.get()); + + if (cartesian_grid_info_ptr == NULL) + error("DataSymmetriesForBins_PET_CartesianGrid constructed with wrong type of image info: %s\n", + typeid(*image_info_ptr).name()); + + // WARNING get_grid_spacing()[1] == z + const float z_origin_in_planes = + image_info_ptr->get_origin().z()/cartesian_grid_info_ptr->get_grid_spacing()[1]; + // z_origin_in_planes should be an integer + if (fabs(round(z_origin_in_planes) - z_origin_in_planes) > 1.E-3F) + error("DataSymmetriesForBins_PET_CartesianGrid: the shift in the " + "z-direction of the origin (which is %g) should be a multiple of the plane " + "separation (%g)\n", + image_info_ptr->get_origin().z(), cartesian_grid_info_ptr->get_grid_spacing()[1]); + + + // check if unequal voxel size in x,y, if so, use less symmetry + if (fabs(cartesian_grid_info_ptr->get_grid_spacing()[2]- + cartesian_grid_info_ptr->get_grid_spacing()[3])>2.E-3F) + do_symmetry_90degrees_min_phi = false; + + num_views= proj_data_info_ptr->get_num_views(); + + if (num_views%4!=0) + do_symmetry_90degrees_min_phi = false; + + if (num_views%2!=0) + do_symmetry_180degrees_min_phi = false; + + // check on segment symmetry + if (fabs(proj_data_info_ptr->get_tantheta(Bin(0,0,0,0)))> 1.E-4F) + error("DataSymmetriesForBins_PET_CartesianGrid can only handle projection data " + "with segment 0 corresponding to direct planes (i.e. theta==0)\n"); + + for (int segment_num=1; + segment_num<= min(proj_data_info_ptr->get_max_segment_num(), + -proj_data_info_ptr->get_min_segment_num()); + ++segment_num) + if (fabs(proj_data_info_ptr->get_tantheta(Bin(segment_num,0,0,0)) + + proj_data_info_ptr->get_tantheta(Bin(-segment_num,0,0,0))) > 1.E-4F) + error("DataSymmetriesForBins_PET_CartesianGrid can only handle projection data " + "with negative segment numbers corresponding to -theta of the positive segments. " + "This is not true for segment pair %d.\n", + segment_num); + + //feable check on s-symmetry + if (fabs(proj_data_info_ptr->get_s(Bin(0,0,0,1)) + + proj_data_info_ptr->get_s(Bin(0,0,0,-1))) > 1.E-4F) + error("DataSymmetriesForBins_PET_CartesianGrid can only handle projection data " + "with tangential_pos_num s.t. get_s(...,tang_pos_num)==-get_s(...,-tang_pos_num)\n"); + + if (fabs(image_info_ptr->get_origin().x())>.01F || fabs(image_info_ptr->get_origin().y())>.01F) + { + // disable symmetries with shifted images + if (this->do_symmetry_90degrees_min_phi|| + this->do_symmetry_180degrees_min_phi|| + this->do_symmetry_swap_segment|| + this->do_symmetry_swap_s) + { + warning("Disabling symmetries in transaxial plane as image is shifted"); + this->do_symmetry_90degrees_min_phi = + this->do_symmetry_180degrees_min_phi = + this->do_symmetry_swap_segment = + this->do_symmetry_swap_s = false; + } + } + + find_relation_between_coordinate_systems(num_planes_per_scanner_ring, + num_planes_per_axial_pos, + axial_pos_to_z_offset, + static_cast(proj_data_info_ptr.get()), + cartesian_grid_info_ptr); +} + + +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + DataSymmetriesForBins_PET_CartesianGrid * +#else + DataSymmetriesForViewSegmentNumbers * +#endif +DataSymmetriesForBins_PET_CartesianGrid:: +clone() const +{ + return new DataSymmetriesForBins_PET_CartesianGrid(*this); +} + + +bool +DataSymmetriesForBins_PET_CartesianGrid:: +operator==(const DataSymmetriesForBins_PET_CartesianGrid& sym) const +{ + if (!base_type::operator==(sym)) + return false; + + return + this->do_symmetry_90degrees_min_phi == sym.do_symmetry_90degrees_min_phi && + this->do_symmetry_180degrees_min_phi == sym.do_symmetry_180degrees_min_phi && + this->do_symmetry_swap_segment == sym.do_symmetry_swap_segment && + this->do_symmetry_swap_s == sym.do_symmetry_swap_s && + this->do_symmetry_shift_z == sym.do_symmetry_shift_z && + this->num_views == sym.num_views && + this->num_planes_per_scanner_ring == sym.num_planes_per_scanner_ring && + this->num_planes_per_axial_pos == sym.num_planes_per_axial_pos && + this->axial_pos_to_z_offset == sym.axial_pos_to_z_offset; +} + +bool +DataSymmetriesForBins_PET_CartesianGrid:: +blindly_equals(const root_type * const that_ptr) const +{ + assert(dynamic_cast(that_ptr) != 0); + return + this->operator==(static_cast(*that_ptr)); +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/DataSymmetriesForDensels.cxx b/src/recon_buildblock/DataSymmetriesForDensels.cxx new file mode 100644 index 0000000000..d5658bb3be --- /dev/null +++ b/src/recon_buildblock/DataSymmetriesForDensels.cxx @@ -0,0 +1,87 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup symmetries + + \brief implementations for class stir::DataSymmetriesForDensels + + \author Kris Thielemans + \author PARAPET project + + +*/ + +#include "stir/recon_buildblock/DataSymmetriesForDensels.h" +#include "stir/Densel.h" +#include "stir/recon_buildblock/SymmetryOperation.h" +#include + +START_NAMESPACE_STIR + +DataSymmetriesForDensels:: +DataSymmetriesForDensels() +{} + +/*! Default implementation always returns \c true. Needs to be overloaded. + */ +bool +DataSymmetriesForDensels:: +blindly_equals(const root_type * const) const +{ + return true; +} + +bool +DataSymmetriesForDensels:: +operator ==(const root_type& that) const +{ + return + typeid(*this) == typeid(that) && + this->blindly_equals(&that); +} + +bool +DataSymmetriesForDensels:: +operator !=(const root_type& that) const +{ + return !((*this) == that); +} + +/*! default implementation in terms of get_related_densels, will be slow of course */ +int +DataSymmetriesForDensels::num_related_densels(const Densel& b) const +{ + vector rel_b; + get_related_densels(rel_b, b); + return rel_b.size(); +} + +/*! default implementation in terms of find_symmetry_operation_from_basic_densel */ +bool DataSymmetriesForDensels::find_basic_densel(Densel& b) const +{ + auto_ptr sym_op = + find_symmetry_operation_from_basic_densel(b); + return sym_op->is_trivial(); +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/DistributedCachingInformation.cxx b/src/recon_buildblock/DistributedCachingInformation.cxx new file mode 100644 index 0000000000..f899d9bfbc --- /dev/null +++ b/src/recon_buildblock/DistributedCachingInformation.cxx @@ -0,0 +1,184 @@ +// +// +/* + Copyright (C) 2007- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup recon_buildblock + + \brief Implementation of class stir::DistributedCachingInformation + + \author Tobias Beisel + \author Kris Thielemans +*/ + + +#include "stir/recon_buildblock/DistributedCachingInformation.h" +#include "stir/recon_buildblock/distributed_functions.h" + +START_NAMESPACE_STIR + +DistributedCachingInformation::DistributedCachingInformation(const int num_workers_v) + : num_workers(num_workers_v) +{ + initialise(); +} + + +DistributedCachingInformation::~DistributedCachingInformation() +{ +} + +void DistributedCachingInformation::initialise() +{ + //initialize vector sizes + this->proc_vs_nums.resize(this->num_workers); + for (int i=0; inum_workers; i++) + this->proc_vs_nums[i].resize(0); + + this->vs_nums_to_process.resize(0); + this->initialise_new_subiteration(this->vs_nums_to_process); +} + +void DistributedCachingInformation::initialise_new_subiteration(const std::vector& vs_nums_to_process_v) +{ + this->vs_nums_to_process= vs_nums_to_process_v; + this->set_all_vs_num_unprocessed(); +} + +void DistributedCachingInformation::set_all_vs_num_unprocessed() +{ + this->still_to_process.resize(this->vs_nums_to_process.size()); + std::fill(this->still_to_process.begin(), this->still_to_process.end(), true); +} + +int DistributedCachingInformation::find_vs_num_position_in_list_to_process(const ViewSegmentNumbers& vs_num) const +{ + std::vector::const_iterator iter = + std::find(this->vs_nums_to_process.begin(), this->vs_nums_to_process.end(), vs_num); + if (iter== this->vs_nums_to_process.end()) + error("Internal error: asked for vs_num that is not in the list"); + return iter - this->vs_nums_to_process.begin(); +} + +int DistributedCachingInformation::find_position_of_first_unprocessed() const +{ + std::vector::const_iterator iter = + std::find(this->still_to_process.begin(), this->still_to_process.end(), true); + if (iter== this->still_to_process.end()) + error("Internal error: asked for unprocessed, but all done"); + return iter - this->still_to_process.begin(); +} + +void DistributedCachingInformation::set_processed(const ViewSegmentNumbers& vs_num) +{ + this->still_to_process[this->find_vs_num_position_in_list_to_process(vs_num)]=false; +} + +bool DistributedCachingInformation::is_still_to_be_processed(const ViewSegmentNumbers& vs_num) const +{ + std::vector::const_iterator iter = + std::find(this->vs_nums_to_process.begin(), this->vs_nums_to_process.end(), vs_num); + if (iter== this->vs_nums_to_process.end()) + return false; + else + return this->still_to_process[iter - this->vs_nums_to_process.begin()]; +} + +void DistributedCachingInformation::add_vs_num_to_proc(int proc, const ViewSegmentNumbers& vs_num) +{ + this->proc_vs_nums[proc].push_back(vs_num); + this->set_processed(vs_num); +} + +int DistributedCachingInformation::get_num_remaining_cached_data_to_process(int proc) const +{ + int cnt = 0; + for (std::vector::const_iterator iter=this->proc_vs_nums[proc].begin(); + iter!=this->proc_vs_nums[proc].end(); ++ iter) + { + if (this->is_still_to_be_processed(*iter)) + cnt++; + } + return cnt; +} + +bool DistributedCachingInformation::get_oldest_unprocessed_vs_num(ViewSegmentNumbers& vs, int proc) const +{ + //find unprocessed vs_num + for (std::vector::const_iterator iter=this->proc_vs_nums[proc].begin(); + iter!=this->proc_vs_nums[proc].end(); ++ iter) + { + if (this->is_still_to_be_processed(*iter)) + { + vs=*iter; + return true; + } + } + + return false; +} + +bool DistributedCachingInformation::get_unprocessed_vs_num(ViewSegmentNumbers& vs, int proc) +{ + const bool in_cache = this->get_oldest_unprocessed_vs_num(vs, proc); + if (!in_cache) + { + // no cached unprocessed data found + // get work from worker with most work left + vs = this->get_vs_num_of_proc_with_most_work_left(proc); + } + + this->add_vs_num_to_proc(proc, vs); + return !in_cache; +} + +ViewSegmentNumbers DistributedCachingInformation::get_vs_num_of_proc_with_most_work_left(int proc) const +{ + int proc_with_max_work=0; + int max_work=0; + + //find processor with most work left + for (int i=0; inum_workers;i++) + { + if (i==proc) continue; + const int cnt = this->get_num_remaining_cached_data_to_process(i); + if (cnt>max_work) + { + max_work=cnt; + proc_with_max_work = i; + } + } + + ViewSegmentNumbers vs; + //get vs_number of the processor with most work left + if (max_work>0) + { + this->get_oldest_unprocessed_vs_num(vs, proc_with_max_work); + } + else + { + // just return first unprocessed + vs = this->vs_nums_to_process[this->find_position_of_first_unprocessed()]; + } + + return vs; +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/DistributedWorker.cxx b/src/recon_buildblock/DistributedWorker.cxx new file mode 100644 index 0000000000..8ae95cb607 --- /dev/null +++ b/src/recon_buildblock/DistributedWorker.cxx @@ -0,0 +1,429 @@ +/* + Copyright (C) 2007- 2012, Hammersmith Imanet Ltd + Copyright (C) 2013-2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup distributable + + \brief Implementation of stir::DistributedWorker() + + \author Tobias Beisel + \author Kris Thielemans + \author Alexey Zverovich (idea of using main() function) +*/ +#include "stir/recon_buildblock/DistributedWorker.h" +#include "stir/recon_buildblock/distributed_functions.h" +#include "stir/recon_buildblock/distributed_test_functions.h" +#include "stir/ExamInfo.h" +#include "stir/Viewgram.h" +#include "stir/RelatedViewgrams.h" +#include "stir/DataSymmetriesForViewSegmentNumbers.h" + +#include "stir/ProjDataInMemory.h" +#include "stir/DiscretisedDensity.h" +#include "stir/HighResWallClockTimer.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" +#include "stir/info.h" +#include +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" // needed for RPC functions +#include + +#include "stir/recon_buildblock/distributable_main.h" + +int main(int argc, char **argv) +{ + + int return_value = EXIT_FAILURE; + try + { +#ifndef STIR_MPI + return stir::distributable_main(argc, argv); +#else + + //processor-id within parallel Communicator + int my_rank; + + //saves the name of a processor + char processor_name[MPI_MAX_PROCESSOR_NAME]; + //length of the processor-name + int namelength; + + MPI_Init(&argc, &argv) ; /*Initializes the start up for MPI*/ + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank) ; /*Gets the rank of the Processor*/ + MPI_Comm_size(MPI_COMM_WORLD, &distributed::num_processors) ; /*Finds the number of processes being used*/ + MPI_Get_processor_name(processor_name, &namelength); + + stir::info(boost::format("Process %d of %d on %s") + % my_rank % distributed::num_processors % processor_name); + + //master + if (my_rank==0) + { + if (distributed::num_processors<2) + { + stir::error("STIR MPI processing needs more than 1 processor"); + return_value = EXIT_FAILURE; + } + else + { + return_value=stir::distributable_main(argc, argv); + if (distributed::total_rpc_time_slaves!=0) + stir::info(boost::format("Total time used for RPC-processing: %1%") % + distributed::total_rpc_time_slaves); + } + } + else //slaves + { + //create Slave Object + stir::DistributedWorker > worker; + + //start Slave Process: + worker.start(); + return_value = EXIT_SUCCESS; + } +#endif + + } + catch (string& error_string) + { + // don't print yet, as error() already does that at the moment + // std::cerr << error_string << std::endl; + return_value = EXIT_FAILURE; + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + return_value = EXIT_FAILURE; + } +#ifdef STIR_MPI + MPI_Finalize(); +#endif + return return_value; +} + + +namespace stir +{ + + template + DistributedWorker::DistributedWorker() + { + this->set_defaults(); + MPI_Comm_rank(MPI_COMM_WORLD, &this->my_rank) ; /*Gets the rank of the Processor*/ + } + + template + DistributedWorker::~DistributedWorker() + { + } + + template + void DistributedWorker::set_defaults() + { + log_likelihood_ptr=NULL; + zero_seg0_end_planes=false; + cache_enabled=false; + } + + template + void DistributedWorker::start() + { + + // keep-on waiting for new tasks + while (true) + { + //Receive task broadcasted by Master + const int task_id = distributed::receive_int_value(-1); + + switch(task_id) + { + case task_stop_processing: // done with processing + { + return; + } + + case task_setup_distributable_computation: + { + this->setup_distributable_computation(); + break; + } + + case task_do_distributable_gradient_computation: + { + this->distributable_computation(RPC_process_related_viewgrams_gradient); + break; + } + case task_do_distributable_loglikelihood_computation: + { + this->distributable_computation(RPC_process_related_viewgrams_accumulate_loglikelihood); + break; + } + /* + case task_do_distributable_sensitivity_computation;break; + */ + default: + { + error("Internal error: Slave %d received unknown task-id %d", this->my_rank, task_id); + } + } // end switch task_id + } // infinite loop + } + + template + void DistributedWorker::setup_distributable_computation() + { + //Receive zero_seg_end_planes + this->zero_seg0_end_planes = distributed::receive_bool_value(-1,-1); + + //receive target image pointer + distributed::receive_and_set_image_parameters(this->target_sptr, image_buffer_size, -1, 0); + + //Receive input_image values + MPI_Status status; + status = distributed::receive_image_values_and_fill_image_ptr(this->target_sptr, this->image_buffer_size, 0); + //construct exam_info_ptr and projection_data_info_ptr + distributed::receive_and_construct_exam_and_proj_data_info_ptr(this->exam_info_sptr, this->proj_data_info_sptr, 0); + + //initialize projectors and call set_up + distributed::receive_and_initialize_projectors(this->proj_pair_sptr, 0); + + proj_pair_sptr->set_up(this->proj_data_info_sptr, this->target_sptr); + + //some values to configure tests + int configurations[4]; + status=distributed::receive_int_values(configurations, 4, distributed::STIR_MPI_CONF_TAG); + + status=distributed::receive_double_values(&distributed::min_threshold, 1, distributed::STIR_MPI_CONF_TAG); + + (configurations[0]==1)?distributed::test=true:distributed::test=false; + (configurations[1]==1)?distributed::test_send_receive_times=true:distributed::test_send_receive_times=false; + (configurations[2]==1)?distributed::rpc_time=true:distributed::rpc_time=false; + (configurations[3]==1)?cache_enabled=true:cache_enabled=false; + +#ifndef NDEBUG + if (distributed::test && my_rank==1) distributed::test_parameter_info_slave(proj_pair_sptr->stir::ParsingObject::parameter_info()); +#endif + +#if 0 + //create new Object of objective_function (but no longer used, so commented out) + shared_ptr > objective_function_ptr = + new PoissonLogLikelihoodWithLinearModelForMeanAndProjData(); + + //set values in objective_function + objective_function_ptr->set_zero_seg0_end_planes(zero_seg0_end_planes); + objective_function_ptr->set_projector_pair_sptr(proj_pair_sptr); +#endif + + // reset cache-stores, they will be initialised if we need them + this->proj_data_ptr.reset(); + this->binwise_correction.reset(); + this->mult_proj_data_sptr.reset(); + } // set_up + + template + void DistributedWorker:: + distributable_computation(RPC_process_related_viewgrams_type * RPC_process_related_viewgrams) + { + shared_ptr input_image_ptr = this->target_sptr; // use the target_sptr member as we don't need its values anyway + + shared_ptr + symmetries_sptr(this->proj_pair_sptr->get_symmetries_used()->clone()); + +#ifndef NDEBUG + if (distributed::test && my_rank==1) + { + distributed::test_image_estimate_slave(); + distributed::test_parameter_info_slave(proj_data_info_sptr->parameter_info()); + distributed::test_bool_value_slave(); + distributed::test_int_value_slave(); + distributed::test_int_values_slave(); + distributed::test_viewgram_slave(proj_data_info_sptr); + } +#endif + + HighResWallClockTimer t; + + { + if (distributed::receive_bool_value(USE_DOUBLE_ARG_TAG,-1)) + { + this->log_likelihood_ptr = new double; + *this->log_likelihood_ptr=0.0; + } + else + { + this->log_likelihood_ptr = 0; + } + + //Receive input_image values + MPI_Status status = distributed::receive_image_values_and_fill_image_ptr(input_image_ptr, this->image_buffer_size, 0); + + shared_ptr output_image_ptr; + if (distributed::receive_bool_value(USE_OUTPUT_IMAGE_ARG_TAG,-1)) + { + output_image_ptr.reset(this->target_sptr->get_empty_copy()); + // already set to zero + //output_image_ptr->fill(0.F); + } + + //loop to receive viewgrams until received END_ITERATION_TAG + while (true) + { + // TODO, get rid of pointers somehow + RelatedViewgrams* viewgrams = NULL; + RelatedViewgrams* additive_binwise_correction_viewgrams = NULL; + RelatedViewgrams* mult_viewgrams_ptr = NULL; + int count=0, count2=0; + + //receive vs_num values + ViewSegmentNumbers vs; + status = distributed::receive_view_segment_numbers(vs, MPI_ANY_TAG); + + /*check whether to + * - use a viewgram already received in previous iteration + * - receive a new viewgram + * - end the iteration + */ + if (status.MPI_TAG==REUSE_VIEWGRAM_TAG) //use a viewgram already available + { + viewgrams = new RelatedViewgrams(proj_data_ptr->get_related_viewgrams(vs, symmetries_sptr)); + if (!is_null_ptr(binwise_correction)) + additive_binwise_correction_viewgrams = + new RelatedViewgrams(binwise_correction->get_related_viewgrams(vs, symmetries_sptr)); + if (!is_null_ptr(mult_proj_data_sptr)) + mult_viewgrams_ptr = + new RelatedViewgrams(mult_proj_data_sptr->get_related_viewgrams(vs, symmetries_sptr)); + } + else if (status.MPI_TAG==NEW_VIEWGRAM_TAG) //receive a message with a new viewgram + { +#ifndef NDEBUG + //run test for related viewgrams + if (distributed::test && my_rank==1 && distributed::first_iteration==true) distributed::test_related_viewgrams_slave(proj_data_info_sptr, symmetries_sptr); +#endif + //receive info if additive_binwise_correction_viewgrams are NULL + const bool add_bin_corr_viewgrams=distributed::receive_bool_value(BINWISE_CORRECTION_TAG, 0); + if (add_bin_corr_viewgrams) + { + distributed::receive_and_construct_related_viewgrams(additive_binwise_correction_viewgrams, proj_data_info_sptr, symmetries_sptr, 0); + } + + //receive info if mult_viewgrams_ptr are NULL + const bool mult_viewgrams=distributed::receive_bool_value(BINWISE_MULT_TAG, 0); + if (mult_viewgrams) + { + distributed::receive_and_construct_related_viewgrams(mult_viewgrams_ptr, proj_data_info_sptr, symmetries_sptr, 0); + } + + // measured viewgrams + distributed::receive_and_construct_related_viewgrams(viewgrams, proj_data_info_sptr, symmetries_sptr, 0); + + //save Viewgrams to ProjDataInMemory object + if(cache_enabled) + { + if (is_null_ptr(this->proj_data_ptr)) + this->proj_data_ptr.reset(new ProjDataInMemory(this->exam_info_sptr,this->proj_data_info_sptr, /*init_with_0*/ false)); + + if (proj_data_ptr->set_related_viewgrams(*viewgrams)==Succeeded::no) + error("Slave %i: Storing viewgrams failed!\n", my_rank); + + if (add_bin_corr_viewgrams) + { + if (is_null_ptr(binwise_correction)) + binwise_correction.reset(new ProjDataInMemory(this->exam_info_sptr,this->proj_data_info_sptr, /*init_with_0*/ false)); + + if (binwise_correction->set_related_viewgrams(*additive_binwise_correction_viewgrams)==Succeeded::no) + error("Slave %i: Storing additive_binwise_correction_viewgrams failed!\n", my_rank); + } + + if (mult_viewgrams) + { + if (is_null_ptr(mult_proj_data_sptr)) + mult_proj_data_sptr.reset(new ProjDataInMemory(this->exam_info_sptr,this->proj_data_info_sptr, /*init_with_0*/ false)); + + if (mult_proj_data_sptr->set_related_viewgrams(*mult_viewgrams_ptr)==Succeeded::no) + error("Slave %i: Storing mult_viewgrams_ptr failed!\n", my_rank); + } + } + } + else if (status.MPI_TAG==END_ITERATION_TAG) //the iteration is completed --> send results + { + //make reduction over computed output_images + distributed::first_iteration=false; + if (!is_null_ptr(output_image_ptr)) + distributed::reduce_output_image(output_image_ptr, image_buffer_size, my_rank, 0); + // and log_likelihood + if (!is_null_ptr(log_likelihood_ptr)) + { + double buffer = 0.0; + MPI_Reduce(log_likelihood_ptr, &buffer, /*size*/1, MPI_DOUBLE, MPI_SUM, /*destination*/ 0, MPI_COMM_WORLD); + delete log_likelihood_ptr; + } + + if(distributed::rpc_time) + { + double send = distributed::total_rpc_time; + double receive; + MPI_Reduce(&send, &receive, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); + distributed::total_rpc_time = 0.0; + } + // get out of infinite while loop + break; + } + else + error("Slave received unknown tag"); + + //measure time used for parallelized part + if (distributed::rpc_time) {t.reset(); t.start();} + + //call the actual calculation + RPC_process_related_viewgrams( + this->proj_pair_sptr->get_forward_projector_sptr(), + this->proj_pair_sptr->get_back_projector_sptr(), + output_image_ptr.get(), input_image_ptr.get(), viewgrams, + count, count2, + log_likelihood_ptr, + additive_binwise_correction_viewgrams, + mult_viewgrams_ptr); + + if (distributed::rpc_time) + { + t.stop(); + distributed::total_rpc_time=distributed::total_rpc_time + t.value(); + distributed::total_rpc_time_2=distributed::total_rpc_time_2 + t.value(); + } + + int int_values[2]; + int_values[0]=count; + int_values[1]=count2; + //send count,count2 and ask for new work + distributed::send_int_values(int_values, 2, AVAILABLE_NOTIFICATION_TAG, 0); + + if (viewgrams!=NULL) delete viewgrams; + if (additive_binwise_correction_viewgrams!=NULL) delete additive_binwise_correction_viewgrams; + if (mult_viewgrams_ptr!=NULL) delete mult_viewgrams_ptr; + } + if (distributed::rpc_time) + stir::info(boost::format("Slave %1% used %2% seconds for PRC-processing.") + % my_rank % distributed::total_rpc_time_2); + } + } + + // instantiation + template class DistributedWorker >; + +} // namespace stir diff --git a/src/recon_buildblock/FilterRootPrior.cxx b/src/recon_buildblock/FilterRootPrior.cxx new file mode 100644 index 0000000000..9a79846d68 --- /dev/null +++ b/src/recon_buildblock/FilterRootPrior.cxx @@ -0,0 +1,177 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup priors + \brief implementation of the stir::FilterRootPrior class + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +#include "stir/recon_buildblock/FilterRootPrior.h" +#include "stir/DiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" +#include "stir/DataProcessor.h" + +START_NAMESPACE_STIR + +template +FilterRootPrior::FilterRootPrior() +{ + set_defaults(); +} + + +template +FilterRootPrior:: +FilterRootPrior(shared_ptr >const& filter_sptr, float penalisation_factor_v) +: filter_ptr(filter_sptr) +{ + this->penalisation_factor = penalisation_factor_v; +} + + +template < class T> +static inline int +sign (const T& x) +{ return x>=0 ? 1: -1;} + +template < class T> +static inline T // can't call this abs() as it overlaps with std::abs +my_abs(const T& x) +{ return x>=0 ? x: -x;} + +/* A function that divides 2 floats while avoiding division by 0 by imposing an upper threshold + It essentially returns + sign(numerator)*sign(denominator)* + min(my_abs(numerator/denominator), max) +*/ +template < class T> +static inline T +quotient_with_max(const T numerator, const T denominator, const T max) +{ + assert(max>0); + return + my_abs(numerator)< max*my_abs(denominator) ? + numerator/denominator : + max * sign(numerator)*sign(denominator); +} + +template +double +FilterRootPrior:: +compute_value(const DataT ¤t_estimate) +{ + static bool first_time=true; + if (first_time) + { + warning("FilterRootPrior:compute_value does not make sense. Just returning 0."); + first_time=false; + } + return 0.; +} + +template +void +FilterRootPrior:: +compute_gradient(DataT& prior_gradient, + const DataT ¤t_image_estimate) +{ + assert( prior_gradient.get_index_range() == current_image_estimate.get_index_range()); + if (this->penalisation_factor==0 || filter_ptr==0) + { + std::fill(prior_gradient.begin_all(), prior_gradient.end_all(), 0); + return; + } + + + // first store filtered image in prior_gradient + filter_ptr->apply(prior_gradient,current_image_estimate); + + /* now set + prior_gradient = current_image_estimate/filtered_image - 1 + = current_image_estimate/prior_gradient - 1 + However, we need to avoid division by 0, as it might cause a NaN or an 'infinity'. + (It seems that Intel processors handle 'infinity' alright, but sparc processors do not.) + + So, instead we do + prior_gradient = quotient_with_max(current_image_estimate,prior_gradient,1000) - 1 + + The code below does this by using a full_iterator loop as we're missing expression templates + at the moment and I did not feel like making a function object just for this ... + */ + + typename DataT::full_iterator iter_through_prior_gradient = + prior_gradient.begin_all(); + typename DataT::const_full_iterator iter_through_current_image_estimate = + current_image_estimate.begin_all(); + while (iter_through_current_image_estimate!= current_image_estimate.end_all()) + { + *iter_through_prior_gradient= + this->penalisation_factor * + (quotient_with_max(*iter_through_current_image_estimate, + *iter_through_prior_gradient, + static_cast(1000)) + - 1); + ++iter_through_prior_gradient; + ++iter_through_current_image_estimate; + } + assert(iter_through_prior_gradient == prior_gradient.end_all()); +} + + + +template +void +FilterRootPrior::initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("FilterRootPrior Parameters"); + this->parser.add_parsing_key("Filter type", &filter_ptr); + this->parser.add_stop_key("END FilterRootPrior Parameters"); +} + + +template +void +FilterRootPrior::set_defaults() +{ + base_type::set_defaults(); + filter_ptr.reset(); +} + +template +const char * const +FilterRootPrior:: +registered_name = + "FilterRootPrior"; + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + + +template class FilterRootPrior >; +template class FilterRootPrior; + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ForwardProjectorByBin.cxx b/src/recon_buildblock/ForwardProjectorByBin.cxx new file mode 100644 index 0000000000..32d2ad6c0e --- /dev/null +++ b/src/recon_buildblock/ForwardProjectorByBin.cxx @@ -0,0 +1,150 @@ +// +// +/*! + + \file + \ingroup projection + + \brief non-inline implementations for stir::ForwardProjectorByBin + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2011 Hammersmith Imanet Ltd + Copyright (C) 2013 Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/recon_buildblock/ForwardProjectorByBin.h" +#include "stir/RelatedViewgrams.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ProjData.h" +#include "stir/DiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/info.h" +#include +#include + +START_NAMESPACE_STIR + + +ForwardProjectorByBin::ForwardProjectorByBin() +{ +} + +ForwardProjectorByBin::~ForwardProjectorByBin() +{ +} + +void +ForwardProjectorByBin::forward_project(ProjData& proj_data, + const DiscretisedDensity<3,float>& image) +{ + + // this->set_up(proj_data_ptr->get_proj_data_info_ptr()->clone(), +// image_sptr); + + shared_ptr + symmetries_sptr(this->get_symmetries_used()->clone()); + + for (int segment_num = proj_data.get_min_segment_num(); + segment_num <= proj_data.get_max_segment_num(); + ++segment_num) + for (int view= proj_data.get_min_view_num(); + view <= proj_data.get_max_view_num(); + view++) + { + ViewSegmentNumbers vs(view, segment_num); + if (!symmetries_sptr->is_basic(vs)) + continue; + info(boost::format("Processing view %1% of segment %2%") % vs.view_num() % vs.segment_num()); + + RelatedViewgrams viewgrams = + proj_data.get_empty_related_viewgrams(vs, symmetries_sptr); + forward_project(viewgrams, image); + if (!(proj_data.set_related_viewgrams(viewgrams) == Succeeded::yes)) + error("Error set_related_viewgrams in forward projecting\n"); + } + +} + +void +ForwardProjectorByBin::forward_project(RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& image) +{ + forward_project(viewgrams, image, + viewgrams.get_min_axial_pos_num(), + viewgrams.get_max_axial_pos_num(), + viewgrams.get_min_tangential_pos_num(), + viewgrams.get_max_tangential_pos_num()); +} + +void ForwardProjectorByBin::forward_project + (RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& image, + const int min_axial_pos_num, + const int max_axial_pos_num) +{ + forward_project(viewgrams, image, + min_axial_pos_num, + max_axial_pos_num, + viewgrams.get_min_tangential_pos_num(), + viewgrams.get_max_tangential_pos_num()); +} + +void +ForwardProjectorByBin:: +forward_project(RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& density, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) +{ + if (viewgrams.get_num_viewgrams()==0) + return; + + start_timers(); + + // first check symmetries + { + const ViewSegmentNumbers basic_vs = viewgrams.get_basic_view_segment_num(); + + if (get_symmetries_used()->num_related_view_segment_numbers(basic_vs) != + viewgrams.get_num_viewgrams()) + error("ForwardProjectByBin: forward_project called with incorrect related_viewgrams. Problem with symmetries!\n"); + + for (RelatedViewgrams::const_iterator iter = viewgrams.begin(); + iter != viewgrams.end(); + ++iter) + { + ViewSegmentNumbers vs(iter->get_view_num(), iter->get_segment_num()); + get_symmetries_used()->find_basic_view_segment_numbers(vs); + if (vs != basic_vs) + error("ForwardProjectByBin: forward_project called with incorrect related_viewgrams. Problem with symmetries!\n"); + } + } + actual_forward_project(viewgrams, density, + min_axial_pos_num, + max_axial_pos_num, + min_tangential_pos_num, + max_tangential_pos_num); + stop_timers(); +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.cxx b/src/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.cxx new file mode 100644 index 0000000000..ba1ccbf048 --- /dev/null +++ b/src/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.cxx @@ -0,0 +1,229 @@ +// +// +/*! + + \file + \ingroup projection + + \brief implementations for stir::ForwardProjectorByBinUsingProjMatrixByBin + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h" +#include "stir/Viewgram.h" +#include "stir/RelatedViewgrams.h" +#include "stir/IndexRange2D.h" +#include "stir/is_null_ptr.h" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACE +using std::find; +using std::vector; +using std::list; +#endif + +START_NAMESPACE_STIR + +////////////////////////////////////////////////////////// +const char * const +ForwardProjectorByBinUsingProjMatrixByBin::registered_name = + "Matrix"; + + +void +ForwardProjectorByBinUsingProjMatrixByBin:: +set_defaults() +{ + this->proj_matrix_ptr.reset(); + //ForwardProjectorByBin::set_defaults(); +} + +void +ForwardProjectorByBinUsingProjMatrixByBin:: +initialise_keymap() +{ + parser.add_start_key("Forward Projector Using Matrix Parameters"); + parser.add_stop_key("End Forward Projector Using Matrix Parameters"); + parser.add_parsing_key("matrix type", &proj_matrix_ptr); + //ForwardProjectorByBin::initialise_keymap(); +} + +bool +ForwardProjectorByBinUsingProjMatrixByBin:: +post_processing() +{ + //if (ForwardProjectorByBin::post_processing() == true) + // return true; + if (is_null_ptr(proj_matrix_ptr)) + { + warning("ForwardProjectorByBinUsingProjMatrixByBin: matrix not set.\n"); + return true; + } + return false; +} + +ForwardProjectorByBinUsingProjMatrixByBin:: +ForwardProjectorByBinUsingProjMatrixByBin() +{ + set_defaults(); +} + +ForwardProjectorByBinUsingProjMatrixByBin:: +ForwardProjectorByBinUsingProjMatrixByBin( + const shared_ptr& proj_matrix_ptr + ) + : proj_matrix_ptr(proj_matrix_ptr) +{ + assert(!is_null_ptr(proj_matrix_ptr)); +} + +void +ForwardProjectorByBinUsingProjMatrixByBin:: +set_up(const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr) +{ + proj_matrix_ptr->set_up(proj_data_info_ptr, image_info_ptr); +} + +const DataSymmetriesForViewSegmentNumbers * +ForwardProjectorByBinUsingProjMatrixByBin::get_symmetries_used() const +{ + return proj_matrix_ptr->get_symmetries_ptr(); +} + +void +ForwardProjectorByBinUsingProjMatrixByBin:: + actual_forward_project(RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) +{ + if (proj_matrix_ptr->is_cache_enabled()/* && + !proj_matrix_ptr->does_cache_store_only_basic_bins()*/) + { + // straightforward version which relies on ProjMatrixByBin to sort out all + // symmetries + // would be slow if there's no caching at all, but is very fast if everything is cached + + ProjMatrixElemsForOneBin proj_matrix_row; + + RelatedViewgrams::iterator r_viewgrams_iter = viewgrams.begin(); + + while( r_viewgrams_iter!=viewgrams.end()) + { + Viewgram& viewgram = *r_viewgrams_iter; + const int view_num = viewgram.get_view_num(); + const int segment_num = viewgram.get_segment_num(); + + for ( int tang_pos = min_tangential_pos_num ;tang_pos <= max_tangential_pos_num ;++tang_pos) + for ( int ax_pos = min_axial_pos_num; ax_pos <= max_axial_pos_num ;++ax_pos) + { + Bin bin(segment_num, view_num, ax_pos, tang_pos, 0); + proj_matrix_ptr->get_proj_matrix_elems_for_one_bin(proj_matrix_row, bin); + proj_matrix_row.forward_project(bin,image); + viewgram[ax_pos][tang_pos] = bin.get_bin_value(); + } + ++r_viewgrams_iter; + } + } + else + { + // Complicated version which handles the symmetries explicitly. + // Faster when no caching is performed, about just as fast when there is caching, + // but of only basic bins. + + ProjMatrixElemsForOneBin proj_matrix_row; + ProjMatrixElemsForOneBin proj_matrix_row_copy; + const DataSymmetriesForBins* symmetries = proj_matrix_ptr->get_symmetries_ptr(); + + Array<2,int> + already_processed(IndexRange2D(min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num)); + + for ( int tang_pos = min_tangential_pos_num ;tang_pos <= max_tangential_pos_num ;++tang_pos) + for ( int ax_pos = min_axial_pos_num; ax_pos <= max_axial_pos_num ;++ax_pos) + { + if (already_processed[ax_pos][tang_pos]) + continue; + + Bin basic_bin(viewgrams.get_basic_segment_num(),viewgrams.get_basic_view_num(),ax_pos,tang_pos); + symmetries->find_basic_bin(basic_bin); + + proj_matrix_ptr->get_proj_matrix_elems_for_one_bin(proj_matrix_row, basic_bin); + + vector r_ax_poss; + symmetries->get_related_bins_factorised(r_ax_poss,basic_bin, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + + for ( +#ifndef STIR_NO_NAMESPACES + std:: +#endif + vector::iterator r_ax_poss_iter = r_ax_poss.begin(); + r_ax_poss_iter != r_ax_poss.end(); + ++r_ax_poss_iter) + { + const int axial_pos_tmp = (*r_ax_poss_iter)[1]; + const int tang_pos_tmp = (*r_ax_poss_iter)[2]; + + // symmetries might take the ranges out of what the user wants + if ( !(min_axial_pos_num <= axial_pos_tmp && axial_pos_tmp <= max_axial_pos_num && + min_tangential_pos_num <=tang_pos_tmp && tang_pos_tmp <= max_tangential_pos_num)) + continue; + + already_processed[axial_pos_tmp][tang_pos_tmp] = 1; + + + for (RelatedViewgrams::iterator viewgram_iter = viewgrams.begin(); + viewgram_iter != viewgrams.end(); + ++viewgram_iter) + { + Viewgram& viewgram = *viewgram_iter; + proj_matrix_row_copy = proj_matrix_row; + Bin bin(viewgram_iter->get_segment_num(), + viewgram_iter->get_view_num(), + axial_pos_tmp, + tang_pos_tmp); + + auto_ptr symm_op_ptr = + symmetries->find_symmetry_operation_from_basic_bin(bin); + assert(bin == basic_bin); + + symm_op_ptr->transform_proj_matrix_elems_for_one_bin(proj_matrix_row_copy); + proj_matrix_row_copy.forward_project(bin,image); + + viewgram[axial_pos_tmp][tang_pos_tmp] = bin.get_bin_value(); + } + } + } + assert(already_processed.sum() == ( + (max_axial_pos_num - min_axial_pos_num + 1) * + (max_tangential_pos_num - min_tangential_pos_num + 1))); + } +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ForwardProjectorByBinUsingRayTracing.cxx b/src/recon_buildblock/ForwardProjectorByBinUsingRayTracing.cxx new file mode 100644 index 0000000000..10cb77981c --- /dev/null +++ b/src/recon_buildblock/ForwardProjectorByBinUsingRayTracing.cxx @@ -0,0 +1,1446 @@ +// +// +/*! + \file + \ingroup projection + + \brief Implementations of non-static methods of stir::ForwardProjectorByBinUsingRayTracing. + + \author Kris Thielemans + \author Claire Labbe + \author Damiano Belluzzo + \author (based originally on C code by Matthias Egger) + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + History: + * Matthias Egger: C version + + * PARAPET project : C++ version + + * KT : conversion to class and 'new design' + + * KT 20/06/2001 : + - allow even-sized images and projdata + - correctly handle arbitrary min,max_tang_pos_num + - release restriction to arc-corrected data + - base on RegisteredParsingObject to allow user-selection of projector + - replace some code with calls to methods of DataSymmetriesForBins_PET_CartesianGrid + + * KT 25/11/2003 : + - handle cases with less symmetries, e.g. when num_views%4!=0 + - Proj_Siddon has now a slightly different calling interface + (templating should speed it up a tiny bit) +*/ +/* this file still needs some cleaning. Sorry. + and more DOC of course + + Most of the ugly stuff is because Proj_Siddon is a translation of M Egger's code, and + hence does not know about RelatedViewgrams etc. So, there is a step that + gets data from a 4D Array and sticks it into the RelatedViewgrams. + Ugly though. +*/ + +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +// KT 20/06/2001 should now work for non-arccorrected data as well +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/Viewgram.h" +#include "stir/RelatedViewgrams.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IndexRange4D.h" +#include "stir/Array.h" +#include "stir/round.h" + + +START_NAMESPACE_STIR + +const char * const +ForwardProjectorByBinUsingRayTracing::registered_name = + "Ray Tracing"; + + +void +ForwardProjectorByBinUsingRayTracing:: +set_defaults() +{ + restrict_to_cylindrical_FOV = true; +} + +void +ForwardProjectorByBinUsingRayTracing:: +initialise_keymap() +{ + parser.add_start_key("Forward Projector Using Ray Tracing Parameters"); + parser.add_key("restrict to cylindrical FOV", &restrict_to_cylindrical_FOV); + parser.add_stop_key("End Forward Projector Using Ray Tracing Parameters"); +} + +ForwardProjectorByBinUsingRayTracing:: + ForwardProjectorByBinUsingRayTracing() +{ + set_defaults(); +} + +ForwardProjectorByBinUsingRayTracing:: + ForwardProjectorByBinUsingRayTracing( + const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr) +{ + set_defaults(); + set_up(proj_data_info_ptr, image_info_ptr); +} + +void +ForwardProjectorByBinUsingRayTracing:: +set_up(const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr) +{ + if (proj_data_info_ptr->get_num_views()%2 != 0) + { + error("The on-the-fly Ray tracing forward projector cannot handle data with odd number of views. Use another projector. Sorry."); + } + + symmetries_ptr.reset(new DataSymmetriesForBins_PET_CartesianGrid(proj_data_info_ptr, image_info_ptr)); + + // check if data are according to what we can handle + + const VoxelsOnCartesianGrid * vox_image_info_ptr = + dynamic_cast*> (image_info_ptr.get()); + + if (vox_image_info_ptr == NULL) + error("ForwardProjectorByBinUsingRayTracing initialised with a wrong type of DiscretisedDensity\n"); + + const CartesianCoordinate3D voxel_size = vox_image_info_ptr->get_voxel_size(); + + const float sampling_distance_of_adjacent_LORs_xy = + proj_data_info_ptr->get_sampling_in_s(Bin(0,0,0,0)); + + + // z_origin_in_planes should be an integer + const float z_origin_in_planes = + image_info_ptr->get_origin().z()/voxel_size.z(); + if (fabs(round(z_origin_in_planes) - z_origin_in_planes) > 1.E-4) + error("ForwardProjectorByBinUsingRayTracing: the shift in the " + "z-direction of the origin (which is %g) should be a multiple of the plane " + "separation (%g)\n", + image_info_ptr->get_origin().z(), voxel_size.z()); + + // num_planes_per_axial_pos should currently be an integer + for (int segment_num = proj_data_info_ptr->get_min_segment_num(); + segment_num <= proj_data_info_ptr->get_max_segment_num(); + ++segment_num) + { + const float num_planes_per_axial_pos = + symmetries_ptr->get_num_planes_per_axial_pos(segment_num); + if (fabs(round(num_planes_per_axial_pos) - num_planes_per_axial_pos) > 1.E-4) + error("ForwardProjectorByBinUsingRayTracing: the number of image planes " + "per axial_pos (which is %g for segment %d) should be an integer\n", + num_planes_per_axial_pos, segment_num); + } + + + // KT 20/06/2001 converted from assert to a warning + if(sampling_distance_of_adjacent_LORs_xy > voxel_size.x() + 1.E-3 || + sampling_distance_of_adjacent_LORs_xy > voxel_size.y() + 1.E-3) + warning("ForwardProjectorByBinUsingRayTracing assumes that pixel size (in x,y) " + "is greater than or equal to the bin size.\n" + "As this is NOT the case with the current data, the projector will " + "completely miss some voxels for some (or all) views."); +} + + +const DataSymmetriesForViewSegmentNumbers * +ForwardProjectorByBinUsingRayTracing::get_symmetries_used() const +{ + return symmetries_ptr.get(); +} + +void +ForwardProjectorByBinUsingRayTracing:: +actual_forward_project(RelatedViewgrams& viewgrams, + const DiscretisedDensity<3,float>& density, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) + +{ + // this will throw an exception when the cast does not work + const VoxelsOnCartesianGrid& image = + dynamic_cast&>(density); + + const int num_views = viewgrams.get_proj_data_info_ptr()->get_num_views(); + + if (viewgrams.get_basic_segment_num() == 0) + { + if (viewgrams.get_num_viewgrams() == 1) + { + Viewgram & pos_view = *viewgrams.begin(); + forward_project_view_2D( + pos_view, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + + } + else + if (viewgrams.get_num_viewgrams() == 2) + { + assert(viewgrams.get_basic_view_num() >= 0); + assert(viewgrams.get_basic_view_num() < num_views/2); + Viewgram & pos_view = *viewgrams.begin(); + if ((viewgrams.begin()+1)->get_view_num() == pos_view.get_view_num() + num_views/2) + { + Viewgram & pos_plus90 =*(viewgrams.begin()+1); + if (pos_plus90.get_view_num() != pos_view.get_view_num() + num_views/2) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 2D case with 2 viewgrams\n"); + + forward_project_view_plus_90_2D( + pos_view, pos_plus90, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + } + else + { + Viewgram & pos_min180 =*(viewgrams.begin()+1); + if (pos_min180.get_view_num() != num_views - pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 2D case with 2 viewgrams\n"); + + forward_project_view_min_180_2D( + pos_view, pos_min180, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + } + } + else + { + assert(viewgrams.get_basic_view_num() > 0); + assert(viewgrams.get_basic_view_num() < num_views/4); + Viewgram & pos_view = *(viewgrams.begin()); + Viewgram & pos_plus90 =*(viewgrams.begin()+1); + Viewgram & pos_min180 =*(viewgrams.begin()+2); + Viewgram & pos_min90 =*(viewgrams.begin()+3); + + if (pos_plus90.get_view_num() != pos_view.get_view_num() + num_views/2) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 2D case with 4 viewgrams\n"); + if (pos_min180.get_view_num() != num_views - pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 2D case with 4 viewgrams\n"); + if (pos_min90.get_view_num() != num_views/2 - pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 2D case with 4 viewgrams\n"); + + forward_project_all_symmetries_2D( + pos_view, pos_plus90, + pos_min180, pos_min90, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + + } + } + else + { + // segment symmetry + if (viewgrams.get_num_viewgrams() == 2) + { + Viewgram & pos_view = *(viewgrams.begin()+0); + Viewgram & neg_view =*(viewgrams.begin()+1); + + if (pos_view.get_view_num() != neg_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 2 viewgrams\n"); + if (neg_view.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 2 viewgrams\n"); + + forward_project_delta( + pos_view, neg_view, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + } + else if (viewgrams.get_num_viewgrams() == 4) + { + Viewgram & pos_view = *(viewgrams.begin()+0); + Viewgram & neg_view =*(viewgrams.begin()+1); + if (neg_view.get_view_num() != pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 2 viewgrams\n"); + if (neg_view.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + + if ((viewgrams.begin()+2)->get_view_num() == pos_view.get_view_num() + num_views/2) + { + Viewgram & pos_plus90 =*(viewgrams.begin()+2); + Viewgram & neg_plus90 =*(viewgrams.begin()+3); + if (pos_plus90.get_view_num() != pos_view.get_view_num() + num_views/2) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + if (neg_plus90.get_view_num() != neg_view.get_view_num() + num_views/2) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + if (pos_plus90.get_segment_num() != pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + if (neg_plus90.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + forward_project_view_plus_90_and_delta( + pos_view, neg_view, pos_plus90, neg_plus90, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + } + else + { + Viewgram & pos_min180 =*(viewgrams.begin()+2); + Viewgram & neg_min180 =*(viewgrams.begin()+3); + if (pos_min180.get_view_num() != num_views - pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + if (neg_min180.get_view_num() != num_views - neg_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + if (pos_min180.get_segment_num() != pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + if (neg_min180.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 4 viewgrams\n"); + + forward_project_view_min_180_and_delta( + pos_view, neg_view, pos_min180, neg_min180, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + } + } + else if (viewgrams.get_num_viewgrams() == 8) + { + assert(viewgrams.get_basic_view_num() > 0); + assert(viewgrams.get_basic_view_num() < num_views/4); + Viewgram & pos_view = *(viewgrams.begin()+0); + Viewgram & neg_view =*(viewgrams.begin()+1); + Viewgram & pos_plus90 =*(viewgrams.begin()+2); + Viewgram & neg_plus90 =*(viewgrams.begin()+3); + Viewgram & pos_min180 =*(viewgrams.begin()+4); + Viewgram & neg_min180=*(viewgrams.begin()+5); + Viewgram & pos_min90=*(viewgrams.begin()+6); + Viewgram & neg_min90 =*(viewgrams.begin()+7); + + if (pos_plus90.get_view_num() != pos_view.get_view_num() + num_views/2) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (pos_min180.get_view_num() != num_views - pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (pos_min90.get_view_num() != num_views/2 - pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + + if (neg_view.get_view_num() != pos_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (neg_min90.get_view_num() != num_views/2 - neg_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (neg_plus90.get_view_num() != neg_view.get_view_num() + num_views/2) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (neg_min180.get_view_num() != num_views - neg_view.get_view_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + + if (pos_plus90.get_segment_num() != pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (pos_min90.get_segment_num() != pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (pos_min180.get_segment_num() != pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + + if (neg_view.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (neg_plus90.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (neg_min90.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + if (neg_min180.get_segment_num() != - pos_view.get_segment_num()) + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case with 8 viewgrams\n"); + + forward_project_all_symmetries( + pos_view, neg_view, pos_plus90, neg_plus90, + pos_min180, neg_min180, pos_min90, neg_min90, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + + } + else // other number of viewgrams + { + error("ForwardProjectorUsingRayTracing: error in symmetries. Check 3D case\n"); + } + + } // oblique case + + +} + + + +/* + The version which uses all possible symmetries. + Here 0<=view < num_views/4 (= 45 degrees) +*/ + +void +ForwardProjectorByBinUsingRayTracing:: +forward_project_all_symmetries( + Viewgram & pos_view, + Viewgram & neg_view, + Viewgram & pos_plus90, + Viewgram & neg_plus90, + Viewgram & pos_min180, + Viewgram & neg_min180, + Viewgram & pos_min90, + Viewgram & neg_min90, + const VoxelsOnCartesianGrid& image, + const int min_ax_pos_num, const int max_ax_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + + // KT 20/06/2001 should now work for non-arccorrected data as well + const ProjDataInfoCylindrical * proj_data_info_ptr = + dynamic_cast + (pos_view.get_proj_data_info_ptr()); + if (proj_data_info_ptr == NULL) + error("ForwardProjectorByBinUsingRayTracing::forward_project called with wrong type of ProjDataInfo\n"); + + const int nviews = pos_view.get_proj_data_info_ptr()->get_num_views(); + + const int segment_num = pos_view.get_segment_num(); + const float delta = proj_data_info_ptr->get_average_ring_difference(segment_num); + const int view = pos_view.get_view_num(); + + assert(delta > 0); + + assert(view >= 0); + /* removed assertions which would break the temporary 2,4 parameter forward_project + assert(view <= view90); + + assert(pos_plus90.get_view_num() == nviews / 2 + pos_view.get_view_num()); + assert(pos_min90.get_view_num() == nviews / 2 - pos_view.get_view_num()); + assert(pos_min180.get_view_num() == nviews - pos_view.get_view_num()); + + assert(neg_view.get_view_num() == pos_view.get_view_num()); + assert(neg_plus90.get_view_num() == pos_plus90.get_view_num()); + assert(neg_min90.get_view_num() == pos_min90.get_view_num()); + assert(neg_min180.get_view_num() == pos_min180.get_view_num()); + */ + //assert(image.get_min_z() == 0); + + assert(delta == + -proj_data_info_ptr->get_average_ring_difference(neg_view.get_segment_num())); + + // KT 21/05/98 added const where possible + // TODO C value depends whether you are in Double or not, + // If double C==2 => do 2*ax_pos0 and 2*ax_pos0+1 + const int C=1; + + int D, tang_pos_num; + int ax_pos0, my_ax_pos0; + const float R = proj_data_info_ptr->get_ring_radius(); + + // a variable which will be used in the loops over tang_pos_num to get s_in_mm + Bin bin(pos_view.get_segment_num(), pos_view.get_view_num(),min_ax_pos_num,0); + + // KT 20/06/2001 rewrote using get_phi + const float cphi = cos(proj_data_info_ptr->get_phi(bin)); + const float sphi = sin(proj_data_info_ptr->get_phi(bin)); + + // KT 20/06/2001 write using symmetries member + // find correspondence between ring coordinates and image coordinates: + // z = num_planes_per_axial_pos * ring + axial_pos_to_z_offset + const int num_planes_per_axial_pos = + round(symmetries_ptr->get_num_planes_per_axial_pos(segment_num)); + const float axial_pos_to_z_offset = + symmetries_ptr->get_axial_pos_to_z_offset(segment_num); + + // KT 20/06/2001 parameters to find 'basic' range of tang_pos_num + const int max_abs_tangential_pos_num = + max(max_tangential_pos_num, -min_tangential_pos_num); + const int min_abs_tangential_pos_num = + max_tangential_pos_num<0 ? + -max_tangential_pos_num + : (min_tangential_pos_num>0 ? + min_tangential_pos_num + : 0 ); + // in the loop, the case tang_pos_num==0 will be treated separately (because it's self-symmetric) + const int min_tang_pos_num_in_loop = + min_abs_tangential_pos_num==0 ? 1 : min_abs_tangential_pos_num; + + start_timers(); + + + Array <4,float> Projall(IndexRange4D(min_ax_pos_num, max_ax_pos_num, 0, 1, 0, 1, 0, 3)); + // KT 21/05/98 removed as now automatically zero + // Projall.fill(0); + + // In the case that axial sampling for the projection data = 2*voxel_size.z() + // we draw 2 LORs, at -1/4 and +1/4 of the centre of the bin + // If we don't do this, we will miss voxels in the forward projection step. + + // When the axial sampling is the same as the voxel size, we take just + // 1 LOR. + float offset_start = -.25F; + float offset_incr = .5F; + + int num_lors_per_virtual_ring = 2; + + if (num_planes_per_axial_pos == 1) + { + offset_start = 0; + offset_incr=1; + num_lors_per_virtual_ring = 1; + } + + + for (float offset = offset_start; offset < 0.3; offset += offset_incr) + { + if (view == 0 || 4*view == nviews ) { /* phi=0 or 45 */ + for (D = 0; D < C; D++) { + if (min_abs_tangential_pos_num==0) + { + /* Here tang_pos_num=0 and phi=0 or 45*/ + + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + < 2>( +#else + (2, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, 0, R,min_ax_pos_num, max_ax_pos_num, + offset, num_planes_per_axial_pos, axial_pos_to_z_offset, + 1.F / num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos_num; ax_pos0 <= max_ax_pos_num; ax_pos0++) { + my_ax_pos0 = C * ax_pos0 + D; + + pos_view[my_ax_pos0][0] += Projall[ax_pos0][0][0][0]; + pos_plus90[my_ax_pos0][0] += Projall[ax_pos0][0][0][2]; + neg_view[my_ax_pos0][0] += Projall[ax_pos0][1][0][0]; + neg_plus90[my_ax_pos0][0] += Projall[ax_pos0][1][0][2]; + } + } + /* Now tang_pos_num!=0 and phi=0 or 45 */ + for (tang_pos_num = min_tang_pos_num_in_loop; tang_pos_num <= max_abs_tangential_pos_num; tang_pos_num++) + { + bin.tangential_pos_num() = tang_pos_num; + const float s_in_mm = proj_data_info_ptr->get_s(bin); + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <1>( +#else + (1, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, s_in_mm, R,min_ax_pos_num, max_ax_pos_num, + offset, num_planes_per_axial_pos, axial_pos_to_z_offset, + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos_num; ax_pos0 <= max_ax_pos_num; ax_pos0++) { + my_ax_pos0 = C * ax_pos0 + D; + if (tang_pos_num<=max_tangential_pos_num) + { + pos_view[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][0]; + pos_plus90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][2]; + neg_view[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][1][0][0]; + neg_plus90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][1][0][2]; + } + if (-tang_pos_num>=min_tangential_pos_num) + { + pos_view[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][0]; + pos_plus90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][2]; + neg_view[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][1][1][0]; + neg_plus90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][1][1][2]; + } + } + } + } + } else { + + + for (D = 0; D < C; D++) { + if (min_abs_tangential_pos_num==0) + { + /* Here tang_pos_num==0 and phi!=k*45 */ + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <4>( +#else + (4, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, 0, R,min_ax_pos_num, max_ax_pos_num, + offset, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos_num; ax_pos0 <= max_ax_pos_num; ax_pos0++) { + my_ax_pos0 = C * ax_pos0 + D; + pos_view[my_ax_pos0][0] += Projall[ax_pos0][0][0][0]; + pos_min90[my_ax_pos0][0] += Projall[ax_pos0][0][0][1]; + pos_plus90[my_ax_pos0][0] += Projall[ax_pos0][0][0][2]; + pos_min180[my_ax_pos0][0] += Projall[ax_pos0][0][0][3]; + neg_view[my_ax_pos0][0] += Projall[ax_pos0][1][0][0]; + neg_min90[my_ax_pos0][0] += Projall[ax_pos0][1][0][1]; + neg_plus90[my_ax_pos0][0] += Projall[ax_pos0][1][0][2]; + neg_min180[my_ax_pos0][0] += Projall[ax_pos0][1][0][3]; + } + } + + + /* Here tang_pos_num!=0 and phi!=k*45. */ + for (tang_pos_num = min_tang_pos_num_in_loop; tang_pos_num <= max_abs_tangential_pos_num; tang_pos_num++) { + bin.tangential_pos_num() = tang_pos_num; + const float s_in_mm = proj_data_info_ptr->get_s(bin); + + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <3>( +#else + (3, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, s_in_mm, R,min_ax_pos_num, max_ax_pos_num, + offset, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos_num; ax_pos0 <= max_ax_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + if (tang_pos_num<=max_tangential_pos_num) + { + pos_view[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][0]; + pos_min90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][1]; + pos_plus90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][2]; + pos_min180[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][3]; + neg_view[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][1][0][0]; + neg_min90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][1][0][1]; + neg_plus90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][1][0][2]; + neg_min180[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][1][0][3]; + } + if (-tang_pos_num>=min_tangential_pos_num) + { + pos_view[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][0]; + pos_min90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][1]; + pos_plus90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][2]; + pos_min180[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][3]; + neg_view[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][1][1][0]; + neg_min90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][1][1][1]; + neg_plus90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][1][1][2]; + neg_min180[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][1][1][3]; + } + } + } + } + + + }// end of } else { + }// end of test for offset loop + + stop_timers(); + +} + + +/* +This function projects 2 viewgrams related by segment symmetry. +*/ + +void +ForwardProjectorByBinUsingRayTracing:: + forward_project_delta(Viewgram & pos_view, + Viewgram & neg_view, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + assert(pos_view.get_segment_num() > 0); + assert(pos_view.get_view_num() >= 0); + assert(pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()); + + Viewgram dummy = pos_view; + + + forward_project_all_symmetries( + pos_view, + neg_view, + dummy, + dummy, + dummy, + dummy, + dummy, + dummy, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); +} + + +/* +This function projects 4 viewgrams related by symmetry. + Here 0<=view < num_views/2 (= 90 degrees) +*/ + +void +ForwardProjectorByBinUsingRayTracing:: + forward_project_view_plus_90_and_delta(Viewgram & pos_view, + Viewgram & neg_view, + Viewgram & pos_plus90, + Viewgram & neg_plus90, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + assert(pos_view.get_segment_num() > 0); + assert(pos_view.get_view_num() >= 0); + assert(pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()/2); + + Viewgram dummy = pos_view; + + + forward_project_all_symmetries( + pos_view, + neg_view, + pos_plus90, + neg_plus90, + dummy, + dummy, + dummy, + dummy, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); +} + + +void +ForwardProjectorByBinUsingRayTracing:: + forward_project_view_min_180_and_delta(Viewgram & pos_view, + Viewgram & neg_view, + Viewgram & pos_min180, + Viewgram & neg_min180, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + assert(pos_view.get_segment_num() > 0); + assert(pos_view.get_view_num() >= 0); + assert(pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()/2); + + Viewgram dummy = pos_view; + + forward_project_all_symmetries( + pos_view, + neg_view, + dummy, + dummy, + pos_min180, + neg_min180, + dummy, + dummy, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); +} + +#if 0 +// old specific 2D versions, worked plane by plane +// this still assumes odd ranges for tang_pos_num etc. + +void ForwardProjectorByBinUsingRayTracing::forward_project_2D(Segment &sinos,const VoxelsOnCartesianGrid& image, + const int view, const int rmin, const int rmax) +{ + + int segment_num =sinos.get_segment_num(); + + const ProjDataInfoCylindricalArcCorr* proj_data_cyl_ptr = + dynamic_cast(sinos.get_proj_data_info_ptr()); + + if ( proj_data_cyl_ptr==NULL) + { + error("ForwardProjectorByBinUsingRayTracing::Casting failed\n"); + } + + assert(proj_data_cyl_ptr->get_average_ring_difference(segment_num) ==0); + + // CL&KT 05/11/98 use scan_info + const float planes_per_virtual_ring = + sinos.get_proj_data_info_ptr()->get_scanner_ptr()->ring_spacing / image.get_voxel_size().z(); + + int num_planes_per_axial_pos = (int)(planes_per_virtual_ring + 0.5); + assert(planes_per_virtual_ring > 0); + // Check if planes_per_ring is very close to an int + assert(fabs(num_planes_per_axial_pos / planes_per_virtual_ring - 1) < 1e-5); + + // check if there is axial compression + if (proj_data_cyl_ptr->get_max_ring_difference(segment_num) != 0) + { + //TODO handle axial compression in a different way + num_planes_per_axial_pos = 1; + } + + // We support only 1 or 2 planes per ring now + assert(num_planes_per_axial_pos == 1 || num_planes_per_axial_pos == 2); + + // Initialise a 2D sinogram here to avoid reallocating it every ring + // We use get_sinogram to get correct sizes etc., but + // data will be overwritten + Sinogram sino = sinos.get_sinogram(sinos.get_min_axial_pos()); + + // First do direct planes + { + for (int ax_pos = rmin; ax_pos <= rmax; ax_pos++) + { + sino = sinos.get_sinogram(ax_pos); + forward_project_2D(sino,image, num_planes_per_axial_pos*ax_pos, view); + sinos.set_sinogram(sino); + } + } + + // Now do indirect planes + if (num_planes_per_axial_pos == 2) + { + + // TODO terribly inefficient as this is repeated for every view + // adding in lots of zeroes + for (int ax_pos = rmin; ax_pos < rmax; ax_pos++) + { + sino.fill(0); + // forward project the indirect plane + forward_project_2D(sino,image, num_planes_per_axial_pos*ax_pos+1, view); + + // add 'half' of the sinogram to the 2 neighbouring rings + sino /= 2; + + Sinogram sino_tmp = sinos.get_sinogram(ax_pos); + sino_tmp += sino; + sinos.set_sinogram(sino_tmp); + + sino_tmp = sinos.get_sinogram(ax_pos+1); + sino_tmp += sino; + sinos.set_sinogram(sino_tmp); + } + } +} + +void ForwardProjectorByBinUsingRayTracing::forward_project_2D(Sinogram &sino,const VoxelsOnCartesianGrid&image, + const int plane_num, const int view) +{ + const ProjDataInfoCylindricalArcCorr* proj_data_cyl_ptr = + dynamic_cast(sino.get_proj_data_info_ptr()); + + if ( proj_data_cyl_ptr==NULL) + { + error("ForwardProjectorByBinUsingRayTracing::Casting failed"); + + int segmnet_num = sino.get_segment_num(); + + // KT 06/10/98 added num_planes_per_axial_pos stuff for normalisation later on + assert(proj_data_cyl_ptr->get_average_ring_difference(segmnet_num) ==0); + + // KT&CL 21/12/99 changed name from planes_per_ring to planes_per_virtual_ring + const float planes_per_virtual_ring = + sino.get_proj_data_info_ptr()->get_scanner_ptr()->ring_spacing / image.get_voxel_size().z(); + + int num_planes_per_axial_pos = (int)(planes_per_virtual_ring + 0.5); + assert(planes_per_virtual_ring > 0); + // Check if planes_per_ring is very close to an int + assert(fabs(num_planes_per_axial_pos / planes_per_virtual_ring - 1) < 1e-5); + + // check if there is axial compression + if (proj_data_cyl_ptr->get_max_ring_difference(segmnet_num) != 0) + { + //TODO find out about axial compression in a different way + num_planes_per_axial_pos = 1; + } + + // We support only 1 or 2 planes per ring now + assert(num_planes_per_axial_pos == 1 || num_planes_per_axial_pos == 2); + + // CL&KT 05/11/98 use scan_info + const int nviews = sino.get_proj_data_info_ptr()->get_num_views(); + const int view90 = nviews / 2; + const int view45 = view90 / 2; + const int plus90 = view90+view; + const int min180 = nviews-view; + const int min90 = view90-view; + + + assert(sino.get_num_tangential_poss() == image.get_x_size()); + assert(image.get_min_x() == -image.get_max_x()); + // CL&KT 05/11/98 use scan_info, enable assert + assert(image.get_voxel_size().x == sino.get_proj_data_info_ptr()->get_num_tangential_poss()); + assert(sino.get_max_tangential_pos_num() == -sino.get_min_tangential_pos_num()); + + + // TODO C value depends whether you are in Double or not, + // If double C==2 => do 2*ax_pos0 and 2*ax_pos0+1 + const int C=1; + + int D, tang_pos_num; + // CL&KT 05/11/98 use scan_info + const float R = sino.get_proj_data_info_ptr()->get_scanner_ptr()->ring_radius; + + + const float itophi = _PI / nviews; + + const float cphi = cos(view * itophi); + const float sphi = sin(view * itophi); + + const int projrad = (int) (sino.get_num_tangential_poss() / 2) - 1; + + start_timers(); + + //TODO for the moment, just handle 1 plane and use some 3D variables + const int min_ax_pos = 0; + const int max_ax_pos = 0; + const float delta = 0; + int ax_pos0; + int my_ax_pos0; + + Array <4,float> Projall(min_ax_pos, max_ax_pos, 0, 1, 0, 1, 0, 3); + + // only 1 value of offset for 2D case. + // However, we have to divide projections by num_planes_per_axial_pos + // to get values equal to the (average) line integral + + // KT&CL 21/12/99 use num_planes_per_axial_pos in the offset and in if proj_Siddon + // inside proj_Siddon z=num_planes_per_axial_pos*offset, but that has + // to be plane_num, so we set offset accordingly + const float offset = float(plane_num)/num_planes_per_axial_pos; + { + + if (view == 0 || view == view45 ) { /* phi=0 or 45 */ + for (D = 0; D < C; D++) { + /* Here tang_pos_num=0 and phi=0 or 45*/ + + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <2>( +#else + (2, +#endif + Projall,image,proj_data_cyl_ptr, + cphi, sphi, delta + D, 0, R,min_ax_pos, max_ax_pos, + offset, num_planes_per_axial_pos, 0, + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos; ax_pos0 <= max_ax_pos; ax_pos0++) { + my_ax_pos0 = C * ax_pos0 + D; + sino[view][0] += Projall[ax_pos0][0][0][0] / num_planes_per_axial_pos; + sino[plus90][0] += Projall[ax_pos0][0][0][2] / num_planes_per_axial_pos; + } + /* Now tang_pos_num!=0 and phi=0 or 45 */ + for (tang_pos_num = min_tang_pos_num_in_loop; tang_pos_num <= max_abs_tangential_pos_num; tang_pos_num++) { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <1>( +#else + (1, +#endif + Projall,image,proj_data_cyl_ptr, cphi, sphi, + delta + D, tang_pos_num, R,min_ax_pos,max_ax_pos, + offset, num_planes_per_axial_pos, 0, + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos; ax_pos0 <= max_ax_pos; ax_pos0++) { + ax_pos0 = C * ax_pos0 + D; + sino[view][tang_pos_num] += Projall[ax_pos0][0][0][0] / num_planes_per_axial_pos; + sino[plus90][tang_pos_num] += Projall[ax_pos0][0][0][2] / num_planes_per_axial_pos; + sino[view][-tang_pos_num] += Projall[ax_pos0][0][1][0] / num_planes_per_axial_pos; + sino[plus90][-tang_pos_num] += Projall[ax_pos0][0][1][2] / num_planes_per_axial_pos; + } + } + } + } else { + + + for (D = 0; D < C; D++) { + /* Here tang_pos_num==0 and phi!=k*45 */ + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <4>( +#else + (4, +#endif + Projall,image,proj_data_cyl_ptr, cphi, sphi, + delta + D, 0, R,min_ax_pos,max_ax_pos, + offset, num_planes_per_axial_pos, 0, + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos; ax_pos0 <= max_ax_pos; ax_pos0++) { + my_ax_pos0 = C * ax_pos0 + D; + sino[view][0] += Projall[ax_pos0][0][0][0] / num_planes_per_axial_pos; + sino[min90][0] += Projall[ax_pos0][0][0][1] / num_planes_per_axial_pos; + sino[plus90][0] += Projall[ax_pos0][0][0][2] / num_planes_per_axial_pos; + sino[min180][0] += Projall[ax_pos0][0][0][3] / num_planes_per_axial_pos; + } + + /* Here tang_pos_num!=0 and phi!=k*45. */ + for (tang_pos_num = min_tang_pos_num_in_loop; tang_pos_num <= max_abs_tangential_pos_num; tang_pos_num++) { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <3>( +#else + (3, +#endif + Projall,image,proj_data_cyl_ptr, cphi, sphi, + delta + D, tang_pos_num, R,min_ax_pos, max_ax_pos, + offset, num_planes_per_axial_pos, 0, + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (ax_pos0 = min_ax_pos; ax_pos0 <= max_ax_pos; ax_pos0++) { + my_ax_pos0 = C * ax_pos0 + D; + sino[view][tang_pos_num] += Projall[ax_pos0][0][0][0] / num_planes_per_axial_pos; + sino[min90][tang_pos_num] += Projall[ax_pos0][0][0][1] / num_planes_per_axial_pos; + sino[plus90][tang_pos_num] += Projall[ax_pos0][0][0][2] / num_planes_per_axial_pos; + sino[min180][tang_pos_num] += Projall[ax_pos0][0][0][3] / num_planes_per_axial_pos; + sino[view][-tang_pos_num] += Projall[ax_pos0][0][1][0] / num_planes_per_axial_pos; + sino[min90][-tang_pos_num] += Projall[ax_pos0][0][1][1] / num_planes_per_axial_pos; + sino[plus90][-tang_pos_num] += Projall[ax_pos0][0][1][2] / num_planes_per_axial_pos; + sino[min180][-tang_pos_num] += Projall[ax_pos0][0][1][3] / num_planes_per_axial_pos; + } + } + } + + + }// end of } else { + }// end of test for offset loop + + stop_timers(); + +} + +#endif // old 2D versions + +void +ForwardProjectorByBinUsingRayTracing:: +forward_project_view_2D(Viewgram & pos_view, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + assert(pos_view.get_segment_num() == 0); + assert(pos_view.get_view_num() >= 0); + assert(pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()); + + Viewgram dummy = pos_view; + + forward_project_all_symmetries_2D( + pos_view, + dummy, + dummy, + dummy, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); + +} + +void +ForwardProjectorByBinUsingRayTracing:: +forward_project_view_plus_90_2D(Viewgram & pos_view, + Viewgram & pos_plus90, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + assert(pos_view.get_segment_num() == 0); + assert(pos_view.get_view_num() >= 0); + assert(pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()/2); + + Viewgram dummy = pos_view; + + forward_project_all_symmetries_2D( + pos_view, + pos_plus90, + dummy, + dummy, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); +} + + +void +ForwardProjectorByBinUsingRayTracing:: +forward_project_view_min_180_2D(Viewgram & pos_view, + Viewgram & pos_min180, + const VoxelsOnCartesianGrid & image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + assert(pos_view.get_segment_num() == 0); + assert(pos_view.get_view_num() >= 0); + assert(pos_view.get_view_num() < pos_view.get_proj_data_info_ptr()->get_num_views()/2); + + Viewgram dummy = pos_view; + + forward_project_all_symmetries_2D( + pos_view, + dummy, + pos_min180, + dummy, + image, + min_axial_pos_num, max_axial_pos_num, + min_tangential_pos_num, max_tangential_pos_num); +} + + + +void +ForwardProjectorByBinUsingRayTracing:: +forward_project_all_symmetries_2D(Viewgram & pos_view, + Viewgram & pos_plus90, + Viewgram & pos_min180, + Viewgram & pos_min90, + const VoxelsOnCartesianGrid& image, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + start_timers(); + + // KT 20/06/2001 should now work for non-arccorrected data as well + const ProjDataInfoCylindrical * proj_data_info_ptr = + dynamic_cast + (pos_view.get_proj_data_info_ptr()); + if (proj_data_info_ptr == NULL) + error("ForwardProjectorByBinUsingRayTracing::forward_project called with wrong type of ProjDataInfo\n"); + + const int nviews = pos_view.get_proj_data_info_ptr()->get_num_views(); + + const int segment_num = pos_view.get_segment_num(); + const float delta = proj_data_info_ptr->get_average_ring_difference(segment_num); + const int view = pos_view.get_view_num(); + + assert(delta == 0); + assert(view >= 0); + + + /* remove assertions which would break the temporary 1,2 parameter forward_project. + Now checked before calling + assert(pos_plus90.get_view_num() == nviews / 2 + pos_view.get_view_num()); + assert(pos_min90.get_view_num() == nviews / 2 - pos_view.get_view_num()); + assert(pos_min180.get_view_num() == nviews - pos_view.get_view_num()); + */ + //assert(neg_view.get_view_num() == pos_view.get_view_num()); + //assert(neg_plus90.get_view_num() == pos_plus90.get_view_num()); + //assert(neg_min90.get_view_num() == pos_min90.get_view_num()); + //assert(neg_min180.get_view_num() == pos_min180.get_view_num()); + + // KT 21/05/98 added const where possible + // TODO C value depends whether you are in Double or not, + // If double C==2 => do 2*ax_pos0 and 2*ax_pos0+1 + const int C=1; + + int D, tang_pos_num; + int my_ax_pos0; + const float R = proj_data_info_ptr->get_ring_radius(); + + // a variable which will be used in the loops over tang_pos_num to get s_in_mm + Bin bin(pos_view.get_segment_num(), pos_view.get_view_num(),min_axial_pos_num,0); + + // KT 20/06/2001 rewrote using get_phi + const float cphi = cos(proj_data_info_ptr->get_phi(bin)); + const float sphi = sin(proj_data_info_ptr->get_phi(bin)); + + // find correspondence between ring coordinates and image coordinates: + // z = num_planes_per_axial_pos * ax_pos_num + axial_pos_to_z_offset + // KT 20/06/2001 write using symmetries member + const int num_planes_per_axial_pos = + round(symmetries_ptr->get_num_planes_per_axial_pos(segment_num)); + const float axial_pos_to_z_offset = + symmetries_ptr->get_axial_pos_to_z_offset(segment_num); + + const int max_abs_tangential_pos_num = + max(max_tangential_pos_num, -min_tangential_pos_num); + + const int min_abs_tangential_pos_num = + max_tangential_pos_num<0 ? + -max_tangential_pos_num + : (min_tangential_pos_num>0 ? + min_tangential_pos_num + : 0 ); + const int min_tang_pos_num_in_loop = + min_abs_tangential_pos_num==0 ? 1 : min_abs_tangential_pos_num; + + + + Array <4,float> Projall(IndexRange4D(min_axial_pos_num, max_axial_pos_num, 0, 1, 0, 1, 0, 3)); + Array <4,float> Projall2(IndexRange4D(min_axial_pos_num, max_axial_pos_num+1, 0, 1, 0, 1, 0, 3)); + + // What to do when num_planes_per_axial_pos==2 ? + // In the 2D case, the approach followed in 3D is ill-defined, as we would be + // forward projecting right along the edges of the voxels. + // Instead, we take for the contribution to an axial_pos_num, + // 1/2 left_voxel + centre_voxel + 1/2 right_voxel + + int num_lors_per_virtual_ring = 2; + + if (num_planes_per_axial_pos == 1) + { + num_lors_per_virtual_ring = 1; + } + + + + if (view == 0 || 4*view == nviews ) + { /* phi=0 or 45 */ + for (D = 0; D < C; D++) + { + if (min_abs_tangential_pos_num==0) + { + /* Here tang_pos_num=0 and phi=0 or 45*/ + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <2>( +#else + (2, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, 0, R,min_axial_pos_num, max_axial_pos_num, + 0.F/*==offset*/, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 = min_axial_pos_num; ax_pos0 <= max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + + pos_view[my_ax_pos0][0] += Projall[ax_pos0][0][0][0]; + pos_plus90[my_ax_pos0][0] +=Projall[ax_pos0][0][0][2]; + } + } + + if (num_planes_per_axial_pos == 2) + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <2>( +#else + (2, +#endif + Projall2, image, proj_data_info_ptr, cphi, sphi, + delta + D, 0, R, min_axial_pos_num, max_axial_pos_num+1, + -0.5F/*==offset*/, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/4, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 = min_axial_pos_num; ax_pos0 <= max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + pos_view[my_ax_pos0][0] += (Projall2[ax_pos0+1][0][0][0]+ Projall2[ax_pos0][0][0][0]); + pos_plus90[my_ax_pos0][0] += (Projall2[ax_pos0+1][0][0][2]+ Projall2[ax_pos0][0][0][2]); + } + } + } + + /* Now tang_pos_num!=0 and phi=0 or 45 */ + for (tang_pos_num = min_tang_pos_num_in_loop; tang_pos_num <= max_abs_tangential_pos_num; tang_pos_num++) + { + bin.tangential_pos_num() = tang_pos_num; + const float s_in_mm = proj_data_info_ptr->get_s(bin); + + + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <1>( +#else + (1, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, s_in_mm, R,min_axial_pos_num, max_axial_pos_num, + 0.F, num_planes_per_axial_pos, axial_pos_to_z_offset, + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 = min_axial_pos_num; ax_pos0 <= max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + if (tang_pos_num<=max_tangential_pos_num) + { + pos_view[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][0]; + pos_plus90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][2]; + } + if (-tang_pos_num>=min_tangential_pos_num) + { + pos_view[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][0]; + pos_plus90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][2]; + } + } + } + if (num_planes_per_axial_pos == 2) + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <1>( +#else + (1, +#endif + Projall2, image, proj_data_info_ptr, cphi, sphi, + delta + D, s_in_mm, R,min_axial_pos_num, max_axial_pos_num+1, + -0.5F, num_planes_per_axial_pos, axial_pos_to_z_offset, + 1.F/4, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 =min_axial_pos_num; ax_pos0 <=max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + if (tang_pos_num<=max_tangential_pos_num) + { + pos_view[my_ax_pos0][tang_pos_num] +=(Projall2[ax_pos0][0][0][0]+Projall2[ax_pos0+1][0][0][0]); + pos_plus90[my_ax_pos0][tang_pos_num] += (Projall2[ax_pos0][0][0][2]+Projall2[ax_pos0+1][0][0][2]); + } + if (-tang_pos_num>=min_tangential_pos_num) + { + pos_view[my_ax_pos0][-tang_pos_num] +=(Projall2[ax_pos0][0][1][0]+Projall2[ax_pos0+1][0][1][0]); + pos_plus90[my_ax_pos0][-tang_pos_num] +=(Projall2[ax_pos0][0][1][2]+Projall2[ax_pos0+1][0][1][2]); + } + } + } + } // Loop over tang_pos_num + } // Loop over D + } + else + { + // general phi + for (D = 0; D < C; D++) + { + if (min_abs_tangential_pos_num==0) + { + /* Here tang_pos_num==0 and phi!=k*45 */ + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <4>( +#else + (4, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, 0, R,min_axial_pos_num, max_axial_pos_num, + 0.F, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 = min_axial_pos_num; ax_pos0 <= max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + pos_view[my_ax_pos0][0] += Projall[ax_pos0][0][0][0]; + pos_min90[my_ax_pos0][0] += Projall[ax_pos0][0][0][1]; + pos_plus90[my_ax_pos0][0] += Projall[ax_pos0][0][0][2]; + pos_min180[my_ax_pos0][0] += Projall[ax_pos0][0][0][3]; + } + } + + if (num_planes_per_axial_pos == 2) + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <4>( +#else + (4, +#endif + Projall2, image, proj_data_info_ptr, cphi, sphi, + delta + D, 0, R,min_axial_pos_num, max_axial_pos_num, + -0.5F, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/4, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 = min_axial_pos_num; ax_pos0 <=max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + pos_view[my_ax_pos0][0] += (Projall2[ax_pos0][0][0][0]+Projall2[ax_pos0+1][0][0][0]); + pos_min90[my_ax_pos0][0] += (Projall2[ax_pos0][0][0][1]+Projall2[ax_pos0+1][0][0][1]); + pos_plus90[my_ax_pos0][0] +=(Projall2[ax_pos0][0][0][2]+Projall2[ax_pos0+1][0][0][2]); + pos_min180[my_ax_pos0][0] +=(Projall2[ax_pos0][0][0][3]+Projall2[ax_pos0+1][0][0][3]); + } + } + } + + /* Here tang_pos_num!=0 and phi!=k*45. */ + for (tang_pos_num = min_tang_pos_num_in_loop; tang_pos_num <= max_abs_tangential_pos_num; tang_pos_num++) + { + bin.tangential_pos_num() = tang_pos_num; + const float s_in_mm = proj_data_info_ptr->get_s(bin); + + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <3>( +#else + (3, +#endif + Projall, image, proj_data_info_ptr, cphi, sphi, + delta + D, s_in_mm, R,min_axial_pos_num, max_axial_pos_num, + 0.F, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/num_lors_per_virtual_ring, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 = min_axial_pos_num; ax_pos0<= max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + if (tang_pos_num<=max_tangential_pos_num) + { + pos_view[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][0]; + pos_min90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][1]; + pos_plus90[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][2]; + pos_min180[my_ax_pos0][tang_pos_num] += Projall[ax_pos0][0][0][3]; + } + if (-tang_pos_num>=min_tangential_pos_num) + { + pos_view[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][0]; + pos_min90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][1]; + pos_plus90[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][2]; + pos_min180[my_ax_pos0][-tang_pos_num] += Projall[ax_pos0][0][1][3]; + } + } + } + if (num_planes_per_axial_pos == 2) + { + if (proj_Siddon +#ifndef STIR_SIDDON_NO_TEMPLATE + <3>( +#else + (3, +#endif + Projall2, image, proj_data_info_ptr, cphi, sphi, + delta + D, s_in_mm, R,min_axial_pos_num, max_axial_pos_num+1, + -0.5F, num_planes_per_axial_pos, axial_pos_to_z_offset , + 1.F/4, + restrict_to_cylindrical_FOV)) + for (int ax_pos0 = min_axial_pos_num; ax_pos0 <= max_axial_pos_num; ax_pos0++) + { + my_ax_pos0 = C * ax_pos0 + D; + if (tang_pos_num<=max_tangential_pos_num) + { + pos_view[ my_ax_pos0][tang_pos_num] +=(Projall2[ax_pos0][0][0][0]+Projall2[ax_pos0+1][0][0][0]); + pos_min90[my_ax_pos0][tang_pos_num] += (Projall2[ax_pos0][0][0][1]+Projall2[ax_pos0+1][0][0][1]); + pos_plus90[ my_ax_pos0][tang_pos_num] +=(Projall2[ax_pos0][0][0][2]+Projall2[ax_pos0+1][0][0][2]); + pos_min180[ my_ax_pos0][tang_pos_num] += (Projall2[ax_pos0][0][0][3]+Projall2[ax_pos0+1][0][0][3]); + } + if (-tang_pos_num>=min_tangential_pos_num) + { + pos_view[ my_ax_pos0][-tang_pos_num] += (Projall2[ax_pos0][0][1][0] +Projall2[ax_pos0+1][0][1][0]); + pos_min90[ my_ax_pos0][-tang_pos_num] +=(Projall2[ax_pos0][0][1][1]+Projall2[ax_pos0+1][0][1][1]); + pos_plus90[ my_ax_pos0][-tang_pos_num] += (Projall2[ax_pos0][0][1][2]+ Projall2[ax_pos0+1][0][1][2]); + pos_min180[ my_ax_pos0][-tang_pos_num] += ( Projall2[ax_pos0][0][1][3]+ Projall2[ax_pos0+1][0][1][3]); + } + } + } + + }// end of loop over tang_pos_num + + }// end loop over D + }// end of else + + stop_timers(); +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ForwardProjectorByBinUsingRayTracing_Siddon.cxx b/src/recon_buildblock/ForwardProjectorByBinUsingRayTracing_Siddon.cxx new file mode 100644 index 0000000000..d614599f5c --- /dev/null +++ b/src/recon_buildblock/ForwardProjectorByBinUsingRayTracing_Siddon.cxx @@ -0,0 +1,606 @@ +// +// +/*! + + \file + \ingroup projection + + \brief implementation of Siddon's algorithm + + \author Claire Labbe + \author Kris Thielemans + \author (based originally on C code by Matthias Egger) + + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* + Modification history + + KT 25/11/2003 : + - passed normalisation factor such that we don't have to post-multiply + - convert Siddon argument to a template argument. This allows the compiler + to resolve all if (Siddon==...) statements at compiler time, and hence + speeds up the code. + KT 1/12/2003 : + WARNING: somewhat different results are generated since this version + (see below) + - almost completely reimplemented in terms of what I did for + ProjMatrixByBinUsingRayTracing and RayTraceVoxelsOnCartesianGrid. + This version is now stable under numerical rounding error, and + gives the same results as the projection matrix version. + Unfortunately, this means it gives somewhat DIFFERENT results compared + to the previous version. The difference sits essentially in the end-voxel + on the LOR. For most/all applications, this difference should be irrelevant. + - added option restrict_to_cylindrical_FOV + - make proj_Siddon return true or false to check if any data has been + forward projected +*/ + +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/round.h" +#include +#include +#ifndef STIR_NO_NAMESPACE +using std::min; +using std::max; +#endif + +START_NAMESPACE_STIR +template +static inline int sign(const T& t) +{ + return t<0 ? -1 : 1; +} + +/*! + This function uses a 3D version of Siddon's algorithm for forward projecting. + See M. Egger's thesis for details. + In addition to the symmetries is segment and view, it also uses s,-s symmetry + (while being careful when s=0 to avoid self-symmetric cases) + + For historical reasons, 'axial_pos_num' is here called 'ring'. rmin,rmax are + min_axial_pos_num and max_axial_pos_num. + + See RayTraceVoxelsOnCartesianGrid for a shorter and clearer version of the Siddon algorithm. + */ + + +// KT 20/06/2001 should now work for non-arccorrected data as well, pass s_in_mm +#ifndef STIR_SIDDON_NO_TEMPLATE +template +#endif +bool +ForwardProjectorByBinUsingRayTracing:: +proj_Siddon( +#ifdef STIR_SIDDON_NO_TEMPLATE + int Siddon, +#endif + Array <4,float> & Projptr, const VoxelsOnCartesianGrid &Bild, + const ProjDataInfoCylindrical* proj_data_info_ptr, + const float cphi, const float sphi, const float delta, const + float s_in_mm, + const float R, const int rmin, const int rmax, const float offset, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset, + const float norm_factor, + const bool restrict_to_cylindrical_FOV) +{ + /* + * Siddon == 1 => Phiplus90_r0ab + * Siddon == 2 => Phiplus90s0_r0ab + * Siddon == 3 => Symall_r0ab + * Siddon == 4 => s0_r0ab + */ + + /* TODO: check in implementation: + why first voxel +=inc_? in all directions + */ + /* See RayTraceVoxelsOnCartesianGrid() for a clearer implementation of the + Siddon algorithm. This doesn't handle the symmetries, so is a lot shorter. + + For a comparison, remember that the current function relies on symmetries + having been applied first, so the end_point-start_point coordinates + always have particular signs. In the notation of RayTraceVoxelsOnCartesianGrid(): + */ + const int sign_x=-1; + const int sign_y=+1; + const int sign_z=+1; + + // in our current coordinate system, the following constant is always 2 + const int num_planes_per_physical_ring = 2; + assert(fabs(Bild.get_voxel_size().z() * num_planes_per_physical_ring/ proj_data_info_ptr->get_ring_spacing() -1) < 10E-4); + + + +#ifdef NEWSCALE + /* KT 16/02/98 removed division by voxel_size.x() to get line integrals in mm + (or whatever units that voxel_size() is defined) + */ + const float normalisation_constant = norm_factor; +#else + const float normalisation_constant = norm_factor / Bild.get_voxel_size().x(); +#endif + + // KT 1/12/2003 no longer subtract -1 as determination of first and last voxel is now + // no longer sensitive to rounding error + const float fovrad_in_mm = + min((min(Bild.get_max_x(), -Bild.get_min_x()))*Bild.get_voxel_size().x(), + (min(Bild.get_max_y(), -Bild.get_min_y()))*Bild.get_voxel_size().y()); + + const CartesianCoordinate3D& voxel_size = Bild.get_voxel_size(); + + CartesianCoordinate3D start_point; + CartesianCoordinate3D stop_point; + { + /* parametrisation of LOR is + X= s*cphi + a*sphi, + Y= s*sphi - a*cphi, + // Z= t/costheta+offset_in_z - a*tantheta + Z= num_planes_per_axial_pos * (rmin + offset) + axial_pos_to_z_offset + + + num_planes_per_physical_ring * delta/2 * (1 - a / TMP); + with TMP = sqrt(R*R - square(s_in_mm)); + The Z parametrisation can be understood by noting that at a=TMP, the LOR + intersects the detector cylinder with radius R. + + find now min_a, max_a such that end-points intersect border of FOV + */ + float max_a; + float min_a; + + if (restrict_to_cylindrical_FOV) + { + if (fabs(s_in_mm) >= fovrad_in_mm) + return false; + // a has to be such that X^2+Y^2 == fovrad^2 + max_a = sqrt(square(fovrad_in_mm) - square(s_in_mm)); + min_a = -max_a; + } // restrict_to_cylindrical_FOV + else + { + // use FOV which is square. + // note that we use square and not rectangular as otherwise symmetries + // would take us out of the FOV. TODO + /* + a has to be such that + |X| <= fovrad_in_mm && |Y| <= fovrad_in_mm + */ + if (fabs(cphi) < 1.E-3 || fabs(sphi) < 1.E-3) + { + if (fovrad_in_mm < fabs(s_in_mm)) + return false; + max_a = fovrad_in_mm; + min_a = -fovrad_in_mm; + } + else + { + max_a = min((fovrad_in_mm*sign(sphi) - s_in_mm*cphi)/sphi, + (fovrad_in_mm*sign(cphi) + s_in_mm*sphi)/cphi); + min_a = max((-fovrad_in_mm*sign(sphi) - s_in_mm*cphi)/sphi, + (-fovrad_in_mm*sign(cphi) + s_in_mm*sphi)/cphi); + if (min_a > max_a - 1.E-3*voxel_size.x()) + return false; + } + + } //!restrict_to_cylindrical_FOV + const float TMP = sqrt(R*R - square(s_in_mm)); + + start_point.x() = (s_in_mm*cphi + max_a*sphi)/voxel_size.x(); + start_point.y() = (s_in_mm*sphi - max_a*cphi)/voxel_size.y(); + //start_point.z() = (t_in_mm/costheta+offset_in_z - max_a*tantheta)/voxel_size.z(); + start_point.z() = num_planes_per_axial_pos * (rmin + offset) + axial_pos_to_z_offset + + + num_planes_per_physical_ring * delta/2 * (1 - max_a / TMP); + + stop_point.x() = (s_in_mm*cphi + min_a*sphi)/voxel_size.x(); + stop_point.y() = (s_in_mm*sphi - min_a*cphi)/voxel_size.y(); + //stop_point.z() = (t_in_mm/costheta+offset_in_z - min_a*tantheta)/voxel_size.z(); + stop_point.z() = num_planes_per_axial_pos * (rmin + offset) + axial_pos_to_z_offset + + + num_planes_per_physical_ring * delta/2 * (1 - min_a / TMP); + } + // find voxel which contains the start_point, and go to its 'left' edge + const float xmin = round(start_point.x()) - sign_x*0.5F; + const float ymin = round(start_point.y()) - sign_y*0.5F; + const float zmin = round(start_point.z()) - sign_z*0.5F; + // find voxel which contains the end_point, and go to its 'right' edge + const float xmax = round(stop_point.x()) + sign_x*0.5F; + const float ymax = round(stop_point.y()) + sign_y*0.5F; + const float zmax = round(stop_point.z()) + sign_z*0.5F; + + const CartesianCoordinate3D difference = stop_point-start_point; + assert(difference.x() <= .00001F); + assert(difference.y() >= -.00001F); + assert(difference.z() >= -.00001F); + + const float small_difference = 1.E-5F; + const bool zero_diff_in_x = fabs(difference.x())<=small_difference; + const bool zero_diff_in_y = fabs(difference.y())<=small_difference; + const bool zero_diff_in_z = fabs(difference.z())<=small_difference; + + // d12 is distance between the 2 points (times normalisation_const) + const float d12 = + static_cast(norm(difference*Bild.get_voxel_size()) * normalisation_constant); + // KT 16/02/98 multiply with d12 to get normalisation right from the start + const float inc_x = (zero_diff_in_x) ? 1000000.F*d12 : d12 / (sign_x*difference.x()); + const float inc_y = (zero_diff_in_y) ? 1000000.F*d12 : d12 / (sign_y*difference.y()); + const float inc_z = (zero_diff_in_z) ? 1000000.F*d12 : d12 / (sign_z*difference.z()); + + + /* Find the a? values of the intersection points of the LOR with the planes between voxels. + Note on special handling of rays parallel to one of the planes: + + The corresponding a? value would be -infinity. We just set it to + a value low enough such that the start value of 'a' is not compromised + further on. + Normally + a? = (?min-start_point.?) * inc_? * sign_? + Because the start voxel includes the start_point, we have that + a? <= -inc_? + As inc_? is set to some large number when the ray is parallel, this is + a good value for the ray. + */ + /* intersection point of the LOR with the previous yz-plane : */ + float ax = (zero_diff_in_x) ? -inc_x : (xmin - start_point.x()) * sign_x * inc_x; + /* intersection point of the LOR with the previous xz-plane : */ + float ay = (zero_diff_in_y) ? -inc_y : (ymin - start_point.y()) * sign_y * inc_y; + /* The biggest a? value gives the start of the 'a'-row */ + /* intersection point of the LOR with the previous xy-plane : */ + float az = (zero_diff_in_z) ? -inc_z : (zmin - start_point.z()) * sign_z * inc_z; + float a = max(ax, max(ay, az)); + + /* The smallest a? value, gives the end of the 'a'-row */ + /* (Note: doc is copied from RayTraceVoxelsOnCartesianGrid. Would need to be adapted a bit) + + Find a?end for the last intersections with the coordinate planes. + amax will then be the smallest of all these a?end. + + If the LOR is parallel to a plane, take care that its a?end is larger than all the others. + Note that axend <= d12 (difference.x()+1)/difference.x() + + In fact, we will take a?end slightly smaller than the actual last value (i.e. we multiply + with a factor .9999). This is to avoid rounding errors in the loop below. In this loop, + we try to detect the end of the LOR by comparing a (which is either ax,ay or az) with + aend. With exact arithmetic, a? would have been incremented exactly to + a?_end_actual = a?start + (?max-?end)*inc_?*sign_?, + so we could loop until a==aend_actual. However, because of numerical precision, + a? might turn out be a tiny bit smaller then a?_end_actual. So, we set aend a + (somewhat less tiny) bit smaller than aend_actual, and loop while (a= 0 && Zdup <= maxplane) { + Projptr[ring0][0][0][0] += d * Bild[Zdup][Y][X]; + Projptr[ring0][0][0][2] += d * Bild[Zdup][X][-Y]; + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][1][0][1] += d * Bild[Zdup][X][Y]; + Projptr[ring0][1][0][3] += d * Bild[Zdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][1][1][0] += d * Bild[Zdup][-Y][-X]; + Projptr[ring0][1][1][2] += d * Bild[Zdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][0][1][1] += d * Bild[Zdup][-X][-Y]; + Projptr[ring0][0][1][3] += d * Bild[Zdup][-Y][X]; + } + } + if (Qdup >= 0 && Qdup <= maxplane) { + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][0][0][1] += d * Bild[Qdup][X][Y]; + Projptr[ring0][0][0][3] += d * Bild[Qdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][0][1][0] += d * Bild[Qdup][-Y][-X]; + Projptr[ring0][0][1][2] += d * Bild[Qdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][1][1][1] += d * Bild[Qdup][-X][-Y]; + Projptr[ring0][1][1][3] += d * Bild[Qdup][-Y][X]; + } + Projptr[ring0][1][0][0] += d * Bild[Qdup][Y][X]; + Projptr[ring0][1][0][2] += d * Bild[Qdup][X][-Y]; + } + + } + a = ax ; ax += inc_x; + X--; + } else { /* LOR leaves voxel through xy-plane */ + const float d = az - a; + int Zdup = Z; + int Qdup = Q; + for (int ring0 = rmin; + ring0 <= rmax; + ring0++, Zdup += num_planes_per_axial_pos, Qdup +=num_planes_per_axial_pos ) + { + /* all symmetries except in 's'*/ + if (Zdup >= 0 && Zdup <= maxplane) { + Projptr[ring0][0][0][0] += d * Bild[Zdup][Y][X]; + Projptr[ring0][0][0][2] += d * Bild[Zdup][X][-Y]; + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][1][0][1] += d * Bild[Zdup][X][Y]; + Projptr[ring0][1][0][3] += d * Bild[Zdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][1][1][0] += d * Bild[Zdup][-Y][-X]; + Projptr[ring0][1][1][2] += d * Bild[Zdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][0][1][1] += d * Bild[Zdup][-X][-Y]; + Projptr[ring0][0][1][3] += d * Bild[Zdup][-Y][X]; + + } + } + if (Qdup >= 0 && Qdup <= maxplane) { + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][0][0][1] += d * Bild[Qdup][X][Y]; + Projptr[ring0][0][0][3] += d * Bild[Qdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][0][1][0] += d * Bild[Qdup][-Y][-X]; + Projptr[ring0][0][1][2] += d * Bild[Qdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][1][1][1] += d * Bild[Qdup][-X][-Y]; + Projptr[ring0][1][1][3] += d * Bild[Qdup][-Y][X]; + } + Projptr[ring0][1][0][0] += d * Bild[Qdup][Y][X]; + Projptr[ring0][1][0][2] += d * Bild[Qdup][X][-Y]; + } + + } + a = az ; az += inc_z; + Z++; + Q--; + } + else if (ay < az) { /* LOR leaves voxel through xz-plane */ + const float d = ay - a; + int Zdup = Z; + int Qdup = Q; + for (int ring0 = rmin; + ring0 <= rmax; + ring0++, Zdup += num_planes_per_axial_pos, Qdup +=num_planes_per_axial_pos ) + { + /* all symmetries except in 's' */ + if (Zdup >= 0 && Zdup <= maxplane) { + Projptr[ring0][0][0][0] += d * Bild[Zdup][Y][X]; + Projptr[ring0][0][0][2] += d * Bild[Zdup][X][-Y]; + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][1][0][1] += d * Bild[Zdup][X][Y]; + Projptr[ring0][1][0][3] += d * Bild[Zdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][1][1][0] += d * Bild[Zdup][-Y][-X]; + Projptr[ring0][1][1][2] += d * Bild[Zdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][0][1][1] += d * Bild[Zdup][-X][-Y]; + Projptr[ring0][0][1][3] += d * Bild[Zdup][-Y][X]; + } + } + if (Qdup >= 0 && Qdup <= maxplane) { + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][0][0][1] += d * Bild[Qdup][X][Y]; + Projptr[ring0][0][0][3] += d * Bild[Qdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][0][1][0] += d * Bild[Qdup][-Y][-X]; + Projptr[ring0][0][1][2] += d * Bild[Qdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][1][1][1] += d * Bild[Qdup][-X][-Y]; + Projptr[ring0][1][1][3] += d * Bild[Qdup][-Y][X]; + } + Projptr[ring0][1][0][0] += d * Bild[Qdup][Y][X]; + Projptr[ring0][1][0][2] += d * Bild[Qdup][X][-Y]; + } + + } + a = ay; ay += inc_y; + Y++; + } else {/* LOR leaves voxel through xy-plane */ + const float d = az - a; + int Zdup = Z; + int Qdup = Q; + for (int ring0 = rmin; + ring0 <= rmax; + ring0++, Zdup += num_planes_per_axial_pos, Qdup +=num_planes_per_axial_pos ) + { + /* all symmetries except in 's' */ + if (Zdup >= 0 && Zdup <= maxplane) { + Projptr[ring0][0][0][0] += d * Bild[Zdup][Y][X]; + Projptr[ring0][0][0][2] += d * Bild[Zdup][X][-Y]; + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][1][0][1] += d * Bild[Zdup][X][Y]; + Projptr[ring0][1][0][3] += d * Bild[Zdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][1][1][0] += d * Bild[Zdup][-Y][-X]; + Projptr[ring0][1][1][2] += d * Bild[Zdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][0][1][1] += d * Bild[Zdup][-X][-Y]; + Projptr[ring0][0][1][3] += d * Bild[Zdup][-Y][X]; + } + } + if (Qdup >= 0 && Qdup <= maxplane) { + if ((Siddon == 4) || (Siddon == 3)) { + Projptr[ring0][0][0][1] += d * Bild[Qdup][X][Y]; + Projptr[ring0][0][0][3] += d * Bild[Qdup][Y][-X]; + } + if ((Siddon == 1) || (Siddon == 3)) { + Projptr[ring0][0][1][0] += d * Bild[Qdup][-Y][-X]; + Projptr[ring0][0][1][2] += d * Bild[Qdup][-X][Y]; + } + if (Siddon == 3) { + Projptr[ring0][1][1][1] += d * Bild[Qdup][-X][-Y]; + Projptr[ring0][1][1][3] += d * Bild[Qdup][-Y][X]; + } + Projptr[ring0][1][0][0] += d * Bild[Qdup][Y][X]; + Projptr[ring0][1][0][2] += d * Bild[Qdup][X][-Y]; + } + + } + a = az ; az += inc_z; + Z++; + Q--; + } + + } /* Ende while (a(Array<4,float> &Projptr, const VoxelsOnCartesianGrid &, + const ProjDataInfoCylindrical* proj_data_info_ptr, + const float cphi, const float sphi, const float delta, + const float s_in_mm, + const float R, const int min_ax_pos_num, const int max_ax_pos_num, const float offset, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset, + const float norm_factor, + const bool restrict_to_cylindrical_FOV); + + +template +bool +ForwardProjectorByBinUsingRayTracing:: +proj_Siddon<2>(Array<4,float> &Projptr, const VoxelsOnCartesianGrid &, + const ProjDataInfoCylindrical* proj_data_info_ptr, + const float cphi, const float sphi, const float delta, + const float s_in_mm, + const float R, const int min_ax_pos_num, const int max_ax_pos_num, const float offset, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset, + const float norm_factor, + const bool restrict_to_cylindrical_FOV); + + +template +bool +ForwardProjectorByBinUsingRayTracing:: +proj_Siddon<3>(Array<4,float> &Projptr, const VoxelsOnCartesianGrid &, + const ProjDataInfoCylindrical* proj_data_info_ptr, + const float cphi, const float sphi, const float delta, + const float s_in_mm, + const float R, const int min_ax_pos_num, const int max_ax_pos_num, const float offset, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset, + const float norm_factor, + const bool restrict_to_cylindrical_FOV); + + +template +bool +ForwardProjectorByBinUsingRayTracing:: +proj_Siddon<4>(Array<4,float> &Projptr, const VoxelsOnCartesianGrid &, + const ProjDataInfoCylindrical* proj_data_info_ptr, + const float cphi, const float sphi, const float delta, + const float s_in_mm, + const float R, const int min_ax_pos_num, const int max_ax_pos_num, const float offset, + const int num_planes_per_axial_pos, + const float axial_pos_to_z_offset, + const float norm_factor, + const bool restrict_to_cylindrical_FOV); + +#endif +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/FourierRebinning.cxx b/src/recon_buildblock/FourierRebinning.cxx new file mode 100644 index 0000000000..634acc6118 --- /dev/null +++ b/src/recon_buildblock/FourierRebinning.cxx @@ -0,0 +1,686 @@ +/*! + \file + \brief FORE kernel + \ingroup recon_buildblock + \author Matthias Egger + \author Claire LABBE + \author Kris Thielemans + \author Oliver Nix + \author PARAPET project +*/ +/* + Copyright (C) 1193 - 1996, Matthias Egger (copyright transfered to Hammersmith Imanet Ltd) + Copyright (C) 2000 PARAPET partners + Copyright (C) 2003 - 2005, Hammersmith Imanet Ltd + Copyright (C) 2004 - 2005 DKFZ Heidelberg, Germany + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/FourierRebinning.h" +#include "stir/Scanner.h" +#include "stir/ProjDataInfoCylindrical.h" +#include "stir/ProjDataInterfile.h" +#include "stir/SegmentBySinogram.h" +#include "stir/Bin.h" +#include "stir/IndexRange3D.h" +#include "stir/IndexRange2D.h" +#include "stir/Succeeded.h" +#include "stir/round.h" +#include "stir/display.h" +#include +#include +#include +#include +#include +#include +#include "stir/numerics/fourier.h" +#include "stir/interpolate.h" +#include "stir/info.h" + +#define POSITIVE_Z_SHIFT -1 +#define NEGATIVE_Z_SHIFT 1 +#define CHANGE_Z_SHIFT 2 + +#ifndef STIR_NO_NAMESPACES +using std::ios; +using std::ofstream; +#endif + + +START_NAMESPACE_STIR + + +const char * const +FourierRebinning::registered_name = "FORE"; + +void +FourierRebinning:: +initialise_keymap() +{ + base_type::initialise_keymap(); + parser.add_start_key("FORE Parameters"); + parser.add_stop_key("End FORE Parameters"); + parser.add_key("Smallest angular frequency", &kmin); + parser.add_key("Smallest transaxial frequency",&wmin); + parser.add_key("Delta max for small omega", &deltamin); + parser.add_key("Index for consistency", &kc); + parser.add_key("FORE debug level", &fore_debug_level); + +} + + +bool +FourierRebinning:: +post_processing() +{ + if (base_type::post_processing() == true) + return true; + // TODO check other parameterssegment + return false; +} + +void +FourierRebinning:: +set_defaults() +{ + base_type::set_defaults(); +//CON There is probably nothing like a set of FORE parameters which make sense for all scanners. +//CON Therefore default it to illegal values such that the application will terminate if the user +//CON does not set them to values which make sense via the parameter file or the set functions. + kmin = -1; + wmin = -1; + deltamin = -1; + kc = -1; + fore_debug_level = 0; +} + +FourierRebinning:: +FourierRebinning() +{ + set_defaults(); +} + + +Succeeded +FourierRebinning:: +rebin() +{ + + start_timers(); + CPUTimer timer; + timer.start(); + + //CON return value + Succeeded success = Succeeded::yes; + + //CL Find the number of views and tangential positions power of two + int num_views_pow2; + for ( num_views_pow2 = 1; num_views_pow2 < 2*proj_data_sptr->get_num_views() && num_views_pow2 < (1<<15); num_views_pow2*=2); + int num_tang_poss_pow2; + for ( num_tang_poss_pow2 = 1; num_tang_poss_pow2 < proj_data_sptr->get_num_tangential_poss() && num_tang_poss_pow2 < (1<<15); num_tang_poss_pow2*=2); + + //CL Initialise the 2D Fourier transform of all rebinned sinograms P(w,k)=0 + const int num_planes = proj_data_sptr->get_proj_data_info_ptr()->get_scanner_ptr()->get_num_rings()*2-1; + + Array<3,std::complex > FT_rebinned_data(IndexRange3D(0, num_planes-1, 0, num_views_pow2-1, 0, num_tang_poss_pow2-1)); + Array<3,float> Weights_for_FT_rebinned_data(IndexRange3D(0, num_planes-1, 0,num_views_pow2-1, 0,num_tang_poss_pow2-1)); + //CON some statistics + PETCount_rebinned num_rebinned(0,0,0); + + //CON Create the output (rebinned projection data) data structure and set the properties of the rebinned sinograms + shared_ptr rebinned_proj_data_sptr; + //CON initialise the new projection data properties by copying the properties from the input projection data. + shared_ptr rebinned_proj_data_info_sptr + ( proj_data_sptr->get_proj_data_info_ptr()->clone()); + //CON Adapt the properties that will be modified by the rebinning. + rebinned_proj_data_info_sptr->set_num_views(num_views_pow2/2); + //CON After rebinning we have of course only "direct" sinograms left e.q only segment 0 exists + rebinned_proj_data_info_sptr->reduce_segment_range(0,0); + //CON maximal ring difference a LOR in the largest segment that is going to be rebinned + const int max_delta = dynamic_cast + (*proj_data_sptr->get_proj_data_info_ptr()).get_max_ring_difference(max_segment_num_to_process); + //CON The maximum/minimum ring difference covered by LORs written to the rebinned sinogram changed to the maximum ring + //CON difference covered by the largest segment that has been rebinned. + dynamic_cast(*rebinned_proj_data_info_sptr).set_min_ring_difference(-max_delta, 0); + dynamic_cast(*rebinned_proj_data_info_sptr).set_max_ring_difference(max_delta, 0); + //CON minimal and maximal axial position number. As usual we start with axial position 0 in segment 0 + rebinned_proj_data_info_sptr->set_min_axial_pos_num(0, 0); + rebinned_proj_data_info_sptr->set_max_axial_pos_num(num_planes-1,0); + //CON create the output (interfile) file to where the rebinned data will be written. + rebinned_proj_data_sptr.reset(new ProjDataInterfile (proj_data_sptr->get_exam_info_sptr(), + rebinned_proj_data_info_sptr,output_filename_prefix)); + //CON get scanner related parameters needed for the rebinning kernel. + //CON create a scanner object. The scanner type is identified from the projection data info. + const Scanner* scanner = rebinned_proj_data_sptr->get_proj_data_info_ptr()->get_scanner_ptr(); + const float half_distance_between_rings = scanner->get_ring_spacing()/2.F; + const float sampling_distance_in_s = rebinned_proj_data_info_sptr->get_sampling_in_s(Bin(0,0,0,0)); + const float radial_sampling_freq_w = float(2.*_PI)/sampling_distance_in_s/num_tang_poss_pow2; + //CON D = #bins * binsize, R = D / 2 + const float R_field_of_view_mm = ((int) (rebinned_proj_data_info_sptr->get_num_tangential_poss() / 2) - 1)*sampling_distance_in_s; + const float scanner_space_between_rings = scanner->get_ring_spacing(); + const float scanner_ring_radius = scanner->get_effective_ring_radius(); + const float ratio_ring_spacing_to_ring_radius = scanner_space_between_rings / scanner_ring_radius; + + //CON Check that the user defineable FORE parameters are inside a possible range of values + if(fore_check_parameters(num_tang_poss_pow2,num_views_pow2,max_segment_num_to_process) != Succeeded::yes){ + error("FORE Rebinning :: Setup failed "); + }; + + //CON Loop over all positive segments. Negative segments (those with negative (opposite) ring differences + //CON will be merged with the positive segment 180 degree sinograms to form a 360 degree segment. + for (int seg_num=0; seg_num <=max_segment_num_to_process ; seg_num++){ + + info(boost::format("FORE Rebinning :: Processing segment No %1% *") % seg_num); + + // TODO at present, the processing is done by segment. However, it's fairly easy to + // change this to by sinogram (the rebinning call below will do everything + // as a loop over axial_pos anyway). + // This would save some memory overhead, and increase potential for parallelisation later. + // (The parallelised version of FORE in PARAPET was organised this way). + + //CON get one (positive) segment + SegmentBySinogram segment = proj_data_sptr->get_segment_by_sinogram(seg_num); + + //CON Retrieve some segment dependent properties needed for the rebinning kernel + const ProjDataInfoCylindrical& proj_data_info_cylindrical = dynamic_cast(*segment.get_proj_data_info_ptr()); + const float average_ring_difference_in_segment = proj_data_info_cylindrical.get_average_ring_difference(segment.get_segment_num()); + + + //CL Form a 360 degree sinogram by merging two 180 degree segments with opposite ring difference + //CL to get a new segment sampled over 2*pi (where 0 < view < pi) + //CON See DeFrise paper (exact and approximate rebinning algorithms for 3D PET data), Sec IV,C (p153) + //KT TODO this is currently not a good idea, as all ProjDataInfo classes assume that + //KT views go from 0 to Pi. + //CON Get the corresponding (negative) segment with the same absolute but opposite obliqueness + const SegmentBySinogram segment_neg = proj_data_sptr->get_segment_by_sinogram(-seg_num); + //CON Expand the (positive) segment such that the two segments can be merged + segment.grow(IndexRange3D(segment.get_min_axial_pos_num(), segment.get_max_axial_pos_num(), + 0,2*segment.get_num_views()-1, segment.get_min_tangential_pos_num(), segment.get_max_tangential_pos_num() + )); + + + //CON merge the two segments to form "360 degrees" sinograms + const int min_tangential_pos_num = std::max(segment_neg.get_min_tangential_pos_num(), + -segment.get_max_tangential_pos_num()); + + + const int max_tangential_pos_num = std::min(segment_neg.get_max_tangential_pos_num(), + -segment.get_min_tangential_pos_num()); + + + for (int ring = segment.get_min_axial_pos_num(); ring <= segment.get_max_axial_pos_num(); ring++) + for (int view = segment_neg.get_min_view_num(); view <= segment_neg.get_max_view_num(); view++) + for( int tangential_pos_num = min_tangential_pos_num; tangential_pos_num<=max_tangential_pos_num; tangential_pos_num++) + segment[ring][view+segment_neg.get_num_views()][tangential_pos_num] = segment_neg[ring][view][-tangential_pos_num]; + + // CON in debug mode visualize the segment + if(fore_debug_level>=2) + { + char s[100]; + sprintf(s, "(extended) segment by sinogram %d",segment.get_segment_num()); + display(segment, segment.find_max(), s); + } + + //CON the sinogramm dimensions need to have a dimension which is a power of 2 (required by the FFT algorithm) + //CON for s (radial coordinate) pad the sinogramm with zeros to form a larger array. + //CON the phi (azimuthal cordinate (view)) coordinate is periodic. The samples need to be interpolated to the + //CON to the new matrix size. Do this by linear interpolation. + //CON -> DeFrise p. 153 Sec IV.C + do_adjust_nb_views_to_pow2(segment); + + + //CON The sinogramm data is now in the required format and ready for rebinning. + //CON The rebinned data is stored in a 3 dimensional array of complex numbers (FT_rebinned_data). + //CON FT_rebinned_data[plane][w(FT of s)][k(FT of phi)] + //CON Weight has the same dimensions. It stores normalisation factors (floats) + //CON to take into account the variable number of contributions to each frequency. + do_rebinning(FT_rebinned_data, Weights_for_FT_rebinned_data, num_rebinned, segment, + num_tang_poss_pow2, num_views_pow2, num_planes, average_ring_difference_in_segment, + half_distance_between_rings, sampling_distance_in_s, radial_sampling_freq_w, R_field_of_view_mm, + ratio_ring_spacing_to_ring_radius); + + } //CON end loop over segments. + + + //CON Some statistics + std::cout << "\nFORE Rebinning :: Total rebinning count: \n"; + do_display_count(num_rebinned); + + info("FORE Rebinning :: Inverse FFT the rebinned sinograms " ); + //CL now finally fill in the new sinogram s + SegmentBySinogram sino2D_rebinned = rebinned_proj_data_sptr->get_empty_segment_by_sinogram(0); + + + for (int plane=FT_rebinned_data.get_min_index();plane <= FT_rebinned_data.get_max_index(); plane++){ + + if(plane%10==0) info(boost::format("FORE Rebinning :: Inv FFT rebinned z-position (slice) = %1%") % plane); + + //CON Create a temporary 2D array of complex numbers to store the rebinned and summed fourier coefficients for one slice. + //CON This data is then inverse FFTd and copied to a sinogram data structure. + //CON Strictly seen this temporary data structure is no longer necessary because the inv. FFT could now be + //CON be done on FT_rebinned_data itself. Since one has to anyway access the full FTdata matrix to apply + //CON the rebinning weights + //CON before the inv. FFT can be applied this is not much overhead and it can be left like it was done when still + //CON using the numerical receipies FFT code. + Array<2, std::complex > FT_rebinned_sinogram(IndexRange2D(0,num_tang_poss_pow2-1,0,num_views_pow2/2)); + //CON fourier_for_real_data will resize the array to its appropriate dimensions + Array<2,float> rebinned_sinogram(IndexRange2D(0,1,0,1)); + + //CON Normalise the rebinned sinograms by applying the weight factors + //CON See DeFrise IV.D p154. + for (int j = 0; j < num_tang_poss_pow2; j++) { + for (int i = 0; i <= num_views_pow2/2; i++) { + const float Actual_Weight = (Weights_for_FT_rebinned_data[plane][i][j] == 0) ? 0 : + 1.F/(Weights_for_FT_rebinned_data[plane][i][j]); + FT_rebinned_sinogram[j][i] = FT_rebinned_data[plane][i][j]* Actual_Weight; + + } + } + + if(fore_debug_level>=3) + { + char s[100]; + Array<2,float> real(FT_rebinned_sinogram.get_index_range()); + for (int i = 0; i < num_views_pow2; i++) + for (int j = 0; j <= num_tang_poss_pow2/2; j++) + real[i][j] = FT_rebinned_sinogram[i][j].real(); + sprintf(s, "real part of FT of rebinned (extended) sinogram %d",plane); + display(real, s, real.find_max()); + for (int i = 0; i < num_views_pow2; i++) + for (int j = 0; j <= num_tang_poss_pow2/2; j++) + real[i][j] = FT_rebinned_sinogram[i][j].imag(); + sprintf(s, "imag part of FT of rebinned (extended) sinogram %d",plane); + display(real, s, real.find_max()); + } + + //CON inverse FFT the rebinned sinograms + rebinned_sinogram = inverse_fourier_for_real_data(FT_rebinned_sinogram); + + //CL Keep only one half of data [o.._PI] + for (int i=0;i<(int)(num_views_pow2/2);i++) + for (int j=0;j Min = %1%, Max= %2%, Sum = %3%") + % sino2D_rebinned.find_min() + % sino2D_rebinned.find_max() + % sino2D_rebinned.sum()); + + //CON finally write the rebinned sinograms to file + const Succeeded success_this_sino = + rebinned_proj_data_sptr->set_segment(sino2D_rebinned); + + + if (success == Succeeded::yes && success_this_sino == Succeeded::no) + success = Succeeded::no; + stop_timers(); +//CON presently not very useful. Maybe one could define a vriable fore_debug_level and +//CON only write in case of debugging + if(fore_debug_level>0) + do_log_file(); + + return success; + +} + + + +void +FourierRebinning:: +do_rebinning(Array<3,std::complex > &FT_rebinned_data, Array<3,float> &Weights_for_FT_rebinned_data, + PETCount_rebinned &count_rebinned, + const SegmentBySinogram &segment, const int num_tang_poss_pow2, + const int num_views_pow2, const int num_planes, const float average_ring_difference_in_segment, + const float half_distance_between_rings, const float sampling_distance_in_s, + const float radial_sampling_freq_w, const float R_field_of_view_mm, + const float ratio_ring_spacing_to_ring_radius) + + + { + const int local_rebinned = count_rebinned.total; + const int local_miss= count_rebinned.miss; + const int local_ssrb= count_rebinned.ssrb; + +//CON Loop over all slices, FFT the sinograms and call the actual rebinning kernel. + for (int axial_pos_num = segment.get_min_axial_pos_num(); axial_pos_num <= segment.get_max_axial_pos_num() ;axial_pos_num++) + { + + if(axial_pos_num%10 == 0) info(boost::format("FORE Rebinning z (slice) = %1%") % axial_pos_num); + Array<2,float> current_sinogram(IndexRange2D(0,num_tang_poss_pow2-1,0,num_views_pow2-1)); + + //CL Calculate the 2D FFT of P(w,k) of the merged segment + //CON copy the sinogram data of slice axial_pos_num from the segment array to slicedata + //CON the sinogram is flipped. This will taken account for in the rebinning, where the assignment of the FFT + //CON coefficients are assigned opposite. + for (int j = 0; j < segment.get_num_tangential_poss(); j++) + for (int i = 0; i < num_views_pow2; i++) + current_sinogram[j][i] = segment[axial_pos_num][i][j + segment.get_min_tangential_pos_num()]; + + //CON FFT slicedata + const Array<2,std::complex > FT_current_sinogram = fourier_for_real_data(current_sinogram); + + //CON determine the axial position of the middle of the LOR in mm relative to Bin(segment=0,view=0,axial_pos=0,tang_pos=0) + const ProjDataInfo& proj_data_info = *segment.get_proj_data_info_ptr(); + const float z_in_mm = proj_data_info.get_m(Bin(segment.get_segment_num(),0,axial_pos_num,0)) - proj_data_info.get_m(Bin(0,0,0,0)); + + //CON Call the rebinning kernel. + rebinning(FT_rebinned_data,Weights_for_FT_rebinned_data,count_rebinned,FT_current_sinogram, + z_in_mm, average_ring_difference_in_segment, num_views_pow2, + num_tang_poss_pow2,half_distance_between_rings,sampling_distance_in_s,radial_sampling_freq_w, + R_field_of_view_mm,ratio_ring_spacing_to_ring_radius); + + }//CL End of loop of axial_pos_num + + if(fore_debug_level > 0){ + info(boost::format("Total rebinned: %1%\n" + "Total missed: %2%\n" + "Total rebinned SSRB: %3%") + % (count_rebinned.total - local_rebinned) % (count_rebinned.miss - local_miss) % (count_rebinned.ssrb - local_ssrb) ); + } + +} + + + + +void +FourierRebinning:: +rebinning(Array<3,std::complex > &FT_rebinned_data, Array<3,float> &Weights_for_FT_rebinned_data, + PETCount_rebinned &num_rebinned, const Array<2,std::complex > &FT_current_sinogram, + const float z_in_mm, const float delta, + const int num_views_pow2, const int num_tang_poss_pow2, const float half_distance_between_rings, + const float sampling_distance_in_s, const float radial_sampling_freq_w, const float R_field_of_view_mm, + const float ratio_ring_spacing_to_ring_radius) +{ + + + //CON prevent rebinning to non existing z-positions (sinograms) + const int maxplane = FT_rebinned_data.get_max_index(); + //CON determine z position (sino identifier) + const int z = round(z_in_mm/half_distance_between_rings); + // TODO replace call to error() by warning() and returning Succeeded::no + if(fabs(static_cast(z_in_mm/half_distance_between_rings - z)) > .0001) + error("FORE rebinning :: rebinning kernel expected integer z coordinate but found a non integer value %g\n", z_in_mm); + + //CL t is the tangent of the angle theta between the LOR and the transaxial plane + const float t = delta * ratio_ring_spacing_to_ring_radius / 2.F; + + + //CON The continuous frequency "w" corresponds the radial coordinate "s" + //CON The integer Fourier index "k" corresponds to the azimuthal angle "view" + + //CON FORE regime (rebinning) + //CON Iterate over all frequency tuples (w,k) starting from wmin,kmin up to num_tang_poss_pow2/2,num_views_pow2/2 + + for (int j = wmin; j <= num_tang_poss_pow2/2;j++) { + for (int i = kmin; i <= num_views_pow2/2; i++) { + + float w = static_cast(j) * radial_sampling_freq_w; + float k = static_cast(i); + + //CON FORE consistency criteria . FORE is a good approximation only if w and k are large + //CON (FORE is a high frequency approximation). + //CON For small w and k second order corrections become important. + //CON FORE is a good approximation if: abs(w/k) > Romega, k>klim || w>wlim. + //CON see DeFrise III.C, p150. + //CON i>kc is an additional consistency criteria. The components of a 2D FFT sinogram are + //CON negligible when |-k/w| is larger than the + //CON the radius of the scanners FOV.These contributions can be forced to zero therefore avoiding + //CON large z-shifts which results in z-positions outside the axial range of the scanner. + if ((k > w * R_field_of_view_mm) && (i > kc)){ + continue; + } + + //CON FORE establishes a relation of the 2D FT of an oblique sinogram to the 2D FT of a direct sinogram + //CON shifted in z by a frequency dependent value (zshift). + //CON see DeFrise, III.B Formula 28 + float zshift; + if(w==0) zshift = 0.; + else zshift = t * k / w; //CL in mm + + //CON first evaluate the positive frequency for a given bin (w,k). The FFT is stored in data such, that in the first + //CON two dimensions the positive frequencies are stored. Starting with the zero frequency, followed by the smallest + //CON positive frequency and so on. The smallest negative frequency is in the last index value. + //CON Due to the ordering of positive and negative frequencies and the fact that this is the FFT of real data + //CON the assignment of the positive and negative frequency + //CON contributions to the rebinned data matrix in F-space can be done here in one pass. + for(int shift_direction=POSITIVE_Z_SHIFT; shift_direction<=NEGATIVE_Z_SHIFT; shift_direction+=CHANGE_Z_SHIFT){ + + int jj = j; + + if(shift_direction==NEGATIVE_Z_SHIFT && j > 0) jj = num_tang_poss_pow2 - j; + + //CON new_z_sl is the z-coordinate of the shifted z-position this contribution is assigned to. + const float new_z_sl = static_cast(z) + shift_direction * zshift/half_distance_between_rings; + //CON find the nearest "real" direct sinogram located at z < new_z_sl + const int small_z = static_cast(floor(new_z_sl)); + //CON distance between the direct sinogram and the z-position this F-space contribution was assigned to. + const float m = new_z_sl - small_z; + //CON Assign the F-space contributions from the given oblique sinogram to the neighbouring direct sinogram. + //CON The contribution is weighted by the + //CON z-"distance" of the calculated shifted z-position to the neighbouring direct sinogram with z < zshift. + if (small_z >= 0 && small_z <= maxplane) { + const float OneMinusM = 1.F - m; + FT_rebinned_data[small_z][i][jj] += (FT_current_sinogram[jj][i] * OneMinusM); + Weights_for_FT_rebinned_data[small_z][i][jj] += OneMinusM; + num_rebinned.total += 1; + } else { + num_rebinned.miss += 1; + } + //CON same for z > zshift + if (small_z >= -1 && small_z < maxplane) { + FT_rebinned_data[small_z + 1][i][jj] += (FT_current_sinogram[jj][i] * m); + Weights_for_FT_rebinned_data[small_z + 1][i][jj] += m; + } + + }//CON shift_direction + }//CON end j + }//CON end i + +//CL Particular cases for small frequencies i.e Small w +//CON Due to this they will only contribute to one direct sinogram. +//CON This is SSRB where each oblique sinogramm is an estimate of the direct sinogram +//CON P(w,k,z,d) = P(w,k,z,0) +//CON Only sinograms with an obliqueness smaller than deltamin (set by parameter file) are accepted + const int small_z = z; + + if (delta <= deltamin) { + //CL First, treat small w's then k=1..kNyq-1 : + //CON Same logic as in FORE, except that no zshift position is calculated. It is assumed that the obliqueness is small + //CON and therefore there will be only contributions to one direct sinogram and the weights are therefore always 1. + + for (int j = 0; j < wmin; j++){ + for (int i = 0; i <= num_views_pow2/2; i++) { + + for(int shift_direction=POSITIVE_Z_SHIFT;shift_direction<=NEGATIVE_Z_SHIFT;shift_direction+=CHANGE_Z_SHIFT){ + + int jj=j; + + // Take reverse ordering of tangential position in the negative segment into account (?) + if(shift_direction==NEGATIVE_Z_SHIFT && j > 0) + jj=num_tang_poss_pow2 - j; + + + if (small_z >= 0 && small_z <= maxplane ) { + + FT_rebinned_data[small_z][i][jj] += FT_current_sinogram[jj][i]; + Weights_for_FT_rebinned_data[small_z][i][jj] += 1.; + if(j==1) num_rebinned.ssrb += 1; + } + + } // end shift_direction + } // end for j + } // end for i + + +//CL Small k : +//CL Next treat small k's and w=wNyq=(num_tang_poss_pow2 / 2)+1, k=1..klim : + for (int j = wmin; j <= num_tang_poss_pow2/2; j++) { + for (int i = 0; i <= kmin; i++) { + + for(int shift_direction=POSITIVE_Z_SHIFT;shift_direction<=NEGATIVE_Z_SHIFT;shift_direction+=CHANGE_Z_SHIFT){ + + int jj=j; + + // Take reverse ordering of tangential position in the negative segment into account (?) + if(shift_direction==NEGATIVE_Z_SHIFT && j > 0) + jj=num_tang_poss_pow2 - j; + + + if (small_z >= 0 && small_z <= maxplane ) { + FT_rebinned_data[small_z][i][jj] += FT_current_sinogram[jj][i]; + Weights_for_FT_rebinned_data[small_z][i][jj] += 1.; + num_rebinned.ssrb += 1; + } + + } // shift_direction + } // end for j + } // end for i + + } // end delta < deltamin + + } + + + +void +FourierRebinning:: +do_log_file() +{//CL Saving time details and write them to log file + char file[200]; + sprintf(file,"%s.log",output_filename_prefix.c_str()); + + std::ofstream logfile(file); + + if (logfile.fail() || logfile.bad()) { + warning("FORE Rebinning :: Error opening log file\n"); + } + + std::time_t now = std::time(NULL); + logfile << "FORE Rebinning :: Date of the FORE image reconstruction : " << std::asctime(std::localtime(&now)) + << parameter_info() + << "\n\n CPU Time :\n" << get_CPU_timer_value() << '\n'; +} + + +void +FourierRebinning:: +do_display_count(PETCount_rebinned &count) +{// Display rebinning statistics + std::cout << "FORE Rebinning :: Total rebinned: " << count.total << '\n' + << " Total missed: " << count.miss << '\n'; + + if (count.miss != 0) + std::cout << " (" << 100. * count.miss / (count.miss + count.ssrb) + << " percent)\n"; + std::cout << "FORE Rebinning :: Total rebinned SSRB: " << count.ssrb << std::endl; +} + + +void +FourierRebinning:: +do_adjust_nb_views_to_pow2(SegmentBySinogram &segment) +{ +// Adjustment of the number of views to a power of two +//CON Use the STIR overlap_interpolate method and remove the simlar private implementation (adjust_pow2) here. + const int num_views_pow2 = stir::round(pow(2.,((int)ceil(log ((float)segment.get_num_views())/log(2.))))); + const float offset_for_overlap_interpolate = 0.F; + + if (num_views_pow2 == segment.get_num_views()) + return; + + //CON Create the projection data info ptr for the resized segment + shared_ptr out_proj_data_info_sptr(segment.get_proj_data_info_ptr()->clone()); + out_proj_data_info_sptr->set_num_views(num_views_pow2); + //CON the re-dimensioned segment + SegmentBySinogram out_segment = + out_proj_data_info_sptr->get_empty_segment_by_sinogram(segment.get_segment_num()); + + for (int axial_pos_num = segment.get_min_axial_pos_num(); axial_pos_num <= segment.get_max_axial_pos_num(); + axial_pos_num++) + { + const Sinogram sino2D = segment.get_sinogram(axial_pos_num); + Sinogram out_sino2D = out_segment.get_sinogram(axial_pos_num); + + float extension_factor = static_cast(out_sino2D.get_num_views())/ static_cast(sino2D.get_num_views()); + overlap_interpolate(out_sino2D, sino2D,extension_factor,offset_for_overlap_interpolate,true); + + out_segment.set_sinogram(out_sino2D); + } + segment = out_segment; +} + +Succeeded FourierRebinning:: +fore_check_parameters(int num_tang_poss_pow2, int num_views_pow2, int max_segment_num_to_process){ + +//CON Check if the parameters given make sense. + + if(deltamin<0) { + warning("FORE initialisation :: The deltamin parameter must be an integer value >= 0"); + return Succeeded::no; + + } + + + if(wmin < 0 || kmin < 0){ + warning("FORE initialisation :: The parameters wmin and kmin must be >=0\n" + " Negative frequencies are not allowed. Due to symmetry reasons they are implicitly defined by the positive wmin/kmin cut off values"); + return Succeeded::no; + } + + + if(wmin >= num_tang_poss_pow2/2 || kmin >= num_views_pow2/2) { + warning(boost::format("FORE initialisation :: The parameter wmin or kmin is larger than the highest frequency component computed by the FFT algorithm\n" + " Choose an value smaller than the largest frequency\n" + " kmin must be smaller than %1% and wmin must be smaller than %2%") + % (num_tang_poss_pow2/2) % (num_views_pow2/2)); + return Succeeded::no; + } + + + if(kc >= num_views_pow2/2) { + warning(boost::format("FORE initialisation :: Your parameter kc is larger than the highest frequency component in w (FTT of radial coordinate s)\n" + " Choose an value smaller than the largest frequency\n" + " kc must be smaller than %1%") + % num_views_pow2); + return Succeeded::no; + } + + + if(max_segment_num_to_process > proj_data_sptr->get_num_segments()){ + warning(boost::format("FORE initialisation :: Your data set stores %1% segments\n" + " The maximum number of segments to process variable is larger than that.") + % (proj_data_sptr->get_num_segments()/2+1)); + return Succeeded::no; + } + + + if(max_segment_num_to_process < 0){ + warning("FORE initialisation :: The maximum segment number to process must be an integer value >=0"); + return Succeeded::no; + } + + return Succeeded::yes; +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/GeneralisedObjectiveFunction.cxx b/src/recon_buildblock/GeneralisedObjectiveFunction.cxx new file mode 100644 index 0000000000..c9f06e2905 --- /dev/null +++ b/src/recon_buildblock/GeneralisedObjectiveFunction.cxx @@ -0,0 +1,394 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class stir::GeneralisedObjectiveFunction + + \author Kris Thielemans + \author Sanida Mustafovic + \author Nicolas A Karakatsanis + +*/ + +#include "stir/recon_buildblock/GeneralisedObjectiveFunction.h" +#include "stir/DiscretisedDensity.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" + +START_NAMESPACE_STIR + +template +void +GeneralisedObjectiveFunction:: +set_defaults() +{ + this->prior_sptr.reset(); + // note: cannot use set_num_subsets(1) here, as other parameters (such as projectors) are not set-up yet. + this->num_subsets = 1; + //Number of nested iterations + this->num_nested_subiterations=1; + //Number of nested initialization iterations + this->num_nested_initialization_subiterations=0; +} + +template +void +GeneralisedObjectiveFunction:: +initialise_keymap() +{ + this->parser.add_parsing_key("prior type", &prior_sptr); +} + +template +GeneralisedObjectiveFunction:: +~GeneralisedObjectiveFunction() +{} + +template +Succeeded +GeneralisedObjectiveFunction:: +set_up(shared_ptr const& target_data_ptr) +{ + if (!is_null_ptr(this->prior_sptr) && + this->prior_sptr->set_up(target_data_ptr) == Succeeded::no) + return Succeeded::no; + + if (this->num_subsets <= 0) + { + warning("Number of subsets %d should be larger than 0.", + this->num_subsets); + return Succeeded::no; + } + + return Succeeded::yes; +} + +template +GeneralisedPrior * const +GeneralisedObjectiveFunction:: +get_prior_ptr() const +{ return this->prior_sptr.get(); } + +template +void +GeneralisedObjectiveFunction:: +set_prior_sptr(const shared_ptr >& arg) +{ + this->prior_sptr = arg; +} + +template +bool +GeneralisedObjectiveFunction:: +prior_is_zero() const +{ + return + is_null_ptr(this->prior_sptr) || + this->prior_sptr->get_penalisation_factor() == 0; +} + +template +bool +GeneralisedObjectiveFunction:: +is_nested() const +{ + return !is_null_ptr(this->last_nested_estimate_sptr); +} + +template +void +GeneralisedObjectiveFunction:: +set_nested_output_filename_prefix(std::string& filename_prefix, int global_subiteration_num) +{ + char num[50]; + sprintf(num, "_%d", global_subiteration_num); + + this->nested_output_filename_prefix=filename_prefix + num; +} + +template +double +GeneralisedObjectiveFunction:: +compute_penalty(const TargetT& current_estimate) +{ + if (this->prior_is_zero()) + return 0.; + else + return this->prior_sptr->compute_value(current_estimate); +} + +template +double +GeneralisedObjectiveFunction:: +compute_penalty(const TargetT& current_estimate, + const int subset_num) +{ + return this->compute_penalty(current_estimate)/this->get_num_subsets(); +} + +template +void +GeneralisedObjectiveFunction:: +compute_sub_gradient(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) +{ + assert(gradient.get_index_range() == current_estimate.get_index_range()); + + this->compute_sub_gradient_without_penalty(gradient, + current_estimate, + subset_num); + if (!this->prior_is_zero()) + { + shared_ptr prior_gradient_sptr(gradient.get_empty_copy()); + this->prior_sptr->compute_gradient(*prior_gradient_sptr, current_estimate); + + // (*prior_gradient_sptr)/= num_subsets; + // gradient -= *prior_gradient_sptr; + typename TargetT::const_full_iterator prior_gradient_iter = prior_gradient_sptr->begin_all_const(); + const typename TargetT::const_full_iterator end_prior_gradient_iter = prior_gradient_sptr->end_all_const(); + typename TargetT::full_iterator gradient_iter = gradient.begin_all(); + while (prior_gradient_iter!=end_prior_gradient_iter) + { + *gradient_iter -= (*prior_gradient_iter)/this->get_num_subsets(); + ++gradient_iter; ++prior_gradient_iter; + } + } +} + +template +int +GeneralisedObjectiveFunction:: +get_num_subsets() const +{ + return this->num_subsets; +} + +template +double +GeneralisedObjectiveFunction:: +compute_objective_function_without_penalty(const TargetT& current_estimate) +{ + double result = 0.; + for (int subset_num=0; subset_numget_num_subsets(); ++subset_num) + result += + this->compute_objective_function_without_penalty(current_estimate, subset_num); + return result; +} + +template +double +GeneralisedObjectiveFunction:: +compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num) +{ + return + this->actual_compute_objective_function_without_penalty(current_estimate, subset_num); +} + +template +double +GeneralisedObjectiveFunction:: +compute_objective_function(const TargetT& current_estimate, + const int subset_num) +{ + return + this->compute_objective_function_without_penalty(current_estimate, subset_num) - + this->compute_penalty(current_estimate, subset_num); +} + +template +double +GeneralisedObjectiveFunction:: +compute_objective_function(const TargetT& current_estimate) +{ + return + this->compute_objective_function_without_penalty(current_estimate) - + this->compute_penalty(current_estimate); +} + +/////////////////////// Hessian + +template +Succeeded +GeneralisedObjectiveFunction:: +add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const +{ + { + string explanation; + if (!output.has_same_characteristics(input, + explanation)) + { + warning("GeneralisedObjectiveFunction:\n" + "input and output for add_multiplication_with_approximate_sub_Hessian_without_penalty\n" + "should have the same characteristics.\n%s", + explanation.c_str()); + return Succeeded::no; + } + } + return + this->actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(output, + input, + subset_num); +} + +template +Succeeded +GeneralisedObjectiveFunction:: +add_multiplication_with_approximate_sub_Hessian(TargetT& output, + const TargetT& input, + const int subset_num) const +{ + if (this->add_multiplication_with_approximate_sub_Hessian_without_penalty(output, input, subset_num) == + Succeeded::no) + return Succeeded::no; + + if (!this->prior_is_zero()) + { + // TODO used boost:scoped_ptr + shared_ptr prior_output_sptr(output.get_empty_copy()); + if (this->prior_sptr->add_multiplication_with_approximate_Hessian(*prior_output_sptr, output) == + Succeeded::no) + return Succeeded::no; + + + // (*prior_output_sptr)/= num_subsets; + // output -= *prior_output_sptr; + typename TargetT::const_full_iterator prior_output_iter = prior_output_sptr->begin_all_const(); + const typename TargetT::const_full_iterator end_prior_output_iter = prior_output_sptr->end_all_const(); + typename TargetT::full_iterator output_iter = output.begin_all(); + while (prior_output_iter!=end_prior_output_iter) + { + *output_iter -= (*prior_output_iter)/this->get_num_subsets(); + ++output_iter; ++prior_output_iter; + } + } + + return Succeeded::yes; + +} + + +template +Succeeded +GeneralisedObjectiveFunction:: +add_multiplication_with_approximate_Hessian_without_penalty(TargetT& output, + const TargetT& input) const +{ + for (int subset_num=0; subset_numget_num_subsets(); ++subset_num) + { + if (this->add_multiplication_with_approximate_sub_Hessian_without_penalty(output, + input, + subset_num) == + Succeeded::no) + return Succeeded::no; + } + + return Succeeded::yes; +} + +template +Succeeded +GeneralisedObjectiveFunction:: +add_multiplication_with_approximate_Hessian(TargetT& output, + const TargetT& input) const +{ + for (int subset_num=0; subset_numget_num_subsets(); ++subset_num) + { + if (this->add_multiplication_with_approximate_sub_Hessian(output, + input, + subset_num) == + Succeeded::no) + return Succeeded::no; + } + + return Succeeded::yes; +} + +template +Succeeded +GeneralisedObjectiveFunction:: +actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const +{ + error("GeneralisedObjectiveFunction:\n" + "actual_add_multiplication_with_approximate_sub_Hessian_without_penalty implementation is not overloaded by your objective function."); + return Succeeded::no; +} + +/////////////////////// other functions + +template +std::string +GeneralisedObjectiveFunction:: +get_objective_function_values_report(const TargetT& current_estimate) +{ +#ifdef BOOST_NO_STRINGSTREAM + char str[10000]; + ostrstream s(str, 10000); +#else + std::ostringstream s; +#endif + const double no_penalty = + this->compute_objective_function_without_penalty(current_estimate); + const double penalty = + this->compute_penalty(current_estimate); + s << "Objective function without penalty " << no_penalty + << "\nPenalty " << penalty + << "\nDifference (i.e. total) " << no_penalty-penalty + << '\n'; + return s.str(); +} + +template +bool +GeneralisedObjectiveFunction:: +subsets_are_approximately_balanced() const +{ + std::string dummy; + return this->actual_subsets_are_approximately_balanced(dummy); +} + +template +bool +GeneralisedObjectiveFunction:: +subsets_are_approximately_balanced(std::string& warning_message) const +{ + return this->actual_subsets_are_approximately_balanced(warning_message); +} + + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif + +template class GeneralisedObjectiveFunction >; +template class GeneralisedObjectiveFunction; +template class GeneralisedObjectiveFunction; + +END_NAMESPACE_STIR + + diff --git a/src/recon_buildblock/GeneralisedPrior.cxx b/src/recon_buildblock/GeneralisedPrior.cxx new file mode 100644 index 0000000000..6ef3545bce --- /dev/null +++ b/src/recon_buildblock/GeneralisedPrior.cxx @@ -0,0 +1,79 @@ +// +// +/* + Copyright (C) 2002- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup priors + \brief implementation of the stir::GeneralisedPrior + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +#include "stir/recon_buildblock/GeneralisedPrior.h" +#include "stir/DiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" + +START_NAMESPACE_STIR + + +template +void +GeneralisedPrior::initialise_keymap() +{ + this->parser.add_key("penalisation factor", &this->penalisation_factor); +} + + +template +void +GeneralisedPrior::set_defaults() +{ + this->penalisation_factor = 0; +} + +template +Succeeded +GeneralisedPrior:: +set_up(shared_ptr const&) +{ + return Succeeded::yes; +} + +template +Succeeded +GeneralisedPrior:: +add_multiplication_with_approximate_Hessian(TargetT& output, + const TargetT& input) const +{ + error("GeneralisedPrior:\n" + "add_multiplication_with_approximate_Hessian implementation is not overloaded by your prior."); + return Succeeded::no; +} + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif + +template class GeneralisedPrior >; +template class GeneralisedPrior; + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/IterativeReconstruction.cxx b/src/recon_buildblock/IterativeReconstruction.cxx new file mode 100644 index 0000000000..20b4313a7b --- /dev/null +++ b/src/recon_buildblock/IterativeReconstruction.cxx @@ -0,0 +1,630 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup recon_buildblock + + \brief implementation of the stir::IterativeReconstruction class + + \author Matthew Jacobson + \author Kris Thielemans + \author Sanida Mustafovic + \author Nicolas A Karakatsanis + \author PARAPET project + +*/ + + +#include "stir/recon_buildblock/IterativeReconstruction.h" +#include "stir/DiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/shared_ptr.h" +#include +#include "stir/NumericInfo.h" +#include "stir/utilities.h" +#include "stir/is_null_ptr.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" +#include +// for time(), used as seed for random stuff +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + + +START_NAMESPACE_STIR + +//********* parameters **************** +template +void +IterativeReconstruction::set_defaults() +{ + base_type::set_defaults(); + this->objective_function_sptr.reset(); + this->num_subsets = 1; + this->start_subset_num = 0; + this->num_subiterations = 1; + this->start_subiteration_num =1; + // default to all 1's + this->initial_data_filename = "1"; + + this->max_num_full_iterations=NumericInfo().max_value(); + this->save_interval = 1; + this->inter_iteration_filter_interval = 0; + this->inter_iteration_filter_ptr.reset(); +//MJ 02/08/99 added subset randomization + this->randomise_subset_order = false; + this->report_objective_function_values_interval = 0; + +} + +template +void +IterativeReconstruction::initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_parsing_key("objective function type", &objective_function_sptr); + this->parser.add_key("number of subiterations", &num_subiterations); + this->parser.add_key("start at subiteration number", &start_subiteration_num); + this->parser.add_key("save estimates at subiteration intervals", &save_interval); + this->parser.add_key("initial estimate", &initial_data_filename); + this->parser.add_key("number of subsets", &this->num_subsets); + this->parser.add_key("start at subset", &start_subset_num); + this->parser.add_key("uniformly randomise subset order", &randomise_subset_order); + this->parser.add_key("inter-iteration filter subiteration interval",&inter_iteration_filter_interval); + this->parser.add_parsing_key("inter-iteration filter type", &inter_iteration_filter_ptr); + this->parser.add_key("report objective function values interval", + &this->report_objective_function_values_interval); +} + +template +void IterativeReconstruction:: +ask_parameters() +{ + + base_type::ask_parameters(); + + + char initial_data_filename_char[max_filename_length]; + + + // KT 21/10/98 use new order of arguments + ask_filename_with_extension(initial_data_filename_char, + "Get initial estimate from which file (1 = 1's): ", ""); + + this->initial_data_filename=initial_data_filename_char; + + this->num_subsets= ask_num("Number of ordered sets: ", 1,100000000,1); + this->num_subiterations=ask_num("Number of subiterations", + 1,NumericInfo().max_value(),this->num_subsets); + + this->start_subiteration_num=ask_num("Start at what subiteration number : ", 1,NumericInfo().max_value(),1); + + this->start_subset_num=ask_num("Start with which ordered set : ", + 0,this->num_subsets-1,0); + + this->save_interval=ask_num("Save estimates at sub-iteration intervals of: ", + 1,this->num_subiterations,this->num_subiterations); + + + this->inter_iteration_filter_interval= + ask_num("Do inter-iteration filtering at sub-iteration intervals of: ", + 0, this->num_subiterations, 0); + + if(this->inter_iteration_filter_interval>0 ) + { + cerr<::list_registered_names(cerr); + + const string inter_iteration_filter_type = ask_string(""); + + this->inter_iteration_filter_ptr. + reset(DataProcessor::read_registered_object(0, inter_iteration_filter_type)); + } + + + + this->randomise_subset_order= + ask("Randomly generate subset order?", false); + + +} + + +template +bool IterativeReconstruction:: +post_processing() +{ + if (base_type::post_processing()) + return true; + + if (is_null_ptr(this->objective_function_sptr)) + { warning("You have to specify an objective function"); return true; } + + if (this->initial_data_filename.length() == 0) + { warning("You need to specify an initial estimate file"); return true; } + + return false; +} + +//************ get_ functions **************** +template +GeneralisedObjectiveFunction const& +IterativeReconstruction:: +get_objective_function() const +{ return *this->objective_function_sptr; } + +template +shared_ptr > +IterativeReconstruction:: +get_objective_function_sptr() const +{ return this->objective_function_sptr; } + +template +const int +IterativeReconstruction:: +get_max_num_full_iterations() const +{ return this->max_num_full_iterations; } + +template +const int +IterativeReconstruction:: +get_num_subsets() const +{ return this->num_subsets; } + +template +const int +IterativeReconstruction:: +get_num_subiterations() const +{ return this->num_subiterations; } + +template +const int +IterativeReconstruction:: +get_start_subiteration_num() const +{ return this->start_subiteration_num; } + +template +const int +IterativeReconstruction:: +get_start_subset_num() const +{ return this->start_subset_num; } + +template +const int +IterativeReconstruction:: +get_save_interval() const +{ return this->save_interval; } + +template +const bool +IterativeReconstruction:: +get_randomise_subset_order() const +{ return this->randomise_subset_order; } + +template +const DataProcessor& +IterativeReconstruction:: +get_inter_iteration_filter() const +{ return *this->inter_iteration_filter_ptr; } + +template +const int +IterativeReconstruction:: +get_inter_iteration_filter_interval() const +{ return this->inter_iteration_filter_interval; } + +template +const int +IterativeReconstruction:: +get_report_objective_function_values_interval() const +{ return this->report_objective_function_values_interval; } + +//************ set_ functions **************** +template +void +IterativeReconstruction:: +set_objective_function_sptr(const shared_ptr >& arg) +{ + this->objective_function_sptr = arg; +} + +template +void +IterativeReconstruction:: +set_max_num_full_iterations(const int arg) +{ + this->max_num_full_iterations = arg; +} + +template +void +IterativeReconstruction:: +set_num_subsets(const int arg) +{ + this->num_subsets = arg; +} + +template +void +IterativeReconstruction:: +set_num_subiterations(const int arg) +{ + this->num_subiterations = arg; +} + +template +void +IterativeReconstruction:: +set_start_subiteration_num(const int arg) +{ + this->start_subiteration_num = arg; +} + +template +void +IterativeReconstruction:: +set_start_subset_num(const int arg) +{ + this->start_subset_num = arg; +} + +template +void +IterativeReconstruction:: +set_save_interval(const int arg) +{ + this->save_interval = arg; +} + +template +void +IterativeReconstruction:: +set_randomise_subset_order(const bool arg) +{ + this->randomise_subset_order = arg; +} + +template +void +IterativeReconstruction:: +set_inter_iteration_filter_ptr(const shared_ptr >& arg) +{ + this->inter_iteration_filter_ptr = arg; +} + +template +void +IterativeReconstruction:: +set_inter_iteration_filter_interval(const int arg) +{ + this->inter_iteration_filter_interval = arg; +} + +template +void +IterativeReconstruction:: +set_report_objective_function_values_interval(const int arg) +{ + this->report_objective_function_values_interval = arg; +} + +//************ other functions **************** +template +IterativeReconstruction:: +IterativeReconstruction() +{ +} + +template +std::string +IterativeReconstruction:: +make_filename_prefix_subiteration_num(const std::string& filename_prefix) const +{ + char num[50]; + sprintf(num, "_%d", subiteration_num); + return filename_prefix + num; +} + +template +std::string +IterativeReconstruction:: +make_filename_prefix_subiteration_num() const +{ + return + this->make_filename_prefix_subiteration_num(this->output_filename_prefix); +} + +template +TargetT * +IterativeReconstruction::get_initial_data_ptr() const +{ + if(this->initial_data_filename=="0") + { + return this->objective_function_sptr->construct_target_ptr(); + } + else if(this->initial_data_filename=="1") + { + TargetT * target_data_ptr = + this->objective_function_sptr->construct_target_ptr(); + std::fill(target_data_ptr->begin_all(), target_data_ptr->end_all(), 1.F); + return target_data_ptr; + } + else + { + return + TargetT::read_from_file(this->initial_data_filename); + } +} + +// KT 10122001 new +template +Succeeded +IterativeReconstruction:: +reconstruct() +{ + this->start_timers(); + + shared_ptr target_data_sptr(this->get_initial_data_ptr()); + if (this->set_up(target_data_sptr) == Succeeded::no) + { + this->stop_timers(); + return Succeeded::no; + } + + this->stop_timers(); + + return this->reconstruct(target_data_sptr); +} + +template +Succeeded +IterativeReconstruction:: +reconstruct(shared_ptr const& target_data_sptr) +{ + + this->start_timers(); +#if 0 + if (this->set_up(target_data_sptr) == Succeeded::no) + { + this->stop_timers(); + return Succeeded::no; + } +#endif + + for(subiteration_num=start_subiteration_num;subiteration_num<=num_subiterations && this->terminate_iterations==false; subiteration_num++) + { + this->update_estimate(*target_data_sptr); + this->end_of_iteration_processing(*target_data_sptr); + } + + this->stop_timers(); + + cerr << "Total CPU Time " << this->get_CPU_timer_value() << "secs"< +Succeeded +IterativeReconstruction:: +set_up(shared_ptr const& target_data_sptr) +{ + if (base_type::set_up(target_data_sptr) == Succeeded::no) + return Succeeded::no; + + //initialize iteration loop terminator + this->terminate_iterations=false; + + + if (this->num_subsets<1 ) + { warning("number of subsets should be positive"); return Succeeded::no; } + + if (is_null_ptr(this->objective_function_sptr)) + { warning("You have to specify an objective function"); return Succeeded::no; } + + const int new_num_subsets = + this->objective_function_sptr->set_num_subsets(this->num_subsets); + if (new_num_subsets!=this->num_subsets) + { + warning("Number of subsets requested : %d, but actual number used is %d\n", + this->num_subsets, new_num_subsets); + this->num_subsets = new_num_subsets; + } + + if (this->objective_function_sptr->set_up(target_data_sptr) == Succeeded::no) + return Succeeded::no; + + if (this->num_subiterations<1) + { warning("Range error in number of subiterations"); return Succeeded::no; } + + if(this->start_subset_num<0 || this->start_subset_num>=this->num_subsets) + { warning("Range error in starting subset"); return Succeeded::no; } + + if(this->save_interval<1 || this->save_interval>this->num_subiterations) + { warning("Range error in iteration save interval"); return Succeeded::no;} + + if (this->inter_iteration_filter_interval<0) + { warning("Range error in inter-iteration filter interval "); return Succeeded::no; } + + if (this->start_subiteration_num<1) + { warning("Range error in starting subiteration number"); return Succeeded::no; } + + ////////////////// subset order + + // KT 05/07/2000 made randomise_subset_order int + if (this->randomise_subset_order!=0){ + srand((unsigned int) (time(NULL)) ); //seed the rand() function + } + + + // Building filters + // This is not really necessary, as apply would call this anyway. + // However, we have it here such that any errors in building the filters would + // be caught before doing any projections or so done. +#if 0 + /* + KT 04/06/2003 disabled the explicit calling of inter_iteration_filter_ptr->set_up() + + It was here to catch incompatibilities between the filter and the + estimate early (i.e. before any real reconstruction stuff has been going on). Now + this will only be caught when the inter_iteration_filter is called for the first time. + + The reason I disabled this is that OSMAPOSL::set_up (and presumably + other algorithms that insist on non-negative data) chains the current + inter_iteration_filter with a ThresholdMinToSmallPositiveValueDataProcessor. + This meant that the new data-processor was not set-up yet, and resulted + in the current filter being set-up twice, which might potentially take a lot + of CPU time. + */ + if(this->inter_iteration_filter_interval>0 && is_null_ptr(this->inter_iteration_filter_ptr) ) + { + cerr<inter_iteration_filter_ptr->set_up(*target_data_sptr) + == Succeeded::no) + error("Error building inter iteration filter\n"); + } +#endif + + return Succeeded::yes; +} + +template +void IterativeReconstruction:: +end_of_iteration_processing(TargetT ¤t_estimate) +{ + + if (this->report_objective_function_values_interval>0 && + (this->subiteration_num%this->report_objective_function_values_interval == 0 + || this->subiteration_num==this->num_subiterations)) + { + std::cerr << "Objective function values (before any additional filtering):\n" + << this->objective_function_sptr-> + get_objective_function_values_report(current_estimate); + } + + if(this->inter_iteration_filter_interval>0 && + !is_null_ptr(this->inter_iteration_filter_ptr) && + this->subiteration_num%this->inter_iteration_filter_interval==0) + { + cerr<inter_iteration_filter_ptr->apply(current_estimate); + } + + + cerr<< this->method_info() + << " subiteration #"<subiteration_num==this->num_subiterations && + !is_null_ptr(this->post_filter_sptr) ) + { + cerr<post_filter_sptr->apply(current_estimate); + + cerr << " min and max after post-filtering " + << *std::min_element(current_estimate.begin_all(), current_estimate.end_all()) + << " " + << *std::max_element(current_estimate.begin_all(), current_estimate.end_all()) << endl; + } + + // Save intermediate (or last) iteration + if((!(this->subiteration_num%this->save_interval)) || + this->subiteration_num==this->num_subiterations ) + { + this->output_file_format_ptr-> + write_to_file(this->make_filename_prefix_subiteration_num(), + current_estimate); + } +} + +template +VectorWithOffset +IterativeReconstruction:: +randomly_permute_subset_order() const +{ + + VectorWithOffset temp_array(this->num_subsets),final_array(this->num_subsets); + int index; + + for(int i=0;inum_subsets;i++) temp_array[i]=i; + + for (int i=0;inum_subsets;i++) + { + + index = (int) (((float)rand()/(float)RAND_MAX)*(this->num_subsets-i)); + if (index==this->num_subsets-i) index--; + final_array[i]=temp_array[index]; + + + for (int j=index;jnum_subsets-(i+1);j++) + temp_array[j]=temp_array[j+1]; + + } + + cerr<num_subsets;i++) cerr< +int +IterativeReconstruction:: +get_subset_num() +{ + if(this->randomise_subset_order && (this->subiteration_num-1)%this->num_subsets==0) + { + this->_current_subset_array = this->randomly_permute_subset_order(); + }; + + return + this->randomise_subset_order + ? this->_current_subset_array[(this->subiteration_num-1)%this->num_subsets] + : (this->subiteration_num+this->start_subset_num-1)%this->num_subsets; +} + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + +template class IterativeReconstruction >; +template class IterativeReconstruction; +template class IterativeReconstruction; + +END_NAMESPACE_STIR + + + diff --git a/src/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.cxx b/src/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.cxx new file mode 100644 index 0000000000..13c816e6a9 --- /dev/null +++ b/src/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.cxx @@ -0,0 +1,41 @@ +// +// +/* + Copyright (C) 2006- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Instantiations for class stir::PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData + + \author Kris Thielemans + \author Charalampos Tsoumpas + +*/ + +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData.txx" + +START_NAMESPACE_STIR + + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif // _MSC_VER + +template class PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData; + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.cxx b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.cxx new file mode 100644 index 0000000000..88e740ab65 --- /dev/null +++ b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.cxx @@ -0,0 +1,485 @@ +/* + Copyright (C) 2003 - 2011-06-29, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Implementation of class stir::PoissonLogLikelihoodWithLinearModelForMean + + \author Kris Thielemans + \author Sanida Mustafovic +*/ +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h" +#include "stir/DiscretisedDensity.h" +#include "stir/is_null_ptr.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/Succeeded.h" +#include +#include +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/modelling/KineticParameters.h" +#include "stir/info.h" +#include "boost/format.hpp" + +START_NAMESPACE_STIR + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +set_defaults() +{ + base_type::set_defaults(); + + this->sensitivity_filename = ""; + this->subsensitivity_filenames = ""; + this->recompute_sensitivity = false; + this->use_subset_sensitivities = true; + this->subsensitivity_sptrs.resize(0); +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +initialise_keymap() +{ + base_type::initialise_keymap(); + + this->parser.add_key("sensitivity filename", &this->sensitivity_filename); + this->parser.add_key("subset sensitivity filenames", &this->subsensitivity_filenames); + this->parser.add_key("recompute sensitivity", &this->recompute_sensitivity); + this->parser.add_key("use_subset_sensitivities", &this->use_subset_sensitivities); + +} + +template +bool +PoissonLogLikelihoodWithLinearModelForMean:: +post_processing() +{ + if (base_type::post_processing() == true) + return true; + + return false; +} + +template +std::string +PoissonLogLikelihoodWithLinearModelForMean:: +get_sensitivity_filename() const +{ + return this->sensitivity_filename; +} + +template +std::string +PoissonLogLikelihoodWithLinearModelForMean:: +get_subsensitivity_filenames() const +{ + return this->subsensitivity_filenames; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +set_sensitivity_filename(const std::string& filename) +{ + this->sensitivity_filename = filename; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +set_subsensitivity_filenames(const std::string& filenames) +{ + this->subsensitivity_filenames = filenames; + try + { + const std::string test_sensitivity_filename = + boost::str(boost::format(this->subsensitivity_filenames) % 0); + } + catch (std::exception& e) + { + error("argument %s to set_subsensitivity_filenames is invalid (see boost::format documentation)\n. Error message: %s", filenames.c_str(), e.what()); + } + +} + + +template +shared_ptr +PoissonLogLikelihoodWithLinearModelForMean:: +get_subset_sensitivity_sptr(const int subset_num) const +{ + return this->subsensitivity_sptrs[subset_num]; +} + +template +const TargetT& +PoissonLogLikelihoodWithLinearModelForMean:: +get_subset_sensitivity(const int subset_num) const +{ + return *get_subset_sensitivity_sptr(subset_num); +} + +template +const TargetT& +PoissonLogLikelihoodWithLinearModelForMean:: +get_sensitivity() const +{ + return *this->sensitivity_sptr; +} + +template +bool +PoissonLogLikelihoodWithLinearModelForMean:: +get_recompute_sensitivity() const +{ + return this->recompute_sensitivity; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +set_recompute_sensitivity(const bool arg) +{ + this->recompute_sensitivity = arg; + +} + +template +bool +PoissonLogLikelihoodWithLinearModelForMean:: +get_use_subset_sensitivities() const +{ + return this->use_subset_sensitivities; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +set_use_subset_sensitivities(const bool arg) +{ + this->use_subset_sensitivities = arg; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +set_subset_sensitivity_sptr(const shared_ptr& arg, const int subset_num) +{ + this->subsensitivity_sptrs[subset_num] = arg; +} + +template +Succeeded +PoissonLogLikelihoodWithLinearModelForMean:: +set_up(shared_ptr const& target_sptr) +{ + if (base_type::set_up(target_sptr) != Succeeded::yes) + return Succeeded::no; + + this->subsensitivity_sptrs.resize(this->num_subsets); + + if(!this->recompute_sensitivity) + { + if(is_null_ptr(this->subsensitivity_sptrs[0]) && + ((this->get_use_subset_sensitivities() && this->subsensitivity_filenames=="") || + (!this->get_use_subset_sensitivities() && this->sensitivity_filename==""))) + { + warning("recompute_sensitivity is set to false, but sensitivity pointer is empty " + "and (sub)sensitivity filename is not set. I will compute the sensitivity anyway."); + this->recompute_sensitivity = true; + // initialisation of pointers will be done below + } + else if(this->sensitivity_filename=="1") + { + if (this->get_use_subset_sensitivities()) + { + warning("PoissonLogLikelihoodWithLinearModelForMean limitation:\n" + "currently cannot use subset_sensitivities if sensitivity is forced to 1"); + return Succeeded::no; + } + this->sensitivity_sptr.reset(target_sptr->get_empty_copy()); + std::fill(this->sensitivity_sptr->begin_all(), this->sensitivity_sptr->end_all(), 1); + } + else + { + // read from file + try + { + if (this->get_use_subset_sensitivities()) + { + // read subsensitivies + for (int subset=0; subsetget_num_subsets(); ++subset) + { + const std::string current_sensitivity_filename = + boost::str(boost::format(this->subsensitivity_filenames) % subset); + info(boost::format("Reading sensitivity from '%1%'") % current_sensitivity_filename); + + this->subsensitivity_sptrs[subset] = + read_from_file(current_sensitivity_filename); + string explanation; + if (!target_sptr->has_same_characteristics(*this->subsensitivity_sptrs[subset], + explanation)) + { + warning("sensitivity and target should have the same characteristics.\n%s", + explanation.c_str()); + return Succeeded::no; + } + } + } + else + { + // reading single sensitivity + const std::string current_sensitivity_filename = + this->sensitivity_filename; + info(boost::format("Reading sensitivity from '%1%'") % current_sensitivity_filename); + + this->sensitivity_sptr = read_from_file(current_sensitivity_filename); + string explanation; + if (!target_sptr->has_same_characteristics(*this->sensitivity_sptr, + explanation)) + { + warning("sensitivity and target should have the same characteristics.\n%s", + explanation.c_str()); + return Succeeded::no; + } + } + } + catch (std::exception& e) + { + warning("Error reading sensitivity from file:\n%s", e.what()); + return Succeeded::no; + } + // compute total from subsensitivity or vice versa + this->set_total_or_subset_sensitivities(); + } + } // end of !recompute_sensitivity case + + if (this->set_up_before_sensitivity(target_sptr) == Succeeded::no) + { + return Succeeded::no; + } + + if(!this->subsets_are_approximately_balanced() && !this->get_use_subset_sensitivities()) + { + warning("Number of subsets %d is such that subsets will be very unbalanced.\n" + "You need to set 'use_subset_sensitivities' to true to handle this.", + this->num_subsets); + return Succeeded::no; + } + + if(this->recompute_sensitivity) + { + info("Computing sensitivity"); + // preallocate one such that compute_sensitivities knows the size + this->subsensitivity_sptrs[0].reset(target_sptr->get_empty_copy()); + this->compute_sensitivities(); + info("Done computing sensitivity"); + + // write to file + try + { + if (this->get_use_subset_sensitivities()) + { + if (this->subsensitivity_filenames.size()!=0) + { + for (int subset=0; subsetget_num_subsets(); ++subset) + { + const std::string current_sensitivity_filename = + boost::str(boost::format(this->subsensitivity_filenames) % subset); + info(boost::format("Writing sensitivity to '%1%'") % current_sensitivity_filename); + OutputFileFormat::default_sptr()-> + write_to_file(current_sensitivity_filename, + this->get_subset_sensitivity(subset)); + } + } + } + else + { + if (this->sensitivity_filename.size()!=0) + { + const std::string current_sensitivity_filename = + this->sensitivity_filename; + info(boost::format("Writing sensitivity to '%1%'") % current_sensitivity_filename); + OutputFileFormat::default_sptr()-> + write_to_file(current_sensitivity_filename, + this->get_sensitivity()); + } + } + } + catch (std::exception& e) + { + warning("Error writing sensitivity to file:\n%s", e.what()); + return Succeeded::no; + } + } + + return Succeeded::yes; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +compute_sub_gradient_without_penalty(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) +{ + this-> + compute_sub_gradient_without_penalty_plus_sensitivity(gradient, + current_estimate, + subset_num); + // compute gradient -= sub_sensitivity + { + typename TargetT::full_iterator gradient_iter = + gradient.begin_all(); + const typename TargetT::full_iterator gradient_end = + gradient.end_all(); + typename TargetT::const_full_iterator sensitivity_iter = + this->get_subset_sensitivity(subset_num).begin_all_const(); + while (gradient_iter != gradient_end) + { + *gradient_iter -= (*sensitivity_iter); + ++gradient_iter; ++sensitivity_iter; + } + } +} + + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +compute_sensitivities() +{ + // check subset balancing + if (this->use_subset_sensitivities == false) + { + std::string warning_message = "PoissonLogLikelihoodWithLinearModelForMean:\n"; + if (!this->subsets_are_approximately_balanced(warning_message)) + { + error("%s\n . you need to set use_subset_sensitivities to true", + warning_message.c_str()); + } + } // end check balancing + + // compute subset sensitivities + for (int subset_num=0; subset_numnum_subsets; ++subset_num) + { + if (subset_num == 0) + { + std::fill(this->subsensitivity_sptrs[subset_num]->begin_all(), + this->subsensitivity_sptrs[subset_num]->end_all(), + 0); + } + else + { + if (this->get_use_subset_sensitivities()) + { + this->subsensitivity_sptrs[subset_num].reset(this->subsensitivity_sptrs[0]->get_empty_copy()); + } + else + { + // copy subsensitivity[0] pointer to current subset. + // do this as pointer such that we don't use more memory. + // This also means that we just accumulate in subsensitivity[0] for the moment. + // we will correct that below. + this->subsensitivity_sptrs[subset_num] = this->subsensitivity_sptrs[0]; + } + } + this->add_subset_sensitivity(*this->get_subset_sensitivity_sptr(subset_num), subset_num); + } + if (!this->get_use_subset_sensitivities()) + { + // copy full sensitivity (currently stored in subsensitivity[0]) + this->sensitivity_sptr = this->subsensitivity_sptrs[0]; + this->subsensitivity_sptrs[0].reset(); + } + // compute total from subsensitivity or vice versa + this->set_total_or_subset_sensitivities(); +} + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +set_total_or_subset_sensitivities() +{ + if (this->get_use_subset_sensitivities()) + { + // add subset sensitivities, just in case we need the total somewhere + this->sensitivity_sptr.reset(this->subsensitivity_sptrs[0]->clone()); + for (int subset_num=1; subset_numnum_subsets; ++subset_num) + { + typename TargetT::full_iterator sens_iter = this->sensitivity_sptr->begin_all(); + typename TargetT::full_iterator subsens_iter = this->subsensitivity_sptrs[subset_num]->begin_all(); + while (sens_iter != this->sensitivity_sptr->end_all()) + { + *sens_iter += *subsens_iter; + ++sens_iter; ++ subsens_iter; + } + } + } + else + { + // copy full sensitivity + this->subsensitivity_sptrs[0].reset(this->sensitivity_sptr->clone()); + // divide subsensitivity[0] by num_subsets + for (typename TargetT::full_iterator subsens_iter = this->subsensitivity_sptrs[0]->begin_all(); + subsens_iter != this->subsensitivity_sptrs[0]->end_all(); + ++subsens_iter) + { + *subsens_iter /= this->num_subsets; + } + // set all other pointers the same + for (int subset_num=1; subset_numnum_subsets; ++subset_num) + this->subsensitivity_sptrs[subset_num] = this->subsensitivity_sptrs[0]; + } + +} + + +template +void +PoissonLogLikelihoodWithLinearModelForMean:: +fill_nonidentifiable_target_parameters(TargetT& target, const float value) const +{ + typename TargetT::full_iterator target_iter = target.begin_all(); + typename TargetT::full_iterator target_end_iter = target.end_all(); + typename TargetT::const_full_iterator sens_iter = + this->get_sensitivity().begin_all_const(); + + for (; + target_iter != target_end_iter; + ++target_iter, ++sens_iter) + { + if (*sens_iter == 0) + *target_iter = value; + } +} + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif + +template class PoissonLogLikelihoodWithLinearModelForMean >; +template class PoissonLogLikelihoodWithLinearModelForMean; +template class PoissonLogLikelihoodWithLinearModelForMean; + +END_NAMESPACE_STIR + + diff --git a/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.cxx b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.cxx new file mode 100644 index 0000000000..290f5b76e4 --- /dev/null +++ b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.cxx @@ -0,0 +1,36 @@ +/* + Copyright (C) 2009- 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Instantiations for class stir::PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion + \author Charalampos Tsoumpas + +*/ + +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion.txx" + +START_NAMESPACE_STIR + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif // _MSC_VER +template class +PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion >; + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.cxx b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.cxx new file mode 100644 index 0000000000..8a2c8954e6 --- /dev/null +++ b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.cxx @@ -0,0 +1,159 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class + stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeData + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeData.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/IO/read_from_file.h" + +START_NAMESPACE_STIR + + +template +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData:: +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData() +{ + this->set_defaults(); +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData:: +set_defaults() +{ + base_type::set_defaults(); + this->list_mode_filename =""; + this->frame_defs_filename =""; + this->list_mode_data_sptr.reset(); + this->current_frame_num =0; + + this->output_image_size_xy=-1; + this->output_image_size_z=-1; + this->zoom=1.F; + this->Xoffset=0.F; + this->Yoffset=0.F; + this->Zoffset=0.F; + +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_key("list mode filename", &this->list_mode_filename); + this->parser.add_key("zoom", &this->zoom); + this->parser.add_key("XY output image size (in pixels)",&this->output_image_size_xy); + this->parser.add_key("Z output image size (in pixels)",&this->output_image_size_z); + //parser.add_key("X offset (in mm)", &Xoffset); // KT 10122001 added spaces + //parser.add_key("Y offset (in mm)", &Yoffset); + + //this->parser.add_key("Z offset (in mm)", &Zoffset); + this->parser.add_key("time frame definition filename", &this->frame_defs_filename); + // SM TODO -- later do not parse + this->parser.add_key("time frame number", &this->current_frame_num); + +} + +template +bool +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData::post_processing() +{ + if (base_type::post_processing() == true) + return true; + + if (this->list_mode_filename.length() == 0) + { warning("You need to specify an input file\n"); return true; } + + this->list_mode_data_sptr= + read_from_file(this->list_mode_filename); + + if (this->frame_defs_filename.size()!=0) + this->frame_defs = TimeFrameDefinitions(this->frame_defs_filename); + else + { + // make a single frame starting from 0. End value will be ignored. + vector > frame_times(1, pair(0,1)); + this->frame_defs = TimeFrameDefinitions(frame_times); + } + // image stuff + if (this->zoom <= 0) + { warning("zoom should be positive\n"); return true; } + + if (this->output_image_size_xy!=-1 && this->output_image_size_xy<1) // KT 10122001 appended_xy + { warning("output image size xy must be positive (or -1 as default)\n"); return true; } + if (this->output_image_size_z!=-1 && this->output_image_size_z<1) // KT 10122001 new + { warning("output image size z must be positive (or -1 as default)\n"); return true; } + + + return false; +} + +#if 0 +Succeeded +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData:: +set_up(shared_ptr const& target_sptr) +{ + if ( base_type::set_up(target_sptr) != Succeeded::yes) + return Succeeded::no; + + return Succeeded::yes; + + +} + +template +TargetT * +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData:: +construct_target_ptr() const +{ + return + new VoxelsOnCartesianGrid (*this->proj_data_sptr->get_proj_data_info_ptr(), + this->zoom, + CartesianCoordinate3D(this->Zoffset, + this->Yoffset, + this->Xoffset), + CartesianCoordinate3D(this->output_image_size_z, + this->output_image_size_xy, + this->output_image_size_xy) + ); +} +#endif + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif + +template class +PoissonLogLikelihoodWithLinearModelForMeanAndListModeData >; + + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.cxx b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.cxx new file mode 100644 index 0000000000..dadec1713e --- /dev/null +++ b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.cxx @@ -0,0 +1,266 @@ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Implementation of class + stir::PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin + + \author Kris Thielemans + \author Sanida Mustafovic +*/ + +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/ProjData.h" +#include "stir/listmode/CListRecord.h" +#include "stir/Viewgram.h" +#include "stir/info.h" +#include + +#ifdef STIR_MPI +#include "stir/recon_buildblock/distributed_functions.h" +#endif + + +#include +START_NAMESPACE_STIR + +template +const char * const +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +registered_name = +"PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin"; + +template +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin() +{ + this->set_defaults(); +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +set_defaults() +{ + base_type::set_defaults(); + this->additive_proj_data_sptr.reset(); + this->additive_projection_data_filename ="0"; + this->max_ring_difference_num_to_process =-1; + this->PM_sptr.reset(new ProjMatrixByBinUsingRayTracing()); +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin Parameters"); + this->parser.add_stop_key("End PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin Parameters"); + this->parser.add_key("max ring difference num to process", &this->max_ring_difference_num_to_process); + this->parser.add_parsing_key("Matrix type", &this->PM_sptr); + this->parser.add_key("additive sinogram",&this->additive_projection_data_filename); + + +} +template +int +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +set_num_subsets(const int new_num_subsets) +{ + if (new_num_subsets!=1) + warning("PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin currently only supports 1 subset"); + this->num_subsets = 1; + return this->num_subsets; +} + +template +bool +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +actual_subsets_are_approximately_balanced(string&) const +{ + return true; +} + +template +Succeeded +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +set_up_before_sensitivity(shared_ptr const& target_sptr) +{ +#ifdef STIR_MPI + //broadcast objective_function (100=PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin) + distributed::send_int_value(100, -1); +#endif + + + // set projector to be used for the calculations + this->PM_sptr->set_up(this->proj_data_info_cyl_uncompressed_ptr->create_shared_clone(),target_sptr); + return Succeeded::yes; +} + + +template +bool +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin::post_processing() +{ + + if (base_type::post_processing() == true) + return true; + +#if 1 + if (is_null_ptr(this->PM_sptr)) + + { warning("You need to specify a projection matrix"); return true; } + +#else + if(is_null_ptr(this->projector_pair_sptr->get_forward_projector_sptr())) + { + warning("No valid forward projector is defined"); return true; + } + + if(is_null_ptr(this->projector_pair_sptr->get_back_projector_sptr())) + { + warning("No valid back projector is defined"); return true; + } +#endif + shared_ptr scanner_sptr(new Scanner(*this->list_mode_data_sptr->get_scanner_ptr())); + + if (this->max_ring_difference_num_to_process == -1) + { + this->max_ring_difference_num_to_process = + scanner_sptr->get_num_rings()-1; + } + + + if (this->additive_projection_data_filename != "0") + { + info(boost::format("Reading additive projdata data '%1%'") + % additive_projection_data_filename ); + shared_ptr temp_additive_proj_data_sptr = + ProjData::read_from_file(this->additive_projection_data_filename); + this->additive_proj_data_sptr.reset(new ProjDataInMemory(* temp_additive_proj_data_sptr)); + } + + + this->proj_data_info_cyl_uncompressed_ptr.reset( + dynamic_cast( + ProjDataInfo::ProjDataInfoCTI(scanner_sptr, + 1, this->max_ring_difference_num_to_process, + scanner_sptr->get_num_detectors_per_ring()/2, + scanner_sptr->get_default_num_arccorrected_bins(), + false))); + return false; + +} + + + +template +TargetT * +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +construct_target_ptr() const +{ + + return + new VoxelsOnCartesianGrid (*this->proj_data_info_cyl_uncompressed_ptr, + static_cast(this->zoom), + CartesianCoordinate3D(static_cast(this->Zoffset), + static_cast(this->Yoffset), + static_cast(this->Xoffset)), + CartesianCoordinate3D(this->output_image_size_z, + this->output_image_size_xy, + this->output_image_size_xy) + ); + +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin:: +compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) +{ + + const double start_time = this->frame_defs.get_start_time(this->current_frame_num); + const double end_time = this->frame_defs.get_end_time(this->current_frame_num); + //go to the beginning of this frame + // list_mode_data_sptr->set_get_position(start_time); + // TODO implement function that will do this for a random time + this->list_mode_data_sptr->reset(); + double current_time = 0.; + ProjMatrixElemsForOneBin proj_matrix_row; + shared_ptr record_sptr = this->list_mode_data_sptr->get_empty_record_sptr(); + CListRecord& record = *record_sptr; + // int count_of_events=0; + //int in_the_range =0; + while (this->list_mode_data_sptr->get_next_record(record) == Succeeded::yes) + { + //count_of_events++; + if(record.is_time()) + { + current_time = record.time().get_time_in_secs(); + } + if (current_time >= end_time) + { + break; // get out of while loop + } + if (current_time < start_time) + continue; + if (record.is_event() && record.event().is_prompt()) + { + Bin measured_bin; + record.event().get_bin(measured_bin, *proj_data_info_cyl_uncompressed_ptr); + if (measured_bin.get_bin_value() <= 0) + continue; + this->PM_sptr->get_proj_matrix_elems_for_one_bin(proj_matrix_row, measured_bin); + //in_the_range++; + Bin fwd_bin; + proj_matrix_row.forward_project(fwd_bin,current_estimate); + // additive sinogram + if (!is_null_ptr(this->additive_proj_data_sptr)) + { + float add_value = this->additive_proj_data_sptr->get_bin_value(measured_bin); + float value= fwd_bin.get_bin_value()+add_value; + fwd_bin.set_bin_value(value); + } + float measured_div_fwd = measured_bin.get_bin_value()/fwd_bin.get_bin_value(); + measured_bin.set_bin_value(measured_div_fwd); + proj_matrix_row.back_project(gradient, measured_bin); + + } + } + // cerr << " The number_of_events " << count_of_events << " "; + //cerr << " The number of events proecessed " << in_the_range << " "; + +} + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif + +template class +PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin >; + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx new file mode 100644 index 0000000000..b959b86c81 --- /dev/null +++ b/src/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx @@ -0,0 +1,1056 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup GeneralisedObjectiveFunction + \brief Declaration of class stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + \author Kris Thielemans + \author Matthew Jacobson + \author Sanida Mustafovic + \author PARAPET project +*/ + + +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/recon_buildblock/TrivialBinNormalisation.h" +#include "stir/Succeeded.h" +#include "stir/RelatedViewgrams.h" +#include "stir/stream.h" + +#include "stir/recon_buildblock/ProjectorByBinPair.h" + +#include "stir/DiscretisedDensity.h" +#ifdef STIR_MPI +#include "stir/recon_buildblock/DistributedCachingInformation.h" +#endif +#include "stir/recon_buildblock/distributable.h" +// for get_symmetries_ptr() +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +// include the following to set defaults +#ifndef USE_PMRT +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingInterpolation.h" +#else +#include "stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#endif +#include "stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h" + + +#include "stir/Viewgram.h" +#include "stir/recon_array_functions.h" +#include "stir/is_null_ptr.h" +#include +#include +#include +#ifdef STIR_MPI +#include "stir/recon_buildblock/distributed_functions.h" +#endif +#include "stir/CPUTimer.h" +#include "stir/info.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::ends; +using std::cerr; +using std::endl; +using std::max; +#endif + + +START_NAMESPACE_STIR + +const int rim_truncation_sino = 0; // TODO get rid of this + +template +const char * const +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +registered_name = +"PoissonLogLikelihoodWithLinearModelForMeanAndProjData"; + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_defaults() +{ + base_type::set_defaults(); + + this->input_filename=""; + this->max_segment_num_to_process=-1; + // KT 20/06/2001 disabled + //num_views_to_add=1; + this->proj_data_sptr.reset(); //MJ added + this->zero_seg0_end_planes = 0; + + this->additive_projection_data_filename = "0"; + this->additive_proj_data_sptr.reset(); + + + // set default for projector_pair_ptr +#ifndef USE_PMRT + shared_ptr forward_projector_ptr(new ForwardProjectorByBinUsingRayTracing()); + shared_ptr back_projector_ptr(new BackProjectorByBinUsingInterpolation()); +#else + shared_ptr PM(new ProjMatrixByBinUsingRayTracing()); + // PM->set_num_tangential_LORs(5); + shared_ptr forward_projector_ptr(new ForwardProjectorByBinUsingProjMatrixByBin(PM)); + shared_ptr back_projector_ptr(new BackProjectorByBinUsingProjMatrixByBin(PM)); +#endif + + this->projector_pair_ptr.reset( + new ProjectorByBinPairUsingSeparateProjectors(forward_projector_ptr, back_projector_ptr)); + + this->normalisation_sptr.reset(new TrivialBinNormalisation); + this->frame_num = 1; + this->frame_definition_filename = ""; + // make a single frame starting from 0 to 1. + vector > frame_times(1, pair(0,1)); + this->frame_defs = TimeFrameDefinitions(frame_times); + + + // image stuff + this->output_image_size_xy=-1; + this->output_image_size_z=-1; + this->zoom=1.F; + this->Xoffset=0.F; + this->Yoffset=0.F; + // KT 20/06/2001 new + this->Zoffset=0.F; + +#ifdef STIR_MPI + //distributed stuff + this->distributed_cache_enabled = false; + this->distributed_tests_enabled = false; + this->message_timings_enabled = false; + this->message_timings_threshold = 0.1; + this->rpc_timings_enabled = false; +#endif +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters"); + this->parser.add_stop_key("End PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters"); + this->parser.add_key("input file",&this->input_filename); + // KT 20/06/2001 disabled + //parser.add_key("mash x views", &num_views_to_add); + + this->parser.add_key("maximum absolute segment number to process", &this->max_segment_num_to_process); + this->parser.add_key("zero end planes of segment 0", &this->zero_seg0_end_planes); + + // image stuff + + this->parser.add_key("zoom", &this->zoom); + this->parser.add_key("XY output image size (in pixels)",&this->output_image_size_xy); + this->parser.add_key("Z output image size (in pixels)",&this->output_image_size_z); + //parser.add_key("X offset (in mm)", &this->Xoffset); // KT 10122001 added spaces + //parser.add_key("Y offset (in mm)", &this->Yoffset); + + this->parser.add_key("Z offset (in mm)", &this->Zoffset); + + this->parser.add_parsing_key("Projector pair type", &this->projector_pair_ptr); + this->parser.add_key("additive sinogram",&this->additive_projection_data_filename); + // normalisation (and attenuation correction) + this->parser.add_key("time frame definition filename", &this->frame_definition_filename); + this->parser.add_key("time frame number", &this->frame_num); + this->parser.add_parsing_key("Bin Normalisation type", &this->normalisation_sptr); + +#ifdef STIR_MPI + //distributed stuff + this->parser.add_key("enable distributed caching", &distributed_cache_enabled); + this->parser.add_key("enable distributed tests", &distributed_tests_enabled); + this->parser.add_key("enable message timings", &message_timings_enabled); + this->parser.add_key("message timings threshold", &message_timings_threshold); + this->parser.add_key("enable rpc timings", &rpc_timings_enabled); +#endif +} + +template +bool +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +post_processing() +{ + if (base_type::post_processing() == true) + return true; + + if (this->input_filename.length() == 0) + { warning("You need to specify an input file"); return true; } + // KT 20/06/2001 disabled as not functional yet +#if 0 + if (num_views_to_add!=1 && (num_views_to_add<=0 || num_views_to_add%2 != 0)) + { warning("The 'mash x views' key has an invalid value (must be 1 or even number)"); return true; } +#endif + + this->proj_data_sptr= ProjData::read_from_file(input_filename); + if (is_null_ptr(this->proj_data_sptr)) + { warning("Failed to read input file %s", input_filename.c_str()); return true; } + + // image stuff + if (this->zoom <= 0) + { warning("zoom should be positive"); return true; } + + if (this->output_image_size_xy!=-1 && this->output_image_size_xy<1) // KT 10122001 appended_xy + { warning("output image size xy must be positive (or -1 as default)"); return true; } + if (this->output_image_size_z!=-1 && this->output_image_size_z<1) // KT 10122001 new + { warning("output image size z must be positive (or -1 as default)"); return true; } + + + if (this->additive_projection_data_filename != "0") + { + cerr << "\nReading additive projdata data " + << this->additive_projection_data_filename + << endl; + this->additive_proj_data_sptr = + ProjData::read_from_file(this->additive_projection_data_filename); + }; + + // read time frame def + if (this->frame_definition_filename.size()!=0) + this->frame_defs = TimeFrameDefinitions(this->frame_definition_filename); + else + { + // make a single frame starting from 0 to 1. + vector > frame_times(1, pair(0,1)); + this->frame_defs = TimeFrameDefinitions(frame_times); + } +#ifndef STIR_MPI +#if 0 + //check caching enabled value + if (this->distributed_cache_enabled==true) + { + warning("STIR must be compiled with MPI-compiler to use distributed caching.\n\tDistributed Caching support will be disabled!"); + this->distributed_cache_enabled=false; + } + //check tests enabled value + if (this->distributed_tests_enabled==true || rpc_timings_enabled==true || message_timings_enabled==true) + { + warning("STIR must be compiled with MPI-compiler and debug symbols to use distributed testing.\n\tDistributed tests will not be performed!"); + this->distributed_tests_enabled=false; + } +#endif +#else + //check caching enabled value + if (this->distributed_cache_enabled==true) + cerr<<"\nWill use distributed caching!"<distributed_tests_enabled==true) + { + warning("\nWill perform distributed tests! Beware that this decreases the performance"); + distributed::test=true; + } +#else + //check tests enabled value + if (this->distributed_tests_enabled==true) + { + warning("\nDistributed tests only abvailable in debug mode!"); + distributed::test=false; + } +#endif + + //check timing values + if (this->message_timings_enabled==true) + { + cerr<<"\nWill print timings of MPI-Messages! This is used to find bottlenecks!"<message_timings_threshold; + + if (this->rpc_timings_enabled==true) + { + cerr<<"\nWill print run-times of processing RPC_process_related_viewgrams_gradient for every slave! This will give an idea of the parallelization effect!"<already_setup = false; + return false; +} + +template +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +PoissonLogLikelihoodWithLinearModelForMeanAndProjData() +{ + this->set_defaults(); +} + +template +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +~PoissonLogLikelihoodWithLinearModelForMeanAndProjData() +{ + end_distributable_computation(); +} + +template +TargetT * +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +construct_target_ptr() const +{ + return + new VoxelsOnCartesianGrid (*this->proj_data_sptr->get_proj_data_info_ptr(), + static_cast(this->zoom), + CartesianCoordinate3D(static_cast(this->Zoffset), + static_cast(this->Yoffset), + static_cast(this->Xoffset)), + CartesianCoordinate3D(this->output_image_size_z, + this->output_image_size_xy, + this->output_image_size_xy) + ); +} + +/*************************************************************** + get_ functions +***************************************************************/ +template +const ProjData& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_proj_data() const +{ return *this->proj_data_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_proj_data_sptr() const +{ return this->proj_data_sptr; } + +template +const int +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_max_segment_num_to_process() const +{ return this->max_segment_num_to_process; } + +template +const bool +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_zero_seg0_end_planes() const +{ return this->zero_seg0_end_planes; } + +template +const ProjData& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_additive_proj_data() const +{ return *this->additive_proj_data_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_additive_proj_data_sptr() const +{ return this->additive_proj_data_sptr; } + +template +const ProjectorByBinPair& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_projector_pair() const +{ return *this->projector_pair_ptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_projector_pair_sptr() const +{ return this->projector_pair_ptr; } + +template +const int +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_time_frame_num() const +{ return this->frame_num; } + +template +const TimeFrameDefinitions& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_time_frame_definitions() const +{ return this->frame_defs; } + +template +const BinNormalisation& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_normalisation() const +{ return *this->normalisation_sptr; } + +template +const shared_ptr& +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +get_normalisation_sptr() const +{ return this->normalisation_sptr; } + + +/*************************************************************** + set_ functions +***************************************************************/ + +template +int +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_num_subsets(const int new_num_subsets) +{ + this->num_subsets = std::max(new_num_subsets,1); + return this->num_subsets; + +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_proj_data_sptr(const shared_ptr& arg) +{ + this->proj_data_sptr = arg; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_max_segment_num_to_process(const int arg) +{ + this->max_segment_num_to_process = arg; + +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_zero_seg0_end_planes(const bool arg) +{ + this->zero_seg0_end_planes = arg; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_additive_proj_data_sptr(const shared_ptr& arg) +{ + + this->additive_proj_data_sptr = arg; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_projector_pair_sptr(const shared_ptr& arg) +{ + this->projector_pair_ptr = arg; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_frame_num(const int arg) +{ + this->frame_num = arg; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_frame_definitions(const TimeFrameDefinitions& arg) +{ + this->frame_defs = arg; +} + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_normalisation_sptr(const shared_ptr& arg) +{ + this->normalisation_sptr = arg; +} + +/*************************************************************** + subset balancing + ***************************************************************/ + +template +bool +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +actual_subsets_are_approximately_balanced(std::string& warning_message) const +{ + assert(this->num_subsets>0); + const DataSymmetriesForViewSegmentNumbers& symmetries = + *this->projector_pair_ptr->get_back_projector_sptr()->get_symmetries_used(); + + Array<1,int> num_vs_in_subset(this->num_subsets); + num_vs_in_subset.fill(0); + for (int subset_num=0; subset_numnum_subsets; ++subset_num) + { + for (int segment_num = -this->max_segment_num_to_process; + segment_num <= this->max_segment_num_to_process; + ++segment_num) + for (int view_num = this->proj_data_sptr->get_min_view_num() + subset_num; + view_num <= this->proj_data_sptr->get_max_view_num(); + view_num += this->num_subsets) + { + const ViewSegmentNumbers view_segment_num(view_num, segment_num); + if (!symmetries.is_basic(view_segment_num)) + continue; + num_vs_in_subset[subset_num] += + symmetries.num_related_view_segment_numbers(view_segment_num); + } + } + for (int subset_num=1; subset_numnum_subsets; ++subset_num) + { + if(num_vs_in_subset[subset_num] != num_vs_in_subset[0]) + { + std::stringstream str(warning_message); + str <<"Number of subsets is such that subsets will be very unbalanced.\n" + << "Number of viewgrams in each subset would be:\n" + << num_vs_in_subset + << "\nEither reduce the number of symmetries used by the projector, or\n" + "change the number of subsets. It usually should be a divisor of\n" + << this->proj_data_sptr->get_num_views() + << "/4 (or if that's not an integer, a divisor of " + << this->proj_data_sptr->get_num_views() + << "/2 or " + << this->proj_data_sptr->get_num_views() + << ").\n"; + warning_message = str.str(); + return false; + } + } + return true; +} + +/*************************************************************** + set_up() +***************************************************************/ +template +Succeeded +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +set_up_before_sensitivity(shared_ptr const& target_sptr) +{ + if (this->max_segment_num_to_process==-1) + this->max_segment_num_to_process = + this->proj_data_sptr->get_max_segment_num(); + + if (this->max_segment_num_to_process > this->proj_data_sptr->get_max_segment_num()) + { + warning("max_segment_num_to_process (%d) is too large", + this->max_segment_num_to_process); + return Succeeded::no; + } + + shared_ptr proj_data_info_sptr(this->proj_data_sptr->get_proj_data_info_ptr()->clone()); + + proj_data_info_sptr-> + reduce_segment_range(-this->max_segment_num_to_process, + +this->max_segment_num_to_process); + + if (is_null_ptr(this->projector_pair_ptr)) + { warning("You need to specify a projector pair"); return Succeeded::no; } + + // set projectors to be used for the calculations + + setup_distributable_computation(this->projector_pair_ptr, + this->proj_data_sptr->get_exam_info_sptr(), + this->proj_data_sptr->get_proj_data_info_ptr(), + target_sptr, + zero_seg0_end_planes, + distributed_cache_enabled); + +#ifdef STIR_MPI + //set up distributed caching object + if (distributed_cache_enabled) + { + this->caching_info_ptr = new DistributedCachingInformation(distributed::num_processors); + } + else caching_info_ptr = NULL; +#else + //non parallel version + caching_info_ptr = NULL; +#endif + + this->projector_pair_ptr->set_up(proj_data_info_sptr, + target_sptr); + + // TODO check compatibility between symmetries for forward and backprojector + this->symmetries_sptr.reset( + this->projector_pair_ptr->get_back_projector_sptr()->get_symmetries_used()->clone()); + + if (is_null_ptr(this->normalisation_sptr)) + { + warning("Invalid normalisation object"); + return Succeeded::no; + } + + if (this->normalisation_sptr->set_up(proj_data_info_sptr) == Succeeded::no) + return Succeeded::no; + + if (frame_num<=0) + { + warning("frame_num should be >= 1"); + return Succeeded::no; + } + + if (static_cast(frame_num)> frame_defs.get_num_frames()) + { + warning("frame_num is %d, but should be less than the number of frames %d.", + frame_num, frame_defs.get_num_frames()); + return Succeeded::no; + } + + return Succeeded::yes; +} + +/*************************************************************** + functions that compute the value/gradient of the objective function etc +***************************************************************/ + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +compute_sub_gradient_without_penalty_plus_sensitivity(TargetT& gradient, + const TargetT ¤t_estimate, + const int subset_num) +{ + assert(subset_num>=0); + assert(subset_numnum_subsets); + distributable_compute_gradient(this->projector_pair_ptr->get_forward_projector_sptr(), + this->projector_pair_ptr->get_back_projector_sptr(), + this->symmetries_sptr, + gradient, + current_estimate, + this->proj_data_sptr, + subset_num, + this->num_subsets, + -this->max_segment_num_to_process, + this->max_segment_num_to_process, + this->zero_seg0_end_planes!=0, + NULL, + this->additive_proj_data_sptr + , caching_info_ptr + ); + + +} + + +template +double +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +actual_compute_objective_function_without_penalty(const TargetT& current_estimate, + const int subset_num) +{ + double accum=0.; + + distributable_accumulate_loglikelihood(this->projector_pair_ptr->get_forward_projector_sptr(), + this->projector_pair_ptr->get_back_projector_sptr(), + this->symmetries_sptr, + current_estimate, + this->proj_data_sptr, + subset_num, this->get_num_subsets(), + -this->max_segment_num_to_process, + this->max_segment_num_to_process, + this->zero_seg0_end_planes != 0, &accum, + this->additive_proj_data_sptr, + this->normalisation_sptr, + this->get_time_frame_definitions().get_start_time(this->get_time_frame_num()), + this->get_time_frame_definitions().get_end_time(this->get_time_frame_num()), + this->caching_info_ptr + ); + + + return accum; +} + +#if 0 +template +float +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +sum_projection_data() const +{ + + float counts=0.0F; + + for (int segment_num = -max_segment_num_to_process; segment_num <= max_segment_num_to_process; segment_num++) + { + for (int view_num = proj_data_sptr->get_min_view_num(); + view_num <= proj_data_sptr->get_max_view_num(); + ++view_num) + { + + Viewgram viewgram=proj_data_sptr->get_viewgram(view_num,segment_num); + + //first adjust data + + // KT 05/07/2000 made parameters.zero_seg0_end_planes int + if(segment_num==0 && zero_seg0_end_planes!=0) + { + viewgram[viewgram.get_min_axial_pos_num()].fill(0); + viewgram[viewgram.get_max_axial_pos_num()].fill(0); + } + + truncate_rim(viewgram,rim_truncation_sino); + + //now take totals + counts+=viewgram.sum(); + } + } + + return counts; + +} + +#endif + +template +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +add_subset_sensitivity(TargetT& sensitivity, const int subset_num) const +{ + const int min_segment_num = -this->max_segment_num_to_process; + const int max_segment_num = this->max_segment_num_to_process; + + // warning: has to be same as subset scheme used as in distributable_computation + for (int segment_num = min_segment_num; segment_num <= max_segment_num; ++segment_num) + { + //CPUTimer timer; + //timer.start(); + + for (int view = this->proj_data_sptr->get_min_view_num() + subset_num; + view <= this->proj_data_sptr->get_max_view_num(); + view += this->num_subsets) + { + const ViewSegmentNumbers view_segment_num(view, segment_num); + + if (!symmetries_sptr->is_basic(view_segment_num)) + continue; + this->add_view_seg_to_sensitivity(sensitivity, view_segment_num); + } + // cerr< +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +add_view_seg_to_sensitivity(TargetT& sensitivity, const ViewSegmentNumbers& view_seg_nums) const +{ + RelatedViewgrams viewgrams = + this->proj_data_sptr->get_empty_related_viewgrams(view_seg_nums, + this->symmetries_sptr); + viewgrams.fill(1.F); + // find efficiencies + { + const double start_frame = this->frame_defs.get_start_time(this->frame_num); + const double end_frame = this->frame_defs.get_end_time(this->frame_num); + this->normalisation_sptr->undo(viewgrams,start_frame,end_frame); + } + // backproject + { + const int range_to_zero = + view_seg_nums.segment_num() == 0 && this->zero_seg0_end_planes + ? 1 : 0; + const int min_ax_pos_num = + viewgrams.get_min_axial_pos_num() + range_to_zero; + const int max_ax_pos_num = + viewgrams.get_max_axial_pos_num() - range_to_zero; + + this->projector_pair_ptr->get_back_projector_sptr()-> + back_project(sensitivity, viewgrams, + min_ax_pos_num, max_ax_pos_num); + } + +} + + +template +Succeeded +PoissonLogLikelihoodWithLinearModelForMeanAndProjData:: +actual_add_multiplication_with_approximate_sub_Hessian_without_penalty(TargetT& output, + const TargetT& input, + const int subset_num) const +{ + { + string explanation; + if (!input.has_same_characteristics(this->get_sensitivity(), + explanation)) + { + warning("PoissonLogLikelihoodWithLinearModelForMeanAndProjData:\n" + "sensitivity and input for add_multiplication_with_approximate_Hessian_without_penalty\n" + "should have the same characteristics.\n%s", + explanation.c_str()); + return Succeeded::no; + } + } + + shared_ptr symmetries_sptr( + this->get_projector_pair().get_symmetries_used()->clone()); + + const double start_time = + this->get_time_frame_definitions().get_start_time(this->get_time_frame_num()); + const double end_time = + this->get_time_frame_definitions().get_end_time(this->get_time_frame_num()); + + for (int segment_num = -this->get_max_segment_num_to_process(); + segment_num<= this->get_max_segment_num_to_process(); + ++segment_num) + { + for (int view = this->get_proj_data().get_min_view_num() + subset_num; + view <= this->get_proj_data().get_max_view_num(); + view += this->num_subsets) + { + const ViewSegmentNumbers view_segment_num(view, segment_num); + + if (!symmetries_sptr->is_basic(view_segment_num)) + continue; + + // first compute data-term: y*norm^2 + RelatedViewgrams viewgrams = + this->get_proj_data().get_related_viewgrams(view_segment_num, symmetries_sptr); + // TODO add 1 for 1/(y+1) approximation + + this->get_normalisation().apply(viewgrams, start_time, end_time); + + // smooth TODO + + this->get_normalisation().apply(viewgrams, start_time, end_time); + + RelatedViewgrams tmp_viewgrams; + // set tmp_viewgrams to geometric forward projection of input + { + tmp_viewgrams = this->get_proj_data().get_empty_related_viewgrams(view_segment_num, symmetries_sptr); + this->get_projector_pair().get_forward_projector_sptr()-> + forward_project(tmp_viewgrams, input); + } + + // now divide by the data term + { + int tmp1=0, tmp2=0;// ignore counters returned by divide_and_truncate + divide_and_truncate(tmp_viewgrams, viewgrams, 0, tmp1, tmp2); + } + + // back-project + this->get_projector_pair().get_back_projector_sptr()-> + back_project(output, tmp_viewgrams); + } + + } // end of loop over segments + + return Succeeded::yes; +} + +/*********************** distributable_* ***************************/ +// TODO all this stuff is specific to DiscretisedDensity, so wouldn't work for TargetT + +#ifdef STIR_MPI +// make call-backs public for the moment + +//! Call-back function for compute_gradient +RPC_process_related_viewgrams_type RPC_process_related_viewgrams_gradient; + +//! Call-back function for accumulate_loglikelihood +RPC_process_related_viewgrams_type RPC_process_related_viewgrams_accumulate_loglikelihood; +#else +//! Call-back function for compute_gradient +static RPC_process_related_viewgrams_type RPC_process_related_viewgrams_gradient; + +//! Call-back function for accumulate_loglikelihood +static RPC_process_related_viewgrams_type RPC_process_related_viewgrams_accumulate_loglikelihood; +#endif + +void distributable_compute_gradient(const shared_ptr& forward_projector_sptr, + const shared_ptr& back_projector_sptr, + const shared_ptr& symmetries_sptr, + DiscretisedDensity<3,float>& output_image, + const DiscretisedDensity<3,float>& input_image, + const shared_ptr& proj_dat, + int subset_num, int num_subsets, + int min_segment, int max_segment, + bool zero_seg0_end_planes, + double* log_likelihood_ptr, + shared_ptr const& additive_binwise_correction, + DistributedCachingInformation* caching_info_ptr + ) +{ + + distributable_computation(forward_projector_sptr, + back_projector_sptr, + symmetries_sptr, + &output_image, &input_image, + proj_dat, true, //i.e. do read projection data + subset_num, num_subsets, + min_segment, max_segment, + zero_seg0_end_planes, + log_likelihood_ptr, + additive_binwise_correction, + /* normalisation info to be ignored */ shared_ptr(), 0., 0., + &RPC_process_related_viewgrams_gradient, + caching_info_ptr + ); +} + + +void distributable_accumulate_loglikelihood( + const shared_ptr& forward_projector_sptr, + const shared_ptr& back_projector_sptr, + const shared_ptr& symmetries_sptr, + const DiscretisedDensity<3,float>& input_image, + const shared_ptr& proj_dat, + int subset_num, int num_subsets, + int min_segment, int max_segment, + bool zero_seg0_end_planes, + double* log_likelihood_ptr, + shared_ptr const& additive_binwise_correction, + shared_ptr const& normalisation_sptr, + const double start_time_of_frame, + const double end_time_of_frame, + DistributedCachingInformation* caching_info_ptr + ) + +{ + distributable_computation(forward_projector_sptr, + back_projector_sptr, + symmetries_sptr, + NULL, &input_image, + proj_dat, true, //i.e. do read projection data + subset_num, num_subsets, + min_segment, max_segment, + zero_seg0_end_planes, + log_likelihood_ptr, + additive_binwise_correction, + normalisation_sptr, + start_time_of_frame, + end_time_of_frame, + &RPC_process_related_viewgrams_accumulate_loglikelihood, + caching_info_ptr + ); +} + +//////////// RPC functions + + +void RPC_process_related_viewgrams_gradient( + const shared_ptr& forward_projector_sptr, + const shared_ptr& back_projector_sptr, + DiscretisedDensity<3,float>* output_image_ptr, + const DiscretisedDensity<3,float>* input_image_ptr, + RelatedViewgrams* measured_viewgrams_ptr, + int& count, int& count2, double* log_likelihood_ptr /* = NULL */, + const RelatedViewgrams* additive_binwise_correction_ptr, + const RelatedViewgrams* mult_viewgrams_ptr) +{ + assert(output_image_ptr != NULL); + assert(input_image_ptr != NULL); + assert(measured_viewgrams_ptr != NULL); + if (!is_null_ptr(mult_viewgrams_ptr)) + error("Internal error: mult_viewgrams_ptr should be zero when computing gradient"); + + RelatedViewgrams estimated_viewgrams = measured_viewgrams_ptr->get_empty_copy(); + + /*if (distributed::first_iteration) + { + stir::RelatedViewgrams::iterator viewgrams_iter = measured_viewgrams_ptr->begin(); + stir::RelatedViewgrams::iterator viewgrams_end = measured_viewgrams_ptr->end(); + while (viewgrams_iter!= viewgrams_end) + { + printf("\nSLAVE VIEWGRAM\n"); + int pos=0; + for ( int tang_pos = -144 ;tang_pos <= 143 ;++tang_pos) + for ( int ax_pos = 0; ax_pos <= 62 ;++ax_pos) + { + if (pos>3616 && pos <3632) printf("%f, ",(*viewgrams_iter)[ax_pos][tang_pos]); + pos++; + } + viewgrams_iter++; + } + } +*/ + forward_projector_sptr->forward_project(estimated_viewgrams, *input_image_ptr); + + + + if (additive_binwise_correction_ptr != NULL) + { + estimated_viewgrams += (*additive_binwise_correction_ptr); + } + + + + + + + // for sinogram division + + divide_and_truncate(*measured_viewgrams_ptr, estimated_viewgrams, rim_truncation_sino, count, count2, log_likelihood_ptr); + + back_projector_sptr->back_project(*output_image_ptr, *measured_viewgrams_ptr); +}; + + +void RPC_process_related_viewgrams_accumulate_loglikelihood( + const shared_ptr& forward_projector_sptr, + const shared_ptr& back_projector_sptr, + DiscretisedDensity<3,float>* output_image_ptr, + const DiscretisedDensity<3,float>* input_image_ptr, + RelatedViewgrams* measured_viewgrams_ptr, + int& count, int& count2, double* log_likelihood_ptr, + const RelatedViewgrams* additive_binwise_correction_ptr, + const RelatedViewgrams* mult_viewgrams_ptr) +{ + + assert(output_image_ptr == NULL); + assert(input_image_ptr != NULL); + assert(measured_viewgrams_ptr != NULL); + assert(log_likelihood_ptr != NULL); + + RelatedViewgrams estimated_viewgrams = measured_viewgrams_ptr->get_empty_copy(); + + forward_projector_sptr->forward_project(estimated_viewgrams, *input_image_ptr); + + if (additive_binwise_correction_ptr != NULL) + { + estimated_viewgrams += (*additive_binwise_correction_ptr); + }; + + if (mult_viewgrams_ptr != NULL) + { + estimated_viewgrams *= (*mult_viewgrams_ptr); + } + + RelatedViewgrams::iterator meas_viewgrams_iter = + measured_viewgrams_ptr->begin(); + RelatedViewgrams::const_iterator est_viewgrams_iter = + estimated_viewgrams.begin(); + // call function that does the actual work, it sits in recon_array_funtions.cxx (TODO) + for (; + meas_viewgrams_iter != measured_viewgrams_ptr->end(); + ++meas_viewgrams_iter, ++est_viewgrams_iter) + accumulate_loglikelihood(*meas_viewgrams_iter, + *est_viewgrams_iter, + rim_truncation_sino, log_likelihood_ptr); +}; + + +# ifdef _MSC_VER +// prevent warning message on instantiation of abstract class +# pragma warning(disable:4661) +# endif + +template class PoissonLogLikelihoodWithLinearModelForMeanAndProjData >; + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjDataRebinning.cxx b/src/recon_buildblock/ProjDataRebinning.cxx new file mode 100644 index 0000000000..72f11513c3 --- /dev/null +++ b/src/recon_buildblock/ProjDataRebinning.cxx @@ -0,0 +1,167 @@ +// +// +/*! + \file + \ingroup recon_buildblock + \brief implementation of the ProjDataRebinning class + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/recon_buildblock/ProjDataRebinning.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" + +START_NAMESPACE_STIR + +void +ProjDataRebinning:: +set_defaults() +{ + output_filename_prefix=""; + input_filename=""; + max_segment_num_to_process=-1; +} + +void +ProjDataRebinning:: +initialise_keymap() +{ + parser.add_key("input file",&input_filename); + //parser.add_key("mash x views", &num_views_to_add); + parser.add_key("maximum absolute segment number to process", &max_segment_num_to_process); + + parser.add_key("output filename prefix",&output_filename_prefix); + +} + + +bool +ProjDataRebinning:: +post_processing() +{ + if (output_filename_prefix.length() == 0) + { warning("You need to specify an output prefix\n"); return true; } + + if (input_filename.length() == 0) + { warning("You need to specify an input file\n"); return true; } + +#if 0 + if (num_views_to_add!=1 && (num_views_to_add<=0 || num_views_to_add%2 != 0)) + { warning("The 'mash x views' key has an invalid value (must be 1 or even number)\n"); return true; } +#endif + + proj_data_sptr= ProjData::read_from_file(input_filename); + + return false; +} +#if 0 +void +ProjDataRebinning:: +initialise(const string& parameter_filename) +{ + if(parameter_filename.size()==0) + { + cerr << "Next time, try passing the executable a parameter file" + << endl; + + set_defaults(); + ask_parameters(); + + } + +else + { + set_defaults(); + if(!parse(parameter_filename.c_str())) + { + warning("Error parsing input file %s, exiting\n", parameter_filename.c_str()); + exit(EXIT_FAILURE); + } + + } +} + +#endif + +Succeeded +ProjDataRebinning:: +set_up() +{ + if (is_null_ptr(proj_data_sptr)) + { + warning("ProjDataRebinning: input projection data not set"); + return Succeeded::no; + } + if (max_segment_num_to_process == -1) + max_segment_num_to_process = proj_data_sptr->get_max_segment_num(); + else if(max_segment_num_to_process > proj_data_sptr->get_max_segment_num()) + { + warning("ProjDataRebinning: Range error in number of segments to process.\n" + "Max segment number in data is %d while you asked for %d", + proj_data_sptr->get_max_segment_num(), + max_segment_num_to_process); + return Succeeded::no; + } + return Succeeded::yes; +} + +ProjDataRebinning:: +~ProjDataRebinning() +{} + +void ProjDataRebinning::set_max_segment_num_to_process(int ns) +{ max_segment_num_to_process = ns; +} + +int ProjDataRebinning::get_max_segment_num_to_process() const +{ return max_segment_num_to_process; +} +void +ProjDataRebinning::set_output_filename_prefix(const string& s) +{ + output_filename_prefix = s; +} +string +ProjDataRebinning::get_output_filename_prefix() const +{ + return output_filename_prefix; +} + + +shared_ptr +ProjDataRebinning:: +get_proj_data_sptr() +{ + /* KT: deleted warning messages about null pointers. + The user should check this, and might not want the have the + warnings written to stderr. */ + return proj_data_sptr; + } + + +void +ProjDataRebinning:: +set_input_proj_data_sptr(const shared_ptr& new_proj_data_sptr) +{ + proj_data_sptr = new_proj_data_sptr; +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjMatrixByBin.cxx b/src/recon_buildblock/ProjMatrixByBin.cxx new file mode 100644 index 0000000000..bbc38ff509 --- /dev/null +++ b/src/recon_buildblock/ProjMatrixByBin.cxx @@ -0,0 +1,202 @@ +/*! + + \file + \ingroup projection + + \brief implementation of the stir::ProjMatrixByBin class + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/ProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" + +// define a local preprocessor symbol to keep code relatively clean +#ifdef STIR_NO_MUTABLE +#define STIR_MUTABLE_CONST +#else +#define STIR_MUTABLE_CONST const +#endif + +START_NAMESPACE_STIR + +void ProjMatrixByBin::set_defaults() +{ + cache_disabled=false; + cache_stores_only_basic_bins=true; +} + +void +ProjMatrixByBin::initialise_keymap() +{ + parser.add_key("disable caching", &cache_disabled); + parser.add_key("store_only_basic_bins_in_cache", &cache_stores_only_basic_bins); +} + +bool +ProjMatrixByBin::post_processing() +{ + return false; +} + +ProjMatrixByBin::ProjMatrixByBin() +{ + set_defaults(); +} + +void +ProjMatrixByBin:: +enable_cache(const bool v) +{ cache_disabled = v;} + +void +ProjMatrixByBin:: +store_only_basic_bins_in_cache(const bool v) +{ cache_stores_only_basic_bins=v;} + +bool +ProjMatrixByBin:: +is_cache_enabled() const +{ return !cache_disabled; } + +bool +ProjMatrixByBin:: +does_cache_store_only_basic_bins() const +{ return cache_stores_only_basic_bins; } + +void +ProjMatrixByBin:: +clear_cache() STIR_MUTABLE_CONST +{ + this->cache_collection.clear(); +} + +/* +void +ProjMatrixByBin:: +reserve_num_elements_in_cache(const std::size_t num_elems) +{ + if ( cache_disabled ) return; + //cache_collection.reserve(num_elems); + cache_collection.rehash(ceil(num_elems / cache_collection.max_load_factor())); +} +*/ + +Succeeded +ProjMatrixByBin:: +get_cached_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& probabilities) const +{ + if ( cache_disabled ) + return Succeeded::no; + + const Bin bin = probabilities.get_bin(); + +#ifndef NDEBUG + if (cache_stores_only_basic_bins) + { + // Check that this is a 'basic' coordinate + Bin bin_copy = bin; + assert ( symmetries_ptr->find_basic_bin(bin_copy) == 0); + } +#endif + + + const_MapProjMatrixElemsForOneBinIterator pos = + cache_collection.find(cache_key( bin)); + + if ( pos != cache_collection. end()) + { + //cout << Key << " =========>> entry found in cache " << endl; + probabilities = pos->second; + return Succeeded::yes; + } + + //cout << " This entry is not in the cache :" << Key << endl; + return Succeeded::no; +} + + + +//TODO + + + +////////////////////////////////////////////////////////////////////////// +#if 0 +// KT moved here +//! store the projection matrix to the file by rows +void ProjMatrixByBin::write_to_file_by_bin( + const char * const file_name_without_extension) +{ + char h_interfile[256]; + sprintf (h_interfile, "%s.hp", file_name_without_extension ); + FILE * prob_file = fopen (h_interfile , "wb"); + sprintf (h_interfile, "%s.p", file_name_without_extension ); + fstream pout; + open_write_binary(pout, h_interfile); + + // KT tough ! write Symmetries to file! + // scan_info ==> interfile header + + int t, get_num_delta = 15;// todo change to scan_info.get_num_delta(); + pout.write( (char*)&get_num_delta, sizeof (int)); + t = proj_data_info_ptr->get_num_views()/4; + pout.write( (char*)& t,sizeof (int)); + t= proj_data_info_ptr->get_num_tangential_poss()/2; + pout.write( (char*)&t, sizeof (int)); + int max_z = image_info.get_max_z(); + pout.write( (char*)& max_z, sizeof(int)); + + int nviews = proj_data_info_ptr->get_num_views(); + pout.write( (char*)& nviews, sizeof(int)); + + //float offset = offset_ring(); pout.write( (char*)& offset, sizeof(float)); + + for ( int seg = 0; seg <= get_num_delta; ++seg) + for ( int view = 0 ;view <= proj_data_info_ptr->get_num_views()/4;++view) + for ( int bin = 0 ;bin <= proj_data_info_ptr->get_num_tangential_poss()/2;++bin) + for ( int ring = 0; ring <= 0 /*get_num_rings()*/ ;++ring) // only ring 0 + { + ProjMatrixElemsForOneBin ProbForOneBin; + get_proj_matrix_elems_for_one_bin( + ProbForOneBin, + seg, + view, + ring, + bin); + cout << " get_number_of_elements() " << ProbForOneBin. get_number_of_elements() << endl; + ProbForOneBin.write(pout); + } + pout.close(); + fclose(prob_file); + cout << "End of write_to_file_by_bin " << endl; +} + + +#endif + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjMatrixByBinFromFile.cxx b/src/recon_buildblock/ProjMatrixByBinFromFile.cxx new file mode 100644 index 0000000000..5972043976 --- /dev/null +++ b/src/recon_buildblock/ProjMatrixByBinFromFile.cxx @@ -0,0 +1,523 @@ +/* + Copyright (C) 2004 - 2008, Hammersmith Imanet Ltd + Copyright (C) 2011 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projection + + \brief Implementation of class stir::ProjMatrixByBinFromFile + + \author Kris Thielemans +*/ + +#include "stir/ProjDataInterfile.h" +#include "stir/ExamInfo.h" +#include "stir/recon_buildblock/ProjMatrixByBinFromFile.h" +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +#include "stir/KeyParser.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/ProjDataInfo.h" +#include "stir/utilities.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/Coordinate3D.h" +//#include "boost/format.hpp" +//#include "stir/info.h" +#include "boost/cstdint.hpp" +#include "boost/scoped_ptr.hpp" +#include +#include + + +START_NAMESPACE_STIR + + +const char * const +ProjMatrixByBinFromFile::registered_name = +"From File"; + +ProjMatrixByBinFromFile:: +ProjMatrixByBinFromFile() +{ + set_defaults(); +} + +void +ProjMatrixByBinFromFile:: +initialise_keymap() +{ + parser.add_start_key("Projection Matrix By Bin From File Parameters"); + ProjMatrixByBin::initialise_keymap(); + + parser.add_key("template_density_filename", &template_density_filename); + parser.add_key("template_proj_data_filename", &template_proj_data_filename); + parser.add_key("data_filename", &data_filename); + + parser.add_key("Version", &this->parsed_version); + parser.add_key("symmetries type", &this->symmetries_type) ; + + //parser.add_key("PET_CartesianGrid symmetries parameters", + // KeyArgument::NONE, &KeyParser::do_nothing); + parser.add_key("do_symmetry_90degrees_min_phi", &do_symmetry_90degrees_min_phi); + parser.add_key("do_symmetry_180degrees_min_phi", &do_symmetry_180degrees_min_phi); + parser.add_key("do_symmetry_swap_segment", &do_symmetry_swap_segment); + parser.add_key("do_symmetry_swap_s", &do_symmetry_swap_s); + parser.add_key("do_symmetry_shift_z", &do_symmetry_shift_z); + //parser.add_key("End PET_CartesianGrid symmetries parameters", + // KeyArgument::NONE, &KeyParser::do_nothing); + parser.add_stop_key("End Projection Matrix By Bin From File Parameters"); +} + + +void +ProjMatrixByBinFromFile::set_defaults() +{ + ProjMatrixByBin::set_defaults(); + template_density_filename=""; + template_proj_data_filename=""; + data_filename=""; + + do_symmetry_90degrees_min_phi = true; + do_symmetry_180degrees_min_phi = true; + do_symmetry_swap_segment = true; + do_symmetry_swap_s = true; + do_symmetry_shift_z = true; +} + + +bool +ProjMatrixByBinFromFile::post_processing() +{ + if (ProjMatrixByBin::post_processing() == true) + return true; + + if (this->parsed_version != "1.0") + { + warning("version has to be 1.0"); + return true; + } + if (this->symmetries_type != "PET_CartesianGrid") + { + warning("symmetries type has to be PET_CartesianGrid"); + return true; + } + + if (template_density_filename.size()==0) + { + warning("template_density_filename has to be specified.\n"); + return true; + } + if (template_proj_data_filename.size()==0) + { + warning("template_proj_data_filename has to be specified.\n"); + return true; + } + if (data_filename.size()==0) + { + warning("data_filename has to be specified.\n"); + return true; + } + { + shared_ptr proj_data_sptr = + ProjData::read_from_file(template_proj_data_filename); + this->proj_data_info_ptr.reset(proj_data_sptr->get_proj_data_info_ptr()->clone()); + } + shared_ptr > + density_info_sptr(read_from_file >(template_density_filename)); + { + const VoxelsOnCartesianGrid * image_info_ptr = + dynamic_cast*> (density_info_sptr.get()); + + if (image_info_ptr == NULL) + error("ProjMatrixByBinFromFile initialised with a wrong type of DiscretisedDensity"); + + densel_range = image_info_ptr->get_index_range(); + voxel_size = image_info_ptr->get_voxel_size(); + origin = image_info_ptr->get_origin(); + } + + + + symmetries_ptr.reset( + new DataSymmetriesForBins_PET_CartesianGrid(proj_data_info_ptr, + density_info_sptr, + do_symmetry_90degrees_min_phi, + do_symmetry_180degrees_min_phi, + do_symmetry_swap_segment, + do_symmetry_swap_s, + do_symmetry_shift_z)); + + return false; +} + + +void +ProjMatrixByBinFromFile:: +set_up( + const shared_ptr& proj_data_info_ptr_v, + const shared_ptr >& density_info_ptr // TODO should be Info only + ) +{ + + const VoxelsOnCartesianGrid * image_info_ptr = + dynamic_cast*> (density_info_ptr.get()); + + if (image_info_ptr == NULL) + error("ProjMatrixByBinFromFile set-up with a wrong type of DiscretisedDensity\n"); + + // TODO allow for smaller range + if (densel_range != image_info_ptr->get_index_range()) + error("ProjMatrixByBinFromFile set-up with image with wrong index range\n"); + if (voxel_size != image_info_ptr->get_voxel_size()) + error("ProjMatrixByBinFromFile set-up with image with wrong voxel size\n"); + if (origin != image_info_ptr->get_origin()) + error("ProjMatrixByBinFromFile set-up with image with wrong origin\n"); + + /* do consistency checks on projection data. + It's safe as long as the stored range is larger than what we need. + */ + { + boost::scoped_ptr smaller_proj_data_info_sptr(this->proj_data_info_ptr->clone()); + // first reduce to input segment-range + { + const int new_max = std::min(proj_data_info_ptr_v->get_max_segment_num(), + this->proj_data_info_ptr->get_max_segment_num()); + const int new_min = std::max(proj_data_info_ptr_v->get_min_segment_num(), + this->proj_data_info_ptr->get_min_segment_num()); + smaller_proj_data_info_sptr->reduce_segment_range(new_min, new_max); + } + // same for tangential_pos range + { + const int new_max = std::min(proj_data_info_ptr_v->get_max_tangential_pos_num(), + this->proj_data_info_ptr->get_max_tangential_pos_num()); + const int new_min = std::max(proj_data_info_ptr_v->get_min_tangential_pos_num(), + this->proj_data_info_ptr->get_min_tangential_pos_num()); + smaller_proj_data_info_sptr->set_min_tangential_pos_num(new_min); + smaller_proj_data_info_sptr->set_max_tangential_pos_num(new_max); + } + + if (*proj_data_info_ptr_v != *smaller_proj_data_info_sptr) + error("ProjMatrixByBinFromFile set-up with proj data with wrong characteristics"); + } + + if (read_data() ==Succeeded::no) + error("Something wrong reading the matrix from file. Exiting."); +} + +// anonymous namespace for local functions +namespace { + + // static (i.e. private) function to write the data + static Succeeded + write_lor(std::ostream&fst, const ProjMatrixElemsForOneBin& lor) + { + const Bin bin = lor.get_bin(); + { + boost::int32_t c; + c = bin.segment_num(); fst.write ( (char*)&c, sizeof(boost::int32_t)); + c = bin.view_num(); fst.write ( (char*)&c, sizeof(boost::int32_t)); + c = bin.axial_pos_num(); fst.write ( (char*)&c, sizeof(boost::int32_t)); + c = bin.tangential_pos_num(); fst.write ( (char*)&c, sizeof(boost::int32_t)); + } + { + boost::uint32_t c= static_cast(lor.size()); + fst.write( (char*)&c , sizeof(boost::uint32_t)); + } + if (!fst) + return Succeeded::no; + ProjMatrixElemsForOneBin::const_iterator element_ptr = lor.begin(); + // todo add compression in this loop + while (element_ptr != lor.end()) + { + boost::int16_t c; + c = static_cast(element_ptr->coord1()); + fst.write ( (char*)&c, sizeof(boost::int16_t)); + c = static_cast(element_ptr->coord2()); + fst.write ( (char*)&c, sizeof(boost::int16_t)); + c = static_cast(element_ptr->coord3()); + fst.write ( (char*)&c, sizeof(boost::int16_t)); + const float value = element_ptr->get_value(); + fst.write ( (char*)&value, sizeof(float)); + if (!fst) + return Succeeded::no; + + ++element_ptr; + } + return Succeeded::yes; + } + + // return type for read_lor() + class readReturnType + { + public: + enum value { ok, eof, problem }; + readReturnType(const value& v) : v(v) {} + bool operator==(const readReturnType &v2) const { return v == v2.v; } + bool operator!=(const readReturnType &v2) const { return v != v2.v; } + private: + value v; + }; + + // static (i.e. private) function to read an lor + static + readReturnType + read_lor(std::istream&fst, ProjMatrixElemsForOneBin& lor ) + { + lor.erase(); + + { + Bin bin; + boost::int32_t c; + fst.read( (char*)&c, sizeof(boost::int32_t)); bin.segment_num()=c; + if (fst.gcount()==0 && fst.eof()) + { + // we were at EOF + return readReturnType::eof; + } + + fst.read( (char*)&c, sizeof(boost::int32_t)); bin.view_num()=c; + fst.read( (char*)&c, sizeof(boost::int32_t)); bin.axial_pos_num()=c; + fst.read( (char*)&c, sizeof(boost::int32_t)); bin.tangential_pos_num()=c; + bin.set_bin_value(0); + lor.set_bin(bin); + // info(boost::format("Read bin (s:%d,a:%d,v:%d,t:%d)") % + // bin.segment_num()%bin.axial_pos_num()%bin.view_num()%bin.tangential_pos_num()); + + } + boost::uint32_t count; + fst.read ( (char*)&count, sizeof(boost::uint32_t)); + + if (!fst || fst.gcount() != 4) + return readReturnType::problem; + + if (count>10000) + error("Unbelievably high count of voxels in LOR: %d", count); + + lor.reserve(count); + + for ( boost::uint32_t i=0; i < count; ++i) + { + boost::int16_t c1,c2,c3; + fst.read ( (char*)&c1, sizeof(boost::int16_t)); + fst.read ( (char*)&c2, sizeof(boost::int16_t)); + fst.read ( (char*)&c3, sizeof(boost::int16_t)); + float value; + fst.read ( (char*)&value, sizeof(float)); + + if (!fst) + return readReturnType::problem; + const ProjMatrixElemsForOneBin::value_type + elem(Coordinate3D(c1,c2,c3), value); + lor.push_back( elem); + } + return readReturnType::ok; + } +} // end of anonymous namespace + +Succeeded +ProjMatrixByBinFromFile:: +write_to_file(const string& output_filename_prefix, + const ProjMatrixByBin& proj_matrix, + const shared_ptr& proj_data_info_sptr, + const DiscretisedDensity<3,float>& template_density) +{ + + string template_density_filename = + output_filename_prefix + "_template_density"; + { + if (OutputFileFormat >::default_sptr()-> + write_to_file(template_density_filename, + template_density) != Succeeded::yes) + { + warning("Error writing template image"); + return Succeeded::no; + } + } + string template_proj_data_filename = + output_filename_prefix + "_template_proj_data"; + { + // the following constructor will write an interfile header (and empty data) to disk + shared_ptr exam_info_sptr(new ExamInfo); + ProjDataInterfile template_projdata(exam_info_sptr, + proj_data_info_sptr, + template_proj_data_filename); + } + + string header_filename = output_filename_prefix; + replace_extension(header_filename, ".hpm"); + string data_filename = output_filename_prefix; + add_extension(data_filename, ".pm"); + + { + std::ofstream header(header_filename.c_str()); + if (!header) + { + warning("Error opening header %s", + header_filename.c_str()); + return Succeeded::no; + } + + header << "Projection Matrix By Bin From File Parameters:=\n" + << "Version := 1.0\n"; + // TODO symmetries should not be hard-coded + const DataSymmetriesForBins_PET_CartesianGrid& symmetries = + dynamic_cast + (*proj_matrix.get_symmetries_ptr()); + header << "symmetries type := PET_CartesianGrid\n" + << " PET_CartesianGrid symmetries parameters:=\n" + << " do_symmetry_90degrees_min_phi:= " << (symmetries.using_symmetry_90degrees_min_phi() ? 1 : 0) << '\n' + << " do_symmetry_180degrees_min_phi:= " << (symmetries.using_symmetry_180degrees_min_phi() ? 1 : 0) << '\n' + << " do_symmetry_swap_segment:= " << (symmetries.using_symmetry_swap_segment() ? 1 : 0) << '\n' + << " do_symmetry_swap_s:= " << (symmetries.using_symmetry_swap_s() ? 1 : 0) << '\n' + << " do_symmetry_shift_z:= " << (symmetries.using_symmetry_shift_z() ? 1 : 0) << '\n' + << " End PET_CartesianGrid symmetries parameters:=\n"; + + header << "template proj data filename:=" << template_proj_data_filename << '\n'; + header << "template density filename:=" << template_density_filename << '\n'; + + header << "data_filename:=" << data_filename << '\n'; + + header << "End Projection Matrix By Bin From File Parameters:="; + } + + std::ofstream fst; + open_write_binary(fst, data_filename.c_str()); + + // loop over bins + // the complication here is that we cannot just test if each bin in the range is 'basic' + // and write only those. The reason is that symmetry operations can construct a + // 'basic' bin outside of the input range (e.g. for tangential_pos_num ranging from -128 to 127). + // So, we can only loop over all bins, convert to basic bins, and write those. + // The complication is then that we need to keep track which one we wrote already. + // Originally, I did this via a std::list. Checking if a bin was already written + // is terribly slow however. Instead, I currently use a vector of shared_ptrs. + // This wastes only a little bit of memory, but the bounds are difficult to + // determine in general. + // A better approach (and simpler) would be to have access to the internal cache of the + // projection matrix. + { + // defined here to avoid reallocation for every bin + ProjMatrixElemsForOneBin lor; + +#if 0 + std::list already_processed; +#else + typedef VectorWithOffset tpos_t; + typedef VectorWithOffset > vpos_t; + typedef VectorWithOffset > apos_t; + typedef VectorWithOffset > spos_t; + + // vector that will contain (vectors of bools) to check if we wrote a bin already or not + // upper boundary takes into account that symmetries convert negative segment_num to positive + spos_t already_processed(proj_data_info_sptr->get_min_segment_num(), + std::max(proj_data_info_sptr->get_max_segment_num(), + -proj_data_info_sptr->get_min_segment_num())); +#endif + for (int segment_num = proj_data_info_sptr->get_min_segment_num(); + segment_num <= proj_data_info_sptr->get_max_segment_num(); + ++segment_num) + for (int axial_pos_num = proj_data_info_sptr->get_min_axial_pos_num(segment_num); + axial_pos_num <= proj_data_info_sptr->get_max_axial_pos_num(segment_num); + ++axial_pos_num) + for (int view_num = proj_data_info_sptr->get_min_view_num(); + view_num <= proj_data_info_sptr->get_max_view_num(); + ++view_num) + for (int tang_pos_num = proj_data_info_sptr->get_min_tangential_pos_num(); + tang_pos_num <= proj_data_info_sptr->get_max_tangential_pos_num(); + ++tang_pos_num) + { + Bin bin(segment_num,view_num, axial_pos_num, tang_pos_num); + proj_matrix.get_symmetries_ptr()->find_basic_bin(bin); +#if 0 + if (std::find(already_processed.begin(), already_processed.end(), bin) + != already_processed.end()) + continue; + + already_processed.push_back(bin); +#else + if (is_null_ptr(already_processed[bin.segment_num()])) + { + // range attempts to take into account that symmetries normally bring axial_pos_num back to 0 or 1 + already_processed[bin.segment_num()]. + reset(new apos_t(std::min(0,proj_data_info_sptr->get_min_axial_pos_num(bin.segment_num())), + std::max(1,proj_data_info_sptr->get_max_axial_pos_num(bin.segment_num())))); + } + if (is_null_ptr((*already_processed[bin.segment_num()])[bin.axial_pos_num()])) + { + (*already_processed[bin.segment_num()])[bin.axial_pos_num()]. + reset(new vpos_t(proj_data_info_sptr->get_min_view_num(), + proj_data_info_sptr->get_max_view_num())); + } + if (is_null_ptr((*(*already_processed[bin.segment_num()])[bin.axial_pos_num()])[bin.view_num()])) + { + // range takes into account that symmetries bring negative tangential_pos_num to positive + (*(*already_processed[bin.segment_num()])[bin.axial_pos_num()])[bin.view_num()]. + reset(new tpos_t(proj_data_info_sptr->get_min_tangential_pos_num(), + std::max(proj_data_info_sptr->get_max_tangential_pos_num(), + -proj_data_info_sptr->get_min_tangential_pos_num()))); + (*(*already_processed[bin.segment_num()])[bin.axial_pos_num()])[bin.view_num()]->fill(false); + } + if ((*(*(*already_processed[bin.segment_num()])[bin.axial_pos_num()])[bin.view_num()])[bin.tangential_pos_num()]) + continue; + + (*(*(*already_processed[bin.segment_num()])[bin.axial_pos_num()])[bin.view_num()])[bin.tangential_pos_num()]=true; +#endif + //if (!proj_matrix.get_symmetries_ptr()->is_basic(bin)) + // continue; + + proj_matrix.get_proj_matrix_elems_for_one_bin(lor,bin); + if (write_lor(fst, lor) == Succeeded::no) + return Succeeded::no; + } + } + return Succeeded::yes; +} + +Succeeded +ProjMatrixByBinFromFile:: +read_data() +{ + std::ifstream fst; + open_read_binary(fst, data_filename.c_str()); + + // defined here to avoid reallocation for every bin + ProjMatrixElemsForOneBin lor; + while(!fst.eof()) + { + readReturnType return_value=read_lor(fst, lor); + if (return_value == readReturnType::problem) + return Succeeded::no; + if (return_value == readReturnType::eof) + return Succeeded::yes; + this->cache_proj_matrix_elems_for_one_bin(lor); + } + return Succeeded::yes; +} + + +void +ProjMatrixByBinFromFile:: +calculate_proj_matrix_elems_for_one_bin(ProjMatrixElemsForOneBin& lor + ) const +{ + //error("ProjMatrixByBinFromFile element not found in cache (and hence file)"); + lor.erase(); +} +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/ProjMatrixByBinSPECTUB.cxx b/src/recon_buildblock/ProjMatrixByBinSPECTUB.cxx new file mode 100644 index 0000000000..5b1e05d339 --- /dev/null +++ b/src/recon_buildblock/ProjMatrixByBinSPECTUB.cxx @@ -0,0 +1,757 @@ +/* + Copyright (C) 2013, Institute for Bioengineering of Catalonia + Copyright (C) Biomedical Image Group (GIB), Universitat de Barcelona, Barcelona, Spain. + Copyright (C) 2013-2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup projection + + \brief Implementation of class stir::ProjMatrixByBinSPECTUB + + \author Berta Marti Fuster + \author Carles Falcon + \author Kris Thielemans +*/ + +//#include "stir/ProjDataInterfile.h" +#include "stir/recon_buildblock/ProjMatrixByBinSPECTUB.h" +#include "stir/recon_buildblock/TrivialDataSymmetriesForBins.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +//#include "stir/KeyParser.h" +#include "stir/IO/read_from_file.h" +#include "stir/ProjDataInfo.h" +//#include "stir/utilities.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/Coordinate3D.h" +#include "stir/info.h" +#include "stir/CPUTimer.h" + +//#include "boost/cstdint.hpp" +//#include "boost/scoped_ptr.hpp" +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + +using namespace std; + +//... user defined libraries ............................................................. + +#include "stir/recon_buildblock/SPECTUB_Weight3d.h" + +/* UB-SPECT global variables */ +namespace SPECTUB { + wm_da_type wm; + wmh_type wmh; + float * Rrad; +} + +START_NAMESPACE_STIR + + +const char * const +ProjMatrixByBinSPECTUB::registered_name = +"SPECT UB"; + +ProjMatrixByBinSPECTUB:: +ProjMatrixByBinSPECTUB() +{ + set_defaults(); +} + +void +ProjMatrixByBinSPECTUB:: +initialise_keymap() +{ + parser.add_start_key("Projection Matrix By Bin SPECT UB Parameters"); + ProjMatrixByBin::initialise_keymap(); + + // no longer parse this + // parser.add_key("minimum weight", &minimum_weight); + parser.add_key("maximum number of sigmas", &maximum_number_of_sigmas); + // no longer parse this + // parser.add_key("spatial resolution PSF", &spatial_resolution_PSF); + parser.add_key("psf type", &psf_type); + parser.add_key("collimator sigma 0(cm)", &collimator_sigma_0); + parser.add_key("collimator slope", &collimator_slope); + parser.add_key("attenuation type", &attenuation_type); + parser.add_key("attenuation map", &attenuation_map); + parser.add_key("mask type", &mask_type); + parser.add_key("mask file", &mask_file); + parser.add_key("keep_all_views_in_cache", &keep_all_views_in_cache); + + parser.add_stop_key("End Projection Matrix By Bin SPECT UB Parameters"); +} + + +void +ProjMatrixByBinSPECTUB::set_defaults() +{ + ProjMatrixByBin::set_defaults(); + + this->already_setup= false; + + this->keep_all_views_in_cache=false; + minimum_weight=0.0; + maximum_number_of_sigmas= 2.; + spatial_resolution_PSF= 0.00001; + psf_type= "Geometrical"; + collimator_slope= 0.; + collimator_sigma_0= 0.; + attenuation_type= "no"; + attenuation_map= ""; + mask_type= "no"; + mask_file= ""; + +} + + +bool +ProjMatrixByBinSPECTUB::post_processing() +{ + if (ProjMatrixByBin::post_processing() == true) + return true; + + this->already_setup= false; + + return false; +} + + +void +ProjMatrixByBinSPECTUB:: +set_up( + const shared_ptr& proj_data_info_ptr_v, + const shared_ptr >& density_info_ptr // TODO should be Info only + ) +{ + using namespace SPECTUB; + + const VoxelsOnCartesianGrid * image_info_ptr = + dynamic_cast*> (density_info_ptr.get()); + + if (image_info_ptr == NULL) + error("ProjMatrixByBinFromFile set-up with a wrong type of DiscretisedDensity\n"); + + if (this->already_setup) + { + if (this->densel_range == image_info_ptr->get_index_range() && + this->voxel_size == image_info_ptr->get_voxel_size() && + this->origin == image_info_ptr->get_origin() && + *proj_data_info_ptr_v == *this->proj_data_info_ptr) + { + // stored matrix should be compatible, so we can just reuse it + return; + } + else + { + this->clear_cache(); + } + } + + this->proj_data_info_ptr=proj_data_info_ptr_v; + symmetries_ptr.reset( + new TrivialDataSymmetriesForBins(proj_data_info_ptr_v)); + + this->densel_range = image_info_ptr->get_index_range(); + this->voxel_size = image_info_ptr->get_voxel_size(); + this->origin = image_info_ptr->get_origin(); + + const ProjDataInfoCylindricalArcCorr * proj_Data_Info_Cylindrical = + dynamic_cast (this->proj_data_info_ptr.get()); + + CPUTimer timer; + timer.start(); + + //... fill prj structure from projection data info + + prj.Nbin = this->proj_data_info_ptr->get_num_tangential_poss(); + prj.szcm = this->proj_data_info_ptr->get_scanner_ptr()->get_default_bin_size()/10.; + prj.Nang = this->proj_data_info_ptr->get_num_views(); + + + //... fill vol structure from image_info_ptr + vol.Ncol = image_info_ptr->get_x_size(); // Image: number of columns + vol.Nrow = image_info_ptr->get_y_size(); // Image: number of rows + vol.Nsli = image_info_ptr->get_z_size(); // Image: and projections: number of slices + vol.szcm = image_info_ptr->get_voxel_size().x()/10.; // Image: voxel size (cm) + vol.thcm = image_info_ptr->get_voxel_size().z()/10.; // Image: slice thickness (cm) + + //..... geometrical and other derived parameters of the volume structure............... + vol.Npix = vol.Ncol * vol.Nrow; + vol.Nvox = vol.Npix * vol.Nsli; + + vol.Ncold2 = (float)vol.Ncol / (float)2.; // half of the matrix Nvox (integer or semi-integer) + vol.Nrowd2 = (float)vol.Nrow / (float)2.; // half of the matrix NbOS (integer or semi-integer) + vol.Nslid2 = (float)vol.Nsli / (float)2.; // half of the number of slices (integer or semi-integer) + + vol.Xcmd2 = vol.Ncold2 * vol.szcm; // Half of the size of the image volume, dimension x (cm); + vol.Ycmd2 = vol.Nrowd2 * vol.szcm; // Half of the size of the image volume, dimension y (cm); + vol.Zcmd2 = vol.Nslid2 * vol.thcm; // Half of the size of the image volume, dimension z (cm); + + vol.x0 = ( (float)0.5 - vol.Ncold2) * vol.szcm; // coordinate x of the first voxel + vol.y0 = ( (float)0.5 - vol.Nrowd2) * vol.szcm; // coordinate y of the first voxel + vol.z0 = ( (float)0.5 - vol.Nslid2) * vol.thcm; // coordinate z of the first voxel + + vol.first_sl = 0; // Image: first slice to take into account (no weight bellow) + vol.last_sl = vol.Nsli; // Image: last slice to take into account (no weights above) + + wmh.vol = vol; + + //...... geometrical dimensions of the voxel structure ................. + vox.szcm = vol.szcm; + vox.thcm = vol.thcm; + + //... projecction parameters .......................................... + prj.ang0 = this->proj_data_info_ptr->get_scanner_ptr()->get_default_intrinsic_tilt() * float(180/_PI); + prj.incr = proj_Data_Info_Cylindrical->get_azimuthal_angle_sampling() * float(180/_PI); + prj.thcm = vol.thcm; + + //.......geometrical and other derived parameters of projection structure........... + prj.Nsli = vol.Nsli; // number of slices + prj.lngcm = prj.Nbin * prj.szcm; // length in cm of the detection line + prj.Nbp = prj.Nbin * prj.Nsli; // number of bins for each projection angle (2D-projection) + prj.Nbt = prj.Nbp * prj.Nang; // total number of bins considering all the projection angles + prj.Nbind2 = (float)prj.Nbin / (float)2.; // half of the number of bins in a detection line (integer or semi-integer) + prj.lngcmd2 = prj.lngcm / (float)2.; // half of the length of detection line (cm) + prj.Nslid2 = (float)prj.Nsli / (float)2.; // half of the number of slices (integer or semi-integer) + + + //... number of subsets (always 1 in STIR) ................................................ + prj.NOS = prj.Nang; // number of subset in which to split the weight matrix + prj.NangOS = prj.Nang / prj.NOS; // number of angles of projection in each subset + prj.NbOS = prj.Nbt / prj.NOS; // total number of bins in each subset + + wmh.prj = prj; + // wmh.NpixAngOS = vol.Npix * prj.NangOS; + + //....rotation radius ................................................. + const VectorWithOffset radius_all_views = + proj_Data_Info_Cylindrical->get_ring_radii_for_all_views(); + + Rrad = new float [ wmh.prj.Nang ]; + for ( int i = 0 ; i < wmh.prj.Nang ; i++ ) { + // note: convert to cm for UB SPECT library + Rrad[ i ] = radius_all_views[i]/10; + } + + //... resolution parameters .............................................. + wmh.min_w = minimum_weight; + wmh.maxsigm = maximum_number_of_sigmas; + wmh.psfres = spatial_resolution_PSF; + + bin.szcm = wmh.prj.szcm; + bin.szcmd2 = bin.szcm / (float)2.; + bin.thcm = wmh.prj.thcm; + bin.thcmd2 = bin.thcm / (float)2.; + bin.szdx = bin.szcm / wmh.psfres; + bin.thdx = bin.thcm / wmh.psfres; + + //....PSF and collimator parameters ........................................ + + if ( psf_type == "Geometrical" ) wmh.do_psf = false; + else{ + wmh.do_psf = true; + + if ( psf_type == "3D" ) { + wmh.do_psf_3d = true; + cout << "3D PSF Correction. Parallel geometry" << endl; + } + else { + if ( psf_type== "2D" ) { + wmh.do_psf_3d = false; + cout << "2D PSF Correction. Parallel geometry" << endl; + } + else + { + //error_wm_SPECT( 120, psf_type ); + error("PSF type has to be 2D, 3D or Geometrical"); + } + } + } + + if ( wmh.do_psf ){ + wmh.predef_col = false; + wmh.COL.A = collimator_slope; + wmh.COL.B = collimator_sigma_0; + } + else{ + // code to enable fan-beam collimator at some point... (not validated) + // before enabling, you will have to change the parameter file to give parameters of the fan-beam + //int num = collimator_number; + //if ( num ==0 ) { + wmh.COL.do_fb = false; + cout << "No correction for PSF. Parallel geometry" << endl; + //} + //else { + // wmh.COL.do_fb = true; + // wmh.COL.F = collimator_number; + // cout << "No correction for PSF. Fanbeam geometry with focal distance = " << wmh.COL.F << " cm " << endl; + //} + } + + //... attenuation parameters ......................... + + if ( attenuation_type == "No" ) { + wmh.do_att = false; + } + else{ + wmh.do_att = true; + + if ( attenuation_type == "Simple" ) wmh.do_full_att = false; + else { + if (attenuation_type == "Full" ) wmh.do_full_att = true; + else + { + //error_wm_SPECT( 123, attenuation_type ); + error("attenuation_type has to be Simple or Full"); + } + } + + wmh.att_fn = attenuation_map; + + } + + //... masking parameters............................. + + if( mask_type == "No" ){ + wmh.do_msk = wmh.do_msk_cyl = wmh.do_msk_att = wmh.do_msk_file = false; + } + else{ + wmh.do_msk = true; + if( mask_type == "Cylinder" ) wmh.do_msk_cyl = true; + else { + if( mask_type == "Attenuation Map" ) wmh.do_msk_att = true; + else{ + if( mask_type == "Explicit Mask" ){ + wmh.do_msk_file = true; + + wmh.msk_fn = mask_file; + + cout << "MASK filename = " << wmh.msk_fn << endl; + } + else + { + // error_wm_SPECT( 125, mask_type); + error("mask_type has to be Cylinder, Attenuation Map or Explicit Mask"); + } + } + } + } + + wmh.do_msk_slc = false; + + if ( vol.first_sl > 0 || vol.last_sl < vol.Nsli ){ + wmh.do_msk = true; + wmh.do_msk_slc = true; + } + + wm.do_save_STIR = true; + + //:: Control of read parameters + cout << "" << endl; + cout << "Parameters of SPECT UB matrix:" << endl; + cout << "Image grid side row: " << wmh.vol.Nrow << "\tcol: " << wmh.vol.Ncol << "\tvoxel_size: " << wmh.vol.szcm<< endl; + cout << "Number of slices: " << wmh.vol.Nsli << "\tslice_thickness: " << wmh.vol.thcm << endl; + cout << "Number of bins: " << wmh.prj.Nbin << "\tbin size: " << wmh.prj.szcm << endl; + cout << "Number of angles: " << wmh.prj.Nang << "\tAngle increment: " << wmh.prj.incr << "\tFirst angle: " << wmh.prj.ang0 << endl; + cout << "Number of subsets: " << wmh.prj.NOS << endl; + if ( wmh.do_att ){ + cout << "Correction for atenuation: " << wmh.att_fn << "\t\tdo_msk_att: " << wmh.do_msk_att << endl; + cout << "Attenuation map: " << wmh.att_fn << endl; + } + cout << "Rotation radius: " << Rrad[0] << endl; + cout << "Minimum weight: " << wmh.min_w << endl; + + //... to sort angles into subsets ...................................... + + prj.order = new int [ prj.Nang ]; + index_calc( prj.order ); + + //... to fill ang structure ............................................ + + ang = new angle_type [ prj.Nang ]; + fill_ang( ang ); + + //... to fill high resolution discrete distribution functions .............. + + if ( !wmh.do_psf ){ + + //... trapezoid projection of a square voxel on a line ................. + + for ( int i = 0 ; i < prj.Nang ; i++ ){ + + ang[ i ].vxprj.val = new float [ ang[ i ].vxprj.lng ]; + ang[ i ].vxprj.acu = new float [ ang[ i ].vxprj.lng ]; + + calc_vxprj( &ang[ i ] ); + } + } + else{ + + //... Gaussian density and distribution functions ........................ + + gaussdens.lngd2 = (int)( wmh.maxsigm / wmh.psfres ); // half of the length of the gaussian density function (in resolution elements) + gaussdens.lng = gaussdens.lngd2 * 2; // length of the gaussian density function (in resolution elements). + gaussdens.res = wmh.psfres; + + gaussdens.val = new float [ gaussdens.lng+1 ]; // density function allocation + gaussdens.acu = new float [ gaussdens.lng ]; // distribution function allocation + calc_gauss( &gaussdens ); // to calculate N(0,1) density function and distribution function + } + + //... to read attenuation map .................................................. + + if ( wmh.do_att || wmh.do_msk_att ){ + shared_ptr > att_sptr( + read_from_file >(wmh.att_fn)); + if (!density_info_ptr->has_same_characteristics(*att_sptr)) + error("Currently the attenuation map and emission image must have the same dimension, orientation and voxel size"); + + attmap = new float [ vol.Nvox ]; + std::copy(att_sptr->begin_all(), att_sptr->end_all(),attmap); + for (int i = 0 ; i < wmh.vol.Nvox ; i++ ){ + if ((boost::math::isnan)(attmap [ i ])){ + attmap [ i ] = 0; + } + } + //read_att_map( attmap ); + } + else attmap = NULL; + + //... to generate mask.......................................................... + + if ( wmh.do_msk ) + { + msk_3d = new bool [ vol.Nvox ]; + msk_2d = new bool [ vol.Npix ]; + if (!wmh.do_msk_att && wmh.do_msk_file) + { + shared_ptr > mask_sptr( + read_from_file >(wmh.msk_fn)); + if (!density_info_ptr->has_same_characteristics(*mask_sptr)) + error("Currently the mask image and emission image must have the same dimension, orientation and voxel size"); + float * mask_from_file = new float [ vol.Nvox ]; + std::copy(mask_sptr->begin_all(), mask_sptr->end_all(),mask_from_file); + // call UB generate_msk pretending that this mask is an attenuation image + // we do this to avoid using its own read_msk_file + wmh.do_msk_file = false; + wmh.do_msk_att = true; + generate_msk( msk_3d, msk_2d, mask_from_file, &vol); + delete[] mask_from_file; + } + else + { + generate_msk( msk_3d, msk_2d, attmap, &vol); + } + } + else msk_2d = msk_3d = NULL; + + //... Initialization and memory allocation for the weight matrix ................... + + wm.NbOS = prj.NbOS; // number of rows in the weight matrix + wm.Nvox = vol.Nvox; // number of columnes in the weight matrix + + //... setting PSF maximum size (in bins) and memory allocation for PSF values ....... + + this->maxszb = max_psf_szb( ang ); // maximum PSF size (horizontal component of PSF) + NITEMS = new int * [prj.NOS]; + for (int kOS=0; kOSalready_setup= true; +} + +ProjMatrixByBinSPECTUB:: +~ProjMatrixByBinSPECTUB() +{ + delete_UB_SPECT_arrays(); +} + +void +ProjMatrixByBinSPECTUB:: +delete_UB_SPECT_arrays() +{ + //... freeing matrix memory.................................... + using namespace SPECTUB; + delete [] Rrad; + + if ( !wmh.do_psf ){ + for ( int i = 0 ; i < prj.Nang ; i++ ){ + delete [] ang[ i ].vxprj.val; + delete [] ang[ i ].vxprj.acu ; + } + } + + delete [] wm.val; + delete [] wm.col; + delete [] wm.ne; + + //... freeing memory ............................................. + + delete [] prj.order; + delete [] ang; + for (int kOS=0; kOS(wm.nz[ wm.col[ j ][ i ] ],wm.ny[ wm.col[ j ][ i ] ],wm.nx[ wm.col[ j ][ i ] ]), wm.val[ j ][ i ]); + lor.push_back( elem); + } + + delete [] wm.val[ j ]; + delete [] wm.col[ j ]; + + this->cache_proj_matrix_elems_for_one_bin(lor); + } + + info(boost::format("Total time after transfering to ProjMatrixElemsForOneBin. time %1% (s)") % timer.value()); + +} +void +ProjMatrixByBinSPECTUB:: +calculate_proj_matrix_elems_for_one_bin(ProjMatrixElemsForOneBin& lor + ) const +{ + //error("ProjMatrixByBinSPECTUB element not found in cache (and hence file)"); + + const int view_num=lor.get_bin().view_num(); + // find which "UB-subset" this view is in + int kOS=0; + for (kOS=0; kOSkeep_all_views_in_cache) + { + this->clear_cache(); + subset_already_processed.assign(prj.NOS,false); + } + info(boost::format("Computing matrix elements for view %1%") % view_num); + compute_one_subset(kOS); + subset_already_processed[kOS]=true; + } + lor.erase(); +} + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/ProjMatrixByBinUsingInterpolation.cxx b/src/recon_buildblock/ProjMatrixByBinUsingInterpolation.cxx new file mode 100644 index 0000000000..539ff79ab3 --- /dev/null +++ b/src/recon_buildblock/ProjMatrixByBinUsingInterpolation.cxx @@ -0,0 +1,466 @@ +// +// +/* + Copyright (C) 2004- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projection + + \brief non-inline implementations for stir::ProjMatrixByBinUsingInterpolation + + \author Kris Thielemans + +*/ + +#include "stir/recon_buildblock/ProjMatrixByBinUsingInterpolation.h" +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IndexRange.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Bin.h" +#include "stir/round.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include +#include + +START_NAMESPACE_STIR + +ProjMatrixByBinUsingInterpolation::JacobianForIntBP:: +JacobianForIntBP(const ProjDataInfoCylindrical* proj_data_info_ptr, bool exact) + + : R2(square(proj_data_info_ptr->get_ring_radius())), + ring_spacing2 (square(proj_data_info_ptr->get_ring_spacing())), + arccor(dynamic_cast(proj_data_info_ptr)!=0), + backprojection_normalisation + (proj_data_info_ptr->get_ring_spacing()/2/proj_data_info_ptr->get_num_views()), + use_exact_Jacobian_now(exact) +{ + assert(arccor || + dynamic_cast(proj_data_info_ptr)!=0); +} + +const char * const +ProjMatrixByBinUsingInterpolation::registered_name = + "Interpolation"; + +ProjMatrixByBinUsingInterpolation:: +ProjMatrixByBinUsingInterpolation() +{ + set_defaults(); +} + +void +ProjMatrixByBinUsingInterpolation::initialise_keymap() +{ + parser.add_start_key("Interpolation Matrix Parameters"); + parser.add_key("use_piecewise_linear_interpolation", &use_piecewise_linear_interpolation_now); + parser.add_key("use_exact_Jacobian",&use_exact_Jacobian_now); + ProjMatrixByBin::initialise_keymap(); + parser.add_key("do_symmetry_90degrees_min_phi", &do_symmetry_90degrees_min_phi); + parser.add_key("do_symmetry_180degrees_min_phi", &do_symmetry_180degrees_min_phi); + parser.add_key("do_symmetry_swap_segment", &do_symmetry_swap_segment); + parser.add_key("do_symmetry_swap_s", &do_symmetry_swap_s); + parser.add_key("do_symmetry_shift_z", &do_symmetry_shift_z); + parser.add_stop_key("End Interpolation Matrix Parameters"); +} + + +void +ProjMatrixByBinUsingInterpolation::set_defaults() +{ + ProjMatrixByBin::set_defaults(); + do_symmetry_90degrees_min_phi = true; + do_symmetry_180degrees_min_phi = true; + do_symmetry_swap_segment = true; + do_symmetry_swap_s = true; + do_symmetry_shift_z = true; + + use_piecewise_linear_interpolation_now = true; + use_exact_Jacobian_now = true; +} + + +bool +ProjMatrixByBinUsingInterpolation::post_processing() +{ + if (ProjMatrixByBin::post_processing() == true) + return true; + return false; +} + + +void +ProjMatrixByBinUsingInterpolation:: +set_up( + const shared_ptr& proj_data_info_ptr_v, + const shared_ptr >& density_info_ptr // TODO should be Info only + ) +{ + proj_data_info_ptr= proj_data_info_ptr_v; + + const VoxelsOnCartesianGrid * image_info_ptr = + dynamic_cast*> (density_info_ptr.get()); + + if (image_info_ptr == NULL) + error("ProjMatrixByBinUsingInterpolation initialised with a wrong type of DiscretisedDensity\n"); + + densel_range = image_info_ptr->get_index_range(); + voxel_size = image_info_ptr->get_voxel_size(); + origin = image_info_ptr->get_origin(); + const float z_to_middle = + (densel_range.get_max_index() + densel_range.get_min_index())*voxel_size.z()/2.F; + origin.z() -= z_to_middle; + + symmetries_ptr.reset( + new DataSymmetriesForBins_PET_CartesianGrid(proj_data_info_ptr, + density_info_ptr, + do_symmetry_90degrees_min_phi, + do_symmetry_180degrees_min_phi, + do_symmetry_swap_segment, + do_symmetry_swap_s, + do_symmetry_shift_z)); + + if (dynamic_cast(proj_data_info_ptr.get())==0) + error("ProjMatrixByBinUsingInterpolation needs ProjDataInfoCylindrical for jacobian\n"); + jacobian = JacobianForIntBP(&(proj_data_info_cyl()), use_exact_Jacobian_now); + + // TODO assumes that all segments have span or not + { + const float relative_vox_sampling = + voxel_size.z() / + proj_data_info_ptr->get_sampling_in_m(Bin(0,0,0,0)); + if (use_piecewise_linear_interpolation_now) + { + if (fabs(relative_vox_sampling-.5)<.01) + warning("Using piecewise-linear interpolation\n"); + else + { + warning("Switching OFF piecewise-linear interpolation\n"); + use_piecewise_linear_interpolation_now = false; + if (fabs(relative_vox_sampling-1)>.01) + warning("because non-standard voxel size.\n"); + } + } + } +} +// point should be w.r.t. middle of the scanner! +static inline +void +find_s_m_of_voxel(float& s, float& m, + const CartesianCoordinate3D& point, + const float cphi, const float sphi, + const float tantheta) +{ + s = (point.x()*cphi+point.y()*sphi); + + m = + point.z()- tantheta*(-point.x()*sphi+point.y()*cphi); +} + + +/* + +interpolationkernel[s,a,b] b == interpolationkernel[s,b,a] a +normalised such that its integral == a + +interpolationkernel[s_,ssize_,xsize_] \ +:=If[Abs[s](ssize+xsize)/2,0,(-Abs[s]+(ssize+xsize)/2)/xsize]] +*/ +// piecewise_linear interpolation for bin between -1 and 1 +// vox +static inline +float +piecewise_linear_interpolate(const float s, const float vox_size) +{ + if (fabs(s)(2+vox_size)/2) + return 0; + else + return (-fabs(s)+(2+vox_size)/2)/vox_size; +} + +// linear interpolation between -1 and 1 +static inline +float +linear_interpolate(const float t) +{ + const float abst = fabs(t); + if (abst>=1) + return 0; + else + return 1-abst; +} + +static inline +float +interpolate_tang_pos(const float tang_pos_diff) +{ + return linear_interpolate(tang_pos_diff); +} + + +float +ProjMatrixByBinUsingInterpolation:: +get_element(const Bin& bin, + const CartesianCoordinate3D& densel_ctr) const +{ + const float phi = proj_data_info_ptr->get_phi(bin); + const float cphi = cos(phi); + const float sphi = sin(phi); + const float tantheta = proj_data_info_ptr->get_tantheta(bin); + + float s_densel, m_densel; + find_s_m_of_voxel(s_densel, m_densel, + densel_ctr, + cphi, sphi, + tantheta); + const float s_diff = + s_densel - proj_data_info_ptr->get_s(bin); + + const float m_diff = + m_densel - + proj_data_info_ptr->get_m(bin); + +#if 0 + // alternative way to get m_diff using other code + // should give the same, but doesn't. + // for test case if scanner with 3 rings, span=1, + // there is a difference of delta/2*proj_data_info_ptr->get_sampling_in_m(bin) + // TODO why? + + // find correspondence between ax_pos coordinates and image coordinates: + // z = num_planes_per_axial_pos * ring + axial_pos_to_z_offset + const DataSymmetriesForBins_PET_CartesianGrid& symmetries = + static_cast( + *symmetries_ptr); + assert(fabs(proj_data_info_ptr->get_sampling_in_m(bin) - + voxel_size.z() * + symmetries.get_num_planes_per_axial_pos(bin.segment_num())) + < 1.E-3); + const float axial_pos_to_z_offset = + symmetries.get_axial_pos_to_z_offset(bin.segment_num()); + const float axial_pos_to_z_offset_in_mm = + axial_pos_to_z_offset * voxel_size.z(); + + // note: origin.z() used because already in DataSymmetries + const float other_m_diff = + m - origin.z() - axial_pos_to_z_offset_in_mm + - bin.axial_pos_num()*proj_data_info_ptr->get_sampling_in_m(bin); + assert(fabs(m_diff - other_m_diff) + < .001*proj_data_info_ptr->get_sampling_in_m(bin)); +#endif + + const float s_max = + std::max(cphi>sphi? voxel_size.x() : voxel_size.y(), + proj_data_info_ptr->get_sampling_in_s(bin)); + float result = interpolate_tang_pos(s_diff/s_max); + if (result==0) + return 0; + const float m_max = + std::max(voxel_size.z(), + proj_data_info_ptr->get_sampling_in_m(bin)); + + result *= + (use_piecewise_linear_interpolation_now? + piecewise_linear_interpolate(m_diff/m_max, + std::min(voxel_size.z(), + proj_data_info_ptr->get_sampling_in_m(bin)) + /m_max) + : + linear_interpolate(m_diff/m_max) + ); + + if (result==0) + return 0; + + return + result * + jacobian(proj_data_info_cyl().get_average_ring_difference(bin.segment_num()), + proj_data_info_ptr->get_s(bin)); +} + + +void +ProjMatrixByBinUsingInterpolation:: +calculate_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + const Bin& bin = lor.get_bin(); + assert(bin.segment_num() >= proj_data_info_ptr->get_min_segment_num()); + assert(bin.segment_num() <= proj_data_info_ptr->get_max_segment_num()); + + assert(lor.size() == 0); + + /* TODO + there is a terrible problem with symmetries. + We should not include densels that will be brought OUT-of-range + using symmetries, unless it's checked (and we currently check only + on the z-coordinate. + However, we should include densels that will be brought IN-the-range + using symmetries. Even if we use only basic_bins here. + + The last problem is illustrated by using axial_pos_num=0, which + is usually at the edge of the image. So, we have to include voxels + with negative z... + + Horrible. + */ + BasicCoordinate<3,int> c; + int min1; + int max1; + // find z-range (this would depend on origin and the symmetries though) + { +#if 0 + /* attempt to take a large range of essentially 3 times the z-range of the image. + This does not work though. It's easy to come up with cases where this + range is still too small. Probably we would have to use the + scanner length or so and take the image-origin into account. + It's not easy though as illustrated by the following example: + + 2 rings, span=1, z-voxel_size=ring_distance/2, 3 image-planes, segment 0 + and image-origin shifted over 3 planes. + The problem comes when using the swap_*_zq symmetries (which occurs + even if shift_z=false). + */ + min1=densel_range.get_min_index(); + max1=densel_range.get_max_index(); + int length = max-min1+1; + min1 -= length; + max1 += length; +#else + /* Here we use geometric info. However, the code below only works + for DiscretisedDensityOnCartesianGrid (with a regular_range) + */ + min1=densel_range.get_min_index(); + // find radius of cylinder around all of the image + const float max_radius = + std::max( + std::max(-densel_range[min1].get_min_index(), + densel_range[min1].get_max_index() + )*voxel_size[2], + std::max(-densel_range[min1][0].get_min_index(), + densel_range[min1][0].get_max_index() + )*voxel_size[1] + ); + // find width of the 'tube of response' + const float z_width_of_TOR = + proj_data_info_ptr->get_sampling_in_m(bin); + // now find where tube enters/leaves image + // we use a safety margin here as we could probably use z_width_of_LOR/2 + const float z_middle_LOR = + proj_data_info_ptr->get_m(bin) - origin.z(); + const float min_z_LOR = + z_middle_LOR - + fabs(proj_data_info_ptr->get_tantheta(bin))*max_radius - + z_width_of_TOR; + const float max_z_LOR = + z_middle_LOR + + fabs(proj_data_info_ptr->get_tantheta(bin))*max_radius + + z_width_of_TOR; + + min1 = round(floor(min_z_LOR/voxel_size[1])); + max1 = round(ceil(max_z_LOR/voxel_size[1])); +#endif + } + /* we loop over all coordinates, but for optimisation do the following: + In each dimension, we ASSUME that the non-zero range is CONNECTED. + So, we keep track if a non-zero element was found and break + out of the loop if we find a 0 after finding a non-zero. + */ + bool found_nonzero1=false, found_nonzero2, found_nonzero3; + for (c[1]=min1; c[1]<=max1; ++c[1]) + { + // note: because c1 can be outside the allowed range, we have + // in principle trouble getting the min_index() for c[2]. + // We'll assume that it is the same as for a(ny) c[1] within the range. + // That's of course ok for VoxelsOnCartesianGrid + const IndexRange<2>& range2d = + densel_range[std::min(std::max(c[1],densel_range.get_min_index()), + densel_range.get_max_index())]; + +#if 0 + const int min2=range2d.get_min_index(); + const int max2=range2d.get_max_index(); +#else + // TODO ugly stuff to avoid having symmetries obtaining voxels + // which are outside the FOV + // this will break when non-zero origin.y() or x() + // (but then there would be no relevant symmetries I guess) + assert(origin.y()==0); + assert(origin.x()==0); + const int first_min2=range2d.get_min_index(); + const int first_max2=range2d.get_max_index(); + const int min2 = std::max(first_min2, -first_max2); + const int max2 = std::min(-first_min2, first_max2); +#endif + found_nonzero2=false; + for (c[2]=min2; c[2]<=max2; ++c[2]) + { +#if 0 + const int min3=range2d[c[2]].get_min_index(); + const int max3=range2d[c[2]].get_max_index(); +#else + // TODO ugly stuff to avoid having symmetries obtaining voxels + // which are outside the FOV + // this will break when non-zero origin.y() or x() + const int first_min3=range2d[c[2]].get_min_index(); + const int first_max3=range2d[c[2]].get_max_index(); + const int min3 = std::max(first_min3, -first_max3); + const int max3 = std::min(-first_min3, first_max3); +#endif + found_nonzero3 = false; + for (c[3]=min3; c[3]<=max3; ++c[3]) + { + // TODO call a virtual function of DiscretisedDensity? + const CartesianCoordinate3D coords = + CartesianCoordinate3D(c[1]*voxel_size[1], + c[2]*voxel_size[2], + c[3]*voxel_size[3]) + +origin; + const float element_value = + get_element(bin, coords); + if (element_value>0) + { + found_nonzero3=true; + lor.push_back(ProjMatrixElemsForOneBin::value_type(c, element_value)); + } +#ifndef __PMByBinElement_SLOW__ + else if (found_nonzero3) + break; +#endif + } + if (found_nonzero3) + found_nonzero2=true; +#ifndef __PMByBinElement_SLOW__ + else if (found_nonzero2) + break; +#endif + } + if (found_nonzero2) + found_nonzero1=true; +#ifndef __PMByBinElement_SLOW__ + else if (found_nonzero1) + break; +#endif + } +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjMatrixByBinUsingRayTracing.cxx b/src/recon_buildblock/ProjMatrixByBinUsingRayTracing.cxx new file mode 100644 index 0000000000..6d6a625314 --- /dev/null +++ b/src/recon_buildblock/ProjMatrixByBinUsingRayTracing.cxx @@ -0,0 +1,940 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2011, Hammersmith Imanet Ltd + Copyright (C) 2013-2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projection + + \brief non-inline implementations for stir::ProjMatrixByBinUsingRayTracing + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project +*/ + +/* History + + KT + added registry things + KT 21/02/2002 + added option for square FOV + KT 15/05/2002 + added possibility of multiple LORs in tangential direction + call ProjMatrixByBin's new parsing functions + KT 28/06/02 + added option to take actual detector boundaries into account + KT 25/09/03 + allow disabling more symmetries + allow smaller z- voxel sizes (but z-sampling in the projdata still has to + be an integer multiple of the z-voxel size). + + */ + +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#include "stir/recon_buildblock/DataSymmetriesForBins_PET_CartesianGrid.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ProjDataInfo.h" +#include "stir/recon_buildblock/RayTraceVoxelsOnCartesianGrid.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/round.h" +#include "stir/modulo.h" +#include "stir/stream.h" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACE +using std::min; +using std::max; +#endif +START_NAMESPACE_STIR + + +const char * const +ProjMatrixByBinUsingRayTracing::registered_name = + "Ray Tracing"; + +ProjMatrixByBinUsingRayTracing:: +ProjMatrixByBinUsingRayTracing() +{ + set_defaults(); +} +//******************** parsing ************* + +void +ProjMatrixByBinUsingRayTracing::initialise_keymap() +{ + ProjMatrixByBin::initialise_keymap(); + parser.add_start_key("Ray Tracing Matrix Parameters"); + parser.add_key("restrict to cylindrical FOV", &restrict_to_cylindrical_FOV); + parser.add_key("number of rays in tangential direction to trace for each bin", + &num_tangential_LORs); + parser.add_key("use actual detector boundaries", &use_actual_detector_boundaries); + parser.add_key("do_symmetry_90degrees_min_phi", &do_symmetry_90degrees_min_phi); + parser.add_key("do_symmetry_180degrees_min_phi", &do_symmetry_180degrees_min_phi); + parser.add_key("do_symmetry_swap_segment", &do_symmetry_swap_segment); + parser.add_key("do_symmetry_swap_s", &do_symmetry_swap_s); + parser.add_key("do_symmetry_shift_z", &do_symmetry_shift_z); + parser.add_stop_key("End Ray Tracing Matrix Parameters"); +} + + +void +ProjMatrixByBinUsingRayTracing::set_defaults() +{ + ProjMatrixByBin::set_defaults(); + this->restrict_to_cylindrical_FOV = true; + this->num_tangential_LORs = 1; + this->use_actual_detector_boundaries = false; + this->do_symmetry_90degrees_min_phi = true; + this->do_symmetry_180degrees_min_phi = true; + this->do_symmetry_swap_segment = true; + this->do_symmetry_swap_s = true; + this->do_symmetry_shift_z = true; + this->already_setup = false; +} + + +bool +ProjMatrixByBinUsingRayTracing::post_processing() +{ + if (ProjMatrixByBin::post_processing() == true) + return true; + if (this->num_tangential_LORs<1) + { + warning(boost::format("ProjMatrixByBinUsingRayTracing: num_tangential_LORs should be at least 1, but is %d") + % this->num_tangential_LORs); + return true; + } + this->already_setup = false; + return false; +} + +//******************** get/set pairs ************* + +bool +ProjMatrixByBinUsingRayTracing:: +get_restrict_to_cylindrical_FOV() const +{ + return this->restrict_to_cylindrical_FOV; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_restrict_to_cylindrical_FOV(bool val) +{ + this->already_setup = (this->restrict_to_cylindrical_FOV == val); + this->restrict_to_cylindrical_FOV = val; +} + +int +ProjMatrixByBinUsingRayTracing:: +get_num_tangential_LORs() const +{ + return this->num_tangential_LORs; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_num_tangential_LORs(int val) +{ + this->already_setup = (this->num_tangential_LORs == val); + this->num_tangential_LORs = val; +} + +bool +ProjMatrixByBinUsingRayTracing:: +get_use_actual_detector_boundaries() const +{ + return this->use_actual_detector_boundaries; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_use_actual_detector_boundaries(bool val) +{ + this->already_setup = (this->use_actual_detector_boundaries == val); + this->use_actual_detector_boundaries = val; +} + +bool +ProjMatrixByBinUsingRayTracing:: +get_do_symmetry_90degrees_min_phi() const +{ + return this->do_symmetry_90degrees_min_phi; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_do_symmetry_90degrees_min_phi(bool val) +{ + this->already_setup = (this->do_symmetry_90degrees_min_phi == val); + this->do_symmetry_90degrees_min_phi = val; +} + + +bool +ProjMatrixByBinUsingRayTracing:: +get_do_symmetry_180degrees_min_phi() const +{ + return this->do_symmetry_180degrees_min_phi; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_do_symmetry_180degrees_min_phi(bool val) +{ + this->already_setup = (this->do_symmetry_180degrees_min_phi == val); + this->do_symmetry_180degrees_min_phi = val; +} + + +bool +ProjMatrixByBinUsingRayTracing:: +get_do_symmetry_swap_segment() const +{ + return this->do_symmetry_swap_segment; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_do_symmetry_swap_segment(bool val) +{ + this->already_setup = (this->do_symmetry_swap_segment == val); + this->do_symmetry_swap_segment = val; +} + + +bool +ProjMatrixByBinUsingRayTracing:: +get_do_symmetry_swap_s() const +{ + return this->do_symmetry_swap_s; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_do_symmetry_swap_s(bool val) +{ + this->already_setup = (this->do_symmetry_swap_s == val); + this->do_symmetry_swap_s = val; +} + + +bool +ProjMatrixByBinUsingRayTracing:: +get_do_symmetry_shift_z() const +{ + return this->do_symmetry_shift_z; +} + +void +ProjMatrixByBinUsingRayTracing:: +set_do_symmetry_shift_z(bool val) +{ + this->already_setup = (this->do_symmetry_shift_z == val); + this->do_symmetry_shift_z = val; +} + + +//******************** actual implementation ************* + +#if 0 +// static helper function +// check if a is an integer multiple of b +static bool is_multiple(const float a, const float b) +{ + return fabs(fmod(static_cast(a), static_cast(b))) > 1E-5; +} +#endif + +void +ProjMatrixByBinUsingRayTracing:: +set_up( + const shared_ptr& proj_data_info_ptr_v, + const shared_ptr >& density_info_ptr // TODO should be Info only + ) +{ + proj_data_info_ptr= proj_data_info_ptr_v; + const VoxelsOnCartesianGrid * image_info_ptr = + dynamic_cast*> (density_info_ptr.get()); + + if (image_info_ptr == NULL) + error("ProjMatrixByBinUsingRayTracing initialised with a wrong type of DiscretisedDensity\n"); + + voxel_size = image_info_ptr->get_voxel_size(); + origin = image_info_ptr->get_origin(); + image_info_ptr->get_regular_range(min_index, max_index); + + symmetries_ptr.reset( + new DataSymmetriesForBins_PET_CartesianGrid(proj_data_info_ptr, + density_info_ptr, + do_symmetry_90degrees_min_phi, + do_symmetry_180degrees_min_phi, + do_symmetry_swap_segment, + do_symmetry_swap_s, + do_symmetry_shift_z)); + const float sampling_distance_of_adjacent_LORs_xy = + proj_data_info_ptr->get_sampling_in_s(Bin(0,0,0,0)); + + if(sampling_distance_of_adjacent_LORs_xy/num_tangential_LORs > voxel_size.x() + 1.E-3 || + sampling_distance_of_adjacent_LORs_xy/num_tangential_LORs > voxel_size.y() + 1.E-3) + warning("WARNING: ProjMatrixByBinUsingRayTracing used for pixel size (in x,y) " + "that is smaller than the bin size divided by num_tangential_LORs.\n" + "This matrix will completely miss some voxels for some (or all) views.\n"); + if(sampling_distance_of_adjacent_LORs_xy < voxel_size.x() - 1.E-3 || + sampling_distance_of_adjacent_LORs_xy < voxel_size.y() - 1.E-3) + warning("WARNING: ProjMatrixByBinUsingRayTracing used for pixel size (in x,y) " + "that is larger than the bin size.\n" + "Backprojecting with this matrix might have artefacts at views 0 and 90 degrees.\n"); + + if (use_actual_detector_boundaries) + { + const ProjDataInfoCylindricalNoArcCorr * proj_data_info_cyl_ptr = + dynamic_cast(proj_data_info_ptr.get()); + if (proj_data_info_cyl_ptr== 0) + { + warning("ProjMatrixByBinUsingRayTracing: use_actual_detector_boundaries" + " is reset to false as the projection data should be non-arccorected.\n"); + use_actual_detector_boundaries = false; + } + else + { + bool nocompression = + proj_data_info_cyl_ptr->get_view_mashing_factor()==1; + for (int segment_num=proj_data_info_cyl_ptr->get_min_segment_num(); + nocompression && segment_num <= proj_data_info_cyl_ptr->get_max_segment_num(); + ++segment_num) + nocompression= + proj_data_info_cyl_ptr->get_min_ring_difference(segment_num) == + proj_data_info_cyl_ptr->get_max_ring_difference(segment_num); + + if (!nocompression) + { + warning("ProjMatrixByBinUsingRayTracing: use_actual_detector_boundaries" + " is reset to false as the projection data as either mashed or uses axial compression\n"); + use_actual_detector_boundaries = false; + } + } + + if (use_actual_detector_boundaries) + warning("ProjMatrixByBinUsingRayTracing: use_actual_detector_boundaries==true\n"); + + } + +#if 0 + // test if our 2D code does not have problems + { + // currently 2D code relies on the LOR falling in the middle of a voxel (in z-direction) + const float z_shift = - origin.z()/voxel_size.z() + +(max_index.z()+min_index.z())/2.F; + if (fabs(z_shift - round(z_shift)) > .01) + error("ProjMatrixByBinUsingRayTracing can currently not handle this image.\n" + "Make sure you either have \n" + "- an odd number of planes and z_origin=n* z_voxel_size\n" + "- or an even number of planes and z_origin=(n+1/2)*z_voxel_size\n" + "(for some integer n).\n"); + } +#endif + + + this->already_setup = true; + this->clear_cache(); +}; + +/* this is used when + (tantheta==0 && sampling_distance_of_adjacent_LORs_z==2*voxel_size.z()) + it adds two adjacents z with their half value + */ +static void +add_adjacent_z(ProjMatrixElemsForOneBin& lor, + const float z_of_first_voxel, + const float right_edge_of_TOR); + +#if 0 +/* Complicated business to add the same values at z+1 + while taking care that the (x,y,z) coordinates remain unique in the LOR. + (If you copy the LOR somewhere else, you can simply use + ProjMatrixElemsForOneBin::merge()) +*/ +static void merge_zplus1(ProjMatrixElemsForOneBin& lor); +#endif + +template +static inline int sign(const T& t) +{ + return t<0 ? -1 : 1; +} + +// just do 1 LOR, returns true if lor is not empty +static void +ray_trace_one_lor(ProjMatrixElemsForOneBin& lor, + const float s_in_mm, const float t_in_mm, + const float cphi, const float sphi, + const float costheta, const float tantheta, + const float offset_in_z, + const float fovrad_in_mm, + const CartesianCoordinate3D& voxel_size, + const bool restrict_to_cylindrical_FOV, + const int num_LORs) +{ + assert(lor.size() == 0); + + /* Find Intersection points of LOR and image FOV (assuming infinitely long scanner)*/ + /* (in voxel units) */ + CartesianCoordinate3D start_point; + CartesianCoordinate3D stop_point; + { + /* parametrisation of LOR is + X= s*cphi + a*sphi, + Y= s*sphi - a*cphi, + Z= t/costheta+offset_in_z - a*tantheta + find now min_a, max_a such that end-points intersect border of FOV + */ + float max_a; + float min_a; + + if (restrict_to_cylindrical_FOV) + { +#ifdef STIR_PMRT_LARGER_FOV + if (fabs(s_in_mm) >= fovrad_in_mm) return; +#else + if (fabs(s_in_mm) > fovrad_in_mm) return; +#endif + // a has to be such that X^2+Y^2 == fovrad^2 + if (fabs(s_in_mm) == fovrad_in_mm) + { + max_a = min_a = 0; + } + else + { + max_a = sqrt(square(fovrad_in_mm) - square(s_in_mm)); + min_a = -max_a; + } + } // restrict_to_cylindrical_FOV + else + { + // use FOV which is square. + // note that we use square and not rectangular as otherwise symmetries + // would take us out of the FOV. TODO + /* + a has to be such that + |X| <= fovrad_in_mm && |Y| <= fovrad_in_mm + */ + if (fabs(cphi) < 1.E-3 || fabs(sphi) < 1.E-3) + { + if (fovrad_in_mm < fabs(s_in_mm)) + return; + max_a = fovrad_in_mm; + min_a = -fovrad_in_mm; + } + else + { + max_a = min((fovrad_in_mm*sign(sphi) - s_in_mm*cphi)/sphi, + (fovrad_in_mm*sign(cphi) + s_in_mm*sphi)/cphi); + min_a = max((-fovrad_in_mm*sign(sphi) - s_in_mm*cphi)/sphi, + (-fovrad_in_mm*sign(cphi) + s_in_mm*sphi)/cphi); + if (min_a > max_a - 1.E-3*voxel_size.x()) + return; + } + + } //!restrict_to_cylindrical_FOV + + start_point.x() = (s_in_mm*cphi + max_a*sphi)/voxel_size.x(); + start_point.y() = (s_in_mm*sphi - max_a*cphi)/voxel_size.y(); + start_point.z() = (t_in_mm/costheta+offset_in_z - max_a*tantheta)/voxel_size.z(); + stop_point.x() = (s_in_mm*cphi + min_a*sphi)/voxel_size.x(); + stop_point.y() = (s_in_mm*sphi - min_a*cphi)/voxel_size.y(); + stop_point.z() = (t_in_mm/costheta+offset_in_z - min_a*tantheta)/voxel_size.z(); + +#if 0 + // KT 18/05/2005 this is no longer necessary + + // check we're not exactly at the border of 2 planes in the 2D case + if (tantheta==0) + { + assert(stop_point.z()==start_point.z()); + if (fabs(modulo(stop_point.z(),1.F)-.5)<.001) + error("ProjMatrixByBinUsingRayTracing: ray tracing at the border between two z-planes\n"); + } + if (cphi==0) + { + assert(stop_point.y()==start_point.y()); + if (fabs(modulo(stop_point.y(),1.F)-.5)<.001) + error("ProjMatrixByBinUsingRayTracing: ray tracing at the border between two y-planes\n"); + } + if (sphi==0) + { + assert(stop_point.x()==start_point.x()); + if (fabs(modulo(stop_point.x(),1.F)-.5)<.001) + error("ProjMatrixByBinUsingRayTracing: ray tracing at the border between two y-planes\n"); + } +#endif + + // find out in which direction we should do the ray tracing to obtain a sorted lor + // we want to go from small z to large z, + // or if z are equal, from small y to large y and so on + const bool from_start_to_stop = + start_point.z() < stop_point.z() || + (start_point.z() == stop_point.z() && + (start_point.y() < stop_point.y() || + (start_point.y() == stop_point.y() && + (start_point.x() <= stop_point.x())))); + + // do actual ray tracing for this LOR + + RayTraceVoxelsOnCartesianGrid(lor, + from_start_to_stop? start_point : stop_point, + !from_start_to_stop? start_point : stop_point, + voxel_size, +#ifdef NEWSCALE + 1.F/num_LORs // normalise to mm +#else + 1/voxel_size.x()/num_LORs // normalise to some kind of 'pixel units' +#endif + ); + +#ifndef NDEBUG + { + // TODO output is still not sorted... why? + + //ProjMatrixElemsForOneBin sorted_lor = lor; + //sorted_lor.sort(); + //assert(lor == sorted_lor); + lor.check_state(); + } +#endif + return; + } + +} +////////////////////////////////////// +void +ProjMatrixByBinUsingRayTracing:: +calculate_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + if (!this->already_setup) + { + error("ProjMatrixByBinUsingRayTracing used before calling setup"); + } + + const Bin bin = lor.get_bin(); + assert(bin.segment_num() >= proj_data_info_ptr->get_min_segment_num()); + assert(bin.segment_num() <= proj_data_info_ptr->get_max_segment_num()); + + assert(lor.size() == 0); + + float phi; + float s_in_mm = proj_data_info_ptr->get_s(bin); + /* Implementation note. + KT initialised s_in_mm above instead of in the if because this meant + that gcc 3.0.1 generated identical results to the previous version of this file. + Otherwise, some pixels at the boundary appear to be treated differently + (probably due to different floating point rounding errors), at least + on Linux on x86. + A bit of a mistery that. + + TODO this is maybe solved now by having more decent handling of + start and end voxels. + */ + if (!use_actual_detector_boundaries) + { + phi = proj_data_info_ptr->get_phi(bin); + //s_in_mm = proj_data_info_ptr->get_s(bin); + } + else + { + // can be static_cast later on + const ProjDataInfoCylindricalNoArcCorr& proj_data_info_noarccor = + dynamic_cast(*proj_data_info_ptr); + // TODO check on 180 degrees for views + const int num_detectors = + proj_data_info_ptr->get_scanner_ptr()->get_num_detectors_per_ring(); + const float ring_radius = + proj_data_info_ptr->get_scanner_ptr()->get_effective_ring_radius(); + + int det_num1=0, det_num2=0; + proj_data_info_noarccor. + get_det_num_pair_for_view_tangential_pos_num(det_num1, + det_num2, + bin.view_num(), + bin.tangential_pos_num()); + phi = static_cast((det_num1+det_num2)*_PI/num_detectors-_PI/2); + const float old_phi=proj_data_info_ptr->get_phi(bin); + if (fabs(phi-old_phi)>2*_PI/num_detectors) + warning("view %d old_phi %g new_phi %g\n",bin.view_num(), old_phi, phi); + + s_in_mm = static_cast(ring_radius*sin((det_num1-det_num2)*_PI/num_detectors+_PI/2)); + const float old_s_in_mm=proj_data_info_ptr->get_s(bin); + if (fabs(s_in_mm-old_s_in_mm)>proj_data_info_ptr->get_sampling_in_s(bin)*.0001) + warning("tangential_pos_num %d old_s_in_mm %g new_s_in_mm %g\n",bin.tangential_pos_num(), old_s_in_mm, s_in_mm); + + } + + const float cphi = cos(phi); + const float sphi = sin(phi); + + const float tantheta = proj_data_info_ptr->get_tantheta(bin); + const float costheta = 1/sqrt(1+square(tantheta)); + const float t_in_mm = proj_data_info_ptr->get_t(bin); + + const float sampling_distance_of_adjacent_LORs_z = + proj_data_info_ptr->get_sampling_in_t(bin)/costheta; + + + // find number of LORs we have to take, such that we don't miss voxels + // we have to subtract a tiny amount from the quotient, to avoid having too many LORs + // solely due to numerical rounding errors + const int num_lors_per_axial_pos = + static_cast(ceil(sampling_distance_of_adjacent_LORs_z / voxel_size.z() - 1.E-3)); + + assert(num_lors_per_axial_pos>0); + // theta=0 assumes that centre of 1 voxel coincides with centre of bin. + // TODO test + //if (num_lors_per_axial_pos>1 && tantheta==0 num_lors_per_axial_pos%2==0); + + // merging code assumes integer multiple + assert(fabs(sampling_distance_of_adjacent_LORs_z/voxel_size.z() + - num_lors_per_axial_pos) <= 1E-4); + + + // find offset in z, taking into account if there are 1 or more LORs + // KT 20/06/2001 take origin.z() into account + // KT 15/05/2002 move +(max_index.z()+min_index.z())/2.F offset here instead of in formulas for Z1f,Z2f + /* Here is how we find the offset of the first ray: + for only 1 ray, it is simply found by refering to the middle of the image + minus the origin.z(). + For multiple rays, the following reasoning is followed. + + First we look at oblique rays. + All rays should be the same distance from eachother, which is + dz = sampling_distance_of_adjacent_LORs_z/num_lors_per_axial_pos. + Then you have to make sure that the middle of the set of rays for this + bin corresponds to the middle of the TOR, i.e. the offset given above for 1 ray. + So, we put the rays from + -dz*(num_lors_per_axial_pos-1)/2 + to + +dz*(num_lors_per_axial_pos-1)/2 + + Now we look at direct rays (tantheta=0).We have to choose rays which + do not go exactly on the edge of 2 planes as this would give unreliable + results due to rounding errors. + In addition, we can give a weight to the rays according to how much the + voxel overlaps with the TOR (in axial direction). + Note that RayTracing* now sorts this out itself, so we could dispense with this + complication here. However, we can do it slightly more efficient here as + we might be using 2 rays for one ring. + */ + const float z_position_of_first_LOR_wrt_centre_of_TOR = + (-sampling_distance_of_adjacent_LORs_z/(2*num_lors_per_axial_pos)* + (num_lors_per_axial_pos-1)) + - origin.z(); + float offset_in_z = + z_position_of_first_LOR_wrt_centre_of_TOR + +(max_index.z()+min_index.z())/2.F * voxel_size.z(); + + if (tantheta==0) + { + // make sure we don't ray-trace exactly between 2 planes + // z-coordinate (in voxel units) will be + // (t_in_mm+offset_in_z)/voxel_size.z(); + // if so, we ray trace first to the voxels at smaller z, but will add the + // other plane later (in add_adjacent_z) + if (fabs(modulo((t_in_mm+offset_in_z)/voxel_size.z(),1.F)-.5)<.001) + offset_in_z -= .1F*voxel_size.z(); + } + + + // use FOV which is slightly 'inside' the image to avoid + // index out of range +#ifdef STIR_PMRT_LARGER_FOV + const float fovrad_in_mm = + min((min(max_index.x(), -min_index.x())+.45F)*voxel_size.x(), + (min(max_index.y(), -min_index.y())+.45F)*voxel_size.y()); +#else + const float fovrad_in_mm = + min((min(max_index.x(), -min_index.x()))*voxel_size.x(), + (min(max_index.y(), -min_index.y()))*voxel_size.y()); +#endif + + if (num_tangential_LORs == 1) + { + ray_trace_one_lor(lor, s_in_mm, t_in_mm, + cphi, sphi, costheta, tantheta, + offset_in_z, fovrad_in_mm, + voxel_size, + restrict_to_cylindrical_FOV, + num_lors_per_axial_pos); + } + else + { + ProjMatrixElemsForOneBin ray_traced_lor; + + // get_sampling_in_s returns sampling in interleaved case + // interleaved case has a sampling which is twice as high + const float s_inc = + (!use_actual_detector_boundaries ? 1 : 2) * + proj_data_info_ptr->get_sampling_in_s(bin)/num_tangential_LORs; + float current_s_in_mm = + s_in_mm - s_inc*(num_tangential_LORs-1)/2.F; + for (int s_LOR_num=1; s_LOR_num<=num_tangential_LORs; ++s_LOR_num, current_s_in_mm+=s_inc) + { + ray_traced_lor.erase(); + ray_trace_one_lor(ray_traced_lor, current_s_in_mm, t_in_mm, + cphi, sphi, costheta, tantheta, + offset_in_z, fovrad_in_mm, + voxel_size, + restrict_to_cylindrical_FOV, + num_lors_per_axial_pos*num_tangential_LORs); + //std::cerr << "ray traced size " << ray_traced_lor.size() << std::endl; + lor.merge(ray_traced_lor); + } + } + + // now add on other LORs in axial direction + if (lor.size()>0) + { + if (tantheta==0 ) + { + const float z_of_first_voxel= + lor.begin()->coord1() + + origin.z()/voxel_size.z() - + (max_index.z() + min_index.z())/2.F; + const float left_edge_of_TOR = + (t_in_mm - sampling_distance_of_adjacent_LORs_z/2 + )/voxel_size.z(); + const float right_edge_of_TOR = + (t_in_mm + sampling_distance_of_adjacent_LORs_z/2 + )/voxel_size.z(); + + add_adjacent_z(lor, z_of_first_voxel - left_edge_of_TOR, right_edge_of_TOR -left_edge_of_TOR); + } + else if (num_lors_per_axial_pos>1) + { +#if 0 + if (num_lors_per_axial_pos==2) + { + merge_zplus1(lor); + } + else +#endif + { + // make copy of LOR that will be used to add adjacent z + ProjMatrixElemsForOneBin lor_with_next_z = lor; + // reserve enough memory to avoid reallocations + lor.reserve(lor.size()*num_lors_per_axial_pos); + // now add adjacent z + for (int z_index=1; z_index(element_ptr->coord1()+1, + element_ptr->coord2(), + element_ptr->coord3()), + element_ptr->get_value()); + ++element_ptr; + } + // now merge it into the original + lor.merge(lor_with_next_z); + } + } + } // if( tantheta!=0 && num_lors_per_axial_pos>1) + } //if (lor.size()!=0) + +} + +static void +add_adjacent_z(ProjMatrixElemsForOneBin& lor, + const float z_of_first_voxel, + const float right_edge_of_TOR) +{ + assert(lor.size()>0); + assert(z_of_first_voxel+.5>=0); + assert(z_of_first_voxel-.5<=right_edge_of_TOR); + // first reserve enough memory for the whole vector + // this speeds things up. + const int num_overlapping_voxels = + round(ceil(right_edge_of_TOR-z_of_first_voxel+.5)); + lor.reserve(lor.size() * num_overlapping_voxels); + + // point to end of original LOR, i.e. first plane + // const ProjMatrixElemsForOneBin::const_iterator element_end = lor.end(); + const std::size_t org_size = lor.size(); + + for (int z_index= 1; /* no end condition here */; ++z_index) + { + const float overlap_of_voxel_with_TOR = + std::min(right_edge_of_TOR, z_of_first_voxel + z_index + .5F) - + std::max(0.F, z_of_first_voxel + z_index - .5F); + if (overlap_of_voxel_with_TOR<=0.0001) // check if beyond TOR or overlap too small to bother + { + assert(num_overlapping_voxels>=z_index); + break; + } + assert(overlap_of_voxel_with_TOR < 1.0001); + const int new_z = lor.begin()->coord1()+z_index; + if (overlap_of_voxel_with_TOR>.9999) // test if it is 1 + { + // just copy the value + std::size_t count = 0; // counter for elements in original LOR + for ( ProjMatrixElemsForOneBin::const_iterator element_ptr = lor.begin(); + count != org_size; //element_ptr != element_end; + ++element_ptr, ++count) + { + assert(lor.size()+1 <= lor.capacity()); // not really necessary now, but check on reserve() best for performance + assert(new_z == element_ptr->coord1()+z_index); + lor.push_back( + ProjMatrixElemsForOneBin:: + value_type( + Coordinate3D(new_z, + element_ptr->coord2(), + element_ptr->coord3()), + element_ptr->get_value())); + } + } + else + { + // multiply the value with the overlap + std::size_t count = 0; // counter for elements in original LOR + for ( ProjMatrixElemsForOneBin::const_iterator element_ptr = lor.begin(); + count != org_size; //element_ptr != element_end; + ++element_ptr, ++count) + { + assert(lor.size()+1 <= lor.capacity()); + assert(new_z == element_ptr->coord1()+z_index); + lor.push_back( + ProjMatrixElemsForOneBin:: + value_type( + Coordinate3D(new_z, + element_ptr->coord2(), + element_ptr->coord3()), + element_ptr->get_value()*overlap_of_voxel_with_TOR)); + } + } + } // loop over z_index + + // now check original z + { + const float overlap_of_voxel_with_TOR = + std::min(right_edge_of_TOR, z_of_first_voxel + .5F) - + std::max(0.F, z_of_first_voxel - .5F); + assert (overlap_of_voxel_with_TOR>0); + assert(overlap_of_voxel_with_TOR < 1.0001); + if (overlap_of_voxel_with_TOR<.9999) // test if it is 1 + { + // multiply the value with the overlap + std::size_t count = 0; // counter for elements in original LOR + for ( ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + count != org_size; //element_ptr != element_end; + ++element_ptr, ++count) + *element_ptr *= overlap_of_voxel_with_TOR; + } + } +#ifndef NDEBUG + { + // ProjMatrixElemsForOneBin sorted_lor = lor; + // sorted_lor.sort(); + // assert(lor == sorted_lor); + lor.check_state(); + } +#endif +} + +#if 0 +/* + This function add another image row (with z+1) to the LOR, with the + same x,y and value. + However, it only works properly if the original LOR is such that + any voxels with identical x,y but z'-z=1 are adjacent in the LOR. + A sufficient condition for this is + - the z-coord is in ascending order + - only one of x,y,z changes to go to the next voxel + (the latter happens presumably for a single ray tracing, but not necessarily + in general. Take for instance a TOR wider than the voxel.) + + If the above condition is not satisfied, the current implementation can end + up with 1 voxel occuring more than once in the end result. + + This could easily be solved by checking this at the end (after a sort()). + However, as we don't do this yet, we currently no longer call this function. +*/ +static void merge_zplus1(ProjMatrixElemsForOneBin& lor) +{ + // first reserve enough memory to keep everything. + // Otherwise iterators might be invalidated. + + lor.reserve(lor.size()*2); + + cerr << "before merge\n"; +#if 0 + ProjMatrixElemsForOneBin::const_iterator iter = lor.begin(); + while (iter!= lor.end()) + { + std::cerr << iter->get_coords() + << ':' << iter->get_value() + << '\n'; + ++iter; + } +#endif + + + float next_value; + float current_value = lor.begin()->get_value(); + ProjMatrixElemsForOneBin::const_iterator lor_old_end = lor.end(); + for (ProjMatrixElemsForOneBin::iterator lor_iter = lor.begin(); + lor_iter != lor_old_end; + ++lor_iter, current_value = next_value) + { + // save value before we potentially modify it below + next_value = (lor_iter+1 == lor_old_end) ? 0.F : (lor_iter+1)->get_value(); + // check if we are the end, or the coordinates of the next voxel are + // not (x,y,z+1) + if ((lor_iter+1 == lor_old_end) || + (lor_iter->coord3() != (lor_iter+1)->coord3()) || + (lor_iter->coord2() != (lor_iter+1)->coord2()) || + (lor_iter->coord1() + 1 != (lor_iter+1)->coord1())) + { + // if so, we can just push_back a new voxel (but LOR won't be sorted though) + lor.push_back( + ProjMatrixElemsForOneBin::value_type( + Coordinate3D(lor_iter->coord1()+1, lor_iter->coord2(), lor_iter->coord3()), + current_value)); + } + else + { + // increment value of next voxel with the current value + *(lor_iter+1) += current_value; + } + + } + cerr << "after merge\n"; + lor.check_state(); + cerr << "after check_St\n"; +} +#endif + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/ProjMatrixElemsForOneBin.cxx b/src/recon_buildblock/ProjMatrixElemsForOneBin.cxx new file mode 100644 index 0000000000..d9dbb338c9 --- /dev/null +++ b/src/recon_buildblock/ProjMatrixElemsForOneBin.cxx @@ -0,0 +1,497 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup projection + \brief non-inline implementations for stir::ProjMatrixElemsForOneBin + + \author Mustapha Sadki + \author Kris Thielemans + \author PARAPET project + +*/ +/* History + + KT 15/05/2002 + rewrote merge(). it worked only on sorted arrays before, while the end-result wasn't sorted +*/ +#include "stir/Succeeded.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/DiscretisedDensity.h" +#include "stir/recon_buildblock/SymmetryOperation.h" +#include "stir/recon_buildblock/DataSymmetriesForBins.h" + +#include "stir/recon_buildblock/RelatedBins.h" +#include +//#include +//#include "stir/stream.h" + +#ifndef STIR_NO_NAMESPACES +using std::copy; +#endif + +START_NAMESPACE_STIR + + +ProjMatrixElemsForOneBin:: +ProjMatrixElemsForOneBin(const Bin& bin, const int default_capacity) +: bin(bin) +{ + elements.reserve(default_capacity); +} + + +void +ProjMatrixElemsForOneBin:: +reserve(size_type max_number) +{ + elements.reserve(max_number); +} + + +void ProjMatrixElemsForOneBin::erase() +{ + elements.resize(0); +} + +ProjMatrixElemsForOneBin::size_type +ProjMatrixElemsForOneBin:: +capacity() const +{ + return elements.capacity(); +} + +ProjMatrixElemsForOneBin& ProjMatrixElemsForOneBin::operator*=(const float d) +{ + // KT 21/02/2002 added check on 1 + if (d != 1.F) + { + iterator element_ptr = begin(); + while (element_ptr != end()) + { + *element_ptr *= d; + ++element_ptr; + } + } + return *this; +} + +ProjMatrixElemsForOneBin& ProjMatrixElemsForOneBin::operator/=(const float d) +{ + assert( d != 0); + // KT 21/02/2002 added check on 1 + if (d != 1.F) + { + iterator element_ptr = begin(); + while (element_ptr != end()) + { + *element_ptr /= d; + ++element_ptr; + } + } + return *this; +} + + +Succeeded ProjMatrixElemsForOneBin::check_state() const +{ + Succeeded success = Succeeded::yes; + + if (size()==0) + return success; + + ProjMatrixElemsForOneBin lor = *this; + lor.sort(); + + for (ProjMatrixElemsForOneBin::const_iterator lor_iter = lor.begin(); + lor_iter != lor.end()-1; + ++lor_iter) + { + if (value_type::coordinates_equal(*lor_iter, *(lor_iter+1))) + { + warning("ProjMatrixElemsForOneBin: coordinates occur more than once %d,%d,%d for bin s=%d, v=%d, a=%d, t=%d\n", + lor_iter->coord1(), lor_iter->coord2(), lor_iter->coord3(), + bin.segment_num(), bin.view_num(), + bin.axial_pos_num(), bin.tangential_pos_num()); +#if 0 + const_iterator iter = begin(); + while (iter!= end()) + { + std::cerr << iter->get_coords() + << ':' << iter->get_value() + << '\n'; + ++iter; + } +#endif + success = Succeeded::no; + } + } + return success; +} + + +void ProjMatrixElemsForOneBin::sort() +{ + // need explicit std:: here to resolve possible name conflict + // this might give you trouble if your compiler does not support namespaces +#if !defined(STIR_NO_NAMESPACES) || (__GNUC__ == 2 && __GNUC_MINOR__ <= 8) + std:: +#endif + sort(begin(), end(), value_type::coordinates_less); +} + + +float ProjMatrixElemsForOneBin::square_sum() const +{ + float sq_sum=0; + const_iterator element_ptr = begin(); + while (element_ptr != end()) + { + sq_sum += square(element_ptr->get_value()); + ++element_ptr; + } + return sq_sum; +} + +// TODO make sure we can have a const argument +void +ProjMatrixElemsForOneBin:: +merge( ProjMatrixElemsForOneBin &lor2 ) +{ + assert(check_state() == Succeeded::yes); + assert(lor2.check_state() == Succeeded::yes); + + if (lor2.size()==0) + return; + +#ifndef NDEBUG + // we will check at the end of the total probability is conserved, so we compute it first + float old_sum = 0; + for (const_iterator iter= begin(); iter != end(); ++iter) + old_sum+= iter->get_value(); + for (const_iterator iter= lor2.begin(); iter != lor2.end(); ++iter) + old_sum+= iter->get_value(); +#endif + // KT 15/05/2002 insert sort first, as both implementations assume this + sort(); + lor2.sort(); + + iterator element_ptr = begin(); + iterator element_ptr2= lor2.begin(); + // implementation note: cannot use const_iterator in the line above + // as some compilers (including gcc 3.* and VC 7.0) would not compile + // the elements.insert() line below, as the types of the iterators no longer + // match exactly. +#if 1 + // KT 15/05/2002 much faster implementation than before, and its output is sorted +#ifndef NDEBUG + //unsigned int insertions = 0; +#endif + while ( element_ptr2 != lor2.end() ) + { + if (element_ptr == end()) + { + elements.reserve((lor2.end() - element_ptr2) + size()); + elements.insert(end(), element_ptr2, lor2.end()); + break; + } + if (value_type::coordinates_equal(*element_ptr2, *element_ptr)) + { + *element_ptr++ += *element_ptr2++; + } + else if (value_type::coordinates_less(*element_ptr2, *element_ptr)) + { + element_ptr = elements.insert(element_ptr, *element_ptr2); + assert(*element_ptr == *element_ptr2); + ++element_ptr; ++element_ptr2; +#ifndef NDEBUG + //++insertions; +#endif + } + else + { + ++element_ptr; + } + } + + +#else + // this old version assumed the input arrays were sorted, but its output wasn't + // it could be rewritten to avoid lor2.erase() such that this method could be const + // this would probably speed it up anyway + bool found=false; + while ( element_ptr2 != lor2.end() ) + { + // here it is assumed that the input is sorted + // this could be possibly be dropped by initialising dup_xyz = begin() + // performance would be bad however + iterator dup_xyz = element_ptr; + while ( dup_xyz != end() ) + { + if (value_type::coordinates_equal(*element_ptr2, *dup_xyz)) + { + *dup_xyz += *element_ptr2; + element_ptr = dup_xyz+1; + found = true; + break; // assume no more duplicated point + } + else + ++dup_xyz; + } + if( found ) + { + element_ptr2 = lor2.erase(element_ptr2); + found = false; + } + else{ + ++element_ptr2; + } + } + // append the rest (but not sorted) + element_ptr2 = lor2.begin(); + while ( element_ptr2 != lor2.end() ) + { + push_back( *element_ptr2); + ++element_ptr2; + } + // KT 15/05/2002 added sort for compatiblity with other version + sort(); +#endif +#ifndef NDEBUG + // check that the values sum to the same as before merging + float new_sum = 0; + for (const_iterator iter= begin(); iter != end(); ++iter) + new_sum+= iter->get_value(); + assert(fabs(new_sum-old_sum)z < 0 || element_ptr->z > _maxplane ) { +element_ptr = elements.erase(element_ptr); +cout << " !!!!!! clean !!!!!! " << element_ptr->z << endl; + } + else + ++element_ptr; + } + +} +#endif + +#if 0 +void ProjMatrixElemsForOneBin::write (fstream&fst) const +{ + //fst.write ( (char*)&_sgn, sizeof( unsigned int)); + int c= size(); + fst.write( (char*)&c , sizeof( int)); + const_iterator element_ptr = begin(); + // todo add compression in this loop + while (element_ptr != end()) { + fst.write ( (char*)element_ptr, sizeof( value_type)); + ++element_ptr; + } + // fst.write ( (char*)&_minplane, sizeof( int)); + // fst.write ( (char*)&_maxplane, sizeof( int)); +} + +//! Read probabilities from stream +void ProjMatrixElemsForOneBin::read( fstream&fst ) +{ + //fst.read ( (char*)&_sgn, sizeof( unsigned int) ); + + int count; + fst.read ( (char*)&count, sizeof( int)); + // todo handel the compression + for ( int i=0; i < count; ++i) { + value_type elem; + fst.read ( (char*)&elem, sizeof( value_type)); + push_back( elem); + } + //fst.read ( (char*)&_minplane, sizeof( int)); + //fst.read ( (char*)&_maxplane, sizeof( int)); + // print(); +} +#endif + +/////////////////// projection operations ////////////////////////////////// +void +ProjMatrixElemsForOneBin:: +back_project(DiscretisedDensity<3,float>& density, + const Bin& single) const +{ + { + const float data = single.get_bin_value() ; + // KT 21/02/2002 added check on 0 + if (data == 0) + return; + + const_iterator element_ptr = + begin(); + while (element_ptr != end()) + { + const BasicCoordinate<3,int> coords = element_ptr->get_coords(); + if (coords[1] >= density.get_min_index() && coords[1] <= density.get_max_index()) + density[coords[1]][coords[2]][coords[3]] += element_ptr->get_value() * data; + element_ptr++; + } + } +} + + +void +ProjMatrixElemsForOneBin:: +forward_project(Bin& single, + const DiscretisedDensity<3,float>& density) const +{ + { + + const_iterator element_ptr = begin(); + + while (element_ptr != end()) + { + const BasicCoordinate<3,int> coords = element_ptr->get_coords(); + + if (coords[1] >= density.get_min_index() && coords[1] <= density.get_max_index()) + single += density[coords[1]][coords[2]][coords[3]] * element_ptr->get_value(); + ++element_ptr; + } + } +} + + +void +ProjMatrixElemsForOneBin:: +back_project(DiscretisedDensity<3,float>& density, + const RelatedBins& r_bins) const +{ + const DataSymmetriesForBins* symmetries = r_bins.get_symmetries_ptr(); + + RelatedBins::const_iterator r_bins_iterator =r_bins.begin(); + ProjMatrixElemsForOneBin row_copy; + while (r_bins_iterator != r_bins.end()) + + { + row_copy = *this; + + Bin symmetric_bin = *r_bins_iterator; + // KT 21/02/2002 added check on 0 + if (symmetric_bin.get_bin_value() == 0) + return; + auto_ptr symm_ptr = + symmetries->find_symmetry_operation_from_basic_bin(symmetric_bin); + symm_ptr->transform_proj_matrix_elems_for_one_bin(row_copy); + row_copy.back_project(density,symmetric_bin); + } +} + + +void +ProjMatrixElemsForOneBin:: +forward_project(RelatedBins& r_bins, + const DiscretisedDensity<3,float>& density) const +{ + const DataSymmetriesForBins* symmetries = r_bins.get_symmetries_ptr(); + + RelatedBins::iterator r_bins_iterator =r_bins.begin(); + ProjMatrixElemsForOneBin row_copy; + + while (r_bins_iterator != r_bins.end()) + + { + row_copy = *this; + + auto_ptr symm_op_ptr = + symmetries->find_symmetry_operation_from_basic_bin(*r_bins_iterator); + symm_op_ptr->transform_proj_matrix_elems_for_one_bin(row_copy); + row_copy.forward_project(*r_bins_iterator,density); + } + +} + + +bool +ProjMatrixElemsForOneBin:: +operator==(const ProjMatrixElemsForOneBin& lor) const +{ + // first determine a tolerance for the floating point comparisons + // do this by finding the maxumum value in the first lor + float max_value = 0; + + { + // extra brackets here to avoid VC 7.1 complaining about this_iter + // being defined here in for() and a few lines further on + // (it really shouldn't complain) + for (const_iterator this_iter= begin(); this_iter!= end(); ++this_iter) + { + const float current_value=this_iter->get_value(); + if (current_value> max_value) + max_value = current_value; + } + } + const float tolerance = max_value*.002F; + + const_iterator this_iter= begin(); + const_iterator lor_iter = lor.begin(); + while (this_iter!= end() && lor_iter!=lor.end()) + { + // skip small elements + if (this_iter->get_value()get_value()get_coords() != lor_iter->get_coords() || + fabs(this_iter->get_value() - lor_iter->get_value()) > tolerance) + return false; + ++this_iter; + ++lor_iter; + } + for (; this_iter!= end(); ++this_iter) + { + if (this_iter->get_value()> tolerance) + return false; + } + for (; lor_iter!= lor.end(); ++lor_iter) + { + if (lor_iter->get_value()> tolerance) + return false; + } + return true; + +} +bool +ProjMatrixElemsForOneBin:: +operator!=(const ProjMatrixElemsForOneBin& lor) const +{ return !(*this==lor); } + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjMatrixElemsForOneDensel.cxx b/src/recon_buildblock/ProjMatrixElemsForOneDensel.cxx new file mode 100644 index 0000000000..bfd0842ff5 --- /dev/null +++ b/src/recon_buildblock/ProjMatrixElemsForOneDensel.cxx @@ -0,0 +1,346 @@ +// +// +/*! + + \file + \ingroup projection + \brief non-inline implementations for stir::ProjMatrixElemsForOneDensel + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/recon_buildblock/ProjMatrixElemsForOneDensel.h" +#include "stir/Succeeded.h" +#include "stir/DiscretisedDensity.h" +#include "stir/recon_buildblock/SymmetryOperation.h" +#include "stir/recon_buildblock/DataSymmetriesForDensels.h" +#include "stir/recon_buildblock/RelatedDensels.h" + +#include + +START_NAMESPACE_STIR + + +ProjMatrixElemsForOneDensel:: +ProjMatrixElemsForOneDensel(const Densel& densel, const int default_capacity) +: densel(densel) +{ + elements.reserve(default_capacity); +} + +ProjMatrixElemsForOneDensel:: +ProjMatrixElemsForOneDensel() +{ + elements.reserve(300); +} + + +void +ProjMatrixElemsForOneDensel:: +reserve(size_type max_number) +{ + elements.reserve(max_number); +} + + +void ProjMatrixElemsForOneDensel::erase() +{ + elements.resize(0); +} + +ProjMatrixElemsForOneDensel& ProjMatrixElemsForOneDensel::operator*=(const float d) +{ + // KT 21/02/2002 added check on 1 + if (d != 1.F) + { + iterator element_ptr = begin(); + while (element_ptr != end()) + { + *element_ptr *= d; + ++element_ptr; + } + } + return *this; +} + +ProjMatrixElemsForOneDensel& ProjMatrixElemsForOneDensel::operator/=(const float d) +{ + assert( d != 0); + // KT 21/02/2002 added check on 1 + if (d != 1.F) + { + iterator element_ptr = begin(); + while (element_ptr != end()) + { + *element_ptr /= d; + ++element_ptr; + } + } + return *this; +} + + +Succeeded ProjMatrixElemsForOneDensel::check_state() const +{ + Succeeded success = Succeeded::yes; + + if (size()==0) + return success; + + ProjMatrixElemsForOneDensel lor = *this; + lor.sort(); + + for (ProjMatrixElemsForOneDensel::const_iterator lor_iter = lor.begin(); + lor_iter != lor.end()-1; + ++lor_iter) + { + if (value_type::coordinates_equal(*lor_iter, *(lor_iter+1))) + { + warning("ProjMatrixElemsForOneDensel: coordinates occur more than once %d,%d,%d,%d\n", + lor_iter->segment_num(), lor_iter->view_num(), + lor_iter->axial_pos_num(), lor_iter->tangential_pos_num()); + success = Succeeded::no; + } + } + return success; +} + + +void ProjMatrixElemsForOneDensel::sort() +{ + // need explicit std:: here to resolve possible name conflict + // this might give you trouble if your compiler does not support namespaces +#if !defined(STIR_NO_NAMESPACES) || (__GNUC__ == 2 && __GNUC_MINOR__ <= 8) + std:: +#endif + sort(begin(), end(), value_type::coordinates_less); +} + + +float ProjMatrixElemsForOneDensel::square_sum() const +{ + float sq_sum=0; + const_iterator element_ptr = begin(); + while (element_ptr != end()) + { + sq_sum += square(element_ptr->get_bin_value()); + ++element_ptr; + } + return sq_sum; +} + +// TODO make sure we can have a const argument +// not calling lor2.erase() would probably speed it up anyway +void +ProjMatrixElemsForOneDensel:: +merge( ProjMatrixElemsForOneDensel &lor2 ) +{ + assert(check_state() == Succeeded::yes); + assert(lor2.check_state() == Succeeded::yes); + + iterator element_ptr = begin(); + iterator element_ptr2= lor2.begin(); + + bool found=false; + while ( element_ptr2 != lor2.end() ) + { + //unsigned int key = make_key( element_ptr2->x, element_ptr2->y,element_ptr2->z); + iterator dup_xyz = element_ptr; + while ( dup_xyz != end() ) + { + //unsigned int dup_key = make_key( dup_xyz->x,dup_xyz->y,dup_xyz->z); + + //if ( dup_key == key ) + if (value_type::coordinates_equal(*element_ptr2, *dup_xyz)) + { + //TEST///////// + *dup_xyz += *element_ptr2; + /////////////// + element_ptr = dup_xyz+1; + found = true; + break; // assume no more duplicated point, only 2 lors + } + else + ++dup_xyz; + } + if( found ) + { + element_ptr2 = lor2.erase(element_ptr2); + found = false; + } + else{ + ++element_ptr2; + } + } + // append the rest + element_ptr2 = lor2.begin(); + while ( element_ptr2 != lor2.end() ) + { + push_back( *element_ptr2); + ++element_ptr2; + } + assert(check_state() == Succeeded::yes); +} + + +#if 0 +// todo remove this +void ProjMatrixElemsForOneDensel::clean_neg_z() +{ +iterator element_ptr = begin(); +while (element_ptr != end()) +{ +if ( element_ptr->z < 0 || element_ptr->z > _maxplane ) { +element_ptr = elements.erase(element_ptr); +cout << " !!!!!! clean !!!!!! " << element_ptr->z << endl; + } + else + ++element_ptr; + } + +} +#endif + +#if 0 +void ProjMatrixElemsForOneDensel::write (fstream&fst) const +{ + //fst.write ( (char*)&_sgn, sizeof( unsigned int)); + int c= size(); + fst.write( (char*)&c , sizeof( int)); + const_iterator element_ptr = begin(); + // todo add compression in this loop + while (element_ptr != end()) { + fst.write ( (char*)element_ptr, sizeof( value_type)); + ++element_ptr; + } + // fst.write ( (char*)&_minplane, sizeof( int)); + // fst.write ( (char*)&_maxplane, sizeof( int)); +} + +//! Read probabilities from stream +void ProjMatrixElemsForOneDensel::read( fstream&fst ) +{ + //fst.read ( (char*)&_sgn, sizeof( unsigned int) ); + + int count; + fst.read ( (char*)&count, sizeof( int)); + // todo handel the compression + for ( int i=0; i < count; ++i) { + value_type elem; + fst.read ( (char*)&elem, sizeof( value_type)); + push_back( elem); + } + //fst.read ( (char*)&_minplane, sizeof( int)); + //fst.read ( (char*)&_maxplane, sizeof( int)); + // print(); +} +#endif + +/////////////////// projection operations ////////////////////////////////// +#if 0 +// TODO +void +ProjMatrixElemsForOneDensel:: +back_project(DiscretisedDensity<3,float>& density, + const Densel& single) const +{ + { + const float data = single.get_densel_value() ; + const_iterator element_ptr = + begin(); + while (element_ptr != end()) + { + const BasicCoordinate<3,int> coords = element_ptr->get_coords(); + if (coords[1] >= density.get_min_index() && coords[1] <= density.get_max_index()) + density[coords[1]][coords[2]][coords[3]] += element_ptr->get_value() * data; + element_ptr++; + } + } +} + + +void +ProjMatrixElemsForOneDensel:: +forward_project(Densel& single, + const DiscretisedDensity<3,float>& density) const +{ + { + + const_iterator element_ptr = begin(); + + while (element_ptr != end()) + { + const BasicCoordinate<3,int> coords = element_ptr->get_coords(); + + if (coords[1] >= density.get_min_index() && coords[1] <= density.get_max_index()) + single += density[coords[1]][coords[2]][coords[3]] * element_ptr->get_value(); + ++element_ptr; + } + } +} + + +void +ProjMatrixElemsForOneDensel:: +back_project(DiscretisedDensity<3,float>& density, + const RelatedDensels& r_densels) const +{ + const DataSymmetriesForDensels* symmetries = r_densels.get_symmetries_ptr(); + + RelatedDensels::const_iterator r_densels_iterator =r_densels.begin(); + ProjMatrixElemsForOneDensel row_copy; + while (r_densels_iterator != r_densels.end()) + + { + row_copy = *this; + + Densel symmetric_densel = *r_densels_iterator; + auto_ptr symm_ptr = + symmetries->find_symmetry_operation_to_basic_densel(symmetric_densel); + symm_ptr->transform_proj_matrix_elems_for_one_densel(row_copy); + row_copy.back_project(density,symmetric_densel); + } +} + + +void +ProjMatrixElemsForOneDensel:: +forward_project(RelatedDensels& r_densels, + const DiscretisedDensity<3,float>& density) const +{ + const DataSymmetriesForDensels* symmetries = r_densels.get_symmetries_ptr(); + + RelatedDensels::iterator r_densels_iterator =r_densels.begin(); + ProjMatrixElemsForOneDensel row_copy; + + while (r_densels_iterator != r_densels.end()) + + { + row_copy = *this; + + auto_ptr symm_op_ptr = + symmetries->find_symmetry_operation_to_basic_densel(*r_densels_iterator); + symm_op_ptr->transform_proj_matrix_elems_for_one_densel(row_copy); + row_copy.forward_project(*r_densels_iterator,density); + } + +} +#endif + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjectorByBinPair.cxx b/src/recon_buildblock/ProjectorByBinPair.cxx new file mode 100644 index 0000000000..106152a2cf --- /dev/null +++ b/src/recon_buildblock/ProjectorByBinPair.cxx @@ -0,0 +1,69 @@ +// +// +/*! + \file + \ingroup projection + + \brief non-inline implementations for stir::ProjectorByBinPair + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/ProjectorByBinPair.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + + +ProjectorByBinPair:: +ProjectorByBinPair() +{ +} + +Succeeded +ProjectorByBinPair:: +set_up(const shared_ptr& proj_data_info_ptr, + const shared_ptr >& image_info_ptr) + +{ + // TODO use return values + forward_projector_sptr->set_up(proj_data_info_ptr, image_info_ptr); + back_projector_sptr->set_up(proj_data_info_ptr, image_info_ptr); + return Succeeded::yes; +} + +//ForwardProjectorByBin const * +const shared_ptr +ProjectorByBinPair:: +get_forward_projector_sptr() const +{ + return forward_projector_sptr; +} + +//BackProjectorByBin const * +const shared_ptr +ProjectorByBinPair:: +get_back_projector_sptr() const +{ + return back_projector_sptr; +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.cxx b/src/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.cxx new file mode 100644 index 0000000000..bd7f16c433 --- /dev/null +++ b/src/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.cxx @@ -0,0 +1,109 @@ +// +// +/*! + \file + \ingroup projection + + \brief non-inline implementations for stir::ProjectorByBinPairUsingProjMatrixByBin + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + + +const char * const +ProjectorByBinPairUsingProjMatrixByBin::registered_name = + "Matrix"; + + +void +ProjectorByBinPairUsingProjMatrixByBin::initialise_keymap() +{ + base_type::initialise_keymap(); + parser.add_start_key("Projector Pair Using Matrix Parameters"); + parser.add_stop_key("End Projector Pair Using Matrix Parameters"); + parser.add_parsing_key("Matrix type",&proj_matrix_sptr); +} + + +void +ProjectorByBinPairUsingProjMatrixByBin::set_defaults() +{ + base_type::set_defaults(); + this->proj_matrix_sptr.reset(); +} + +bool +ProjectorByBinPairUsingProjMatrixByBin::post_processing() +{ + if (base_type::post_processing()) + return true; + if (is_null_ptr(proj_matrix_sptr)) + { warning("No valid projection matrix is defined\n"); return true; } + return false; +} + +ProjectorByBinPairUsingProjMatrixByBin:: +ProjectorByBinPairUsingProjMatrixByBin() +{ + set_defaults(); +} + +ProjectorByBinPairUsingProjMatrixByBin:: +ProjectorByBinPairUsingProjMatrixByBin( + const shared_ptr& proj_matrix_sptr) + : proj_matrix_sptr(proj_matrix_sptr) +{} + +Succeeded +ProjectorByBinPairUsingProjMatrixByBin:: +set_up(const shared_ptr& proj_data_info_sptr, + const shared_ptr >& image_info_sptr) +{ + + this->forward_projector_sptr.reset(new ForwardProjectorByBinUsingProjMatrixByBin(proj_matrix_sptr)); + this->back_projector_sptr.reset(new BackProjectorByBinUsingProjMatrixByBin(proj_matrix_sptr)); + + // proj_matrix_sptr->set_up() not needed as the projection matrix will be set_up indirectly by + // the forward_projector->set_up (which is called in the base class) + // proj_matrix_sptr->set_up(proj_data_info_sptr, image_info_sptr); + + if (base_type::set_up(proj_data_info_sptr, image_info_sptr) != Succeeded::yes) + return Succeeded::no; + + return Succeeded::yes; +} + +ProjMatrixByBin const * +ProjectorByBinPairUsingProjMatrixByBin:: +get_proj_matrix_ptr() const +{ + return proj_matrix_sptr.get(); +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.cxx b/src/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.cxx new file mode 100644 index 0000000000..5f11846013 --- /dev/null +++ b/src/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.cxx @@ -0,0 +1,91 @@ +// +// +/*! + \file + \ingroup projection + + \brief non-inline implementations for stir::ProjectorByBinPairUsingSeparateProjectors + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/ProjectorByBinPairUsingSeparateProjectors.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" + +START_NAMESPACE_STIR + + +const char * const +ProjectorByBinPairUsingSeparateProjectors::registered_name = + "Separate Projectors"; + + +void +ProjectorByBinPairUsingSeparateProjectors::initialise_keymap() +{ + parser.add_start_key("Projector Pair Using Separate Projectors Parameters"); + parser.add_stop_key("End Projector Pair Using Separate Projectors Parameters"); + parser.add_parsing_key("Forward projector type",&forward_projector_sptr); + parser.add_parsing_key("Back projector type",&back_projector_sptr); +} + + +void +ProjectorByBinPairUsingSeparateProjectors:: +set_defaults() +{ + base_type::set_defaults(); + forward_projector_sptr.reset(); + back_projector_sptr.reset(); +} + +bool +ProjectorByBinPairUsingSeparateProjectors:: +post_processing() +{ + if (base_type::post_processing()) + return true; + if (is_null_ptr(forward_projector_sptr)) + { warning("No valid forward projector is defined\n"); return true; } + + if (is_null_ptr(back_projector_sptr)) + { warning("No valid back projector is defined\n"); return true; } + + return false; +} + +ProjectorByBinPairUsingSeparateProjectors:: +ProjectorByBinPairUsingSeparateProjectors() +{ + set_defaults(); +} + +ProjectorByBinPairUsingSeparateProjectors:: +ProjectorByBinPairUsingSeparateProjectors(const shared_ptr& forward_projector_sptr_v, + const shared_ptr& back_projector_sptr_v) +{ + forward_projector_sptr = forward_projector_sptr_v; + back_projector_sptr = back_projector_sptr_v; +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/QuadraticPrior.cxx b/src/recon_buildblock/QuadraticPrior.cxx new file mode 100644 index 0000000000..33a23d7156 --- /dev/null +++ b/src/recon_buildblock/QuadraticPrior.cxx @@ -0,0 +1,646 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup priors + \brief implementation of the stir::QuadraticPrior class + + \author Kris Thielemans + \author Sanida Mustafovic + +*/ + +#include "stir/recon_buildblock/QuadraticPrior.h" +#include "stir/Succeeded.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/IndexRange3D.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/is_null_ptr.h" + +/* Pretty horrible code because we don't have an iterator of neigbhourhoods yet + */ + +START_NAMESPACE_STIR + +template +void +QuadraticPrior::initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Quadratic Prior Parameters"); + this->parser.add_key("only 2D", &only_2D); + this->parser.add_key("kappa filename", &kappa_filename); + this->parser.add_key("weights", &weights); + this->parser.add_key("gradient filename prefix", &gradient_filename_prefix); + this->parser.add_stop_key("END Quadratic Prior Parameters"); +} + +template +bool +QuadraticPrior::post_processing() +{ + if (base_type::post_processing()==true) + return true; + if (kappa_filename.size() != 0) + this->kappa_ptr = read_from_file >(kappa_filename); + + bool warn_about_even_size = false; + + if (this->weights.size() ==0) + { + // will call compute_weights() to fill it in + } + else + { + if (!this->weights.is_regular()) + { + warning("Sorry. QuadraticPrior currently only supports regular arrays for the weights"); + return true; + } + + const unsigned int size_z = this->weights.size(); + if (size_z%2==0) + warn_about_even_size = true; + const int min_index_z = -static_cast(size_z/2); + this->weights.set_min_index(min_index_z); + + for (int z = min_index_z; z<= this->weights.get_max_index(); ++z) + { + const unsigned int size_y = this->weights[z].size(); + if (size_y%2==0) + warn_about_even_size = true; + const int min_index_y = -static_cast(size_y/2); + this->weights[z].set_min_index(min_index_y); + for (int y = min_index_y; y<= this->weights[z].get_max_index(); ++y) + { + const unsigned int size_x = this->weights[z][y].size(); + if (size_x%2==0) + warn_about_even_size = true; + const int min_index_x = -static_cast(size_x/2); + this->weights[z][y].set_min_index(min_index_x); + } + } + } + + if (warn_about_even_size) + warning("Parsing QuadraticPrior: even number of weights occured in either x,y or z dimension.\n" + "I'll (effectively) make this odd by appending a 0 at the end."); + return false; + +} + +template +void +QuadraticPrior::set_defaults() +{ + base_type::set_defaults(); + this->only_2D = false; + this->kappa_ptr.reset(); + this->weights.recycle(); +} + +template <> +const char * const +QuadraticPrior::registered_name = + "Quadratic"; + +template +QuadraticPrior::QuadraticPrior() +{ + set_defaults(); +} + + +template +QuadraticPrior::QuadraticPrior(const bool only_2D_v, float penalisation_factor_v) + : only_2D(only_2D_v) +{ + this->penalisation_factor = penalisation_factor_v; +} + + + //! get penalty weights for the neigbourhood +template +Array<3,float> +QuadraticPrior:: +get_weights() const +{ return this->weights; } + + //! set penalty weights for the neigbourhood +template +void +QuadraticPrior:: +set_weights(const Array<3,float>& w) +{ this->weights = w; } + + //! get current kappa image + /*! \warning As this function returns a shared_ptr, this is dangerous. You should not + modify the image by manipulating the image refered to by this pointer. + Unpredictable results will occur. + */ +template +shared_ptr > +QuadraticPrior:: +get_kappa_sptr() const +{ return this->kappa_ptr; } + + //! set kappa image +template +void +QuadraticPrior:: +set_kappa_sptr(const shared_ptr >& k) +{ this->kappa_ptr = k; } + + +// TODO move to set_up +// initialise to 1/Euclidean distance +static void +compute_weights(Array<3,float>& weights, const CartesianCoordinate3D& grid_spacing, const bool only_2D) +{ + int min_dz, max_dz; + if (only_2D) + { + min_dz = max_dz = 0; + } + else + { + min_dz = -1; + max_dz = 1; + } + weights = Array<3,float>(IndexRange3D(min_dz,max_dz,-1,1,-1,1)); + for (int z=min_dz;z<=max_dz;++z) + for (int y=-1;y<=1;++y) + for (int x=-1;x<=1;++x) + { + if (z==0 && y==0 && x==0) + weights[0][0][0] = 0; + else + { + weights[z][y][x] = + grid_spacing.x()/ + sqrt(square(x*grid_spacing.x())+ + square(y*grid_spacing.y())+ + square(z*grid_spacing.z())); + } + } +} + +template +double +QuadraticPrior:: +compute_value(const DiscretisedDensity<3,elemT> ¤t_image_estimate) +{ + if (this->penalisation_factor==0) + { + return 0.; + } + + + const DiscretisedDensityOnCartesianGrid<3,elemT>& current_image_cast = + dynamic_cast< const DiscretisedDensityOnCartesianGrid<3,elemT> &>(current_image_estimate); + + if (this->weights.get_length() ==0) + { + compute_weights(this->weights, current_image_cast.get_grid_spacing(), this->only_2D); + } + + const bool do_kappa = !is_null_ptr(kappa_ptr); + + if (do_kappa && !kappa_ptr->has_same_characteristics(current_image_estimate)) + error("QuadraticPrior: kappa image has not the same index range as the reconstructed image\n"); + + + double result = 0.; + const int min_z = current_image_estimate.get_min_index(); + const int max_z = current_image_estimate.get_max_index(); + for (int z=min_z; z<=max_z; z++) + { + const int min_dz = max(weights.get_min_index(), min_z-z); + const int max_dz = min(weights.get_max_index(), max_z-z); + + const int min_y = current_image_estimate[z].get_min_index(); + const int max_y = current_image_estimate[z].get_max_index(); + + for (int y=min_y;y<= max_y;y++) + { + const int min_dy = max(weights[0].get_min_index(), min_y-y); + const int max_dy = min(weights[0].get_max_index(), max_y-y); + + const int min_x = current_image_estimate[z][y].get_min_index(); + const int max_x = current_image_estimate[z][y].get_max_index(); + + for (int x=min_x;x<= max_x;x++) + { + const int min_dx = max(weights[0][0].get_min_index(), min_x-x); + const int max_dx = min(weights[0][0].get_max_index(), max_x-x); + + /* formula: + sum_dx,dy,dz + 1/2 weights[dz][dy][dx] * + (current_image_estimate[z][y][x] - current_image_estimate[z+dz][y+dy][x+dx])^2 * + (*kappa_ptr)[z][y][x] * (*kappa_ptr)[z+dz][y+dy][x+dx]; + */ + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + { + elemT current = + weights[dz][dy][dx] * + square(current_image_estimate[z][y][x] - current_image_estimate[z+dz][y+dy][x+dx])/2; + + if (do_kappa) + current *= + (*kappa_ptr)[z][y][x] * (*kappa_ptr)[z+dz][y+dy][x+dx]; + + result += static_cast(current); + } + } + } + } + return result * this->penalisation_factor; +} + +template +void +QuadraticPrior:: +compute_gradient(DiscretisedDensity<3,elemT>& prior_gradient, + const DiscretisedDensity<3,elemT> ¤t_image_estimate) +{ + assert( prior_gradient.has_same_characteristics(current_image_estimate)); + if (this->penalisation_factor==0) + { + prior_gradient.fill(0); + return; + } + + + const DiscretisedDensityOnCartesianGrid<3,elemT>& current_image_cast = + dynamic_cast< const DiscretisedDensityOnCartesianGrid<3,elemT> &>(current_image_estimate); + + if (this->weights.get_length() ==0) + { + compute_weights(this->weights, current_image_cast.get_grid_spacing(), this->only_2D); + } + + + + const bool do_kappa = !is_null_ptr(kappa_ptr); + if (do_kappa && !kappa_ptr->has_same_characteristics(current_image_estimate)) + error("QuadraticPrior: kappa image has not the same index range as the reconstructed image\n"); + + const int min_z = current_image_estimate.get_min_index(); + const int max_z = current_image_estimate.get_max_index(); + for (int z=min_z; z<=max_z; z++) + { + const int min_dz = max(weights.get_min_index(), min_z-z); + const int max_dz = min(weights.get_max_index(), max_z-z); + + const int min_y = current_image_estimate[z].get_min_index(); + const int max_y = current_image_estimate[z].get_max_index(); + + for (int y=min_y;y<= max_y;y++) + { + const int min_dy = max(weights[0].get_min_index(), min_y-y); + const int max_dy = min(weights[0].get_max_index(), max_y-y); + + const int min_x = current_image_estimate[z][y].get_min_index(); + const int max_x = current_image_estimate[z][y].get_max_index(); + + for (int x=min_x;x<= max_x;x++) + { + const int min_dx = max(weights[0][0].get_min_index(), min_x-x); + const int max_dx = min(weights[0][0].get_max_index(), max_x-x); + + /* formula: + sum_dx,dy,dz + weights[dz][dy][dx] * + (current_image_estimate[z][y][x] - current_image_estimate[z+dz][y+dy][x+dx]) * + (*kappa_ptr)[z][y][x] * (*kappa_ptr)[z+dz][y+dy][x+dx]; + */ +#if 1 + elemT gradient = 0; + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + { + elemT current = + weights[dz][dy][dx] * + (current_image_estimate[z][y][x] - current_image_estimate[z+dz][y+dy][x+dx]); + + if (do_kappa) + current *= + (*kappa_ptr)[z][y][x] * (*kappa_ptr)[z+dz][y+dy][x+dx]; + + gradient += current; + } +#else + // attempt to speed up by precomputing the sum of weights. + // The current code gives identical results but is actually slower + // than the above, at least when kappas are present. + + + // precompute sum of weights + // TODO without kappas, this is just weights.sum() most of the time, + // but not near edges + float sum_of_weights = 0; + { + if (do_kappa) + { + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + sum_of_weights += weights[dz][dy][dx]*(*kappa_ptr)[z+dz][y+dy][x+dx]; + } + else + { + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + sum_of_weights += weights[dz][dy][dx]; + } + } + // now compute contribution of central term + elemT gradient = sum_of_weights * current_image_estimate[z][y][x] ; + + // subtract the rest + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + { + elemT current = + weights[dz][dy][dx] * current_image_estimate[z+dz][y+dy][x+dx]; + + if (do_kappa) + current *= (*kappa_ptr)[z+dz][y+dy][x+dx]; + + gradient -= current; + } + // multiply with central kappa + if (do_kappa) + gradient *= (*kappa_ptr)[z][y][x]; +#endif + prior_gradient[z][y][x]= gradient * this->penalisation_factor; + } + } + } + + std::cerr << "Prior gradient max " << prior_gradient.find_max() + << ", min " << prior_gradient.find_min() << std::endl; + + static int count = 0; + ++count; + if (gradient_filename_prefix.size()>0) + { + char *filename = new char[gradient_filename_prefix.size()+100]; + sprintf(filename, "%s%d.v", gradient_filename_prefix.c_str(), count); + OutputFileFormat >::default_sptr()-> + write_to_file(filename, prior_gradient); + delete[] filename; + } +} + +template +void +QuadraticPrior:: +compute_Hessian(DiscretisedDensity<3,elemT>& prior_Hessian_for_single_densel, + const BasicCoordinate<3,int>& coords, + const DiscretisedDensity<3,elemT> ¤t_image_estimate) +{ + assert( prior_Hessian_for_single_densel.has_same_characteristics(current_image_estimate)); + prior_Hessian_for_single_densel.fill(0); + if (this->penalisation_factor==0) + { + return; + } + + + const DiscretisedDensityOnCartesianGrid<3,elemT>& current_image_cast = + dynamic_cast< const DiscretisedDensityOnCartesianGrid<3,elemT> &>(current_image_estimate); + + DiscretisedDensityOnCartesianGrid<3,elemT>& prior_Hessian_for_single_densel_cast = + dynamic_cast &>(prior_Hessian_for_single_densel); + + if (weights.get_length() ==0) + { + compute_weights(weights, current_image_cast.get_grid_spacing(), this->only_2D); + } + + + const bool do_kappa = !is_null_ptr(kappa_ptr); + + if (do_kappa && kappa_ptr->has_same_characteristics(current_image_estimate)) + error("QuadraticPrior: kappa image has not the same index range as the reconstructed image\n"); + + const int z = coords[1]; + const int y = coords[2]; + const int x = coords[3]; + const int min_dz = max(weights.get_min_index(), prior_Hessian_for_single_densel.get_min_index()-z); + const int max_dz = min(weights.get_max_index(), prior_Hessian_for_single_densel.get_max_index()-z); + + const int min_dy = max(weights[0].get_min_index(), prior_Hessian_for_single_densel[z].get_min_index()-y); + const int max_dy = min(weights[0].get_max_index(), prior_Hessian_for_single_densel[z].get_max_index()-y); + + const int min_dx = max(weights[0][0].get_min_index(), prior_Hessian_for_single_densel[z][y].get_min_index()-x); + const int max_dx = min(weights[0][0].get_max_index(), prior_Hessian_for_single_densel[z][y].get_max_index()-x); + + elemT diagonal = 0; + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + { + // dz==0,dy==0,dx==0 will have weight 0, so we can just include it in the loop + elemT current = + weights[dz][dy][dx]; + + if (do_kappa) + current *= + (*kappa_ptr)[z][y][x] * (*kappa_ptr)[z+dz][y+dy][x+dx]; + + diagonal += current; + prior_Hessian_for_single_densel_cast[z+dz][y+dy][x+dx] = -current*this->penalisation_factor; + } + + prior_Hessian_for_single_densel[z][y][x]= diagonal * this->penalisation_factor; +} + +template +void +QuadraticPrior::parabolic_surrogate_curvature(DiscretisedDensity<3,elemT>& parabolic_surrogate_curvature, + const DiscretisedDensity<3,elemT> ¤t_image_estimate) +{ + + assert( parabolic_surrogate_curvature.has_same_characteristics(current_image_estimate)); + if (this->penalisation_factor==0) + { + parabolic_surrogate_curvature.fill(0); + return; + } + + + const DiscretisedDensityOnCartesianGrid<3,elemT>& current_image_cast = + dynamic_cast< const DiscretisedDensityOnCartesianGrid<3,elemT> &>(current_image_estimate); + + if (weights.get_length() ==0) + { + compute_weights(weights, current_image_cast.get_grid_spacing(), this->only_2D); + } + + const bool do_kappa = !is_null_ptr(kappa_ptr); + + if (do_kappa && !kappa_ptr->has_same_characteristics(current_image_estimate)) + error("QuadraticPrior: kappa image has not the same index range as the reconstructed image\n"); + + const int min_z = current_image_estimate.get_min_index(); + const int max_z = current_image_estimate.get_max_index(); + for (int z=min_z; z<=max_z; z++) + { + const int min_dz = max(weights.get_min_index(), min_z-z); + const int max_dz = min(weights.get_max_index(), max_z-z); + + const int min_y = current_image_estimate[z].get_min_index(); + const int max_y = current_image_estimate[z].get_max_index(); + + for (int y=min_y;y<= max_y;y++) + { + const int min_dy = max(weights[0].get_min_index(), min_y-y); + const int max_dy = min(weights[0].get_max_index(), max_y-y); + + const int min_x = current_image_estimate[z][y].get_min_index(); + const int max_x = current_image_estimate[z][y].get_max_index(); + for (int x=min_x;x<= max_x;x++) + { + const int min_dx = max(weights[0][0].get_min_index(), min_x-x); + const int max_dx = min(weights[0][0].get_max_index(), max_x-x); + + elemT gradient = 0; + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + { + // 1 comes from omega = psi'(t)/t = 2*t/2t =1 + elemT current = + weights[dz][dy][dx] *1; + + if (do_kappa) + current *= + (*kappa_ptr)[z][y][x] * (*kappa_ptr)[z+dz][y+dy][x+dx]; + + gradient += current; + } + + parabolic_surrogate_curvature[z][y][x]= gradient * this->penalisation_factor; + } + } + } + + std::cerr << " parabolic_surrogate_curvature max " << parabolic_surrogate_curvature.find_max() + << ", min " << parabolic_surrogate_curvature.find_min() << std::endl; + /*{ + static int count = 0; + ++count; + char filename[20]; + sprintf(filename, "normalised_gradient%d.v",count); + write_basic_interfile(filename, parabolic_surrogate_curvature); + }*/ +} + +template +Succeeded +QuadraticPrior:: +add_multiplication_with_approximate_Hessian(DiscretisedDensity<3,elemT>& output, + const DiscretisedDensity<3,elemT>& input) const +{ + // TODO this function overlaps enormously with parabolic_surrogate_curvature + // the only difference is that parabolic_surrogate_curvature uses input==1 + + assert( output.has_same_characteristics(input)); + if (this->penalisation_factor==0) + { + return Succeeded::yes; + } + + DiscretisedDensityOnCartesianGrid<3,elemT>& output_cast = + dynamic_cast &>(output); + + if (weights.get_length() ==0) + { + compute_weights(weights, output_cast.get_grid_spacing(), this->only_2D); + } + + const bool do_kappa = !is_null_ptr(kappa_ptr); + + if (do_kappa && !kappa_ptr->has_same_characteristics(input)) + error("QuadraticPrior: kappa image has not the same index range as the reconstructed image\n"); + + const int min_z = output.get_min_index(); + const int max_z = output.get_max_index(); + for (int z=min_z; z<=max_z; z++) + { + const int min_dz = max(weights.get_min_index(), min_z-z); + const int max_dz = min(weights.get_max_index(), max_z-z); + + const int min_y = output[z].get_min_index(); + const int max_y = output[z].get_max_index(); + + for (int y=min_y;y<= max_y;y++) + { + const int min_dy = max(weights[0].get_min_index(), min_y-y); + const int max_dy = min(weights[0].get_max_index(), max_y-y); + + const int min_x = output[z][y].get_min_index(); + const int max_x = output[z][y].get_max_index(); + + for (int x=min_x;x<= max_x;x++) + { + const int min_dx = max(weights[0][0].get_min_index(), min_x-x); + const int max_dx = min(weights[0][0].get_max_index(), max_x-x); + + elemT result = 0; + for (int dz=min_dz;dz<=max_dz;++dz) + for (int dy=min_dy;dy<=max_dy;++dy) + for (int dx=min_dx;dx<=max_dx;++dx) + { + elemT current = + weights[dz][dy][dx] * input[z+dz][y+dy][x+dx]; + + if (do_kappa) + current *= + (*kappa_ptr)[z][y][x] * (*kappa_ptr)[z+dz][y+dy][x+dx]; + result += current; + } + + output[z][y][x] += result * this->penalisation_factor; + } + } + } + return Succeeded::yes; +} + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + + +template class QuadraticPrior; + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/RayTraceVoxelsOnCartesianGrid.cxx b/src/recon_buildblock/RayTraceVoxelsOnCartesianGrid.cxx new file mode 100644 index 0000000000..8d445e7612 --- /dev/null +++ b/src/recon_buildblock/RayTraceVoxelsOnCartesianGrid.cxx @@ -0,0 +1,278 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup recon_buildblock + + \brief Implementation of RayTraceVoxelsOnCartesianGrid + + \author Kris Thielemans + \author Mustapha Sadki + \author (loosely based on some C code by Matthias Egger) + \author PARAPET project + +*/ +/* Modification history: + KT 30/05/2002 + start and stop point can now be arbitrarily located + treatment of LORs parallel to planes is now scale independent (and checked with asserts) + KT 18/05/2005 + handle LORs in a plane between voxels +*/ + +#include "stir/recon_buildblock/RayTraceVoxelsOnCartesianGrid.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/round.h" +#include +#include + +#ifndef STIR_NO_NAMESPACE +using std::min; +using std::max; +#endif + +START_NAMESPACE_STIR + +static inline bool +is_half_integer(const float a) +{ + return + fabs(floor(a)+.5F - a)<.0001F; +} + +void +RayTraceVoxelsOnCartesianGrid + (ProjMatrixElemsForOneBin& lor, + const CartesianCoordinate3D& start_point, + const CartesianCoordinate3D& stop_point, + const CartesianCoordinate3D& voxel_size, + const float normalisation_constant) +{ + + const CartesianCoordinate3D difference = stop_point-start_point; + + if (norm(difference)<=.00001F) + { + // TODO + // not sure how to handle this case as we're normally ray tracing from voxel edges + warning("ray tracing with equal start and end point. Returning zero"); + return; + } + + // Find number of contributing elements. This will be used to + // make sure there's enough space in the LOR to avoid reallocation. + // This will make it faster, but also avoid over-allocation + // (as most STL implementations double the allocated size at over-run). + const int unsigned lor_size = + static_cast(ceil(fabs(difference.z())) + + ceil(fabs(difference.y())) + + ceil(fabs(difference.x()))) + 3; + + // d12 is distance between the 2 points + // it turns out we can multiply here with the normalisation_constant + // (as that just scales the coordinate system) + const float d12 = + static_cast(norm(difference*voxel_size) * normalisation_constant); + + const int sign_x = difference.x()>=0 ? 1 : -1; + const int sign_y = difference.y()>=0 ? 1 : -1; + const int sign_z = difference.z()>=0 ? 1 : -1; + + /* parametrise line in grid units as + {z,y,x} = start_point + a difference/d12 + So, a step in x towards stop_point will mean a corresponding step inc_x in a + x+sign_x - x = inc_x difference.x()/d12 + or + inc_x = d12*sign_x/difference.x() + i.e. inc_x is always positive + + Special treatment is necessary when the line is parallel to one of the + coordinate planes. This is determined by comparing difference with the + constant small_difference below. (Note that difference is in grid-units, so + it has a natural scale of 1.) + */ + const float small_difference = 1.E-4F; + const bool zero_diff_in_x = fabs(difference.x())<=small_difference; + const bool zero_diff_in_y = fabs(difference.y())<=small_difference; + const bool zero_diff_in_z = fabs(difference.z())<=small_difference; + + /* check if ray is in one of the planes between voxels. + If so, we will ray trace twice, i.e. to the 'left' and 'right', and store half + the value for each voxel. + */ + { + CartesianCoordinate3D inc(0,0,0); + // z + if (zero_diff_in_z && is_half_integer(start_point.z())) + { + inc = CartesianCoordinate3D (.5F,0,0); + } + else if (zero_diff_in_y && is_half_integer(start_point.y())) + { + inc = CartesianCoordinate3D (0,.5F,0); + } + else if (zero_diff_in_x && is_half_integer(start_point.x())) + { + inc = CartesianCoordinate3D (0,0,.5F); + } + if (norm(inc)>.1) + { + lor.reserve(lor.size() + 2*lor_size); + RayTraceVoxelsOnCartesianGrid(lor, + start_point - inc, + stop_point - inc, + voxel_size, + normalisation_constant/2); + + RayTraceVoxelsOnCartesianGrid(lor, + start_point + inc, + stop_point + inc, + voxel_size, + normalisation_constant/2); + lor.sort(); + return; + } + } + + // now start the normal case + assert(!(zero_diff_in_z && is_half_integer(start_point.z()))); + assert(!(zero_diff_in_y && is_half_integer(start_point.y()))); + assert(!(zero_diff_in_x && is_half_integer(start_point.x()))); + + lor.reserve(lor.size() + lor_size); + + const float inc_x = zero_diff_in_x ? d12*1000000.F : d12 / fabs(difference.x()); + const float inc_y = zero_diff_in_y ? d12*1000000.F : d12 / fabs(difference.y()); + const float inc_z = zero_diff_in_z ? d12*1000000.F : d12 / fabs(difference.z()); + + // intersection points with intra-voxel planes : + // find voxel which contains the end_point, and go to its 'right' edge + const float xmax = round(stop_point.x()) + sign_x*0.5F; + const float ymax = round(stop_point.y()) + sign_y*0.5F; + const float zmax = round(stop_point.z()) + sign_z*0.5F; + + /* Find a?end for the last intersections with the coordinate planes. + amax will then be the smallest of all these a?end. + + If the LOR is parallel to a plane, take care that its a?end is larger than all the others. + Note that axend <= d12 (difference.x()+1)/difference.x() + + In fact, we will take a?end slightly smaller than the actual last value (i.e. we multiply + with a factor .9999). This is to avoid rounding errors in the loop below. In this loop, + we try to detect the end of the LOR by comparing a (which is either ax,ay or az) with + aend. With exact arithmetic, a? would have been incremented exactly to + a?end_exact = a?start + (?max-?end)*inc_?*sign_?, + so we could loop until a==aend_exact. However, because of numerical precision, + a? might turn out be a tiny bit smaller then a?end_exact. So, we set aend a tiny bit + smaller than aend_exact. + */ +const float axend = zero_diff_in_x ? d12*1000000.F : (xmax - start_point.x()) * inc_x * sign_x *.9999F; + const float ayend = zero_diff_in_y ? d12*1000000.F : (ymax - start_point.y()) * inc_y * sign_y *.9999F; + const float azend = zero_diff_in_z ? d12*1000000.F : (zmax - start_point.z()) * inc_z * sign_z *.9999F; + + const float amax = min(axend, min(ayend, azend)); + + // just to be sure, check that axend was set large enough when difference.x() was small. + assert(fabs(difference.x())>small_difference || axend>amax); + assert(fabs(difference.y())>small_difference || ayend>amax); + assert(fabs(difference.z())>small_difference || azend>amax); + + // coordinates of the first Voxel: + CartesianCoordinate3D current_voxel = round(start_point); + + /* Find the a? values of the intersection points of the LOR with the planes between voxels + at the 'left' side of the start_point.. + This normally goes as follows: + + const float xmin = current_voxel.x() - sign_x*0.5F; + float ax=(xmin - start_point.x()) * inc_x * sign_x; + + We will compute this slightly differently below to increase numerical precision: + xmin - start_point.x() is between -1 and 1, while start_point.x() is potentially large. + Subtracting 2 large floating point numbers to get a small number causes loss + of numerical precision. + + Note on special handling of rays parallel to one of the planes: + + The corresponding a? value would be -infinity. We just set it to + a value low enough such that the start value of 'a' is not compromised + further on. + Normally + a? = (?min-start_point.?) * inc_? * sign_? + Because the start voxel includes the start_point, we have that + a? <= -inc_? + As inc_? is set to some large number when the ray is parallel, we can use + -inc_? is a very low number. + */ + // with the previous xy-plane + float az = zero_diff_in_z ? -inc_z : + ((current_voxel.z() - start_point.z()) - sign_z*0.5F) * inc_z * sign_z; + // with the previous yz-plane + float ax = zero_diff_in_x ? -inc_x : + ((current_voxel.x() - start_point.x()) - sign_x*0.5F) * inc_x * sign_x; + // with the previous xz-plane + float ay = zero_diff_in_y ? -inc_y : + ((current_voxel.y() - start_point.y()) - sign_y*0.5F) * inc_y * sign_y; + + // The biggest a? value gives the start of the a-row + // Note that we should use a=0 if we want to start from start_point + // (and not from the 'left' edge of the voxel containing start_point) + float a = max(ax, max(ay,az)); + + // now go the intersections with next plane + if (zero_diff_in_x) ax = axend; else ax += inc_x; + if (zero_diff_in_y) ay = ayend; else ay += inc_y; + if (zero_diff_in_z) az = azend; else az += inc_z; + + // just to be sure, check that ax was set large enough when difference.x() was small. + assert(!zero_diff_in_x || ax>amax); + assert(!zero_diff_in_y || ay>amax); + assert(!zero_diff_in_z || az>amax); + + { + // go along the LOR + while ( a < amax) { + if ( ax < ay ) + if ( ax < az ) + { // LOR leaves voxel through yz-plane + lor.push_back(ProjMatrixElemsForOneBin::value_type(current_voxel,ax - a)); + a = ax;ax += inc_x; + current_voxel.x()+=sign_x; + } + else{ // LOR leaves voxel through xy-plane + lor.push_back(ProjMatrixElemsForOneBin::value_type(current_voxel,az - a)); + a = az ; az += inc_z; + current_voxel.z()+=sign_z; + } + else if ( ay < az) { // LOR leaves voxel through xz-plane + lor.push_back(ProjMatrixElemsForOneBin::value_type(current_voxel,ay - a)); + a = ay; ay += inc_y; + current_voxel.y()+=sign_y; + } + else {// LOR leaves voxel through xy-plane + lor.push_back(ProjMatrixElemsForOneBin::value_type(current_voxel,az - a )); + a = az; az += inc_z; + current_voxel.z()+=sign_z; + } + } // end of while (a +void +Reconstruction::set_defaults() +{ + this->output_filename_prefix=""; + this->output_file_format_ptr = + OutputFileFormat::default_sptr(); + this->post_filter_sptr.reset(); + +} + +template +void +Reconstruction::initialise_keymap() +{ + + this->parser.add_key("output filename prefix",&this->output_filename_prefix); + this->parser.add_parsing_key("output file format type", &this->output_file_format_ptr); + this->parser.add_parsing_key("post-filter type", &this->post_filter_sptr); + +// parser.add_key("END", &KeyParser::stop_parsing); + +} + +template +void +Reconstruction::initialise(const string& parameter_filename) +{ + if(parameter_filename.size()==0) + { + this->set_defaults(); + this->ask_parameters(); + } + +else + { + this->set_defaults(); + if(!this->parse(parameter_filename.c_str())) + { + error("Error parsing input file %s, exiting", parameter_filename.c_str()); + } + + } +} + + +template +bool +Reconstruction:: +post_processing() +{ + if (this->output_filename_prefix.length() == 0)// KT 160899 changed name of variable + { warning("You need to specify an output prefix"); return true; } + + if (is_null_ptr(this->output_file_format_ptr)) + { warning("output file format has to be set to valid value"); return true; } + + return false; +} + +template +void +Reconstruction:: +set_output_filename_prefix(const string& arg) +{ + this->output_filename_prefix = arg; +} + +template +void +Reconstruction:: +set_output_file_format_ptr(const shared_ptr >& arg) +{ + this->output_file_format_ptr = arg; +} + +template +void +Reconstruction:: +set_post_processor_sptr(const shared_ptr > & arg) +{ + this->post_filter_sptr = arg; +} + +template +Succeeded +Reconstruction:: +set_up(shared_ptr const& target_data_sptr) +{ + + if(!is_null_ptr(this->post_filter_sptr)) + { + info("Building post filter kernel"); + + if (this->post_filter_sptr->set_up(*target_data_sptr) + == Succeeded::no) + { + warning("Error building post filter"); + return Succeeded::no; + } + } + return Succeeded::yes; +} + +template class Reconstruction >; +template class Reconstruction; +template class Reconstruction; +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/RegisteredObject.cxx b/src/recon_buildblock/RegisteredObject.cxx new file mode 100644 index 0000000000..b7cc2fffbf --- /dev/null +++ b/src/recon_buildblock/RegisteredObject.cxx @@ -0,0 +1,84 @@ +// +// +/*! + + \file + \ingroup recon_buildblock + \brief instantiations of stir::RegisteredObject for classes in recon_buildblock + (only useful for Microsoft Visual Studio 6.0) + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +// note: include has to be before #ifdef as it's in this file that +// __STIR_REGISTRY_NOT_INLINE is defined +#include "stir/RegisteredObject.h" + +#ifdef __STIR_REGISTRY_NOT_INLINE + +#pragma message("instantiating RegisteredObject >") +#include "stir/recon_buildblock/GeneralisedPrior.h" + +#pragma message("instantiating RegisteredObject") +#include "stir/recon_buildblock/ProjMatrixByBin.h" + +#pragma message("instantiating RegisteredObject") +#include "stir/recon_buildblock/ProjectorByBinPair.h" + +#pragma message("instantiating RegisteredObject") +#include "stir/recon_buildblock/ForwardProjectorByBin.h" + +#pragma message("instantiating RegisteredObject") +#include "stir/recon_buildblock/BackProjectorByBin.h" + +#pragma message("instantiating RegisteredObject") +#include "stir/recon_buildblock/BinNormalisation.h" + +// and others +START_NAMESPACE_STIR + +template +RegisteredObject::RegistryType& +RegisteredObject::registry () +{ + static RegistryType the_registry("None", 0); + return the_registry; +} + +# ifdef _MSC_VER +// prevent warning message on reinstantiation, +// note that we get a linking error if we don't have the explicit instantiation below +# pragma warning(disable:4660) +# endif + + +template RegisteredObject >; + +template RegisteredObject; + +template RegisteredObject; + +template RegisteredObject; + +template RegisteredObject; + +template RegisteredObject; +END_NAMESPACE_STIR + +#endif diff --git a/src/recon_buildblock/SPECTUB_Tools.cxx b/src/recon_buildblock/SPECTUB_Tools.cxx new file mode 100644 index 0000000000..0d809f696d --- /dev/null +++ b/src/recon_buildblock/SPECTUB_Tools.cxx @@ -0,0 +1,1066 @@ +/* + Copyright (c) 2013, Biomedical Image Group (GIB), Universitat de Barcelona, Barcelona, Spain. + Copyright (c) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \author Carles Falcon +*/ + +//system libraries +#include +#include +#include +#include +#include +#include +#include "stir/error.h" +#include + +using namespace std; +//using std::string; + +//... user defined libraries ....................................... + +#include "stir/recon_buildblock/SPECTUB_Tools.h" +#include "stir/recon_buildblock/SPECTUB_Weight3d.h" + + +namespace SPECTUB { + +#define NUMARG 29 + +#define EPSILON 1e-12 +#define EOS '\0' + +#define maxim(a,b) ((a)>=(b)?(a):(b)) +#define minim(a,b) ((a)<=(b)?(a):(b)) +#define abs(a) ((a)>=0?(a):(-a)) +#define SIGN(a) (a<-EPSILON?-1:(a>EPSILON?1:0)) + +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +#define DELIMITER1 '#' //delimiter character in input parameter text file +#define DELIMITER2 '%' //delimiter character in input parameter text file + +//... global variables .............................................. + +extern wm_da_type wm; +extern wmh_type wmh; +extern float * Rrad; + + +//============================================================================= +//=== write_wm_FC ============================================================= +//============================================================================= + +void write_wm_FC() +{ + FILE *fid; + + int ia_acum = 0; + + if ( (fid = fopen( wm.OSfn.c_str(), "wb" ) ) == NULL ) error_wmtools_SPECT( 31, wm.OSfn ); + + fwrite ( &(wm.NbOS), sizeof(int), 1, fid); // to write number of rows of wm (NbOS) + fwrite ( &(wm.Nvox), sizeof(int), 1, fid); // to write number of columns of wm (Nvox) + + //... number of non-zero elements in the weight matrix ....... + + int ne = 0; + for ( int j=0 ; j < wm.NbOS ; j++ ) ne += wm.ne[j]; + + fwrite ( &ne, sizeof(int), 1, fid); // to write number of non-zeros element in the weight matrix + + //... to write the array of weights (along rows) .............. + + for ( int i = 0 ; i < wm.NbOS ; i++ ){ + for (int j = 0 ; j < wm.ne[i] ; j++ ){ + fwrite ( &wm.val[ i ][ j ], sizeof(float), 1, fid); + } + } + + //... to write the column index of each weight (volume index of the voxel the weight is associated to) .... + + for ( int i = 0 ; i < wm.NbOS ; i++ ){ + for ( int j = 0 ; j < wm.ne[ i ] ; j++ ){ + fwrite ( &wm.col[ i ][ j ] ,sizeof(int) ,1 , fid); + } + } + + //... to write the indexs of the array of weights where a change of row happens ......... + + for ( int i = 0 ; i < wm.NbOS ; i++ ){ + fwrite ( &ia_acum, sizeof(int), 1, fid); + ia_acum += wm.ne[i]; + } + + //... to write the total number of saved weights .......................... + + fwrite ( &ia_acum, sizeof(int), 1, fid); + + cout << "number of non-zero elemnts: " << ia_acum << endl; + + fclose (fid); +} + +//============================================================================= +//=== write_wm_hdr ============================================================ +//============================================================================= + +void write_wm_hdr() +{ + ofstream stream1( wm.fn_hdr.c_str() ); + if( !stream1 ) error_wmtools_SPECT( 31, wm.fn_hdr ); + + //....... image and projections characteristics......... + + stream1 << "Header for the matrix: " << wm.fn << endl; + stream1 << "number of columns: " << wmh.vol.Ncol << endl; + stream1 << "number of rows: " << wmh.vol.Nrow << endl; + stream1 << "number of slices: " << wmh.vol.Nsli << endl; + stream1 << "voxel size (cm): " << wmh.vol.szcm << endl; + stream1 << "slice thickness (cm): " << wmh.vol.thcm << endl; + + stream1 << "number of bins per line: " << wmh.prj.Nbin << endl; + stream1 << "bin size (cm): " << wmh.prj.szcm << endl; + stream1 << "number of angles: " << wmh.prj.Nang << endl; + stream1 << "first angle (deg): " << wmh.prj.ang0 << endl; + stream1 << "angle increment between consecutive projections (deg): " << wmh.prj.incr << endl; + + stream1 << "first slice to reconstruct : " << wmh.vol.first_sl << endl; + stream1 << "last slice to reconstruct : " << wmh.vol.last_sl << endl; + stream1 << "number of subsets in which to split the matrix: " << wmh.prj.NOS << endl; + stream1 << "number of angles per subsets: " << wmh.prj.NangOS << endl; + + stream1 << "minimum weight (geometrical contribution): " << wmh.min_w << endl; + stream1 << "psf resolution (discretization interval for Gaussian): " << wmh.psfres << endl; + stream1 << "maximum number of sigmas in psf calculation: " << wmh.maxsigm << endl; + + //........ rotation radius................................ + + if ( wmh.fixed_Rrad ) stream1 << "fixed rotation radius :" << wmh.Rrad[ 0 ] << " cm" << endl; + else stream1 << "variable rotation radius from :" << wmh.Rrad_fn << endl; + + //......... psf and collimator parameters ................. + + + stream1 << "psf correction: " << wmh.do_psf << endl; + if ( wmh.do_psf ){ + if ( wmh.do_psf_3d ) stream1 << "\tmode: 3d " << endl; + else stream1 << "\tmode: 2d " << endl; + if ( wmh.predef_col ) stream1 << "\tpredefined collimator number: " << wmh.COL.num << endl; + else stream1 << "\tcollimator parameters from: " << wmh.col_fn << endl; + + if ( wmh.COL.do_fb ) stream1 << "collimator geometry: fanbeam " << endl; + else stream1 << "collimator geometry: parallel" << endl; + } + else{ + if ( wmh.COL.num == 0 ) stream1 << "collimator geometry: parallel " << endl; + else stream1 << "collimator geometry: fanbeam with focal distance : " << wmh.COL.F << endl; + } + + stream1 << "attenuation correction: " << wmh.do_att << endl; + if ( wmh.do_att ){ + if ( wmh.do_full_att ) stream1 << "\tmode: full " << endl; + else stream1 << "\tmode: simple " << endl; + } + stream1 << "\tattenuation map: " << wmh.att_fn << endl; + + //......... masking .................................... + + stream1 << "masking: " << wmh.do_msk << endl; + if ( wmh.do_msk ){ + if ( wmh.do_msk_cyl ) stream1 << "\tmask type: cyl" << endl; + if ( wmh.do_msk_att ) stream1 << "\tmask type: att" << endl; + if ( wmh.do_msk_file ){ + stream1 << "\tmask type: file" << endl; + stream1 << "\tmask file name: " << wmh.msk_fn << endl; + } + if ( wmh.do_msk_slc ){ + stream1 << "first slice: " << wmh.vol.first_sl << endl; + stream1 << "last slice: " << wmh.vol.last_sl << endl; + } + + } + stream1.close(); +} + +//============================================================================= +//=== write_wm_STIR =========================================================== +//============================================================================= + +void write_wm_STIR() +{ + int seg_num = 0; // segment number for STIR matrix (always zero) + FILE *fid; + + if ( ( fid = fopen( wm.OSfn.c_str() , "wb" )) == NULL ) error_wmtools_SPECT( 31, wm.OSfn ); + + //...loop for matrix elements: projection index .................. + + for( int j = 0 ; j < wm.NbOS ; j++ ){ + + //... to write projection indices and number of elements ....... + + fwrite( &seg_num, sizeof(int), 1, fid); + fwrite( &wm.na [ j ], sizeof(int), 1, fid); + fwrite( &wm.ns [ j ], sizeof(int), 1, fid); + fwrite( &wm.nb [ j ], sizeof(int), 1, fid); + fwrite( &wm.ne [ j ], sizeof(int), 1, fid); + + //... loop for matrix elements: image indexs.................. + + for ( int i = 0 ; i < wm.ne[ j ] ; i++ ){ + + fwrite( &wm.nz[ wm.col[ j ][ i ] ], sizeof(short int), 1, fid); + fwrite( &wm.ny[ wm.col[ j ][ i ] ], sizeof(short int), 1, fid); + fwrite( &wm.nx[ wm.col[ j ][ i ] ], sizeof(short int), 1, fid); + fwrite( &wm.val[ j ][ i ], sizeof(float),1,fid); + } + } + fclose( fid ); +} + +//============================================================================= +//=== index_calc ============================================================== +//============================================================================= + +void index_calc ( int *indexs ) +{ + if ( wmh.prj.NOS == 1 ){ + for ( int i = 0 ; i < wmh.prj.Nang ; i++ ){ + indexs[ i ] = i; // when one single matrix, sequential order + } + } + else{ + int j, *ple, *iOS, *a, *sa, *dif ; + + iOS = new int [ wmh.prj.NOS ]; + ple = new int [ wmh.prj.NOS ]; + a = new int [ wmh.prj.NOS ]; + sa = new int [ wmh.prj.NOS ]; + dif = new int [ wmh.prj.NOS + 1 ]; + + //... to initialize variables .................................. + + for ( int i = 0 ; i < wmh.prj.NOS ; i++ ){ + iOS[ i ] = ple[ i ] = a[ i ] = sa[ i ] = dif[ i ] = 0; + } + dif[ wmh.prj.NOS ] = 0; + ple[ 0 ] = 1; + + //... to fill differences vector ................................. + + int OS2 = wmh.prj.NOS * wmh.prj.NOS ; + + for ( int i = 1 ; i <= wmh.prj.NOS ; i++ ){ + dif[ i ] += 2 * ( i * ( i - wmh.prj.NOS ) ) + OS2 ; + } + + //... first angle for each subset: angle having a maximum distance with all precedent angles ... + + int im = 0; // first index is always set to zero + + for ( int k = 1 ; k < wmh.prj.NOS ; k++ ){ + + for ( int i = 1 ; i < wmh.prj.NOS ; i++ ){ + if( !ple[ i ] ){ + j = i - im; + a[ i ] = dif[ abs( j ) ]; + } + } + + for( int i = 0 ; i < wmh.prj.NOS ; i++ ){ + a[ i ] *= ( 1 - ple[ i ] ); + sa[ i ] *= ( 1 - ple[ i ] ); + sa[ i ] += a[ i ]; + } + + int m = 0; + int n = 0; + + for ( int i = 0 ; i < wmh.prj.NOS ; i++ ){ + m = maxim( m, sa[ i ] ); + } + + for( int i = 1 ; i < wmh.prj.NOS ; i++ ){ + if( !ple[ i ] ){ + m = minim( m, sa[ i ] ); + } + } + + for ( int i = 1 ; i < wmh.prj.NOS ; i++ ){ + if( sa[ i ] == m ){ + n = maxim( n, a[i] ); + } + } + for ( int i = wmh.prj.NOS - 1 ; i > 0 ; i-- ){ + if( sa[ i ] == m ){ + if( a[ i ] <= n ){ + n = a[ i ]; + im = i; + } + } + } + iOS[ k ] = im; + ple[ im ] = 1; + } + + //... to fill the rest of angles of each subset ................ + + for( int i = 0 ; i < wmh.prj.NOS ; i++ ){ + + for( int j = 0 ; j < wmh.prj.NangOS ; j++ ){ + + indexs[ i * wmh.prj.NangOS + j ] = iOS[ i ] + wmh.prj.NOS * j; + } + } + + delete [] iOS; + delete [] a; + delete [] sa; + delete [] dif; + delete [] ple; + } + +} + +//============================================================================= +//=== read rotation radius ================================================== +//============================================================================= + +void read_Rrad() +{ + string line; + ifstream stream1( wmh.Rrad_fn.c_str() ); + if( !stream1 ) error_wmtools_SPECT( 114, wmh.Rrad_fn ); + + int i = 0; + + while ( !stream1.eof() ){ + getline ( stream1, line ); + Rrad[ i ] = atof ( line.c_str() ); + i++; + } + + if ( i != wmh.prj.Nang ) error_wmtools_SPECT( 11, wmh.Rrad_fn ); + stream1.close(); + + return; +} + +//============================================================================= +//=== col params ============================================================== +//============================================================================= + +//void col_params( collim_type *COL ) +//{ +// cout << "Using collimator: " << COL->num << endl; +// +// switch(COL->num){ +// +// case 1: //...................fanbeam: ELSCINT +// COL->F = (float)35.5; +// COL->L = (float)4.; +// COL->A_h = (float)0.3369; +// COL->A_v = (float)0.3369; +// COL->D = (float)0.8; +// COL->w = (float)0.0866; +// COL->insgm = (float)0.17; +// COL->do_fb = true; +// break; +// +// case 2: //....................fanbeam: ELSCINT D=0 +// COL->F = (float)35.5; +// COL->L = (float)4.; +// COL->A_h = (float)0.3369; +// COL->A_v = (float)0.3369; +// COL->D = (float)0.; +// COL->w = (float)0.0866; +// COL->insgm = (float)0.17; +// COL->do_fb = true; +// break; +// +// case 3: //....................parallel 3: low resolution +// COL->A = (float)0.0275; +// COL->B = (float)0.2; +// COL->do_fb = false; +// break; +// +// case 4: //....................parallel 4: high resolution +// COL->A = (float)0.0172; +// COL->B = (float)0.2; +// COL->do_fb = false; +// break; +// +// case 5: //....................parallel 5: (ECAM) +// COL->A = (float)0.0167; +// COL->B = (float)0.1405; +// COL->do_fb = false; +// break; +// +// case 6: //....................fan_beam: prism3000 +// COL->F = (float)65.0; +// COL->L = (float)2.7; +// COL->A_h = (float)0.3575; +// COL->A_v = (float)0.3360; +// COL->D = (float)0.0; +// COL->w = (float)0.0866; +// COL->insgm = (float)0.17; +// COL->do_fb = true; +// break; +// +// case 10: //...................parallel: ECAM with L=40 mm +// COL->A = (float)0.0101; +// COL->B = (float)0.0998; +// COL->do_fb = false; +// break; +// +// case 11: //...................fan beam ELSCINT L=2,405 cm +// COL->F = (float)35.5; +// COL->L = (float)2.405; +// COL->A_h = (float)0.3369; +// COL->A_v = (float)0.3369; +// COL->D = (float)0.8; +// COL->w = (float)0.0866; +// COL->insgm = (float)0.17; +// COL->do_fb = true; +// break; +// +// case 13: //...................parallel: Hammamatsu collimator +// COL->A = (float)0.0205; +// COL->B = (float)0.10245; +// COL->do_fb = false; +// break; +// +// case 14: //...................parallel. hexagonal holes. apotema=0.57mm, L=24mm, s=0.125mm +// COL->A = (float)0.0178; +// COL->B = (float)0.0886; +// COL->do_fb = false; +// break; +// +// case 15: //...................parallel. hexagonal holes apotema=0.57mm, L=24mm, s=0.125mm +// COL->A = (float)0.0247; +// COL->B = (float)0.0752; +// COL->do_fb = false; +// break; +// +// case 16: //...................parallel: Sentinella S102 colimador: experimental parameters +// COL->A = (float)0.0166; +// COL->B = (float)0.0924; +// COL->do_fb = false; +// break; +// +// case 17: //...................parallel Infinia Hawkeye: experimental parametres +// COL->A = (float)0.0163; +// COL->B = (float)0.1466; +// COL->do_fb = false; +// break; +// +// default: +// char p[3]; // auxiliar variable for itoa +// error_wmtools_SPECT( 21, itoa(COL->num,p)); +// } +//} + +///============================================================================= +//=== read collimator params ================================================== +//============================================================================= + +//void read_col_params( collim_type *COL ) +//{ +// string line; +// ifstream stream1( wmh.col_fn.c_str() ); +// if( !stream1 ) error_wmtools_SPECT( 122, wmh.col_fn ); +// +// getline ( stream1, line ); +// +// if ( line[ 0 ] == 'f' ) COL->do_fb = true; +// else{ +// if ( line[ 0 ] == 'p' ) COL->do_fb = false; +// else error_wmtools_SPECT( 12, wmh.col_fn); +// } +// +// if ( COL->do_fb ){ +// +// getline ( stream1, line ); +// COL->F = atof( line.c_str() ); // Focal length (cm) +// +// getline ( stream1, line ); +// COL->L = atof( line.c_str() ); // collimator to detector distance (? cm) +// +// getline ( stream1, line ); +// COL->A_h = atof( line.c_str() ); // linear factor for dependency of sigma on distance (fanbeam horizontal) +// +// getline ( stream1, line ); +// COL->A_v = atof( line.c_str() ); // linear factor for dependency of sigma on distance (fanbeam vertical) +// +// getline ( stream1, line ); +// COL->D = atof( line.c_str() ); // (?) +// +// getline ( stream1, line ); +// COL->w = atof( line.c_str() ); // collimator thickness (? cm) +// +// if( !stream1.eof() ) error_wmtools_SPECT( 13, wmh.col_fn ); +// +// getline ( stream1, line ); +// COL->insgm = atof( line.c_str() ); // intrinsic sigma (cristal resolution cm?) +// +// } +// else{ +// getline ( stream1, line ); +// COL->A = atof( line.c_str() ); // linear factor for dependency of sigma on distance (parallel): sigma=A*dist+B +// +// if( !stream1.eof() ) error_wmtools_SPECT( 13, wmh.col_fn ); +// +// getline ( stream1, line ); +// COL->B = atof( line.c_str() ); // Independent factor for dependency of sigma on distance: sigma=A*dist+B +// } +// +// stream1.close(); +// return; +//} + + +//========================================================================== +//=== calc_sigma_v ========================================================= +//========================================================================== + +float calc_sigma_v( voxel_type vox, collim_type COL) +{ + float sigma; + if ( COL.do_fb ){ + float xc = (float)2. * COL.A_v * COL.w * ( vox.dv2dp + COL.L + COL.D ) / COL.L; + sigma = sqrt( COL.insgm * COL.insgm + xc * xc ); + + } + else sigma = COL.A * vox.dv2dp + COL.B ; + + return( sigma ); +} + + +//============================================================================= +//=== fill_ang ================================================================ +//============================================================================= + +void fill_ang ( angle_type *ang ) +{ + float DX = (float) 0.5 / wmh.psfres ; + float dg2rd = (float)M_PI / (float)180. ; + + for ( int i = 0; i < wmh.prj.Nang ; i++ ){ + + //... ratios calculation ....................................................... + + float deg = wmh.prj.ang0 + (float)i * wmh.prj.incr ; // angle in degrees + ang[ i ].cos = cos( deg * dg2rd ); // cosinus of the angle + ang[ i ].sin = sin( deg * dg2rd ); // sinus of the angle + + //... first octane (0->45º) equivalent angle and its trigonometric ratios ....... + + float angR = fabs( deg ); + int quad = (int) floor( angR / (float)90. ); // quadrant + + angR = fabs( angR - (float)90. * (float)quad ); // reduced angle: equivalent angle in 0->45º interval + if ( angR > (float)45. ) angR = fabs( (float)90. - angR ); + + float sinR = (float)sin( angR * dg2rd ); // sinus of the reduced angle + float cosR = (float)cos( angR * dg2rd ); // cosinus of the reduced angle + + //... parametres of the oblique projection of a square voxel size 1 (half a trapezoid) ....... + + if ( !wmh.do_psf ){ + + if ( angR < EPSILON ){ + + ang[ i ].p = (float)1. ; + ang[ i ].N1 = ang[ i ].N2 = (int) floor( DX ); + ang[ i ].m = ang[ i ].n = (float)0.; + } + else{ + ang[ i ].p = (float)1. / cosR; // plateau highness + ang[ i ].m = -wmh.psfres / ( sinR * cosR ); // slope of the trapezoid in DX units (negative) + ang[ i ].n = ( cosR + sinR ) * (float)0.5 / ( cosR * sinR ); // independent term of the slope of the trapezoid (cm) + ang[ i ].N1 = (int) floor( (float) fabs( cosR - sinR ) * DX ); // index of the first vertice (end of plateau) in res units + ang[ i ].N2 = (int) floor( ( cosR + sinR ) * DX ); // index of the second vertice (end of the slope) in res units + } + + ang[ i ].vxprj.lngd2 = ang[ i ].N2; + ang[ i ].vxprj.lng = 2 * ang[ i ].N2; + ang[ i ].vxprj.res = wmh.psfres; + } + //... rotation radius ................................................................ + + ang[ i ].Rrad = Rrad[ i ]; // assignation of (variable) rotation radius + + //... coordinates of the first bin of each projection and increments for consecutive bins .... + + if(wmh.do_att){ + + ang[ i ].incx = wmh.prj.szcm * ang[ i ].cos; + ang[ i ].incy = wmh.prj.szcm * ang[ i ].sin; + + ang[ i ].xbin0 = -ang[ i ].Rrad * ang[ i ].sin - wmh.prj.lngcmd2 * ang[ i ].cos ; + ang[ i ].ybin0 = ang[ i ].Rrad * ang[ i ].cos - wmh.prj.lngcmd2 * ang[ i ].sin ; + } + } +} + +//============================================================================= +//=== generate msk ============================================================ +//============================================================================= + +void generate_msk ( bool *msk_3d, bool *msk_2d, float *attmap, volume_type * vol ) +{ + //... initialzation of msk to true ......................... + + for ( int i = 0 ; i < vol->Nvox ; i++ ){ + msk_3d[ i ] = true; + } + + //... initialzation of msk_2d to false ..................... + + for ( int i = 0 ; i < vol->Npix ; i++ ){ + msk_2d[ i ] = false; + } + + //... to create mask from attenuation map .................. + + if ( wmh.do_msk_att ){ + for ( int i = 0 ; i < wmh.vol.Nvox ; i++ ){ + msk_3d[ i ] = ( attmap[ i ] > EPSILON ); + } + } + else { + //... to create a cylindrical mask...................... + + if (wmh.do_msk_cyl){ + + float Rmax2,xi,yi; + + if ( vol->Nrow >= vol->Ncol ) Rmax2 = vol->Nrowd2 * vol->Nrowd2; // Maximum allowed radius (distance from volume centre) + else Rmax2 = vol->Ncold2 * vol->Ncold2; + + int ip = -1; // in-plane index of the voxel + + for ( int i = 0 ; i < vol->Ncol ; i++ ){ + + xi = i - vol->Ncold2 + (float)0.5 ; + xi *= xi; + + for ( int j=0 ; j < vol->Nrow ; j++ ){ + + ip++; + yi = j - vol->Nrowd2 + (float)0.5 ; + yi *= yi; + + if ( ( xi + yi ) > Rmax2 ){ + + for ( int k = 0 ; k < vol->Nsli ; k ++){ + + msk_3d[ ip + k * vol->Npix ] = false; // loop for all the slices + } + } + } + } + } + + else { + //... to read a mask from a (int) file .................... + + if ( wmh.do_msk_file ) read_msk_file( msk_3d ); + } + } + + + //... to apply slice mask (to remove slices from matrix) .............. + + if ( wmh.do_msk_slc ){ + for ( int i = 0 ; i < wmh.vol.first_sl ; i++ ){ + for ( int j = 0 ; j < wmh.vol.Npix ; j++ ) { + msk_3d[ i * wmh.vol.Npix + j ] = false; + } + } + for ( int i = wmh.vol.last_sl ; i < wmh.vol.Nsli ; i++ ){ + for ( int j = 0 ; j < wmh.vol.Npix ; j++ ) { + msk_3d[ i * wmh.vol.Npix + j ] = false; + } + } + } + + //... to collapse mask to 2d_mask ......... + + if ( wmh.do_msk_cyl ){ + for ( int i = 0 ; i < wmh.vol.Npix ; i++ ){ + msk_2d[ i ] = msk_3d[ i + wmh.vol.first_sl * wmh.vol.Npix ]; + } + } + else{ + for ( int i = 0 ; i < wmh.vol.Npix ; i++ ){ + + for ( int k = wmh.vol.first_sl ; k < wmh.vol.last_sl ; k++ ){ + + if ( msk_3d[ k * wmh.vol.Npix + i ] ){ + msk_2d[ i ] = true; + break; + } + } + } + } +} + +//============================================================================= +//=== read_mask file ========================================================== +//============================================================================= + +void read_msk_file( bool *msk ) +{ + FILE *fid; + int *aux; + + aux = new int [ wmh.vol.Nvox ]; + + if ( (fid = fopen( wmh.msk_fn.c_str() , "rb")) == NULL) error_wmtools_SPECT( 126, wmh.msk_fn); + fread( aux, sizeof(int), wmh.vol.Nvox, fid); + fclose(fid); + + for (int i = 0 ; i < wmh.vol.Nvox ; i ++ ){ + msk[i] = ( aux[i] != 0 ); + } + + delete [] aux; +} + +//============================================================================= +//=== read_att_map ============================================================ +//============================================================================= + +void read_att_map( float *attmap ) +{ + FILE *fid; + if ( ( fid = fopen( wmh.att_fn.c_str() , "rb") ) == NULL ) error_wmtools_SPECT ( 124, wmh.att_fn ); + fread( attmap, sizeof(float), wmh.vol.Nvox, fid); + + bool exist_nan = false; + + for (int i = 0 ; i < wmh.vol.Nvox ; i++ ){ + if ((boost::math::isnan)(attmap [ i ])){ + attmap [ i ] = 0; + exist_nan = true; + } + } + + if ( exist_nan ) cout << "WARNING: att map contains NaN values. Converted to zero" << endl; + + fclose(fid); +} + +//========================================================================== +//=== max_psf_szb ========================================================== +//========================================================================== + +int max_psf_szb( angle_type *ang ) +{ + int maxszb; + float Rrad_max = ang[0].Rrad; + + for( int i = 1; i < wmh.prj.Nang ; i++ ){ + if ( ang[ i ].Rrad > Rrad_max ) Rrad_max = ang[ i ].Rrad; // maximum rotation radius + } + + if ( !wmh.do_psf ){ // NO-PSF + + if ( !wmh.COL.do_fb ){ // parallel + maxszb = (int)( (float) sqrt( (float)2. ) * wmh.vol.szcm / wmh.prj.szcm ) + 3; + } + + else{ // fanbeam + float dpmax = wmh.vol.szcm * maxim( wmh.vol.Ncold2, wmh.vol.Nrowd2) + Rrad_max; + + float lon = wmh.COL.F - dpmax; + if ( lon < EPSILON ) error_wmtools_SPECT( 46, ""); + + //... maximum lenght of psf in bins ........................ + + float f = (int)( (float) sqrt( (float)2. ) * (wmh.vol.szcm / wmh.prj.szcm) * ( wmh.COL.F / lon ) ) + 3; + maxszb = minim ( f , wmh.prj.Nbin ); + } + } + else{ // PSF + voxel_type vox; + + if ( wmh.COL.do_fb ){ + vox.costhe = (float)1. / sqrt( wmh.prj.lngcmd2 * wmh.prj.lngcmd2 / ( wmh.COL.F * wmh.COL.F ) + (float)1.); + } + //... maximum length of psf in bins ........................ + + vox.dv2dp = Rrad_max + wmh.vol.szcm * maxim( wmh.vol.Ncold2, wmh.vol.Nrowd2 ) * (float)1.5; + float sig_h_max_cm = calc_sigma_h( vox, wmh.COL ); + maxszb = (int)floor( wmh.maxsigm * (float)2. * sig_h_max_cm / wmh.prj.szcm ) + 3; + + if ( wmh.do_psf_3d ){ + float sig_v_max_cm = calc_sigma_v( vox, wmh.COL ); + int maxszb_v = (int)floor( wmh.maxsigm * (float)2. * sig_v_max_cm / wmh.prj.thcm ) + 3; + maxszb = maxim( maxszb , maxszb_v ); + } + } + + return( maxszb ); +} + +//========================================================================== +//=== calc_sigma_h ========================================================= +//========================================================================== + +float calc_sigma_h( voxel_type vox, collim_type COL ) +{ + float sigma; + + if ( COL.do_fb ){ + float denom = sqrt( COL.L * COL.L * (COL.F - vox.dv2dp) * (COL.F - vox.dv2dp) - COL.w * COL.w * (COL.L + (float)2. * vox.dv2dp) * (COL.L + (float)2. * vox.dv2dp)); + float xc = COL.A_h * (vox.dv2dp + COL.L + COL.D) * COL.w * ( (float)2. * COL.F + COL.L) / (vox.costhe * denom); + sigma = sqrt( COL.insgm * COL.insgm + xc * xc ); + } + else sigma = COL.A * vox.dv2dp + COL.B ; + + return( sigma ); +} + +//============================================================================= +//=== itoa ==================================================================== +//============================================================================= + +char *itoa(int n,char *s) +{ + int i,sign; + char c; + + if((sign=n)<0) { + n=-n; + } + + i=0; + do{ + s[i++]=n%10+'0'; + } + while((n/=10)>0); + + if(sign<0) { + s[i++]='-'; + } + + s[i]=EOS; + + for(int low=0,hi=i-1;lowar; + delete [] f->ja; + delete [] f->ia; +} + +//============================================================================= +//=== free_wm_da ============================================================== +//============================================================================= + +void free_wm_da( wm_da_type *f ) +{ + for(int i=0; i< f->NbOS; i++){ + delete [] f->val[i]; + delete [] f->col[i]; + } + delete [] f->val; + delete [] f->col; + delete [] f->ne; + + if ( f->do_save_STIR ){ + delete [] f->nb; + delete [] f->ns; + delete [] f->na; + delete [] f->nx; + delete [] f->ny; + delete [] f->nz; + } +} + +//============================================================================= +//== error_wmtools_SPECT ====================================================== +//============================================================================= + +void error_wmtools_SPECT( int nerr, string txt ) +{ +#if 0 + switch(nerr){ + case 11: printf("\n\nError wm_SPECT: number of variable rotation radius in file: %s different from number of angles\n",txt.c_str());break; + case 12: printf("\n\nError wm_SPECT: first parameter in collimator file should be 'p' or 'f' to indicate parallel or fanbeam collimator\n");break; + case 13: printf("\n\nError wm_SPECT: not enough parameters in collimator file: %s \n",txt.c_str());break; + case 21: printf("\n\nError wmtools_SPECT: undefined collimator. Collimator %s not found\n",txt.c_str()); break; + case 30: printf("\n\nError wmtools_SPECT: can not open %s for reading\n",txt.c_str()); break; + case 31: printf("\n\nError wmtools_SPECT: can not open %s for writing\n",txt.c_str()); break; + case 46: printf( "\n\nError weight3d: there are voxels near or further than de FOCAL lenght\n"); break; + case 50: printf("\n\nError wmtools_SPECT: No header stored in %s \n",txt.c_str()); break; + + //... error: value of argv[].......................... + + case 114: printf("\n\nError wm_SPECT: file with variable rotation radius: %s not found\n",txt.c_str());break; + case 122: printf("\n\nError wm_SPECT: file with variable collimator parameters: %s not found\n",txt.c_str());break; + case 124: printf("\n\nError wm_SPECT: can not open attenuation map-> argv[24]: %s for reading\n",txt.c_str()); break; + case 126: printf("\n\nError wm_SPECT: can not open file mask-> argv[26]: %s for reading\n",txt.c_str()); break; + + default: printf("\n\nError wmtools_SPECT: unknown error number on error_wmtools_SPECT()"); + } + + exit(0); +#else + using stir::error; + switch(nerr){ + case 11: printf("\n\nError wm_SPECT: number of variable rotation radius in file: %s different from number of angles\n",txt.c_str());break; + case 12: error("\n\nError wm_SPECT: first parameter in collimator file should be 'p' or 'f' to indicate parallel or fanbeam collimator\n");break; + case 13: printf("\n\nError wm_SPECT: not enough parameters in collimator file: %s \n",txt.c_str());break; + case 21: printf("\n\nError wmtools_SPECT: undefined collimator. Collimator %s not found\n",txt.c_str()); break; + case 30: printf("\n\nError wmtools_SPECT: can not open %s for reading\n",txt.c_str()); break; + case 31: printf("\n\nError wmtools_SPECT: can not open %s for writing\n",txt.c_str()); break; + case 46: error( "\n\nError weight3d: there are voxels near or further than de FOCAL lenght\n"); break; + case 50: printf("\n\nError wmtools_SPECT: No header stored in %s \n",txt.c_str()); break; + + //... error: value of argv[].......................... + + case 114: printf("\n\nError wm_SPECT: file with variable rotation radius: %s not found\n",txt.c_str());break; + case 122: printf("\n\nError wm_SPECT: file with variable collimator parameters: %s not found\n",txt.c_str());break; + case 124: printf("\n\nError wm_SPECT: can not open attenuation map-> argv[24]: %s for reading\n",txt.c_str()); break; + case 126: printf("\n\nError wm_SPECT: can not open file mask-> argv[26]: %s for reading\n",txt.c_str()); break; + + default: error("\n\nError wmtools_SPECT: unknown error number on error_wmtools_SPECT()"); + } + +#endif +} + +#if 0 +void error_wm_SPECT( int nerr, string txt) +{ + string opcions[]={ + "\nargv[1] Matrix file: Weight matrix filename (without extension index)", + + "\nargv[2] Image box: Number of columns (int)", + "\nargv[3] Image box: Number of rows (int)", + "\nargv[4] Image box: Number of slices (the same than projection slices) (int)", + "\nargv[5] Image box: Voxel side length(cm). Only square voxels are considered (float cm)", + "\nargv[6] Image box: Slice thickness (the same than projection slice thickness) (float cm)", + + "\nargv[7] Projections: Number of bins in a single projection (1d) (int)", + "\nargv[8] Projections: Bin size (float cm)", + "\nargv[9] Projections: Number of angles (int)", + "\nargv[10] Projections: Initial angle (float degrees)", + "\nargv[11] Projections: Angle increment between consecutive projections (float degrees)", + + "\nargv[12] Matrix: Number of subsets in which to split matrix (1= all the matrix in one single file)", + "\nargv[13] Matrix: Fixed projection radius (yes/no)", + "\nargv[14] Matrix: File containing rotation radius/ Rrad value (float: cm) from center to collimator plane", + "\nargv[15] Matrix: Minimum weight to take into account (over 1. Typically 0.01)", + "\nargv[16] Matrix: Maximum number of sigmas to consider in PSF calculation (float)", + "\nargv[17] Matrix: Spatial resolution in which to sample PSF distributions (typically 0.0001)", + "\nargv[18] Matrix: First slice to reconstruct (1 to Nslices)", + "\nargv[19] Matrix: Last slice to reconstruct (1 to Nslices)", + + "\nargv[20] Matrix: Correction for PSF (2d/3d/no)", + "\nargv[21] Matrix: Predefined collimator. If no correction for PSF set to yes (yes/no)", + "\nargv[22] Matrix: File with the collimator parameters/predefined collimator number (see help for options)\n\tIf no correction for PSF, argv[22]= 0 (int) (parallel) or argv[22]= focal distance (float, cm) (fanbeam)", + + "\nargv[23] Matrix: Correction for attenuation (simple/full/no)", + "\nargv[24] Matrix: attenuation map (filename/no) (in case of explicit mask)", + "\nargv[25] Matrix: volume masking (cyl/att/file/no). cyl: inscrit cylinder, att: no weight calculated where att=0", + "\nargv[26] Matrix: explicit mask (filename/no) (in case of explicit mask)", + + "\nargv[27] Matrix file: Format. Options: STIR, FC (FruitCake)", + "\nargv[28] Matrix file: to save matrix header as an a part file (yes/no)" + }; + + string predef_collim[]={ + "(1) fan_beam_elscint\n", + "(2) fan_beam_elscint_simset\n", + "(3) paralel3_low resolution\n", + "(4) paralel4_high resolution\n", + "(5) paralel5_LEHR_siemens_ecam\n", + "(6) fan_beam_prism3000\n", + "(10) parallel ECAM_L4cm\n", + "(11) fanbeam_elscint_L24.05cm\n", + "(13) parallel square holes collimator\n", + "(14) parallel hexagonal holes collimator\n", + "(15) parallel hexagonal holes collimator 2\n", + "(16) parallel Sentinella_collimator\n", + "(17) parallel Infinia_Hawkeye\n" + }; + int NUMCOL = 13; + + switch(nerr){ + case 100: cout << endl << "Missing variables" << endl; + for ( int i = 0 ; i < NUMARG-1 ; i++ ){ + printf( "%s\n", opcions[ i ].c_str() ); + } + printf("\n\nPredefined collimator options:\n"); + for ( int i = 0 ; i < NUMCOL ; i++ ){ + printf( "\t%s\n", predef_collim[ i ].c_str() ); + } + break; + + //... error: value of argv[].......................... + + case 101: printf("\n\nError wm_SPECT: parametre file: %s not found\n",txt.c_str());break; + case 102: printf("\n\nError wm_SPECT: More parametres tan expected in file: %s\n",txt.c_str());break; + case 103: printf("\n\nError wm_SPECT: Less parametres tan expected in file: %s\n",txt.c_str());break; + case 112: printf("\n\nError wm_SPECT: number of subsets should be congruent with number of projection angles\n"); break; + case 113: printf("\n\nError wm_SPECT: invalid option for argv[13]. Options: yes/no. Read value: %s \n",txt.c_str());break; + case 114: printf("\n\nError wm_SPECT: file with variable rotation radius: %s not found\n",txt.c_str());break; + case 118: printf("\n\nError wm_SPECT: first slice to reconstruct out of range (1->Nslic): %s \n",txt.c_str());break; + case 119: printf("\n\nError wm_SPECT: last slice to reconstruct out of range (first slice->Nslic): %s \n",txt.c_str());break; + case 120: printf("\n\nError wm_SPECT: invalid option for argv[20]. Options: no/2d/3d. Read value: %s \n",txt.c_str());break; + case 121: printf("\n\nError wm_SPECT: invalid option for argv[21]. Options: yes/no. Read value: %s \n",txt.c_str());break; + case 122: printf("\n\nError wm_SPECT: file with variable collimator parameters: %s not found\n",txt.c_str());break; + case 123: printf("\n\nError wm_SPECT: invalid option for argv[23]. Options: no/simple/full. Read value: %s \n",txt.c_str());break; + case 124: printf("\n\nError wm_SPECT: can not open attenuation map-> argv[24]: %s for reading\n",txt.c_str()); break; + case 125: printf("\n\nError wm_SPECT: invalid option for argv[25]. Options: no/cyl/att/file. Read value: %s \n",txt.c_str());break; + case 126: printf("\n\nError wm_SPECT: can not open file mask-> argv[26]: %s for reading\n",txt.c_str()); break; + case 127: printf("\n\nError wm_SPECT: invalid option for argv[27]. Options: STIR/FC. Read value: %s \n",txt.c_str());break; + case 128: printf("\n\nError wm_SPECT: invalid option for argv[28]. Options: yes/no. Read value: %s \n",txt.c_str());break; + + //... other errors........................................................... + + case 150: printf("\n\nError wm_SPECT: second delimiter missing in file of parameters. Param: %s", txt.c_str() ); break; + case 200: printf("\n\nError wm_SPECT: cannot allocate the variable: %s\n",txt.c_str());break; + + default: printf("\n\nError wm_SPECT: wrong error number"); + } + + exit(0); +} +#endif + +} // namespace SPECTUB diff --git a/src/recon_buildblock/SPECTUB_Weight3d.cxx b/src/recon_buildblock/SPECTUB_Weight3d.cxx new file mode 100644 index 0000000000..fb26082f4b --- /dev/null +++ b/src/recon_buildblock/SPECTUB_Weight3d.cxx @@ -0,0 +1,998 @@ +/* + Copyright (c) 2013, Biomedical Image Group (GIB), Universitat de Barcelona, Barcelona, Spain. + Copyright (c) 2013, University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + + \author Carles Falcon +*/ + + +//user defined libraries + +#include "stir/recon_buildblock/SPECTUB_Tools.h" +#include "stir/recon_buildblock/SPECTUB_Weight3d.h" +#include "stir/error.h" +#include + +//system libraries +#include +#include +#include +#include +#include + +namespace SPECTUB { + +#define EPSILON 1e-12 +#define EOS '\0' + +#define maxim(a,b) ((a)>=(b)?(a):(b)) +#define minim(a,b) ((a)<=(b)?(a):(b)) +#define abs(a) ((a)>=0?(a):(-a)) +#define SIGN(a) (a<-EPSILON?-1:(a>EPSILON?1:0)) + +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +#define REF_DIST 5. //reference distance for fanbeam PSF + +using namespace std; +//========================================================================== +//=== wm_calculation ======================================================= +//========================================================================== + +void wm_calculation( const int kOS, + const angle_type *const ang, + voxel_type vox, + bin_type bin, + const volume_type& vol, + const proj_type& prj, + const float *attmap, + const bool *msk_3d, + const bool *msk_2d, + const int maxszb, + const discrf_type *const gaussdens, + const int *const NITEMS) +{ + + float weight; + float coeff_att = (float) 1.; + int jp; + float eff; + + //... variables for geometric component .............................................. + + psf1d_type psf1d_h, psf1d_v; + + psf1d_h.maxszb = maxszb; + psf1d_h.val = new float [ maxszb ]; + psf1d_h.ind = new int [ maxszb ]; + + if ( wmh.do_psf_3d ){ + psf1d_v.maxszb = maxszb; + psf1d_v.val = new float [ maxszb ]; + psf1d_v.ind = new int [ maxszb ]; + } + + psf2da_type psf; + + psf.maxszb_h = maxszb; + if ( wmh.do_psf_3d ) psf.maxszb_v = maxszb; + else psf.maxszb_v = 1; + psf.maxszb_t = psf.maxszb_h * psf.maxszb_v; + + psf.val = new float [ psf.maxszb_t ]; // allocation for PSF values + psf.ib = new int [ psf.maxszb_t ]; // allocation for PSF indices + psf.jb = new int [ psf.maxszb_t ]; // allocation for PSF indices + + //... variables for attenuation component ............................................. + + attpth_type *attpth = 0; // initialise to avoid compiler warning + int sizeattpth = 1; // initialise to avoid compiler warning + + if ( wmh.do_att || wmh.do_msk_att ){ + + if ( !wmh.do_full_att ) sizeattpth = 1 ; + else sizeattpth = psf.maxszb_t ; + + attpth = new attpth_type [ sizeattpth ] ; + attpth[ 0 ].maxlng = vol.Ncol + vol.Nrow + vol.Nsli ; // maximum length of an attenuation path + + for (int i = 0 ; i < sizeattpth ; i++ ){ + + attpth[ i ].dl = new float [ attpth[ 0 ].maxlng ]; + attpth[ i ].iv = new int [ attpth[ 0 ].maxlng ]; + attpth[ i ].maxlng = attpth[ 0 ].maxlng; + } + } + + //... to fill projection indices for STIR format ............................. + + if ( wm.do_save_STIR ){ + + jp = -1; // projection index (row index of the weight matrix ) + int j1; + + for ( int j = 0 ; j < prj.NangOS ; j++ ){ + + j1 = wmh.index[ j ]; + + for ( int k = 0 ; k < prj.Nsli ; k++ ){ + + for ( int i = 0 ; i < prj.Nbin ; i++){ + + jp++; + wm.na[ jp ] = j1; + wm.nb[ jp ] = i - (int)prj.Nbind2; + wm.ns[ jp ] = k; + } + } + } + } + + //=== LOOP1: IMAGE ROWS ======================================================================= + + for ( vox.irow = 0 ; vox.irow < vol.Nrow ; vox.irow++ ){ + + //cout << "weights: " << 100.*(vox.irow+1)/vol.Nrow << "%" << endl; + + vox.y = vol.y0 + vox.irow * vol.szcm ; // y coordinate of the voxel (index 0->Nrow-1: irow) + + //=== LOOP2: IMAGE COLUMNS ================================================================= + + for ( vox.icol = 0 ; vox.icol < vol.Ncol ; vox.icol++ ){ + + vox.x = vol.x0 + vox.icol * vol.szcm ; // x coordinate of the voxel (index 0->Ncol-1: icol) + vox.ip = vox.irow * vol.Ncol + vox.icol ; // in-plane index of the voxel considering the slice as an array + + //... to apply mask ......................................... + + if ( wmh.do_msk){ + + if ( !msk_2d[ vox.ip ] ) continue; // to skip voxel if it is outside the 2d_mask + } + + //=== LOOP3: ANGLES INTO SUBSETS ======================================================== + + for( int k = 0 ; k < prj.NangOS ; k++ ){ + + int ka = wmh.index[ k ]; // angle index of the current projection (considering the whole set of projections) + + //... perpendicular distance form voxel to detection plane ........................... + + vox.dv2dp = vox.x * ang[ ka ].sin - vox.y * ang[ ka ].cos + ang[ ka ].Rrad ; + + if ( vox.dv2dp <= 0. ) continue; // skipping voxel if it is beyond the detection plane (corner voxels) + + //... x coordinate in the rotated frame .............................................. + + vox.x1 = vox.x * ang[ ka ].cos + vox.y * ang[ ka ].sin ; + + //... to project voxels onto the detection plane and to calculate other distances ..... + + voxel_projection( &vox , &eff , prj.lngcmd2 ); + + //... setting PSF to zero ......................................... + + // for ( int i = 0 ; i < nel ; i++ ){ + // + // psf.val[ i ] = (float)0.; + // psf.ib[ i ] = psf.jb[ i ] = 0; + // } + + //... correction for PSF .............................. + + if ( !wmh.do_psf ) fill_psf_no ( &psf, &psf1d_h, vox, &ang[ ka ], bin.szdx ); + + else{ + + if ( wmh.do_psf_3d ) fill_psf_3d ( &psf, &psf1d_h, &psf1d_v, vox, gaussdens, bin.szdx, bin.thdx, bin.thcmd2 ); + + else fill_psf_2d ( &psf, &psf1d_h, vox, gaussdens, bin.szdx ); + } + + //... correction for attenuation ................................................. + + if ( wmh.do_att ){ + + vox.z = (float)0. ; + + if ( !wmh.do_full_att ){ // simple correction for attenuation + + bin.x = ang[ ka ].xbin0 + vox.xd0 * ang[ ka ].cos; // x coord of the projection of the center of the voxel in the detection line + bin.y = ang[ ka ].ybin0 + vox.xd0 * ang[ ka ].sin; + bin.z = (float)0. ; + + calc_att_path( bin, vox, vol, &attpth[ 0 ]); + } + else{ // full correction for attenuation + + for ( int i = 0 ; i < psf.Nib ; i++ ){ + + bin.x = ang[ ka ].xbin0 + ang[ ka ].incx * ( (float)psf.ib[ i ] + (float)0.5 ); + bin.y = ang[ ka ].ybin0 + ang[ ka ].incy * ( (float)psf.ib[ i ] + (float)0.5 ); + bin.z = (float)psf.jb[ i ] * vox.thcm ; + + calc_att_path( bin, vox, vol, &attpth[ i ]); + } + } + } + + //=== LOOP4: IMAGE SLICES ================================================================ + + for ( vox.islc = vol.first_sl ; vox.islc < vol.last_sl ; vox.islc++ ){ + + vox.iv = vox.ip + vox.islc * vol.Npix ; // volume index of the voxel (volume as an array) + + if ( wmh.do_msk ){ + if ( !msk_3d[ vox.iv ] ) continue; + } + + if ( wmh.do_att && !wmh.do_full_att ) coeff_att = calc_att( &attpth[ 0 ], attmap , vox.islc ); + + //... weight matrix values calculation ....................................... + + for ( int ie = 0 ; ie < psf.Nib ; ie++ ){ + + if ( psf.ib[ ie ] < 0 ) continue; + if ( psf.ib[ ie ] >= prj.Nbin ) continue; + + int ks = ( vox.islc + psf.jb[ ie ] ); + + if ( ks < 0 ) continue; + if ( ks >= vol.Nsli ) continue; + + jp = k * prj.Nbp + ks * prj.Nbin + psf.ib[ ie ]; + + if ( wmh.do_full_att ) coeff_att = calc_att( &attpth[ ie ], attmap, vox.islc ); + + weight = psf.val[ ie ] * eff * coeff_att ; + + //... fill image STIR indices ........................... + + if ( wm.do_save_STIR ){ + wm.nx[ vox.iv ] = (short int)( vox.icol - (int) floor( vol.Ncold2 ) ); // centered index for STIR format + wm.ny[ vox.iv ] = (short int)( vox.irow - (int) floor( vol.Nrowd2 ) ); // centered index for STIR format + wm.nz[ vox.iv ] = (short int) vox.islc ; // non-centered index for STIR format + } + + //... fill wm values ..................... + + wm.col[ jp ][ wm.ne[ jp ] ] = vox.iv; + wm.val[ jp ][ wm.ne[ jp ] ] = weight; + wm.ne[ jp ]++; + + if ( wm.ne[ jp ] >= NITEMS[ jp ] ) error_weight3d(45, "" ); + } + } // end of LOOP4: image slices + } // end of LOOP3: projection angle into subset + } // end of LOOP2: image rows + } // end of LOOP1: image cols + + //... detele allocated memory .............. + + delete [] psf1d_h.val ; + delete [] psf1d_h.ind ; + + if ( wmh.do_psf_3d ){ + delete [] psf1d_v.val ; + delete [] psf1d_v.ind ; + } + + delete [] psf.val; + delete [] psf.ib; + delete [] psf.jb; + + if ( wmh.do_att ){ + for ( int i = 0 ; i < sizeattpth ; i++ ){ + delete [] attpth[ i ].dl; + delete [] attpth[ i ].iv; + } + delete [] attpth; + } +} + + +//============================================================================= +//=== wm_size_estimation ==================================================== +//============================================================================= + +void wm_size_estimation (int kOS, + const angle_type * const ang, + voxel_type vox, + bin_type bin, + const volume_type& vol, + const proj_type& prj, + const bool * const msk_3d, + const bool *const msk_2d, + const int maxszb, + const discrf_type * const gaussdens, + int *NITEMS) +{ + int jp; + float eff; + + //... variables for geometric component .............................................. + + psf1d_type psf1d_h, psf1d_v; + + psf1d_h.maxszb = maxszb; + psf1d_h.val = new float [ maxszb ]; + psf1d_h.ind = new int [ maxszb ]; + + if ( wmh.do_psf_3d ){ + psf1d_v.maxszb = maxszb; + psf1d_v.val = new float [ maxszb ]; + psf1d_v.ind = new int [ maxszb ]; + } + + psf2da_type psf; + + psf.maxszb_h = maxszb; + if ( wmh.do_psf_3d ) psf.maxszb_v = maxszb; + else psf.maxszb_v = 1; + psf.maxszb_t = psf.maxszb_h * psf.maxszb_v; + + psf.val = new float [ psf.maxszb_t ]; // allocation for PSF values + psf.ib = new int [ psf.maxszb_t ]; // allocation for PSF indices + psf.jb = new int [ psf.maxszb_t ]; // allocation for PSF indices + + //=== LOOP1: IMAGE ROWS ======================================================================= + + for ( vox.irow = 0 ; vox.irow < vol.Nrow ; vox.irow++ ){ + + vox.y = vol.y0 + vox.irow * vol.szcm ; // y coordinate of the voxel (index 0->Nrow-1: irow) + + //=== LOOP2: IMAGE COLUMNS ================================================================= + + for ( vox.icol = 0 ; vox.icol < vol.Ncol ; vox.icol++ ){ + + vox.x = vol.x0 + vox.icol * vol.szcm ; // x coordinate of the voxel (index 0->Ncol-1: icol) + vox.ip = vox.irow * vol.Ncol + vox.icol ; // in-plane index of the voxel considering the slice as an array + + //... to apply mask ......................................... + + if ( wmh.do_msk){ + + if ( !msk_2d[ vox.ip ] ) continue; // to skip voxel if it is outside the 2d_mask + } + + //=== LOOP3: ANGLES INTO SUBSETS ======================================================== + + for( int k = 0 ; k < prj.NangOS ; k++ ){ + + int ka = wmh.index[ k ]; // angle index of the current projection (considering the whole set of projections) + + //... perpendicular distance form voxel to detection plane ........................... + + vox.dv2dp = vox.x * ang[ ka ].sin - vox.y * ang[ ka ].cos + ang[ ka ].Rrad ; + + if ( vox.dv2dp <= 0. ) continue; // skipping voxel if it is beyond the detection plane (corner voxels) + + //... x coordinate in the rotated frame .............................................. + + vox.x1 = vox.x * ang[ ka ].cos + vox.y * ang[ ka ].sin ; + + //... to project voxels onto the detection plane and to calculate other distances ..... + + voxel_projection( &vox , &eff , prj.lngcmd2 ); + + //... setting PSF to zero ......................................... + +// for ( int i = 0 ; i < psf.maxszb ; i++ ){ +// psf.val[ i ] = (float) 0.; +// psf.ib[ i ] = psf.jb[ i ] = 0; +// } + + //... correction for PSF .............................. + + if ( !wmh.do_psf ) fill_psf_no ( &psf, &psf1d_h, vox, &ang[ ka ], bin.szdx ); + + else{ + + if ( wmh.do_psf_3d ) fill_psf_3d ( &psf, &psf1d_h, &psf1d_v, vox, gaussdens, bin.szdx, bin.thdx, bin.thcmd2 ); + + else fill_psf_2d ( &psf, &psf1d_h, vox, gaussdens, bin.szdx ); + } + + + //=== LOOP4: IMAGE SLICES ================================================================ + + for ( vox.islc = vol.first_sl ; vox.islc < vol.last_sl ; vox.islc++ ){ + + vox.iv = vox.ip + vox.islc * vol.Npix ; // volume index of the voxel (volume as an array) + + if ( wmh.do_msk ){ + if ( !msk_3d[ vox.iv ] ) continue; + } + + //... weight matrix values calculation ....................................... + + for ( int ie = 0 ; ie < psf.Nib ; ie++ ){ + + if ( psf.ib[ ie ] < 0 ) continue; + if ( psf.ib[ ie ] >= prj.Nbin ) continue; + + int ks = ( vox.islc + psf.jb[ ie ] ); + + if ( ks < 0 ) continue; + if ( ks >= vol.Nsli ) continue; + + jp = k * prj.Nbp + ks * prj.Nbin + psf.ib[ ie ]; + + NITEMS[ jp ]++; + } + } + } // end of LOOP3: projection angle into subset + } // end of LOOP2: image rows + } // end of LOOP1: image cols + + //... detele allocated memory .............. + + delete [] psf1d_h.val ; + delete [] psf1d_h.ind ; + + if ( wmh.do_psf_3d ){ + delete [] psf1d_v.val ; + delete [] psf1d_v.ind ; + } + + delete [] psf.val; + delete [] psf.ib; + delete [] psf.jb; +} + +//========================================================================== +//=== calc_gauss =========================================================== +//========================================================================== + +void calc_gauss( discrf_type *gaussdens ) +{ + float K0 = (float)0.3989422863; //Normalization factor: 1/sqrt(2*M_PI) + float x = 0; + float g; + + gaussdens->val[ gaussdens->lngd2 ] = K0; + float resd2 = gaussdens->res / (float)2.0; + + + for( int i = 1 ; i <= gaussdens->lngd2 ; i++ ){ + + x += gaussdens->res; + g = K0 * exp( - x * x / (float)2.); + gaussdens->val[ gaussdens->lngd2 + i ] = gaussdens->val[ gaussdens->lngd2 - i ] = g; + } + + gaussdens->acu[ 0 ] = gaussdens->val[ 0 ] * resd2 ; + + for ( int i = 1 ; i < gaussdens->lng ; i++ ){ + gaussdens->acu[ i ] = gaussdens->acu[ i - 1 ] + ( gaussdens->val[ i -1 ] + gaussdens->val[ i ] ) * resd2; + } + + for ( int i = 0 ; i < gaussdens->lng ; i++ ){ + gaussdens->acu[ i ] = (gaussdens->acu[ i ] - gaussdens->acu[ 0 ] ) / gaussdens->acu[ gaussdens->lng - 1 ]; + } +} + +//========================================================================== +//=== calc_vxprj ========================================================= +//========================================================================== + +void calc_vxprj( angle_type *ang ) +{ + //... initialization to zero ..................................... + + for ( int j = 0 ; j < ang->vxprj.lng ; j++ ) ang->vxprj.acu[ j ] = ang->vxprj.val[ j ] = (float)0.; + + //... total number of points (at DX resolution) ........................ + + int Nmax= 2 * ang->N2 ; + float resd2 = ang->vxprj.res / (float)2.0; + + //... plateau........................................................... + + for ( int i = 0 ; i < ang->N1 ; i++ ){ + ang->vxprj.val[ ang->N2 - i - 1 ] = ang->vxprj.val[ ang->N2 + i ] = ang->p; + } + + //... slopes of the trapezoid .......................................... + + for ( int i = ang->N1 ; i < ang->N2 ; i++ ){ + ang->vxprj.val[ ang->N2 - i - 1 ] = ang->vxprj.val[ ang->N2 + i ] = maxim (ang->m * ((float)i + (float)0.5) + ang->n, 0); + } + + //... cumulative sum ................................................... + + ang->vxprj.acu[ 0 ] = ang->vxprj.val[ 0 ] * resd2 ; + + for ( int i = 1 ; i < Nmax ; i++ ){ + ang->vxprj.acu[ i ] = ang->vxprj.acu[ i - 1 ] + ( ang->vxprj.val[ i -1 ] + ang->vxprj.val[ i ] ) * resd2; + } + + //... forcing distribution function to have area 1 ...................... + + for ( int i = 0 ; i < Nmax ; i++ ){ + ang->vxprj.acu[ i ] /= ang->vxprj.acu[ Nmax - 1 ]; + } +} + + +//========================================================================== +//=== voxel_projection ===================================================== +//========================================================================== + +void voxel_projection ( voxel_type *vox, float * eff, float lngcmd2) +{ + + if ( wmh.COL.do_fb ){ // fan_beam + + //... angle between voxel-focal line and center-focal line and distance from voxel projection to detection line relevant points........ + + vox->costhe = cos( atan ( vox->x1 / ( wmh.COL.F - vox->dv2dp ) ) ); + vox->xdc = wmh.COL.F * vox->x1 / ( wmh.COL.F - vox->dv2dp ); // distance to the center of the detection line + vox->xd0 = vox->xdc + lngcmd2 ; // distance to the begin of the detection line + + //... efficiency correction ............................................................... + + if ( wmh.do_psf ) *eff = vox->costhe * vox->costhe * ( wmh.COL.F - REF_DIST ) / ( wmh.COL.F - vox->dv2dp ); + else *eff = (float) 1.; + + } + else{ // parallel + + //... distance from projected voxel (center) to the begin of the detection line ............ + + vox->xd0 = vox->x1 + lngcmd2; + + *eff = (float) 1. ; + } +} + +//========================================================================== +//=== fill_psf_no ========================================================== +//========================================================================== + +void fill_psf_no( psf2da_type *psf, psf1d_type * psf1d_h, const voxel_type& vox, angle_type const *const ang , float szdx ) +{ + psf1d_h->sgmcm = vox.szcm; + + if ( wmh.COL.do_fb){ + if ( fabs( vox.x1 ) > EPSILON ) psf1d_h->sgmcm *= vox.xdc / vox.x1; // fb expanded projection of the voxel + } + + psf1d_h->di = min( (int) floor( szdx / psf1d_h->sgmcm ), ang->vxprj.lng -1 ) ; + psf1d_h->lngcm = ( fabs ( ang->sin ) + fabs( ang->cos ) ) * psf1d_h->sgmcm ; + + psf1d_h->lngcmd2 = psf1d_h->lngcm / (float)2.; + psf1d_h->efres = ang->vxprj.res * psf1d_h->sgmcm; // to resize discretization resolution once applied sgmcm + + calc_psf_bin( vox.xd0, wmh.prj.szcm, &ang->vxprj, psf1d_h ); + + for ( int ie = 0 ; ie < psf1d_h->Nib ; ie++ ){ + + psf->val [ ie ] = psf1d_h->val[ ie ]; + psf->ib [ ie ] = psf1d_h->ind[ ie ]; + psf->jb [ ie ] = 0; + } + psf->Nib = psf1d_h->Nib; +} + +//========================================================================== +//=== fill_psf_2d ========================================================== +//========================================================================== + +void fill_psf_2d( psf2da_type *psf, psf1d_type * psf1d_h, const voxel_type& vox, discrf_type const* const gaussdens, float szdx ) +{ + + psf1d_h->sgmcm = calc_sigma_h( vox, wmh.COL ); + + psf1d_h->di = min ( (int) floor( szdx / psf1d_h->sgmcm ), gaussdens->lng -1) ; + psf1d_h->lngcmd2 = psf1d_h->sgmcm * wmh.maxsigm ; + psf1d_h->lngcm = psf1d_h->lngcmd2 * (float)2.; + + psf1d_h->efres = gaussdens->res * psf1d_h->sgmcm ; + + calc_psf_bin( vox.xd0, wmh.prj.szcm, gaussdens, psf1d_h ); + + for ( int ie = 0 ; ie < psf1d_h->Nib ; ie++ ){ + + psf->val [ ie ] = psf1d_h->val[ ie ]; + psf->ib [ ie ] = psf1d_h->ind[ ie ]; + psf->jb [ ie ] = 0; + + } + psf->Nib = psf1d_h->Nib; +} + +//========================================================================== +//=== fill_psf_3d ========================================================== +//========================================================================== + +void fill_psf_3d (psf2da_type *psf, + psf1d_type *psf1d_h, + psf1d_type *psf1d_v, + const voxel_type& vox, discrf_type const * const gaussdens, float szdx, float thdx, float thcmd2 ) +{ + + //... horizontal component ........................... + + psf1d_h->sgmcm = calc_sigma_h( vox, wmh.COL); + psf1d_h->lngcmd2 = psf1d_h->sgmcm * wmh.maxsigm ; + psf1d_h->lngcm = psf1d_h->lngcmd2 * (float)2.; + psf1d_h->di = min( (int) floor( szdx / psf1d_h->sgmcm ), gaussdens->lng - 1 ) ; + psf1d_h->efres = gaussdens->res * psf1d_h->sgmcm ; + + //... setting PSF to zero ......................................... + +// for ( int i = 0 ; i < psf1d_h->maxszb ; i++ ){ +// psf1d_h->val[ i ] = (float)0.; +// psf1d_h->ind[ i ] = 0; +// } + + //... calculation of the horizontal component of psf ................... + + calc_psf_bin( vox.xd0, wmh.prj.szcm, gaussdens, psf1d_h ); + + //... vertical component .............................. + + psf1d_v->sgmcm = calc_sigma_v( vox, wmh.COL); + psf1d_v->lngcmd2 = psf1d_v->sgmcm * wmh.maxsigm; + psf1d_v->lngcm = psf1d_v->lngcmd2 * (float)2.; + psf1d_v->di = min( (int) floor( thdx / psf1d_v->sgmcm ), gaussdens->lng - 1 ) ; + psf1d_v->efres = gaussdens->res * psf1d_v->sgmcm ; + + //... setting PSF to zero ......................................... + +// for ( int i = 0 ; i < psf1d_v->maxszb ; i++ ){ +// psf1d_v->val[ i ] = (float)0.; +// psf1d_v->ind[ i ] = 0; +// } + + //... calculation of the vertical component of psf .................... + + calc_psf_bin( thcmd2, wmh.prj.thcm, gaussdens, psf1d_v ); + + //... mixing and setting PSF area to 1 (to correct for tail truncation of Gaussian function) ..... + + float w; + float area = 0; + int ip = 0; + float Nib_hp2 = (float) ( psf1d_h->Nib * psf1d_h->Nib )/ (float)4. ; + float Nib_vp2 = (float) ( psf1d_v->Nib * psf1d_v->Nib )/ (float)4. ; + + for ( int i = 0 ; i < psf1d_h->Nib ; i++ ){ + + float b = ( (float) psf1d_h->ind [ 0 ] + (float) psf1d_h->ind [ psf1d_h->Nib - 1 ] ) / (float)2. ; + float a = ( (float) psf1d_h->ind [ i ] - b ) * ( (float) psf1d_h->ind [ i ] - b ) / Nib_hp2 ; + + for ( int j = 0 ; j < psf1d_v->Nib ; j++ ){ + + if ( ( a + (float)( psf1d_v->ind [ j ] * psf1d_v->ind [ j ] ) / Nib_vp2 ) > (float)1. ) continue; + + w = psf1d_h->val[ i ] * psf1d_v->val[ j ]; + + if ( w < wmh.min_w ) continue; + + psf->val[ ip ] = w; + psf->ib [ ip ] = psf1d_h->ind [ i ]; + psf->jb [ ip ] = psf1d_v->ind [ j ]; + ip++; + + area += w; + } + } + psf->Nib = ip; + + for( int i = 0 ; i < ip ; i++ ) psf->val[ i ] /= area ; + +} + +//========================================================================== +//=== calc_psf_bin ========================================================= +//========================================================================== + +void calc_psf_bin (float center_psf, + float binszcm, + discrf_type const * const vxprj, + psf1d_type *psf) +{ + float weight, preval; + + //... position (in cm and bin index) of the first extrem of the vxprj on the detection line........ + + float beg_psf = center_psf - psf->lngcmd2; // position of the begin of the psf in the detection line (cm) + int jm = (int) floor( beg_psf / binszcm ); // first index in detection line interacting with psf (it can be negative) + float r_nextb = (float)( jm + 1 ) * binszcm ; // position of the next change of bin (cm) + int i1 = min( (int) floor( ( r_nextb - beg_psf ) / psf->efres) , vxprj->lng -1 ) ; // index in vxprj distribution in which happens the change of bin + int Ncb = ( vxprj->lng - i1 - 1 ) / psf->di ; // number of complete bins covered by PSF + + //... first weigth calculation ............................................................................... + + int ip = 0; // counter for the number of surviving weights + float area = (float)0. ; + + weight = vxprj->acu[ i1 ] - vxprj->acu[ 0 ]; + + if ( weight >= wmh.min_w ){ + psf->val[ ip ] = weight; + psf->ind[ ip ] = jm; + area += weight; + ip++; + } + + //... weight for the complete bins ................................................................... + + preval = vxprj->acu[ i1 ]; + + for ( int i = 0 ; i < Ncb ; i++ ){ + jm++; + i1 += psf->di; + weight = vxprj->acu[ i1 ] - preval ; + preval = vxprj->acu[ i1 ]; + + if ( weight >= wmh.min_w){ + psf->val[ ip ] = weight; + psf->ind[ ip ] = jm; + area += weight; + ip++; + } + } + + //... weight for the last bin ................................................................... + + weight = (float)1. - preval ; + jm++; + + if ( weight >= wmh.min_w){ + psf->val[ ip ] = weight; + psf->ind[ ip ] = jm; + area += weight; + ip++; + } + + if ( ip >= psf->maxszb ) + error_weight3d( 47, "" ); + for (int i = 0 ; i < ip ; i++) psf->val[ i ] /= area; + psf->Nib = ip; + +} + +//============================================================================= +//=== cal_att_path ============================================================ +//============================================================================= + +void calc_att_path(const bin_type& bin, const voxel_type& vox, const volume_type& vol, attpth_type *attpth ) +{ + float dx, dy, dz; + float dlast_x, dlast_y, dlast_z, dlast; + float next_x, next_y, next_z; + int cas; + + //... to initializate attpth to zero.............................. + +// for (int i = 0 ; i < attpth->maxlng ; i++ ){ +// attpth->dl [ i ] = (float) 0.; +// attpth->iv [ i ] = 0; +// } + + //... vector from voxel to bin and the sign of its components .... + + float ux = bin.x - vox.x; // first component of voxel_to_bin vector + float uy = bin.y - vox.y; // second component of voxel_to_bin vector + float uz = bin.z - vox.z; // third component of voxel_to_bin vector + + int signx = SIGN(ux); // sign of ux + int signy = SIGN(uy); // sign of uy + int signz = SIGN(uz); // sign of uz + + //... corresponding unary vector ................................... + + float dpb = sqrt(ux*ux + uy*uy + uz*uz); // distance from voxel_to_bin (modulus of [ux,uy,uz]) + ux /= dpb; // unit vector ux + uy /= dpb; // unit vector uy + uz /= dpb; // unit vector uz + + //... next and last distance to the attenuation map grip .................. + + if ( signx < 0 ){ + next_x = ( (float) vox.icol - (float) 0.5 ) * vox.szcm + vol.x0; + dlast_x = ( -vol.Xcmd2 - vox.x ) / ( ux + EPSILON ) ; + } + else{ + next_x = ( (float) vox.icol + (float) 0.5 ) * vox.szcm + vol.x0; + dlast_x = ( vol.Xcmd2 - vox.x ) / ( ux + EPSILON ) ; + } + + if ( signy < 0 ){ + next_y = ( (float) vox.irow - (float) 0.5 ) * vox.szcm + vol.y0; + dlast_y = ( -vol.Ycmd2 - vox.y ) / ( uy + EPSILON ) ; + } + else{ + next_y = ( (float) vox.irow + (float) 0.5 ) * vox.szcm + vol.y0; + dlast_y = ( vol.Ycmd2 - vox.y ) / ( uy + EPSILON ) ; + } + + if ( signz < 0 ){ + next_z = ( - (float) 0.5 ) * vox.thcm ; + dlast_z = ( -vol.Zcmd2 - vox.z ) / ( uz + EPSILON ) ; + } + else{ + next_z = ( (float) 0.5 ) * vox.thcm ; + dlast_z = ( vol.Zcmd2 - vox.z ) / ( uz + EPSILON ) ; + } + + dlast = minim ( minim ( dlast_x, dlast_y ) , minim ( dlast_z , dpb ) ); + + // ... distance to next planes avoiding high values for parallel or almost parallel lines ... + + dx = ( next_x - vox.x ) / ( ux + EPSILON ) ; + dy = ( next_y - vox.y ) / ( uy + EPSILON ) ; + dz = ( next_z - vox.z ) / ( uz + EPSILON ) ; + + //... variables initialization ..................................... + + float dant = (float)0. ; // previous distance (distance from voxel to the last change of voxel in the attenuation map) + int ni = 0 ; // number of voxels in the attenuation path + int iv = vox.ip ; // voxel index on the attenuation map + + //... loop while attenuation ray is inside the attenuation map + + for(;;){ + + cas = comp_dist( dx, dy, dz, dlast ); + + if ( cas == 0 ){ + + attpth->lng = ni; + return; + } + + else{ + + if ( ni >= attpth->maxlng ) error_weight3d(49, ""); + + attpth->iv[ ni ] = iv ; + + switch(cas){ + case 1: + attpth->dl[ ni ] = ( dx - dant ) ; + dant = dx ; + iv += signx ; + next_x += vox.szcm * signx ; + dx = ( next_x - vox.x ) / ( ux + EPSILON ) ; + break; + case 2: + attpth->dl[ ni ] = ( dy - dant ) ; + dant = dy ; + iv += signy * vol.Ncol ; + next_y += vox.szcm * signy ; + dy = ( next_y - vox.y ) / ( uy + EPSILON ) ; + break; + case 3: + attpth->dl[ ni ] = ( dz - dant ) ; + dant = dz; + iv += signz * vol.Npix ; + next_z += vox.thcm * signz ; + dz = ( next_z - vox.z ) / ( uz + EPSILON ) ; + break; + default: + error_weight3d (40, ""); + } + ni++; + } + } +} + +//============================================================================= +//=== comp_dist =============================================================== +//============================================================================= + +int comp_dist( float dx, + float dy, + float dz, + float dlast) +{ + int cas; + + if ( dx < dy){ + if ( dx< dz) { + if ( dx > dlast ) cas = 0; // case 0: end of the iteration + else cas = 1; // case 1: minimum value = dx. Next index change in attenuation map is in x direction + } + else { + if ( dz > dlast ) cas = 0; // case 0: end of the iteration + else cas = 3; // case 3: minimum value = dz. Next index change in attenuation map is in z direction + } + } + else{ + if ( dy < dz) { + if ( dy > dlast ) cas = 0; // case 0: end of the iteration + else cas = 2; // case 2: minimum value = dy. Next index change in attenuation map is in y direction + } + else { + if ( dz > dlast ) cas = 0; // case 0: end of the iteration + else cas = 3; // case 3: minimum value = dz. Next index change in attenuation map is in z direction } + } + } + return( cas ); +} + +//============================================================================= +//=== cal_att ================================================================= +//============================================================================= + +float calc_att( const attpth_type *const attpth, const float *const attmap , int nsli ){ + + float att_coef = (float)0.; + int iv; + + for ( int i = 0 ; i < attpth->lng ; i++ ){ + + iv = attpth->iv[ i ] + wmh.vol.Npix * nsli ; + + if ( iv < 0 || iv >= wmh.vol.Nvox ) break; + + att_coef += attpth->dl[ i ] * attmap[ iv ]; + } + + att_coef = exp( -att_coef ); + return( att_coef ); +} + +//========================================================================== +//=== error_weight3d ======================================================= +//========================================================================== + +void error_weight3d ( int nerr, const string& text ) +{ +#if 0 + switch(nerr){ + case 13: printf( "\n\nError weight3d: wm.NbOS and/or wm.Nvox are negative"); break; + case 21: printf( "\n\nError weight3d: undefined collimator. Collimator %s not found\n",text.c_str() ); break; + case 30: printf( "\n\nError weight3d: can not open \n%s for reading\n", text.c_str() ); break; + case 31: printf( "\n\nError weight3d: can not open \n%s for writing\n", text.c_str() ); break; + case 40: printf( "\n\nError weight3d: wrong codification in comp_dist function");break; + case 45: printf( "\n\nError weight3d: Realloc needed for WM\n"); break; + case 47: printf( "\n\nError weight3d: psf length greater than maxszb in calc_psf_bin\n"); break; + case 49: printf( "\n\nError weight3d: attpth larger than allocated\n"); break; + case 50: printf( "\n\nError weight3d: No header stored in %s \n",text.c_str() ); break; + default: printf( "\n\nError weight3d: unknown error number on error_weight3d()"); + } + + exit(0); +#else + using stir::error; + switch(nerr){ + case 13: error( "\n\nError weight3d: wm.NbOS and/or wm.Nvox are negative"); break; + case 21: printf( "\n\nError weight3d: undefined collimator. Collimator %s not found\n",text.c_str() ); break; + case 30: printf( "\n\nError weight3d: can not open \n%s for reading\n", text.c_str() ); break; + case 31: printf( "\n\nError weight3d: can not open \n%s for writing\n", text.c_str() ); break; + case 40: error( "\n\nError weight3d: wrong codification in comp_dist function");break; + case 45: error( "\n\nError weight3d: Realloc needed for WM\n"); break; + case 47: error( "\n\nError weight3d: psf length greater than maxszb in calc_psf_bin\n"); break; + case 49: error( "\n\nError weight3d: attpth larger than allocated\n"); break; + case 50: printf( "\n\nError weight3d: No header stored in %s \n",text.c_str() ); break; + default: error( "\n\nError weight3d: unknown error number on error_weight3d()"); + } + + exit(0); +#endif +} + + + +} // namespace SPECTUB diff --git a/src/recon_buildblock/SymmetryOperation.cxx b/src/recon_buildblock/SymmetryOperation.cxx new file mode 100644 index 0000000000..d8e12078b1 --- /dev/null +++ b/src/recon_buildblock/SymmetryOperation.cxx @@ -0,0 +1,77 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*//*! + \file + \ingroup symmetries + + \brief Implementations of non-inline functions for class SymmetryOperation + + \author Kris Thielemans + \author PARAPET project + +*/ + +#include "stir/recon_buildblock/SymmetryOperation.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/Coordinate3D.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneDensel.h" + +START_NAMESPACE_STIR + +void +SymmetryOperation:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/SymmetryOperations_PET_CartesianGrid.cxx b/src/recon_buildblock/SymmetryOperations_PET_CartesianGrid.cxx new file mode 100644 index 0000000000..77223e7e09 --- /dev/null +++ b/src/recon_buildblock/SymmetryOperations_PET_CartesianGrid.cxx @@ -0,0 +1,683 @@ +// +// +/*! + \file + \ingroup symmetries + + \brief non-inline implementations for all symmetry operations for PET scanners + and Cartesian grid images + + This file contains just tedious repetitions of the default + implementation of SymmetryOperation::transform_proj_matrix_elems_for_one_bin, + with 1 tiny (but important) change: the call to transform_image_coordinates + is explicitly forced to the member of the class (instead of just calling + the virtual function). The result of this is that the compiler can + inline the function, and hence dramatic speed-up. + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/recon_buildblock/SymmetryOperations_PET_CartesianGrid.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/Coordinate3D.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneDensel.h" + + +START_NAMESPACE_STIR + +void +SymmetryOperation_PET_CartesianGrid_z_shift:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + // TODO possibly an explicit z_shift here would be quicker, although a smart compiler should see it + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_z_shift:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_yx:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_yx:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_yx:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_yx:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_ymy:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_ymy:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_ymx:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xy_ymx:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_ymy_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_ymy_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + +void +SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq:: +transform_proj_matrix_elems_for_one_bin( + ProjMatrixElemsForOneBin& lor) const +{ + Bin bin = lor.get_bin(); + transform_bin_coordinates(bin); + lor.set_bin(bin); + + ProjMatrixElemsForOneBin::iterator element_ptr = lor.begin(); + while (element_ptr != lor.end()) + { + Coordinate3D c(element_ptr->get_coords()); + self::transform_image_coordinates(c); + *element_ptr = ProjMatrixElemsForOneBin::value_type(c, element_ptr->get_value()); + ++element_ptr; + } +} + + + +void +SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq:: +transform_proj_matrix_elems_for_one_densel( + ProjMatrixElemsForOneDensel& probs) const +{ + Densel densel = probs.get_densel(); + transform_image_coordinates(densel); + probs.set_densel(densel); + + ProjMatrixElemsForOneDensel::iterator element_ptr = probs.begin(); + while (element_ptr != probs.end()) + { + Bin c(*element_ptr); + self::transform_bin_coordinates(c); + *element_ptr = ProjMatrixElemsForOneDensel::value_type(c); + ++element_ptr; + } +} + + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/TrivialBinNormalisation.cxx b/src/recon_buildblock/TrivialBinNormalisation.cxx new file mode 100644 index 0000000000..d600f1d073 --- /dev/null +++ b/src/recon_buildblock/TrivialBinNormalisation.cxx @@ -0,0 +1,36 @@ +// +// +/*! + \file + \ingroup normalisation + + \brief Implementations for class stir::TrivialBinNormalisation + + \author Kris Thielemans +*/ +/* + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/recon_buildblock/TrivialBinNormalisation.h" + +START_NAMESPACE_STIR + +const char * const +TrivialBinNormalisation::registered_name = "None"; + +END_NAMESPACE_STIR + diff --git a/src/recon_buildblock/TrivialDataSymmetriesForBins.cxx b/src/recon_buildblock/TrivialDataSymmetriesForBins.cxx new file mode 100644 index 0000000000..00e0796f23 --- /dev/null +++ b/src/recon_buildblock/TrivialDataSymmetriesForBins.cxx @@ -0,0 +1,159 @@ +// +// +/* + Copyright (C) 2003- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup symmetries + \brief non-inline implementations for class + stir::TrivialDataSymmetriesForBins + + \author Kris Thielemans + +*/ +#include "stir/recon_buildblock/TrivialDataSymmetriesForBins.h" +#include "stir/recon_buildblock/SymmetryOperation.h" +#include "stir/ViewSegmentNumbers.h" + +START_NAMESPACE_STIR +TrivialDataSymmetriesForBins:: +TrivialDataSymmetriesForBins +( + const shared_ptr& proj_data_info_ptr) + : DataSymmetriesForBins(proj_data_info_ptr) +{ +} + + +#ifndef STIR_NO_COVARIANT_RETURN_TYPES + TrivialDataSymmetriesForBins * +#else + DataSymmetriesForViewSegmentNumbers * +#endif +TrivialDataSymmetriesForBins:: +clone() const +{ + return new TrivialDataSymmetriesForBins(*this); +} + +int +TrivialDataSymmetriesForBins::num_related_bins(const Bin& b) const +{ + return 1; +} + +bool TrivialDataSymmetriesForBins::find_basic_bin(Bin& b) const +{ + return false; +} + + +bool +TrivialDataSymmetriesForBins:: +is_basic(const Bin& b) const +{ + return true; +} + + +void +TrivialDataSymmetriesForBins:: +get_related_bins_factorised(vector& axtan_pos_nums, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + if (b.axial_pos_num() >= min_axial_pos_num && + b.axial_pos_num() <= max_axial_pos_num && + b.tangential_pos_num() >= min_tangential_pos_num && + b.tangential_pos_num() <= max_tangential_pos_num) + { + axtan_pos_nums.resize(1); + axtan_pos_nums[0] = + AxTangPosNumbers(b.axial_pos_num(), + b.tangential_pos_num()); + } + else + { + axtan_pos_nums.resize(0); + } +} + +void +TrivialDataSymmetriesForBins:: +get_related_bins(vector& rel_b, const Bin& b, + const int min_axial_pos_num, const int max_axial_pos_num, + const int min_tangential_pos_num, const int max_tangential_pos_num) const +{ + if (b.axial_pos_num() >= min_axial_pos_num && + b.axial_pos_num() <= max_axial_pos_num && + b.tangential_pos_num() >= min_tangential_pos_num && + b.tangential_pos_num() <= max_tangential_pos_num) + { + rel_b.resize(1); + rel_b[0] = b; + } + else + { + rel_b.resize(0); + } +} + +auto_ptr +TrivialDataSymmetriesForBins:: +find_symmetry_operation_from_basic_bin(Bin&) const +{ + return auto_ptr(new TrivialSymmetryOperation); +} + +auto_ptr +TrivialDataSymmetriesForBins:: +find_symmetry_operation_from_basic_view_segment_numbers(ViewSegmentNumbers& vs) const +{ + return auto_ptr(new TrivialSymmetryOperation); +} + +void +TrivialDataSymmetriesForBins:: +get_related_view_segment_numbers(vector& all, const ViewSegmentNumbers& v_s) const +{ + all.resize(1); + all[0] = v_s; +} + + +int +TrivialDataSymmetriesForBins:: +num_related_view_segment_numbers(const ViewSegmentNumbers&) const +{ + return 1; +} + +bool +TrivialDataSymmetriesForBins:: +find_basic_view_segment_numbers(ViewSegmentNumbers&) const +{ + return false; +} + +bool +TrivialDataSymmetriesForBins:: +blindly_equals(const root_type * const) const +{ + return true; +} + +END_NAMESPACE_STIR diff --git a/src/recon_buildblock/distributable.cxx b/src/recon_buildblock/distributable.cxx new file mode 100644 index 0000000000..619577e26b --- /dev/null +++ b/src/recon_buildblock/distributable.cxx @@ -0,0 +1,509 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2011, Hammersmith Imanet Ltd + Copyright (C) 2013-2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup distributable + + \brief Implementation of stir::distributable_computation() and related functions + + \author Kris Thielemans + \author Alexey Zverovich + \author Matthew Jacobson + \author PARAPET project + \author Tobias Beisel +*/ +/* Modification history: + KT 30/05/2002 + get rid of dependence on specific symmetries (i.e. views up to 45 degrees) + + Tobias Beisel 16/06/2007 + added MPI support + added function for Cached MPI support + + Kris Thielemans Feb 2011 + move most ugly things into separate functions + added normalisation/mult_viewgrams support + */ +#include "stir/shared_ptr.h" +#include "stir/recon_buildblock/distributable.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ProjData.h" +#include "stir/ExamInfo.h" +#include "stir/DiscretisedDensity.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/CPUTimer.h" +#include "stir/recon_buildblock/ForwardProjectorByBin.h" +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include "stir/recon_buildblock/BinNormalisation.h" +#include "stir/is_null_ptr.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" // needed for RPC functions + +#ifdef STIR_MPI +#include "stir/recon_buildblock/distributableMPICacheEnabled.h" +#include "stir/recon_buildblock/distributed_functions.h" +#include "stir/recon_buildblock/distributed_test_functions.h" +#endif + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + +/* WARNING: the sequence of steps here has to match what is on the receiving end + in DistributedWorker */ +void setup_distributable_computation( + const shared_ptr& proj_pair_sptr, + const shared_ptr& exam_info_sptr, + const ProjDataInfo * const proj_data_info_ptr, + const shared_ptr >& target_sptr, + const bool zero_seg0_end_planes, + const bool distributed_cache_enabled) +{ +#ifdef STIR_MPI + distributed::first_iteration = true; + + //broadcast type of computation (currently only 1 available) + distributed::send_int_value(task_setup_distributable_computation, -1); + + //broadcast zero_seg0_end_planes + distributed::send_bool_value(zero_seg0_end_planes, -1, -1); + + //broadcast target_sptr + distributed::send_image_parameters(target_sptr.get(), -1, -1); + distributed::send_image_estimate(target_sptr.get(), -1); + + //sending Data_info + distributed::send_exam_and_proj_data_info(*exam_info_sptr, *proj_data_info_ptr, -1); + + //send projector pair + distributed::send_projectors(proj_pair_sptr, -1); + + //send configuration values for distributed computation + int configurations[4]; + configurations[0]=distributed::test?1:0; + configurations[1]=distributed::test_send_receive_times?1:0; + configurations[2]=distributed::rpc_time?1:0; + configurations[3]=distributed_cache_enabled?1:0; + distributed::send_int_values(configurations, 4, distributed::STIR_MPI_CONF_TAG, -1); + + distributed::send_double_values(&distributed::min_threshold, 1, distributed::STIR_MPI_CONF_TAG, -1); + +#ifndef NDEBUG + //test sending parameter_info + if (distributed::test) + distributed::test_parameter_info_master(proj_pair_sptr->stir::ParsingObject::parameter_info(), 1, "projector_pair_ptr"); +#endif + +#endif // STIR_MPI +} + +void end_distributable_computation() +{ +#ifdef STIR_MPI + int my_rank; + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank) ; /*Gets the rank of the Processor*/ + if (my_rank==0) + { + //broadcast end of processing notification + distributed::send_int_value(task_stop_processing, -1); + } +#endif + +} + +template +static void +zero_end_sinograms(ViewgramsPtr viewgrams_ptr) +{ + if (!is_null_ptr(viewgrams_ptr)) + { + const int min_ax_pos_num = viewgrams_ptr->get_min_axial_pos_num(); + const int max_ax_pos_num = viewgrams_ptr->get_max_axial_pos_num(); + for (RelatedViewgrams::iterator r_viewgrams_iter = viewgrams_ptr->begin(); + r_viewgrams_iter != viewgrams_ptr->end(); + ++r_viewgrams_iter) + { + (*r_viewgrams_iter)[min_ax_pos_num].fill(0); + (*r_viewgrams_iter)[max_ax_pos_num].fill(0); + } + } +} + + +static +void get_viewgrams(shared_ptr >& y, + shared_ptr >& additive_binwise_correction_viewgrams, + shared_ptr >& mult_viewgrams_sptr, + const shared_ptr& proj_dat_ptr, + const bool read_from_proj_dat, + const bool zero_seg0_end_planes, + const shared_ptr& binwise_correction, + const shared_ptr& normalisation_sptr, + const double start_time_of_frame, + const double end_time_of_frame, + const shared_ptr& symmetries_ptr, + const ViewSegmentNumbers& view_segment_num + ) +{ + if (!is_null_ptr(binwise_correction)) + { +#if !defined(_MSC_VER) || _MSC_VER>1300 + additive_binwise_correction_viewgrams.reset( + new RelatedViewgrams + (binwise_correction->get_related_viewgrams(view_segment_num, symmetries_ptr))); +#else + RelatedViewgrams tmp(binwise_correction-> + get_related_viewgrams(view_segment_num, symmetries_ptr)); + additive_binwise_correction_viewgrams.reset(new RelatedViewgrams(tmp)); +#endif + } + + if (read_from_proj_dat) + { +#if !defined(_MSC_VER) || _MSC_VER>1300 + y.reset(new RelatedViewgrams + (proj_dat_ptr->get_related_viewgrams(view_segment_num, symmetries_ptr))); +#else + // workaround VC++ 6.0 bug + RelatedViewgrams tmp(proj_dat_ptr-> + get_related_viewgrams(view_segment_num, symmetries_ptr)); + y.reset(new RelatedViewgrams(tmp)); +#endif + } + else + { + y.reset(new RelatedViewgrams + (proj_dat_ptr->get_empty_related_viewgrams(view_segment_num, symmetries_ptr))); + } + + // multiplicative correction + if (!is_null_ptr(normalisation_sptr) && !normalisation_sptr->is_trivial()) + { + mult_viewgrams_sptr.reset( + new RelatedViewgrams(proj_dat_ptr->get_empty_related_viewgrams(view_segment_num, symmetries_ptr))); + mult_viewgrams_sptr->fill(1.F); + normalisation_sptr->undo(*mult_viewgrams_sptr,start_time_of_frame,end_time_of_frame); + } + + if (view_segment_num.segment_num()==0 && zero_seg0_end_planes) + { + zero_end_sinograms(y); + zero_end_sinograms(additive_binwise_correction_viewgrams); + zero_end_sinograms(mult_viewgrams_sptr); + } +} + +#ifdef STIR_MPI +void send_viewgrams(const shared_ptr >& y, + const shared_ptr >& additive_binwise_correction_viewgrams, + const shared_ptr >& mult_viewgrams_sptr, + const int next_receiver) +{ + distributed::send_view_segment_numbers( y->get_basic_view_segment_num(), NEW_VIEWGRAM_TAG, next_receiver); + +#ifndef NDEBUG + //test sending related viegrams + shared_ptr + symmetries_sptr(y->get_symmetries_ptr()->clone()); + if (distributed::test && distributed::first_iteration==true && next_receiver==1) + distributed::test_related_viewgrams_master(y->get_proj_data_info_ptr()->create_shared_clone(), + symmetries_sptr, y.get(), next_receiver); +#endif + + //TODO: this could also be done by using MPI_Probe at the slave to find out what to recieve next + if (is_null_ptr(additive_binwise_correction_viewgrams)) + { //tell slaves that recieving additive_binwise_correction_viewgrams is not needed + distributed::send_bool_value(false, BINWISE_CORRECTION_TAG, next_receiver); + } + else + { + //tell slaves to receive additive_binwise_correction_viewgrams + distributed::send_bool_value(true, BINWISE_CORRECTION_TAG, next_receiver); + distributed::send_related_viewgrams(additive_binwise_correction_viewgrams.get(), next_receiver); + } + if (is_null_ptr(mult_viewgrams_sptr)) + { + //tell slaves that recieving mult_viewgrams is not needed + distributed::send_bool_value(false, BINWISE_MULT_TAG, next_receiver); + } + else + { + //tell slaves to receive mult_viewgrams + distributed::send_bool_value(true, BINWISE_MULT_TAG, next_receiver); + distributed::send_related_viewgrams(mult_viewgrams_sptr.get(), next_receiver); + } + // send y + distributed::send_related_viewgrams(y.get(), next_receiver); +} +#endif + +void distributable_computation( + const shared_ptr& forward_projector_ptr, + const shared_ptr& back_projector_ptr, + const shared_ptr& symmetries_ptr, + DiscretisedDensity<3,float>* output_image_ptr, + const DiscretisedDensity<3,float>* input_image_ptr, + const shared_ptr& proj_dat_ptr, + const bool read_from_proj_dat, + int subset_num, int num_subsets, + int min_segment_num, int max_segment_num, + bool zero_seg0_end_planes, + double* log_likelihood_ptr, + const shared_ptr& binwise_correction, + const shared_ptr normalisation_sptr, + const double start_time_of_frame, + const double end_time_of_frame, + RPC_process_related_viewgrams_type * RPC_process_related_viewgrams, + DistributedCachingInformation* caching_info_ptr) + +{ +#ifdef STIR_MPI + // TODO need to differentiate depending on RPC_process_related_viewgrams + int task_id; + if (RPC_process_related_viewgrams == &RPC_process_related_viewgrams_accumulate_loglikelihood) + task_id=task_do_distributable_loglikelihood_computation; + else if (RPC_process_related_viewgrams == &RPC_process_related_viewgrams_gradient) + task_id=task_do_distributable_gradient_computation; + /* else if (RPC_process_related_viewgrams == & + case + task_id=task_do_distributable_sensitivity_computation;break; + */ + else + { + error("distributable_computation: unknown RPC task"); + } + + distributed::send_int_value(task_id, -1); + + if (caching_info_ptr != NULL) + { + distributable_computation_cache_enabled( + forward_projector_ptr, + back_projector_ptr, + symmetries_ptr, + output_image_ptr, + input_image_ptr, + proj_dat_ptr, + read_from_proj_dat, + subset_num, num_subsets, + min_segment_num, max_segment_num, + zero_seg0_end_planes, + log_likelihood_ptr, + binwise_correction, + normalisation_sptr, + start_time_of_frame, + end_time_of_frame, + RPC_process_related_viewgrams, + caching_info_ptr); + return; + } + + + //test distributed functions (see DistributedTestFunctions.h for details) + +#ifndef NDEBUG + if (distributed::test && distributed::first_iteration) + { + distributed::test_image_estimate_master(input_image_ptr, 1); + distributed::test_parameter_info_master(proj_dat_ptr->get_proj_data_info_ptr()->parameter_info(), 1, "proj_data_info"); + distributed::test_bool_value_master(true, 1); + distributed::test_int_value_master(444, 1); + distributed::test_int_values_master(1); + + Viewgram viewgram(proj_dat_ptr->get_proj_data_info_ptr()->create_shared_clone(), 44, 0); + for ( int tang_pos = viewgram.get_min_tangential_pos_num(); tang_pos <= viewgram.get_max_tangential_pos_num() ;++tang_pos) + for ( int ax_pos = viewgram.get_min_axial_pos_num(); ax_pos <= viewgram.get_max_axial_pos_num() ;++ax_pos) + viewgram[ax_pos][tang_pos]= rand(); + + distributed::test_viewgram_master(viewgram, proj_dat_ptr->get_proj_data_info_ptr()->create_shared_clone()); + } +#endif + + //send if log_likelihood_ptr is valid and so needs to be accumulated + distributed::send_bool_value(!is_null_ptr(log_likelihood_ptr),USE_DOUBLE_ARG_TAG,-1); + //send the current image estimate + distributed::send_image_estimate(input_image_ptr, -1); + //send if output_image_ptr is valid and so needs to be accumulated + distributed::send_bool_value(!is_null_ptr(output_image_ptr),USE_OUTPUT_IMAGE_ARG_TAG,-1); + +#endif + + assert(min_segment_num <= max_segment_num); + assert(subset_num >=0); + assert(subset_num < num_subsets); + + assert(!is_null_ptr(proj_dat_ptr)); + + if (output_image_ptr != NULL) + output_image_ptr->fill(0); + + if (log_likelihood_ptr != NULL) + { + (*log_likelihood_ptr) = 0.0; + }; + + if (zero_seg0_end_planes) + cerr << "End-planes of segment 0 will be zeroed" << endl; + +#ifdef STIR_MPI + int sent_count=0; //counts the work packages sent + int working_slaves_count=0; //counts the number of slaves which are currently working + int next_receiver=1; //always stores the next slave to be provided with work +#endif + //double total_seq_rpc_time=0.0; //sums up times used for RPC_process_related_viewgrams + + for (int segment_num = min_segment_num; segment_num <= max_segment_num; segment_num++) + { + CPUTimer segment_timer; + segment_timer.start(); + + int count=0, count2=0; + + // boolean used to see when to write diagnostic message + bool first_view_in_segment = true; + + for (int view = proj_dat_ptr->get_min_view_num() + subset_num; + view <= proj_dat_ptr->get_max_view_num(); + view += num_subsets) + { + const ViewSegmentNumbers view_segment_num(view, segment_num); + + if (!symmetries_ptr->is_basic(view_segment_num)) + continue; + + if (first_view_in_segment) + { + cerr << "Starting to process segment " << segment_num << " (and symmetry related segments)" << endl; + first_view_in_segment = false; + } + + shared_ptr > y; + shared_ptr > additive_binwise_correction_viewgrams; + shared_ptr > mult_viewgrams_sptr; + + get_viewgrams(y, additive_binwise_correction_viewgrams, mult_viewgrams_sptr, + proj_dat_ptr, read_from_proj_dat, + zero_seg0_end_planes, + binwise_correction, + normalisation_sptr, start_time_of_frame, end_time_of_frame, + symmetries_ptr, view_segment_num); + +#ifdef STIR_MPI + + //send viewgrams, the slave will immediatelly start calculation + send_viewgrams(y, additive_binwise_correction_viewgrams, mult_viewgrams_sptr, + next_receiver); + working_slaves_count++; + sent_count++; + + //give every slave some work before waiting for requests + if (sent_count < distributed::num_processors-1) // note: -1 as master doesn't get any viewgrams + next_receiver++; + else + { + //wait for available notification + int int_values[2]; + const MPI_Status status=distributed::receive_int_values(int_values, 2, AVAILABLE_NOTIFICATION_TAG); + next_receiver=status.MPI_SOURCE; + working_slaves_count--; + + //reduce count values + count+=int_values[0]; + count2+=int_values[1]; + } +#else // STIR_MPI + RPC_process_related_viewgrams(forward_projector_ptr, + back_projector_ptr, + output_image_ptr, input_image_ptr, y.get(), count, count2, log_likelihood_ptr, + additive_binwise_correction_viewgrams.get(), + mult_viewgrams_sptr.get()); + +#endif + } +#ifdef STIR_MPI + //in case of the last segment, receive remaining available notifications + if (segment_num == max_segment_num) + { + while(working_slaves_count>0) + { + int int_values[2]; + const MPI_Status status=distributed::receive_int_values(int_values, 2, AVAILABLE_NOTIFICATION_TAG); + working_slaves_count--; + + //reduce count values + count+=int_values[0]; + count2+=int_values[1]; + } + } +#endif + + if (first_view_in_segment != true) // only write message when at least one view was processed + { + // TODO this message relies on knowledge of count, count2 which might be inappropriate for + // the call-back function +#ifndef STIR_NO_RUNNING_LOG + cerr<<"\tNumber of (cancelled) singularities: "< +static void +zero_end_sinograms(ViewgramsPtr viewgrams_ptr) +{ + if (!is_null_ptr(viewgrams_ptr)) + { + const int min_ax_pos_num = viewgrams_ptr->get_min_axial_pos_num(); + const int max_ax_pos_num = viewgrams_ptr->get_max_axial_pos_num(); + for (RelatedViewgrams::iterator r_viewgrams_iter = viewgrams_ptr->begin(); + r_viewgrams_iter != viewgrams_ptr->end(); + ++r_viewgrams_iter) + { + (*r_viewgrams_iter)[min_ax_pos_num].fill(0); + (*r_viewgrams_iter)[max_ax_pos_num].fill(0); + } + } +} + +static std::vector +find_vs_nums_in_subset(const ProjDataInfo& proj_data_info, + const DataSymmetriesForViewSegmentNumbers& symmetries, + const int min_segment_num, const int max_segment_num, + const int subset_num, const int num_subsets) +{ + std::vector vs_nums_to_process; + for (int segment_num = min_segment_num; segment_num <= max_segment_num; segment_num++) + { + for (int view = proj_data_info.get_min_view_num() + subset_num; + view <= proj_data_info.get_max_view_num(); + view += num_subsets) + { + const ViewSegmentNumbers view_segment_num(view, segment_num); + + if (!symmetries.is_basic(view_segment_num)) + continue; + + vs_nums_to_process.push_back(view_segment_num); + +#ifndef NDEBUG + // test if symmetries didn't take us out of the segment range + std::vector rel_vs; + symmetries.get_related_view_segment_numbers(rel_vs, view_segment_num); + for (std::vector::const_iterator iter = rel_vs.begin(); iter!= rel_vs.end(); ++iter) + { + assert(iter->segment_num() >= min_segment_num); + assert(iter->segment_num() <= max_segment_num); + } +#endif + } + } + return vs_nums_to_process; +} + +static +void get_viewgrams(shared_ptr >& y, + shared_ptr >& additive_binwise_correction_viewgrams, + shared_ptr >& mult_viewgrams_sptr, + const shared_ptr& proj_dat_ptr, + const bool read_from_proj_dat, + const bool zero_seg0_end_planes, + const shared_ptr& binwise_correction, + const shared_ptr& normalisation_sptr, + const double start_time_of_frame, + const double end_time_of_frame, + const shared_ptr& symmetries_ptr, + const ViewSegmentNumbers& view_segment_num + ) +{ + if (!is_null_ptr(binwise_correction)) + { +#if !defined(_MSC_VER) || _MSC_VER>1300 + additive_binwise_correction_viewgrams.reset( + new RelatedViewgrams + (binwise_correction->get_related_viewgrams(view_segment_num, symmetries_ptr))); +#else + RelatedViewgrams tmp(binwise_correction-> + get_related_viewgrams(view_segment_num, symmetries_ptr)); + additive_binwise_correction_viewgrams = new RelatedViewgrams(tmp); +#endif + } + + if (read_from_proj_dat) + { +#if !defined(_MSC_VER) || _MSC_VER>1300 + y.reset(new RelatedViewgrams + (proj_dat_ptr->get_related_viewgrams(view_segment_num, symmetries_ptr))); +#else + // workaround VC++ 6.0 bug + RelatedViewgrams tmp(proj_dat_ptr-> + get_related_viewgrams(view_segment_num, symmetries_ptr)); + y = new RelatedViewgrams(tmp); +#endif + } + else + { + y.reset(new RelatedViewgrams + (proj_dat_ptr->get_empty_related_viewgrams(view_segment_num, symmetries_ptr))); + } + + // multiplicative correction + if (!is_null_ptr(normalisation_sptr) && !normalisation_sptr->is_trivial()) + { + mult_viewgrams_sptr.reset( + new RelatedViewgrams(proj_dat_ptr->get_empty_related_viewgrams(view_segment_num, symmetries_ptr))); + mult_viewgrams_sptr->fill(1.F); + normalisation_sptr->undo(*mult_viewgrams_sptr,start_time_of_frame,end_time_of_frame); + } + + if (view_segment_num.segment_num()==0 && zero_seg0_end_planes) + { + zero_end_sinograms(y); + zero_end_sinograms(additive_binwise_correction_viewgrams); + zero_end_sinograms(mult_viewgrams_sptr); + } +} + +static void send_viewgrams(const shared_ptr >& y, + const shared_ptr >& additive_binwise_correction_viewgrams, + const shared_ptr >& mult_viewgrams_sptr, + const int next_receiver) +{ + distributed::send_view_segment_numbers( y->get_basic_view_segment_num(), NEW_VIEWGRAM_TAG, next_receiver); + +#ifndef NDEBUG + //test sending related viewgrams + shared_ptr + symmetries_sptr(y->get_symmetries_ptr()->clone()); + if (distributed::test && distributed::first_iteration==true && next_receiver==1) + distributed::test_related_viewgrams_master(y->get_proj_data_info_ptr()->create_shared_clone(), + symmetries_sptr, y.get(), next_receiver); +#endif + + //TODO: this could also be done by using MPI_Probe at the slave to find out what to recieve next + if (is_null_ptr(additive_binwise_correction_viewgrams)) + { //tell slaves that recieving additive_binwise_correction_viewgrams is not needed + distributed::send_bool_value(false, BINWISE_CORRECTION_TAG, next_receiver); + } + else + { + //tell slaves to receive additive_binwise_correction_viewgrams + distributed::send_bool_value(true, BINWISE_CORRECTION_TAG, next_receiver); + distributed::send_related_viewgrams(additive_binwise_correction_viewgrams.get(), next_receiver); + } + if (is_null_ptr(mult_viewgrams_sptr)) + { + //tell slaves that recieving mult_viewgrams is not needed + distributed::send_bool_value(false, BINWISE_MULT_TAG, next_receiver); + } + else + { + //tell slaves to receive mult_viewgrams + distributed::send_bool_value(true, BINWISE_MULT_TAG, next_receiver); + distributed::send_related_viewgrams(mult_viewgrams_sptr.get(), next_receiver); + } + // send y + distributed::send_related_viewgrams(y.get(), next_receiver); +} + +void distributable_computation_cache_enabled( + const shared_ptr& forward_projector_ptr, + const shared_ptr& back_projector_ptr, + const shared_ptr& symmetries_ptr, + DiscretisedDensity<3,float>* output_image_ptr, + const DiscretisedDensity<3,float>* input_image_ptr, + const shared_ptr& proj_dat_ptr, + const bool read_from_proj_dat, + int subset_num, int num_subsets, + int min_segment_num, int max_segment_num, + bool zero_seg0_end_planes, + double* log_likelihood_ptr, + const shared_ptr& binwise_correction, + const shared_ptr normalise_sptr, + const double start_time_of_frame, + const double end_time_of_frame, + RPC_process_related_viewgrams_type * RPC_process_related_viewgrams, + DistributedCachingInformation* caching_info_ptr + ) +{ + //test distributed functions (see DistributedTestFunctions.h for details) +#ifndef NDEBUG + if (distributed::test && distributed::first_iteration) + { + distributed::test_image_estimate_master(input_image_ptr, 1); + distributed::test_parameter_info_master(proj_dat_ptr->get_proj_data_info_ptr()->parameter_info(), 1, "proj_data_info"); + distributed::test_bool_value_master(true, 1); + distributed::test_int_value_master(444, 1); + distributed::test_int_values_master(1); + + Viewgram viewgram(proj_dat_ptr->get_proj_data_info_ptr()->create_shared_clone(), 44, 0); + for ( int tang_pos = viewgram.get_min_tangential_pos_num(); tang_pos <= viewgram.get_max_tangential_pos_num() ;++tang_pos) + for ( int ax_pos = viewgram.get_min_axial_pos_num(); ax_pos <= viewgram.get_max_axial_pos_num() ;++ax_pos) + viewgram[ax_pos][tang_pos]= rand(); + + distributed::test_viewgram_master(viewgram, proj_dat_ptr->get_proj_data_info_ptr()->create_shared_clone()); + } +#endif + + //send if log_likelihood_ptr is valid and so needs to be accumulated + distributed::send_bool_value(!is_null_ptr(log_likelihood_ptr),USE_DOUBLE_ARG_TAG,-1); + //send the current image estimate + distributed::send_image_estimate(input_image_ptr, -1); + //send if output_image_ptr is valid and so needs to be accumulated + distributed::send_bool_value(!is_null_ptr(output_image_ptr),USE_OUTPUT_IMAGE_ARG_TAG,-1); + + assert(min_segment_num <= max_segment_num); + assert(subset_num >=0); + assert(subset_num < num_subsets); + + assert(!is_null_ptr(proj_dat_ptr)); + if (output_image_ptr != NULL) + output_image_ptr->fill(0); + + if (log_likelihood_ptr != NULL) + { + (*log_likelihood_ptr) = 0.0; + }; + + // needed for several send/receive operations + int int_values[2]; + + int working_slaves_count=0; //counts the number of slaves which are currently working + int next_receiver=1; //always stores the next slave to be provided with work + + int count=0, count2=0; + + const std::vector vs_nums_to_process = + find_vs_nums_in_subset(*proj_dat_ptr->get_proj_data_info_ptr(), *symmetries_ptr, + min_segment_num, max_segment_num, + subset_num, num_subsets); + + const std::size_t num_vs = vs_nums_to_process.size(); + + CPUTimer iteration_timer; + iteration_timer.start(); + + //initialize the caching values for the new iteration + caching_info_ptr->initialise_new_subiteration(vs_nums_to_process); + + //while not all vs_nums are processed repeat + for (std::size_t processed_count = 1; processed_count <= num_vs; ++processed_count) + { + ViewSegmentNumbers view_segment_num; + + //check whether the slave will receive a new or an already cached viewgram + const bool new_viewgrams = + caching_info_ptr->get_unprocessed_vs_num(view_segment_num, next_receiver); + // view_segment_num = vs_nums_to_process[processed_count-1]; + + //the slave has not yet processed this vs_num, so the viewgrams have to be sent + if (new_viewgrams==true) + { + cerr << "Sending segment " << view_segment_num.segment_num() + << ", view " << view_segment_num.view_num() << " to slave " << next_receiver << std::endl; + + shared_ptr > y; + shared_ptr > additive_binwise_correction_viewgrams; + shared_ptr > mult_viewgrams_sptr; + + get_viewgrams(y, additive_binwise_correction_viewgrams, mult_viewgrams_sptr, + proj_dat_ptr, read_from_proj_dat, + zero_seg0_end_planes, + binwise_correction, + normalise_sptr, start_time_of_frame, end_time_of_frame, + symmetries_ptr, view_segment_num); + + //send viewgrams, the slave will immediatelly start calculation + send_viewgrams(y, additive_binwise_correction_viewgrams, mult_viewgrams_sptr, + next_receiver); + } // if(new_viewgram) + else + { + cerr << "Re-using segment " << view_segment_num.segment_num() + << ", view " << view_segment_num.view_num() << " at slave " << next_receiver << std::endl; + //send vs_num with reuse-tag, the slave will immediatelly start calculation + distributed::send_view_segment_numbers( view_segment_num, REUSE_VIEWGRAM_TAG, next_receiver); + } + + working_slaves_count++; + + if (int(processed_count) 0) + { + status=distributed::receive_int_values(int_values, 2, AVAILABLE_NOTIFICATION_TAG); + working_slaves_count--; + + //reduce count values + count+=int_values[0]; + count2+=int_values[1]; + } + + // in the cache-enabled distributed case, this message is only printed once per iteration + // TODO this message relies on knowledge of count, count2 which might be inappropriate for + // the call-back function +#ifndef STIR_NO_RUNNING_LOG + cerr<<"\tNumber of (cancelled) singularities: "< +#include "stir/Succeeded.h" +#include "stir/error.h" +#include + +namespace distributed +{ + //timings and tests + bool rpc_time=false; + bool test_send_receive_times=false; + + double total_rpc_time=0; + double min_threshold=0.1; + double total_rpc_time_slaves=0.0; + double total_rpc_time_2=0.0; + bool test=false; + + + //global variable often used + int num_processors; + int length; + + int processor; + bool first_iteration; + int iteration_counter=0; + int image_buffer_size; + MPI_Status status; + float parameters[6]; //array for receiving image parameters + int sizes[6]; //array for receiving image dimensions + + stir::HighResWallClockTimer t; + + + //--------------------------------------Send Operations------------------------------------- + + void send_int_value(int value, int destination) + { + int i = value; + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (destination == -1) MPI_Bcast(&i, 1, MPI_INT, 0, MPI_COMM_WORLD); + else MPI_Send(&i, 1, MPI_INT, destination, INT_TAG, MPI_COMM_WORLD); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Master/Slave: sending int value took " << t.value() << " seconds" << std::endl; +#endif + } + + void send_string(const string& str, int tag, int destination) + { + //prepare sending parameter info + length=str.length()+1; + char * buf= new char[length]; + strcpy(buf, str.c_str()); + + //send parameter info +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (destination == -1) + for (int processor=1; processormin_threshold) std::cout << "Master/Slave: sending string took " << t.value() << " seconds" << std::endl; +#endif + + delete[] buf; + } + + void send_bool_value(bool value, int tag, int destination) + { + int i; + if (value==true) i=1; + else i=0; + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (destination==-1||tag ==-1) MPI_Bcast(&i, 1, MPI_INT, 0, MPI_COMM_WORLD); + else MPI_Send(&i, 1, MPI_INT, destination, tag, MPI_COMM_WORLD); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Master/Slave: sending bool value took " << t.value() << " seconds" << std::endl; +#endif + + } + + void send_int_values(int * values, int count, int tag, int destination) + { +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (destination == -1) + { + for (processor=1; processormin_threshold) std::cout << "Master/Slave " << my_rank << ": sending int values took " << t.value() << " seconds"<< std::endl; +#endif + + } + + void send_double_values(double * values, int count, int tag, int destination) + { + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (destination == -1) + { + for (processor=1; processormin_threshold) std::cout << "Master: sending double values took " << t.value() << " seconds" << std::endl; +#endif + } + + void send_view_segment_numbers(const stir::ViewSegmentNumbers& vs_num, int tag, int destination) + { + int int_values[2]; + int_values[0]=vs_num.view_num(); + int_values[1]=vs_num.segment_num(); + distributed::send_int_values(int_values, 2, tag, destination); + } + + void send_image_parameters(const stir::DiscretisedDensity<3,float>* input_image_ptr, int tag, int destination) + { + //cast to allow getting image dimensions and grid_spacing + const stir::VoxelsOnCartesianGrid* image = + dynamic_cast* >(input_image_ptr); + + //input_image dimensions + int sizes[6]; + sizes[0] = image->get_min_x(); + sizes[1] = image->get_min_y(); + sizes[2] = image->get_min_z(); + sizes[3] = image->get_max_x(); + sizes[4] = image->get_max_y(); + sizes[5] = image->get_max_z(); + + //buffer for input_image-array + image_buffer_size=(sizes[3]-sizes[0]+1)*(sizes[4]-sizes[1]+1)*(sizes[5]-sizes[2]+1); + + //get origin of input_image_ptr + stir::CartesianCoordinate3D origin = input_image_ptr->get_origin(); + + //get grid_spacing of input_image_ptr + stir::CartesianCoordinate3D grid_spacing = image->get_grid_spacing(); + + float parameters[6]; + parameters[0] = origin.x(); + parameters[1] = origin.y(); + parameters[2] = origin.z(); + parameters[3] = grid_spacing.x(); + parameters[4] = grid_spacing.y(); + parameters[5] = grid_spacing.z(); + + + //Sending image parameters +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (tag == -1 || destination == -1) MPI_Bcast(parameters, 6, MPI_FLOAT, 0, MPI_COMM_WORLD); + else MPI_Send(parameters, 6, MPI_FLOAT, destination, tag, MPI_COMM_WORLD); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Master/Slave: sending image parameters took " << t.value() << " seconds" << std::endl; +#endif + + //send dimensions to construct IndexRange-object +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (tag == -1 || destination == -1) MPI_Bcast(sizes, 6, MPI_INT, 0, MPI_COMM_WORLD); + else MPI_Send(sizes, 6, MPI_INT, destination, tag, MPI_COMM_WORLD); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Master/Slave: sending image dimensions took " << t.value() << " seconds" << std::endl; +#endif + + } + + void send_image_estimate(const stir::DiscretisedDensity<3,float>* input_image_ptr, int destination) + { + float *image_buf = new float[image_buffer_size]; + + //serialize input_image into 1-demnsional array + std::copy(input_image_ptr->begin_all(), input_image_ptr->end_all(), image_buf); + + //send input image +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (destination == -1) + { + MPI_Bcast(image_buf, image_buffer_size, MPI_FLOAT, 0, MPI_COMM_WORLD); + //for (int processor=1; processormin_threshold) std::cout << "Master/Slave: sending image values took " << t.value() << " seconds" << std::endl; +#endif + } + + void send_exam_and_proj_data_info(const stir::ExamInfo& exam_info, const stir::ProjDataInfo& proj_data_info, int destination) + { + // KT TODO there must be a better way than writing to a temporary file on disk + stir::shared_ptr exam_info_sptr(new stir::ExamInfo(exam_info)); + stir::ProjDataInterfile projection_data_for_slave(exam_info_sptr, proj_data_info.create_shared_clone(),"for_slave"); + + std::ifstream is("for_slave.hs", ios::binary ); + + // get length of file: + is.seekg (0, ios::end); + length = is.tellg(); + is.seekg (0, ios::beg); + + length++; + + char * file_buffer = new char[length]; + + // read data as a block: + is.read (file_buffer,length-1); + is.close(); + file_buffer[length-1]='\0'; + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + //send text_buffer + if (destination==-1) + for (processor=1; processormin_threshold) std::cout << "Master: sending projection_data_info took " << t.value() << " seconds" << std::endl; +#endif + + + if( remove( "for_slave.hs" ) != 0 ) + stir::warning( "Error deleting temporary file" ); + if( remove( "for_slave.s" ) != 0 ) + stir::warning( "Error deleting temporary file" ); + + delete[] file_buffer; + } + + void send_related_viewgrams(stir::RelatedViewgrams* viewgrams, int destination) + { + //broadcast count of viewgrams to be received + int num_viewgrams=viewgrams->get_num_viewgrams(); + + //run through viewgrams + stir::RelatedViewgrams::iterator viewgrams_iter = viewgrams->begin(); + const stir::RelatedViewgrams::iterator viewgrams_end = viewgrams->end(); + + send_int_values(&num_viewgrams, 1, VIEWGRAM_COUNT_TAG, destination); + + while (viewgrams_iter!= viewgrams_end) + { + send_viewgram(*viewgrams_iter, destination); + ++viewgrams_iter; + } + } + + void send_viewgram(const stir::Viewgram& viewgram, int destination) + { + //send dimensions of viewgram (axial and tangential positions and the view and segment numbers) + int viewgram_values[6]; + viewgram_values[0] = viewgram.get_min_axial_pos_num(); + viewgram_values[1] = viewgram.get_max_axial_pos_num(); + viewgram_values[2] = viewgram.get_min_tangential_pos_num(); + viewgram_values[3] = viewgram.get_max_tangential_pos_num(); + viewgram_values[4] = viewgram.get_view_num(); + viewgram_values[5] = viewgram.get_segment_num(); + + send_int_values(viewgram_values, 6, VIEWGRAM_DIMENSIONS_TAG, destination); + + //allocate send-buffer + int buffer_size=(viewgram_values[1]-viewgram_values[0]+1)*(viewgram_values[3]-viewgram_values[2]+1); + float *viewgram_buf = new float[buffer_size]; + std::copy(viewgram.begin_all(), viewgram.end_all(), viewgram_buf); + + //send array +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + MPI_Send(viewgram_buf, buffer_size, MPI_FLOAT, destination, VIEWGRAM_TAG, MPI_COMM_WORLD); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Master: sending viewgram took " << t.value() << " seconds" << std::endl; +#endif + + delete[] viewgram_buf; + } + + void send_projectors(const stir::shared_ptr &proj_pair_sptr, int destination) + { + //send registered name of projector pair + distributed::send_string(proj_pair_sptr->get_registered_name(), REGISTERED_NAME_TAG, destination); + + //send parameter info of projector pair + distributed::send_string(proj_pair_sptr->stir::ParsingObject::parameter_info(), PARAMETER_INFO_TAG, destination); + + } + + //--------------------------------------Receive Operations------------------------------------- + + int receive_int_value(int source) + { + int i; +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (source==-1) MPI_Bcast(&i, 1, MPI_INT, 0, MPI_COMM_WORLD); + else MPI_Recv(&i, 1, MPI_INT, source, INT_TAG, MPI_COMM_WORLD, &status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received int value after " << t.value() << " seconds" << std::endl; +#endif + + return i; + } + + string receive_string(int tag, int source) + { +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + MPI_Recv(&length, 1, MPI_INT, source, tag, MPI_COMM_WORLD, &status); + char * buf= new char[length]; + MPI_Recv(buf, length, MPI_CHAR, source, tag, MPI_COMM_WORLD, & status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received string value after " << t.value() << " seconds" << std::endl; +#endif + + //convert to string + string str(buf); + delete[] buf; + return str; + } + + void receive_and_initialize_projectors(stir::shared_ptr &projector_pair_ptr, int source) + { + //Receive projector-pair registered_keyword +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + // KT TODO. use receive_string() to clean-up code + + MPI_Recv(&length, 1, MPI_INT, source, REGISTERED_NAME_TAG, MPI_COMM_WORLD, &status); + char * buf= new char[length]; + MPI_Recv(buf, length, MPI_CHAR, source, REGISTERED_NAME_TAG, MPI_COMM_WORLD, & status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received REGISTERED_NAME_TAG value after " << t.value() << " seconds" << std::endl; +#endif + + //convert to string + string registered_name_proj_pair(buf); + delete[] buf; + + //Receive parameter info +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + MPI_Recv(&length, 1, MPI_INT, source, PARAMETER_INFO_TAG, MPI_COMM_WORLD, &status); + + char * buf3= new char[length]; + MPI_Recv(buf3, length, MPI_CHAR, source, PARAMETER_INFO_TAG, MPI_COMM_WORLD, & status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received parameter info value after " << t.value() << " seconds" << std::endl; +#endif + + //convert to string + string parameter_info(buf3); + delete[] buf3; + + //construct new Backprojector and Forward Projector, projector_pair_ptr + std::istringstream parameter_info_stream(parameter_info); + + projector_pair_ptr. + reset(stir::RegisteredObject:: + read_registered_object(¶meter_info_stream, registered_name_proj_pair)); + } + + bool receive_bool_value(int tag, int source) + { + int i = 0; // initialise to avoid compiler warning + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (tag==-1 || source == -1) MPI_Bcast(&i, 1, MPI_INT, 0, MPI_COMM_WORLD); + else MPI_Recv(&i, 1, MPI_INT, source, tag, MPI_COMM_WORLD, &status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received bool value after " << t.value() << " seconds" << std::endl; +#endif + + return i!=0; + } + + MPI_Status receive_int_values(int * values, int count, int tag) + { + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (tag == ARBITRARY_TAG) MPI_Recv(values, count, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); + else MPI_Recv(values, count, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + int my_rank=0; + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank) ; /*Gets the rank of the Processor*/ + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Master/Slave " << my_rank << ": received "<< count << " int values after " << t.value() << " seconds"<< std::endl; +#endif + + return status; + } + + MPI_Status receive_double_values(double * values, int count, int tag) + { + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (tag == ARBITRARY_TAG) MPI_Recv(values, count, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); + else MPI_Recv(values, count, MPI_DOUBLE, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received double values after " << t.value() << " seconds" << std::endl; +#endif + + return status; + } + + MPI_Status receive_view_segment_numbers(stir::ViewSegmentNumbers& vs_num, int tag) + { + int int_values[2]; + const MPI_Status status = distributed::receive_int_values(int_values, 2, tag); + vs_num.view_num() = int_values[0]; + vs_num.segment_num() = int_values[1]; + return status; + } + + void receive_and_set_image_parameters(stir::shared_ptr > &image_ptr, int &buffer, int tag, int source) + { + //receive image parameters (origin and grid_spacing) +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (tag==-1) MPI_Bcast(parameters, 6, MPI_FLOAT, source, MPI_COMM_WORLD); + else MPI_Recv(parameters, 6, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received origin and grid_spacing after " << t.value() << " seconds" << std::endl; + + //receive dimensions of Image-data + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + if (tag==-1) MPI_Bcast(sizes, 6, MPI_INT, source, MPI_COMM_WORLD); + else MPI_Recv(sizes, 6, MPI_INT, source, tag, MPI_COMM_WORLD, &status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received image dimensions after " << t.value() << " seconds" << std::endl; +#endif + + buffer=(sizes[3]-sizes[0]+1)*(sizes[4]-sizes[1]+1)*(sizes[5]-sizes[2]+1); + + //construct new index range from received values + stir::IndexRange<3> + range(stir::CartesianCoordinate3D(sizes[2],sizes[1],sizes[0]), + stir::CartesianCoordinate3D(sizes[5],sizes[4],sizes[3])); + + //construct new image object to save received input-image values + stir::CartesianCoordinate3D origin( parameters[2], parameters[1], parameters[0]); + stir::CartesianCoordinate3D grid_spacing(parameters[5], parameters[4], parameters[3]); +#if 0 + stir::VoxelsOnCartesianGrid *voxels = new stir::VoxelsOnCartesianGrid(range, origin, grid_spacing); + stir::shared_ptr > tmpPtr(voxels); + + //point pointer to newly created image_estimate + image_ptr = *(stir::shared_ptr >*)&tmpPtr; +#else + image_ptr.reset(new stir::VoxelsOnCartesianGrid(range, origin, grid_spacing)); +#endif + } + + MPI_Status receive_image_values_and_fill_image_ptr(stir::shared_ptr > &image_ptr, int buffer_size, int source) + { + //buffer for input_image + float * buffer = new float[buffer_size]; + if (buffer == 0) + stir::error("Ran out of memory"); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + MPI_Bcast(buffer, buffer_size, MPI_FLOAT, source, MPI_COMM_WORLD); + //else MPI_Recv(buffer, buffer_size, MPI_FLOAT, source, IMAGE_ESTIMATE_TAG, MPI_COMM_WORLD, & status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received image values after " << t.value() << " seconds" << std::endl; +#endif + + std::copy(buffer, buffer + buffer_size, image_ptr->begin_all()); + delete[] buffer; + + return status; + } + + void receive_and_construct_exam_and_proj_data_info_ptr(stir::shared_ptr& exam_info_sptr, + stir::shared_ptr& proj_data_info_sptr, + int source) + { + int len; + //receive projection data info pointer +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + MPI_Recv(&len, 1, MPI_INT, source, PROJECTION_DATA_INFO_TAG, MPI_COMM_WORLD, &status); + boost::shared_array proj_data_info_buf(new char[len]); + MPI_Recv(proj_data_info_buf.get(), len, MPI_CHAR, source, PROJECTION_DATA_INFO_TAG, MPI_COMM_WORLD, & status); + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received proj_data_info after " << t.value() << " seconds" << std::endl; +#endif + + //construct projector_info_ptr + std::istringstream projector_info_ptr_stream(proj_data_info_buf.get()); + + stir::InterfileHeader hdr; + std::ios::off_type offset = projector_info_ptr_stream.tellg(); + if (!hdr.parse(projector_info_ptr_stream, false)) // parse without warnings + { + stir::error("Error receiving projection data info. Text does not seem to be in Interfile format"); + } + projector_info_ptr_stream.seekg(offset); + exam_info_sptr = hdr.get_exam_info_sptr(); + if (hdr.get_exam_info_ptr()->imaging_modality.get_modality() == + stir::ImagingModality::NM) + { + stir::InterfilePDFSHeaderSPECT hdr; + if (!hdr.parse(projector_info_ptr_stream)) + stir::error("Error receiving projection data info. Text does not seem to be in Interfile format"); + proj_data_info_sptr = + stir::shared_ptr (hdr.data_info_sptr->clone()); + } + else + { + stir::InterfilePDFSHeader hdr; + if (!hdr.parse(projector_info_ptr_stream)) + stir::error("Error receiving projection data info. Text does not seem to be in Interfile format"); + + proj_data_info_sptr = + stir::shared_ptr (hdr.data_info_ptr->clone()); + } + } + + void receive_and_construct_related_viewgrams(stir::RelatedViewgrams*& viewgrams, + const stir::shared_ptr& proj_data_info_ptr, + const stir::shared_ptr symmetries_sptr, + int source) + { + //receive count of viewgrams + int int_values[1]; + status=distributed::receive_int_values(int_values, 1, VIEWGRAM_COUNT_TAG); + + vector > viewgrams_vector; + + viewgrams_vector.reserve(int_values[0]); + + for (int i=0; i* vg = NULL; + + //receive a viewgram from Master + receive_and_construct_viewgram(vg, proj_data_info_ptr, source); + + //add viewgram to Viewgram-vector + viewgrams_vector.push_back(*vg); + delete vg; + } + + //use viewgram-vector and symmetries-pointer to construct related viewgrams element + viewgrams = new stir::RelatedViewgrams(viewgrams_vector, symmetries_sptr); + } + + void receive_and_construct_viewgram(stir::Viewgram*& viewgram_ptr, + const stir::shared_ptr& proj_data_info_ptr, + int source) + { +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + //receive dimension of viewgram (vlues 0-3) and view_num + segment_num (values 4-5) + int viewgram_values[6]; + + status = receive_int_values(viewgram_values, 6, VIEWGRAM_DIMENSIONS_TAG); + + const int v_num = viewgram_values[4]; + const int s_num = viewgram_values[5]; + + viewgram_ptr= new stir::Viewgram(proj_data_info_ptr, v_num, s_num); + + //allocate receive-buffer + const int buffer_size=(viewgram_values[1]-viewgram_values[0]+1)*(viewgram_values[3]-viewgram_values[2]+1); + float *viewgram_buf = new float[buffer_size]; + + //receive viewgram array + + MPI_Recv(viewgram_buf, buffer_size, MPI_FLOAT, source, VIEWGRAM_TAG, MPI_COMM_WORLD, &status); + + std::copy(viewgram_buf, viewgram_buf+buffer_size, viewgram_ptr->begin_all()); + + delete[] viewgram_buf; + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave: received viewgram_array after " << t.value() << " seconds" << std::endl; +#endif + + } + + //--------------------------------------Reduce Operations------------------------------------- + + void reduce_received_output_image(stir::DiscretisedDensity<3,float>* output_image_ptr, int destination) + { + #ifdef STIR_MPI_TIMINGS + stir::HighResWallClockTimer fulltimer; + fulltimer.reset(); fulltimer.start(); +#endif + float *output_buf = new float[image_buffer_size]; + float *image_buf = new float[image_buffer_size]; + + //initialize output_buffer to zero. + //contributions from all slaves will be added into it + //KTXXXfor (int i=0; imin_threshold) std::cout << "Master: reduced output_image after " << t.value() << " seconds" << std::endl; +#endif + + std::cout <<"Master: output_image reduced.\n"; + + //get input_image from 1-demnsional array + std::copy(output_buf, output_buf+image_buffer_size, output_image_ptr->begin_all()); + delete[] output_buf; +#ifdef STIR_MPI_TIMINGS + fulltimer.stop(); + if (test_send_receive_times /*&& fulltimer.value()>min_threshold*/) std::cout << "Master: reduced output_image total after " << fulltimer.value() << " seconds" << std::endl; +#endif + } + + void reduce_output_image(stir::shared_ptr > &output_image_ptr, int image_buffer_size, int my_rank_ignored, int destination) + { + float *output_buf = new float[image_buffer_size]; + float *image_buf = new float[image_buffer_size]; + + //serialize input_image into 1-demnsional array + //KTXXXstd::copy(output_image_ptr->begin_all(), output_image_ptr->end_all(), output_buf); + std::copy(output_image_ptr->begin_all(), output_image_ptr->end_all(), image_buf); + + //reduction of output_image at master +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) {t.reset(); t.start();} +#endif + + MPI_Reduce(image_buf, output_buf, image_buffer_size, MPI_FLOAT, MPI_SUM, destination, MPI_COMM_WORLD); + delete[] image_buf; + +#ifdef STIR_MPI_TIMINGS + if (test_send_receive_times) t.stop(); + int my_rank=0; + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank) ; /*Gets the rank of the Processor*/ + if (test_send_receive_times && t.value()>min_threshold) std::cout << "Slave " << my_rank << ": reduced output_image after " << t.value() << " seconds" << std::endl; +#endif + delete[] output_buf; + } + +} diff --git a/src/recon_buildblock/distributed_test_functions.cxx b/src/recon_buildblock/distributed_test_functions.cxx new file mode 100644 index 0000000000..c660b8aac1 --- /dev/null +++ b/src/recon_buildblock/distributed_test_functions.cxx @@ -0,0 +1,276 @@ +// +// +/* + Copyright (C) 2007- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup distributable + + \brief Implementation of test functions in distributed namespace + + \author Tobias Beisel + +*/ + +#include "stir/recon_buildblock/distributed_test_functions.h" +#include "stir/recon_buildblock/distributed_functions.h" +#include "stir/VoxelsOnCartesianGrid.h" + +namespace distributed +{ + void test_viewgram_slave(const stir::shared_ptr& proj_data_info_ptr) + { + printf("\n-----Slave startet Test for sending viewgram----------\n"); + + stir::Viewgram* vg= NULL; + receive_and_construct_viewgram(vg, proj_data_info_ptr, 0); + + send_viewgram(*vg, 0); + vg=NULL; + delete vg; + } + + void test_viewgram_master(stir::Viewgram viewgram, const stir::shared_ptr& proj_data_info_ptr) + { + printf("\n-----Running Test for sending viewgram----------\n"); + + send_viewgram(viewgram, 1); + + stir::Viewgram* vg= NULL; + receive_and_construct_viewgram(vg, proj_data_info_ptr, 1); + + assert(vg!=NULL); + assert(vg->has_same_characteristics(viewgram)); + assert(*vg==viewgram); + + for ( int tang_pos = viewgram.get_min_tangential_pos_num(); tang_pos <= viewgram.get_max_tangential_pos_num() ;++tang_pos) + for ( int ax_pos = viewgram.get_min_axial_pos_num(); ax_pos <= viewgram.get_max_axial_pos_num() ;++ax_pos) + { + assert(viewgram[ax_pos][tang_pos]==(*vg)[ax_pos][tang_pos]); + if (viewgram[ax_pos][tang_pos]!=(*vg)[ax_pos][tang_pos]) printf("-----Test sending viewgram failed!!!!-------------\n"); + } + assert(vg->get_view_num()==viewgram.get_view_num()); + if (vg->get_view_num()!=viewgram.get_view_num()) printf("-----Test sending viewgram failed!!!!-------------\n"); + assert(vg->get_segment_num()==viewgram.get_segment_num()); + if (vg->get_segment_num()!=viewgram.get_segment_num()) printf("-----Test sending viewgram failed!!!!-------------\n"); + + delete vg; + printf("\n-----Test sending viewgram done-----------\n"); + } + + void test_image_estimate_master(const stir::DiscretisedDensity<3,float>* input_image_ptr, int slave) + { + printf("\n-----Running Test for sending image estimate-----\n"); + + int image_buffer_size; + + send_image_parameters(input_image_ptr, 99, slave); + send_image_estimate(input_image_ptr, slave); + + stir::shared_ptr > target_image_sptr; + receive_and_set_image_parameters(target_image_sptr, image_buffer_size, 99, slave); + + receive_image_values_and_fill_image_ptr(target_image_sptr, image_buffer_size, slave); + + assert(target_image_sptr->has_same_characteristics(*input_image_ptr)); + assert(*input_image_ptr==*target_image_sptr); + + stir::DiscretisedDensity<3,float>::const_full_iterator density_iter = input_image_ptr->begin_all(); + stir::DiscretisedDensity<3,float>::const_full_iterator density_end = input_image_ptr->end_all(); + + stir::DiscretisedDensity<3,float>::full_iterator target_density_iter = target_image_sptr->begin_all(); + + while (density_iter!= density_end) + { + assert(*density_iter == *target_density_iter); + + density_iter++; + target_density_iter++; + } + + printf("\n-----Test sending image estimate done-----\n"); + } + + void test_image_estimate_slave() + { + printf("\n-----Slave startet Test for sending image estimate-----\n"); + + int buffer_size; + stir::shared_ptr > received_image_estimate; + + receive_and_set_image_parameters(received_image_estimate, buffer_size, 99, 0); + receive_image_values_and_fill_image_ptr(received_image_estimate, buffer_size, 0); + + send_image_parameters(received_image_estimate.get(), 99, 0); + send_image_estimate(received_image_estimate.get(), 0); + } + + void test_related_viewgrams_master(const stir::shared_ptr& proj_data_info_ptr, + const stir::shared_ptr symmetries_sptr, + stir::RelatedViewgrams* y, int slave) + { + printf("\n-----Running Test for sending related viewgrams-----\n"); + + send_related_viewgrams(y, 1); + + stir::RelatedViewgrams* received_viewgrams=NULL; + + receive_and_construct_related_viewgrams(received_viewgrams, + proj_data_info_ptr, + symmetries_sptr, 1); + + assert(received_viewgrams!=NULL); + assert(received_viewgrams->has_same_characteristics(*y)); + assert(*received_viewgrams==*y); + + stir::RelatedViewgrams::iterator viewgrams_iter = y->begin(); + stir::RelatedViewgrams::iterator viewgrams_end = y->end(); + stir::RelatedViewgrams::iterator received_viewgrams_iter = received_viewgrams->begin(); + + int pos=0; + while (viewgrams_iter!= viewgrams_end) + { + for ( int tang_pos = (*viewgrams_iter).get_min_tangential_pos_num() ;tang_pos <= (*viewgrams_iter).get_max_tangential_pos_num() ;++tang_pos) + for ( int ax_pos = (*viewgrams_iter).get_min_axial_pos_num(); ax_pos <= (*viewgrams_iter).get_max_axial_pos_num() ;++ax_pos) + { + pos++; + assert(((*viewgrams_iter)[ax_pos][tang_pos])==(*received_viewgrams_iter)[ax_pos][tang_pos]); + } + viewgrams_iter++; + received_viewgrams_iter++; + } + + received_viewgrams=NULL; + delete received_viewgrams; + printf("\n-----Test sending related viewgrams done-----\n"); + } + + void test_related_viewgrams_slave(const stir::shared_ptr& proj_data_info_ptr, + const stir::shared_ptr symmetries_sptr + ) + { + printf("\n-----Slave startet Test for sending related viewgrams-----\n"); + + stir::RelatedViewgrams* received_viewgrams=NULL; + + receive_and_construct_related_viewgrams(received_viewgrams, + proj_data_info_ptr, + symmetries_sptr, 0); + + assert(received_viewgrams!=NULL); + + send_related_viewgrams(received_viewgrams, 0); + + received_viewgrams=NULL; + delete received_viewgrams; + } + + void test_parameter_info_master(const string str, int slave, char const * const text) + { + printf("\n-----Running Test for sending %s-----\n", text); + + string slave_string= receive_string(88, slave); + + assert(str.compare(slave_string)==0); + + /*printf("\nReceived Parameter Info:\n"); + cerr< idummy0(0); + +static PoissonLogLikelihoodWithLinearModelForMeanAndProjData >::RegisterIt dummy1; +static PoissonLogLikelihoodWithLinearModelForMeanAndListModeDataWithProjMatrixByBin >::RegisterIt dummy2; + +static FilterRootPrior >::RegisterIt dummy4; +static QuadraticPrior::RegisterIt dummy5; + +static ProjMatrixByBinUsingRayTracing::RegisterIt dummy11; +static ProjMatrixByBinUsingInterpolation::RegisterIt dummy12; +static ProjMatrixByBinFromFile::RegisterIt dumy13; +static ProjMatrixByBinSPECTUB::RegisterIt dumy14; + +static ForwardProjectorByBinUsingProjMatrixByBin::RegisterIt dummy31; +static ForwardProjectorByBinUsingRayTracing::RegisterIt dummy32; + +static BackProjectorByBinUsingProjMatrixByBin::RegisterIt dummy51; +static BackProjectorByBinUsingInterpolation::RegisterIt dummy52; + +static ProjectorByBinPairUsingProjMatrixByBin::RegisterIt dummy71; +static ProjectorByBinPairUsingSeparateProjectors::RegisterIt dummy72; + +static TrivialBinNormalisation::RegisterIt dummy91; +static ChainedBinNormalisation::RegisterIt dummy92; +static BinNormalisationFromProjData::RegisterIt dummy93; +static BinNormalisationFromAttenuationImage::RegisterIt dummy94; + +static PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData::RegisterIt Dummyxxx; +static PoissonLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion >::RegisterIt Dummyxxxzz; + +static PoissonNestedLogLikelihoodWithLinearKineticModelAndDynamicProjectionData::RegisterIt Dummyzzz; +static PoissonNestedLogLikelihoodWithGeneralizedPatlakAndDynamicProjectionData::RegisterIt Dummykkk; +static PoissonNestedLogLikelihoodWithLinearModelForMeanAndGatedProjDataWithMotion >::RegisterIt Dummyxxxzz1; +static PoissonNestedLogLikelihoodWithLinearModelForMeanAndConvolvedProjDataWithMotion >::RegisterIt Dummyxxxzz2; + +#ifdef HAVE_LLN_MATRIX +START_NAMESPACE_ECAT +START_NAMESPACE_ECAT7 +static BinNormalisationFromECAT7::RegisterIt dummy102; +END_NAMESPACE_ECAT7 +END_NAMESPACE_ECAT +#endif + +static FourierRebinning::RegisterIt dummyFORE; + +END_NAMESPACE_STIR diff --git a/src/recon_test/CMakeLists.txt b/src/recon_test/CMakeLists.txt new file mode 100644 index 0000000000..0648378a87 --- /dev/null +++ b/src/recon_test/CMakeLists.txt @@ -0,0 +1,45 @@ +# Copyright 2011, Kris Thielemans +# Copyright (C) 2013-2014, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file declaring all tests in this subdirectory + +set(dir recon_test) + +set(dir_SIMPLE_TEST_EXE_SOURCES ${dir}_SIMPLE_TEST_EXE_SOURCES) +set(dir_INVOLVED_TEST_EXE_SOURCES ${dir}_INVOLVED_TEST_EXE_SOURCES) +set(dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES ${dir}_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES) + +set(${dir_SIMPLE_TEST_EXE_SOURCES} + test_DataSymmetriesForBins_PET_CartesianGrid +) + + +set(${dir_INVOLVED_TEST_EXE_SOURCES} + fwdtest + bcktest +) + +include(stir_test_exe_targets) + +# a test that uses MPI +create_stir_mpi_test(test_PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx "${STIR_LIBRARIES}" "${STIR_REGISTRIES}") + +# we currently need fwdtest for the recon_test_pack, and it (and bcktest) +# could be useful on their own, so we'll add them to the installation targets + +install(TARGETS fwdtest bcktest DESTINATION bin) + +# TODO test_modelling.sh diff --git a/src/recon_test/bcktest.cxx b/src/recon_test/bcktest.cxx new file mode 100644 index 0000000000..3c80effcc6 --- /dev/null +++ b/src/recon_test/bcktest.cxx @@ -0,0 +1,389 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2004, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup recontest + + \brief Test program for back projection + + This program is mainly intended for testing backprojectors, but it can be + used (somewhat awkwardly) to backproject sinograms onto images. + + \par Usage + + \verbatim + bcktest [output-filename [proj_data_file \ + [template-image [backprojector-parfile ]]]] + \endverbatim + If some command line parameter is not given, the program will ask + the user interactively. + + The format of the parameter file to specifiy the backproejctor is + as follows: + \verbatim + Back Projector parameters:= + type:= some_type + END:= + \endverbatim + \see stir::BackprojectorByBin for derived classes and their parameters. + + \author Kris Thielemans + \author Sanida Mustafovic + \author PARAPET project +*/ + +#include "stir/recon_buildblock/BackProjectorByBin.h" +#include "stir/display.h" +#include "stir/KeyParser.h" +#include "stir/stream.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/ProjDataFromStream.h" +#include "stir/ProjDataInfo.h" +#include "stir/ExamInfo.h" +// for ask_filename... +#include "stir/utilities.h" +#include "stir/IndexRange3D.h" +#include "stir/RelatedViewgrams.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/IO/read_from_file.h" + +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::ofstream; +using std::fstream; +using std::iostream; +using std::endl; +using std::list; +using std::find; +using std::cerr; +using std::endl; +#endif + + + + +START_NAMESPACE_STIR + +void +do_segments(DiscretisedDensity<3,float>& image, + ProjData& proj_data_org, + const int start_segment_num, const int end_segment_num, + const int start_axial_pos_num, const int end_axial_pos_num, + const int start_tang_pos_num,const int end_tang_pos_num, + const int start_view, const int end_view, + BackProjectorByBin* back_projector_ptr, + bool fill_with_1) +{ + + shared_ptr + symmetries_sptr(back_projector_ptr->get_symmetries_used()->clone()); + + + list already_processed; + + for (int segment_num = start_segment_num; segment_num <= end_segment_num; ++segment_num) + for (int view= start_view; view<=end_view; view++) + { + ViewSegmentNumbers vs(view, segment_num); + symmetries_sptr->find_basic_view_segment_numbers(vs); + if (find(already_processed.begin(), already_processed.end(), vs) + != already_processed.end()) + continue; + + already_processed.push_back(vs); + + cerr << "Processing view " << vs.view_num() + << " of segment " < viewgrams_empty= + proj_data_org.get_empty_related_viewgrams(vs, symmetries_sptr); + //proj_data_org.get_empty_related_viewgrams(vs.view_num(),vs.segment_num(), symmetries_sptr); + + RelatedViewgrams::iterator r_viewgrams_iter = viewgrams_empty.begin(); + while(r_viewgrams_iter!=viewgrams_empty.end()) + { + Viewgram& single_viewgram = *r_viewgrams_iter; + if (start_view <= single_viewgram.get_view_num() && + single_viewgram.get_view_num() <= end_view && + single_viewgram.get_segment_num() >= start_segment_num && + single_viewgram.get_segment_num() <= end_segment_num) + { + single_viewgram.fill(1.F); + } + r_viewgrams_iter++; + } + + back_projector_ptr->back_project(image,viewgrams_empty, + max(start_axial_pos_num, viewgrams_empty.get_min_axial_pos_num()), + min(end_axial_pos_num, viewgrams_empty.get_max_axial_pos_num()), + start_tang_pos_num, end_tang_pos_num); + } + else + { + RelatedViewgrams viewgrams = + proj_data_org.get_related_viewgrams(vs, + //proj_data_org.get_related_viewgrams(vs.view_num(),vs.segment_num(), + symmetries_sptr); + RelatedViewgrams::iterator r_viewgrams_iter = viewgrams.begin(); + + while(r_viewgrams_iter!=viewgrams.end()) + { + Viewgram& single_viewgram = *r_viewgrams_iter; + { + if (start_view <= single_viewgram.get_view_num() && + single_viewgram.get_view_num() <= end_view && + single_viewgram.get_segment_num() >= start_segment_num && + single_viewgram.get_segment_num() <= end_segment_num) + { + // ok + } + else + { + // set to 0 to prevent it being backprojected + single_viewgram.fill(0); + } + } + ++r_viewgrams_iter; + } + + back_projector_ptr->back_project(image,viewgrams, + max(start_axial_pos_num, viewgrams.get_min_axial_pos_num()), + min(end_axial_pos_num, viewgrams.get_max_axial_pos_num()), + start_tang_pos_num, end_tang_pos_num); + } // fill + } // for view_num, segment_num + +} + +END_NAMESPACE_STIR + + + +USING_NAMESPACE_STIR +int +main(int argc, char **argv) +{ + if (argc==1 || argc>7) + { + cerr <<"Usage: " << argv[0] << " \\\n" + << "\t[output-filename [proj_data_file [template-image [backprojector-parfile ]]]]\n"; + exit(EXIT_FAILURE); + } + const string output_filename= + argc>1? argv[1] : ask_string("Output filename"); + + shared_ptr proj_data_ptr; + bool fill; + + if (argc>2) + { + proj_data_ptr = ProjData::read_from_file(argv[2]); + fill = ask("Do you want to backproject all 1s (Y) or the data (N) ?", true); + } + else + { + shared_ptr data_info(ProjDataInfo::ask_parameters()); + // create an empty ProjDataFromStream object + // such that we don't have to differentiate between code later on + shared_ptr exam_info_sptr(new ExamInfo); + proj_data_ptr.reset(new ProjDataFromStream (exam_info_sptr, data_info,shared_ptr())); + fill = true; + } + shared_ptr back_projector_ptr; + + const bool disp = ask("Display images ?", false); + + const bool save = ask("Save images ?", true); + + const bool save_profiles = ask("Save horizontal profiles ?", false); + + // note: first check 4th parameter for historical reasons + // (could be switched with 3rd without problems) + if (argc>4) + { + KeyParser parser; + parser.add_start_key("Back Projector parameters"); + parser.add_parsing_key("type", &back_projector_ptr); + parser.add_stop_key("END"); + parser.parse(argv[4]); + } + + const ProjDataInfo * proj_data_info_ptr = + proj_data_ptr->get_proj_data_info_ptr(); + + shared_ptr > image_sptr; + + if (argc>3) + { + image_sptr = read_from_file >(argv[3]); + } + else + { + const float zoom = ask_num("Zoom factor (>1 means smaller voxels)",0.F,100.F,1.F); + int xy_size = static_cast(proj_data_ptr->get_num_tangential_poss()*zoom); + xy_size = ask_num("Number of x,y pixels",3,xy_size*2,xy_size); + int z_size = 2*proj_data_info_ptr->get_scanner_ptr()->get_num_rings()-1; + z_size = ask_num("Number of z pixels",1,1000,z_size); + VoxelsOnCartesianGrid * vox_image_ptr = + new VoxelsOnCartesianGrid(*proj_data_info_ptr, + zoom, + Coordinate3D(0,0,0), + Coordinate3D(z_size,xy_size,xy_size)); + const float z_origin = + ask_num("Shift z-origin (in pixels)", + -vox_image_ptr->get_length()/2, + vox_image_ptr->get_length()/2, + 0) + *vox_image_ptr->get_voxel_size().z(); + vox_image_ptr->set_origin(Coordinate3D(z_origin,0,0)); + + image_sptr.reset(vox_image_ptr); + } + + while (is_null_ptr(back_projector_ptr)) + { + back_projector_ptr.reset(BackProjectorByBin::ask_type_and_parameters()); + } + + back_projector_ptr->set_up(proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(), + image_sptr); + + do + { + + int min_segment_num = ask_num("Minimum segment number to backproject", + proj_data_info_ptr->get_min_segment_num(), proj_data_info_ptr->get_max_segment_num(), 0); + int max_segment_num = ask_num("Maximum segment number to backproject", + min_segment_num,proj_data_info_ptr->get_max_segment_num(), + min_segment_num); + + // find max_axial_pos_num in the range of segments + // TODO relies on axial_pos_num starting from 0 + assert(proj_data_info_ptr->get_min_axial_pos_num(0) == 0); +#if 1 + int max_axial_pos_num; + if (min_segment_num <= 0 && 0 <= max_segment_num) + { + // all axial_poss are addressed for segment 0 + max_axial_pos_num = proj_data_info_ptr->get_max_axial_pos_num(0); + } + else + { + if (min_segment_num>0) // which implies max_segment_num>0 + max_axial_pos_num = proj_data_info_ptr->get_max_axial_pos_num(min_segment_num); + else // min_segment_num <= max_segment_num < 0 + max_axial_pos_num = proj_data_info_ptr->get_max_axial_pos_num(max_segment_num); + } + + const int start_axial_pos_num = + ask_num("Start axial_pos", 0, max_axial_pos_num, 0); + const int end_axial_pos_num = + ask_num("End axial_pos", start_axial_pos_num, max_axial_pos_num, max_axial_pos_num); +#else + const int min_axial_pos_num = proj_data_info_ptr->get_min_axial_pos_num(segment_num); + const int max_axial_pos_num = proj_data_info_ptr->get_max_axial_pos_num(segment_num); + const int start_axial_pos_num = + ask_num("Start axial_pos", min_axial_pos_num, max_axial_pos_num, min_axial_pos_num); + const int end_axial_pos_num = + ask_num("End axial_pos", start_axial_pos_num, max_axial_pos_num, max_axial_pos_num); +#endif + + // TODO this message is symmetry specific + const int nviews = proj_data_info_ptr->get_num_views(); + cerr << "Special views are at 0, " + << nviews/4 <<", " << nviews/2 <<", " << nviews/4*3 << endl; + + int start_view = ask_num("Start view", 0, nviews-1, 0); + int end_view = ask_num("End view", 0, nviews-1, nviews-1); + + const int start_tang_pos_num = + ask_num("Start tang_pos", + proj_data_info_ptr->get_min_tangential_pos_num(), + proj_data_info_ptr->get_max_tangential_pos_num(), + proj_data_info_ptr->get_min_tangential_pos_num()); + const int end_tang_pos_num = + ask_num("End tang_pos", + start_tang_pos_num, + proj_data_info_ptr->get_max_tangential_pos_num(), + proj_data_info_ptr->get_max_tangential_pos_num()); + //const int start_tang_pos_num = -end_tang_pos_num; + + if (!ask("Add this backprojection to image of previous run ?", false)) + image_sptr->fill(0); + + CPUTimer timer; + timer.reset(); + back_projector_ptr->reset_timers(); + back_projector_ptr->start_timers(); + timer.start(); + + do_segments(*image_sptr, + *proj_data_ptr, + min_segment_num, max_segment_num, + start_axial_pos_num,end_axial_pos_num, + start_tang_pos_num,end_tang_pos_num, + start_view, end_view, + back_projector_ptr.get(), + fill); + + timer.stop(); + cerr << timer.value() << " s total CPU time\n"; + cerr << "of which " << back_projector_ptr->get_CPU_timer_value() + << " s is reported by backprojector\n"; + cerr << "min and max in image " << image_sptr->find_min() + << ", " << image_sptr->find_max() << endl; + + if (disp) + display(*image_sptr, image_sptr->find_max()); + + if (save) + { + cerr <<" - Saving " << output_filename << endl; + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, *image_sptr); + + } + + if (save_profiles) + { + + cerr << "Writing horizontal profiles to bcktest.prof" << endl; + ofstream profile("bcktest.prof"); + if (!profile) + { cerr << "Couldn't open " << "bcktest.prof"; } + + for (int z=image_sptr->get_min_index(); z<= image_sptr->get_max_index(); z++) + profile << (*image_sptr)[z][0] << '\n'; + } + + } + while (ask("One more ?", true)); + + return EXIT_SUCCESS; +} + + diff --git a/src/recon_test/exe.mk b/src/recon_test/exe.mk new file mode 100644 index 0000000000..a5157c42b4 --- /dev/null +++ b/src/recon_test/exe.mk @@ -0,0 +1,26 @@ +# +# +dir := recon_test + +$(dir)_SOURCES = bcktest.cxx fwdtest.cxx \ + test_DataSymmetriesForBins_PET_CartesianGrid.cxx \ + test_PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx + +# rules that do not link with all registries to save time during linking +# Beware: the pattern below is dangerous as it relies on a naming style. +# Note: have to be before the include below as that resets $(dir) + +#${DEST}$(dir)/bcktest: ${DEST}$(dir)/bcktest$(O_SUFFIX) \ +# $(STIR_LIB) $(filter %recon_buildblock_registries$(O_SUFFIX),$(STIR_REGISTRIES)) +# $(LINK) $(EXE_OUTFLAG)$@ $< \ +# $(filter %recon_buildblock_registries$(O_SUFFIX),$(STIR_REGISTRIES)) \ +# $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + + +#${DEST}$(dir)/fwdtest: ${DEST}$(dir)/fwdtest$(O_SUFFIX) \ +# $(STIR_LIB) $(filter %recon_buildblock_registries$(O_SUFFIX),$(STIR_REGISTRIES)) +# $(LINK) $(EXE_OUTFLAG)$@ $< \ +# $(filter %recon_buildblock_registries$(O_SUFFIX),$(STIR_REGISTRIES)) \ +# $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +include $(WORKSPACE)/exe.mk diff --git a/src/recon_test/fwdtest.cxx b/src/recon_test/fwdtest.cxx new file mode 100644 index 0000000000..7c65669988 --- /dev/null +++ b/src/recon_test/fwdtest.cxx @@ -0,0 +1,479 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2010, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + + \file + \ingroup recontest + \brief Testing program for forward projection + + \author Kris Thielemans + \author PARAPET project + + This program allows forward projection of a few segments/views + only, or of the full data set. + + \par Usage: + \verbatim + fwdtest output-filename template_proj_data_file [image_to_forward_project [forwardprojector-parfile ]]]\n" + \endverbatim + The template_proj_data_file will be used to get the scanner, mashing etc. details + (its data will \e not be used, nor will it be overwritten). + If some of these parameters are not given, some questions are asked. + + \par Example parameter file for specifying the forward projector + \verbatim + Forward Projector parameters:= + type := Matrix + Forward projector Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := + End Forward Projector Using Matrix Parameters := + End:= + \endverbatim +*/ + +#include "stir/recon_buildblock/ForwardProjectorByBin.h" +#include "stir/display.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/ProjDataInterfile.h" +#include "stir/ProjDataInfo.h" +#include "stir/ExamInfo.h" +// for ask_filename... +#include "stir/utilities.h" +#include "stir/round.h" +#include "stir/IndexRange3D.h" +#include "stir/RelatedViewgrams.h" +#include "stir/SegmentByView.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/KeyParser.h" +#include "stir/is_null_ptr.h" +#include + + +using std::cerr; +using std::cout; +using std::endl; + +USING_NAMESPACE_STIR +//USING_NAMESPACE_STD + + +/******************* Declarations local functions *******************/ + +static void +do_segments(const VoxelsOnCartesianGrid& image, ProjData& s3d, + const int start_segment_num, const int end_segment_num, + const int start_view, const int end_view, + const int start_tangential_pos_num, const int end_tangential_pos_num, + ForwardProjectorByBin&, + const bool disp); +static void +fill_cuboid(VoxelsOnCartesianGrid& image); +static void +fill_cylinder(VoxelsOnCartesianGrid& image); + + + +/*************************** main ***********************************/ +int +main(int argc, char *argv[]) +{ + + if(argc<3 || argc>5) + { + std::cerr <<"Usage:\n" + << argv[0] << " \\\n" + << " output-filename template_proj_data_file [image_to_forward_project [forwardprojector-parfile ]]]\n" + <<"The template_proj_data_file will be used to get the scanner, mashing etc. details.\n"; + exit(EXIT_FAILURE); + } + + const string output_file_name = argv[1]; + + shared_ptr new_data_info_ptr; + shared_ptr exam_info_sptr(new ExamInfo); + if(argc>=3) + { + shared_ptr proj_data_sptr = + ProjData::read_from_file(argv[2]); + exam_info_sptr = proj_data_sptr->get_exam_info_sptr(); + new_data_info_ptr= proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone(); + } + else + { + new_data_info_ptr.reset(ProjDataInfo::ask_parameters()); + } + int limit_segments= + ask_num("Maximum absolute segment number to process: ", 0, + new_data_info_ptr->get_max_segment_num(), + new_data_info_ptr->get_max_segment_num() ); + + new_data_info_ptr->reduce_segment_range(-limit_segments, limit_segments); + + shared_ptr proj_data_ptr(new ProjDataInterfile(exam_info_sptr, new_data_info_ptr, output_file_name)); + cerr << "Output will be written to " << output_file_name + << " and its Interfile header\n"; + + + int dispstart = 0; + int save = 0; + + shared_ptr > image_sptr; + VoxelsOnCartesianGrid * vox_image_ptr = 0; + + if (argc<4) + { + switch (int choice = ask_num("Start image is cuboid (1) or cylinder (2) or on file (3)",1,3,2)) + { + case 1: + case 2: + { + dispstart = + ask_num("Display start image ? no (0), yes (1)", 0,1,0); + + save = + ask_num("Save start images ? no (0), yes (1)", 0,1,0); + const float zoom = ask_num("Zoom factor (>1 means smaller voxels)",0.F,10.F,1.F); + int xy_size = static_cast(proj_data_ptr->get_num_tangential_poss()*zoom); + xy_size = ask_num("Number of x,y pixels",3,xy_size*2,xy_size); + const float zoom_z = ask_num("Zoom factor in z", 0.F, 10.F, 1.F); + int z_size = + stir::round((2*proj_data_ptr->get_proj_data_info_ptr()->get_scanner_ptr()->get_num_rings()-1)*zoom_z); + z_size = ask_num("Number of z pixels",1,1000,z_size); + vox_image_ptr = + new VoxelsOnCartesianGrid(*(proj_data_ptr->get_proj_data_info_ptr()), + zoom, + CartesianCoordinate3D(0,0,0), + Coordinate3D(z_size,xy_size,xy_size)); + image_sptr.reset(vox_image_ptr); + vox_image_ptr->set_grid_spacing( + vox_image_ptr->get_grid_spacing()/ + CartesianCoordinate3D(zoom_z,1.F,1.F)); + if (choice==1) + fill_cuboid(*vox_image_ptr); + else + fill_cylinder(*vox_image_ptr); + break; + } + case 3: + { + char filename[max_filename_length]; + + ask_filename_with_extension(filename, "Input file name ?", ".hv"); + + image_sptr = + read_from_file >(filename); + vox_image_ptr = dynamic_cast *> (image_sptr.get()); + + break; + } + } + } + else + { + image_sptr = + read_from_file >(argv[3]); + vox_image_ptr = dynamic_cast *> (image_sptr.get()); + } + + const float z_origin = + ask_num("Shift z-origin (in pixels)", + -vox_image_ptr->get_length()/2, + vox_image_ptr->get_length()/2, + 0) *vox_image_ptr->get_voxel_size().z(); + + vox_image_ptr->set_origin(make_coordinate(z_origin,0.F,0.F) + vox_image_ptr->get_origin()); + // use shared_ptr such that it cleans up automatically + shared_ptr forw_projector_ptr; + + if (argc>=5) + { + KeyParser parser; + parser.add_start_key("Forward Projector parameters"); + parser.add_parsing_key("type", &forw_projector_ptr); + parser.add_stop_key("END"); + parser.parse(argv[4]); + } + + while (is_null_ptr(forw_projector_ptr)) + { + forw_projector_ptr.reset(ForwardProjectorByBin::ask_type_and_parameters()); + } + + forw_projector_ptr->set_up(proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(), + image_sptr); + cerr << forw_projector_ptr->parameter_info(); + + if (dispstart) + { + cerr << "Displaying start image"; + display(*image_sptr, image_sptr->find_max()); + } + + + if (save) + { + cerr << "Saving start image to 'test_image'" << endl; + OutputFileFormat >::default_sptr()-> + write_to_file("test_image", *image_sptr); + } + + list already_processed; + + if (ask("Do full forward projection ?", true)) + { + + CPUTimer timer; + timer.reset(); + timer.start(); + + + do_segments(*vox_image_ptr, *proj_data_ptr, + proj_data_ptr->get_min_segment_num(), proj_data_ptr->get_max_segment_num(), + proj_data_ptr->get_min_view_num(), + proj_data_ptr->get_max_view_num(), + proj_data_ptr->get_min_tangential_pos_num(), + proj_data_ptr->get_max_tangential_pos_num(), + *forw_projector_ptr, + false); + + timer.stop(); + cerr << timer.value() << " s CPU time"<get_min_segment_num(); + segment_num <= proj_data_ptr->get_max_segment_num(); + ++segment_num) + { + const SegmentByView segment = + proj_data_ptr->get_empty_segment_by_view(segment_num, false); + if (!(proj_data_ptr->set_segment(segment) == Succeeded::yes)) + warning("Error set_segment %d\n", segment_num); + } + do + { + CPUTimer timer; + timer.reset(); + timer.start(); + + const int segment_num = + ask_num("Segment number to forward project (related segments will be done as well)", + proj_data_ptr->get_min_segment_num(), + proj_data_ptr->get_max_segment_num(), + 0); + const int min_view = proj_data_ptr->get_min_view_num(); + const int max_view = proj_data_ptr->get_max_view_num(); + + const int start_view = + ask_num("Start view (related views will be done as well)", min_view, max_view, min_view); + const int end_view = + ask_num("End view (related views will be done as well)", start_view, max_view, max_view); + + const int min_tangential_pos_num = proj_data_ptr->get_min_tangential_pos_num(); + const int max_tangential_pos_num = proj_data_ptr->get_max_tangential_pos_num(); + + const int start_tangential_pos_num = + ask_num("Start tangential_pos_num", min_tangential_pos_num, max_tangential_pos_num, min_tangential_pos_num); + const int end_tangential_pos_num = + ask_num("End tangential_pos_num ", start_tangential_pos_num, max_tangential_pos_num, max_tangential_pos_num); + + do_segments(*vox_image_ptr,*proj_data_ptr, + segment_num,segment_num, + start_view, end_view, + start_tangential_pos_num, end_tangential_pos_num, + *forw_projector_ptr, disp); + + + timer.stop(); + cerr << timer.value() << " s CPU time"<& image, + ProjData& proj_data, + const int start_segment_num, const int end_segment_num, + const int start_view, const int end_view, + const int start_tangential_pos_num, const int end_tangential_pos_num, + ForwardProjectorByBin& forw_projector, + const bool disp) +{ + shared_ptr + symmetries_sptr(forw_projector.get_symmetries_used()->clone()); + + list already_processed; + + for (int segment_num = start_segment_num; segment_num <= end_segment_num; ++segment_num) + for (int view= start_view; view<=end_view; view++) + { + ViewSegmentNumbers vs(view, segment_num); + symmetries_sptr->find_basic_view_segment_numbers(vs); + if (find(already_processed.begin(), already_processed.end(), vs) + != already_processed.end()) + continue; + + already_processed.push_back(vs); + + cerr << "Processing view " << vs.view_num() + << " of segment " < viewgrams = + proj_data.get_empty_related_viewgrams(vs, symmetries_sptr,false); + forw_projector.forward_project(viewgrams, image, + viewgrams.get_min_axial_pos_num(), + viewgrams.get_max_axial_pos_num(), + start_tangential_pos_num, end_tangential_pos_num); + if (disp) + display(viewgrams, viewgrams.find_max()); + if (!(proj_data.set_related_viewgrams(viewgrams) == Succeeded::yes)) + error("Error set_related_viewgrams\n"); + } +} + + + +void fill_cuboid(VoxelsOnCartesianGrid& image) +{ + const float voxel_value = ask_num("Voxel value",-10E10F, 10E10F,1.F); + const int xs = ask_num("Start X coordinate", + image.get_min_x(), image.get_max_x(), + (image.get_min_x()+ image.get_max_x())/2); + const int ys = ask_num("Start Y coordinate", + image.get_min_y(), image.get_max_y(), + (image.get_min_y()+ image.get_max_y())/2); + const int zs = ask_num("Start Z coordinate", + image.get_min_z(), image.get_max_z(), + (image.get_min_z()+ image.get_max_z())/2); + + const int xe = ask_num("End X coordinate", xs, image.get_max_x(), xs); + const int ye = ask_num("End Y coordinate", ys, image.get_max_y(), ys); + const int ze = ask_num("End Z coordinate", zs, image.get_max_z(), zs); + + + cerr << "Start coordinate: (x,y,z) = (" + << xs << ", " << ys << ", " << zs + << ")" << endl; + cerr << "End coordinate: (x,y,z) = (" + << xe << ", " << ye << ", " << ze + << ")" << endl; + + image.fill(0); + for (int z=zs; z<=ze; z++) + for (int y=ys; y <= ye; y++) + for (int x=xs; x<= xe; x++) + image[z][y][x] = voxel_value; +} + +void fill_cylinder(VoxelsOnCartesianGrid& image) +{ + const float voxel_value = ask_num("Voxel value",-10E10F, 10E10F,1.F); + + const double xc = + ask_num("Centre X coordinate", + (double)image.get_min_x(), (double)image.get_max_x(), + (image.get_min_x()+ image.get_max_x())/2.); + + const double yc = + ask_num("Centre Y coordinate", + (double)image.get_min_y(), (double)image.get_max_y(), + (image.get_min_y()+ image.get_max_y())/2.); + + const float zc = + ask_num("Centre Z coordinate", + (float)image.get_min_z(), (float)image.get_max_z(), + (image.get_min_z()+ image.get_max_z())/2.F); + + + const double Rcyl = + ask_num("Radius (pixels)", + .5, (image.get_max_x()- image.get_min_x())/2., + (image.get_max_x()- image.get_min_x())/4.); + + // Max length is num_planes+1 because of edges of voxels + const float Lcyl = + ask_num("Length (planes)", 1.F, (image.get_max_z()- image.get_min_z())+1.F, + (image.get_max_z()- image.get_min_z())+1.F); + + + cerr << "Centre coordinate: (x,y,z) = (" + << xc << ", " << yc << ", " << zc + << ")" << endl; + cerr << "Radius = " << Rcyl << ", Length = " << Lcyl << endl; + + const int num_samples = + ask_num("With how many points (in x,y direction) do I sample each voxel ?", + 1,100,5); + + Array<2,float> plane = image[0]; + + for (int y=image.get_min_y(); y<=image.get_max_y(); y++) + for (int x=image.get_min_x(); x<=image.get_max_x(); x++) + { + double value = 0; + + for (double ysmall=-(num_samples-1.)/num_samples/2.; + ysmall < 0.5; + ysmall+= 1./num_samples) + { + const double ytry = y-ysmall-yc; + + for (double xsmall=-(num_samples-1.)/num_samples/2.; + xsmall < 0.5; + xsmall+= 1./num_samples) + { + const double xtry = x-xsmall-xc; + + if (xtry*xtry + ytry*ytry <= Rcyl*Rcyl) + value++; + } + } + // update plane with normalised value (independent of num_samples) + plane[y][x] = static_cast(voxel_value*value/(num_samples*num_samples)); + } + + for (int z=image.get_min_z(); z<=image.get_max_z(); z++) + { + // use 2. to make both args of min() and max() double + float zfactor = (std::min(z+.5F, zc+Lcyl/2.F) - std::max(z-.5F, zc-Lcyl/2.F)); + if (zfactor<0) zfactor = 0; + image[z] = plane; + image[z] *= zfactor; + } + +} + diff --git a/src/recon_test/input/ECAT_931_projdata_template.hs b/src/recon_test/input/ECAT_931_projdata_template.hs new file mode 100644 index 0000000000..2a8e5d0085 --- /dev/null +++ b/src/recon_test/input/ECAT_931_projdata_template.hs @@ -0,0 +1,47 @@ +!INTERFILE := +name of data file := ECAT_931_projdata_template.s +originating system := ECAT 931 +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Emission +applied corrections := {arc correction} +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 4 +matrix axis label [4] := segment +!matrix size [4] := 15 +matrix axis label [3] := view +!matrix size [3] := 64 +matrix axis label [2] := axial coordinate +!matrix size [2] := { 1,2,3,4,5,6,7,8,7,6,5,4,3,2,1} +matrix axis label [1] := tangential coordinate +!matrix size [1] := 48 +minimum ring difference per segment := { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7} +maximum ring difference per segment := { -7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7} +Scanner parameters:= +Scanner type := ECAT 931 +Number of rings := 8 +Number of detectors per ring := 512 +Inner ring diameter (cm) := 102 +Average depth of interaction (cm) := 0.7 +Distance between rings (cm) := 1.35 +Default bin size (cm) := 0.3129 +View offset (degrees) := 0 +Maximum number of non-arc-corrected bins := 192 +Default number of arc-corrected bins := 192 +Number of blocks per bucket in transaxial direction := 4 +Number of blocks per bucket in axial direction := 2 +Number of crystals per block in axial direction := 4 +Number of crystals per block in transaxial direction := 8 +Number of detector layers := 1 +Number of crystals per singles unit in axial direction := 4 +Number of crystals per singles unit in transaxial direction := 32 +end scanner parameters:= +effective central bin size (cm) := 0.3129 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +number of time frames := 1 +!END OF INTERFILE := diff --git a/src/recon_test/input/ECAT_931_projdata_template.s b/src/recon_test/input/ECAT_931_projdata_template.s new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/recon_test/input/POSMAPOSL.par b/src/recon_test/input/POSMAPOSL.par new file mode 100644 index 0000000000..73e2ee1de9 --- /dev/null +++ b/src/recon_test/input/POSMAPOSL.par @@ -0,0 +1,79 @@ +OSMAPOSLParameters := +; example file for running OSEM with interfiltering +; filter specific things are at the end + +objective function type:=PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + +input file := ${INPUT} + +; if disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := ${MAXSEG} +; see User's Guide to see when you need this +zero end planes of segment 0:= 0 + +;zoom := .15645 +;xy output image size (in pixels) := 21 +;z output image size (in pixels) := 17 +;z offset (in mm) := 0 + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := + End Projector Pair Using Matrix Parameters := + +Bin Normalisation type := From ProjData + Bin Normalisation From ProjData := + normalisation projdata filename := all_ones.hs + End Bin Normalisation From ProjData := + +; if the next parameter is disabled, +; the sensitivity will be computed using the normalisation object +sensitivity filename:= sens.img +; if next is set to 1, sensitivity will be recomputed +; and written to file (if "sensitivity filename" is set) +recompute sensitivity := 1 + +; specify additive projection data to handle randoms or so +; see User's Guide for more info +additive sinograms := 0 + +; patlak related files +Kinetic Model type := Patlak Plot +Patlak Plot Parameters := +time frame definition filename := time.fdef +starting frame := 23 +calibration factor := 9432.31 +blood data filename := plasma.if +Time Shift := 0 +In total counts := 1 +;In correct scale := 0 +end Patlak Plot Parameters := + +end PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + +; Number of subsets should be a divisor of num_views/4 +number of subsets:=${NUMSUBS} +; Use for starting the numbering from something else than 1 +start at subiteration number:=1 +; Use if you want to start from another subset than 0 (but why?) +start at subset:= 0 +number of subiterations:= ${ITER} +save estimates at subiteration intervals:= ${SAVITER} + +initial estimate := indirect_Patlak.img +; enable this when you read an initial estimate with negative data +enforce initial positivity condition:=1 + +inter-update filter subiteration interval:= 0 +inter-update filter type := None + +inter-iteration filter subiteration interval:= 0 + +post-filter type := None + +output filename prefix:=POSMAPOSL + +END := diff --git a/src/recon_test/input/POSSPS.par b/src/recon_test/input/POSSPS.par new file mode 100644 index 0000000000..48cccc2cdc --- /dev/null +++ b/src/recon_test/input/POSSPS.par @@ -0,0 +1,99 @@ +OSSPSParameters := +; sample file for OSSPS +; parameters used here are for illustrative purposes only +; i.e. they are not recommended values + +objective function type:=PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData +PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + +input file := ${INPUT} + +; if next disabled, defaults to maximum segment number in the file +maximum absolute segment number to process := ${MAXSEG} + +projector pair type := Matrix + Projector Pair Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := +End Projector Pair Using Matrix Parameters := + +; if the next parameter is disabled, +; the sensitivity will be computed using the normalisation object +sensitivity filename:= sens_POSSPS.img +; if next is set to 1, sensitivity will be recomputed +; and written to file (if "sensitivity filename" is set) +recompute sensitivity := 1 +; background term (i.e. randoms and scatter) +additive sinograms := 0 + +; see STIR doc: use 1 if segment 0 has only ring difference 0 +; zero_segment 0_end_planes:= 0 + zero end planes of segment 0:= 0 + +;prior type:= Quadratic +;quadratic prior parameters := +;penalisation factor := .5 +;only 2D:=1 +;;kappa filename := kappas_a_la_fessler.hv +;end quadratic prior parameters:= + +; patlak related files +Kinetic Model type := Patlak Plot +Patlak Plot Parameters := +time frame definition filename := time.fdef +starting frame := 23 +calibration factor := 9432.31 +blood data filename := plasma.if +Time Shift := 0 +In total counts := 1 +;In correct scale := 0 +end Patlak Plot Parameters := + +end PoissonLogLikelihoodWithLinearKineticModelAndDynamicProjectionData Parameters:= + + +output filename prefix:=POSSPS +; iteration scheme +; Number of subsets should be a divisor of num_views/4 +number of subsets:=${NUMSUBS} +; Use for starting the numbering from something else than 1 +start at subiteration number:=1 +; Use if you want to start from another subset than 0 (but why?) +start at subset:= 0 +number of subiterations:= ${ITER} +save estimates at subiteration intervals:= ${SAVITER} +;write update estimate := 0 + +; if next is disabled, defaults to image full of 1s (but that's not good for OSSPS) +; in particular, make sure it has the correct scale +initial estimate := indirect_Patlak.img +enforce initial positivity condition := 1 + +; additional regularisation + +;inter-iteration filter subiteration interval:= 0 +;inter-iteration filter type := none + +; here start OSSPS specific values + +; values to use for the 'precomputed denominator' + ; if you do not specify the following keyword, the 'precomputed denominator' + ; will be computed automatically (and saved) + ; use the following if you have it already (e.g. from previous run) + ; note: setting the value to 1 will use an images full of ones (which is not a good idea!) + ; precomputed denominator := my_precomputed_denominator.hv + +; specify relaxation scheme +; lambda = relaxation_parameter/ (1+relaxation_gamma*(subiteration_num/num_subsets) +relaxation parameter := 1 +relaxation gamma:=.1 + + +END := + + + + + + diff --git a/src/recon_test/input/PatlakPlot.par b/src/recon_test/input/PatlakPlot.par new file mode 100644 index 0000000000..f1092b9dba --- /dev/null +++ b/src/recon_test/input/PatlakPlot.par @@ -0,0 +1,10 @@ +Patlak Plot Parameters:= + +time frame definition filename := time.fdef +starting frame := 23 +calibration factor := 9432.31 +blood data filename := plasma.if +Time Shift := 0 +In total counts := 1 +In correct scale := 0 +end Patlak Plot Parameters:= diff --git a/src/recon_test/input/generate_all1.par b/src/recon_test/input/generate_all1.par new file mode 100644 index 0000000000..31de65f8d1 --- /dev/null +++ b/src/recon_test/input/generate_all1.par @@ -0,0 +1,19 @@ +generate_image Parameters := +output filename:= all1 +X output image size (in pixels):=21 +Y output image size (in pixels):=21 +Z output image size (in pixels):=17 +X voxel size (in mm):=20 +Y voxel size (in mm):=20 +Z voxel size (in mm):=6.75 +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=10000 + radius-y (in mm):=10000 + length-z (in mm):=13000 + origin (in mm):={0, 0, 0} + END:= +value :=1 + +END:= + diff --git a/src/recon_test/input/generate_p0005.par b/src/recon_test/input/generate_p0005.par new file mode 100644 index 0000000000..e8aad9e901 --- /dev/null +++ b/src/recon_test/input/generate_p0005.par @@ -0,0 +1,19 @@ +generate_image Parameters := +output filename:= p0005 +X output image size (in pixels):=21 +Y output image size (in pixels):=21 +Z output image size (in pixels):=17 +X voxel size (in mm):=20 +Y voxel size (in mm):=20 +Z voxel size (in mm):=6.75 +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=50 + radius-y (in mm):=50 + length-z (in mm):=6 + origin (in mm):={54, 0, 0} + END:= +value :=0.0005 + +END:= + diff --git a/src/recon_test/input/generate_p5.par b/src/recon_test/input/generate_p5.par new file mode 100644 index 0000000000..6f5c570af2 --- /dev/null +++ b/src/recon_test/input/generate_p5.par @@ -0,0 +1,19 @@ +generate_image Parameters := +output filename:= p5 +X output image size (in pixels):=21 +Y output image size (in pixels):=21 +Z output image size (in pixels):=17 +X voxel size (in mm):=20 +Y voxel size (in mm):=20 +Z voxel size (in mm):=6.75 +shape type:= ellipsoidal cylinder +Ellipsoidal Cylinder Parameters:= + radius-x (in mm):=50 + radius-y (in mm):=50 + length-z (in mm):=6 +origin (in mm):={54, 0, 0} +END:= +value :=0.5 + +END:= + diff --git a/src/recon_test/input/plasma.if b/src/recon_test/input/plasma.if new file mode 100644 index 0000000000..ebf3aa3ecf --- /dev/null +++ b/src/recon_test/input/plasma.if @@ -0,0 +1,3656 @@ +3655 +0.378906 -0.0252499 -0.0235803 +1.48047 0.000483647 0.000451671 +2.57031 -0.00466304 -0.00435479 +3.66406 0.000483637 0.000451671 +4.75391 0.00563024 0.00525816 +5.84375 -0.0149558 -0.0139676 +6.9375 0.00563012 0.00525816 +8.02734 0.00563006 0.00525816 +9.11719 0.00563 0.00525816 +10.2109 -0.0046627 -0.00435479 +11.3008 -0.00466265 -0.00435479 +12.3906 0.0159225 0.0148713 +13.4844 -0.00980866 -0.00916121 +14.5742 0.00562971 0.00525816 +15.6641 0.0107758 0.0100647 +16.7578 -0.00466241 -0.00435479 +17.8477 -0.00466236 -0.00435479 +18.9375 0.00562948 0.00525816 +20.0312 -0.00980805 -0.00916121 +21.1211 -0.00980794 -0.00916121 +22.2109 0.0313587 0.0292912 +23.3047 0.010775 0.0100647 +24.4023 0.0107749 0.0100647 +25.4922 0.0159205 0.0148713 +26.5859 0.000483531 0.000451671 +27.6758 -0.00466192 -0.00435479 +28.7656 0.0107744 0.0100647 +29.8594 0.0210653 0.0196779 +30.9492 -0.00980703 -0.00916121 +32.0391 0.000483506 0.000451671 +33.1328 -0.00466168 -0.00435479 +34.2227 -0.00466163 -0.00435479 +35.3125 0.000483491 0.000451671 +36.4062 0.00562854 0.00525816 +37.4961 0.000483481 0.000451671 +38.5859 0.00562842 0.00525816 +39.6797 0.0159183 0.0148713 +40.7695 -0.00466134 -0.00435479 +41.8594 -0.00466129 -0.00435479 +42.9531 0.000483456 0.000451671 +44.043 -0.0098058 -0.00916121 +45.1328 -0.00466115 -0.00435479 +46.2266 0.000483441 0.000451671 +47.3164 -0.0149499 -0.0139676 +48.4062 0.000483431 0.000451671 +49.5 0.00562784 0.00525816 +50.5898 -0.00980519 -0.00916121 +51.6797 -0.0252376 -0.0235803 +52.7734 0.0159163 0.0148713 +53.8633 -0.00466076 -0.00435479 +54.9531 0.00562754 0.00525816 +56.0469 0.000483396 0.000451671 +57.1367 0.0416368 0.0389046 +58.2266 0.149674 0.139854 +59.3164 0.556249 0.519759 +60.4102 1.34949 1.26098 +61.5 3.26937 3.05496 +62.5898 6.21112 5.80385 +63.6836 11.0707 10.3449 +64.7734 16.8923 15.785 +65.8633 24.0206 22.4463 +66.957 32.5198 30.3887 +68.0469 41.0205 38.3328 +69.1367 48.7815 45.5857 +70.2344 56.0162 52.347 +71.3281 62.6105 58.51 +72.418 67.7393 63.3035 +73.5078 71.8937 67.1866 +74.6016 74.9154 70.0112 +75.6914 77.2451 72.1891 +76.7812 77.4703 72.4003 +77.875 79.2048 74.0221 +78.9648 81.6618 76.3191 +80.0547 83.0282 77.5969 +81.1484 86.6003 80.9362 +82.2383 91.3674 85.3924 +83.3281 93.3988 87.2919 +84.4219 93.779 87.6481 +85.5117 88.7071 82.9087 +86.6016 81.9711 76.6138 +87.6953 75.6856 70.7398 +88.7852 68.4192 63.9489 +89.875 63.4597 59.3141 +90.9688 56.1899 52.5197 +92.0586 51.899 48.5096 +93.1602 47.3499 44.2581 +94.25 43.8535 40.9904 +95.3398 41.0754 38.3941 +96.4336 38.892 36.3536 +97.5234 36.6236 34.2336 +98.6133 35.869 33.5286 +99.707 34.9799 32.6978 +100.797 33.5243 31.3375 +101.887 32.8543 30.7115 +102.98 31.5436 29.4866 +104.07 30.9025 28.8876 +105.16 30.504 28.5154 +106.254 30.2563 28.2842 +107.344 29.6756 27.7416 +108.434 29.5464 27.6211 +109.527 29.1648 27.2647 +110.617 27.9901 26.1668 +111.707 27.9738 26.1518 +112.801 27.3202 25.541 +113.891 26.1167 24.4162 +114.988 26.2553 24.546 +116.078 25.5341 23.872 +117.172 23.8331 22.282 +118.262 22.8966 21.4066 +119.352 22.5348 21.0686 +120.445 22.0566 20.6217 +121.535 21.9342 20.5075 +122.625 21.4617 20.0659 +123.715 21.2175 19.8378 +124.809 21.1536 19.7783 +125.898 21.148 19.7733 +126.988 20.2841 18.9657 +128.082 20.0827 18.7776 +129.172 19.8178 18.5301 +130.262 19.6007 18.3273 +131.355 20.0555 18.7528 +132.445 20.0289 18.7281 +133.535 20.3569 19.035 +134.629 19.2984 18.0454 +135.719 20.4519 19.1242 +136.809 20.4305 19.1044 +137.902 20.0279 18.7281 +138.992 20.2235 18.9112 +140.082 20.0115 18.7132 +141.176 19.5933 18.3223 +142.266 20.44 19.1143 +143.355 19.9156 18.6241 +144.449 19.9102 18.6192 +145.539 20.1746 18.8667 +146.629 20.2591 18.9459 +147.723 20.3066 18.9905 +148.812 20.2004 18.8914 +149.902 20.2585 18.9459 +150.996 20.163 18.8568 +152.086 19.824 18.54 +153.176 21.1054 19.7386 +154.27 20.2153 18.9063 +155.359 20.395 19.0746 +156.449 20.1989 18.8914 +157.543 19.6855 18.4114 +158.633 19.8599 18.5747 +159.723 19.9179 18.6291 +160.82 20.1505 18.8469 +161.914 19.965 18.6736 +163.004 19.547 18.2828 +164.094 20.314 19.0004 +165.188 19.4091 18.1542 +166.277 19.6785 18.4064 +167.367 19.2871 18.0405 +168.461 19.546 18.2828 +169.551 19.2867 18.0405 +170.641 19.4874 18.2284 +171.734 19.6987 18.4262 +172.824 19.2226 17.9811 +173.914 19.9575 18.6687 +175.008 19.0796 17.8477 +176.098 19.053 17.823 +177.188 19.7664 18.4905 +178.281 19.3432 18.0948 +179.371 19.4223 18.169 +180.461 19.5543 18.2927 +181.555 19.48 18.2234 +182.645 19.8448 18.5648 +183.742 19.8657 18.5846 +184.836 19.6011 18.3372 +185.926 20.1245 18.8271 +187.016 19.3416 18.0948 +188.109 19.648 18.3817 +189.199 20.071 18.7776 +190.289 18.9289 17.7093 +191.383 19.5945 18.3322 +192.473 18.7753 17.566 +193.562 19.5413 18.2828 +194.656 19.3401 18.0948 +195.746 18.8698 17.6549 +196.836 18.6162 17.4178 +197.93 19.2128 17.9762 +199.02 18.7742 17.566 +200.109 18.906 17.6895 +201.203 18.3199 17.1413 +202.293 17.7553 16.6132 +203.383 18.2667 17.0919 +204.477 18.8682 17.6549 +205.566 18.4246 17.24 +206.668 17.665 16.5294 +207.758 18.1182 16.9537 +208.848 18.1181 16.9537 +209.941 18.3552 17.1758 +211.031 17.7907 16.6477 +212.121 17.6693 16.5343 +213.215 17.511 16.3863 +214.305 17.7216 16.5836 +215.395 17.7741 16.6329 +216.488 17.2259 16.1201 +217.578 17.6842 16.5491 +218.672 17.7156 16.5787 +219.762 17.61 16.48 +220.852 17.3727 16.2581 +221.945 16.9986 15.9082 +223.035 17.6042 16.4751 +224.125 17.3563 16.2433 +225.219 17.0402 15.9476 +226.309 17.2401 16.1349 +227.398 17.3822 16.268 +228.492 16.687 15.6175 +229.582 16.8131 15.7357 +230.672 17.192 16.0905 +231.766 17.5501 16.4258 +232.855 17.0442 15.9525 +233.945 16.8546 15.7752 +235.039 17.186 16.0856 +236.129 16.9226 15.8392 +237.219 16.954 15.8688 +238.312 16.8064 15.7308 +239.402 16.68 15.6126 +240.492 16.6588 15.5929 +241.586 16.2746 15.2335 +242.676 16.7163 15.6471 +243.766 16.8793 15.7998 +244.859 16.0164 14.9923 +245.949 17.0105 15.923 +247.039 16.442 15.391 +248.133 16.0265 15.0022 +249.223 16.8311 15.7555 +250.312 16.3206 15.2778 +251.406 16.1259 15.0957 +252.5 15.6527 14.6529 +253.59 16.2569 15.2187 +254.684 15.8363 14.8251 +255.773 16.4302 15.3812 +256.863 15.316 14.3383 +257.957 15.9935 14.9727 +259.047 15.7621 14.7562 +260.137 16.4085 15.3615 +261.23 15.6987 14.6972 +262.32 15.7405 14.7365 +263.41 15.898 14.8841 +264.504 15.8243 14.8152 +265.594 15.7926 14.7857 +266.684 15.367 14.3874 +267.777 15.8185 14.8103 +268.867 15.3458 14.3678 +269.957 15.7972 14.7906 +271.051 15.7288 14.7267 +272.141 15.5448 14.5546 +273.23 15.7652 14.7611 +274.324 15.7598 14.7562 +275.43 15.2555 14.2842 +276.52 15.6019 14.6087 +277.609 15.0295 14.0729 +278.703 15.5071 14.5202 +279.793 15.5909 14.5988 +280.883 15.3073 14.3334 +281.977 14.9293 13.9796 +283.066 15.3856 14.4071 +284.16 15.2227 14.2547 +285.25 15.401 14.4218 +286.34 15.2644 14.294 +287.43 15.7578 14.7562 +288.523 15.7366 14.7365 +289.613 15.1643 14.2007 +290.703 15.4054 14.4267 +291.797 15.1901 14.2252 +292.887 14.8595 13.9157 +293.977 15.2318 14.2645 +295.07 15.006 14.0532 +296.16 14.6073 13.68 +297.25 14.8693 13.9255 +298.352 15.2889 14.3186 +299.441 14.9372 13.9894 +300.535 15.126 14.1663 +301.625 15.2674 14.2989 +302.715 15.3408 14.3678 +303.809 15.4771 14.4956 +304.898 14.6375 13.7094 +305.988 14.6373 13.7094 +307.082 14.5219 13.6014 +308.172 14.7577 13.8224 +309.262 14.7156 13.7831 +310.355 13.9765 13.091 +311.445 13.9188 13.0371 +312.535 14.3482 13.4394 +313.629 14.5682 13.6456 +314.719 14.8301 13.8911 +315.809 14.5364 13.6161 +316.902 14.9032 13.9599 +317.992 14.6619 13.734 +319.082 14.1429 13.248 +320.176 14.9185 13.9746 +321.266 14.5671 13.6456 +322.355 14.5826 13.6603 +323.449 14.1791 13.2824 +324.539 14.6924 13.7634 +325.629 14.3411 13.4345 +326.723 14.0948 13.2039 +327.812 14.0737 13.1842 +328.902 14.4403 13.5278 +329.996 13.5917 12.733 +331.086 14.3561 13.4492 +332.176 14.6861 13.7585 +333.27 14.2144 13.3167 +334.359 14.5914 13.6701 +335.449 13.8423 12.9684 +336.543 13.8788 13.0027 +337.633 14.6381 13.7143 +338.723 14.2974 13.3952 +339.816 14.0877 13.1989 +340.906 14.0091 13.1254 +341.996 13.8048 12.9341 +343.098 14.0088 13.1254 +344.188 14.2233 13.3265 +345.281 13.7992 12.9292 +346.371 14.2388 13.3413 +347.461 13.5215 12.6693 +348.555 13.94 13.0616 +349.645 14.1074 13.2186 +350.734 13.5263 12.6742 +351.828 13.8401 12.9684 +352.918 13.8347 12.9635 +354.008 13.8346 12.9635 +355.102 13.7768 12.9095 +356.191 14.3684 13.464 +357.281 13.8551 12.9831 +358.375 13.5253 12.6742 +359.465 13.2113 12.3801 +360.555 13.8651 12.9929 +361.648 13.4411 12.5957 +362.738 13.305 12.4683 +363.828 13.8072 12.939 +364.922 13.5558 12.7036 +366.02 14.1261 13.2382 +367.109 13.6864 12.8262 +368.203 13.6758 12.8164 +369.293 13.8587 12.988 +370.383 13.8324 12.9635 +371.477 13.4608 12.6153 +372.566 13.6961 12.836 +373.656 13.4658 12.6203 +374.75 13.8057 12.939 +375.84 13.2249 12.3948 +376.93 13.3189 12.483 +378.023 13.2874 12.4536 +379.113 13.5383 12.6889 +380.203 13.5957 12.7428 +381.297 13.3027 12.4683 +382.387 13.8413 12.9733 +383.477 13.1194 12.2968 +384.57 13.2918 12.4585 +385.66 13.5375 12.6889 +386.75 13.6053 12.7526 +387.844 13.3018 12.4683 +388.941 13.3592 12.5222 +390.035 13.0768 12.2576 +391.125 13.2962 12.4634 +392.215 13.1915 12.3654 +393.309 12.8517 12.047 +394.398 12.956 12.1449 +395.488 12.9715 12.1596 +396.582 12.6266 11.8364 +397.672 13.6457 12.7918 +398.762 13.0548 12.238 +399.855 12.9449 12.1351 +400.945 13.3263 12.4928 +402.035 13.3 12.4683 +403.129 12.7668 11.9686 +404.219 13.4356 12.5957 +405.309 13.2107 12.385 +406.402 13.1427 12.3213 +407.492 12.7872 11.9882 +408.582 12.7036 11.9099 +409.676 13.1213 12.3017 +410.766 12.745 11.949 +411.855 12.8912 12.0862 +412.949 12.6194 11.8315 +414.039 13.1365 12.3164 +415.129 13.105 12.287 +416.223 12.4415 11.6651 +417.312 13.1831 12.3605 +418.402 12.5091 11.7287 +419.496 12.7596 11.9637 +420.586 12.9527 12.1449 +421.676 12.6184 11.8315 +422.77 12.3416 11.5721 +423.859 12.498 11.7189 +424.949 12.618 11.8315 +426.043 12.5917 11.807 +427.133 12.8684 12.0666 +428.223 12.487 11.7091 +429.316 12.4452 11.67 +430.406 12.8001 12.0029 +431.496 13.0663 12.2527 +432.59 12.7163 11.9246 +433.68 12.3664 11.5966 +434.77 13.0607 12.2478 +435.863 12.9352 12.1302 +436.953 12.5591 11.7777 +438.043 13.2902 12.4634 +439.133 12.3344 11.5672 +440.227 12.8564 12.0568 +441.316 12.5691 11.7875 +442.406 12.5376 11.7581 +443.5 11.9427 11.2003 +444.59 12.5739 11.7924 +445.68 12.6625 11.8756 +446.773 12.5632 11.7826 +447.863 12.4117 11.6406 +448.953 12.2029 11.4449 +450.047 12.6358 11.8511 +451.137 12.8498 12.0519 +452.227 12.7765 11.9833 +453.32 12.7138 11.9246 +454.41 12.4944 11.7189 +455.5 12.1864 11.4302 +456.594 12.0976 11.347 +457.684 12.708 11.9197 +458.773 12.4729 11.6993 +459.867 12.1964 11.44 +460.957 12.2953 11.5329 +462.047 12.6239 11.8413 +463.141 12.2481 11.4889 +464.23 12.0915 11.3421 +465.32 12.1592 11.4057 +466.414 12.5138 11.7385 +467.504 12.2737 11.5134 +468.594 12.0389 11.2932 +469.688 12.2682 11.5085 +470.777 12.5551 11.7777 +471.867 11.8612 11.1269 +472.961 11.7828 11.0535 +474.051 12.0696 11.3226 +475.141 12.4032 11.6357 +476.234 12.0953 11.347 +477.324 12.2986 11.5378 +478.414 11.8866 11.1514 +479.508 12.2671 11.5085 +480.605 11.8654 11.1318 +481.695 12.1625 11.4106 +482.785 12.3554 11.5917 +483.879 11.8546 11.122 +484.969 11.7138 10.99 +486.059 12.2193 11.4644 +487.152 12.2036 11.4498 +488.242 12.2243 11.4693 +489.332 12.1773 11.4253 +490.426 11.9581 11.2198 +491.516 12.0101 11.2687 +492.605 11.593 10.8775 +493.699 11.89 11.1562 +494.789 11.8169 11.0878 +495.879 11.6865 10.9655 +496.973 11.4051 10.7016 +498.062 12.1554 11.4057 +499.152 11.7799 11.0535 +500.246 11.8006 11.0731 +501.336 12.155 11.4057 +502.426 12.207 11.4546 +503.527 12.1287 11.3813 +504.617 11.6074 10.8922 +505.707 12.4152 11.6504 +506.801 11.4196 10.7162 +507.891 11.7008 10.9802 +508.98 11.8934 11.1611 +510.074 11.2839 10.5892 +511.168 11.7577 11.034 +512.258 12.2892 11.5329 +513.352 12.1015 11.3568 +514.441 11.5751 10.8629 +515.531 12.2263 11.4742 +516.625 11.4549 10.7504 +517.715 11.6371 10.9215 +518.805 11.6943 10.9753 +519.898 11.6057 10.8922 +520.988 11.715 10.9949 +522.078 11.8191 11.0927 +523.172 11.72 10.9998 +524.262 11.5219 10.814 +525.352 11.5946 10.8824 +526.445 11.329 10.6332 +527.535 11.6726 10.9558 +528.625 11.3912 10.6918 +529.719 11.5837 10.8726 +530.809 11.792 11.0682 +531.898 11.5054 10.7993 +532.992 12.0628 11.3226 +534.082 11.3749 10.6771 +535.172 11.63 10.9166 +536.266 11.3799 10.682 +537.355 11.3538 10.6576 +538.445 11.1975 10.511 +539.539 11.1505 10.467 +540.629 11.3066 10.6136 +541.719 11.2857 10.5941 +542.812 11.2803 10.5892 +543.902 11.4572 10.7553 +544.992 11.8372 11.1122 +546.086 11.2383 10.5501 +547.176 11.8787 11.1514 +548.273 11.3317 10.638 +549.363 11.1911 10.5061 +550.453 11.4409 10.7407 +551.547 11.2742 10.5843 +552.637 11.3262 10.6332 +553.727 11.5186 10.814 +554.82 11.5342 10.8287 +555.91 11.4299 10.7309 +557 11.7005 10.9851 +558.094 11.4453 10.7456 +559.184 11.315 10.6234 +560.273 10.9975 10.3254 +561.367 11.3252 10.6332 +562.457 11.7103 10.9949 +563.547 10.7111 10.0568 +564.641 11.3144 10.6234 +565.73 11.2727 10.5843 +566.82 11.3766 10.682 +567.914 10.9967 10.3254 +569.004 10.6845 10.0324 +570.094 10.8976 10.2326 +571.195 11.5271 10.8238 +572.285 11.5686 10.8629 +573.379 10.97 10.3009 +574.469 11.0012 10.3303 +575.559 11.308 10.6185 +576.652 11.3807 10.6869 +577.742 10.902 10.2375 +578.832 11.3857 10.6918 +579.922 11.0578 10.384 +581.016 10.9589 10.2912 +582.105 11.3073 10.6185 +583.199 10.7818 10.1251 +584.289 11.3747 10.682 +585.379 11.0313 10.3596 +586.473 11.5671 10.8629 +587.562 11.2287 10.5452 +588.652 10.7761 10.1203 +589.746 11.0411 10.3693 +590.836 11.1243 10.4475 +591.926 10.6302 9.98355 +593.02 11.0096 10.34 +594.117 11.0875 10.4133 +595.207 11.3215 10.6332 +596.301 10.7701 10.1154 +597.391 11.0143 10.3449 +598.48 11.2118 10.5305 +599.574 11.0505 10.3791 +600.664 10.7385 10.0861 +601.754 10.8891 10.2277 +602.848 10.3692 9.73952 +603.938 10.8732 10.213 +605.027 11.0447 10.3742 +606.121 10.8003 10.1447 +607.211 10.5351 9.89569 +608.301 11.0288 10.3596 +609.395 10.67 10.0226 +610.484 10.5555 9.91521 +611.574 10.571 9.92986 +612.668 11.0127 10.3449 +613.758 10.6383 9.99332 +614.848 10.8877 10.2277 +615.941 10.5965 9.95427 +617.031 11.2515 10.5696 +618.121 10.7158 10.0665 +619.215 10.5702 9.92986 +620.305 10.6584 10.0128 +621.395 11.2198 10.5403 +622.488 10.3309 9.70536 +623.578 11.2976 10.6136 +624.668 10.606 9.96403 +625.762 10.9697 10.3058 +626.852 10.6889 10.0421 +627.941 10.6888 10.0421 +629.035 10.2368 9.61753 +630.125 10.7042 10.0568 +631.215 10.8912 10.2326 +632.309 10.5741 9.93474 +633.398 10.8702 10.213 +634.488 10.9533 10.2912 +635.582 10.9063 10.2472 +636.672 10.3243 9.70048 +637.762 10.8073 10.1544 +638.855 11.1867 10.511 +639.957 10.4019 9.77368 +641.047 10.8954 10.2375 +642.141 10.8692 10.213 +643.23 10.8588 10.2033 +644.32 10.869 10.213 +645.414 10.4169 9.78832 +646.504 10.8273 10.174 +647.594 10.3129 9.69072 +648.688 10.6192 9.97867 +649.777 10.9881 10.3254 +650.867 10.8216 10.1691 +651.961 10.6344 9.99332 +653.051 10.3487 9.72488 +654.141 10.7177 10.0718 +655.234 10.6981 10.0535 +656.324 10.6797 10.0363 +657.414 10.6601 10.018 +658.508 10.6407 9.99981 +659.598 10.6223 9.98268 +660.688 10.6029 9.96452 +661.781 10.5836 9.94645 +662.879 10.5653 9.92937 +663.973 10.546 9.91131 +665.062 10.5267 9.89335 +666.152 10.5085 9.87636 +667.246 10.4915 9.8604 +668.336 10.4723 9.84249 +669.426 10.4532 9.82463 +670.52 10.4351 9.80774 +671.609 10.416 9.78993 +672.699 10.397 9.77216 +673.789 10.3791 9.75537 +674.883 10.3601 9.73766 +675.973 10.3412 9.72 +677.062 10.3233 9.70331 +678.156 10.3045 9.68569 +679.246 10.2877 9.67003 +680.336 10.2689 9.65246 +681.43 10.2512 9.63592 +682.52 9.99802 9.39802 +683.609 10.3768 9.75416 +684.703 10.3196 9.70048 +685.797 10.0236 9.4224 +686.887 10.0132 9.41265 +687.98 10.2206 9.60777 +689.07 10.2413 9.62729 +690.16 10.2567 9.64193 +691.25 9.99199 9.39314 +692.344 10.4434 9.8176 +693.434 10.2305 9.61753 +694.527 10.2667 9.65168 +695.617 10.1784 9.56874 +696.707 10.1264 9.51996 +697.797 9.97061 9.37363 +698.891 10.2351 9.62241 +699.98 10.6295 9.99332 +701.074 9.82506 9.23709 +702.164 10.0843 9.48094 +703.254 10.2191 9.60777 +704.348 10.4578 9.83224 +705.438 10.3642 9.7444 +706.527 10.2292 9.61753 +707.621 10.0579 9.45655 +708.711 10.1615 9.55411 +709.801 10.1666 9.55899 +710.891 10.3066 9.69072 +711.984 10.1716 9.56386 +713.074 10.488 9.86152 +714.168 10.4672 9.842 +715.262 9.75113 9.16883 +716.352 10.7784 10.1349 +717.441 10.1243 9.51996 +718.535 10.1502 9.54435 +719.625 9.88554 9.2956 +720.715 9.99953 9.40289 +721.809 9.98387 9.38826 +722.898 9.80226 9.21758 +723.988 10.2742 9.66144 +725.082 10.0925 9.49069 +726.172 10.0042 9.40777 +727.262 9.98854 9.39314 +728.355 9.87953 9.29073 +729.445 10.2321 9.62241 +730.535 10.0971 9.49557 +731.637 10.2942 9.68096 +732.727 9.96727 9.37363 +733.816 10.2161 9.60777 +734.91 10.3561 9.73952 +736 10.1329 9.52972 +737.09 9.98241 9.38826 +738.184 10.2468 9.63705 +739.273 9.81627 9.23221 +740.363 10.2674 9.65656 +741.457 10.1791 9.57362 +742.547 10.236 9.62729 +743.637 9.88845 9.30048 +744.73 10.1632 9.55899 +745.82 9.64979 9.0762 +746.91 9.96591 9.37363 +748.004 9.76361 9.18345 +749.094 9.86719 9.28097 +750.184 10.3079 9.6956 +751.277 10.0899 9.49069 +752.367 9.78394 9.20296 +753.457 9.74756 9.16883 +754.559 9.54534 8.97871 +755.648 9.73699 9.15908 +756.742 9.83018 9.24684 +757.832 9.93376 9.34437 +758.922 9.78333 9.20296 +760.016 9.45676 8.89586 +761.105 10.0371 9.44191 +762.199 9.79338 9.21271 +763.289 9.74664 9.16883 +764.383 10.0524 9.45655 +765.473 9.64797 9.0762 +766.562 9.64268 9.07132 +767.656 10.0313 9.43704 +768.746 10.0364 9.44191 +769.836 9.88077 9.2956 +770.93 9.85994 9.2761 +772.02 9.97906 9.38826 +773.109 10.2175 9.61265 +774.203 9.75079 9.1737 +775.293 9.91136 9.32486 +776.387 9.49672 8.93485 +777.48 9.97853 9.38826 +778.57 9.59494 9.02745 +779.66 9.91613 9.32974 +780.754 9.29433 8.7448 +781.844 9.37191 8.81789 +782.934 10.0661 9.47118 +784.027 9.71361 9.13958 +785.117 9.98299 9.39314 +786.207 9.88959 9.30536 +787.301 9.66148 9.09082 +788.391 10.0708 9.47606 +789.48 9.83228 9.25172 +790.574 9.35559 8.80327 +791.664 10.0342 9.44191 +792.754 9.34503 8.79352 +793.848 9.64015 9.07132 +794.938 9.75404 9.17858 +796.027 9.67103 9.10057 +797.121 9.12203 8.58404 +798.211 9.23582 8.69121 +799.301 9.70181 9.12982 +800.395 9.58775 9.02258 +801.484 9.62391 9.0567 +802.574 9.45807 8.90073 +803.668 9.95012 9.36388 +804.758 9.8671 9.28585 +805.848 9.31797 8.76916 +806.938 9.39554 8.84225 +808.031 9.16766 8.62788 +809.121 9.57659 9.01283 +810.211 9.39524 8.84225 +811.305 9.60747 9.04208 +812.395 9.6747 9.10545 +813.484 9.57101 9.00796 +814.578 9.28096 8.73506 +815.668 9.10487 8.56942 +816.758 9.45161 8.89586 +817.852 9.41008 8.85687 +818.941 9.67926 9.11032 +820.031 9.47202 8.91535 +821.125 9.20273 8.66198 +822.227 9.54432 8.98359 +823.316 9.60117 9.0372 +824.41 9.28525 8.73993 +825.5 9.36281 8.81302 +826.59 9.33682 8.78865 +827.684 9.56452 9.00308 +828.773 9.43499 8.88124 +829.863 9.16056 8.62301 +830.957 9.28467 8.73993 +832.098 9.43986 8.88611 +833.191 9.74009 9.16883 +834.281 9.48108 8.9251 +835.371 9.39297 8.84225 +836.465 9.51194 8.95434 +837.555 9.5688 9.00796 +838.645 9.09251 8.55968 +839.738 9.62556 9.06158 +840.828 9.15959 8.62301 +841.918 9.44932 8.89586 +843.012 9.67185 9.10545 +844.102 9.05065 8.52072 +845.199 9.43867 8.88611 +846.289 9.34022 8.79352 +847.379 9.69216 9.12495 +848.473 9.36591 8.81789 +849.562 8.80708 8.29184 +850.652 9.92491 9.34437 +851.746 9.1845 8.64736 +852.836 9.14301 8.60839 +853.926 9.10152 8.56942 +855.02 9.04452 8.51584 +856.109 9.19964 8.66198 +857.199 9.27716 8.73506 +858.293 8.93045 8.4087 +859.383 9.30283 8.75942 +860.473 9.28721 8.7448 +861.566 9.46307 8.91048 +862.656 9.27149 8.73018 +863.746 9.23 8.69121 +864.84 9.29716 8.75454 +865.93 9.42126 8.87149 +867.031 9.47292 8.92023 +868.121 8.82102 8.30645 +869.211 9.30713 8.76429 +870.305 9.25529 8.71557 +871.395 9.27071 8.73018 +872.484 9.18784 8.65223 +873.578 9.46197 8.91048 +874.668 8.9911 8.46714 +875.758 9.28584 8.7448 +876.852 9.31161 8.76916 +877.941 9.07357 8.54507 +879.031 9.17174 8.63762 +880.125 9.36823 8.82276 +881.215 9.16638 8.63275 +882.305 9.03698 8.51097 +883.398 8.83523 8.32105 +884.488 8.73692 8.22855 +885.578 8.94362 8.42331 +886.672 9.64191 9.08107 +887.762 8.97446 8.45253 +888.852 9.13984 8.60839 +889.945 9.26389 8.72531 +891.035 8.88628 8.36975 +892.129 9.20679 8.67172 +893.223 9.27394 8.73506 +894.312 8.76711 8.25776 +895.402 9.08238 8.55481 +896.496 9.01506 8.49149 +897.586 9.18045 8.64736 +898.676 9.08727 8.55968 +899.77 9.15441 8.62301 +900.859 8.92163 8.40383 +901.949 8.90602 8.38922 +903.043 9.07138 8.54507 +904.133 8.88 8.36488 +905.223 9.00914 8.48662 +906.316 8.71958 8.21394 +907.406 9.18993 8.65711 +908.496 9.18466 8.65223 +909 8.96623 8.48095 +910 8.96132 8.47646 +911 8.95643 8.47197 +912 8.95154 8.46749 +913 8.94666 8.46303 +914 8.94179 8.45857 +915 8.93692 8.45413 +916 8.93207 8.44969 +917 8.92722 8.44526 +918 8.92238 8.44085 +919 8.91754 8.43644 +920 8.91272 8.43205 +921 8.9079 8.42766 +922 8.90309 8.42328 +923 8.89829 8.41892 +924 8.8935 8.41456 +925 8.88871 8.41021 +926 8.88394 8.40588 +927 8.87917 8.40155 +928 8.87441 8.39723 +929 8.86965 8.39292 +930 8.8649 8.38863 +931 8.86017 8.38434 +932 8.85543 8.38006 +933 8.85071 8.37579 +934 8.84599 8.37153 +935 8.84129 8.36727 +936 8.83659 8.36303 +937 8.83189 8.3588 +938 8.82721 8.35458 +939 8.82253 8.35036 +940 8.81786 8.34616 +941 8.8132 8.34196 +942 8.80854 8.33777 +943 8.80389 8.3336 +944 8.79925 8.32943 +945 8.79462 8.32527 +946 8.78999 8.32112 +947 8.78538 8.31698 +948 8.78076 8.31284 +949 8.77616 8.30872 +950 8.77157 8.3046 +951 8.76698 8.3005 +952 8.7624 8.2964 +953 8.75782 8.29231 +954 8.75325 8.28823 +955 8.74869 8.28416 +956 8.74414 8.2801 +957 8.7396 8.27605 +958 8.73506 8.272 +959 8.73053 8.26797 +960 8.72601 8.26394 +961 8.72149 8.25992 +962 8.71698 8.25591 +963 8.71248 8.25191 +964 8.70798 8.24791 +965 8.7035 8.24393 +966 8.69901 8.23995 +967 8.69454 8.23598 +968 8.69007 8.23202 +969 8.68561 8.22807 +970 8.68116 8.22412 +971 8.67672 8.22019 +972 8.67228 8.21626 +973 8.66784 8.21234 +974 8.66342 8.20843 +975 8.659 8.20452 +976 8.65459 8.20063 +977 8.65019 8.19674 +978 8.64579 8.19286 +979 8.6414 8.18899 +980 8.63701 8.18512 +981 8.63264 8.18127 +982 8.62827 8.17742 +983 8.6239 8.17358 +984 8.61955 8.16974 +985 8.6152 8.16592 +986 8.61085 8.1621 +987 8.60652 8.15829 +988 8.60219 8.15449 +989 8.59786 8.15069 +990 8.59355 8.1469 +991 8.58924 8.14312 +992 8.58493 8.13935 +993 8.58063 8.13559 +994 8.57634 8.13183 +995 8.57206 8.12808 +996 8.56778 8.12434 +997 8.56351 8.1206 +998 8.55925 8.11687 +999 8.55499 8.11315 +1000 8.55074 8.10944 +1001 8.54649 8.10573 +1002 8.54225 8.10203 +1003 8.53802 8.09834 +1004 8.5338 8.09465 +1005 8.52958 8.09097 +1006 8.52536 8.0873 +1007 8.52116 8.08364 +1008 8.51696 8.07998 +1009 8.51276 8.07633 +1010 8.50857 8.07268 +1011 8.50439 8.06905 +1012 8.50022 8.06542 +1013 8.49605 8.06179 +1014 8.49189 8.05818 +1015 8.48773 8.05457 +1016 8.48358 8.05096 +1017 8.47943 8.04736 +1018 8.47529 8.04377 +1019 8.47116 8.04019 +1020 8.46704 8.03661 +1021 8.46292 8.03304 +1022 8.4588 8.02948 +1023 8.45469 8.02592 +1024 8.45059 8.02237 +1025 8.4465 8.01882 +1026 8.44241 8.01529 +1027 8.43832 8.01175 +1028 8.43424 8.00823 +1029 8.43017 8.00471 +1030 8.4261 8.00119 +1031 8.42204 7.99768 +1032 8.41799 7.99418 +1033 8.41394 7.99069 +1034 8.4099 7.9872 +1035 8.40586 7.98372 +1036 8.40183 7.98024 +1037 8.3978 7.97677 +1038 8.39378 7.9733 +1039 8.38977 7.96984 +1040 8.38576 7.96639 +1041 8.38176 7.96294 +1042 8.37776 7.9595 +1043 8.37377 7.95606 +1044 8.36979 7.95263 +1045 8.36581 7.94921 +1046 8.36183 7.94579 +1047 8.35786 7.94237 +1048 8.3539 7.93897 +1049 8.34994 7.93556 +1050 8.34599 7.93217 +1051 8.34205 7.92878 +1052 8.33811 7.92539 +1053 8.33417 7.92201 +1054 8.33024 7.91863 +1055 8.32632 7.91526 +1056 8.3224 7.9119 +1057 8.31849 7.90854 +1058 8.31458 7.90519 +1059 8.31067 7.90184 +1060 8.30678 7.8985 +1061 8.30289 7.89516 +1062 8.299 7.89183 +1063 8.29512 7.8885 +1064 8.29124 7.88517 +1065 8.28737 7.88186 +1066 8.28351 7.87854 +1067 8.27965 7.87524 +1068 8.27579 7.87193 +1069 8.27194 7.86864 +1070 8.2681 7.86534 +1071 8.26426 7.86206 +1072 8.26043 7.85877 +1073 8.2566 7.85549 +1074 8.25277 7.85222 +1075 8.24896 7.84895 +1076 8.24514 7.84569 +1077 8.24133 7.84243 +1078 8.23753 7.83917 +1079 8.23373 7.83592 +1080 8.22994 7.83268 +1081 8.22615 7.82944 +1082 8.22237 7.8262 +1083 8.21859 7.82297 +1084 8.21482 7.81974 +1085 8.21105 7.81652 +1086 8.20729 7.8133 +1087 8.20353 7.81008 +1088 8.19977 7.80687 +1089 8.19603 7.80366 +1090 8.19228 7.80046 +1091 8.18854 7.79727 +1092 8.18481 7.79407 +1093 8.18108 7.79088 +1094 8.17736 7.7877 +1095 8.17364 7.78452 +1096 8.16992 7.78134 +1097 8.16621 7.77817 +1098 8.16251 7.775 +1099 8.15881 7.77183 +1100 8.15511 7.76867 +1101 8.15142 7.76551 +1102 8.14773 7.76236 +1103 8.14405 7.75921 +1104 8.14037 7.75606 +1105 8.1367 7.75292 +1106 8.13303 7.74978 +1107 8.12937 7.74665 +1108 8.12571 7.74352 +1109 8.12206 7.74039 +1110 8.11841 7.73727 +1111 8.11476 7.73415 +1112 8.11112 7.73103 +1113 8.10748 7.72792 +1114 8.10385 7.72481 +1115 8.10022 7.7217 +1116 8.0966 7.7186 +1117 8.09298 7.7155 +1118 8.08937 7.7124 +1119 8.08576 7.70931 +1120 8.08215 7.70622 +1121 8.07855 7.70313 +1122 8.07495 7.70005 +1123 8.07136 7.69697 +1124 8.06777 7.69389 +1125 8.06419 7.69082 +1126 8.06061 7.68775 +1127 8.05703 7.68468 +1128 8.05346 7.68162 +1129 8.04989 7.67856 +1130 8.04633 7.6755 +1131 8.04277 7.67244 +1132 8.03921 7.66939 +1133 8.03566 7.66634 +1134 8.03212 7.66329 +1135 8.02857 7.66025 +1136 8.02504 7.65721 +1137 8.0215 7.65417 +1138 8.01797 7.65113 +1139 8.01445 7.6481 +1140 8.01092 7.64507 +1141 8.0074 7.64204 +1142 8.00389 7.63902 +1143 8.00038 7.63599 +1144 7.99687 7.63297 +1145 7.99337 7.62995 +1146 7.98987 7.62694 +1147 7.98638 7.62393 +1148 7.98289 7.62092 +1149 7.9794 7.61791 +1150 7.97592 7.6149 +1151 7.97244 7.6119 +1152 7.96896 7.6089 +1153 7.96549 7.6059 +1154 7.96202 7.6029 +1155 7.95856 7.59991 +1156 7.9551 7.59691 +1157 7.95164 7.59392 +1158 7.94819 7.59094 +1159 7.94474 7.58795 +1160 7.94129 7.58497 +1161 7.93785 7.58198 +1162 7.93441 7.579 +1163 7.93098 7.57602 +1164 7.92755 7.57305 +1165 7.92412 7.57007 +1166 7.92069 7.5671 +1167 7.91727 7.56413 +1168 7.91386 7.56116 +1169 7.91044 7.55819 +1170 7.90703 7.55523 +1171 7.90363 7.55226 +1172 7.90022 7.5493 +1173 7.89682 7.54634 +1174 7.89343 7.54338 +1175 7.89003 7.54042 +1176 7.88665 7.53747 +1177 7.88326 7.53451 +1178 7.87988 7.53156 +1179 7.8765 7.52861 +1180 7.87312 7.52566 +1181 7.86975 7.52271 +1182 7.86638 7.51976 +1183 7.86301 7.51682 +1184 7.85965 7.51387 +1185 7.85629 7.51093 +1186 7.85294 7.50799 +1187 7.84958 7.50504 +1188 7.84623 7.5021 +1189 7.84289 7.49916 +1190 7.83954 7.49623 +1191 7.8362 7.49329 +1192 7.83287 7.49035 +1193 7.82953 7.48742 +1194 7.8262 7.48449 +1195 7.82287 7.48155 +1196 7.81955 7.47862 +1197 7.81623 7.47569 +1198 7.81291 7.47276 +1199 7.80959 7.46983 +1200 7.80628 7.4669 +1201 7.80297 7.46397 +1202 7.79966 7.46105 +1203 7.79636 7.45812 +1204 7.79306 7.45519 +1205 7.78976 7.45227 +1206 7.78647 7.44934 +1207 7.78317 7.44642 +1208 7.77988 7.4435 +1209 7.7766 7.44057 +1210 7.77332 7.43765 +1211 7.77003 7.43473 +1212 7.76676 7.43181 +1213 7.76348 7.42889 +1214 7.76021 7.42597 +1215 7.75694 7.42305 +1216 7.75367 7.42013 +1217 7.75041 7.41721 +1218 7.74715 7.41429 +1219 7.74389 7.41137 +1220 7.74064 7.40846 +1221 7.73739 7.40554 +1222 7.73414 7.40263 +1223 7.73089 7.39971 +1224 7.72765 7.3968 +1225 7.72441 7.39388 +1226 7.72117 7.39097 +1227 7.71793 7.38806 +1228 7.7147 7.38514 +1229 7.71147 7.38223 +1230 7.70824 7.37932 +1231 7.70502 7.37641 +1232 7.7018 7.3735 +1233 7.69858 7.37059 +1234 7.69536 7.36769 +1235 7.69215 7.36478 +1236 7.68894 7.36187 +1237 7.68573 7.35896 +1238 7.68253 7.35606 +1239 7.67933 7.35315 +1240 7.67613 7.35025 +1241 7.67293 7.34734 +1242 7.66974 7.34444 +1243 7.66655 7.34154 +1244 7.66336 7.33864 +1245 7.66017 7.33573 +1246 7.65699 7.33283 +1247 7.65381 7.32993 +1248 7.65063 7.32703 +1249 7.64746 7.32413 +1250 7.64429 7.32124 +1251 7.64112 7.31834 +1252 7.63795 7.31544 +1253 7.63479 7.31255 +1254 7.63163 7.30965 +1255 7.62847 7.30676 +1256 7.62531 7.30386 +1257 7.62216 7.30097 +1258 7.61901 7.29807 +1259 7.61586 7.29518 +1260 7.61272 7.29229 +1261 7.60958 7.2894 +1262 7.60644 7.28651 +1263 7.6033 7.28362 +1264 7.60016 7.28073 +1265 7.59703 7.27784 +1266 7.5939 7.27495 +1267 7.59078 7.27207 +1268 7.58766 7.26918 +1269 7.58453 7.2663 +1270 7.58142 7.26341 +1271 7.5783 7.26053 +1272 7.57519 7.25764 +1273 7.57208 7.25476 +1274 7.56897 7.25188 +1275 7.56586 7.249 +1276 7.56276 7.24612 +1277 7.55966 7.24324 +1278 7.55657 7.24036 +1279 7.55347 7.23748 +1280 7.55038 7.2346 +1281 7.54729 7.23172 +1282 7.5442 7.22885 +1283 7.54112 7.22597 +1284 7.53804 7.2231 +1285 7.53496 7.22022 +1286 7.53188 7.21735 +1287 7.52881 7.21447 +1288 7.52574 7.2116 +1289 7.52267 7.20873 +1290 7.5196 7.20586 +1291 7.51654 7.20299 +1292 7.51348 7.20012 +1293 7.51042 7.19725 +1294 7.50736 7.19439 +1295 7.50431 7.19152 +1296 7.50126 7.18865 +1297 7.49821 7.18579 +1298 7.49516 7.18292 +1299 7.49212 7.18006 +1300 7.48908 7.17719 +1301 7.48604 7.17433 +1302 7.48301 7.17147 +1303 7.47997 7.16861 +1304 7.47694 7.16575 +1305 7.47392 7.16289 +1306 7.47089 7.16003 +1307 7.46787 7.15717 +1308 7.46485 7.15432 +1309 7.46183 7.15146 +1310 7.45881 7.1486 +1311 7.4558 7.14575 +1312 7.45279 7.1429 +1313 7.44978 7.14004 +1314 7.44678 7.13719 +1315 7.44377 7.13434 +1316 7.44077 7.13149 +1317 7.43777 7.12864 +1318 7.43478 7.12579 +1319 7.43178 7.12294 +1320 7.42879 7.12009 +1321 7.42581 7.11725 +1322 7.42282 7.1144 +1323 7.41984 7.11155 +1324 7.41686 7.10871 +1325 7.41388 7.10587 +1326 7.4109 7.10302 +1327 7.40793 7.10018 +1328 7.40496 7.09734 +1329 7.40199 7.0945 +1330 7.39902 7.09166 +1331 7.39606 7.08882 +1332 7.39309 7.08598 +1333 7.39014 7.08315 +1334 7.38718 7.08031 +1335 7.38422 7.07747 +1336 7.38127 7.07464 +1337 7.37832 7.07181 +1338 7.37538 7.06897 +1339 7.37243 7.06614 +1340 7.36949 7.06331 +1341 7.36655 7.06048 +1342 7.36361 7.05765 +1343 7.36068 7.05482 +1344 7.35774 7.05199 +1345 7.35481 7.04917 +1346 7.35188 7.04634 +1347 7.34896 7.04351 +1348 7.34603 7.04069 +1349 7.34311 7.03787 +1350 7.3402 7.03504 +1351 7.33728 7.03222 +1352 7.33436 7.0294 +1353 7.33145 7.02658 +1354 7.32854 7.02376 +1355 7.32564 7.02094 +1356 7.32273 7.01812 +1357 7.31983 7.01531 +1358 7.31693 7.01249 +1359 7.31403 7.00968 +1360 7.31114 7.00686 +1361 7.30824 7.00405 +1362 7.30535 7.00124 +1363 7.30246 6.99843 +1364 7.29958 6.99561 +1365 7.29669 6.9928 +1366 7.29381 6.99 +1367 7.29093 6.98719 +1368 7.28806 6.98438 +1369 7.28518 6.98157 +1370 7.28231 6.97877 +1371 7.27944 6.97597 +1372 7.27657 6.97316 +1373 7.2737 6.97036 +1374 7.27084 6.96756 +1375 7.26798 6.96476 +1376 7.26512 6.96196 +1377 7.26226 6.95916 +1378 7.25941 6.95636 +1379 7.25656 6.95356 +1380 7.25371 6.95077 +1381 7.25086 6.94797 +1382 7.24801 6.94518 +1383 7.24517 6.94238 +1384 7.24233 6.93959 +1385 7.23949 6.9368 +1386 7.23665 6.93401 +1387 7.23382 6.93122 +1388 7.23099 6.92843 +1389 7.22816 6.92564 +1390 7.22533 6.92286 +1391 7.2225 6.92007 +1392 7.21968 6.91729 +1393 7.21686 6.9145 +1394 7.21404 6.91172 +1395 7.21122 6.90894 +1396 7.20841 6.90616 +1397 7.2056 6.90338 +1398 7.20279 6.9006 +1399 7.19998 6.89782 +1400 7.19717 6.89504 +1401 7.19437 6.89227 +1402 7.19157 6.88949 +1403 7.18877 6.88672 +1404 7.18597 6.88394 +1405 7.18318 6.88117 +1406 7.18038 6.8784 +1407 7.17759 6.87563 +1408 7.1748 6.87286 +1409 7.17202 6.87009 +1410 7.16923 6.86732 +1411 7.16645 6.86456 +1412 7.16367 6.86179 +1413 7.16089 6.85903 +1414 7.15812 6.85626 +1415 7.15534 6.8535 +1416 7.15257 6.85074 +1417 7.1498 6.84798 +1418 7.14703 6.84522 +1419 7.14427 6.84246 +1420 7.14151 6.8397 +1421 7.13875 6.83695 +1422 7.13599 6.83419 +1423 7.13323 6.83144 +1424 7.13047 6.82868 +1425 7.12772 6.82593 +1426 7.12497 6.82318 +1427 7.12222 6.82043 +1428 7.11948 6.81768 +1429 7.11673 6.81493 +1430 7.11399 6.81218 +1431 7.11125 6.80944 +1432 7.10851 6.80669 +1433 7.10577 6.80395 +1434 7.10304 6.8012 +1435 7.10031 6.79846 +1436 7.09758 6.79572 +1437 7.09485 6.79298 +1438 7.09212 6.79024 +1439 7.0894 6.7875 +1440 7.08668 6.78476 +1441 7.08396 6.78203 +1442 7.08124 6.77929 +1443 7.07852 6.77656 +1444 7.07581 6.77383 +1445 7.0731 6.77109 +1446 7.07039 6.76836 +1447 7.06768 6.76563 +1448 7.06497 6.76291 +1449 7.06227 6.76018 +1450 7.05957 6.75745 +1451 7.05687 6.75473 +1452 7.05417 6.752 +1453 7.05147 6.74928 +1454 7.04878 6.74656 +1455 7.04609 6.74383 +1456 7.0434 6.74111 +1457 7.04071 6.73839 +1458 7.03802 6.73568 +1459 7.03534 6.73296 +1460 7.03266 6.73024 +1461 7.02998 6.72753 +1462 7.0273 6.72482 +1463 7.02462 6.7221 +1464 7.02195 6.71939 +1465 7.01928 6.71668 +1466 7.01661 6.71397 +1467 7.01394 6.71126 +1468 7.01127 6.70856 +1469 7.00861 6.70585 +1470 7.00594 6.70315 +1471 7.00328 6.70044 +1472 7.00062 6.69774 +1473 6.99797 6.69504 +1474 6.99531 6.69234 +1475 6.99266 6.68964 +1476 6.99001 6.68694 +1477 6.98736 6.68424 +1478 6.98471 6.68155 +1479 6.98206 6.67885 +1480 6.97942 6.67616 +1481 6.97678 6.67346 +1482 6.97414 6.67077 +1483 6.9715 6.66808 +1484 6.96886 6.66539 +1485 6.96623 6.66271 +1486 6.9636 6.66002 +1487 6.96097 6.65733 +1488 6.95834 6.65465 +1489 6.95571 6.65196 +1490 6.95309 6.64928 +1491 6.95046 6.6466 +1492 6.94784 6.64392 +1493 6.94522 6.64124 +1494 6.9426 6.63856 +1495 6.93999 6.63589 +1496 6.93737 6.63321 +1497 6.93476 6.63054 +1498 6.93215 6.62786 +1499 6.92954 6.62519 +1500 6.92694 6.62252 +1501 6.92433 6.61985 +1502 6.92173 6.61718 +1503 6.91913 6.61451 +1504 6.91653 6.61185 +1505 6.91393 6.60918 +1506 6.91133 6.60652 +1507 6.90874 6.60386 +1508 6.90615 6.60119 +1509 6.90356 6.59853 +1510 6.90097 6.59587 +1511 6.89838 6.59322 +1512 6.8958 6.59056 +1513 6.89321 6.5879 +1514 6.89063 6.58525 +1515 6.88805 6.5826 +1516 6.88548 6.57994 +1517 6.8829 6.57729 +1518 6.88032 6.57464 +1519 6.87775 6.572 +1520 6.87518 6.56935 +1521 6.87261 6.5667 +1522 6.87004 6.56406 +1523 6.86748 6.56141 +1524 6.86491 6.55877 +1525 6.86235 6.55613 +1526 6.85979 6.55349 +1527 6.85723 6.55085 +1528 6.85468 6.54821 +1529 6.85212 6.54558 +1530 6.84957 6.54294 +1531 6.84701 6.54031 +1532 6.84446 6.53767 +1533 6.84192 6.53504 +1534 6.83937 6.53241 +1535 6.83682 6.52978 +1536 6.83428 6.52715 +1537 6.83174 6.52453 +1538 6.8292 6.5219 +1539 6.82666 6.51928 +1540 6.82412 6.51666 +1541 6.82159 6.51403 +1542 6.81906 6.51141 +1543 6.81652 6.50879 +1544 6.81399 6.50618 +1545 6.81147 6.50356 +1546 6.80894 6.50094 +1547 6.80642 6.49833 +1548 6.80389 6.49572 +1549 6.80137 6.49311 +1550 6.79885 6.49049 +1551 6.79633 6.48789 +1552 6.79382 6.48528 +1553 6.7913 6.48267 +1554 6.78879 6.48007 +1555 6.78628 6.47746 +1556 6.78377 6.47486 +1557 6.78126 6.47226 +1558 6.77875 6.46966 +1559 6.77624 6.46706 +1560 6.77374 6.46446 +1561 6.77124 6.46186 +1562 6.76874 6.45927 +1563 6.76624 6.45667 +1564 6.76374 6.45408 +1565 6.76125 6.45149 +1566 6.75875 6.4489 +1567 6.75626 6.44631 +1568 6.75377 6.44372 +1569 6.75128 6.44114 +1570 6.74879 6.43855 +1571 6.74631 6.43597 +1572 6.74382 6.43339 +1573 6.74134 6.43081 +1574 6.73886 6.42823 +1575 6.73638 6.42565 +1576 6.7339 6.42307 +1577 6.73142 6.42049 +1578 6.72895 6.41792 +1579 6.72648 6.41535 +1580 6.724 6.41277 +1581 6.72153 6.4102 +1582 6.71906 6.40763 +1583 6.7166 6.40507 +1584 6.71413 6.4025 +1585 6.71167 6.39993 +1586 6.7092 6.39737 +1587 6.70674 6.39481 +1588 6.70428 6.39225 +1589 6.70182 6.38969 +1590 6.69937 6.38713 +1591 6.69691 6.38457 +1592 6.69446 6.38201 +1593 6.69201 6.37946 +1594 6.68956 6.37691 +1595 6.68711 6.37435 +1596 6.68466 6.3718 +1597 6.68221 6.36926 +1598 6.67977 6.36671 +1599 6.67733 6.36416 +1600 6.67488 6.36162 +1601 6.67244 6.35907 +1602 6.67001 6.35653 +1603 6.66757 6.35399 +1604 6.66513 6.35145 +1605 6.6627 6.34891 +1606 6.66027 6.34637 +1607 6.65783 6.34384 +1608 6.6554 6.3413 +1609 6.65298 6.33877 +1610 6.65055 6.33624 +1611 6.64812 6.33371 +1612 6.6457 6.33118 +1613 6.64328 6.32865 +1614 6.64086 6.32612 +1615 6.63844 6.3236 +1616 6.63602 6.32108 +1617 6.6336 6.31855 +1618 6.63119 6.31603 +1619 6.62877 6.31351 +1620 6.62636 6.311 +1621 6.62395 6.30848 +1622 6.62154 6.30597 +1623 6.61913 6.30345 +1624 6.61672 6.30094 +1625 6.61432 6.29843 +1626 6.61191 6.29592 +1627 6.60951 6.29341 +1628 6.60711 6.2909 +1629 6.60471 6.2884 +1630 6.60231 6.2859 +1631 6.59991 6.28339 +1632 6.59752 6.28089 +1633 6.59512 6.27839 +1634 6.59273 6.27589 +1635 6.59034 6.2734 +1636 6.58795 6.2709 +1637 6.58556 6.26841 +1638 6.58317 6.26592 +1639 6.58079 6.26342 +1640 6.5784 6.26093 +1641 6.57602 6.25845 +1642 6.57363 6.25596 +1643 6.57125 6.25347 +1644 6.56887 6.25099 +1645 6.5665 6.24851 +1646 6.56412 6.24603 +1647 6.56174 6.24355 +1648 6.55937 6.24107 +1649 6.557 6.23859 +1650 6.55463 6.23612 +1651 6.55225 6.23364 +1652 6.54989 6.23117 +1653 6.54752 6.2287 +1654 6.54515 6.22623 +1655 6.54279 6.22376 +1656 6.54042 6.22129 +1657 6.53806 6.21883 +1658 6.5357 6.21637 +1659 6.53334 6.2139 +1660 6.53098 6.21144 +1661 6.52862 6.20898 +1662 6.52627 6.20653 +1663 6.52391 6.20407 +1664 6.52156 6.20161 +1665 6.51921 6.19916 +1666 6.51686 6.19671 +1667 6.51451 6.19426 +1668 6.51216 6.19181 +1669 6.50981 6.18936 +1670 6.50747 6.18691 +1671 6.50512 6.18447 +1672 6.50278 6.18203 +1673 6.50044 6.17959 +1674 6.4981 6.17715 +1675 6.49576 6.17471 +1676 6.49342 6.17227 +1677 6.49108 6.16983 +1678 6.48875 6.1674 +1679 6.48641 6.16497 +1680 6.48408 6.16254 +1681 6.48175 6.16011 +1682 6.47942 6.15768 +1683 6.47709 6.15525 +1684 6.47476 6.15283 +1685 6.47243 6.1504 +1686 6.4701 6.14798 +1687 6.46778 6.14556 +1688 6.46546 6.14314 +1689 6.46313 6.14072 +1690 6.46081 6.13831 +1691 6.45849 6.13589 +1692 6.45617 6.13348 +1693 6.45386 6.13107 +1694 6.45154 6.12866 +1695 6.44922 6.12625 +1696 6.44691 6.12384 +1697 6.4446 6.12143 +1698 6.44228 6.11903 +1699 6.43997 6.11663 +1700 6.43766 6.11423 +1701 6.43536 6.11183 +1702 6.43305 6.10943 +1703 6.43074 6.10703 +1704 6.42844 6.10464 +1705 6.42613 6.10225 +1706 6.42383 6.09985 +1707 6.42153 6.09746 +1708 6.41923 6.09507 +1709 6.41693 6.09269 +1710 6.41463 6.0903 +1711 6.41234 6.08792 +1712 6.41004 6.08554 +1713 6.40775 6.08316 +1714 6.40545 6.08078 +1715 6.40316 6.0784 +1716 6.40087 6.07602 +1717 6.39858 6.07365 +1718 6.39629 6.07127 +1719 6.394 6.0689 +1720 6.39171 6.06653 +1721 6.38943 6.06416 +1722 6.38714 6.0618 +1723 6.38486 6.05943 +1724 6.38258 6.05707 +1725 6.3803 6.05471 +1726 6.37802 6.05235 +1727 6.37574 6.04999 +1728 6.37346 6.04763 +1729 6.37118 6.04527 +1730 6.36891 6.04292 +1731 6.36663 6.04057 +1732 6.36436 6.03822 +1733 6.36208 6.03587 +1734 6.35981 6.03352 +1735 6.35754 6.03117 +1736 6.35527 6.02883 +1737 6.353 6.02649 +1738 6.35074 6.02414 +1739 6.34847 6.0218 +1740 6.3462 6.01947 +1741 6.34394 6.01713 +1742 6.34168 6.01479 +1743 6.33941 6.01246 +1744 6.33715 6.01013 +1745 6.33489 6.0078 +1746 6.33263 6.00547 +1747 6.33037 6.00314 +1748 6.32812 6.00082 +1749 6.32586 5.99849 +1750 6.3236 5.99617 +1751 6.32135 5.99385 +1752 6.3191 5.99153 +1753 6.31684 5.98922 +1754 6.31459 5.9869 +1755 6.31234 5.98459 +1756 6.31009 5.98227 +1757 6.30785 5.97996 +1758 6.3056 5.97765 +1759 6.30335 5.97535 +1760 6.30111 5.97304 +1761 6.29886 5.97074 +1762 6.29662 5.96843 +1763 6.29438 5.96613 +1764 6.29213 5.96383 +1765 6.28989 5.96154 +1766 6.28765 5.95924 +1767 6.28542 5.95695 +1768 6.28318 5.95465 +1769 6.28094 5.95236 +1770 6.27871 5.95007 +1771 6.27647 5.94778 +1772 6.27424 5.9455 +1773 6.272 5.94321 +1774 6.26977 5.94093 +1775 6.26754 5.93865 +1776 6.26531 5.93637 +1777 6.26308 5.93409 +1778 6.26085 5.93182 +1779 6.25862 5.92954 +1780 6.2564 5.92727 +1781 6.25417 5.925 +1782 6.25195 5.92273 +1783 6.24972 5.92046 +1784 6.2475 5.9182 +1785 6.24528 5.91593 +1786 6.24306 5.91367 +1787 6.24084 5.91141 +1788 6.23862 5.90915 +1789 6.2364 5.90689 +1790 6.23418 5.90463 +1791 6.23197 5.90238 +1792 6.22975 5.90013 +1793 6.22753 5.89788 +1794 6.22532 5.89563 +1795 6.22311 5.89338 +1796 6.2209 5.89113 +1797 6.21868 5.88889 +1798 6.21647 5.88665 +1799 6.21426 5.88441 +1800 6.21205 5.88217 +1801 6.20985 5.87993 +1802 6.20764 5.8777 +1803 6.20543 5.87546 +1804 6.20323 5.87323 +1805 6.20102 5.871 +1806 6.19882 5.86877 +1807 6.19662 5.86654 +1808 6.19441 5.86432 +1809 6.19221 5.8621 +1810 6.19001 5.85987 +1811 6.18781 5.85765 +1812 6.18561 5.85543 +1813 6.18342 5.85322 +1814 6.18122 5.851 +1815 6.17902 5.84879 +1816 6.17683 5.84658 +1817 6.17463 5.84437 +1818 6.17244 5.84216 +1819 6.17024 5.83995 +1820 6.16805 5.83775 +1821 6.16586 5.83555 +1822 6.16367 5.83334 +1823 6.16148 5.83115 +1824 6.15929 5.82895 +1825 6.1571 5.82675 +1826 6.15492 5.82456 +1827 6.15273 5.82236 +1828 6.15054 5.82017 +1829 6.14836 5.81798 +1830 6.14617 5.8158 +1831 6.14399 5.81361 +1832 6.14181 5.81142 +1833 6.13963 5.80924 +1834 6.13745 5.80706 +1835 6.13527 5.80488 +1836 6.13309 5.8027 +1837 6.13091 5.80053 +1838 6.12873 5.79835 +1839 6.12656 5.79618 +1840 6.12438 5.79401 +1841 6.1222 5.79184 +1842 6.12003 5.78967 +1843 6.11786 5.78751 +1844 6.11569 5.78534 +1845 6.11351 5.78318 +1846 6.11134 5.78102 +1847 6.10917 5.77886 +1848 6.107 5.7767 +1849 6.10484 5.77454 +1850 6.10267 5.77239 +1851 6.1005 5.77024 +1852 6.09834 5.76808 +1853 6.09617 5.76593 +1854 6.09401 5.76379 +1855 6.09184 5.76164 +1856 6.08968 5.7595 +1857 6.08752 5.75735 +1858 6.08536 5.75521 +1859 6.0832 5.75307 +1860 6.08104 5.75093 +1861 6.07888 5.7488 +1862 6.07672 5.74666 +1863 6.07457 5.74453 +1864 6.07241 5.7424 +1865 6.07026 5.74027 +1866 6.0681 5.73814 +1867 6.06595 5.73601 +1868 6.0638 5.73388 +1869 6.06164 5.73176 +1870 6.05949 5.72964 +1871 6.05734 5.72752 +1872 6.05519 5.7254 +1873 6.05305 5.72328 +1874 6.0509 5.72117 +1875 6.04875 5.71905 +1876 6.04661 5.71694 +1877 6.04446 5.71483 +1878 6.04232 5.71272 +1879 6.04017 5.71061 +1880 6.03803 5.7085 +1881 6.03589 5.7064 +1882 6.03375 5.7043 +1883 6.03161 5.7022 +1884 6.02947 5.7001 +1885 6.02733 5.698 +1886 6.02519 5.6959 +1887 6.02306 5.69381 +1888 6.02092 5.69171 +1889 6.01879 5.68962 +1890 6.01665 5.68753 +1891 6.01452 5.68544 +1892 6.01239 5.68335 +1893 6.01026 5.68127 +1894 6.00812 5.67918 +1895 6.00599 5.6771 +1896 6.00387 5.67502 +1897 6.00174 5.67294 +1898 5.99961 5.67086 +1899 5.99748 5.66879 +1900 5.99536 5.66671 +1901 5.99323 5.66464 +1902 5.99111 5.66257 +1903 5.98898 5.6605 +1904 5.98686 5.65843 +1905 5.98474 5.65636 +1906 5.98262 5.65429 +1907 5.9805 5.65223 +1908 5.97838 5.65017 +1909 5.97626 5.64811 +1910 5.97415 5.64605 +1911 5.97203 5.64399 +1912 5.96991 5.64193 +1913 5.9678 5.63988 +1914 5.96568 5.63782 +1915 5.96357 5.63577 +1916 5.96146 5.63372 +1917 5.95935 5.63167 +1918 5.95724 5.62963 +1919 5.95513 5.62758 +1920 5.95302 5.62553 +1921 5.95091 5.62349 +1922 5.9488 5.62145 +1923 5.9467 5.61941 +1924 5.94459 5.61737 +1925 5.94249 5.61534 +1926 5.94038 5.6133 +1927 5.93828 5.61127 +1928 5.93618 5.60923 +1929 5.93407 5.6072 +1930 5.93197 5.60517 +1931 5.92987 5.60315 +1932 5.92777 5.60112 +1933 5.92568 5.5991 +1934 5.92358 5.59707 +1935 5.92148 5.59505 +1936 5.91939 5.59303 +1937 5.91729 5.59101 +1938 5.9152 5.58899 +1939 5.91311 5.58698 +1940 5.91101 5.58496 +1941 5.90892 5.58295 +1942 5.90683 5.58094 +1943 5.90474 5.57893 +1944 5.90265 5.57692 +1945 5.90057 5.57491 +1946 5.89848 5.57291 +1947 5.89639 5.5709 +1948 5.89431 5.5689 +1949 5.89222 5.5669 +1950 5.89014 5.5649 +1951 5.88806 5.5629 +1952 5.88597 5.5609 +1953 5.88389 5.55891 +1954 5.88181 5.55691 +1955 5.87973 5.55492 +1956 5.87765 5.55293 +1957 5.87558 5.55094 +1958 5.8735 5.54895 +1959 5.87142 5.54696 +1960 5.86935 5.54498 +1961 5.86727 5.54299 +1962 5.8652 5.54101 +1963 5.86313 5.53903 +1964 5.86105 5.53705 +1965 5.85898 5.53507 +1966 5.85691 5.5331 +1967 5.85484 5.53112 +1968 5.85277 5.52915 +1969 5.85071 5.52717 +1970 5.84864 5.5252 +1971 5.84657 5.52323 +1972 5.84451 5.52127 +1973 5.84244 5.5193 +1974 5.84038 5.51733 +1975 5.83832 5.51537 +1976 5.83626 5.51341 +1977 5.83419 5.51144 +1978 5.83213 5.50948 +1979 5.83008 5.50753 +1980 5.82802 5.50557 +1981 5.82596 5.50361 +1982 5.8239 5.50166 +1983 5.82185 5.49971 +1984 5.81979 5.49775 +1985 5.81774 5.4958 +1986 5.81568 5.49386 +1987 5.81363 5.49191 +1988 5.81158 5.48996 +1989 5.80953 5.48802 +1990 5.80748 5.48607 +1991 5.80543 5.48413 +1992 5.80338 5.48219 +1993 5.80133 5.48025 +1994 5.79929 5.47832 +1995 5.79724 5.47638 +1996 5.7952 5.47444 +1997 5.79315 5.47251 +1998 5.79111 5.47058 +1999 5.78907 5.46865 +2000 5.78703 5.46672 +2001 5.78499 5.46479 +2002 5.78295 5.46286 +2003 5.78091 5.46094 +2004 5.77887 5.45901 +2005 5.77683 5.45709 +2006 5.7748 5.45517 +2007 5.77276 5.45325 +2008 5.77072 5.45133 +2009 5.76869 5.44941 +2010 5.76666 5.4475 +2011 5.76463 5.44558 +2012 5.76259 5.44367 +2013 5.76056 5.44176 +2014 5.75853 5.43985 +2015 5.75651 5.43794 +2016 5.75448 5.43603 +2017 5.75245 5.43412 +2018 5.75042 5.43222 +2019 5.7484 5.43032 +2020 5.74637 5.42841 +2021 5.74435 5.42651 +2022 5.74233 5.42461 +2023 5.74031 5.42271 +2024 5.73829 5.42082 +2025 5.73627 5.41892 +2026 5.73425 5.41702 +2027 5.73223 5.41513 +2028 5.73021 5.41324 +2029 5.72819 5.41135 +2030 5.72618 5.40946 +2031 5.72416 5.40757 +2032 5.72215 5.40568 +2033 5.72013 5.4038 +2034 5.71812 5.40191 +2035 5.71611 5.40003 +2036 5.7141 5.39815 +2037 5.71209 5.39627 +2038 5.71008 5.39439 +2039 5.70807 5.39251 +2040 5.70606 5.39064 +2041 5.70406 5.38876 +2042 5.70205 5.38689 +2043 5.70005 5.38502 +2044 5.69804 5.38314 +2045 5.69604 5.38127 +2046 5.69404 5.37941 +2047 5.69204 5.37754 +2048 5.69004 5.37567 +2049 5.68804 5.37381 +2050 5.68604 5.37194 +2051 5.68404 5.37008 +2052 5.68204 5.36822 +2053 5.68005 5.36636 +2054 5.67805 5.3645 +2055 5.67606 5.36264 +2056 5.67406 5.36079 +2057 5.67207 5.35893 +2058 5.67008 5.35708 +2059 5.66809 5.35523 +2060 5.66609 5.35338 +2061 5.66411 5.35153 +2062 5.66212 5.34968 +2063 5.66013 5.34783 +2064 5.65814 5.34599 +2065 5.65616 5.34414 +2066 5.65417 5.3423 +2067 5.65219 5.34046 +2068 5.6502 5.33861 +2069 5.64822 5.33677 +2070 5.64624 5.33494 +2071 5.64426 5.3331 +2072 5.64228 5.33126 +2073 5.6403 5.32943 +2074 5.63832 5.32759 +2075 5.63634 5.32576 +2076 5.63437 5.32393 +2077 5.63239 5.3221 +2078 5.63042 5.32027 +2079 5.62844 5.31845 +2080 5.62647 5.31662 +2081 5.6245 5.31479 +2082 5.62252 5.31297 +2083 5.62055 5.31115 +2084 5.61858 5.30933 +2085 5.61661 5.30751 +2086 5.61465 5.30569 +2087 5.61268 5.30387 +2088 5.61071 5.30205 +2089 5.60875 5.30024 +2090 5.60678 5.29842 +2091 5.60482 5.29661 +2092 5.60286 5.2948 +2093 5.60089 5.29299 +2094 5.59893 5.29118 +2095 5.59697 5.28937 +2096 5.59501 5.28756 +2097 5.59306 5.28576 +2098 5.5911 5.28395 +2099 5.58914 5.28215 +2100 5.58718 5.28035 +2101 5.58523 5.27855 +2102 5.58327 5.27675 +2103 5.58132 5.27495 +2104 5.57937 5.27315 +2105 5.57742 5.27136 +2106 5.57547 5.26956 +2107 5.57352 5.26777 +2108 5.57157 5.26597 +2109 5.56962 5.26418 +2110 5.56767 5.26239 +2111 5.56572 5.2606 +2112 5.56378 5.25881 +2113 5.56183 5.25703 +2114 5.55989 5.25524 +2115 5.55795 5.25346 +2116 5.55601 5.25167 +2117 5.55406 5.24989 +2118 5.55212 5.24811 +2119 5.55018 5.24633 +2120 5.54824 5.24455 +2121 5.54631 5.24277 +2122 5.54437 5.241 +2123 5.54243 5.23922 +2124 5.5405 5.23745 +2125 5.53856 5.23567 +2126 5.53663 5.2339 +2127 5.5347 5.23213 +2128 5.53277 5.23036 +2129 5.53083 5.22859 +2130 5.5289 5.22683 +2131 5.52698 5.22506 +2132 5.52505 5.2233 +2133 5.52312 5.22153 +2134 5.52119 5.21977 +2135 5.51927 5.21801 +2136 5.51734 5.21625 +2137 5.51542 5.21449 +2138 5.51349 5.21273 +2139 5.51157 5.21097 +2140 5.50965 5.20921 +2141 5.50773 5.20746 +2142 5.50581 5.20571 +2143 5.50389 5.20395 +2144 5.50197 5.2022 +2145 5.50006 5.20045 +2146 5.49814 5.1987 +2147 5.49622 5.19695 +2148 5.49431 5.19521 +2149 5.4924 5.19346 +2150 5.49048 5.19171 +2151 5.48857 5.18997 +2152 5.48666 5.18823 +2153 5.48475 5.18649 +2154 5.48284 5.18474 +2155 5.48093 5.18301 +2156 5.47902 5.18127 +2157 5.47712 5.17953 +2158 5.47521 5.17779 +2159 5.47331 5.17606 +2160 5.4714 5.17432 +2161 5.4695 5.17259 +2162 5.4676 5.17086 +2163 5.46569 5.16913 +2164 5.46379 5.1674 +2165 5.46189 5.16567 +2166 5.45999 5.16394 +2167 5.4581 5.16221 +2168 5.4562 5.16049 +2169 5.4543 5.15876 +2170 5.45241 5.15704 +2171 5.45051 5.15532 +2172 5.44862 5.1536 +2173 5.44673 5.15188 +2174 5.44483 5.15016 +2175 5.44294 5.14844 +2176 5.44105 5.14672 +2177 5.43916 5.14501 +2178 5.43727 5.14329 +2179 5.43539 5.14158 +2180 5.4335 5.13986 +2181 5.43161 5.13815 +2182 5.42973 5.13644 +2183 5.42784 5.13473 +2184 5.42596 5.13302 +2185 5.42408 5.13132 +2186 5.4222 5.12961 +2187 5.42032 5.1279 +2188 5.41844 5.1262 +2189 5.41656 5.1245 +2190 5.41468 5.12279 +2191 5.4128 5.12109 +2192 5.41093 5.11939 +2193 5.40905 5.11769 +2194 5.40717 5.11599 +2195 5.4053 5.1143 +2196 5.40343 5.1126 +2197 5.40156 5.1109 +2198 5.39968 5.10921 +2199 5.39781 5.10752 +2200 5.39595 5.10582 +2201 5.39408 5.10413 +2202 5.39221 5.10244 +2203 5.39034 5.10075 +2204 5.38848 5.09907 +2205 5.38661 5.09738 +2206 5.38475 5.09569 +2207 5.38288 5.09401 +2208 5.38102 5.09232 +2209 5.37916 5.09064 +2210 5.3773 5.08896 +2211 5.37544 5.08728 +2212 5.37358 5.0856 +2213 5.37172 5.08392 +2214 5.36986 5.08224 +2215 5.36801 5.08056 +2216 5.36615 5.07888 +2217 5.3643 5.07721 +2218 5.36244 5.07554 +2219 5.36059 5.07386 +2220 5.35874 5.07219 +2221 5.35689 5.07052 +2222 5.35504 5.06885 +2223 5.35319 5.06718 +2224 5.35134 5.06551 +2225 5.34949 5.06384 +2226 5.34764 5.06218 +2227 5.3458 5.06051 +2228 5.34395 5.05885 +2229 5.34211 5.05718 +2230 5.34027 5.05552 +2231 5.33842 5.05386 +2232 5.33658 5.0522 +2233 5.33474 5.05054 +2234 5.3329 5.04888 +2235 5.33106 5.04722 +2236 5.32923 5.04556 +2237 5.32739 5.04391 +2238 5.32555 5.04225 +2239 5.32372 5.0406 +2240 5.32188 5.03895 +2241 5.32005 5.03729 +2242 5.31822 5.03564 +2243 5.31638 5.03399 +2244 5.31455 5.03234 +2245 5.31272 5.0307 +2246 5.31089 5.02905 +2247 5.30906 5.0274 +2248 5.30724 5.02576 +2249 5.30541 5.02411 +2250 5.30358 5.02247 +2251 5.30176 5.02083 +2252 5.29994 5.01918 +2253 5.29811 5.01754 +2254 5.29629 5.0159 +2255 5.29447 5.01426 +2256 5.29265 5.01263 +2257 5.29083 5.01099 +2258 5.28901 5.00935 +2259 5.28719 5.00772 +2260 5.28537 5.00608 +2261 5.28356 5.00445 +2262 5.28174 5.00282 +2263 5.27993 5.00118 +2264 5.27811 4.99955 +2265 5.2763 4.99792 +2266 5.27449 4.99629 +2267 5.27268 4.99467 +2268 5.27087 4.99304 +2269 5.26906 4.99141 +2270 5.26725 4.98979 +2271 5.26544 4.98816 +2272 5.26364 4.98654 +2273 5.26183 4.98492 +2274 5.26003 4.9833 +2275 5.25822 4.98167 +2276 5.25642 4.98005 +2277 5.25462 4.97844 +2278 5.25282 4.97682 +2279 5.25102 4.9752 +2280 5.24922 4.97358 +2281 5.24742 4.97197 +2282 5.24562 4.97035 +2283 5.24382 4.96874 +2284 5.24203 4.96713 +2285 5.24023 4.96551 +2286 5.23844 4.9639 +2287 5.23665 4.96229 +2288 5.23485 4.96068 +2289 5.23306 4.95907 +2290 5.23127 4.95747 +2291 5.22948 4.95586 +2292 5.22769 4.95425 +2293 5.2259 4.95265 +2294 5.22412 4.95104 +2295 5.22233 4.94944 +2296 5.22054 4.94784 +2297 5.21876 4.94624 +2298 5.21698 4.94464 +2299 5.21519 4.94304 +2300 5.21341 4.94144 +2301 5.21163 4.93984 +2302 5.20985 4.93824 +2303 5.20807 4.93664 +2304 5.20629 4.93505 +2305 5.20452 4.93345 +2306 5.20274 4.93186 +2307 5.20096 4.93027 +2308 5.19919 4.92867 +2309 5.19741 4.92708 +2310 5.19564 4.92549 +2311 5.19387 4.9239 +2312 5.1921 4.92231 +2313 5.19033 4.92072 +2314 5.18856 4.91914 +2315 5.18679 4.91755 +2316 5.18502 4.91596 +2317 5.18325 4.91438 +2318 5.18149 4.9128 +2319 5.17972 4.91121 +2320 5.17796 4.90963 +2321 5.1762 4.90805 +2322 5.17443 4.90647 +2323 5.17267 4.90489 +2324 5.17091 4.90331 +2325 5.16915 4.90173 +2326 5.16739 4.90015 +2327 5.16563 4.89858 +2328 5.16388 4.897 +2329 5.16212 4.89542 +2330 5.16036 4.89385 +2331 5.15861 4.89228 +2332 5.15686 4.8907 +2333 5.1551 4.88913 +2334 5.15335 4.88756 +2335 5.1516 4.88599 +2336 5.14985 4.88442 +2337 5.1481 4.88285 +2338 5.14635 4.88128 +2339 5.1446 4.87972 +2340 5.14286 4.87815 +2341 5.14111 4.87658 +2342 5.13937 4.87502 +2343 5.13762 4.87345 +2344 5.13588 4.87189 +2345 5.13414 4.87033 +2346 5.1324 4.86877 +2347 5.13066 4.86721 +2348 5.12892 4.86565 +2349 5.12718 4.86409 +2350 5.12544 4.86253 +2351 5.1237 4.86097 +2352 5.12197 4.85941 +2353 5.12023 4.85786 +2354 5.1185 4.8563 +2355 5.11676 4.85475 +2356 5.11503 4.85319 +2357 5.1133 4.85164 +2358 5.11157 4.85009 +2359 5.10984 4.84853 +2360 5.10811 4.84698 +2361 5.10638 4.84543 +2362 5.10466 4.84388 +2363 5.10293 4.84233 +2364 5.1012 4.84079 +2365 5.09948 4.83924 +2366 5.09776 4.83769 +2367 5.09603 4.83615 +2368 5.09431 4.8346 +2369 5.09259 4.83306 +2370 5.09087 4.83151 +2371 5.08915 4.82997 +2372 5.08743 4.82843 +2373 5.08572 4.82689 +2374 5.084 4.82535 +2375 5.08228 4.82381 +2376 5.08057 4.82227 +2377 5.07885 4.82073 +2378 5.07714 4.81919 +2379 5.07543 4.81765 +2380 5.07372 4.81612 +2381 5.07201 4.81458 +2382 5.0703 4.81305 +2383 5.06859 4.81151 +2384 5.06688 4.80998 +2385 5.06518 4.80845 +2386 5.06347 4.80691 +2387 5.06176 4.80538 +2388 5.06006 4.80385 +2389 5.05836 4.80232 +2390 5.05665 4.80079 +2391 5.05495 4.79927 +2392 5.05325 4.79774 +2393 5.05155 4.79621 +2394 5.04985 4.79468 +2395 5.04816 4.79316 +2396 5.04646 4.79163 +2397 5.04476 4.79011 +2398 5.04307 4.78859 +2399 5.04137 4.78706 +2400 5.03968 4.78554 +2401 5.03799 4.78402 +2402 5.0363 4.7825 +2403 5.0346 4.78098 +2404 5.03292 4.77946 +2405 5.03123 4.77794 +2406 5.02954 4.77642 +2407 5.02785 4.7749 +2408 5.02616 4.77339 +2409 5.02448 4.77187 +2410 5.02279 4.77036 +2411 5.02111 4.76884 +2412 5.01943 4.76733 +2413 5.01775 4.76581 +2414 5.01606 4.7643 +2415 5.01438 4.76279 +2416 5.01271 4.76128 +2417 5.01103 4.75977 +2418 5.00935 4.75826 +2419 5.00767 4.75675 +2420 5.006 4.75524 +2421 5.00432 4.75373 +2422 5.00265 4.75223 +2423 5.00097 4.75072 +2424 4.9993 4.74921 +2425 4.99763 4.74771 +2426 4.99596 4.7462 +2427 4.99429 4.7447 +2428 4.99262 4.7432 +2429 4.99095 4.74169 +2430 4.98929 4.74019 +2431 4.98762 4.73869 +2432 4.98596 4.73719 +2433 4.98429 4.73569 +2434 4.98263 4.73419 +2435 4.98097 4.73269 +2436 4.9793 4.7312 +2437 4.97764 4.7297 +2438 4.97598 4.7282 +2439 4.97432 4.72671 +2440 4.97267 4.72521 +2441 4.97101 4.72372 +2442 4.96935 4.72222 +2443 4.9677 4.72073 +2444 4.96604 4.71924 +2445 4.96439 4.71775 +2446 4.96273 4.71626 +2447 4.96108 4.71477 +2448 4.95943 4.71328 +2449 4.95778 4.71179 +2450 4.95613 4.7103 +2451 4.95448 4.70881 +2452 4.95283 4.70732 +2453 4.95119 4.70584 +2454 4.94954 4.70435 +2455 4.94789 4.70287 +2456 4.94625 4.70138 +2457 4.94461 4.6999 +2458 4.94296 4.69842 +2459 4.94132 4.69693 +2460 4.93968 4.69545 +2461 4.93804 4.69397 +2462 4.9364 4.69249 +2463 4.93476 4.69101 +2464 4.93312 4.68953 +2465 4.93149 4.68805 +2466 4.92985 4.68658 +2467 4.92822 4.6851 +2468 4.92658 4.68362 +2469 4.92495 4.68215 +2470 4.92332 4.68067 +2471 4.92168 4.6792 +2472 4.92005 4.67772 +2473 4.91842 4.67625 +2474 4.91679 4.67478 +2475 4.91517 4.67331 +2476 4.91354 4.67184 +2477 4.91191 4.67037 +2478 4.91029 4.6689 +2479 4.90866 4.66743 +2480 4.90704 4.66596 +2481 4.90541 4.66449 +2482 4.90379 4.66302 +2483 4.90217 4.66156 +2484 4.90055 4.66009 +2485 4.89893 4.65863 +2486 4.89731 4.65716 +2487 4.89569 4.6557 +2488 4.89407 4.65424 +2489 4.89246 4.65277 +2490 4.89084 4.65131 +2491 4.88922 4.64985 +2492 4.88761 4.64839 +2493 4.886 4.64693 +2494 4.88438 4.64547 +2495 4.88277 4.64401 +2496 4.88116 4.64255 +2497 4.87955 4.6411 +2498 4.87794 4.63964 +2499 4.87633 4.63818 +2500 4.87473 4.63673 +2501 4.87312 4.63528 +2502 4.87151 4.63382 +2503 4.86991 4.63237 +2504 4.86831 4.63092 +2505 4.8667 4.62946 +2506 4.8651 4.62801 +2507 4.8635 4.62656 +2508 4.8619 4.62511 +2509 4.8603 4.62366 +2510 4.8587 4.62221 +2511 4.8571 4.62077 +2512 4.8555 4.61932 +2513 4.8539 4.61787 +2514 4.85231 4.61643 +2515 4.85071 4.61498 +2516 4.84912 4.61353 +2517 4.84752 4.61209 +2518 4.84593 4.61065 +2519 4.84434 4.6092 +2520 4.84275 4.60776 +2521 4.84116 4.60632 +2522 4.83957 4.60488 +2523 4.83798 4.60344 +2524 4.83639 4.602 +2525 4.8348 4.60056 +2526 4.83322 4.59912 +2527 4.83163 4.59769 +2528 4.83005 4.59625 +2529 4.82846 4.59481 +2530 4.82688 4.59338 +2531 4.8253 4.59194 +2532 4.82372 4.59051 +2533 4.82214 4.58907 +2534 4.82056 4.58764 +2535 4.81898 4.58621 +2536 4.8174 4.58478 +2537 4.81582 4.58334 +2538 4.81425 4.58191 +2539 4.81267 4.58048 +2540 4.81109 4.57905 +2541 4.80952 4.57763 +2542 4.80795 4.5762 +2543 4.80637 4.57477 +2544 4.8048 4.57334 +2545 4.80323 4.57192 +2546 4.80166 4.57049 +2547 4.80009 4.56907 +2548 4.79852 4.56764 +2549 4.79696 4.56622 +2550 4.79539 4.5648 +2551 4.79382 4.56337 +2552 4.79226 4.56195 +2553 4.79069 4.56053 +2554 4.78913 4.55911 +2555 4.78756 4.55769 +2556 4.786 4.55627 +2557 4.78444 4.55485 +2558 4.78288 4.55344 +2559 4.78132 4.55202 +2560 4.77976 4.5506 +2561 4.7782 4.54919 +2562 4.77664 4.54777 +2563 4.77509 4.54636 +2564 4.77353 4.54494 +2565 4.77198 4.54353 +2566 4.77042 4.54212 +2567 4.76887 4.54071 +2568 4.76732 4.53929 +2569 4.76576 4.53788 +2570 4.76421 4.53647 +2571 4.76266 4.53506 +2572 4.76111 4.53366 +2573 4.75956 4.53225 +2574 4.75801 4.53084 +2575 4.75647 4.52943 +2576 4.75492 4.52803 +2577 4.75337 4.52662 +2578 4.75183 4.52522 +2579 4.75028 4.52381 +2580 4.74874 4.52241 +2581 4.7472 4.521 +2582 4.74566 4.5196 +2583 4.74412 4.5182 +2584 4.74257 4.5168 +2585 4.74104 4.5154 +2586 4.7395 4.514 +2587 4.73796 4.5126 +2588 4.73642 4.5112 +2589 4.73488 4.5098 +2590 4.73335 4.5084 +2591 4.73181 4.50701 +2592 4.73028 4.50561 +2593 4.72875 4.50422 +2594 4.72721 4.50282 +2595 4.72568 4.50143 +2596 4.72415 4.50003 +2597 4.72262 4.49864 +2598 4.72109 4.49725 +2599 4.71956 4.49586 +2600 4.71803 4.49446 +2601 4.7165 4.49307 +2602 4.71498 4.49168 +2603 4.71345 4.49029 +2604 4.71193 4.48891 +2605 4.7104 4.48752 +2606 4.70888 4.48613 +2607 4.70736 4.48474 +2608 4.70583 4.48336 +2609 4.70431 4.48197 +2610 4.70279 4.48059 +2611 4.70127 4.4792 +2612 4.69975 4.47782 +2613 4.69823 4.47644 +2614 4.69672 4.47505 +2615 4.6952 4.47367 +2616 4.69368 4.47229 +2617 4.69217 4.47091 +2618 4.69065 4.46953 +2619 4.68914 4.46815 +2620 4.68763 4.46677 +2621 4.68611 4.46539 +2622 4.6846 4.46402 +2623 4.68309 4.46264 +2624 4.68158 4.46126 +2625 4.68007 4.45989 +2626 4.67856 4.45851 +2627 4.67705 4.45714 +2628 4.67555 4.45576 +2629 4.67404 4.45439 +2630 4.67254 4.45302 +2631 4.67103 4.45165 +2632 4.66953 4.45027 +2633 4.66802 4.4489 +2634 4.66652 4.44753 +2635 4.66502 4.44616 +2636 4.66352 4.4448 +2637 4.66202 4.44343 +2638 4.66052 4.44206 +2639 4.65902 4.44069 +2640 4.65752 4.43933 +2641 4.65602 4.43796 +2642 4.65453 4.43659 +2643 4.65303 4.43523 +2644 4.65153 4.43387 +2645 4.65004 4.4325 +2646 4.64855 4.43114 +2647 4.64705 4.42978 +2648 4.64556 4.42842 +2649 4.64407 4.42706 +2650 4.64258 4.4257 +2651 4.64109 4.42434 +2652 4.6396 4.42298 +2653 4.63811 4.42162 +2654 4.63662 4.42026 +2655 4.63513 4.4189 +2656 4.63365 4.41755 +2657 4.63216 4.41619 +2658 4.63068 4.41484 +2659 4.62919 4.41348 +2660 4.62771 4.41213 +2661 4.62622 4.41077 +2662 4.62474 4.40942 +2663 4.62326 4.40807 +2664 4.62178 4.40672 +2665 4.6203 4.40536 +2666 4.61882 4.40401 +2667 4.61734 4.40266 +2668 4.61586 4.40132 +2669 4.61439 4.39997 +2670 4.61291 4.39862 +2671 4.61143 4.39727 +2672 4.60996 4.39592 +2673 4.60848 4.39458 +2674 4.60701 4.39323 +2675 4.60554 4.39189 +2676 4.60407 4.39054 +2677 4.60259 4.3892 +2678 4.60112 4.38786 +2679 4.59965 4.38651 +2680 4.59818 4.38517 +2681 4.59672 4.38383 +2682 4.59525 4.38249 +2683 4.59378 4.38115 +2684 4.59231 4.37981 +2685 4.59085 4.37847 +2686 4.58938 4.37713 +2687 4.58792 4.37579 +2688 4.58646 4.37446 +2689 4.58499 4.37312 +2690 4.58353 4.37178 +2691 4.58207 4.37045 +2692 4.58061 4.36911 +2693 4.57915 4.36778 +2694 4.57769 4.36645 +2695 4.57623 4.36511 +2696 4.57477 4.36378 +2697 4.57331 4.36245 +2698 4.57186 4.36112 +2699 4.5704 4.35979 +2700 4.56895 4.35846 +2701 4.56749 4.35713 +2702 4.56604 4.3558 +2703 4.56458 4.35447 +2704 4.56313 4.35314 +2705 4.56168 4.35181 +2706 4.56023 4.35049 +2707 4.55878 4.34916 +2708 4.55733 4.34784 +2709 4.55588 4.34651 +2710 4.55443 4.34519 +2711 4.55298 4.34387 +2712 4.55154 4.34254 +2713 4.55009 4.34122 +2714 4.54865 4.3399 +2715 4.5472 4.33858 +2716 4.54576 4.33726 +2717 4.54431 4.33594 +2718 4.54287 4.33462 +2719 4.54143 4.3333 +2720 4.53999 4.33198 +2721 4.53855 4.33066 +2722 4.53711 4.32935 +2723 4.53567 4.32803 +2724 4.53423 4.32671 +2725 4.53279 4.3254 +2726 4.53135 4.32408 +2727 4.52992 4.32277 +2728 4.52848 4.32146 +2729 4.52704 4.32014 +2730 4.52561 4.31883 +2731 4.52418 4.31752 +2732 4.52274 4.31621 +2733 4.52131 4.3149 +2734 4.51988 4.31359 +2735 4.51845 4.31228 +2736 4.51702 4.31097 +2737 4.51559 4.30966 +2738 4.51416 4.30836 +2739 4.51273 4.30705 +2740 4.5113 4.30574 +2741 4.50987 4.30444 +2742 4.50845 4.30313 +2743 4.50702 4.30183 +2744 4.5056 4.30052 +2745 4.50417 4.29922 +2746 4.50275 4.29792 +2747 4.50133 4.29661 +2748 4.4999 4.29531 +2749 4.49848 4.29401 +2750 4.49706 4.29271 +2751 4.49564 4.29141 +2752 4.49422 4.29011 +2753 4.4928 4.28881 +2754 4.49138 4.28751 +2755 4.48997 4.28622 +2756 4.48855 4.28492 +2757 4.48713 4.28362 +2758 4.48572 4.28233 +2759 4.4843 4.28103 +2760 4.48289 4.27974 +2761 4.48147 4.27844 +2762 4.48006 4.27715 +2763 4.47865 4.27586 +2764 4.47724 4.27457 +2765 4.47582 4.27327 +2766 4.47441 4.27198 +2767 4.473 4.27069 +2768 4.47159 4.2694 +2769 4.47019 4.26811 +2770 4.46878 4.26682 +2771 4.46737 4.26553 +2772 4.46596 4.26425 +2773 4.46456 4.26296 +2774 4.46315 4.26167 +2775 4.46175 4.26039 +2776 4.46034 4.2591 +2777 4.45894 4.25782 +2778 4.45754 4.25653 +2779 4.45614 4.25525 +2780 4.45474 4.25397 +2781 4.45333 4.25268 +2782 4.45193 4.2514 +2783 4.45054 4.25012 +2784 4.44914 4.24884 +2785 4.44774 4.24756 +2786 4.44634 4.24628 +2787 4.44494 4.245 +2788 4.44355 4.24372 +2789 4.44215 4.24244 +2790 4.44076 4.24117 +2791 4.43936 4.23989 +2792 4.43797 4.23861 +2793 4.43658 4.23734 +2794 4.43519 4.23606 +2795 4.43379 4.23479 +2796 4.4324 4.23352 +2797 4.43101 4.23224 +2798 4.42962 4.23097 +2799 4.42823 4.2297 +2800 4.42685 4.22843 +2801 4.42546 4.22715 +2802 4.42407 4.22588 +2803 4.42268 4.22461 +2804 4.4213 4.22334 +2805 4.41991 4.22208 +2806 4.41853 4.22081 +2807 4.41714 4.21954 +2808 4.41576 4.21827 +2809 4.41438 4.21701 +2810 4.413 4.21574 +2811 4.41161 4.21448 +2812 4.41023 4.21321 +2813 4.40885 4.21195 +2814 4.40747 4.21068 +2815 4.40609 4.20942 +2816 4.40472 4.20816 +2817 4.40334 4.20689 +2818 4.40196 4.20563 +2819 4.40059 4.20437 +2820 4.39921 4.20311 +2821 4.39783 4.20185 +2822 4.39646 4.20059 +2823 4.39509 4.19934 +2824 4.39371 4.19808 +2825 4.39234 4.19682 +2826 4.39097 4.19556 +2827 4.3896 4.19431 +2828 4.38823 4.19305 +2829 4.38686 4.1918 +2830 4.38549 4.19054 +2831 4.38412 4.18929 +2832 4.38275 4.18803 +2833 4.38138 4.18678 +2834 4.38001 4.18553 +2835 4.37865 4.18428 +2836 4.37728 4.18303 +2837 4.37592 4.18177 +2838 4.37455 4.18052 +2839 4.37319 4.17927 +2840 4.37182 4.17803 +2841 4.37046 4.17678 +2842 4.3691 4.17553 +2843 4.36774 4.17428 +2844 4.36638 4.17304 +2845 4.36502 4.17179 +2846 4.36366 4.17054 +2847 4.3623 4.1693 +2848 4.36094 4.16805 +2849 4.35958 4.16681 +2850 4.35822 4.16557 +2851 4.35687 4.16432 +2852 4.35551 4.16308 +2853 4.35416 4.16184 +2854 4.3528 4.1606 +2855 4.35145 4.15936 +2856 4.35009 4.15812 +2857 4.34874 4.15688 +2858 4.34739 4.15564 +2859 4.34604 4.1544 +2860 4.34469 4.15316 +2861 4.34334 4.15193 +2862 4.34199 4.15069 +2863 4.34064 4.14945 +2864 4.33929 4.14822 +2865 4.33794 4.14698 +2866 4.33659 4.14575 +2867 4.33524 4.14451 +2868 4.3339 4.14328 +2869 4.33255 4.14205 +2870 4.33121 4.14081 +2871 4.32986 4.13958 +2872 4.32852 4.13835 +2873 4.32717 4.13712 +2874 4.32583 4.13589 +2875 4.32449 4.13466 +2876 4.32315 4.13343 +2877 4.32181 4.1322 +2878 4.32047 4.13098 +2879 4.31913 4.12975 +2880 4.31779 4.12852 +2881 4.31645 4.1273 +2882 4.31511 4.12607 +2883 4.31377 4.12484 +2884 4.31244 4.12362 +2885 4.3111 4.1224 +2886 4.30976 4.12117 +2887 4.30843 4.11995 +2888 4.30709 4.11873 +2889 4.30576 4.11751 +2890 4.30443 4.11628 +2891 4.30309 4.11506 +2892 4.30176 4.11384 +2893 4.30043 4.11262 +2894 4.2991 4.1114 +2895 4.29777 4.11019 +2896 4.29644 4.10897 +2897 4.29511 4.10775 +2898 4.29378 4.10653 +2899 4.29245 4.10532 +2900 4.29113 4.1041 +2901 4.2898 4.10289 +2902 4.28847 4.10167 +2903 4.28715 4.10046 +2904 4.28582 4.09924 +2905 4.2845 4.09803 +2906 4.28317 4.09682 +2907 4.28185 4.0956 +2908 4.28053 4.09439 +2909 4.2792 4.09318 +2910 4.27788 4.09197 +2911 4.27656 4.09076 +2912 4.27524 4.08955 +2913 4.27392 4.08834 +2914 4.2726 4.08714 +2915 4.27128 4.08593 +2916 4.26996 4.08472 +2917 4.26865 4.08351 +2918 4.26733 4.08231 +2919 4.26601 4.0811 +2920 4.2647 4.0799 +2921 4.26338 4.07869 +2922 4.26207 4.07749 +2923 4.26075 4.07628 +2924 4.25944 4.07508 +2925 4.25812 4.07388 +2926 4.25681 4.07268 +2927 4.2555 4.07148 +2928 4.25419 4.07028 +2929 4.25288 4.06908 +2930 4.25157 4.06788 +2931 4.25026 4.06668 +2932 4.24895 4.06548 +2933 4.24764 4.06428 +2934 4.24633 4.06308 +2935 4.24502 4.06189 +2936 4.24372 4.06069 +2937 4.24241 4.05949 +2938 4.2411 4.0583 +2939 4.2398 4.0571 +2940 4.23849 4.05591 +2941 4.23719 4.05472 +2942 4.23589 4.05352 +2943 4.23458 4.05233 +2944 4.23328 4.05114 +2945 4.23198 4.04995 +2946 4.23068 4.04875 +2947 4.22938 4.04756 +2948 4.22808 4.04637 +2949 4.22678 4.04518 +2950 4.22548 4.04399 +2951 4.22418 4.04281 +2952 4.22288 4.04162 +2953 4.22158 4.04043 +2954 4.22029 4.03924 +2955 4.21899 4.03806 +2956 4.21769 4.03687 +2957 4.2164 4.03569 +2958 4.2151 4.0345 +2959 4.21381 4.03332 +2960 4.21252 4.03213 +2961 4.21122 4.03095 +2962 4.20993 4.02977 +2963 4.20864 4.02859 +2964 4.20735 4.0274 +2965 4.20605 4.02622 +2966 4.20476 4.02504 +2967 4.20347 4.02386 +2968 4.20218 4.02268 +2969 4.2009 4.0215 +2970 4.19961 4.02033 +2971 4.19832 4.01915 +2972 4.19703 4.01797 +2973 4.19575 4.01679 +2974 4.19446 4.01562 +2975 4.19317 4.01444 +2976 4.19189 4.01327 +2977 4.1906 4.01209 +2978 4.18932 4.01092 +2979 4.18804 4.00974 +2980 4.18675 4.00857 +2981 4.18547 4.0074 +2982 4.18419 4.00623 +2983 4.18291 4.00505 +2984 4.18163 4.00388 +2985 4.18035 4.00271 +2986 4.17907 4.00154 +2987 4.17779 4.00037 +2988 4.17651 3.9992 +2989 4.17523 3.99804 +2990 4.17395 3.99687 +2991 4.17268 3.9957 +2992 4.1714 3.99453 +2993 4.17012 3.99337 +2994 4.16885 3.9922 +2995 4.16757 3.99104 +2996 4.1663 3.98987 +2997 4.16503 3.98871 +2998 4.16375 3.98754 +2999 4.16248 3.98638 +3000 4.16121 3.98522 +3001 4.15994 3.98406 +3002 4.15866 3.98289 +3003 4.15739 3.98173 +3004 4.15612 3.98057 +3005 4.15485 3.97941 +3006 4.15358 3.97825 +3007 4.15232 3.97709 +3008 4.15105 3.97593 +3009 4.14978 3.97478 +3010 4.14851 3.97362 +3011 4.14725 3.97246 +3012 4.14598 3.97131 +3013 4.14471 3.97015 +3014 4.14345 3.96899 +3015 4.14218 3.96784 +3016 4.14092 3.96668 +3017 4.13966 3.96553 +3018 4.13839 3.96438 +3019 4.13713 3.96322 +3020 4.13587 3.96207 +3021 4.13461 3.96092 +3022 4.13335 3.95977 +3023 4.13209 3.95862 +3024 4.13083 3.95747 +3025 4.12957 3.95632 +3026 4.12831 3.95517 +3027 4.12705 3.95402 +3028 4.12579 3.95287 +3029 4.12453 3.95172 +3030 4.12328 3.95058 +3031 4.12202 3.94943 +3032 4.12077 3.94828 +3033 4.11951 3.94714 +3034 4.11826 3.94599 +3035 4.117 3.94485 +3036 4.11575 3.9437 +3037 4.11449 3.94256 +3038 4.11324 3.94142 +3039 4.11199 3.94027 +3040 4.11074 3.93913 +3041 4.10949 3.93799 +3042 4.10824 3.93685 +3043 4.10698 3.93571 +3044 4.10574 3.93457 +3045 4.10449 3.93343 +3046 4.10324 3.93229 +3047 4.10199 3.93115 +3048 4.10074 3.93001 +3049 4.09949 3.92887 +3050 4.09825 3.92774 +3051 4.097 3.9266 +3052 4.09575 3.92546 +3053 4.09451 3.92433 +3054 4.09326 3.92319 +3055 4.09202 3.92206 +3056 4.09078 3.92092 +3057 4.08953 3.91979 +3058 4.08829 3.91866 +3059 4.08705 3.91753 +3060 4.08581 3.91639 +3061 4.08456 3.91526 +3062 4.08332 3.91413 +3063 4.08208 3.913 +3064 4.08084 3.91187 +3065 4.0796 3.91074 +3066 4.07836 3.90961 +3067 4.07713 3.90848 +3068 4.07589 3.90736 +3069 4.07465 3.90623 +3070 4.07341 3.9051 +3071 4.07218 3.90397 +3072 4.07094 3.90285 +3073 4.06971 3.90172 +3074 4.06847 3.9006 +3075 4.06724 3.89947 +3076 4.066 3.89835 +3077 4.06477 3.89723 +3078 4.06354 3.8961 +3079 4.0623 3.89498 +3080 4.06107 3.89386 +3081 4.05984 3.89274 +3082 4.05861 3.89162 +3083 4.05738 3.89049 +3084 4.05615 3.88937 +3085 4.05492 3.88826 +3086 4.05369 3.88714 +3087 4.05246 3.88602 +3088 4.05123 3.8849 +3089 4.05 3.88378 +3090 4.04878 3.88266 +3091 4.04755 3.88155 +3092 4.04632 3.88043 +3093 4.0451 3.87932 +3094 4.04387 3.8782 +3095 4.04265 3.87709 +3096 4.04142 3.87597 +3097 4.0402 3.87486 +3098 4.03897 3.87375 +3099 4.03775 3.87263 +3100 4.03653 3.87152 +3101 4.03531 3.87041 +3102 4.03408 3.8693 +3103 4.03286 3.86819 +3104 4.03164 3.86708 +3105 4.03042 3.86597 +3106 4.0292 3.86486 +3107 4.02798 3.86375 +3108 4.02676 3.86264 +3109 4.02554 3.86153 +3110 4.02433 3.86043 +3111 4.02311 3.85932 +3112 4.02189 3.85821 +3113 4.02068 3.85711 +3114 4.01946 3.856 +3115 4.01824 3.8549 +3116 4.01703 3.85379 +3117 4.01581 3.85269 +3118 4.0146 3.85159 +3119 4.01339 3.85048 +3120 4.01217 3.84938 +3121 4.01096 3.84828 +3122 4.00975 3.84718 +3123 4.00853 3.84608 +3124 4.00732 3.84498 +3125 4.00611 3.84388 +3126 4.0049 3.84278 +3127 4.00369 3.84168 +3128 4.00248 3.84058 +3129 4.00127 3.83948 +3130 4.00006 3.83839 +3131 3.99886 3.83729 +3132 3.99765 3.83619 +3133 3.99644 3.8351 +3134 3.99523 3.834 +3135 3.99403 3.83291 +3136 3.99282 3.83181 +3137 3.99161 3.83072 +3138 3.99041 3.82962 +3139 3.9892 3.82853 +3140 3.988 3.82744 +3141 3.9868 3.82635 +3142 3.98559 3.82526 +3143 3.98439 3.82416 +3144 3.98319 3.82307 +3145 3.98199 3.82198 +3146 3.98078 3.82089 +3147 3.97958 3.81981 +3148 3.97838 3.81872 +3149 3.97718 3.81763 +3150 3.97598 3.81654 +3151 3.97478 3.81545 +3152 3.97358 3.81437 +3153 3.97239 3.81328 +3154 3.97119 3.81219 +3155 3.96999 3.81111 +3156 3.96879 3.81002 +3157 3.9676 3.80894 +3158 3.9664 3.80786 +3159 3.9652 3.80677 +3160 3.96401 3.80569 +3161 3.96281 3.80461 +3162 3.96162 3.80353 +3163 3.96042 3.80244 +3164 3.95923 3.80136 +3165 3.95804 3.80028 +3166 3.95684 3.7992 +3167 3.95565 3.79812 +3168 3.95446 3.79704 +3169 3.95327 3.79597 +3170 3.95208 3.79489 +3171 3.95089 3.79381 +3172 3.9497 3.79273 +3173 3.94851 3.79166 +3174 3.94732 3.79058 +3175 3.94613 3.7895 +3176 3.94494 3.78843 +3177 3.94375 3.78735 +3178 3.94257 3.78628 +3179 3.94138 3.78521 +3180 3.94019 3.78413 +3181 3.939 3.78306 +3182 3.93782 3.78199 +3183 3.93663 3.78091 +3184 3.93545 3.77984 +3185 3.93426 3.77877 +3186 3.93308 3.7777 +3187 3.9319 3.77663 +3188 3.93071 3.77556 +3189 3.92953 3.77449 +3190 3.92835 3.77342 +3191 3.92717 3.77236 +3192 3.92598 3.77129 +3193 3.9248 3.77022 +3194 3.92362 3.76915 +3195 3.92244 3.76809 +3196 3.92126 3.76702 +3197 3.92008 3.76596 +3198 3.9189 3.76489 +3199 3.91772 3.76383 +3200 3.91655 3.76276 +3201 3.91537 3.7617 +3202 3.91419 3.76064 +3203 3.91301 3.75957 +3204 3.91184 3.75851 +3205 3.91066 3.75745 +3206 3.90948 3.75639 +3207 3.90831 3.75533 +3208 3.90713 3.75427 +3209 3.90596 3.75321 +3210 3.90479 3.75215 +3211 3.90361 3.75109 +3212 3.90244 3.75003 +3213 3.90127 3.74898 +3214 3.90009 3.74792 +3215 3.89892 3.74686 +3216 3.89775 3.7458 +3217 3.89658 3.74475 +3218 3.89541 3.74369 +3219 3.89424 3.74264 +3220 3.89307 3.74158 +3221 3.8919 3.74053 +3222 3.89073 3.73948 +3223 3.88956 3.73842 +3224 3.88839 3.73737 +3225 3.88722 3.73632 +3226 3.88605 3.73527 +3227 3.88489 3.73421 +3228 3.88372 3.73316 +3229 3.88255 3.73211 +3230 3.88139 3.73106 +3231 3.88022 3.73001 +3232 3.87906 3.72896 +3233 3.87789 3.72792 +3234 3.87673 3.72687 +3235 3.87556 3.72582 +3236 3.8744 3.72477 +3237 3.87324 3.72373 +3238 3.87208 3.72268 +3239 3.87091 3.72163 +3240 3.86975 3.72059 +3241 3.86859 3.71954 +3242 3.86743 3.7185 +3243 3.86627 3.71746 +3244 3.86511 3.71641 +3245 3.86395 3.71537 +3246 3.86279 3.71433 +3247 3.86163 3.71328 +3248 3.86047 3.71224 +3249 3.85931 3.7112 +3250 3.85815 3.71016 +3251 3.85699 3.70912 +3252 3.85584 3.70808 +3253 3.85468 3.70704 +3254 3.85352 3.706 +3255 3.85237 3.70496 +3256 3.85121 3.70393 +3257 3.85006 3.70289 +3258 3.8489 3.70185 +3259 3.84775 3.70081 +3260 3.84659 3.69978 +3261 3.84544 3.69874 +3262 3.84429 3.69771 +3263 3.84313 3.69667 +3264 3.84198 3.69564 +3265 3.84083 3.6946 +3266 3.83968 3.69357 +3267 3.83853 3.69254 +3268 3.83737 3.69151 +3269 3.83622 3.69047 +3270 3.83507 3.68944 +3271 3.83392 3.68841 +3272 3.83277 3.68738 +3273 3.83163 3.68635 +3274 3.83048 3.68532 +3275 3.82933 3.68429 +3276 3.82818 3.68326 +3277 3.82703 3.68223 +3278 3.82589 3.68121 +3279 3.82474 3.68018 +3280 3.82359 3.67915 +3281 3.82245 3.67812 +3282 3.8213 3.6771 +3283 3.82015 3.67607 +3284 3.81901 3.67505 +3285 3.81786 3.67402 +3286 3.81672 3.673 +3287 3.81558 3.67197 +3288 3.81443 3.67095 +3289 3.81329 3.66993 +3290 3.81215 3.6689 +3291 3.81101 3.66788 +3292 3.80986 3.66686 +3293 3.80872 3.66584 +3294 3.80758 3.66482 +3295 3.80644 3.6638 +3296 3.8053 3.66278 +3297 3.80416 3.66176 +3298 3.80302 3.66074 +3299 3.80188 3.65972 +3300 3.80074 3.6587 +3301 3.7996 3.65769 +3302 3.79846 3.65667 +3303 3.79733 3.65565 +3304 3.79619 3.65464 +3305 3.79505 3.65362 +3306 3.79391 3.6526 +3307 3.79278 3.65159 +3308 3.79164 3.65057 +3309 3.79051 3.64956 +3310 3.78937 3.64855 +3311 3.78824 3.64753 +3312 3.7871 3.64652 +3313 3.78597 3.64551 +3314 3.78483 3.6445 +3315 3.7837 3.64348 +3316 3.78257 3.64247 +3317 3.78143 3.64146 +3318 3.7803 3.64045 +3319 3.77917 3.63944 +3320 3.77804 3.63843 +3321 3.7769 3.63743 +3322 3.77577 3.63642 +3323 3.77464 3.63541 +3324 3.77351 3.6344 +3325 3.77238 3.63339 +3326 3.77125 3.63239 +3327 3.77012 3.63138 +3328 3.76899 3.63038 +3329 3.76787 3.62937 +3330 3.76674 3.62837 +3331 3.76561 3.62736 +3332 3.76448 3.62636 +3333 3.76336 3.62535 +3334 3.76223 3.62435 +3335 3.7611 3.62335 +3336 3.75998 3.62235 +3337 3.75885 3.62134 +3338 3.75772 3.62034 +3339 3.7566 3.61934 +3340 3.75548 3.61834 +3341 3.75435 3.61734 +3342 3.75323 3.61634 +3343 3.7521 3.61534 +3344 3.75098 3.61434 +3345 3.74986 3.61335 +3346 3.74873 3.61235 +3347 3.74761 3.61135 +3348 3.74649 3.61035 +3349 3.74537 3.60936 +3350 3.74425 3.60836 +3351 3.74313 3.60737 +3352 3.74201 3.60637 +3353 3.74089 3.60538 +3354 3.73977 3.60438 +3355 3.73865 3.60339 +3356 3.73753 3.60239 +3357 3.73641 3.6014 +3358 3.73529 3.60041 +3359 3.73417 3.59942 +3360 3.73305 3.59842 +3361 3.73194 3.59743 +3362 3.73082 3.59644 +3363 3.7297 3.59545 +3364 3.72859 3.59446 +3365 3.72747 3.59347 +3366 3.72635 3.59248 +3367 3.72524 3.59149 +3368 3.72412 3.59051 +3369 3.72301 3.58952 +3370 3.72189 3.58853 +3371 3.72078 3.58754 +3372 3.71967 3.58656 +3373 3.71855 3.58557 +3374 3.71744 3.58459 +3375 3.71633 3.5836 +3376 3.71521 3.58262 +3377 3.7141 3.58163 +3378 3.71299 3.58065 +3379 3.71188 3.57966 +3380 3.71077 3.57868 +3381 3.70966 3.5777 +3382 3.70854 3.57672 +3383 3.70743 3.57573 +3384 3.70632 3.57475 +3385 3.70522 3.57377 +3386 3.70411 3.57279 +3387 3.703 3.57181 +3388 3.70189 3.57083 +3389 3.70078 3.56985 +3390 3.69967 3.56887 +3391 3.69856 3.56789 +3392 3.69746 3.56692 +3393 3.69635 3.56594 +3394 3.69524 3.56496 +3395 3.69414 3.56398 +3396 3.69303 3.56301 +3397 3.69193 3.56203 +3398 3.69082 3.56106 +3399 3.68972 3.56008 +3400 3.68861 3.55911 +3401 3.68751 3.55813 +3402 3.6864 3.55716 +3403 3.6853 3.55619 +3404 3.6842 3.55521 +3405 3.68309 3.55424 +3406 3.68199 3.55327 +3407 3.68089 3.5523 +3408 3.67978 3.55133 +3409 3.67868 3.55036 +3410 3.67758 3.54938 +3411 3.67648 3.54841 +3412 3.67538 3.54745 +3413 3.67428 3.54648 +3414 3.67318 3.54551 +3415 3.67208 3.54454 +3416 3.67098 3.54357 +3417 3.66988 3.5426 +3418 3.66878 3.54164 +3419 3.66768 3.54067 +3420 3.66658 3.5397 +3421 3.66549 3.53874 +3422 3.66439 3.53777 +3423 3.66329 3.53681 +3424 3.66219 3.53584 +3425 3.6611 3.53488 +3426 3.66 3.53392 +3427 3.6589 3.53295 +3428 3.65781 3.53199 +3429 3.65671 3.53103 +3430 3.65562 3.53007 +3431 3.65452 3.5291 +3432 3.65343 3.52814 +3433 3.65233 3.52718 +3434 3.65124 3.52622 +3435 3.65014 3.52526 +3436 3.64905 3.5243 +3437 3.64796 3.52334 +3438 3.64686 3.52238 +3439 3.64577 3.52143 +3440 3.64468 3.52047 +3441 3.64359 3.51951 +3442 3.6425 3.51855 +3443 3.6414 3.5176 +3444 3.64031 3.51664 +3445 3.63922 3.51569 +3446 3.63813 3.51473 +3447 3.63704 3.51378 +3448 3.63595 3.51282 +3449 3.63486 3.51187 +3450 3.63377 3.51091 +3451 3.63268 3.50996 +3452 3.6316 3.50901 +3453 3.63051 3.50805 +3454 3.62942 3.5071 +3455 3.62833 3.50615 +3456 3.62724 3.5052 +3457 3.62616 3.50425 +3458 3.62507 3.5033 +3459 3.62398 3.50235 +3460 3.6229 3.5014 +3461 3.62181 3.50045 +3462 3.62072 3.4995 +3463 3.61964 3.49855 +3464 3.61855 3.4976 +3465 3.61747 3.49666 +3466 3.61638 3.49571 +3467 3.6153 3.49476 +3468 3.61422 3.49382 +3469 3.61313 3.49287 +3470 3.61205 3.49193 +3471 3.61096 3.49098 +3472 3.60988 3.49004 +3473 3.6088 3.48909 +3474 3.60772 3.48815 +3475 3.60663 3.4872 +3476 3.60555 3.48626 +3477 3.60447 3.48532 +3478 3.60339 3.48438 +3479 3.60231 3.48343 +3480 3.60123 3.48249 +3481 3.60015 3.48155 +3482 3.59907 3.48061 +3483 3.59799 3.47967 +3484 3.59691 3.47873 +3485 3.59583 3.47779 +3486 3.59475 3.47685 +3487 3.59367 3.47591 +3488 3.59259 3.47498 +3489 3.59152 3.47404 +3490 3.59044 3.4731 +3491 3.58936 3.47216 +3492 3.58828 3.47123 +3493 3.58721 3.47029 +3494 3.58613 3.46936 +3495 3.58505 3.46842 +3496 3.58398 3.46749 +3497 3.5829 3.46655 +3498 3.58182 3.46562 +3499 3.58075 3.46468 +3500 3.57967 3.46375 +3501 3.5786 3.46282 +3502 3.57752 3.46188 +3503 3.57645 3.46095 +3504 3.57538 3.46002 +3505 3.5743 3.45909 +3506 3.57323 3.45816 +3507 3.57216 3.45723 +3508 3.57108 3.4563 +3509 3.57001 3.45537 +3510 3.56894 3.45444 +3511 3.56787 3.45351 +3512 3.56679 3.45258 +3513 3.56572 3.45165 +3514 3.56465 3.45073 +3515 3.56358 3.4498 +3516 3.56251 3.44887 +3517 3.56144 3.44794 +3518 3.56037 3.44702 +3519 3.5593 3.44609 +3520 3.55823 3.44517 +3521 3.55716 3.44424 +3522 3.55609 3.44332 +3523 3.55502 3.44239 +3524 3.55395 3.44147 +3525 3.55288 3.44055 +3526 3.55182 3.43962 +3527 3.55075 3.4387 +3528 3.54968 3.43778 +3529 3.54861 3.43686 +3530 3.54755 3.43594 +3531 3.54648 3.43502 +3532 3.54541 3.43409 +3533 3.54435 3.43317 +3534 3.54328 3.43225 +3535 3.54221 3.43134 +3536 3.54115 3.43042 +3537 3.54008 3.4295 +3538 3.53902 3.42858 +3539 3.53795 3.42766 +3540 3.53689 3.42674 +3541 3.53582 3.42583 +3542 3.53476 3.42491 +3543 3.5337 3.42399 +3544 3.53263 3.42308 +3545 3.53157 3.42216 +3546 3.53051 3.42125 +3547 3.52944 3.42033 +3548 3.52838 3.41942 +3549 3.52732 3.41851 +3550 3.52626 3.41759 +3551 3.52519 3.41668 +3552 3.52413 3.41577 +3553 3.52307 3.41485 +3554 3.52201 3.41394 +3555 3.52095 3.41303 +3556 3.51989 3.41212 +3557 3.51883 3.41121 +3558 3.51777 3.4103 +3559 3.51671 3.40939 +3560 3.51565 3.40848 +3561 3.51459 3.40757 +3562 3.51353 3.40666 +3563 3.51247 3.40575 +3564 3.51141 3.40484 +3565 3.51036 3.40394 +3566 3.5093 3.40303 +3567 3.50824 3.40212 +3568 3.50718 3.40122 +3569 3.50612 3.40031 +3570 3.50507 3.3994 +3571 3.50401 3.3985 +3572 3.50295 3.39759 +3573 3.5019 3.39669 +3574 3.50084 3.39578 +3575 3.49979 3.39488 +3576 3.49873 3.39398 +3577 3.49767 3.39307 +3578 3.49662 3.39217 +3579 3.49556 3.39127 +3580 3.49451 3.39037 +3581 3.49346 3.38947 +3582 3.4924 3.38857 +3583 3.49135 3.38766 +3584 3.49029 3.38676 +3585 3.48924 3.38586 +3586 3.48819 3.38496 +3587 3.48713 3.38407 +3588 3.48608 3.38317 +3589 3.48503 3.38227 +3590 3.48398 3.38137 +3591 3.48292 3.38047 +3592 3.48187 3.37958 +3593 3.48082 3.37868 +3594 3.47977 3.37778 +3595 3.47872 3.37689 +3596 3.47767 3.37599 +3597 3.47662 3.37509 +3598 3.47556 3.3742 +3599 3.47451 3.37331 +3600 3.47346 3.37241 +3601 3.47241 3.37152 +3602 3.47136 3.37062 +3603 3.47032 3.36973 +3604 3.46927 3.36884 +3605 3.46822 3.36795 +3606 3.46717 3.36705 +3607 3.46612 3.36616 +3608 3.46507 3.36527 +3609 3.46402 3.36438 +3610 3.46298 3.36349 +3611 3.46193 3.3626 +3612 3.46088 3.36171 +3613 3.45983 3.36082 +3614 3.45879 3.35993 +3615 3.45774 3.35904 +3616 3.45669 3.35816 +3617 3.45565 3.35727 +3618 3.4546 3.35638 +3619 3.45356 3.35549 +3620 3.45251 3.35461 +3621 3.45146 3.35372 +3622 3.45042 3.35283 +3623 3.44937 3.35195 +3624 3.44833 3.35106 +3625 3.44729 3.35018 +3626 3.44624 3.3493 +3627 3.4452 3.34841 +3628 3.44415 3.34753 +3629 3.44311 3.34664 +3630 3.44207 3.34576 +3631 3.44102 3.34488 +3632 3.43998 3.344 +3633 3.43894 3.34312 +3634 3.43789 3.34223 +3635 3.43685 3.34135 +3636 3.43581 3.34047 +3637 3.43477 3.33959 +3638 3.43373 3.33871 +3639 3.43268 3.33783 +3640 3.43164 3.33695 +3641 3.4306 3.33607 +3642 3.42956 3.3352 +3643 3.42852 3.33432 +3644 3.42748 3.33344 +3645 3.42644 3.33256 +3646 3.4254 3.33169 +3647 3.42436 3.33081 +3648 3.42332 3.32993 +3649 3.42228 3.32906 +3650 3.42124 3.32818 +3651 3.4202 3.32731 +3652 3.41916 3.32643 +3653 3.41813 3.32556 +3654 3.41709 3.32468 +3655 3.41605 3.32381 +3656 3.41501 3.32294 +3657 3.41397 3.32206 +3658 3.41294 3.32119 +3659 3.4119 3.32032 +3660 3.41086 3.31945 +3661 3.40982 3.31858 +3662 3.40879 3.31771 +3663 3.40775 3.31684 +3664 3.40671 3.31597 +3665 3.40568 3.3151 +3666 3.40464 3.31423 +3667 3.40361 3.31336 +3668 3.40257 3.31249 +3669 3.40154 3.31162 +3670 3.4005 3.31075 +3671 3.39947 3.30988 +3672 3.39843 3.30902 +3673 3.3974 3.30815 +3674 3.39636 3.30728 +3675 3.39533 3.30642 +3676 3.39429 3.30555 +3677 3.39326 3.30469 +3678 3.39223 3.30382 +3679 3.39119 3.30296 +3680 3.39016 3.30209 +3681 3.38913 3.30123 +3682 3.38809 3.30036 +3683 3.38706 3.2995 +3684 3.38603 3.29864 +3685 3.385 3.29777 +3686 3.38396 3.29691 +3687 3.38293 3.29605 +3688 3.3819 3.29519 +3689 3.38087 3.29433 +3690 3.37984 3.29347 +3691 3.37881 3.29261 +3692 3.37778 3.29175 +3693 3.37675 3.29089 +3694 3.37571 3.29003 +3695 3.37468 3.28917 +3696 3.37365 3.28831 +3697 3.37262 3.28745 +3698 3.37159 3.28659 +3699 3.37056 3.28574 +3700 3.36954 3.28488 +3701 3.36851 3.28402 +3702 3.36748 3.28317 +3703 3.36645 3.28231 +3704 3.36542 3.28145 +3705 3.36439 3.2806 +3706 3.36336 3.27974 +3707 3.36233 3.27889 +3708 3.36131 3.27803 +3709 3.36028 3.27718 +3710 3.35925 3.27633 +3711 3.35822 3.27547 +3712 3.3572 3.27462 +3713 3.35617 3.27377 +3714 3.35514 3.27292 +3715 3.35412 3.27206 +3716 3.35309 3.27121 +3717 3.35206 3.27036 +3718 3.35104 3.26951 +3719 3.35001 3.26866 +3720 3.34899 3.26781 +3721 3.34796 3.26696 +3722 3.34693 3.26611 +3723 3.34591 3.26526 +3724 3.34488 3.26441 +3725 3.34386 3.26357 +3726 3.34283 3.26272 +3727 3.34181 3.26187 +3728 3.34079 3.26102 +3729 3.33976 3.26018 +3730 3.33874 3.25933 diff --git a/src/recon_test/input/time.fdef b/src/recon_test/input/time.fdef new file mode 100644 index 0000000000..05c014f9ad --- /dev/null +++ b/src/recon_test/input/time.fdef @@ -0,0 +1,8 @@ +1 30 +1 15 +1 5 +4 10 +4 30 +4 60 +4 120 +9 300 diff --git a/src/recon_test/test.mk b/src/recon_test/test.mk new file mode 100644 index 0000000000..83cd7c6178 --- /dev/null +++ b/src/recon_test/test.mk @@ -0,0 +1,36 @@ +# +# +dir := recon_test + +$(dir)_TEST_SOURCES := test_DataSymmetriesForBins_PET_CartesianGrid.cxx \ + test_PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx + + +# rules that do not link with all registries to save time during linking +# Beware: the pattern below is dangerous as it relies on a naming style for the registries. +# Note: have to be before the include below as that resets $(dir) + +${DEST}$(dir)/test_DataSymmetriesForBins_PET_CartesianGrid: ${DEST}$(dir)/test_DataSymmetriesForBins_PET_CartesianGrid${O_SUFFIX} \ + $(STIR_LIB) $(filter %recon_buildblock_registries${O_SUFFIX},$(STIR_REGISTRIES)) + $(LINK) $(EXE_OUTFLAG)$@ $< \ + $(filter %recon_buildblock_registries${O_SUFFIX},$(STIR_REGISTRIES)) \ + $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +.PHONY: run_$(dir)/test_modelling.sh + +run_$(dir)/test_modelling.sh: \ + $(dir)/test_modelling.sh \ + $(DEST)/iterative/POSMAPOSL/PatlakOSMAPOSL \ + $(DEST)/utilities/get_dynamic_images_from_parametric_images \ + $(DEST)/utilities/mult_model_with_dyn_images \ + $(DEST)/utilities/apply_patlak_to_images \ + $(DEST)/utilities/stir_math \ + $(DEST)/utilities/generate_image \ + $(DEST)/utilities/ifheaders_for_ecat7 \ + $(DEST)/utilities/compare_image \ + $(DEST)/utilities/manip_image \ + $(DEST)/utilities/conv_to_ecat7 \ + $(DEST)/recon_test/fwdtest + DEST=$(DEST) bash $< + +include $(WORKSPACE)/test.mk diff --git a/src/recon_test/test_DataSymmetriesForBins_PET_CartesianGrid.cxx b/src/recon_test/test_DataSymmetriesForBins_PET_CartesianGrid.cxx new file mode 100644 index 0000000000..25206f03c8 --- /dev/null +++ b/src/recon_test/test_DataSymmetriesForBins_PET_CartesianGrid.cxx @@ -0,0 +1,736 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup test + + \brief Test program for stir::DataSymmetriesForBins_PET_CartesianGrid + + Uses stir::ProjMatrixByBinUsingRayTracing. + + \author Kris Thielemans + +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IndexRange3D.h" +#include "stir/ProjData.h" +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Scanner.h" +#include "stir/IndexRange.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/recon_buildblock/DataSymmetriesForBins.h" +#include "stir/RunTests.h" +#include "stir/stream.h" +#include +#include +#include +#ifndef STIR_NO_NAMESPACES +using std::stringstream; +using std::cerr; +#endif + +START_NAMESPACE_STIR + +template +bool +coordinates_less(const BasicCoordinate<3,T>& el1, const BasicCoordinate<3,T>& el2) +{ + return el1[1] proj_data_info_sptr; + + void run_tests_2_proj_matrices_1_bin(const ProjMatrixByBin& proj_matrix_no_symm, + const ProjMatrixByBin& proj_matrix_with_symm, + const Bin& bin); + void run_tests_2_proj_matrices(const ProjMatrixByBin& proj_matrix_no_symm, + const ProjMatrixByBin& proj_matrix_with_symm); + void run_tests_all_symmetries(const shared_ptr& proj_data_info_sptr, + const shared_ptr >& density_sptr + ); + void run_tests_for_1_projdata(const shared_ptr& proj_data_info_sptr); +}; + +DataSymmetriesForBins_PET_CartesianGridTests:: +DataSymmetriesForBins_PET_CartesianGridTests(char const * template_proj_data_filename) + : template_proj_data_filename(template_proj_data_filename) +{} + +void +DataSymmetriesForBins_PET_CartesianGridTests:: +run_tests_2_proj_matrices_1_bin(const ProjMatrixByBin& proj_matrix_no_symm, + const ProjMatrixByBin& proj_matrix_with_symm, + const Bin& bin) +{ +#if 0 // SYM + // assert(proj_matrix_with_symm.get_symmetries_ptr()->is_basic(bin)); + // vector related_bins; + //proj_matrix_with_symm.get_symmetries_ptr()->get_related_bins(related_bins, bin); + Bin basic_bin=bin; + proj_matrix_with_symm.get_symmetries_ptr()->find_basic_bin(basic_bin); + vector related_bins; + proj_matrix_with_symm.get_symmetries_ptr()->get_related_bins(related_bins, basic_bin); + + ProjMatrixElemsForOneBin elems_no_sym; + ProjMatrixElemsForOneBin elems_with_sym; + for (vector::const_iterator bin_iter = related_bins.begin(); + bin_iter != related_bins.end(); + ++bin_iter) + { + proj_matrix_with_symm. + get_proj_matrix_elems_for_one_bin(elems_with_sym, *bin_iter); + proj_matrix_no_symm. + get_proj_matrix_elems_for_one_bin(elems_no_sym, *bin_iter); +#else + + ProjMatrixElemsForOneBin elems_no_sym; + ProjMatrixElemsForOneBin elems_with_sym; + { + proj_matrix_with_symm. + get_proj_matrix_elems_for_one_bin(elems_with_sym, bin); + proj_matrix_no_symm. + get_proj_matrix_elems_for_one_bin(elems_no_sym, bin); +#endif + elems_no_sym.sort(); + elems_with_sym.sort(); + if (!check(elems_no_sym == elems_with_sym, "comparing lors")) + { + // SYM const Bin bin=*bin_iter; + cerr << "Current bin: segment = " << bin.segment_num() + << ", axial pos " << bin.axial_pos_num() + << ", view = " << bin.view_num() + << ", tangential_pos_num = " << bin.tangential_pos_num() << "\n"; + ProjMatrixElemsForOneBin::const_iterator no_sym_iter= elems_no_sym.begin(); + ProjMatrixElemsForOneBin::const_iterator with_sym_iter = elems_with_sym.begin(); + while (no_sym_iter!= elems_no_sym.end() || with_sym_iter!=elems_with_sym.end()) + { + if (no_sym_iter==elems_no_sym.end() || + with_sym_iter==elems_with_sym.end() || + no_sym_iter->get_coords()!= with_sym_iter->get_coords() || + fabs(no_sym_iter->get_value()/with_sym_iter->get_value() -1) > .0002) + { + bool inc_no_sym_iter = false; + if (no_sym_iter!=elems_no_sym.end() && + (with_sym_iter==elems_with_sym.end() || + coordinates_less(no_sym_iter->get_coords(),with_sym_iter->get_coords()) || + no_sym_iter->get_coords()==with_sym_iter->get_coords())) + { + cerr << no_sym_iter->get_coords() + << ':' << no_sym_iter->get_value() + << " || "; + inc_no_sym_iter = true; + } + else + cerr << " || "; + if (with_sym_iter!=elems_with_sym.end() && + (no_sym_iter==elems_no_sym.end() || + !coordinates_less(no_sym_iter->get_coords(),with_sym_iter->get_coords()))) + { + cerr << with_sym_iter->get_coords() + << ':' << with_sym_iter->get_value(); + ++with_sym_iter; + } + if (inc_no_sym_iter) + ++no_sym_iter; + cerr << "\n"; + } + else + { + if (no_sym_iter!=elems_no_sym.end()) + ++no_sym_iter; + if (with_sym_iter!=elems_with_sym.end()) + ++with_sym_iter; + } + } + } + } +} + +void +DataSymmetriesForBins_PET_CartesianGridTests:: +run_tests_2_proj_matrices(const ProjMatrixByBin& proj_matrix_no_symm, + const ProjMatrixByBin& proj_matrix_with_symm) +{ +#if 1 + for (int s=-proj_data_info_sptr->get_max_segment_num(); s<=proj_data_info_sptr->get_max_segment_num(); ++s) + for (int v=proj_data_info_sptr->get_min_view_num(); + v <= proj_data_info_sptr->get_max_view_num(); + ++v) + for (int a=proj_data_info_sptr->get_min_axial_pos_num(s); + a <= proj_data_info_sptr->get_max_axial_pos_num(s); + ++a) + for (int t=-6; t<=6; t+=3) + { + const Bin bin(s,v,a,t); + //SYM if (proj_matrix_with_symm.get_symmetries_ptr()->is_basic(bin)) + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + +#else + const int oblique_seg_num = proj_data_info_sptr->get_max_segment_num(); + const int view45 = + proj_data_info_sptr->get_num_views()/4; + assert(fabs(proj_data_info_sptr-> + get_phi(Bin(0,view45,0,0)) - _PI/4)<.001); + + { + const Bin bin(oblique_seg_num,1,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,1,5,-6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,1,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,1,5,-6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + + { + const Bin bin(oblique_seg_num,1,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,1,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(0,1,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(0,1,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,0,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,0,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,0,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,0,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(0,0,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(0,0,5,-6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(0,0,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,view45,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,view45,5,-6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,view45,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,view45,5,-6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,view45,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,view45,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + + { + const Bin bin(0,view45,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(0,view45,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + + + { + const Bin bin(oblique_seg_num,2*view45+1,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,2*view45+1,5,-6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,2*view45+1,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,2*view45+1,5,-6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(oblique_seg_num,2*view45+1,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(-oblique_seg_num,2*view45+1,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + + { + const Bin bin(0,2*view45+1,5,6); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } + { + const Bin bin(0,2*view45+1,5,0); + run_tests_2_proj_matrices_1_bin(proj_matrix_no_symm, + proj_matrix_with_symm, bin); + } +#endif +} + + +void +DataSymmetriesForBins_PET_CartesianGridTests:: +run_tests_all_symmetries(const shared_ptr& proj_data_info_sptr, + const shared_ptr >& density_sptr + ) +{ + + ProjMatrixByBinUsingRayTracing proj_matrix_no_sym; + { + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 0\n" + "do symmetry 180degrees min phi := 0\n" + "do_symmetry_swap_segment := 0\n" + "do_symmetry_swap_s := 0\n" + "do_symmetry_shift_z := 0\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (!check(proj_matrix_no_sym.parse(str), + "parsing projection matrix parameters")) + return; + proj_matrix_no_sym.set_up(proj_data_info_sptr, density_sptr); + } + + { + cerr << "\t\tTesting with all symmetries\n"; + ProjMatrixByBinUsingRayTracing proj_matrix_with_sym; + + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 1\n" + "do symmetry 180degrees min phi := 1\n" + "do_symmetry_swap_segment := 1\n" + "do_symmetry_swap_s := 1\n" + "do_symmetry_shift_z := 1\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (check(proj_matrix_with_sym.parse(str), + "parsing projection matrix parameters")) + { + proj_matrix_with_sym.set_up(proj_data_info_sptr, density_sptr); + run_tests_2_proj_matrices(proj_matrix_no_sym, proj_matrix_with_sym); + } + } + { + cerr << "\t\tTesting with all symmetries except 90-phi\n"; + ProjMatrixByBinUsingRayTracing proj_matrix_with_sym; + + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 0\n" + "do symmetry 180degrees min phi := 1\n" + "do_symmetry_swap_segment := 1\n" + "do_symmetry_swap_s := 1\n" + "do_symmetry_shift_z := 1\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (check(proj_matrix_with_sym.parse(str), + "parsing projection matrix parameters")) + { + proj_matrix_with_sym.set_up(proj_data_info_sptr, density_sptr); + run_tests_2_proj_matrices(proj_matrix_no_sym, proj_matrix_with_sym); + } + } + { + cerr << "\t\tTesting with all symmetries except phi symms\n"; + ProjMatrixByBinUsingRayTracing proj_matrix_with_sym; + + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 0\n" + "do symmetry 180degrees min phi := 0\n" + "do_symmetry_swap_segment := 1\n" + "do_symmetry_swap_s := 1\n" + "do_symmetry_shift_z := 1\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (check(proj_matrix_with_sym.parse(str), + "parsing projection matrix parameters")) + { + proj_matrix_with_sym.set_up(proj_data_info_sptr, density_sptr); + run_tests_2_proj_matrices(proj_matrix_no_sym, proj_matrix_with_sym); + } + } + { + cerr << "\t\tTesting with all symmetries except swap_segment\n"; + ProjMatrixByBinUsingRayTracing proj_matrix_with_sym; + + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 1\n" + "do symmetry 180degrees min phi := 1\n" + "do_symmetry_swap_segment := 0\n" + "do_symmetry_swap_s := 1\n" + "do_symmetry_shift_z := 1\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (check(proj_matrix_with_sym.parse(str), + "parsing projection matrix parameters")) + { + proj_matrix_with_sym.set_up(proj_data_info_sptr, density_sptr); + run_tests_2_proj_matrices(proj_matrix_no_sym, proj_matrix_with_sym); + } + } + { + cerr << "\t\tTesting with all symmetries except swap_s\n"; + ProjMatrixByBinUsingRayTracing proj_matrix_with_sym; + + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 1\n" + "do symmetry 180degrees min phi := 1\n" + "do_symmetry_swap_segment := 1\n" + "do_symmetry_swap_s := 0\n" + "do_symmetry_shift_z := 1\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (check(proj_matrix_with_sym.parse(str), + "parsing projection matrix parameters")) + { + proj_matrix_with_sym.set_up(proj_data_info_sptr, density_sptr); + run_tests_2_proj_matrices(proj_matrix_no_sym, proj_matrix_with_sym); + } + } + { + cerr << "\t\tTesting with all symmetries except shift_z\n"; + ProjMatrixByBinUsingRayTracing proj_matrix_with_sym; + + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 1\n" + "do symmetry 180degrees min phi := 1\n" + "do_symmetry_swap_segment := 1\n" + "do_symmetry_swap_s := 1\n" + "do_symmetry_shift_z := 0\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (check(proj_matrix_with_sym.parse(str), + "parsing projection matrix parameters")) + { + proj_matrix_with_sym.set_up(proj_data_info_sptr, density_sptr); + run_tests_2_proj_matrices(proj_matrix_no_sym, proj_matrix_with_sym); + } + } + { + cerr << "\t\tTesting with only shift_z\n"; + ProjMatrixByBinUsingRayTracing proj_matrix_with_sym; + + stringstream str; + str << + "Ray Tracing Matrix Parameters :=\n" + "restrict to cylindrical FOV := 1\n" + "number of rays in tangential direction to trace for each bin := 1\n" + "use actual detector boundaries := 0\n" + "do symmetry 90degrees min phi := 0\n" + "do symmetry 180degrees min phi := 0\n" + "do_symmetry_swap_segment := 0\n" + "do_symmetry_swap_s := 0\n" + "do_symmetry_shift_z := 1\n" + "End Ray Tracing Matrix Parameters :=\n"; + if (check(proj_matrix_with_sym.parse(str), + "parsing projection matrix parameters")) + { + proj_matrix_with_sym.set_up(proj_data_info_sptr, density_sptr); + run_tests_2_proj_matrices(proj_matrix_no_sym, proj_matrix_with_sym); + } + } +} + +void +DataSymmetriesForBins_PET_CartesianGridTests:: +run_tests_for_1_projdata(const shared_ptr& proj_data_info_sptr) +{ + CartesianCoordinate3D origin (0,0,0); + const float zoom=1.F; + + cerr << "\tTests with usual image size\n"; + + shared_ptr > + density_sptr(new VoxelsOnCartesianGrid(*proj_data_info_sptr,zoom,origin)); + + VoxelsOnCartesianGrid & image = + dynamic_cast&>(*density_sptr); + + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + + cerr << "\tTests with shifted origin\n"; + density_sptr->set_origin(image.get_grid_spacing()* + CartesianCoordinate3D(3,0,0)); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + + const int org_z_length = + density_sptr->get_length(); + const CartesianCoordinate3D org_voxel_size = + image.get_voxel_size(); + + cerr << "\tTests with non-standard range of planes (larger)\n"; + density_sptr->set_origin(CartesianCoordinate3D(0,0,0)); + density_sptr->grow(IndexRange3D(-2, org_z_length+3, + image.get_min_y(), image.get_max_y(), + image.get_min_x(), image.get_max_x())); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); +#if 0 + if (org_z_length>2) + { + cerr << "\tTests with non-standard range of planes (smaller)\n"; + density_sptr->set_origin(CartesianCoordinate3D(0,0,0)); + density_sptr->resize(IndexRange3D(1, org_z_length-2, + image.get_min_y(), image.get_max_y(), + image.get_min_x(), image.get_max_x())); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + } +#if 1 + // this test currently fails with the ray tracing projmatrix + // (but not with the interpolation projmatrix) + if (org_z_length>1) + { + cerr << "\tTests with non-standard range of planes (smaller (even))\n"; + density_sptr->set_origin(CartesianCoordinate3D(0,0,0)); + density_sptr->resize(IndexRange3D(1, org_z_length-1, + image.get_min_y(), image.get_max_y(), + image.get_min_x(), image.get_max_x())); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + } + // this test currently fails with the ray tracing projmatrix + // because the symmetries do not work yet with origin shifted over half a voxel + // (but not with the interpolation projmatrix) + if (org_z_length>1) + { + cerr << "\tTests with non-standard range of planes (smaller (even and shifted origin))\n"; + // density_sptr->set_origin(CartesianCoordinate3D(0,0,0)); + density_sptr->set_origin(org_voxel_size* + CartesianCoordinate3D(.5F,0,0)); + density_sptr->resize(IndexRange3D(1, org_z_length-1, + image.get_min_y(), image.get_max_y(), + image.get_min_x(), image.get_max_x())); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + } +#endif +#endif + + { + cerr << "\tTests with z voxel size 3 times smaller than usual\n"; + density_sptr->set_origin(CartesianCoordinate3D(0,0,0)); + image.set_grid_spacing(org_voxel_size/ + CartesianCoordinate3D(2,1,1)); + density_sptr->grow(IndexRange3D(-2, org_z_length*2, // note: -2 because grow doesn't allow shrinking! + image.get_min_y(), image.get_max_y(), + image.get_min_x(), image.get_max_x())); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + } + + if (proj_data_info_sptr->get_sampling_in_m(Bin(0,0,0,0))/org_voxel_size.z()>=1.999) + { + // currently symmetries do not work when the voxel size is larger than the ring_spacing + // so we only perform these tests when they can work + { + cerr << "\tTests with z voxel size 2 times larger than usual\n"; + density_sptr->set_origin(CartesianCoordinate3D(0,0,0)); + image.set_grid_spacing(org_voxel_size* + CartesianCoordinate3D(2,1,1)); + density_sptr->resize(IndexRange3D(0, (org_z_length+1)/2-1, + image.get_min_y(), image.get_max_y(), + image.get_min_x(), image.get_max_x())); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + } + { + cerr << "\tTests with usual z voxel size 2 times larger, 1 extra plane\n"; + density_sptr->set_origin(CartesianCoordinate3D(0,0,0)); + image.set_grid_spacing(org_voxel_size* + CartesianCoordinate3D(2,1,1)); + density_sptr->grow(IndexRange3D(0, (org_z_length+1)/2, + image.get_min_y(), image.get_max_y(), + image.get_min_x(), image.get_max_x())); + run_tests_all_symmetries(proj_data_info_sptr, density_sptr); + } + } + +} + +void +DataSymmetriesForBins_PET_CartesianGridTests::run_tests() +{ + cerr << "Tests for DataSymmetriesForBins_PET_CartesianGrid\n"; + if (template_proj_data_filename == 0) + { + { + cerr << "Testing span=1\n"; + shared_ptr scanner_sptr(new Scanner(Scanner::E953)); + proj_data_info_sptr.reset( + ProjDataInfo::ProjDataInfoCTI(scanner_sptr, + /*span=*/1, + /*max_delta=*/5, + /*num_views=*/8, + /*num_tang_poss=*/16)); + + run_tests_for_1_projdata(proj_data_info_sptr); + } + { + cerr << "Testing span=3\n"; + // warning: make sure that parameters are ok such that hard-wired + // bins above are fine (e.g. segment 3 should be allowed) + shared_ptr scanner_sptr(new Scanner(Scanner::E953)); + proj_data_info_sptr.reset( + ProjDataInfo::ProjDataInfoCTI(scanner_sptr, + /*span=*/3, + /*max_delta=*/12, + /*num_views=*/8, + /*num_tang_poss=*/16)); + + + run_tests_for_1_projdata(proj_data_info_sptr); + } + } + else + { + shared_ptr proj_data_sptr = + ProjData::read_from_file(template_proj_data_filename); + proj_data_info_sptr = + proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone(); + run_tests_for_1_projdata(proj_data_info_sptr); + } +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + + +int main(int argc, char **argv) +{ + DataSymmetriesForBins_PET_CartesianGridTests tests(argc==2? argv[1] : 0); + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/recon_test/test_PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx b/src/recon_test/test_PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx new file mode 100644 index 0000000000..311b95df6a --- /dev/null +++ b/src/recon_test/test_PoissonLogLikelihoodWithLinearModelForMeanAndProjData.cxx @@ -0,0 +1,349 @@ +/* + Copyright (C) 2011, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup recon_test + + \brief Test program for stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + \par Usage + +
          +  test_PoissonLogLikelihoodWithLinearModelForMeanAndProjData [proj_data_filename [ density_filename ] ]
          +  
          + where the 2 arguments are optional. See the class documentation for more info. + + \author Kris Thielemans +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ProjData.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInMemory.h" +#include "stir/SegmentByView.h" +#include "stir/Scanner.h" +#include "stir/DataSymmetriesForViewSegmentNumbers.h" +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#include "stir/recon_buildblock/ProjectorByBinPairUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/BinNormalisationFromProjData.h" +#include "stir/recon_buildblock/TrivialBinNormalisation.h" +//#include "stir/OSMAPOSL/OSMAPOSLReconstruction.h" +#include "stir/recon_buildblock/distributable_main.h" +#include "stir/RunTests.h" +#include "stir/IO/read_from_file.h" +#include "stir/info.h" +#include "stir/Succeeded.h" +#include +#include +#include +#include +#include +#include + +#include "stir/IO/OutputFileFormat.h" +#include "stir/recon_buildblock/distributable_main.h" +START_NAMESPACE_STIR + + +/*! + \ingroup test + \brief Test class for PoissonLogLikelihoodWithLinearModelForMeanAndProjData + + This is a somewhat preliminary implementation of a test that compares the result + of GeneralisedObjectiveFunction::compute_gradient + with a numerical gradient computed by using the + GeneralisedObjectiveFunction::compute_objective_function() function. + + The trouble with this is that compute the gradient voxel by voxel is obviously + terribly slow. A solution (for the test) would be to compute it only in + a subset of voxels or so. We'll leave this for later. + + Note that the test only works if the objective function is well-defined. For example, + if certain projections are non-zero, while the model estimates them to be zero, the + Poisson objective function is in theory infinite. + PoissonLogLikelihoodWithLinearModelForMeanAndProjData uses some thresholds to try to + avoid overflow, but if there are too many of these bins, the total objective + function will become infinite. The numerical gradient then becomes ill-defined + (even in voxels that do not contribute to these bins). + +*/ +class PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests : public RunTests +{ +public: + //! Constructor that can take some input data to run the test with + /*! This makes it possible to run the test with your own data. However, beware that + it is very easy to set up a very long computation. See also the note about + non-zero measured bins. + + \todo it would be better to parse an objective function. That would allow us to set + all parameters from the command line. + */ + PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests(char const * const proj_data_filename = 0, char const * const density_filename = 0); + typedef DiscretisedDensity<3,float> target_type; + void construct_input_data(shared_ptr& density_sptr); + + void run_tests(); +protected: + char const * proj_data_filename; + char const * density_filename; + shared_ptr > objective_function_sptr; + + //! run the test + /*! Note that this function is not specific to PoissonLogLikelihoodWithLinearModelForMeanAndProjData */ + void run_tests_for_objective_function(GeneralisedObjectiveFunction& objective_function, + target_type& target); +}; + +PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests:: +PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests(char const * proj_data_filename, char const * const density_filename) + : proj_data_filename(proj_data_filename), density_filename(density_filename) +{} + +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests:: +run_tests_for_objective_function(GeneralisedObjectiveFunction& objective_function, + PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests::target_type& target) { + shared_ptr gradient_sptr(target.get_empty_copy()); + shared_ptr gradient_2_sptr(target.get_empty_copy()); + const int subset_num = 0; + info("Computing gradient"); + objective_function.compute_sub_gradient(*gradient_sptr, target, subset_num); + this->set_tolerance(max(fabs(double(gradient_sptr->find_min())), double(gradient_sptr->find_max()))/1000); + info("Computing objective function at target"); + const double value_at_target = objective_function.compute_objective_function(target, subset_num); + target_type::full_iterator target_iter=target.begin_all(); + target_type::full_iterator gradient_iter=gradient_sptr->begin_all(); + target_type::full_iterator gradient_2_iter=gradient_2_sptr->begin_all(); + const float eps = 1e-2F; + bool testOK = true; + info("Computing gradient of objective function by numerical differences (this will take a while)"); + while(target_iter!=target.end_all()) + { + *target_iter += eps; + const double value_at_inc = objective_function.compute_objective_function(target, subset_num); + *target_iter -= eps; + const float gradient_at_iter = static_cast((value_at_inc - value_at_target)/eps); + *gradient_2_iter++ = gradient_at_iter; + testOK = testOK && + this->check_if_equal(gradient_at_iter, *gradient_iter, "gradient"); + ++target_iter; ++ gradient_iter; + } + if (~testOK) + { + info("Writing diagnostic files gradient.hv, numerical_gradient.hv"); + OutputFileFormat::default_sptr()->write_to_file("gradient.hv", *gradient_sptr); + OutputFileFormat::default_sptr()->write_to_file("numerical_gradient.hv", *gradient_2_sptr); +#if 0 + OutputFileFormat::default_sptr()->write_to_file("subsens.hv", + reinterpret_cast &>(objective_function).get_subset_sensitivity(subset_num)); + gradient_sptr->fill(0.F); + reinterpret_cast &>(objective_function). + compute_sub_gradient_without_penalty_plus_sensitivity(*gradient_sptr, target, subset_num); + OutputFileFormat::default_sptr()->write_to_file("gradient-without-sens.hv", *gradient_sptr); +#endif + } + +} + +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests:: +construct_input_data(shared_ptr& density_sptr) +{ + shared_ptr proj_data_sptr; + if (this->proj_data_filename == 0) + { + // construct a small scanner and sinogram + shared_ptr scanner_sptr(new Scanner(Scanner::E953)); + scanner_sptr->set_num_rings(5); + shared_ptr proj_data_info_sptr( + ProjDataInfo::ProjDataInfoCTI(scanner_sptr, + /*span=*/3, + /*max_delta=*/4, + /*num_views=*/16, + /*num_tang_poss=*/16)); + shared_ptr exam_info_sptr(new ExamInfo); + proj_data_sptr.reset(new ProjDataInMemory (exam_info_sptr, proj_data_info_sptr)); + for (int seg_num=proj_data_sptr->get_min_segment_num(); + seg_num<=proj_data_sptr->get_max_segment_num(); + ++seg_num) + { + SegmentByView segment = proj_data_sptr->get_empty_segment_by_view(seg_num); + // fill in some crazy values + float value=0; + for (SegmentByView::full_iterator iter = segment.begin_all(); + iter != segment.end_all(); + ++iter) + { + value = float(fabs((seg_num+.1)*value - 5)); // needs to be positive for Poisson + *iter = value; + } + proj_data_sptr->set_segment(segment); + } + } + else + { + proj_data_sptr = + ProjData::read_from_file(this->proj_data_filename); + } + + if (this->density_filename == 0) + { + // construct a small image + + CartesianCoordinate3D origin (0,0,0); + const float zoom=1.F; + + density_sptr.reset(new VoxelsOnCartesianGrid(*proj_data_sptr->get_proj_data_info_ptr(),zoom,origin)); + // fill with random numbers between 0 and 1 + typedef boost::mt19937 base_generator_type; + // initialize by reproducible seed + static base_generator_type generator(boost::uint32_t(42)); + static boost::uniform_01 random01(generator); + for (target_type::full_iterator iter=density_sptr->begin_all(); iter!=density_sptr->end_all(); ++iter) + *iter = random01(); + + } + else + { + std::auto_ptr aptr(read_from_file(this->density_filename)); + density_sptr = aptr; + } + + // make odd to avoid difficulties with outer-bin that isn't filled-in when using symmetries + { + BasicCoordinate<3,int> min_ind, max_ind; + if (density_sptr->get_regular_range(min_ind,max_ind)) + { + for (int d=2; d<=3; ++d) + { + min_ind[d]=std::min(min_ind[d], -max_ind[d]); + max_ind[d]=std::max(-min_ind[d], max_ind[d]); + } + density_sptr->grow(IndexRange<3>(min_ind,max_ind)); + } + } + + + // multiplicative term + shared_ptr bin_norm_sptr(new TrivialBinNormalisation()); + { + shared_ptr + mult_proj_data_sptr(new ProjDataInMemory (proj_data_sptr->get_exam_info_sptr(), + proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone())); + for (int seg_num=proj_data_sptr->get_min_segment_num(); + seg_num<=proj_data_sptr->get_max_segment_num(); + ++seg_num) + { + SegmentByView segment = proj_data_sptr->get_empty_segment_by_view(seg_num); + // fill in some crazy values + float value =0; + for (SegmentByView::full_iterator iter = segment.begin_all(); + iter != segment.end_all(); + ++iter) + { + value = float(fabs(seg_num*value - .2)); // needs to be positive for Poisson + *iter = value; + } + mult_proj_data_sptr->set_segment(segment); + } + bin_norm_sptr.reset(new BinNormalisationFromProjData(mult_proj_data_sptr)); + } + + // additive term + shared_ptr add_proj_data_sptr(new ProjDataInMemory (proj_data_sptr->get_exam_info_sptr(), + +proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone())); + { + for (int seg_num=proj_data_sptr->get_min_segment_num(); + seg_num<=proj_data_sptr->get_max_segment_num(); + ++seg_num) + { + SegmentByView segment = proj_data_sptr->get_empty_segment_by_view(seg_num); + // fill in some crazy values + float value =0; + for (SegmentByView::full_iterator iter = segment.begin_all(); + iter != segment.end_all(); + ++iter) + { + value = float(fabs(seg_num*value - .3)); // needs to be positive for Poisson + *iter = value; + } + add_proj_data_sptr->set_segment(segment); + } + } + + objective_function_sptr.reset(new PoissonLogLikelihoodWithLinearModelForMeanAndProjData); + PoissonLogLikelihoodWithLinearModelForMeanAndProjData& objective_function = + reinterpret_cast< PoissonLogLikelihoodWithLinearModelForMeanAndProjData& >(*objective_function_sptr); + objective_function.set_proj_data_sptr(proj_data_sptr); + objective_function.set_use_subset_sensitivities(true); + shared_ptr proj_matrix_sptr(new ProjMatrixByBinUsingRayTracing()); + shared_ptr proj_pair_sptr(new ProjectorByBinPairUsingProjMatrixByBin(proj_matrix_sptr)); + objective_function.set_projector_pair_sptr(proj_pair_sptr) ; + /* + void set_frame_num(const int); + void set_frame_definitions(const TimeFrameDefinitions&); + */ + objective_function.set_normalisation_sptr(bin_norm_sptr); + objective_function.set_additive_proj_data_sptr(add_proj_data_sptr); + objective_function.set_num_subsets(proj_data_sptr->get_num_views()/2); + if (!check(objective_function.set_up(density_sptr)==Succeeded::yes, "set-up of objective function")) + return; +} + +void +PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests:: +run_tests() +{ + cerr << "Tests for PoissonLogLikelihoodWithLinearModelForMeanAndProjData\n"; + +#if 1 + shared_ptr density_sptr; + construct_input_data(density_sptr); + this->run_tests_for_objective_function(*this->objective_function_sptr, *density_sptr); +#else + // alternative that gets the objective function from an OSMAPOSL .par file + // currently disabled + OSMAPOSLReconstruction recon(proj_data_filename); // actually .par + shared_ptr > objective_function_sptr = recon.get_objective_function_sptr(); + if (!check(objective_function_sptr->set_up(recon.get_initial_data_ptr())==Succeeded::yes, "set-up of objective function")) + return; + this->run_tests_for_objective_function(*objective_function_sptr, + *recon.get_initial_data_ptr()); +#endif +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + +#ifdef STIR_MPI +int stir::distributable_main(int argc, char **argv) +#else +int main(int argc, char **argv) +#endif +{ + PoissonLogLikelihoodWithLinearModelForMeanAndProjDataTests tests(argc>1? argv[1] : 0, + argc>2? argv[2] : 0); + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/recon_test/test_modelling.sh b/src/recon_test/test_modelling.sh new file mode 100755 index 0000000000..92443646f1 --- /dev/null +++ b/src/recon_test/test_modelling.sh @@ -0,0 +1,290 @@ +#! /bin/bash +# +# Copyright (C) 2009 - 2011, Hammersmith Imanet Ltd +# Copyright (C) 2013 - 2014, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# A script to check internal consistency of the parametric imaging code. +# It tests both the indirect and direct methods. +# First, dynamic data is simulated from parametric images. +# Then the estimated parametric images are compared with the originals. +# +# This script currently needs to be executed in the parent-directory of "recon_test" +# (This could be changed by adjusting INPUTDIR below). + +# Author: Charalampos Tsoumpas +# Author: Kris Thielemans + +# we do the next line such that the script aborts at any error (i.e. any non-zero return value of a command). +# Note that it only works in bash. all the rest will work in sh (except for a substition line, look for //) +set -e +trap "echo ERROR" ERR +#Run Parametric Reconstruction +WORKSPACE=`pwd` + +INPUTDIR=$WORKSPACE/recon_test/input/ +NUMSUBS=4 # 16 subsets create a difference in the direct method of more than 8%!!! +ITER=40 +SAVITER=40 +MAXSEG=1 +export INPUTDIR +export NUMSUBS +export ITER +export MAXSEG +export SAVITER + +# +# Options +# +MPIRUN="" + +# +# Parse option arguments (--) +# Note that the -- is required to suppress interpretation of $1 as options +# to expr +# +while test `expr -- "$1" : "--.*"` -gt 0 +do + + if test "$1" = "--mpicmd" + then + MPIRUN="$2" + shift 1 + elif test "$1" = "--help" + then + echo "Usage: `basename $0` [--mpicmd somecmd] [install_dir]" + echo "(where [] means that an argument is optional)" + #echo "See README.txt for more info." + exit 1 + else + echo Warning: Unknown option "$1" + echo rerun with --help for more info. + exit 1 + fi + + shift 1 + +done + +if [ $# -eq 1 ]; then + echo "Prepending $1 to your PATH for the duration of this script." + PATH=$1:$PATH +fi + +command -v generate_image >/dev/null 2>&1 || { echo "generate_image not found or not executable. Aborting." >&2; exit 1; } +command -v get_dynamic_images_from_parametric_images >/dev/null 2>&1 || { echo "get_dynamic_images_from_parametric_images not found or not executable. Aborting." >&2; exit 1; } +command -v conv_to_ecat7 >/dev/null 2>&1 || { echo "conv_to_ecat7 not found or not executable. Aborting." >&2; exit 1; } + +echo "Using executables like the following" +echo "Using `command -v get_dynamic_images_from_parametric_images`" +echo "Using `command -v fwdtest`" + +mkdir -p test_modelling_output +cd test_modelling_output +rm -f *img + +cp ${INPUTDIR}time.fdef . +cp ${INPUTDIR}plasma.if . + +# Create images +# IF NOT EXIST +if [ ! -r p0005.hv ]; then +generate_image ${INPUTDIR}generate_p0005.par +fi +if [ ! -r p5.hv ]; then +generate_image ${INPUTDIR}generate_p5.par +fi +conv_to_ecat7 p0005-p5.img p0005.hv p5.hv "ECAT 931" + +# Create template images +if [ ! -r all1.img ]; then +generate_image ${INPUTDIR}generate_all1.par +conv_to_ecat7 all1.img all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv all1.hv "ECAT 931" # 28 frames +fi + +#copy_frame_info.sh --frame-info-only time.fdef all1.img + +if [ ! -r all1-all1000.img ]; then +stir_math --including-first --times-scalar 1000 all1000 all1.hv +conv_to_ecat7 all1-all1000.img all1.hv all1000.hv "ECAT 931" +fi +cp all1.img dyn_from_p0005-p5.img +cp all1.img dyn_from_recon_p0005-p5.img +cp all1.img dyn_sens.img +cp all1-all1000.img indirect_Patlak.img + +get_dynamic_images_from_parametric_images dyn_from_p0005-p5.img p0005-p5.img ${INPUTDIR}PatlakPlot.par +#copy_frame_info.sh --frame-info-only ${INPUTDIR}time.fdef dyn_from_p0005-p5.img +apply_patlak_to_images indirect_Patlak.img dyn_from_p0005-p5.img ${INPUTDIR}PatlakPlot.par + +echo "Test the 'get_dynamic_images_from_parametric_images'" + +# Create the appropriate files +ifheaders_for_ecat7 dyn_from_p0005-p5.img < /dev/null +# if [ ! -r fwd_dyn_from_p0005-p5.S ]; then +rm -f fwd.par +cat < fwd.par +Forward Projector parameters:= +type := ray tracing + forward Projector Using Ray Tracing Parameters := + End Forward Projector Using Ray Tracing Parameters := +end := +EOF + +for fr in `count 23 28`; do + fwdtest fwd_dyn_from_p0005-p5_f${fr}g1d0b0 ${INPUTDIR}ECAT_931_projdata_template.hs dyn_from_p0005-p5_img_f${fr}g1d0b0.hv fwd.par < /dev/null +done +#fi + +# create "fake" normalisation file just for testing. +# we will use a sinogram full of ones (which won't influence the result) +stir_math -s --including-first --max_segment_num_to_process $MAXSEG --times-scalar 0 --add-scalar 1 all_ones.hs fwd_dyn_from_p0005-p5_f23g1d0b0.hs + +tmpvar="" ; +for fr in `count 1 23 `; do + tmpvar="$tmpvar fwd_dyn_from_p0005-p5_f23g1d0b0.hs" +done +for fr in `count 24 28 `; do + tmpvar="$tmpvar fwd_dyn_from_p0005-p5_f${fr}g1d0b0.hs" +done + +#tmpvar=`count --pre "fwd_dyn_from_p0005-p5_f" --post "g1d0b0.hs" 1 28` + +# conv_to_ecat7 -s fwd_dyn_from_p0005-p5.S $tmpvar +# make interfile dynamic data by concatenation and creating (by adjustment) a new header +cat ${tmpvar//.hs/.s} > fwd_dyn_from_p0005-p5.s +sed -e 's/number of time frames := 1/number of time frames := 28/' \ + -e 's/name of data file :=.*/name of data file := fwd_dyn_from_p0005-p5.s/' \ + fwd_dyn_from_p0005-p5_f23g1d0b0.hs > fwd_dyn_from_p0005-p5.hs + +# TODO we need to fill in timing info really, but currently we'll pass time.fdef in the .par file instead +#copy_frame_info.sh --frame-info-only time.fdef fwd_dyn_from_p0005-p5.S +#copy_frame_info.sh --frame-info-only time.fdef dyn_from_p0005-p5.img +for direct in OSMAPOSL OSSPS ; do +cp ${INPUTDIR}P${direct}.par . +echo "Test the direct P${direct} Patlak Plot reconstruction" +rm -f P${direct}.txt; +INPUT=fwd_dyn_from_p0005-p5.hs ${MPIRUN} P${direct} P${direct}.par > P${direct}.txt 2>&1 +echo "Multiply the parametric images with the model matrix to get the corresponding dynamic images." +get_dynamic_images_from_parametric_images dyn_from_recon_p0005-p5.img P${direct}_${ITER}.img ${INPUTDIR}PatlakPlot.par +get_dynamic_images_from_parametric_images dyn_sens.img sens.img ${INPUTDIR}PatlakPlot.par +ifheaders_for_ecat7 p0005-p5.img < /dev/null +ifheaders_for_ecat7 indirect_Patlak.img < /dev/null +ifheaders_for_ecat7 P${direct}_${ITER}.img < /dev/null + +ifheaders_for_ecat7 dyn_from_p0005-p5.img < /dev/null +ifheaders_for_ecat7 dyn_from_recon_p0005-p5.img < /dev/null +ifheaders_for_ecat7 dyn_sens.img < /dev/null + +echo "Compare the parametric images" +echo "indirect to original" +for par in 1 2; do + compare_image -t .01 indirect_Patlak_img_f${par}g1d0b0.hv p0005-p5_img_f${par}g1d0b0.hv +done +echo "direct to original" +for par in 1 2; do + compare_image -t .01 P${direct}_${ITER}_img_f${par}g1d0b0.hv p0005-p5_img_f${par}g1d0b0.hv +done +echo "direct to indirect" +for par in 1 2; do + compare_image -t .01 P${direct}_${ITER}_img_f${par}g1d0b0.hv indirect_Patlak_img_f${par}g1d0b0.hv +done +echo "Comparison is OK" + +echo "Compare the dynamic images" +for fr in `count 23 28` +do + compare_image -t .01 dyn_from_recon_p0005-p5_img_f${fr}g1d0b0.hv dyn_from_p0005-p5_img_f${fr}g1d0b0.hv +done +echo "Comparison is OK" + +echo "Test the utility: 'mult_model_with_dyn_images'" +echo "Multiply the dynamic images with the model matrix to get images in the parametric space." +#if [ ! -r test_mult_dyn_with_model.img ]; then + cp indirect_Patlak.img test_mult_dyn_with_model.img +#fi +mult_model_with_dyn_images test_mult_dyn_with_model.img dyn_from_p0005-p5.img ${INPUTDIR}PatlakPlot.par +ifheaders_for_ecat7 test_mult_dyn_with_model.img < /dev/null + +rm -f manip_image_counts.inp ; echo 9 > manip_image_counts.inp ; echo 0 >> manip_image_counts.inp +echo " " +echo "Min Counts for Par 1 " + +value_1=`manip_image test_mult_dyn_with_model_img_f1g1d0b0.hv &1 | grep "Max" |awk '{print $6}' ` +is_differ=`echo ${value_1} | awk ' { print ($1>.0001) } '` +if [ ${is_differ} -eq 1 ]; then + echo "When estimate min_counts_in_images values do not match. Check mult_model_with_dyn_images.cxx" + exit 1 +else + echo " Test OK " +fi + +echo "Min Counts for Par 2 " +value_2=`manip_image test_mult_dyn_with_model_img_f2g1d0b0.hv &1 | grep "Max" |awk '{print $6}' ` +is_differ=`echo ${value_2} | awk ' { print ($1>.0001) } '` +if [ ${is_differ} -eq 1 ]; then + echo "When estimate min_counts_in_images values do not match. Check mult_model_with_dyn_images.cxx" + exit 1 +else + echo " Test OK " +fi + +echo "Max Counts for Par 1 " +value_3=`manip_image test_mult_dyn_with_model_img_f1g1d0b0.hv &1 | grep "Max" |awk '{print $7}' ` +# 6.391818 is the scale due to the zoom factor. +is_differ=`echo ${value_3} | awk ' { print (($1-1619.32*6.391818*6.391818)*($1-1619.32*6.391818*6.391818)>.5*6.391818*6.391818*6.391818*6.391818*.5) } '` +if [ ${is_differ} -eq 1 ]; then + echo "When estimate max_counts_in_images values do not match. Check mult_model_with_dyn_images.cxx" + exit 1 +else + echo " Test OK " +fi + +echo "Max Counts for Par 2 " +value_4=`manip_image test_mult_dyn_with_model_img_f2g1d0b0.hv &1 | grep "Max" |awk '{print $7}' ` +is_differ=`echo ${value_4} | awk ' { print (($1-0.356552*6.391818*6.391818)*($1-0.356552*6.391818*6.391818)>.001*6.391818*6.391818*.001) } '` +if [ ${is_differ} -eq 1 ]; then + echo "When estimate max_counts_in_images values do not match. Check mult_model_with_dyn_images.cxx" + exit 1 +else + echo " Test OK " +fi + +# Extract Sensitivity Frames +ifheaders_for_ecat7 sens.img < /dev/null + +echo "The sensitivity image is not tested, yet!!!" +# Multiply the parametric images with the sensitivity images ### NOT IMPLEMENTED YET +for it in ${ITER}; do + for fr in `count 23 28` ; do + stir_math --mult mult_${it}_f${fr} dyn_sens_img_f${fr}g1d0b0.hv dyn_from_recon_p0005-p5_img_f${fr}g1d0b0.hv + done + stir_math sum_over_frames_test_${it} mult_${it}_f${fr}.hv + for fr in `count 24 28`; do + stir_math --including-first --accumulate sum_over_frames_test_${it}.hv mult_${it}_f${fr}.hv + done +done + +stir_math -s sum_frame_sinograms fwd_dyn_from_p0005-p5_f23g1d0b0.hs +for fr in `count 24 28`; do + stir_math -s --including-first --accumulate sum_frame_sinograms.hs fwd_dyn_from_p0005-p5_f${fr}g1d0b0.hs +done +done # POSMAPOSL POSSPS# +cd .. ; +# rm -fr test_modelling_output + +echo " " +echo "The Direct Reconstructions tests are OK. " +echo "You can remove all output with \"rm -fr test_modelling_output\"" diff --git a/src/scatter_buildblock/CMakeLists.txt b/src/scatter_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..fe078329ce --- /dev/null +++ b/src/scatter_buildblock/CMakeLists.txt @@ -0,0 +1,22 @@ + +# +# + +set(dir scatter_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) +set(${dir_LIB_SOURCES} + sample_scatter_points + single_scatter_estimate + single_scatter_integrals + scatter_detection_modelling + cached_single_scatter_integrals + scatter_estimate_for_one_scatter_point + upsample_and_fit_scatter_estimate + ScatterEstimationByBin +) +#$(dir)_REGISTRY_SOURCES:= scatter_buildblock_registries + + +include(stir_lib_target) +target_link_libraries(scatter_buildblock recon_buildblock ) diff --git a/src/scatter_buildblock/ScatterEstimationByBin.cxx b/src/scatter_buildblock/ScatterEstimationByBin.cxx new file mode 100644 index 0000000000..4d09cb523c --- /dev/null +++ b/src/scatter_buildblock/ScatterEstimationByBin.cxx @@ -0,0 +1,434 @@ +/* + Copyright (C) 2004 - 2009 Hammersmith Imanet Ltd + Copyright (C) 2013 University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Implementation of most functions in stir::ScatterEstimationByBin + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/ProjDataInterfile.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Bin.h" +#include "stir/ViewSegmentNumbers.h" +#include "stir/CPUTimer.h" +#include "stir/Viewgram.h" +#include "stir/is_null_ptr.h" +#include "stir/IO/read_from_file.h" +#include "stir/info.h" +#include "stir/error.h" +#include +#include + + +START_NAMESPACE_STIR + +void +ScatterEstimationByBin:: +set_defaults() +{ + this->attenuation_threshold = 0.01 ; + this->random = true; + this->use_cache = true; + this->energy_resolution = .22 ; + this->reference_energy = 511.F; + this->lower_energy_threshold = 350 ; + this->upper_energy_threshold = 650 ; + this->activity_image_filename = ""; + this->density_image_filename = ""; + this->density_image_for_scatter_points_filename = ""; + this->template_proj_data_filename = ""; + this->output_proj_data_filename = ""; + + this->remove_cache_for_integrals_over_activity(); + this->remove_cache_for_integrals_over_attenuation(); +} + +void +ScatterEstimationByBin:: +initialise_keymap() +{ + this->parser.add_start_key("Scatter Estimation Parameters"); + this->parser.add_stop_key("end Scatter Estimation Parameters"); + this->parser.add_key("attenuation_threshold", &this->attenuation_threshold); + this->parser.add_key("random", &this->random); + + this->parser.add_key("use_cache", &this->use_cache); + this->parser.add_key("energy_resolution", &this->energy_resolution); + this->parser.add_key("lower_energy_threshold", &this->lower_energy_threshold); + this->parser.add_key("upper_energy_threshold", &this->upper_energy_threshold); + + this->parser.add_key("activity_image_filename", &this->activity_image_filename); + this->parser.add_key("density_image_filename", &this->density_image_filename); + this->parser.add_key("density_image_for_scatter_points_filename", &this->density_image_for_scatter_points_filename); + this->parser.add_key("template_proj_data_filename", &this->template_proj_data_filename); + this->parser.add_key("output_filename_prefix", &this->output_proj_data_filename); +} + +bool +ScatterEstimationByBin:: +post_processing() +{ + this->set_activity_image(this->activity_image_filename); + this->set_density_image(this->density_image_filename); + this->set_density_image_for_scatter_points(this->density_image_for_scatter_points_filename); + + info(boost::format("Attenuation image data are supposed to be in units cm^-1\n" + "\tReference: water has mu .096 cm^-1\n" + "\tMax in attenuation image: %g\n") % + this->density_image_sptr->find_max()); + + this->set_template_proj_data_info(this->template_proj_data_filename); + // create output (has to be AFTER set_template_proj_data_info) + this->set_output_proj_data(this->output_proj_data_filename); + + return false; +} + +ScatterEstimationByBin:: +ScatterEstimationByBin() +{ + this->set_defaults(); +} + + +/****************** functions to set images **********************/ +void +ScatterEstimationByBin:: +set_activity_image_sptr(const shared_ptr >& new_sptr) +{ + this->activity_image_sptr=new_sptr; + this->remove_cache_for_integrals_over_activity(); +} + +void +ScatterEstimationByBin:: +set_activity_image(const std::string& filename) +{ + this->activity_image_filename=filename; + this->activity_image_sptr= + read_from_file >(filename); + if (is_null_ptr(this->activity_image_sptr)) + { + error(boost::format("Error reading activity image %s") % + this->activity_image_filename); + } + this->set_activity_image_sptr(this->activity_image_sptr); +} + + +void +ScatterEstimationByBin:: +set_density_image_sptr(const shared_ptr >& new_sptr) +{ + this->density_image_sptr=new_sptr; + this->remove_cache_for_integrals_over_attenuation(); +} + +void +ScatterEstimationByBin:: +set_density_image(const std::string& filename) +{ + this->density_image_filename=filename; + this->density_image_sptr= + read_from_file >(filename); + if (is_null_ptr(this->density_image_sptr)) + { + error(boost::format("Error reading density image %s") % + this->density_image_filename); + } + this->set_density_image_sptr(this->density_image_sptr); +} + +void +ScatterEstimationByBin:: +set_density_image_for_scatter_points_sptr(const shared_ptr >& new_sptr) +{ + this->density_image_for_scatter_points_sptr=new_sptr; + this->sample_scatter_points(); + this->remove_cache_for_integrals_over_attenuation(); +} + +void +ScatterEstimationByBin:: +set_density_image_for_scatter_points(const std::string& filename) +{ + this->density_image_for_scatter_points_filename=filename; + this->density_image_for_scatter_points_sptr= + read_from_file >(filename); + if (is_null_ptr(this->density_image_for_scatter_points_sptr)) + { + error(boost::format("Error reading density_for_scatter_points image %s") % + this->density_image_for_scatter_points_filename); + } + this->set_density_image_for_scatter_points_sptr(this->density_image_for_scatter_points_sptr); +} + + +/****************** functions to set projection data **********************/ + +void +ScatterEstimationByBin:: +set_template_proj_data_info_sptr(const shared_ptr& new_sptr) +{ + + this->proj_data_info_ptr = dynamic_cast(new_sptr->clone()); + + if (is_null_ptr(this->proj_data_info_ptr)) + { + error("ScatterEstimationByBin can only handle non-arccorrected data"); + } + + // find final size of detection_points_vector + this->total_detectors = + this->proj_data_info_ptr->get_scanner_ptr()->get_num_rings()* + this->proj_data_info_ptr->get_scanner_ptr()->get_num_detectors_per_ring (); + // reserve space to avoid reallocation, but the actual size will grow dynamically + this->detection_points_vector.reserve(total_detectors); + + // remove any cached values as they'd be incorrect if the sizes changes + this->remove_cache_for_integrals_over_attenuation(); + this->remove_cache_for_integrals_over_activity(); +} + +void +ScatterEstimationByBin:: +set_template_proj_data_info(const std::string& filename) +{ + this->template_proj_data_filename = filename; + shared_ptr template_proj_data_sptr = + ProjData::read_from_file(this->template_proj_data_filename); + + this->set_template_proj_data_info_sptr(template_proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone()); +} + +/* +void +ScatterEstimationByBin:: +set_output_proj_data_sptr(const shared_ptr& new_sptr) +{ + this->output_proj_data_sptr = new_sptr; +} +*/ + +void +ScatterEstimationByBin:: +set_output_proj_data(const std::string& filename) +{ + this->output_proj_data_filename = filename; + // TODO get ExamInfo from image + shared_ptr exam_info_sptr(new ExamInfo); + this->output_proj_data_sptr.reset(new ProjDataInterfile(exam_info_sptr, + this->proj_data_info_ptr->create_shared_clone(), + this->output_proj_data_filename)); +} + +/****************** functions to compute scatter **********************/ + +Succeeded +ScatterEstimationByBin:: +process_data() +{ + this->initialise_cache_for_scattpoint_det_integrals_over_attenuation(); + this->initialise_cache_for_scattpoint_det_integrals_over_activity(); + + ViewSegmentNumbers vs_num; + + /* ////////////////// SCATTER ESTIMATION TIME //////////////// + */ + CPUTimer bin_timer; + int bin_counter = 0; + bin_timer.start(); + int axial_bins = 0 ; + for (vs_num.segment_num()=this->proj_data_info_ptr->get_min_segment_num(); + vs_num.segment_num()<=this->proj_data_info_ptr->get_max_segment_num(); + ++vs_num.segment_num()) + axial_bins += this->proj_data_info_ptr->get_num_axial_poss(vs_num.segment_num()); + const int total_bins = + this->proj_data_info_ptr->get_num_views() * axial_bins * + this->proj_data_info_ptr->get_num_tangential_poss(); + + /* ////////////////// end SCATTER ESTIMATION TIME //////////////// + */ + + /* Currently, proj_data_info.find_cartesian_coordinates_of_detection() returns + coordinate in a coordinate system where z=0 in the first ring of the scanner. + We want to shift this to a coordinate system where z=0 in the middle + of the scanner. + We can use get_m() as that uses the 'middle of the scanner' system. + (sorry) + */ +#ifndef NDEBUG + { + CartesianCoordinate3D detector_coord_A, detector_coord_B; + // check above statement + this->proj_data_info_ptr->find_cartesian_coordinates_of_detection( + detector_coord_A,detector_coord_B,Bin(0,0,0,0)); + assert(detector_coord_A.z()==0); + assert(detector_coord_B.z()==0); + // check that get_m refers to the middle of the scanner + const float m_first = + this->proj_data_info_ptr->get_m(Bin(0,0,this->proj_data_info_ptr->get_min_axial_pos_num(0),0)); + const float m_last = + this->proj_data_info_ptr->get_m(Bin(0,0,this->proj_data_info_ptr->get_max_axial_pos_num(0),0)); + assert(fabs(m_last + m_first)shift_detector_coordinates_to_origin = + CartesianCoordinate3D(this->proj_data_info_ptr->get_m(Bin(0,0,0,0)),0, 0); + + float total_scatter = 0 ; + + for (vs_num.segment_num()=this->proj_data_info_ptr->get_min_segment_num(); + vs_num.segment_num()<=this->proj_data_info_ptr->get_max_segment_num(); + ++vs_num.segment_num()) + { + for (vs_num.view_num()=this->proj_data_info_ptr->get_min_view_num(); + vs_num.view_num()<=this->proj_data_info_ptr->get_max_view_num(); + ++vs_num.view_num()) + { + total_scatter += this->process_data_for_view_segment_num(vs_num); + bin_counter += + this->proj_data_info_ptr->get_num_axial_poss(vs_num.segment_num()) * + this->proj_data_info_ptr->get_num_tangential_poss(); + + /* ////////////////// SCATTER ESTIMATION TIME //////////////// + */ + { + // TODO remove statics + static double previous_timer = 0 ; + static int previous_bin_count = 0 ; + std::cerr << bin_counter << " bins Total time elapsed " + << bin_timer.value() << " sec \tTime remaining about " + << (bin_timer.value()-previous_timer)* + (total_bins-bin_counter)/ + (bin_counter-previous_bin_count)/60 + << " minutes" + << std::endl; + previous_timer = bin_timer.value() ; + previous_bin_count = bin_counter ; + } + /* ////////////////// end SCATTER ESTIMATION TIME //////////////// + */ + } + } + bin_timer.stop(); + this->write_log(bin_timer.value(), total_scatter); + + if (detection_points_vector.size() != static_cast(total_detectors)) + { + warning("Expected num detectors: %d, but found %d\n", + total_detectors, detection_points_vector.size()); + return Succeeded::no; + } + + return Succeeded::yes; +} + +//xxx double +double +ScatterEstimationByBin:: +process_data_for_view_segment_num(const ViewSegmentNumbers& vs_num) +{ + Bin bin(vs_num.segment_num(), vs_num.view_num(), 0,0); + double total_scatter = 0; + Viewgram viewgram = + this->output_proj_data_sptr->get_empty_viewgram(bin.view_num(), bin.segment_num()); + + + for (bin.axial_pos_num()=this->proj_data_info_ptr->get_min_axial_pos_num(bin.segment_num()); + bin.axial_pos_num()<=this->proj_data_info_ptr->get_max_axial_pos_num(bin.segment_num()); + ++bin.axial_pos_num()) + { + for (bin.tangential_pos_num()=this->proj_data_info_ptr->get_min_tangential_pos_num(); + bin.tangential_pos_num()<=this->proj_data_info_ptr->get_max_tangential_pos_num(); + ++bin.tangential_pos_num()) + { + + unsigned det_num_A = 0; // initialise to avoid compiler warnings + unsigned det_num_B = 0; + this->find_detectors(det_num_A, det_num_B, bin); + + const double scatter_ratio = + scatter_estimate(det_num_A, det_num_B); + + viewgram[bin.axial_pos_num()][bin.tangential_pos_num()] = + static_cast(scatter_ratio); + + total_scatter += scatter_ratio; + + } + } // end loop over axial_pos + + if (this->output_proj_data_sptr->set_viewgram(viewgram) == Succeeded::no) + error("ScatterEstimationByBin: error writing viewgram"); + + return static_cast(viewgram.sum()); +} + + +void +ScatterEstimationByBin:: +write_log(const double simulation_time, + const float total_scatter) +{ + + std::string log_filename = + this->output_proj_data_filename + ".log"; + std::ofstream mystream(log_filename.c_str()); + if(!mystream) + { + warning("Cannot open log file '%s'", log_filename.c_str()) ; + return; + } + int axial_bins = 0 ; + for (int segment_num=this->output_proj_data_sptr->get_min_segment_num(); + segment_num<=this->output_proj_data_sptr->get_max_segment_num(); + ++segment_num) + axial_bins += this->output_proj_data_sptr->get_num_axial_poss(segment_num); + const int total_bins = + this->output_proj_data_sptr->get_num_views() * axial_bins * + this->output_proj_data_sptr->get_num_tangential_poss(); + + mystream << this->parameter_info() + << "\nTotal simulation time elapsed: " + << simulation_time/60 << "min" + << "\nTotal Scatter Points : " << scatt_points_vector.size() + << "\nTotal Scatter Counts : " << total_scatter + << "\nActivity image SIZE: " + << (*this->activity_image_sptr).size() << " * " + << (*this->activity_image_sptr)[0].size() << " * " // TODO relies on 0 index + << (*this->activity_image_sptr)[0][0].size() + << "\nAttenuation image SIZE: " + << (*this->density_image_sptr).size() << " * " + << (*this->density_image_sptr)[0].size() << " * " + << (*this->density_image_sptr)[0][0].size() + << "\nTotal bins : " << total_bins << " = " + << this->output_proj_data_sptr->get_num_views() + << " view_bins * " + << axial_bins << " axial_bins * " + << this->output_proj_data_sptr->get_num_tangential_poss() + << " tangential_bins\n"; +} + +END_NAMESPACE_STIR + diff --git a/src/scatter_buildblock/cached_single_scatter_integrals.cxx b/src/scatter_buildblock/cached_single_scatter_integrals.cxx new file mode 100644 index 0000000000..325a5607bd --- /dev/null +++ b/src/scatter_buildblock/cached_single_scatter_integrals.cxx @@ -0,0 +1,141 @@ +/* + Copyright (C) 2004-2009, Hammersmith Imanet Ltd + Copyright (C) 2013 University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Implementations of functions defined in stir::ScatterEstimationByBin + + Functions calculate the integral along LOR in an image (attenuation or emission). + (from scatter point to detector coordinate). + + \author Charalampos Tsoumpas + \author Nikolaos Dikaios + \author Kris Thielemans +*/ +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/IndexRange.h" +#include "stir/Coordinate2D.h" + +START_NAMESPACE_STIR + +const float cache_init_value = -1234567.89E10F; // an arbitrary value that should never occur + +void +ScatterEstimationByBin:: +remove_cache_for_integrals_over_attenuation() +{ + this->cached_attenuation_integral_scattpoint_det.recycle(); +} + +void +ScatterEstimationByBin:: +remove_cache_for_integrals_over_activity() +{ + this->cached_activity_integral_scattpoint_det.recycle(); +} + + +void +ScatterEstimationByBin:: +initialise_cache_for_scattpoint_det_integrals_over_attenuation() +{ + if (!this->use_cache) + return; + + const IndexRange<2> range (Coordinate2D (0,0), + Coordinate2D (static_cast(this->scatt_points_vector.size()-1), + this->total_detectors-1)); + if (this->cached_attenuation_integral_scattpoint_det.get_index_range() == range) + return; // keep cache if correct size + + this->cached_attenuation_integral_scattpoint_det.resize(range); + this->cached_attenuation_integral_scattpoint_det.fill(cache_init_value); +} + +void +ScatterEstimationByBin:: +initialise_cache_for_scattpoint_det_integrals_over_activity() +{ + if (!this->use_cache) + return; + + const IndexRange<2> range (Coordinate2D (0,0), + Coordinate2D (static_cast(this->scatt_points_vector.size()-1), + this->total_detectors-1)); + + if (this->cached_activity_integral_scattpoint_det.get_index_range() == range) + return; // keep cache if correct size + + this->cached_activity_integral_scattpoint_det.resize(range); + this->cached_activity_integral_scattpoint_det.fill(cache_init_value); +} + +float +ScatterEstimationByBin:: +cached_integral_over_activity_image_between_scattpoint_det(const unsigned scatter_point_num, + const unsigned det_num) +{ + float * location_in_cache = + this->use_cache + ? &cached_activity_integral_scattpoint_det[scatter_point_num][det_num] + : 0; + + if (this->use_cache && *location_in_cache!=cache_init_value) + { + return *location_in_cache; + } + else + { + const float result = + integral_over_activity_image_between_scattpoint_det + (scatt_points_vector[scatter_point_num].coord, + detection_points_vector[det_num] + ); + if (this->use_cache) + *location_in_cache=result; + return result; + } +} + +float +ScatterEstimationByBin:: +cached_exp_integral_over_attenuation_image_between_scattpoint_det(const unsigned scatter_point_num, + const unsigned det_num) +{ + float * location_in_cache = + this->use_cache + ? &cached_attenuation_integral_scattpoint_det[scatter_point_num][det_num] + : 0; + + if (this->use_cache && *location_in_cache!=cache_init_value) + { + return *location_in_cache; + } + else + { + const float result = + exp_integral_over_attenuation_image_between_scattpoint_det + (scatt_points_vector[scatter_point_num].coord, + detection_points_vector[det_num] + ); + if (this->use_cache) + *location_in_cache=result; + return result; + } +} + +END_NAMESPACE_STIR diff --git a/src/scatter_buildblock/lib.mk b/src/scatter_buildblock/lib.mk new file mode 100644 index 0000000000..32b0e0b67a --- /dev/null +++ b/src/scatter_buildblock/lib.mk @@ -0,0 +1,18 @@ + +# +# + +dir := scatter_buildblock +$(dir)_LIB_SOURCES:= \ + sample_scatter_points.cxx \ + single_scatter_estimate.cxx \ + single_scatter_integrals.cxx \ + scatter_detection_modelling.cxx \ + cached_single_scatter_integrals.cxx \ + scatter_estimate_for_one_scatter_point.cxx \ + upsample_and_fit_scatter_estimate.cxx \ + ScatterEstimationByBin.cxx + +#$(dir)_REGISTRY_SOURCES:= scatter_buildblock_registries.cxx + +include $(WORKSPACE)/lib.mk diff --git a/src/scatter_buildblock/sample_scatter_points.cxx b/src/scatter_buildblock/sample_scatter_points.cxx new file mode 100644 index 0000000000..efa28dd143 --- /dev/null +++ b/src/scatter_buildblock/sample_scatter_points.cxx @@ -0,0 +1,99 @@ +/* + Copyright (C) 2004- 2010-10-15, Hammersmith Imanet Ltd + Copyright (C) 2011 Kris Thielemans + Copyright (C) 2013 University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Implementation of stir::ScatterEstimationByBin::sample_scatter_points + + \author Charalampos Tsoumpas + \author Pablo Aguiar + \author Kris Thielemans +*/ + +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include + +using namespace std; +START_NAMESPACE_STIR + +static inline float random_point(const float low, const float high) +{ + /* returns a pseudo random number which holds in the bounds low and high */ + const float result= (rand()*(high-low))/RAND_MAX + low; + assert(low <= result); + assert(high >= result); + return result; +} + +void +ScatterEstimationByBin:: +sample_scatter_points() +{ + + const DiscretisedDensityOnCartesianGrid<3,float>& attenuation_map = + dynamic_cast& > + (*this->density_image_for_scatter_points_sptr); + + BasicCoordinate<3,int> min_index, max_index ; + CartesianCoordinate3D coord; + if(!this->density_image_for_scatter_points_sptr->get_regular_range(min_index, max_index)) + error("scatter points sampling works only on regular ranges, at the moment\n"); + const VoxelsOnCartesianGrid& image = + dynamic_cast&>(attenuation_map); + const CartesianCoordinate3D voxel_size = image.get_voxel_size(); + CartesianCoordinate3D origin = image.get_origin(); + // shift origin such that we refer to the middle of the scanner + // this is to be consistent with projector conventions + // TODO use class function once it exists + const float z_to_middle = + (image.get_max_index() + image.get_min_index())*voxel_size.z()/2.F; + origin.z() -= z_to_middle; + + this->scatter_volume = voxel_size[1]*voxel_size[2]*voxel_size[3]; + + if(this->random) + { // Initialize Pseudo Random Number generator using time + srand((unsigned)time( NULL )); + } + this->scatt_points_vector.resize(0); // make sure we don't keep scatter points from a previous run + this->scatt_points_vector.reserve(1000); + + // coord[] is in voxels units + for(coord[1]=min_index[1];coord[1]<=max_index[1];++coord[1]) + for(coord[2]=min_index[2];coord[2]<=max_index[2];++coord[2]) + for(coord[3]=min_index[3];coord[3]<=max_index[3];++coord[3]) + if(attenuation_map[coord] >= this->attenuation_threshold) + { + ScatterPoint scatter_point; + scatter_point.coord = convert_int_to_float(coord); + if (random) + scatter_point.coord += + CartesianCoordinate3D(random_point(-.5,.5), + random_point(-.5,.5), + random_point(-.5,.5)); + scatter_point.coord = + voxel_size*scatter_point.coord + origin; + scatter_point.mu_value = attenuation_map[coord]; + this->scatt_points_vector.push_back(scatter_point); + } + this->remove_cache_for_integrals_over_activity(); + this->remove_cache_for_integrals_over_attenuation(); +} +END_NAMESPACE_STIR diff --git a/src/scatter_buildblock/scatter_detection_modelling.cxx b/src/scatter_buildblock/scatter_detection_modelling.cxx new file mode 100644 index 0000000000..c5071f2247 --- /dev/null +++ b/src/scatter_buildblock/scatter_detection_modelling.cxx @@ -0,0 +1,164 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Implementations of detection modelling in stir::ScatterEstimationByBin + + \author Charalampos Tsoumpas + \author Pablo Aguiar + \author Nikolaos Dikaios + \author Kris Thielemans + +*/ + +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/numerics/erf.h" +#include + +START_NAMESPACE_STIR +unsigned +ScatterEstimationByBin:: +find_in_detection_points_vector(const CartesianCoordinate3D& coord) const +{ + std::vector >::const_iterator iter= + std::find(detection_points_vector.begin(), + detection_points_vector.end(), + coord); + if (iter != detection_points_vector.end()) + { + return iter-detection_points_vector.begin(); + } + else + { + if (detection_points_vector.size()==static_cast(this->total_detectors)) + error("More detection points than we think there are!\n"); + + detection_points_vector.push_back(coord); + return detection_points_vector.size()-1; + } +} + +void +ScatterEstimationByBin:: +find_detectors(unsigned& det_num_A, unsigned& det_num_B, const Bin& bin) const +{ + CartesianCoordinate3D detector_coord_A, detector_coord_B; + this->proj_data_info_ptr-> + find_cartesian_coordinates_of_detection( + detector_coord_A,detector_coord_B,bin); + det_num_A = + this->find_in_detection_points_vector(detector_coord_A + + this->shift_detector_coordinates_to_origin); + det_num_B = + this->find_in_detection_points_vector(detector_coord_B + + this->shift_detector_coordinates_to_origin); +} + +float +ScatterEstimationByBin:: +compute_emis_to_det_points_solid_angle_factor( + const CartesianCoordinate3D& emis_point, + const CartesianCoordinate3D& detector_coord) +{ + + const CartesianCoordinate3D dist_vector = emis_point - detector_coord ; + + + const float dist_emis_det_squared = norm_squared(dist_vector); + + const float emis_det_solid_angle_factor = 1.F/ dist_emis_det_squared ; + + return emis_det_solid_angle_factor ; +} + +float +ScatterEstimationByBin:: +detection_efficiency(const float energy) const +{ + // factor 2.35482 is used to convert FWHM to sigma + const float sigma_times_sqrt2= + sqrt(2.*energy*this->reference_energy)*this->energy_resolution/2.35482; // 2.35482=2 * sqrt( 2 * ( log(2) ) + + // sigma_times_sqrt2= sqrt(2) * sigma // resolution proportional to FWHM + + const float efficiency = + 0.5*( erf((this->upper_energy_threshold-energy)/sigma_times_sqrt2) + - erf((this->lower_energy_threshold-energy)/sigma_times_sqrt2 )); + /* Maximum efficiency is 1.*/ + return efficiency; +} + +float +ScatterEstimationByBin:: +max_cos_angle(const float low, const float approx, const float resolution_at_511keV) +{ + return + 2. - (8176.*log(2.))/(square(approx*resolution_at_511keV)*(511. + (16.*low*log(2.))/square(approx*resolution_at_511keV) - + sqrt(511.)*sqrt(511. + (32.*low*log(2.))/square(approx*resolution_at_511keV)))) ; +} + + +float +ScatterEstimationByBin:: +energy_lower_limit(const float low, const float approx, const float resolution_at_511keV) +{ + return + low + (approx*resolution_at_511keV)*(approx*resolution_at_511keV)*(46.0761 - 2.03829*sqrt(22.1807*low/square(approx*resolution_at_511keV)+511.)); +} + +double +ScatterEstimationByBin:: +detection_efficiency_no_scatter(const unsigned det_num_A, + const unsigned det_num_B) const +{ + // TODO: slightly dangerous to use a static here + // it would give wrong results when the energy_thresholds are changed... + static const float detector_efficiency_no_scatter = + detection_efficiency(511.F) > 0 + ? detection_efficiency(511.F) + : (std::cerr << "Zero detection efficiency for 511. Will normalise to 1\n", 1.F); + + const CartesianCoordinate3D& detector_coord_A = + detection_points_vector[det_num_A]; + const CartesianCoordinate3D& detector_coord_B = + detection_points_vector[det_num_B]; + const CartesianCoordinate3D + detA_to_ring_center(0,-detector_coord_A[2],-detector_coord_A[3]); + const CartesianCoordinate3D + detB_to_ring_center(0,-detector_coord_B[2],-detector_coord_B[3]); + const float rAB_squared=norm_squared(detector_coord_A-detector_coord_B); + const float cos_incident_angle_A = + cos_angle(detector_coord_B - detector_coord_A, + detA_to_ring_center) ; + const float cos_incident_angle_B = + cos_angle(detector_coord_A - detector_coord_B, + detB_to_ring_center) ; + + //0.75 is due to the volume of the pyramid approximation! + return + 1./( 0.75/2./_PI * + rAB_squared + /detector_efficiency_no_scatter/ + (cos_incident_angle_A* + cos_incident_angle_B)); +} + +END_NAMESPACE_STIR diff --git a/src/scatter_buildblock/scatter_estimate_for_one_scatter_point.cxx b/src/scatter_buildblock/scatter_estimate_for_one_scatter_point.cxx new file mode 100644 index 0000000000..e0a1751851 --- /dev/null +++ b/src/scatter_buildblock/scatter_estimate_for_one_scatter_point.cxx @@ -0,0 +1,149 @@ +// +// +/* + Copyright (C) 2004- 2009-11-03, Hammersmith Imanet + Copyright (C) 2011-07-01 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Implementation of stir::ScatterEstimationByBin::single_scatter_estimate_for_one_scatter_point + + \author Charalampos Tsoumpas + \author Pablo Aguiar + \author Kris Thielemans + + +*/ +#include "stir/scatter/ScatterEstimationByBin.h" +#ifndef NDEBUG +// currently necessary for assert below +#include "stir/VoxelsOnCartesianGrid.h" +#endif + +#include "stir/round.h" +#include +using namespace std; +START_NAMESPACE_STIR + +static const float total_Compton_cross_section_511keV = +ScatterEstimationByBin:: + total_Compton_cross_section(511.F); + +float +ScatterEstimationByBin:: + single_scatter_estimate_for_one_scatter_point( + const std::size_t scatter_point_num, + const unsigned det_num_A, + const unsigned det_num_B) +{ + static const float max_single_scatter_cos_angle=max_cos_angle(lower_energy_threshold,2.,energy_resolution); + + //static const float min_energy=energy_lower_limit(lower_energy_threshold,2.,energy_resolution); + + const CartesianCoordinate3D& scatter_point = + scatt_points_vector[scatter_point_num].coord; + const CartesianCoordinate3D& detector_coord_A = + detection_points_vector[det_num_A]; + const CartesianCoordinate3D& detector_coord_B = + detection_points_vector[det_num_B]; + // note: costheta is -cos_angle such that it is 1 for zero scatter angle + const float costheta = + -cos_angle(detector_coord_A - scatter_point, + detector_coord_B - scatter_point); + // note: costheta is identical for scatter to A or scatter to B + // Hence, the Compton_cross_section and energy are identical for both cases as well. + if(max_single_scatter_cos_angle>costheta) + return 0; + const float new_energy = + photon_energy_after_Compton_scatter_511keV(costheta); + + const float detection_efficiency_scatter = + detection_efficiency(new_energy); + if (detection_efficiency_scatter==0) + return 0; + + const float emiss_to_detA = + cached_integral_over_activity_image_between_scattpoint_det + (scatter_point_num, + det_num_A); + const float emiss_to_detB = + cached_integral_over_activity_image_between_scattpoint_det + (scatter_point_num, + det_num_B); + if (emiss_to_detA==0 && emiss_to_detB==0) + return 0; + const float atten_to_detA = + cached_exp_integral_over_attenuation_image_between_scattpoint_det + (scatter_point_num, + det_num_A); + const float atten_to_detB = + cached_exp_integral_over_attenuation_image_between_scattpoint_det + (scatter_point_num, + det_num_B); + + const float dif_Compton_cross_section_value = + dif_Compton_cross_section(costheta, 511.F); + + const float rA_squared=norm_squared(scatter_point-detector_coord_A); + const float rB_squared=norm_squared(scatter_point-detector_coord_B); + + const float scatter_point_mu= + scatt_points_vector[scatter_point_num].mu_value; + +#ifndef NDEBUG + { + // check if mu-value ok + // currently terribly shift needed as in sample_scatter_points (TODO) + const VoxelsOnCartesianGrid& image = + dynamic_cast&>(*this->density_image_for_scatter_points_sptr); + const CartesianCoordinate3D voxel_size = image.get_voxel_size(); + const float z_to_middle = + (image.get_max_index() + image.get_min_index())*voxel_size.z()/2.F; + CartesianCoordinate3D shifted=scatter_point; + shifted.z() += z_to_middle; + assert(scatter_point_mu== + (*this->density_image_for_scatter_points_sptr)[this->density_image_for_scatter_points_sptr->get_indices_closest_to_physical_coordinates(shifted)]); + } +#endif + + float scatter_ratio=0 ; + + scatter_ratio= + (emiss_to_detA*(1.F/rB_squared)*pow(atten_to_detB,total_Compton_cross_section_relative_to_511keV(new_energy)-1) + +emiss_to_detB*(1.F/rA_squared)*pow(atten_to_detA,total_Compton_cross_section_relative_to_511keV(new_energy)-1)) + *atten_to_detB + *atten_to_detA + *scatter_point_mu + *detection_efficiency_scatter; + + + const CartesianCoordinate3D + detA_to_ring_center(0,-detector_coord_A[2],-detector_coord_A[3]); + const CartesianCoordinate3D + detB_to_ring_center(0,-detector_coord_B[2],-detector_coord_B[3]); + const float cos_incident_angle_AS = + cos_angle(scatter_point - detector_coord_A, + detA_to_ring_center) ; + const float cos_incident_angle_BS = + cos_angle(scatter_point - detector_coord_B, + detB_to_ring_center) ; + + return scatter_ratio*cos_incident_angle_AS*cos_incident_angle_BS*dif_Compton_cross_section_value; + +} + +END_NAMESPACE_STIR diff --git a/src/scatter_buildblock/single_scatter_estimate.cxx b/src/scatter_buildblock/single_scatter_estimate.cxx new file mode 100644 index 0000000000..e3c79aeb86 --- /dev/null +++ b/src/scatter_buildblock/single_scatter_estimate.cxx @@ -0,0 +1,87 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Implementations of stir::ScatterEstimationByBin::scatter_estimate and stir::ScatterEstimationByBin::single_scatter_estimate + + \author Charalampos Tsoumpas + \author Pablo Aguiar + \author Kris Thielemans + +*/ + +#include "stir/scatter/ScatterEstimationByBin.h" +using namespace std; +START_NAMESPACE_STIR +static const float total_Compton_cross_section_511keV = +ScatterEstimationByBin:: + total_Compton_cross_section(511.F); + + +double +ScatterEstimationByBin:: +scatter_estimate(const unsigned det_num_A, + const unsigned det_num_B) +{ + double scatter_ratio_singles = 0; + + this->single_scatter_estimate(scatter_ratio_singles, + det_num_A, + det_num_B); + + return scatter_ratio_singles; +} + +void +ScatterEstimationByBin:: +single_scatter_estimate(double& scatter_ratio_singles, + const unsigned det_num_A, + const unsigned det_num_B) +{ + + scatter_ratio_singles = 0; + + for(std::size_t scatter_point_num =0; + scatter_point_num < scatt_points_vector.size(); + ++scatter_point_num) + { + scatter_ratio_singles += + single_scatter_estimate_for_one_scatter_point( + scatter_point_num, + det_num_A, det_num_B); + + } + + // we will divide by the effiency of the detector pair for unscattered photons + // (computed with the same detection model as used in the scatter code) + // This way, the scatter estimate will correspond to a 'normalised' scatter estimate. + + // there is a scatter_volume factor for every scatter point, as the sum over scatter points + // is an approximation for the integral over the scatter point. + + // the factors total_Compton_cross_section_511keV should probably be moved to the scatter_computation code + const double common_factor = + 1/detection_efficiency_no_scatter(det_num_A, det_num_B) * + scatter_volume/total_Compton_cross_section_511keV; + + scatter_ratio_singles *= common_factor; +} + +END_NAMESPACE_STIR diff --git a/src/scatter_buildblock/single_scatter_integrals.cxx b/src/scatter_buildblock/single_scatter_integrals.cxx new file mode 100644 index 0000000000..4410f308b1 --- /dev/null +++ b/src/scatter_buildblock/single_scatter_integrals.cxx @@ -0,0 +1,145 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup scatter + \brief Implementations of integrating functions in stir::ScatterEstimationByBin + + Functions calculates the integral along LOR in an image (attenuation or emission). + (from scatter point to detector coordinate) + + \author Pablo Aguiar + \author Charalampos Tsoumpas + \author Kris Thielemans + + */ +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/recon_buildblock/ProjMatrixElemsForOneBin.h" +#include "stir/recon_buildblock/RayTraceVoxelsOnCartesianGrid.h" +START_NAMESPACE_STIR + +float +ScatterEstimationByBin:: +exp_integral_over_attenuation_image_between_scattpoint_det (const CartesianCoordinate3D& scatter_point, + const CartesianCoordinate3D& detector_coord) +{ +#ifndef NEWSCALE + /* projectors work in pixel units, so convert attenuation data + from cm^-1 to pixel_units^-1 */ + const float rescale = + dynamic_cast &>(*density_image_sptr). + get_grid_spacing()[3]/10; +#else + const float rescale = + 0.1F; +#endif + + return + exp(-rescale* + integral_between_2_points(*density_image_sptr, + scatter_point, + detector_coord) + ); +} + + +float +ScatterEstimationByBin:: +integral_over_activity_image_between_scattpoint_det (const CartesianCoordinate3D& scatter_point, + const CartesianCoordinate3D& detector_coord) +{ + { + const CartesianCoordinate3D dist_vector = scatter_point - detector_coord ; + + const float dist_sp1_det_squared = norm_squared(dist_vector); + + const float solid_angle_factor = + std::min(static_cast(_PI/2), 1.F / dist_sp1_det_squared) ; + + return + solid_angle_factor * + integral_between_2_points(*activity_image_sptr, + scatter_point, + detector_coord); + } +} + +float +ScatterEstimationByBin:: +integral_between_2_points(const DiscretisedDensity<3,float>& density, + const CartesianCoordinate3D& scatter_point, + const CartesianCoordinate3D& detector_coord) +{ + + + const VoxelsOnCartesianGrid& image = + dynamic_cast& > + (density); + + const CartesianCoordinate3D voxel_size = image.get_grid_spacing(); + + CartesianCoordinate3D origin = + image.get_origin(); + const float z_to_middle = + (image.get_max_index() + image.get_min_index())*voxel_size.z()/2.F; + origin.z() -= z_to_middle; + /* TODO replace with image.get_index_coordinates_for_physical_coordinates */ + ProjMatrixElemsForOneBin lor; + RayTraceVoxelsOnCartesianGrid(lor, + (scatter_point-origin)/voxel_size, // should be in voxel units + (detector_coord-origin)/voxel_size, // should be in voxel units + voxel_size, //should be in mm +#ifdef NEWSCALE + 1.F // normalise to mm +#else + 1/voxel_size.x() // normalise to some kind of 'pixel units' +#endif + ); + lor.sort(); + float sum = 0; // add up values along LOR + { + ProjMatrixElemsForOneBin::iterator element_ptr =lor.begin() ; + bool we_have_been_within_the_image = false; + while (element_ptr != lor.end()) + { + const BasicCoordinate<3,int> coords = element_ptr->get_coords(); + if (coords[1] >= image.get_min_index() && + coords[1] <= image.get_max_index() && + coords[2] >= image[coords[1]].get_min_index() && + coords[2] <= image[coords[1]].get_max_index() && + coords[3] >= image[coords[1]][coords[2]].get_min_index() && + coords[3] <= image[coords[1]][coords[2]].get_max_index()) + { + we_have_been_within_the_image = true; + sum += image[coords] * element_ptr->get_value(); + } + else if (we_have_been_within_the_image) + { + // we jump out of the loop as we are now at the other side of + // the image + // break; + } + ++element_ptr; + } + } + return sum; +} +END_NAMESPACE_STIR + diff --git a/src/scatter_buildblock/upsample_and_fit_scatter_estimate.cxx b/src/scatter_buildblock/upsample_and_fit_scatter_estimate.cxx new file mode 100644 index 0000000000..0c8a15b34f --- /dev/null +++ b/src/scatter_buildblock/upsample_and_fit_scatter_estimate.cxx @@ -0,0 +1,112 @@ +/* + Copyright (C) 2005 - 2011-12-31, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! +\file +\ingroup scatter +\brief implementation of stir::ScatterEstimationByBin::upsample_and_fit_scatter_estimate + +\author Charalampos Tsoumpas +\author Kris Thielemans +*/ + +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInMemory.h" +#include "stir/inverse_SSRB.h" +#include "stir/scale_sinograms.h" +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/interpolate_projdata.h" +#include "stir/utilities.h" +#include "stir/IndexRange2D.h" +#include "stir/stream.h" +#include "stir/Succeeded.h" +#include "stir/thresholding.h" +#include "stir/is_null_ptr.h" +#include "stir/ArrayFilter1DUsingConvolution.h" +#include +#include +#include +/***********************************************************/ + +START_NAMESPACE_STIR + +void +ScatterEstimationByBin:: +upsample_and_fit_scatter_estimate(ProjData& scaled_scatter_proj_data, + const ProjData& emission_proj_data, + const ProjData& scatter_proj_data, + const ProjData& weights_proj_data, + const float min_scale_factor, + const float max_scale_factor, + const unsigned half_filter_width, + BSpline::BSplineType spline_type, + const bool remove_interleaving) +{ + shared_ptr + interpolated_direct_scatter_proj_data_info_sptr(emission_proj_data.get_proj_data_info_ptr()->clone()); + interpolated_direct_scatter_proj_data_info_sptr->reduce_segment_range(0,0); + + std::cout << "Interpolating scatter estimate to size of emission data" << std::endl; + ProjDataInMemory interpolated_direct_scatter(emission_proj_data.get_exam_info_sptr(), + interpolated_direct_scatter_proj_data_info_sptr); + interpolate_projdata(interpolated_direct_scatter, scatter_proj_data, spline_type, remove_interleaving); + + if (min_scale_factor != 1 || max_scale_factor != 1) + { + ProjDataInMemory interpolated_scatter(emission_proj_data.get_exam_info_sptr(), + emission_proj_data.get_proj_data_info_ptr()->create_shared_clone()); + inverse_SSRB(interpolated_scatter, interpolated_direct_scatter); + + Array<2,float> scale_factors; + + std::cout << "Finding scale factors by sinogram" << std::endl; + scale_factors = get_scale_factors_per_sinogram( + emission_proj_data, + interpolated_scatter, + weights_proj_data); + + std::cout << scale_factors; + threshold_lower(scale_factors.begin_all(), + scale_factors.end_all(), + min_scale_factor); + threshold_upper(scale_factors.begin_all(), + scale_factors.end_all(), + max_scale_factor); + std::cout << "After thresholding:\n"; + std::cout << scale_factors; + VectorWithOffset kernel(-static_cast(half_filter_width),half_filter_width); + kernel.fill(1.F/(2*half_filter_width+1)); + ArrayFilter1DUsingConvolution lowpass_filter(kernel, BoundaryConditions::constant); + std::for_each(scale_factors.begin(), + scale_factors.end(), + lowpass_filter); + std::cout << "After filtering:\n"; + std::cout << scale_factors; + std::cout << "applying scale factors" << std::endl; + if (scale_sinograms(scaled_scatter_proj_data, + interpolated_scatter, + scale_factors) != Succeeded::yes) + { + error("writing of scaled sinograms failed"); + } + } + else // min/max_scale_factor equal to 1 + { + inverse_SSRB(scaled_scatter_proj_data, interpolated_direct_scatter); + } +} + +END_NAMESPACE_STIR diff --git a/src/scatter_utilities/CMakeLists.txt b/src/scatter_utilities/CMakeLists.txt new file mode 100644 index 0000000000..12cc471025 --- /dev/null +++ b/src/scatter_utilities/CMakeLists.txt @@ -0,0 +1,30 @@ +# +# +# Copyright 2011-07-01 - 2011 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. +set(dir scatter_utilities) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + estimate_scatter + create_tail_mask_from_ACFs + upsample_and_fit_single_scatter +) + +include(stir_exe_targets) diff --git a/src/scatter_utilities/create_tail_mask_from_ACFs.cxx b/src/scatter_utilities/create_tail_mask_from_ACFs.cxx new file mode 100644 index 0000000000..aac272bfd5 --- /dev/null +++ b/src/scatter_utilities/create_tail_mask_from_ACFs.cxx @@ -0,0 +1,210 @@ +/* + Copyright (C) 2005 - 2011-12-31, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \ingroup scatter + \brief Compute a mask for the "tails" in the sinogram + + This computes the outer part of the projection data that + does not receive any (unscattered) contributions from inside the body. + Its normal input is a projection data with attenuation-correction factors + (ACFs). We take a threshold as parameter (which should be a bit larger + than 1). Along each line in the sinogram, we search from the edges + until we find the first bin above the threshold. We then go back a + few bins (as set by \a safety-margin). All bins from the edge until + this point are included in the mask. + + \author Kris Thielemans + + \par Usage: + + \verbatim + create_tail_mask_from_ACFs --ACF-filename \\ + --output-filename \\ + [--ACF-threshold ] \\ + [--safety-margin ] + \endverbatim + ACF-threshold defaults to 1.1 (should be larger than 1), safety-margin to 4 +*/ + +#include "stir/ProjDataInfo.h" +#include "stir/Sinogram.h" +#include "stir/ProjDataInterfile.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/Bin.h" +#include "boost/lambda/lambda.hpp" +#include +#include +#include + + +/***********************************************************/ + +static void +print_usage_and_exit(const char * const prog_name) +{ + std::cerr << "\nUsage:\n" << prog_name << "\n" + << "\t--ACF-filename \n" + << "\t--output-filename \n" + << "\t[--ACF-threshold ]\n" + << "\t[--safety-margin ]\n" + << "ACF-threshold defaults to 1.1, safety-margin to 4\n"; + exit(EXIT_FAILURE); +} + +int main(int argc, const char *argv[]) +{ + USING_NAMESPACE_STIR; + const char * const prog_name = argv[0]; + + // option processing + float ACF_threshold = 1.1F; + int safety_margin=4; + std::string ACF_filename; + std::string output_filename; + while (argc>2 && argv[1][1] == '-') + { + if (strcmp(argv[1], "--ACF-filename")==0) + { + ACF_filename = (argv[2]); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--output-filename")==0) + { + output_filename = (argv[2]); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--ACF-threshold")==0) + { + ACF_threshold = float(atof(argv[2])); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--safety-margin")==0) + { + safety_margin = atoi(argv[2]); + argc-=2; argv +=2; + } + else + { + std::cerr << "\nUnknown option: " << argv[1]; + print_usage_and_exit(prog_name); + } + } + + if (argc!=1 || ACF_filename.size()==0 || output_filename.size()==0) + { + print_usage_and_exit(prog_name); + } + if (ACF_threshold<=1) + error("ACF-threshold should be larger than 1"); + + std::cout << "\nACF-threshold: " << ACF_threshold << " safety-margin : " << safety_margin << std::endl; + + + shared_ptr< ProjData > + ACF_sptr(ProjData::read_from_file(ACF_filename)); + + if (is_null_ptr(ACF_sptr)) + error("Check the attenuation_correct_factors file"); + + ProjDataInterfile mask_proj_data(ACF_sptr->get_exam_info_sptr(), + ACF_sptr->get_proj_data_info_ptr()->create_shared_clone(), + output_filename); + + Bin bin; + { + for (bin.segment_num()=mask_proj_data.get_min_segment_num(); + bin.segment_num()<=mask_proj_data.get_max_segment_num(); + ++bin.segment_num()) + for (bin.axial_pos_num()= + mask_proj_data.get_min_axial_pos_num(bin.segment_num()); + bin.axial_pos_num()<=mask_proj_data.get_max_axial_pos_num(bin.segment_num()); + ++bin.axial_pos_num()) + { + const Sinogram att_sinogram + (ACF_sptr->get_sinogram(bin.axial_pos_num(),bin.segment_num())); + Sinogram mask_sinogram + (mask_proj_data.get_empty_sinogram(bin.axial_pos_num(),bin.segment_num())); + + std::size_t count=0; + for (bin.view_num()=mask_proj_data.get_min_view_num(); + bin.view_num()<=mask_proj_data.get_max_view_num(); + ++bin.view_num()) + { +#ifdef SCFOLD + for (bin.tangential_pos_num()= + mask_proj_data.get_min_tangential_pos_num(); + bin.tangential_pos_num()<= + mask_proj_data.get_max_tangential_pos_num(); + ++bin.tangential_pos_num()) + if (att_sinogram[bin.view_num()][bin.tangential_pos_num()]= std::fabs(scatter_proj_data.get_proj_data_info_ptr()->get_s(bin)))) + { + ++count; + mask_sinogram[bin.view_num()][bin.tangential_pos_num()]=1; + } + else + mask_sinogram[bin.view_num()][bin.tangential_pos_num()]=0; +#else + const Array<1,float>& att_line=att_sinogram[bin.view_num()]; + + using boost::lambda::_1; + + // find left and right mask sizes + // sorry: a load of ugly casting to make sure we allow all datatypes + std::size_t mask_left_size = + static_cast( + std::max(0, + static_cast + (std::find_if(att_line.begin(), att_line.end(), + _1>=ACF_threshold) - + att_line.begin()) - + safety_margin) + ); + std::size_t mask_right_size = + static_cast( + std::max(0, + static_cast + (std::find_if(att_line.rbegin(), att_line.rend() - mask_left_size, + _1>=ACF_threshold) - + att_line.rbegin()) - + safety_margin) + ); +#if 0 + std::cout << "mask sizes " << mask_left_size << ", " << mask_right_size << '\n'; +#endif + std::fill(mask_sinogram[bin.view_num()].begin(), + mask_sinogram[bin.view_num()].begin() + mask_left_size, + 1.F); + std::fill(mask_sinogram[bin.view_num()].rbegin(), + mask_sinogram[bin.view_num()].rbegin() + mask_right_size, + 1.F); + count += mask_left_size + mask_right_size; +#endif + } + std::cout << count << " bins in mask for sinogram at segment " + << bin.segment_num() << ", axial_pos " << bin.axial_pos_num() << "\n"; + if (mask_proj_data.set_sinogram(mask_sinogram) != Succeeded::yes) + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} diff --git a/src/scatter_utilities/estimate_scatter.cxx b/src/scatter_utilities/estimate_scatter.cxx new file mode 100644 index 0000000000..dc913d3bc5 --- /dev/null +++ b/src/scatter_utilities/estimate_scatter.cxx @@ -0,0 +1,57 @@ +// +// +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \ingroup scatter + \brief Estimates a coarse scatter sinogram + + \author Kris Thielemans + + + \par Usage: + \code + estimate_scatter parfile + \endcode + See stir::ScatterEstimationByBin documentation for the format + of the parameter file. +*/ + +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/Succeeded.h" +/***********************************************************/ + +int main(int argc, const char *argv[]) +{ + stir::ScatterEstimationByBin scatter_estimation; + + if (argc==2) + { + if (scatter_estimation.parse(argv[1]) == false) + return EXIT_FAILURE; + } + else + scatter_estimation.ask_parameters(); + + return scatter_estimation.process_data() == stir::Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; + + +} + diff --git a/src/scatter_utilities/exe.mk b/src/scatter_utilities/exe.mk new file mode 100644 index 0000000000..6c0d2e5607 --- /dev/null +++ b/src/scatter_utilities/exe.mk @@ -0,0 +1,10 @@ +# +# +dir := scatter_utilities + +$(dir)_SOURCES := \ + estimate_scatter.cxx \ + create_tail_mask_from_ACFs.cxx \ + upsample_and_fit_single_scatter.cxx + +include $(WORKSPACE)/exe.mk diff --git a/src/scatter_utilities/upsample_and_fit_single_scatter.cxx b/src/scatter_utilities/upsample_and_fit_single_scatter.cxx new file mode 100644 index 0000000000..4b4ef0157a --- /dev/null +++ b/src/scatter_utilities/upsample_and_fit_single_scatter.cxx @@ -0,0 +1,175 @@ +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \ingroup scatter + \brief upsample a coarse scatter estimate and fit it to emission data using a weight/mask projection data + + \see ScatterEstimationByBin::upsample_and_fit_scatter_estimate + + \author Charalampos Tsoumpas + \author Kris Thielemans + + \par Usage: + \code + [--min-scale-factor ] + [--max-scale-factor ] + [--remove-interleaving <1|0>] + [--half-filter-width ] + --output-filename + --data-to-fit + --data-to-scale + --weights + \endcode + \a remove_interleaving defaults to 1\, \a min-scale-factor to 1e-5, + and \a max-scale-factor to 1e5. +*/ + +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInterfile.h" +#include "stir/scatter/ScatterEstimationByBin.h" +#include "stir/Succeeded.h" +#include +#include +/***********************************************************/ + +static void +print_usage_and_exit(const char * const prog_name) +{ + std::cerr << "\nUsage:\n" << prog_name << "\\\n" + << "\t[--min-scale-factor ]\\\n" + << "\t[--max-scale-factor ]\\\n" + << "\t[--remove-interleaving <1|0>]\\\n" + << "\t[--half-filter-width ]\\\n" + << "\t--output-filename \\\n" + << "\t--data-to-fit \\\n" + << "\t--data-to-scale \\\n" + << "\t--weights \n" + << "remove_interleaving defaults to 1\n" + << "min-scale-factor to 1e-5, and max scale factor to 1e5\n"; + exit(EXIT_FAILURE); +} + +int main(int argc, const char *argv[]) +{ + const char * const prog_name = argv[0]; + + float min_scale_factor = 1.E-5F; + float max_scale_factor = 1.E5F; + bool remove_interleaving = true; + unsigned int half_filter_width = 1; + stir::BSpline::BSplineType spline_type = stir::BSpline::linear; + std::string data_to_fit_filename; + std::string data_to_scale_filename; + std::string weights_filename; + std::string output_filename; + + // option processing + while (argc>1 && argv[1][1] == '-') + { + if (strcmp(argv[1], "--min-scale-factor")==0) + { + min_scale_factor = static_cast(atof(argv[2])); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--max-scale-factor")==0) + { + max_scale_factor = static_cast(atof(argv[2])); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--BSpline-type")==0) + { + spline_type = (stir::BSpline::BSplineType)atoi(argv[2]); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--half-filter-width")==0) + { + half_filter_width = (unsigned)atoi(argv[2]); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--remove-interleaving")==0) + { + remove_interleaving = atoi(argv[2])!=0; + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--output-filename")==0) + { + output_filename = (argv[2]); + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--data-to-fit")==0) + { + data_to_fit_filename = argv[2]; + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--data-to-scale")==0) + { + data_to_scale_filename = argv[2]; + argc-=2; argv +=2; + } + else if (strcmp(argv[1], "--weights")==0) + { + weights_filename = argv[2]; + argc-=2; argv +=2; + } + else + { + std::cerr << "\nUnknown option: " << argv[1]; + print_usage_and_exit(prog_name); + } + } + + if (argc> 1) + { + std::cerr << "Command line should contain only options\n"; + print_usage_and_exit(prog_name); + } + + if (data_to_fit_filename.size()==0 || data_to_scale_filename.size() == 0 || + weights_filename.size()==0 || output_filename.size()==0) + { + std::cerr << "One of the required filenames has not been specified\n"; + print_usage_and_exit(prog_name); + } + + using stir::ProjData; + const stir::shared_ptr< ProjData > weights_proj_data_sptr = + ProjData::read_from_file(weights_filename); + const stir::shared_ptr data_to_fit_proj_data_sptr = + ProjData::read_from_file(data_to_fit_filename); + const stir::shared_ptr data_to_scale_proj_data_sptr = + ProjData::read_from_file(data_to_scale_filename); + + stir::shared_ptr data_to_fit_proj_data_info_sptr = + data_to_fit_proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone(); + + stir::ProjDataInterfile output_proj_data(data_to_fit_proj_data_sptr->get_exam_info_sptr(), + data_to_fit_proj_data_info_sptr, output_filename); + + stir::ScatterEstimationByBin:: + upsample_and_fit_scatter_estimate(output_proj_data, + *data_to_fit_proj_data_sptr, + *data_to_scale_proj_data_sptr, + *weights_proj_data_sptr, + min_scale_factor, + max_scale_factor, + half_filter_width, + spline_type, + remove_interleaving); + return EXIT_SUCCESS; +} diff --git a/src/spatial_transformation_buildblock/CMakeLists.txt b/src/spatial_transformation_buildblock/CMakeLists.txt new file mode 100644 index 0000000000..98dbf61de7 --- /dev/null +++ b/src/spatial_transformation_buildblock/CMakeLists.txt @@ -0,0 +1,33 @@ +# +# +# Copyright 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. + +set(dir spatial_transformation_buildblock) + +set (dir_LIB_SOURCES ${dir}_LIB_SOURCES) + +set(${dir_LIB_SOURCES} + SpatialTransformation + GatedSpatialTransformation + warp_image +) + +include(stir_lib_target) + +target_link_libraries(${dir} buildblock numerics_buildblock ) diff --git a/src/spatial_transformation_buildblock/GatedSpatialTransformation.cxx b/src/spatial_transformation_buildblock/GatedSpatialTransformation.cxx new file mode 100644 index 0000000000..76009fe9b6 --- /dev/null +++ b/src/spatial_transformation_buildblock/GatedSpatialTransformation.cxx @@ -0,0 +1,305 @@ +// +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup spatial_transformation + \brief Implementations of inline functions of class stir::GatedSpatialTransformation + \author Charalampos Tsoumpas + \sa GatedSpatialTransformation.h and SpatialTransformation.h + +*/ + +#include "stir/spatial_transformation/GatedSpatialTransformation.h" +#include "stir/spatial_transformation/warp_image.h" +#include + +START_NAMESPACE_STIR + +void +GatedSpatialTransformation:: +set_defaults() +{ + base_type::set_defaults(); + this->_transformation_filename_prefix=""; + this->_spline_type=static_cast (1);; +} + +const char * const +GatedSpatialTransformation::registered_name = "Gated Spatial Transformation"; + +//! default constructor +GatedSpatialTransformation::GatedSpatialTransformation() +{ + this->set_defaults(); +} + +GatedSpatialTransformation::~GatedSpatialTransformation() //!< default destructor +{ } + +Succeeded +GatedSpatialTransformation::set_up() +{ + if (this->_spatial_transformations_are_stored==true) + return Succeeded::yes; + else + return Succeeded::no; +} + +const TimeGateDefinitions & +GatedSpatialTransformation::get_time_gate_definitions() const +{ + return this->_spatial_transformation_x.get_time_gate_definitions(); +} + +void +GatedSpatialTransformation:: +initialise_keymap() +{ + base_type::initialise_keymap(); + this->parser.add_start_key("Gated Spatial Transformation Parameters"); + this->parser.add_key("Gated Spatial Transformation Filenames Prefix", &this->_transformation_filename_prefix); + this->parser.add_stop_key("end Gated Spatial Transformation Parameters"); +} + +bool +GatedSpatialTransformation:: +post_processing() +{ + if (base_type::post_processing() == true) + return true; + if(this->_transformation_filename_prefix=="0") + { + warning("You need to specify a prefix for three files with transformation information."); + return true; + } + else + { + GatedSpatialTransformation::read_from_files(this->_transformation_filename_prefix); + this->_spatial_transformations_are_stored=true; + } + // Always linear interpolation for the moment + this->_spline_type=static_cast (1); + return false; +} + +//! Implementation to read the transformation vectors will be moved to the IO directory because it should be general. For example it can be in ECAT7 image formant +void +GatedSpatialTransformation::read_from_files(const std::string input_string) +{ + const std::string gate_defs_input_string=input_string + ".gdef"; + + if (gate_defs_input_string.size()!=0) + this->_gate_defs=TimeGateDefinitions(gate_defs_input_string); + else { + error("No Time Gates Definitions available!!!\n "); + } + + const shared_ptr spatial_transformation_z_sptr (GatedDiscretisedDensity::read_from_files(input_string,"d1")); + const GatedDiscretisedDensity & spatial_transformation_z(*spatial_transformation_z_sptr); + + const shared_ptr spatial_transformation_y_sptr(GatedDiscretisedDensity::read_from_files(input_string,"d2")); + const GatedDiscretisedDensity & spatial_transformation_y(*spatial_transformation_y_sptr); + + const shared_ptr spatial_transformation_x_sptr (GatedDiscretisedDensity::read_from_files(input_string,"d3")); + const GatedDiscretisedDensity & spatial_transformation_x(*spatial_transformation_x_sptr); + + const TimeGateDefinitions gate_defs(gate_defs_input_string);//This is not necessary as the defs are necessary for all the files and it should be one file... Think how to do this. + + this->_spatial_transformation_z= spatial_transformation_z; this->_spatial_transformation_y= spatial_transformation_y; this->_spatial_transformation_x= spatial_transformation_x; + this->_spatial_transformations_are_stored=true; +} + +//! Implementation to write the transformation vectors +void +GatedSpatialTransformation::write_to_files(const std::string output_string) +{ + (this->_spatial_transformation_z).write_to_files(output_string,"d1"); + (this->_spatial_transformation_y).write_to_files(output_string,"d2"); + (this->_spatial_transformation_x).write_to_files(output_string,"d3"); + // return Succeeded::yes; // add a no case if you cannot write +} + +void +GatedSpatialTransformation::warp_image(GatedDiscretisedDensity & new_gated_image, + const GatedDiscretisedDensity & gated_image) const +{ + std::string explanation; + if (!(new_gated_image.get_densities()[0])->has_same_characteristics(*(gated_image.get_densities()[0]), explanation)){ + error(boost::format("GatedSpatialTransformation::warp_image needs the same sizes for input and output images: %1%") % explanation); + } + new_gated_image.set_time_gate_definitions(this->_gate_defs); + assert(gated_image.get_time_gate_definitions().get_num_gates()==this->_spatial_transformation_x.get_time_gate_definitions().get_num_gates()); + new_gated_image.fill_with_zero(); + if (this->_spatial_transformations_are_stored) + for(unsigned int gate_num=1 ; gate_num<=gated_image.get_time_gate_definitions().get_num_gates() ; ++gate_num) + new_gated_image[gate_num]=stir::warp_image((gated_image.get_densities())[gate_num-1], + (this->_spatial_transformation_x.get_densities())[gate_num-1], + (this->_spatial_transformation_y.get_densities())[gate_num-1], + (this->_spatial_transformation_z.get_densities())[gate_num-1], + BSpline::linear, false); + else + error("The transformation fields haven't been set properly yet.\n"); +} + +void +GatedSpatialTransformation::warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const +{ + new_reference_image.fill(0.F); + this->accumulate_warp_image(new_reference_image, gated_image); +} + +void +GatedSpatialTransformation::accumulate_warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const +{ + GatedDiscretisedDensity new_gated_image(gated_image); + new_gated_image.fill_with_zero(); + this->warp_image(new_gated_image,gated_image); + //!todo This is not implemented as sum (or should it be the average?) + for(unsigned int gate_num = 1;gate_num<=gated_image.get_time_gate_definitions().get_num_gates() ; ++gate_num) + new_reference_image += new_gated_image[gate_num]; + // new_reference_image /= gated_image.get_time_gate_definitions().get_num_gates(); +} + +void +GatedSpatialTransformation::average_warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const +{ + new_reference_image.fill(0.F); + this->accumulate_average_warp_image(new_reference_image, gated_image); +} + +void +GatedSpatialTransformation::accumulate_average_warp_image(DiscretisedDensity<3, float> & new_reference_image, + const GatedDiscretisedDensity & gated_image) const +{ + GatedDiscretisedDensity new_gated_image(gated_image); + new_gated_image.fill_with_zero(); + this->warp_image(new_gated_image,gated_image); + //!todo This is not implemented as sum (or should it be the average?) + for(unsigned int gate_num = 1;gate_num<=gated_image.get_time_gate_definitions().get_num_gates() ; ++gate_num) + { + float gate_relative_duration=new_gated_image.get_time_gate_definitions().get_gate_relative_duration(gate_num); + + DiscretisedDensity<3,float>::full_iterator new_gated_image_iter = new_gated_image[gate_num].begin_all(); + DiscretisedDensity<3,float>::full_iterator end_new_gated_image_iter = new_gated_image[gate_num].end_all(); + DiscretisedDensity<3,float>::full_iterator new_reference_image_iter = new_reference_image.begin_all(); + + while (new_gated_image_iter!=end_new_gated_image_iter) + { + *new_gated_image_iter *= gate_relative_duration; //Nicolas K. : Scalar multiplication of current gate with the relative duration + *new_reference_image_iter += *new_gated_image_iter; //Nicolas K. : Scaled value accumulated over all motions/gates + ++new_gated_image_iter, ++new_reference_image_iter; + } + } +} + +void +GatedSpatialTransformation::warp_image(GatedDiscretisedDensity & gated_image, + const DiscretisedDensity<3, float> & reference_image) const +{ + if ((gated_image.get_densities())[0]->size_all()!=reference_image.size_all()){ + error("GatedSpatialTransformation::warp_image needs the same sizes for input and output images.\n"); + } + if ((gated_image.get_densities())[0]->size_all()!=(this->_spatial_transformation_y.get_densities())[0]->size_all()){ + std::cerr << "Number of voxels in one gated image: " << (gated_image.get_densities())[0]->size_all() << "\n"; + std::cerr << "Number of voxels in one motion vector gated image: " << (this->_spatial_transformation_y.get_densities())[0]->size_all() << "\n"; + error("GatedSpatialTransformation::warp_image needs the same sizes for motion vectors and input/output images.\n"); + } + const shared_ptr > reference_image_sptr( reference_image.clone()); + gated_image.resize_densities(this->_gate_defs); + + if (this->_spatial_transformations_are_stored) + for(unsigned int gate_num = 1 ; gate_num<=gated_image.get_time_gate_definitions().get_num_gates() ; ++gate_num) + { + const VoxelsOnCartesianGrid density = stir::warp_image(reference_image_sptr, + (this->_spatial_transformation_x.get_densities())[gate_num-1], + (this->_spatial_transformation_y.get_densities())[gate_num-1], + (this->_spatial_transformation_z.get_densities())[gate_num-1], + BSpline::linear, false); + const shared_ptr > density_sptr(density.clone()); + gated_image.set_density_sptr(density_sptr,gate_num); + } + else + error("The transformation fields haven't been set properly yet."); +} + +void +GatedSpatialTransformation::average_warp_image(DiscretisedDensity<3, float> & avg_warped_image, + const DiscretisedDensity<3, float> & reference_image) const +{ + avg_warped_image.fill(0.F); + this->accumulate_average_warp_image(avg_warped_image, reference_image); +} + +void +GatedSpatialTransformation::accumulate_average_warp_image(DiscretisedDensity<3, float> & avg_warped_image, + const DiscretisedDensity<3, float> & reference_image) const +{ + + // Creation of a copy a gated image to temporarily store the motion transformed images of each motion/gate + const shared_ptr > density_template_sptr(reference_image.get_empty_copy()); + GatedDiscretisedDensity gated_image = GatedDiscretisedDensity(this->_gate_defs, density_template_sptr); + + this->warp_image(gated_image,reference_image); + + // The relative durations for each motion/gate when applied as weights in the following weighted sum operation + // effectively produced a time-weighted average warped image + for(unsigned int gate_num = 1;gate_num<=gated_image.get_time_gate_definitions().get_num_gates() ; ++gate_num) + { + float gate_relative_duration=gated_image.get_time_gate_definitions().get_gate_relative_duration(gate_num); + + DiscretisedDensity<3,float>::full_iterator gated_image_iter = gated_image[gate_num].begin_all(); + DiscretisedDensity<3,float>::full_iterator end_gated_image_iter = gated_image[gate_num].end_all(); + DiscretisedDensity<3,float>::full_iterator avg_warped_image_iter = avg_warped_image.begin_all(); + + while (gated_image_iter!=end_gated_image_iter) + { + *gated_image_iter *= gate_relative_duration; //Nicolas K. : Scalar multiplication of current gate with the relative duration + *avg_warped_image_iter += *gated_image_iter; //Nicolas K. : Scaled value accumulated over all motions/gates + ++gated_image_iter, ++avg_warped_image_iter; + } + } +} + +void +GatedSpatialTransformation:: +set_spatial_transformations(const GatedDiscretisedDensity & transformation_z, + const GatedDiscretisedDensity & transformation_y, + const GatedDiscretisedDensity & transformation_x) +{ + this->_spatial_transformation_z=transformation_z; + this->_spatial_transformation_y=transformation_y; + this->_spatial_transformation_x=transformation_x; + this->_spatial_transformations_are_stored=true; +} + +void +GatedSpatialTransformation::set_gate_defs(const TimeGateDefinitions & gate_defs) +{ this->_gate_defs=gate_defs; } + +GatedDiscretisedDensity GatedSpatialTransformation::get_spatial_transformation_z() const +{ return this->_spatial_transformation_z; } +GatedDiscretisedDensity GatedSpatialTransformation::get_spatial_transformation_y() const +{ return this->_spatial_transformation_y; } +GatedDiscretisedDensity GatedSpatialTransformation::get_spatial_transformation_x() const +{ return this->_spatial_transformation_x; } + + +END_NAMESPACE_STIR diff --git a/src/spatial_transformation_buildblock/SpatialTransformation.cxx b/src/spatial_transformation_buildblock/SpatialTransformation.cxx new file mode 100644 index 0000000000..e1d1f562f3 --- /dev/null +++ b/src/spatial_transformation_buildblock/SpatialTransformation.cxx @@ -0,0 +1,44 @@ +// +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ + /*! + \file + \ingroup spatial_transformation + \brief Implementations of inline functions of class stir::SpatialTransformation + + \author Charalampos Tsoumpas + + This is the most basic class for including Motion Fields. + +*/ + + +#include "stir/spatial_transformation/SpatialTransformation.h" + + +START_NAMESPACE_STIR + +const char * const +SpatialTransformation::registered_name = "Motion Field Type"; + +SpatialTransformation::SpatialTransformation() //!< default constructor +{ } + +SpatialTransformation::~SpatialTransformation() //!< default destructor +{ } + +END_NAMESPACE_STIR diff --git a/src/spatial_transformation_buildblock/lib.mk b/src/spatial_transformation_buildblock/lib.mk new file mode 100644 index 0000000000..551072b13f --- /dev/null +++ b/src/spatial_transformation_buildblock/lib.mk @@ -0,0 +1,11 @@ +# +# + +dir := spatial_transformation_buildblock +$(dir)_LIB_SOURCES:= SpatialTransformation.cxx \ + GatedSpatialTransformation.cxx \ + warp_image.cxx + +$(dir)_REGISTRY_SOURCES:= spatial_transformation_registries.cxx + +include $(WORKSPACE)/lib.mk diff --git a/src/spatial_transformation_buildblock/spatial_transformation_registries.cxx b/src/spatial_transformation_buildblock/spatial_transformation_registries.cxx new file mode 100644 index 0000000000..5bce94a319 --- /dev/null +++ b/src/spatial_transformation_buildblock/spatial_transformation_registries.cxx @@ -0,0 +1,34 @@ +// + /* + Copyright (C) 2009 -2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup spatial_transformation + \brief File that registers all stir::RegisterObject children in spatial_transformation + + \author Charalampos Tsoumpas + +*/ + +#include "stir/spatial_transformation/GatedSpatialTransformation.h" + +START_NAMESPACE_STIR + +static GatedSpatialTransformation::RegisterIt dummy1199; + +END_NAMESPACE_STIR + diff --git a/src/spatial_transformation_buildblock/warp_image.cxx b/src/spatial_transformation_buildblock/warp_image.cxx new file mode 100644 index 0000000000..ccc55d391c --- /dev/null +++ b/src/spatial_transformation_buildblock/warp_image.cxx @@ -0,0 +1,86 @@ +// +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup buildblock + \brief Implementation of function stir::warp_image + \author Charalampos Tsoumpas +*/ + +#include "stir/spatial_transformation/warp_image.h" + +START_NAMESPACE_STIR +//using namespace BSpline; + + +VoxelsOnCartesianGrid +warp_image(const shared_ptr > & density_sptr, + const shared_ptr > & motion_x_sptr, + const shared_ptr > & motion_y_sptr, + const shared_ptr > & motion_z_sptr, + const BSpline::BSplineType spline_type, const bool extend_borders) +{ + const DiscretisedDensityOnCartesianGrid <3,float>* density_cartesian_sptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (density_sptr.get()); + const BasicCoordinate<3,float> grid_spacing=density_cartesian_sptr->get_grid_spacing(); + const CartesianCoordinate3D origin=density_cartesian_sptr->get_origin(); + const BSpline::BSplinesRegularGrid<3, float> density_interpolation(*density_sptr, spline_type); + + BasicCoordinate<3,int> min; BasicCoordinate<3,int> max; + const IndexRange<3> range=density_sptr->get_index_range(); + if (!range.get_regular_range(min,max)) + error("image is not in regular grid.\n"); + const BasicCoordinate<3,int> out_min=min; const BasicCoordinate<3,int> out_max=max; +#if 0 + if (extend_borders==1) { + out_min[1]-=abs(voxel_shift_z) ; + out_min[2]-=abs(voxel_shift_y) ; + out_min[3]-=abs(voxel_shift_x) ; + out_max[1]+=abs(voxel_shift_z) ; + out_max[2]+=abs(voxel_shift_y) ; + out_max[3]+=abs(voxel_shift_x) ; + } +#endif + const IndexRange<3> out_range(out_min,out_max); + VoxelsOnCartesianGrid out_density(out_range,origin,grid_spacing); + + BasicCoordinate<3,int> c; + BasicCoordinate<3,double> d, l; + for (c[1]=min[1]; c[1]<=max[1]; ++c[1]) + for (c[2]=min[2]; c[2]<=max[2]; ++c[2]) + for (c[3]=min[3]; c[3]<=max[3]; ++c[3]) + { + l[1] = static_cast ((*motion_z_sptr)[c]/grid_spacing[1]); + l[2] = static_cast ((*motion_y_sptr)[c]/grid_spacing[2]); + l[3] = static_cast ((*motion_x_sptr)[c]/grid_spacing[3]); + d[1] = static_cast (c[1]) + l[1]; // for the IRTK version I had c-l, but for Christian's it seems to work as c+l + d[2] = static_cast (c[2]) + l[2]; + d[3] = static_cast (c[3]) + l[3]; + // Temporary fix such that when radioactivity comes from outside is set to 0. + // To fix this properly we need to modify the B-Splines interpolation method by changing the periodicity extrapolation. + if ( (d[1]<=static_cast(min[1])) || (d[1]>=static_cast(max[1])) || // I'm not considering the last plane if linear + (d[2]<=static_cast(min[2])) || (d[2]>=static_cast(max[2])) || // because it's going to use extrapolated data + (d[3]<=static_cast(min[3])) || (d[3]>=static_cast(max[3])) ) // I haven't implemented anything for higher order + out_density[c] = 0.F; + else + out_density[c] = density_interpolation(d); + } + return out_density; +} + +END_NAMESPACE_STIR diff --git a/src/stir_dirs.mk b/src/stir_dirs.mk new file mode 100644 index 0000000000..c0147674da --- /dev/null +++ b/src/stir_dirs.mk @@ -0,0 +1,36 @@ +# +# +# This file contains a list of all subdirectories in STIR +# that will be compiled when using the Makefile + +LIBDIRS += buildblock recon_buildblock display IO \ + data_buildblock \ + numerics_buildblock \ + eval_buildblock Shape_buildblock \ + listmode_buildblock \ + modelling_buildblock \ + scatter_buildblock \ + spatial_transformation_buildblock \ + iterative/OSMAPOSL \ + iterative/OSSPS \ + analytic/FBP2D \ + analytic/FBP3DRP + +EXEDIRS += utilities recon_test \ + listmode_utilities \ + modelling_utilities \ + scatter_utilities \ + utilities/ecat \ + iterative/OSMAPOSL \ + iterative/POSMAPOSL \ + iterative/NESTPOSMAPOSL \ + iterative/NESTGPOSMAPOSL \ + iterative/OSSPS \ + iterative/POSSPS \ + analytic/FBP2D \ + analytic/FBP3DRP \ + SimSET \ + SimSET/scripts \ + ../scripts + +TESTDIRS += test recon_test test/numerics test/modelling diff --git a/src/swig/CMakeLists.txt b/src/swig/CMakeLists.txt new file mode 100644 index 0000000000..21c4770d96 --- /dev/null +++ b/src/swig/CMakeLists.txt @@ -0,0 +1,102 @@ +# Copyright 2012 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building interfaces to STIR using SWIG. See the STIR User's Guide and http://www.cmake.org. + +set(dir swig) + +option(BUILD_SWIG_PYTHON + "Use SWIG to generate python bindings for STIR (experimental)" OFF) + +option(BUILD_SWIG_OCTAVE + "Use SWIG to generate octave bindings for STIR (experimental)" OFF) + +# Octave support doesn't really work very well yet, so hide it a bit +mark_as_advanced(BUILD_SWIG_OCTAVE) + +if(BUILD_SWIG_PYTHON OR BUILD_SWIG_OCTAVE) + + FIND_PACKAGE(SWIG REQUIRED) + INCLUDE(${SWIG_USE_FILE}) + + SET(CMAKE_SWIG_FLAGS -DSTART_NAMESPACE_STIR=\"namespace stir {\" -DEND_NAMESPACE_STIR=\"}\") + + SET_SOURCE_FILES_PROPERTIES(stir.i PROPERTIES CPLUSPLUS ON) + # some include files in STIR have "#ifdef SWIG" statements, so we defined the variable here + add_definitions(-D SWIG) +endif() + +if(BUILD_SWIG_PYTHON) + + FIND_PACKAGE(PythonLibs) + INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) + # TODO probably better to call the module stirpy or something + # TODO -builtin option only appropriate for python + # while the next statement sets it for all modules called stir + SET(SWIG_MODULE_stir_EXTRA_FLAGS -builtin) + SWIG_ADD_MODULE(stir python stir.i ${STIR_REGISTRIES}) + SWIG_LINK_LIBRARIES(stir ${STIR_LIBRARIES} ${PYTHON_LIBRARIES}) + + set(PYTHON_DEST ${CMAKE_INSTALL_PREFIX}/python CACHE PATH "Destination for python module") + INSTALL(TARGETS ${SWIG_MODULE_stir_REAL_NAME} DESTINATION ${PYTHON_DEST}) + INSTALL(FILES ${CMAKE_BINARY_DIR}/${dir}/stir.py DESTINATION ${PYTHON_DEST}) + INSTALL(FILES stirextra.py DESTINATION ${PYTHON_DEST}) + +endif(BUILD_SWIG_PYTHON) + +if (BUILD_SWIG_OCTAVE) + # we will use mkoctfile to get configuration info, but not use it for the actual build. + # it'd be hard to get cmake to work with that (specifying all STIR flags and libraries for instance) + # also, mkoctfile currently doesn't take .so files + + FIND_PROGRAM(MKOCTFILE mkoctfile) + IF(NOT MKOCTFILE) + MESSAGE(FATAL_ERROR "mkoctfile was not found. We need it to build the STIR interface for Octave.") + ENDIF(NOT MKOCTFILE) + + # TODO need to test if SHARED is on + + # this doesn't exist in standard cmake and we don't need it I guess + #FIND_PACKAGE(Octave) + + # get necessary include/link flags and libraries + + EXECUTE_PROCESS(COMMAND ${MKOCTFILE} -p INCFLAGS OUTPUT_VARIABLE OCTAVE_INCFLAGS) + EXECUTE_PROCESS(COMMAND ${MKOCTFILE} -p OCTAVE_LFLAGS OUTPUT_VARIABLE OCTAVE_LINKFLAGS) + EXECUTE_PROCESS(COMMAND ${MKOCTFILE} -p OCTAVE_LIBS OUTPUT_VARIABLE OCTAVE_LIBS) + # get rid of newlines + string(REGEX REPLACE "[\r\n]" "" OCTAVE_INCFLAGS ${OCTAVE_INCFLAGS}) + + # SET(OCTAVE_FOUND TRUE) + SET(OCTAVE_LIBS ${OCT_LINKFLAGS} ${OCTAVE_LIBS}) + SET(OCTAVE_SUFFIX ".oct") + SET(OCTAVE_PREFIX "") + + SET(SWIG_MODULE_stiroct_EXTRA_FLAGS -module stiroct) + SWIG_ADD_MODULE(stiroct octave stir.i ${STIR_REGISTRIES}) + SET_TARGET_PROPERTIES(${SWIG_MODULE_stiroct_REAL_NAME} PROPERTIES SUFFIX ${OCTAVE_SUFFIX} PREFIX "${OCTAVE_PREFIX}") + SWIG_LINK_LIBRARIES(stiroct ${STIR_LIBRARIES} ${OCTAVE_LIBRARIES}) + + # add OCTAVE_INCFLAGS to swig-generated file only, not to all files as + # 1) we don't need it at the moment 2) we'd need to change from -Ibla to bla + #INCLUDE_DIRECTORIES(${OCTAVE_INCLUDE_PATH}) + SET_SOURCE_FILES_PROPERTIES( ${swig_generated_file_fullname} + PROPERTIES COMPILE_FLAGS ${OCTAVE_INCFLAGS}) + + set(OCTAVE_DEST ${CMAKE_INSTALL_PREFIX}/octave CACHE PATH "Destination for Octave module") + INSTALL(TARGETS ${SWIG_MODULE_stiroct_REAL_NAME} DESTINATION ${OCTAVE_DEST}) + +endif (BUILD_SWIG_OCTAVE) diff --git a/src/swig/Makefile b/src/swig/Makefile new file mode 100644 index 0000000000..a0d26b9e48 --- /dev/null +++ b/src/swig/Makefile @@ -0,0 +1,60 @@ +# This is a temporary makefile used for development only. +# Do not use. Instead, use CMake for building +SWIG=swig + +all: _stir.so + +stir_PYTHONwrap.cxx: stir.i Makefile + $(SWIG) -python -c++ -builtin -I../include/ -I/usr/include -DSTART_NAMESPACE_STIR="namespace stir {" -DEND_NAMESPACE_STIR="}" -o $@ $< + +stir_OCTAVEwrap.cpp: stir.i Makefile + $(SWIG) -octave -c++ -I../include/ -I/usr/include -DSTART_NAMESPACE_STIR="namespace stir {" -DEND_NAMESPACE_STIR="}" -o $@ $< + +stir.e: stir.i Makefile + $(SWIG) -python -c++ -builtin -E -I../include/ -DSTART_NAMESPACE_STIR="namespace stir {" -DEND_NAMESPACE_STIR="}" $< > stir.e + +CFLAGS=-fpic -I../include/ -g -I /usr/include/python2.7/ -DSWIG + +%.o : %.cxx + $(CXX) $(CFLAGS) -o$@ -c $< + +FILES=Scanner.o interfile_keyword_functions.o utilities.o error.o warning.o VoxelsOnCartesianGrid.o ProjDataInfo.o Sinogram.o Viewgram.o SegmentBySinogram.o SegmentByView.o \ +ProjDataInfoCylindrical.o ProjDataInfoCylindricalArcCorr.o ProjDataInfoCylindricalNoArcCorr.o RelatedViewgrams.o DataSymmetriesForViewSegmentNumbers.o IndexRange.o DiscretisedDensity.o + +LIBS=../../build/stir/gcc/DebugShared/buildblock/libbuildblock.so \ +../../build/stir/gcc/DebugShared/data_buildblock/libdata_buildblock.so \ +../../build/stir/gcc/DebugShared/IO/libIO.so \ +../../build/stir/gcc/DebugShared/modelling_buildblock/libmodelling_buildblock.so \ +../../build/stir/gcc/DebugShared/numerics_buildblock/libnumerics_buildblock.so \ +../../build/stir/gcc/DebugShared/local/IO/GE/liblocal_IO_GE.so \ +../../build/stir/gcc/DebugShared/recon_buildblock/librecon_buildblock.so \ +../../build/stir/gcc/DebugShared/listmode_buildblock/liblistmode_buildblock.so \ +../../build/stir/gcc/DebugShared/iterative/OSMAPOSL/libiterative_OSMAPOSL.so \ +../../build/stir/gcc/DebugShared/swig/CMakeFiles/_stir.dir/__/IO/IO_registries.cxx.o \ +../../build/stir/gcc/DebugShared/swig/CMakeFiles/_stir.dir/__/recon_buildblock/recon_buildblock_registries.cxx.o \ +../../build/stir/gcc/DebugShared/swig/CMakeFiles/_stir.dir/__/buildblock/buildblock_registries.cxx.o + + +LIBSa=-lbuildblock \ +-ldata_buildblock \ +-lIO \ +-lmodelling_buildblock \ +-lnumerics_buildblock \ +-llocal_IO_GE \ +-lrecon_buildblock \ +-llistmode_buildblock \ +-literative_OSMAPOSL \ +../../build/stir/gcc/DebugShared/swig/CMakeFiles/_stir.dir/__/IO/IO_registries.cxx.o \ +../../build/stir/gcc/DebugShared/swig/CMakeFiles/_stir.dir/__/recon_buildblock/recon_buildblock_registries.cxx.o \ +../../build/stir/gcc/DebugShared/swig/CMakeFiles/_stir.dir/__/buildblock/buildblock_registries.cxx.o \ +-L/home/kris/binDebugShared/lib + + +.PRECIOUS: stir_PYTHONwrap.cxx stir_OCTAVEwrap.cpp + +_stir.so: stir_PYTHONwrap.o $(LIBS) Makefile + g++ -g -shared stir_PYTHONwrap.o $(LIBS) -o $@ + + +stir.oct: stir_OCTAVEwrap.cpp $(LIBS) Makefile + CXXFLAGS=-g mkoctfile -v -I../include/ -g -DSWIG -o $@ $< $(LIBSa) \ No newline at end of file diff --git a/src/swig/README.txt b/src/swig/README.txt new file mode 100644 index 0000000000..38660791b5 --- /dev/null +++ b/src/swig/README.txt @@ -0,0 +1,54 @@ +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +This directory contains a set of files to make an interface library with STIR +for other languages than C++. Currently we focus on Python. + +To generate the interface, we use SWIG (http://www.swig.org), which you +will need to get yourself. + +INSTALLATION + +On Ubuntu, something like this could work: + +sudo apt-get install swig python-numpy python-instant python python-py + +python-py isn't really required but used for testing so highly recommended. + +(in the future, you might need to copy /usr/share/pyshared/instant/swig/numpy.i to the STIR swig directory) + +Then (re)build and install STIR with BUILD_PYTHON ON. You probably +need to build with shared libraries. + +On Linux, you will have to tell the system where to find the STIR shared libraries. +For instance, if you set CMAKE_INSTALL_PREFIX to ~/binDebugShared, you would need to do + +export PYTHONPATH=~/binDebugShared/python/:$PYTHONPATH +export LD_LIBRARY_PATH=~/binDebugShared/lib:$LD_LIBRARY_PATH + +RUNNING + +After all of the above, you can run python or alternatives. There are some examples in the +python_examples directory. These might need adapting for your local +situation. You can then run them for instance like + + ipython -pylab -i matplotlib_demo.py + +(if you installed ipython). + +TESTING + +See the swig/test sub-directory. Have a look at the tests to see what's possible with +the current version of the code. diff --git a/src/swig/python_examples/init.hv b/src/swig/python_examples/init.hv new file mode 100644 index 0000000000..6cc12597fa --- /dev/null +++ b/src/swig/python_examples/init.hv @@ -0,0 +1,26 @@ +!INTERFILE := +name of data file := init.v +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Image +process status := Reconstructed +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 3 +matrix axis label [1] := x +!matrix size [1] := 60 +scaling factor (mm/pixel) [1] := 4.44114 +matrix axis label [2] := y +!matrix size [2] := 60 +scaling factor (mm/pixel) [2] := 4.44114 +matrix axis label [3] := z +!matrix size [3] := 31 +scaling factor (mm/pixel) [3] := 3.27 +number of time frames := 1 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +quantification units := 1 +!END OF INTERFILE := diff --git a/src/swig/python_examples/init.v b/src/swig/python_examples/init.v new file mode 100644 index 0000000000..1ae62d4fab Binary files /dev/null and b/src/swig/python_examples/init.v differ diff --git a/src/swig/python_examples/matplotlib_demo.py b/src/swig/python_examples/matplotlib_demo.py new file mode 100755 index 0000000000..3a1a115521 --- /dev/null +++ b/src/swig/python_examples/matplotlib_demo.py @@ -0,0 +1,41 @@ +# Demo of how to use STIR from python to display some images with matplotlib + +# Copyright 2012-06-05 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +import numpy +import pylab +import stir +import stirextra + +# read an image using STIR +image=stir.FloatVoxelsOnCartesianGrid.read_from_file('../../recon_test_pack/test_image_3.hv') + +# convert data to numpy 3d array +npimage=stirextra.to_numpy(image); + +# make some plots +# first a bitmap +pylab.figure() +pylab.imshow(npimage[10,:,:]); +pylab.title('slice 10 (starting from 0)') +pylab.show() +# now a profile +pylab.figure() +pylab.plot(npimage[10,45,:]); +pylab.xlabel('x') +pylab.title('slice 10, line 45 (starting from 0)') +pylab.show() diff --git a/src/swig/python_examples/mayavi_demo.py b/src/swig/python_examples/mayavi_demo.py new file mode 100755 index 0000000000..80ce0f6c8d --- /dev/null +++ b/src/swig/python_examples/mayavi_demo.py @@ -0,0 +1,61 @@ +# Demo of how to mayavi to display some STIR data + +# Copyright 2012-06-05 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +import numpy +import pylab +import stir +import stirextra +from mayavi import mlab + +# read in an image using STIR +image=stir.FloatVoxelsOnCartesianGrid.read_from_file('../../../recon_test_pack/test_image_3.hv') + +# convert data to numpy 3d array +npimage=stirextra.to_numpy(image); +# get grid coordinates in mm +[z,y,x]=stirextra.get_physical_coordinates_for_grid(image); + +# create a mayavi figure +mlab.figure(); +# add image as a scalar_field +im=mlab.pipeline.scalar_field(z,y,x,npimage) +# add a slice +mlab.pipeline.image_plane_widget(im, + plane_orientation='x_axes', + slice_index=10, + ) +# could add an orthogonal slice +#mlab.pipeline.image_plane_widget(im, +# plane_orientation='y_axes', +# slice_index=10, +# ) +#mlab.outline() + +# some preliminary code to add the FOV to the plot. currently not used +def cylinder(): + pi = numpy.pi + cos = numpy.cos + sin = numpy.sin + r = 90; + l = 30; + dphi, dz = pi/250.0, l/2 + [phi,z] = numpy.mgrid[0:2*pi+dphi*1.5:dphi,0:l:dz] + x = r*sin(phi) + y = r*cos(phi) + return mlab.mesh(x, y, z, colormap="bone",opacity=.2) + diff --git a/src/swig/python_examples/recon_demo.py b/src/swig/python_examples/recon_demo.py new file mode 100755 index 0000000000..23befb634f --- /dev/null +++ b/src/swig/python_examples/recon_demo.py @@ -0,0 +1,62 @@ +# Demo of how to use STIR from python to reconstruct some data + +# Copyright 2012-06-05 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +import stir +import stirextra +import pylab +import numpy + + +# initialise reconstruction object +# we will do this here via a .par file +recon=stir.OSMAPOSLReconstruction3DFloat('recon_demo_OSEM.par') +# now modify a few settings from in Python for illustration +recon.set_num_subsets(2); +poissonobj=recon.get_objective_function() +poissonobj.set_sensitivity_filename('sens.hv'); +poissonobj.set_recompute_sensitivity(True) + +# get initial image +target=stir.FloatVoxelsOnCartesianGrid.read_from_file('init.hv'); +# we will just fill the whole array with 1 here +target.fill(1) + +# run a few iterations and plot intermediate results +# note: the python shell will wait after every pylab.show() for you +# to close the window. Use ipython or so if you don't like that. +s=recon.set_up(target); +if (s==stir.Succeeded(stir.Succeeded.yes)): + pylab.figure() + pylab.hold(True) + for iter in range(1,4): + print '\n--------------------- Subiteration ', iter + recon.set_start_subiteration_num(iter) + recon.set_num_subiterations(iter) + s=recon.reconstruct(target); + poissonobj.set_recompute_sensitivity(False) + npimage=stirextra.to_numpy(target); + pylab.plot(npimage[10,30,:]) + pylab.show() + + # plot slice of final image + pylab.figure() + pylab.imshow(npimage[10,:,:]) + pylab.show() +else: + print 'Error setting-up reconstruction object' + diff --git a/src/swig/python_examples/recon_demo_OSEM.par b/src/swig/python_examples/recon_demo_OSEM.par new file mode 100644 index 0000000000..ab35dec609 --- /dev/null +++ b/src/swig/python_examples/recon_demo_OSEM.par @@ -0,0 +1,24 @@ +OSMAPOSLParameters := + +objective function type:= PoissonLogLikelihoodWithLinearModelForMeanAndProjData +PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +input file := smalllong.hs + ;Utahscat600k_ca_seg4.hs +;maximum absolute segment number to process := 2 +;zero end planes of segment 0:= 1 + +end PoissonLogLikelihoodWithLinearModelForMeanAndProjData Parameters:= + +initial estimate := init.hv +output filename prefix := my_test_image + +number of subsets:= 12 +start at subset:= 1 +number of subiterations:= 1 +save estimates at subiteration intervals:= 1 + + + + +END := diff --git a/src/swig/python_examples/smalllong.hs b/src/swig/python_examples/smalllong.hs new file mode 100644 index 0000000000..6dfc31d461 --- /dev/null +++ b/src/swig/python_examples/smalllong.hs @@ -0,0 +1,47 @@ +!INTERFILE := +name of data file := smalllong.s +originating system := Unknown +!GENERAL DATA := +!GENERAL IMAGE DATA := +!type of data := PET +imagedata byte order := LITTLEENDIAN +!PET STUDY (General) := +!PET data type := Emission +applied corrections := {arc correction} +!number format := float +!number of bytes per pixel := 4 +number of dimensions := 4 +matrix axis label [4] := segment +!matrix size [4] := 1 +matrix axis label [3] := view +!matrix size [3] := 64 +matrix axis label [2] := axial coordinate +!matrix size [2] := { 27} +matrix axis label [1] := tangential coordinate +!matrix size [1] := 75 +minimum ring difference per segment := { -8} +maximum ring difference per segment := { 8} +Scanner parameters:= +Scanner type := Unknown +Number of rings := 14 +Number of detectors per ring := 112 +Inner ring diameter (cm) := 60 +Average depth of interaction (cm) := 0.7 +Distance between rings (cm) := 0.654 +Default bin size (cm) := 0.3 +View offset (degrees) := 0 +Maximum number of non-arc-corrected bins := 56 +Default number of arc-corrected bins := 56 +Number of blocks per bucket in transaxial direction := 0 +Number of blocks per bucket in axial direction := 0 +Number of crystals per block in axial direction := 0 +Number of crystals per block in transaxial direction := 0 +Number of detector layers := 1 +Number of crystals per singles unit in axial direction := -1 +Number of crystals per singles unit in transaxial direction := -1 +end scanner parameters:= +effective central bin size (cm) := 0.3 +image scaling factor[1] := 1 +data offset in bytes[1] := 0 +number of time frames := 1 +!END OF INTERFILE := diff --git a/src/swig/python_examples/smalllong.s b/src/swig/python_examples/smalllong.s new file mode 100644 index 0000000000..e30b3a64c6 Binary files /dev/null and b/src/swig/python_examples/smalllong.s differ diff --git a/src/swig/stir.i b/src/swig/stir.i new file mode 100644 index 0000000000..7c6f98f868 --- /dev/null +++ b/src/swig/stir.i @@ -0,0 +1,948 @@ +/* + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + Copyright (C) 2013 University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \brief Interface file for SWIG + + \author Kris Thielemans +*/ + + + %module stir + %{ + /* Include the following headers in the wrapper code */ +#include +#include +#include // for size_t +#include + +#ifdef SWIGOCTAVE +// TODO terrible work-around to avoid conflict between stir::error and Octave error +// they are in conflict with eachother because we need "using namespace stir" below (swig bug) +#define __stir_error_H__ +#endif + + #include "stir/Succeeded.h" + #include "stir/DetectionPosition.h" + #include "stir/Scanner.h" + #include "stir/Bin.h" + #include "stir/ProjDataInfoCylindricalArcCorr.h" + #include "stir/ProjDataInfoCylindricalNoArcCorr.h" + #include "stir/Viewgram.h" + #include "stir/RelatedViewgrams.h" + #include "stir/Sinogram.h" + #include "stir/SegmentByView.h" + #include "stir/SegmentBySinogram.h" + #include "stir/ExamInfo.h" + #include "stir/ProjData.h" + #include "stir/ProjDataInterfile.h" + +#include "stir/CartesianCoordinate2D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/IndexRange.h" +#include "stir/Array.h" +#include "stir/DiscretisedDensity.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/PixelsOnCartesianGrid.h" +#include "stir/VoxelsOnCartesianGrid.h" + +#include "stir/IO/read_from_file.h" +#include "stir/IO/InterfileOutputFileFormat.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/ECAT7OutputFileFormat.h" +#endif + +#include "stir/ChainedDataProcessor.h" +#include "stir/SeparableCartesianMetzImageFilter.h" + +#include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" +#include "stir/OSMAPOSL/OSMAPOSLReconstruction.h" + + // TODO need this (bug in swig) + // this bug occurs (only?) when using "%template(name) someclass;" inside the namespace + // as opposed to "%template(name) stir::someclass" outside the namespace + using namespace stir; + using std::iostream; + + namespace swigstir { +#if defined(SWIGPYTHON) + // helper function to translate a tuple to a BasicCoordinate + // returns zero on failure + template + int coord_from_tuple(stir::BasicCoordinate& c, PyObject* const args) + { return 0; } + template<> int coord_from_tuple(stir::BasicCoordinate<1, int>& c, PyObject* const args) + { return PyArg_ParseTuple(args, "i", &c[1]); } + template<> int coord_from_tuple(stir::BasicCoordinate<2, int>& c, PyObject* const args) + { return PyArg_ParseTuple(args, "ii", &c[1], &c[2]); } + template<> int coord_from_tuple(stir::BasicCoordinate<3, int>& c, PyObject* const args) + { return PyArg_ParseTuple(args, "iii", &c[1], &c[2], &c[3]); } + template<> int coord_from_tuple(stir::BasicCoordinate<1, float>& c, PyObject* const args) + { return PyArg_ParseTuple(args, "f", &c[1]); } + template<> int coord_from_tuple(stir::BasicCoordinate<2, float>& c, PyObject* const args) + { return PyArg_ParseTuple(args, "ff", &c[1], &c[2]); } + template<> int coord_from_tuple(stir::BasicCoordinate<3, float>& c, PyObject* const args) + { return PyArg_ParseTuple(args, "fff", &c[1], &c[2], &c[3]); } + + template + PyObject* tuple_from_coord(const stir::BasicCoordinate& c) + { + PyObject* p = PyTuple_New(num_dimensions); + for (int d=1; d<=num_dimensions; ++d) + PyTuple_SET_ITEM(p, d-1, PyInt_FromLong(c[d])); + return p; + } + template + PyObject* tuple_from_coord(const stir::BasicCoordinate& c) + { + PyObject* p = PyTuple_New(num_dimensions); + for (int d=1; d<=num_dimensions; ++d) + PyTuple_SET_ITEM(p, d-1, PyInt_FromSize_t(c[d])); + return p; + } + template + PyObject* tuple_from_coord(const stir::BasicCoordinate& c) + { + PyObject* p = PyTuple_New(num_dimensions); + for (int d=1; d<=num_dimensions; ++d) + PyTuple_SET_ITEM(p, d-1, PyFloat_FromDouble(double(c[d]))); + return p; + } + + +#endif + } + %} + +%feature("autodoc", "1"); + +// TODO doesn't work +%warnfilter(315) std::auto_ptr; + +// disable warnings about unknown base-class 401 +// disable warnings about "no access specified given for base class" as we use this correctly for private derivation 319 +// disable warnings about nested bass-class 325 +#pragma SWIG nowarn=319,401,325 + +# catch all C++ exceptions in python +%include "exception.i" + +%exception { + try { + $action + } catch (const std::exception& e) { + SWIG_exception(SWIG_RuntimeError, e.what()); + } catch (const std::string& e) { + SWIG_exception(SWIG_RuntimeError, e.c_str()); + } +} + +// declare some functions that return a new pointer such that SWIG can release memory properly +%newobject *::clone; +%newobject *::get_empty_copy; +%newobject *::read_from_file; +%newobject *::ask_parameters; + +#if defined(SWIGPYTHON) +%rename(__assign__) *::operator=; +#endif + +// include standard swig support for some bits of the STL (i.e. standard C++ lib) +%include +%include +#if defined(SWIGPYTHON) +%include +%include +#endif +// Instantiate STL templates used by stir +namespace std { + %template(IntVector) vector; + %template(DoubleVector) vector; + %template(FloatVector) vector; + %template(StringList) list; +} + +// section for helper classes for creating new iterators. +// The code here is nearly a copy of what's in PyIterators.swg, +// except that the decr() function isn't defined. This is because we need it for some STIR iterators +// which are forward_iterators. +// Ideally this code would be moved to SWIG. +// +// Note: this needs to be defined after including some stl stuff, as otherwise the necessary fragments +// haven't been included in the wrap.cxx yet. +%{ + namespace swigstir { +#ifdef SWIGPYTHON + template::value_type, + typename FromOper = swig::from_oper > + class SwigPyForwardIteratorClosed_T : public swig::SwigPyIterator_T + { + public: + FromOper from; + typedef OutIterator out_iterator; + typedef ValueType value_type; + typedef swig::SwigPyIterator_T base; + typedef SwigPyForwardIteratorClosed_T self_type; + + SwigPyForwardIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) + : swig::SwigPyIterator_T(curr, seq), begin(first), end(last) + { + } + + PyObject *value() const { + if (base::current == end) { + throw swig::stop_iteration(); + } else { + return swig::from(static_cast(*(base::current))); + } + } + + swig::SwigPyIterator *copy() const + { + return new self_type(*this); + } + + swig::SwigPyIterator *incr(size_t n = 1) + { + while (n--) { + if (base::current == end) { + throw swig::stop_iteration(); + } else { + ++base::current; + } + } + return this; + } + + private: + out_iterator begin; + out_iterator end; + }; + + template + inline swig::SwigPyIterator* + make_forward_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) + { + return new SwigPyForwardIteratorClosed_T(current, begin, end, seq); + } + + +#endif + } // end of namespace + + %} + +// doesn't work (yet?) because of bug in int template arguments +// %rename(__getitem__) *::at; + +// MACROS to define index access (Work-in-progress) +%define %ADD_indexaccess(INDEXTYPE,RETTYPE,TYPE...) +#if defined(SWIGPYTHON) +#if defined(SWIGPYTHON_BUILTIN) + // %feature("python:slot", "sq_item", functype="ssizeargfunc") TYPE##::__getitem__; + // %feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") TYPE##::__setitem__; + %feature("python:slot", "mp_subscript", functype="binaryfunc") TYPE##::__getitem__; + %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") TYPE##::__setitem__; + +#endif +%extend TYPE { + %exception __getitem__ { + try + { + $action + } + catch (std::out_of_range& e) { + SWIG_exception(SWIG_IndexError,const_cast(e.what())); + } + catch (std::invalid_argument& e) { + SWIG_exception(SWIG_TypeError,const_cast(e.what())); + } + } + %newobject __getitem__; + RETTYPE __getitem__(const INDEXTYPE i) { return (*self).at(i); } + %exception __setitem__ { + try + { + $action + } + catch (std::out_of_range& e) { + SWIG_exception(SWIG_IndexError,const_cast(e.what())); + } + catch (std::invalid_argument& e) { + SWIG_exception(SWIG_TypeError,const_cast(e.what())); + } + } + void __setitem__(const INDEXTYPE i, const RETTYPE val) { (*self).at(i)=val; } + } +#elif defined(SWIGOCTAVE) +%extend TYPE { + %exception __brace__ { + try + { + $action + } + catch (std::out_of_range& e) { + SWIG_exception(SWIG_IndexError,const_cast(e.what())); + } + catch (std::invalid_argument& e) { + SWIG_exception(SWIG_TypeError,const_cast(e.what())); + } + } + %newobject __brace__; + RETTYPE __brace__(const INDEXTYPE i) { return (*self).at(i); } + %exception __brace_asgn__ { + try + { + $action + } + catch (std::out_of_range& e) { + SWIG_exception(SWIG_IndexError,const_cast(e.what())); + } + catch (std::invalid_argument& e) { + SWIG_exception(SWIG_TypeError,const_cast(e.what())); + } + } + void __brace_asgn__(const INDEXTYPE i, const RETTYPE val) { (*self).at(i)=val; } + } +#endif +%enddef + + // more or less redefinition of the above, when returning "by value" + // but doesn't seem to work yet +%define %ADD_indexaccessValue(TYPE...) + //TODO cannot do next line yet because of commas + //%ADD_indexaccess(int,TYPE##::value_type, TYPE); +#if defined(SWIGPYTHON) +#if defined(SWIGPYTHON_BUILTIN) + // %feature("python:slot", "sq_item", functype="ssizeargfunc") TYPE##::__getitem__; + // %feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") TYPE##::__setitem__; +%feature("python:slot", "mp_subscript", functype="binaryfunc") TYPE##::__getitem__; +%feature("python:slot", "mp_ass_subscript", functype="objobjargproc") TYPE##::__setitem__; +#endif +%extend TYPE { + TYPE##::value_type __getitem__(int i) + { + return (*self)[i]; + }; + void __setitem__(int i, const TYPE##::value_type val) { (*self)[i]=val; } + } +#endif +%enddef + + // more or less redefinition of the above, when returning "by reference" + // but doesn't seem to work yet +%define %ADD_indexaccessReference(TYPE...) + //TODO cannot do this because of commas + //%ADD_indexaccess(int,TYPE##::reference, TYPE); +#if defined(SWIGPYTHON) +#if defined(SWIGPYTHON_BUILTIN) + // %feature("python:slot", "sq_item", functype="ssizeargfunc") TYPE##::__getitem__; + // %feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") TYPE##::__setitem__; + %feature("python:slot", "mp_subscript", functype="binaryfunc") TYPE##::__getitem__; +%feature("python:slot", "mp_ass_subscript", functype="objobjargproc") TYPE##::__setitem__; +#endif +%extend TYPE { + TYPE##::reference __getitem__(int i) { return (*self)[i]; }; + void __setitem__(int i, const TYPE##::reference val) { (*self)[i]=val; } + } +#endif +%enddef + + // MACROS to call the above, but also instantiate the template +%define %template_withindexaccess(NAME,RETTYPE,TYPE...) +%template(NAME) TYPE; +%ADD_indexaccess(int,RETTYPE,TYPE); +%enddef +%define %template_withindexaccessValue(NAME,TYPE...) +%template(NAME) TYPE; +%ADD_indexaccessValue(TYPE); +%enddef +%define %template_withindexaccessReference(NAME,TYPE...) +%template(NAME) TYPE; +%ADD_indexaccessReference(TYPE); +%enddef + + // Finally, start with STIR specific definitions + +#if 1 +// #define used below to check what to do +#define STIRSWIG_SHARED_PTR + + // internally convert all pointers to shared_ptr. This prevents problems + // with STIR functions which accept a shared_ptr as input argument. +#define SWIG_SHARED_PTR_NAMESPACE stir +#ifdef SWIGOCTAVE + // TODO temp work-around +%include +#else +%include +#endif + +%shared_ptr(stir::TimedObject); +%shared_ptr(stir::ParsingObject); + +%shared_ptr(stir::ExamInfo); +%shared_ptr(stir::Scanner); +%shared_ptr(stir::ProjDataInfo); +%shared_ptr(stir::ProjDataInfoCylindrical); +%shared_ptr(stir::ProjDataInfoCylindricalArcCorr); +%shared_ptr(stir::ProjDataInfoCylindricalNoArcCorr); +%shared_ptr(stir::ProjData); +%shared_ptr(stir::ProjDataFromStream); +%shared_ptr(stir::ProjDataInterfile); + +// TODO cannot do this yet as then the FloatArray1D(FloatArray1D&) construction fails in test.py +//%shared_ptr(stir::Array<1,float>); +%shared_ptr(stir::Array<2,float>); +%shared_ptr(stir::Array<3,float>); +%shared_ptr(stir::DiscretisedDensity<3,float>); +%shared_ptr(stir::DiscretisedDensityOnCartesianGrid<3,float>); +%shared_ptr(stir::VoxelsOnCartesianGrid); +%shared_ptr(stir::SegmentBySinogram); +%shared_ptr(stir::SegmentByView); +%shared_ptr(stir::Segment); +%shared_ptr(stir::Sinogram); +%shared_ptr(stir::Viewgram); +// TODO we probably need a list of other classes here +#else +namespace boost { +template class shared_ptr +{ +public: +T * operator-> () const; +}; +} +#endif + +#if defined(SWIGPYTHON) + // these will be replaced by __getitem__ etc +%ignore *::at(int); +#endif +// always ignore these as they are unsafe in out-of-range index access (use at() instead) +%ignore *::operator[](const int); +%ignore *::operator[](int); +%ignore *::operator[](const int) const; +%ignore *::operator[](int) const; +// always ignore const versions as for swig they're the same +%ignore *::at(int) const; + +// William S Fulton trick for passing templates (wtih commas) through macro arguments +// (already defined in swgmacros.swg) +//#define %arg(X...) X + +%include "stir/TimedObject.h" +%include "stir/ParsingObject.h" +#if 0 +%include "stir/Object.h" +%include "stir/RegisteredObject.h" +#else + // use simpler version for SWIG to make the hierarchy a bit easier + namespace stir { + template + class RegisteredObject + { + public: + //! List all possible registered names to the stream + /*! Names are separated with newlines. */ + inline static void list_registered_names(std::ostream& stream); + }; + } +#endif +%warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) stir::RegisteredParsingObject::RegisteredIt; +%include "stir/RegisteredParsingObject.h" + + /* Parse the header files to generate wrappers */ +//%include "stir/shared_ptr.h" +%include "stir/Succeeded.h" +%include "stir/NumericType.h" +%include "stir/ByteOrder.h" +%include "stir/DetectionPosition.h" +%newobject stir::Scanner::get_scanner_from_name; +%include "stir/Scanner.h" + + /* First do coordinates, indices, images. + We first include them, and sort out template instantiation and indexing below. + */ + //%include + +%include "stir/BasicCoordinate.h" +%include "stir/Coordinate3D.h" +// ignore non-const versions +%ignore stir::CartesianCoordinate3D::z(); +%ignore stir::CartesianCoordinate3D::y(); +%ignore stir::CartesianCoordinate3D::x(); +%include "stir/CartesianCoordinate3D.h" +%include "stir/Coordinate2D.h" +// ignore const versions +%ignore stir::CartesianCoordinate2D::x() const; +%ignore stir::CartesianCoordinate2D::y() const; +%include "stir/CartesianCoordinate2D.h" + + // we have to ignore the following because of a bug in SWIG 2.0.4, but we don't need it anyway +%ignore *::IndexRange(const VectorWithOffset >& range); +%include "stir/IndexRange.h" + +%ignore stir::VectorWithOffset::get_const_data_ptr() const; +%ignore stir::VectorWithOffset::get_data_ptr(); +%ignore stir::VectorWithOffset::release_const_data_ptr() const; +%ignore stir::VectorWithOffset::release_data_ptr(); +%include "stir/VectorWithOffset.h" + +#if defined(SWIGPYTHON) + // TODO ideally would use %swig_container_methods but we don't have getslice yet +#if defined(SWIGPYTHON_BUILTIN) + %feature("python:slot", "nb_nonzero", functype="inquiry") __nonzero__; + %feature("python:slot", "sq_length", functype="lenfunc") __len__; +#endif // SWIGPYTHON_BUILTIN + +%extend stir::VectorWithOffset { + bool __nonzero__() const { + return !(self->empty()); + } + + /* Alias for Python 3 compatibility */ + bool __bool__() const { + return !(self->empty()); + } + + size_type __len__() const { + return self->size(); + } +#if 0 + // TODO this does not work yet + /* +%define %emit_swig_traits(_Type...) +%traits_swigtype(_Type); +%fragment(SWIG_Traits_frag(_Type)); +%enddef + +%emit_swig_traits(MyPrice) + */ + %swig_sequence_iterator(stir::VectorWithOffset); +#else + %newobject _iterator(PyObject **PYTHON_SELF); + swig::SwigPyIterator* _iterator(PyObject **PYTHON_SELF) { + return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); + } +#if defined(SWIGPYTHON_BUILTIN) + %feature("python:slot", "tp_iter", functype="getiterfunc") _iterator; +#else + %pythoncode {def __iter__(self): return self._iterator()} +#endif +#endif + } +#endif + +%include "stir/NumericVectorWithOffset.h" +// ignore these as problems with num_dimensions-1 +%ignore stir::Array::begin_all(); +%ignore stir::Array::begin_all() const; +%ignore stir::Array::begin_all_const() const; +%ignore stir::Array::end_all(); +%ignore stir::Array::end_all() const; +%ignore stir::Array::end_all_const() const; + +// need to ignore at(int) because of SWIG template bug with recursive num_dimensions +%ignore stir::Array::at(int) const; +%ignore stir::Array::at(int); + +// ignore as we will use ADD_indexvalue +%ignore stir::Array::at(const BasicCoordinate&); +%ignore stir::Array::at(const BasicCoordinate&) const; +%ignore stir::Array::at(const BasicCoordinate<1, int>&); +%ignore stir::Array::at(const BasicCoordinate<1, int>&) const; + +// ignore as unsafe index access (and using ADD_indexvalue) +%ignore stir::Array::operator[](const BasicCoordinate&); +%ignore stir::Array::operator[](const BasicCoordinate&) const; +%ignore stir::Array::operator[](const BasicCoordinate<1, int>&); +%ignore stir::Array::operator[](const BasicCoordinate<1, int>&) const; + +#ifdef SWIGPYTHON +// ignore as we will add a version that returns a tuple instead +%ignore stir::Array::shape() const; +#endif + +%include "stir/Array.h" + +// ignore this one and add it later (see below) +%ignore stir::DiscretisedDensity::read_from_file(const std::string& filename); +%include "stir/DiscretisedDensity.h" +%include "stir/DiscretisedDensityOnCartesianGrid.h" + +%include "stir/VoxelsOnCartesianGrid.h" + +%extend stir::VoxelsOnCartesianGrid { + // add read_from_file to this class, as currently there is no way + // to convert the swigged DiscretisedDensity to a VoxelsOnCartesianGrid + static stir::VoxelsOnCartesianGrid * read_from_file(const std::string& filename) + { + std::auto_ptr > + ret(stir::read_from_file >(filename)); + return dynamic_cast *>(ret.release()); + } + } + + //%ADD_indexaccess(int,stir::BasicCoordinate::value_type,stir::BasicCoordinate); +namespace stir { +#ifdef SWIGPYTHON + // add extra features to the coordinates to make them a bit more Python friendly + %extend BasicCoordinate { + //%feature("autodoc", "construct from tuple, e.g. (2,3,4) for a 3d coordinate") + BasicCoordinate(PyObject* args) + { + BasicCoordinate *c=new BasicCoordinate; + if (!swigstir::coord_from_tuple(*c, args)) + { + throw std::invalid_argument("Wrong type of argument to construct Coordinate used"); + } + return c; + }; + + // print as (1,2,3) as opposed to non-informative default provided by SWIG + std::string __str__() + { + std::ostringstream s; + s<<'('; + for (int d=1; d<=num_dimensions-1; ++d) + s << (*$self)[d] << ", "; + s << (*$self)[num_dimensions] << ')'; + return s.str(); + } + + // print as classname((1,2,3)) as opposed to non-informative default provided by SWIG + std::string __repr__() + { +#if SWIG_VERSION < 0x020009 + // don't know how to get the Python typename + std::string repr = "stir.Coordinate"; +#else + std::string repr = "$parentclasssymname"; +#endif + // TODO attempt to re-use __str__ above, but it doesn't compile, so we replicate the code + // repr += $self->__str__() + ')'; + std::ostringstream s; + s<<"(("; + for (int d=1; d<=num_dimensions-1; ++d) + s << (*$self)[d] << ", "; + s << (*$self)[num_dimensions] << ')'; + repr += s.str() + ")"; + return repr; + } + + bool __nonzero__() const { + return true; + } + + /* Alias for Python 3 compatibility */ + bool __bool__() const { + return true; + } + + size_type __len__() const { + return $self->size(); + } +#if defined(SWIGPYTHON_BUILTIN) + %feature("python:slot", "tp_str", functype="reprfunc") __str__; + %feature("python:slot", "tp_repr", functype="reprfunc") __repr__; + %feature("python:slot", "nb_nonzero", functype="inquiry") __nonzero__; + %feature("python:slot", "sq_length", functype="lenfunc") __len__; +#endif // SWIGPYTHON_BUILTIN + + } +#endif // PYTHONCODE + + %ADD_indexaccess(int, coordT, BasicCoordinate); + %template(Int3BasicCoordinate) BasicCoordinate<3,int>; + %template(Size3BasicCoordinate) BasicCoordinate<3,std::size_t>; + %template(Float3BasicCoordinate) BasicCoordinate<3,float>; + %template(Float3Coordinate) Coordinate3D< float >; + %template(FloatCartesianCoordinate3D) CartesianCoordinate3D; + + %template(Int2BasicCoordinate) BasicCoordinate<2,int>; + %template(Size2BasicCoordinate) BasicCoordinate<2,std::size_t>; + %template(Float2BasicCoordinate) BasicCoordinate<2,float>; + // TODO not needed in python case? + %template(Float2Coordinate) Coordinate2D< float >; + %template(FloatCartesianCoordinate2D) CartesianCoordinate2D; + + //#ifndef SWIGPYTHON + // not necessary for Python as we can use tuples there + %template(make_IntCoordinate) make_coordinate; + %template(make_FloatCoordinate) make_coordinate; + //#endif + + %template(IndexRange1D) IndexRange<1>; + // %template(IndexRange1DVectorWithOffset) VectorWithOffset >; + %template(IndexRange2D) IndexRange<2>; + //%template(IndexRange2DVectorWithOffset) VectorWithOffset >; + %template(IndexRange3D) IndexRange<3>; + + %ADD_indexaccess(int,T,VectorWithOffset); + %template(FloatVectorWithOffset) VectorWithOffset; + + // TODO need to instantiate with name? + %template (FloatNumericVectorWithOffset) NumericVectorWithOffset; + +#ifdef SWIGPYTHON + // TODO this extends ND-Arrays, but apparently not 1D Arrays (because specialised template?) + %extend Array{ + // add "flat" iterator, using begin_all() + %newobject flat(PyObject **PYTHON_SELF); + swig::SwigPyIterator* flat(PyObject **PYTHON_SELF) { + return swigstir::make_forward_iterator(self->begin_all(), self->begin_all(), self->end_all(), *PYTHON_SELF); + } + // add tuple indexing + elemT __getitem__(PyObject* const args) + { + stir::BasicCoordinate c; + if (!swigstir::coord_from_tuple(c, args)) + { + throw std::invalid_argument("Wrong type of indexing argument used"); + } + return (*$self).at(c); + }; + void __setitem__(PyObject* const args, const elemT value) + { + stir::BasicCoordinate c; + if (!swigstir::coord_from_tuple(c, args)) + { + throw std::invalid_argument("Wrong type of indexing argument used"); + } + (*$self).at(c) = value; + }; + + //! shape version returning a tuple (almost) compatible with numpy + // use as array.shape() + const PyObject* shape() + { + //const stir::BasicCoordinate c = (*$self).shape(); + stir::BasicCoordinate minind,maxind; + if (!$self->get_regular_range(minind, maxind)) + throw std::range_error("shape called on irregular array"); + stir::BasicCoordinate sizes=maxind-minind+1; + return swigstir::tuple_from_coord(sizes); + } + + } +#endif + + %extend Array{ + // add way to know how many dimensions there are + int get_num_dimensions() + { + return num_dimensions; + } + } + + // TODO next line doesn't give anything useful as SWIG doesn't recognise that + // the return value is an array. So, we get a wrapped object that we cannot handle + //%ADD_indexaccess(int,Array::value_type, Array); + + %ADD_indexaccess(%arg(const BasicCoordinate&),elemT, Array); + + %template(FloatArray1D) Array<1,float>; + + // this doesn't work because of bug in swig (incorrectly parses num_dimensions) + //%ADD_indexaccess(int,%arg(Array), Array); + // In any case, even if the above is made to work (e.g. explicit override for every class as below) + // then setitem still doesn't modify the object for more than 1 level +#if 1 + // note: next line has no memory allocation problems because all Array<1,...> objects + // are auto-converted to shared_ptrs. + // however, cannot use setitem to modify so ideally we would define getitem only (at least for python) (TODO) + // TODO DISABLE THIS + %ADD_indexaccess(int,%arg(Array<1,float>),%arg(Array<2,float>)); +#endif + +} // namespace stir + + // Todo need to instantiate with name? + // TODO Swig doesn't see that Array<2,float> is derived from it anyway becuse of num_dimensions bug +%template (FloatNumericVectorWithOffset2D) stir::NumericVectorWithOffset, float>; + + %template(FloatArray2D) stir::Array<2,float>; + // TODO name + %template (FloatNumericVectorWithOffset3D) stir::NumericVectorWithOffset, float>; + %template(FloatArray3D) stir::Array<3,float>; +#if 0 + %ADD_indexaccess(int,%arg(stir::Array<2,float>),%arg(stir::Array<3,float>)); +#endif + +%template(Float3DDiscretisedDensity) stir::DiscretisedDensity<3,float>; +%template(Float3DDiscretisedDensityOnCartesianGrid) stir::DiscretisedDensityOnCartesianGrid<3,float>; +%template(FloatVoxelsOnCartesianGrid) stir::VoxelsOnCartesianGrid; + + +#ifdef STIRSWIG_SHARED_PTR +#define DataT stir::DiscretisedDensity<3,float> +%shared_ptr(stir::OutputFileFormat >); +%shared_ptr(stir::RegisteredObject< stir::OutputFileFormat< stir::DiscretisedDensity< 3,float > > >); +%shared_ptr(stir::RegisteredParsingObject< stir::InterfileOutputFileFormat, stir::OutputFileFormat, stir::OutputFileFormat >); +#undef DataT +%shared_ptr(stir::InterfileOutputFileFormat); +#ifdef HAVE_LLN_MATRIX +%shared_ptr(stir::RegisteredParsingObject, stir::OutputFileFormat >); +%shared_ptr(stir::ecat::ecat7::ECAT7OutputFileFormat); +#endif +#endif + +%include "stir/IO/OutputFileFormat.h" + +#define DataT stir::DiscretisedDensity<3,float> +%template(Float3DDiscretisedDensityOutputFileFormat) stir::OutputFileFormat; + //cannot do that as pure virtual functions + //%template(ROOutputFileFormat3DFloat) RegisteredObject< OutputFileFormat< DiscretisedDensity< 3,float > > >; + %template(RPInterfileOutputFileFormat) stir::RegisteredParsingObject, stir::OutputFileFormat >; + #undef DataT + +%include "stir/IO/InterfileOutputFileFormat.h" +#ifdef HAVE_LLN_MATRIX +%include "stir/IO/ECAT7OutputFileFormat.h" +#endif + + /* Now do ProjDataInfo, Sinogram et al + */ +// ignore non-const versions +%ignore stir::Bin::segment_num(); +%ignore stir::Bin::axial_pos_num(); +%ignore stir::Bin::view_num(); +%ignore stir::Bin::tangential_pos_num(); +%include "stir/Bin.h" +%newobject stir::ProjDataInfo::ProjDataInfoGE; +%newobject stir::ProjDataInfo::ProjDataInfoCTI; +%include "stir/ProjDataInfo.h" +%include "stir/ProjDataInfoCylindrical.h" +%include "stir/ProjDataInfoCylindricalArcCorr.h" +%include "stir/ProjDataInfoCylindricalNoArcCorr.h" + +%include "stir/Viewgram.h" +%include "stir/RelatedViewgrams.h" +%include "stir/Sinogram.h" +%include "stir/Segment.h" +%include "stir/SegmentByView.h" +%include "stir/SegmentBySinogram.h" +%include "stir/ProjData.h" + +%include "stir/ProjDataFromStream.h" +%include "stir/ProjDataInterfile.h" + +namespace stir { + %template(FloatViewgram) Viewgram; + %template(FloatSinogram) Sinogram; + // TODO don't want to give a name + %template(FloatSegment) Segment; + %template(FloatSegmentBySinogram) SegmentBySinogram; + %template(FloatSegmentByView) SegmentByView; + // should not have the following if using boost_smart_ptr.i + // %template(SharedScanner) boost::shared_ptr; + //%template(SharedProjData) boost::shared_ptr; + +} + +// filters +#ifdef STIRSWIG_SHARED_PTR +#define elemT float +%shared_ptr(stir::DataProcessor >) +%shared_ptr(stir::RegisteredParsingObject< + stir::ChainedDataProcessor >, + stir::DataProcessor >, + stir::DataProcessor > >) +%shared_ptr(stir::ChainedDataProcessor >) +%shared_ptr(stir::RegisteredParsingObject, + stir::DataProcessor >, + stir::DataProcessor > >) +%shared_ptr(stir::SeparableCartesianMetzImageFilter) +#undef elemT +#endif + +%include "stir/DataProcessor.h" +%include "stir/ChainedDataProcessor.h" +%include "stir/SeparableCartesianMetzImageFilter.h" + +#define elemT float +%template(DataProcessor3DFloat) stir::DataProcessor >; +%template(RPChainedDataProcessor3DFloat) stir::RegisteredParsingObject< + stir::ChainedDataProcessor >, + stir::DataProcessor >, + stir::DataProcessor > >; +%template(ChainedDataProcessor3DFloat) stir::ChainedDataProcessor >; +%template(RPSeparableCartesianMetzImageFilter3DFloat) stir::RegisteredParsingObject< + stir::SeparableCartesianMetzImageFilter, + stir::DataProcessor >, + stir::DataProcessor > >; + +%template(SeparableCartesianMetzImageFilter3DFloat) stir::SeparableCartesianMetzImageFilter; +#undef elemT + + // reconstruction +#ifdef STIRSWIG_SHARED_PTR +%shared_ptr(stir::GeneralisedObjectiveFunction >); +%shared_ptr(stir::PoissonLogLikelihoodWithLinearModelForMean >); +#define TargetT stir::DiscretisedDensity<3,float> +%shared_ptr(stir::RegisteredParsingObject, + stir::GeneralisedObjectiveFunction, + stir::PoissonLogLikelihoodWithLinearModelForMean >); +#undef TargetT + +%shared_ptr(stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData >); + +%shared_ptr(stir::Reconstruction >); +%shared_ptr(stir::IterativeReconstruction >); +%shared_ptr(stir::OSMAPOSLReconstruction >); +#endif + +%include "stir/recon_buildblock/GeneralisedObjectiveFunction.h" +%include "stir/recon_buildblock/GeneralisedObjectiveFunction.h" +%include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMean.h" +%include "stir/recon_buildblock/PoissonLogLikelihoodWithLinearModelForMeanAndProjData.h" + +%include "stir/recon_buildblock/Reconstruction.h" +%include "stir/recon_buildblock/IterativeReconstruction.h" +%include "stir/OSMAPOSL/OSMAPOSLReconstruction.h" + + +%template (GeneralisedObjectiveFunction3DFloat) stir::GeneralisedObjectiveFunction >; +#%template () stir::GeneralisedObjectiveFunction >; +%template (PoissonLogLikelihoodWithLinearModelForMean3DFloat) stir::PoissonLogLikelihoodWithLinearModelForMean >; + +#define TargetT stir::DiscretisedDensity<3,float> +// TODO do we really need this name? +// Without it we don't see the parsing functions in python... +// Note: we cannot start it with __ as then we we get a run-time error when we're not using the builtin option +%template(RPPoissonLogLikelihoodWithLinearModelForMeanAndProjData3DFloat) stir::RegisteredParsingObject, + stir::GeneralisedObjectiveFunction, + stir::PoissonLogLikelihoodWithLinearModelForMean >; + +%template (PoissonLogLikelihoodWithLinearModelForMeanAndProjData3DFloat) stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData >; + +%inline %{ + template + stir::PoissonLogLikelihoodWithLinearModelForMeanAndProjData * + ToPoissonLogLikelihoodWithLinearModelForMeanAndProjData(stir::GeneralisedObjectiveFunction *b) { + return dynamic_cast*>(b); +} +%} + +%template(ToPoissonLogLikelihoodWithLinearModelForMeanAndProjData3DFloat) ToPoissonLogLikelihoodWithLinearModelForMeanAndProjData >; + + +%template (Reconstruction3DFloat) stir::Reconstruction >; +%template (IterativeReconstruction3DFloat) stir::IterativeReconstruction >; +%template (OSMAPOSLReconstruction3DFloat) stir::OSMAPOSLReconstruction >; diff --git a/src/swig/stirextra.py b/src/swig/stirextra.py new file mode 100755 index 0000000000..8edc40bff1 --- /dev/null +++ b/src/swig/stirextra.py @@ -0,0 +1,75 @@ +# A simple module with a few python functions to make it easier to work with STIR +# Copyright (C) 2012 Kris Thielemans +# Copyright (C) 2013 University College London + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +import numpy +import stir +import exceptions + +def get_bounding_box_indices(image): + """ + return [min,max] tuple with indices of first and last voxel in a STIR image + """ + num_dims = image.get_num_dimensions(); + if num_dims == 2: + minind=stir.Int2BasicCoordinate() + maxind=stir.Int2BasicCoordinate() + elif num_dims == 3: + minind=stir.Int3BasicCoordinate() + maxind=stir.Int3BasicCoordinate() + else: + raise exceptions.NotImplementedError('need to handle dimensions different from 2 and 3') + + image.get_regular_range(minind, maxind); + return [minind, maxind] + +def get_physical_coordinates_for_bounding_box(image): + """ + return physical coordinates (in mm) for the first and last voxel in a STIR image + """ + [minind,maxind]=get_bounding_box_indices(image); + minphys=image.get_physical_coordinates_for_indices(minind); + maxphys=image.get_physical_coordinates_for_indices(maxind); + return [minphys, maxphys] + +def get_physical_coordinates_for_grid(image): + """ + return [z,y,x] tuple of grid coordinates for a STIR image + """ + [minind,maxind]=get_bounding_box_indices(image); + sizes=maxind-minind+1; + minphys=image.get_physical_coordinates_for_indices(minind); + maxphys=image.get_physical_coordinates_for_indices(maxind); + num_dims = image.get_num_dimensions(); + if num_dims == 2: + [y,x]=numpy.mgrid[minphys[1]:maxphys[1]:sizes[1]*1j, minphys[2]:maxphys[2]:sizes[2]*1j]; + return [y,x] + elif num_dims == 3: + [z,y,x]=numpy.mgrid[minphys[1]:maxphys[1]:sizes[1]*1j, minphys[2]:maxphys[2]:sizes[2]*1j, minphys[3]:maxphys[3]:sizes[3]*1j]; + return [z,y,x] + else: + raise exceptions.NotImplementedError('need to handle dimensions different from 2 and 3') + +def to_numpy(image): + """ + return the data in a STIR image as a 3D numpy array + """ + # construct a numpy array using the "flat" STIR iterator + npimage=numpy.fromiter(image.flat(), dtype=numpy.float32); + # now reshape into ND array + npimage=npimage.reshape(image.shape()); + return npimage diff --git a/src/swig/test/python/README.txt b/src/swig/test/python/README.txt new file mode 100644 index 0000000000..a40fec14b6 --- /dev/null +++ b/src/swig/test/python/README.txt @@ -0,0 +1,58 @@ +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +This directory contains test scripts for calling STIR from Python. + +INSTALLATION + +See the README.txt in the swig sub-directory. + +TESTING + +You will need py.test. If there is no package for it on your system, it should be +easy to install, see http://pytest.org. + +Then, running the tests is simple. For example + +$ py.test test_buildblock.py + +You should then see something like + +============================= test session starts ============================== +platform linux2 -- Python 2.7.2 -- pytest-1.3.4 +test path 1: test_buildblock.py + +test_buildblock.py ........... + +========================== 11 passed in 0.10 seconds =========================== + + +If there is a failure, you would see this clearly indicated. For instance + +============================= test session starts ============================== +platform linux2 -- Python 2.7.2 -- pytest-1.3.4 +test path 1: test_buildblock.py + +test_buildblock.py ...........F + +=================================== FAILURES =================================== +___________________________ test_illustrate_failure ____________________________ + + def test_illustrate_failure(): +> assert 0 +E assert 0 + +test_buildblock.py:183: AssertionError +===================== 1 failed, 11 passed in 0.18 seconds ====================== diff --git a/src/swig/test/python/test_IO.py b/src/swig/test/python/test_IO.py new file mode 100755 index 0000000000..6a20326361 --- /dev/null +++ b/src/swig/test/python/test_IO.py @@ -0,0 +1,78 @@ +# Test file for STIR IO py.test +# Use as follows: +# on command line +# py.test test_IO.py + + +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +from stir import * +from stirextra import * +import itertools +import os + +def test_FloatVoxelsOnCartesianGrid(tmpdir): + tmpdir.chdir() + print "Creating files in ", os.getcwd() + origin=FloatCartesianCoordinate3D(0,1,6) + gridspacing=FloatCartesianCoordinate3D(1,1,2) + minind=Int3BasicCoordinate(3) + maxind=Int3BasicCoordinate(9) + indrange=IndexRange3D(minind,maxind) + image=FloatVoxelsOnCartesianGrid(indrange, origin,gridspacing) + image[(5,3,4)]=2 + print image.shape() + output_format=InterfileOutputFileFormat() + output_format.write_to_file("stir_python_test.hv", image) + image2=FloatVoxelsOnCartesianGrid.read_from_file('stir_python_test.hv') + assert image.get_voxel_size()==image2.get_voxel_size() + assert image.shape()==image2.shape() + assert get_physical_coordinates_for_bounding_box(image) == get_physical_coordinates_for_bounding_box(image2) + for i1,i2 in itertools.izip(image.flat(), image2.flat()): + assert abs(i1-i2)<.01 + +def test_ProjDataInfo(tmpdir): + tmpdir.chdir() + print "Creating files in ", os.getcwd() + s=Scanner.get_scanner_from_name("ECAT 962") + #ProjDataInfoCTI(const shared_ptr& scanner_ptr, + # const int span, const int max_delta, + # const int num_views, const int num_tangential_poss, + # + projdatainfo=ProjDataInfo.ProjDataInfoCTI(s,3,6,8,6) + assert projdatainfo.get_scanner_ptr().get_num_rings()==32 + projdata=ProjDataInterfile(projdatainfo, "stir_python_test.hs") + print projdata.get_min_segment_num() + print projdata.get_max_segment_num() + for seg in xrange(projdata.get_min_segment_num(), projdata.get_max_segment_num()+1): + segment=projdatainfo.get_empty_segment_by_view(seg) + segment.fill(seg+100) + assert projdata.set_segment(segment)==Succeeded(Succeeded.yes) + # now delete object such that the file gets closed and we can read it + del projdata + + projdata2=ProjData.read_from_file('stir_python_test.hs'); + assert projdatainfo==projdata2.get_proj_data_info_ptr() + for seg in xrange(projdata2.get_min_segment_num(), projdata2.get_max_segment_num()+1): + # construct same segment data as above (TODO: better to stick it into a list or so) + segment=projdatainfo.get_empty_segment_by_view(seg) + segment.fill(seg+100) + # read from file + segment2=projdata2.get_segment_by_view(seg) + # compare + for i1,i2 in itertools.izip(segment.flat(), segment2.flat()): + assert abs(i1-i2)<.01 + diff --git a/src/swig/test/python/test_buildblock.py b/src/swig/test/python/test_buildblock.py new file mode 100755 index 0000000000..e42352bb7a --- /dev/null +++ b/src/swig/test/python/test_buildblock.py @@ -0,0 +1,175 @@ +# Test file for STIR buildblock py.test +# Use as follows: +# on command line +# py.test test_buildblock.py + + +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +import py.test +from stir import * + +def test_Vector(): + dv=FloatVector(3) + dv[2]=1 + #for a in dv: + #print a + #assert dv[0]==0 #probably not initialised + #assert dv[1]==0 #probably not initialised + assert dv[2]==1 + + # assign same vector to another variable + dvcopy=dv; + # this will modify the original vector as well (as they are the same) + # this behaviour is the same as for a Python list, but is different from C++ + dvcopy[2]=4; + assert dv[2]==dvcopy[2] + + # instead, in Python we need to explicitly create a new object + dvcopy=FloatVector(dv) + dvcopy[2]=dv[2]+2; + assert dv[2]+2 == dvcopy[2] + +def test_Coordinate(): + #a=make_FloatCoordinate(1,2,3) + a=Float3BasicCoordinate((1,2,3)) + assert a.__getitem__(1)==1 + assert a[2]==2 + + a=Float3Coordinate(1,2,3) + assert a[2]==2 + # use tuple constructor + a=Float3BasicCoordinate((1,2,3)) + assert a[3]==3 + +def test_VectorWithOffset(): + v=FloatVectorWithOffset(1,3) + v[2]=3 + assert v[2]==3 + #assert v[1]==0 #probably not initialised + with py.test.raises(IndexError): + v[0] # check index-out-of-range + +def test_Array1D(): + a=FloatArray1D(1,5) + a[2]=3 + assert a[2]==3 + #help(FloatArray1D) + # create a copy + a2=FloatArray1D(a); + # this should not modify the original + a2[2]=4 + assert a[2]==3 + assert a2[2]==4 + +def test_Array1Diterator(): + a=FloatArray1D(1,3) + a[2]=3 + a[1]=2 + sum=0 + for el in a: sum+=el + assert sum==a.sum() + +def test_Array2D(): + a2=FloatArray2D(IndexRange2D(Int2BasicCoordinate((3,3)), Int2BasicCoordinate((9,9)))) + a2.fill(2); + ind=Int2BasicCoordinate((4,5)) + assert a2[ind]==2 + a2[ind]=4 + assert a2[ind]==4 + assert a2[(4,5)]==4 + #assert a2[ind[1]][ind[2]]==4 + # let's set a whole row + #a1=a2[4] + #a1[5]=66; + #print 'original value in 2D array should be 2:', a2[make_IntCoordinate(4,5)], ', but the value in the copied row has to be 66:', a1[5] + #a2[4]=a1 + #print 'now the entry in the 2D array has to be modified to 66 as well:', a2[Int2BasicCoordinate((4,5))] + +def test_Array2Diterator(): + a2=FloatArray2D(IndexRange2D(Int2BasicCoordinate((3,3)), Int2BasicCoordinate((9,9)))) + a2.fill(2); + # use flat iterator, i.e. go over all elements + assert a2.sum() == sum(a2.flat()) + +def test_Array3D(): + minind=Int3BasicCoordinate(3) + maxind=Int3BasicCoordinate(9) + maxind[3]=11; + indrange=IndexRange3D(minind,maxind) + a3=FloatArray3D(indrange) + minindtest=Int3BasicCoordinate(1) + maxindtest=Int3BasicCoordinate(1) + a3.get_regular_range(minindtest, maxindtest) + assert minindtest==minind + assert maxindtest==maxind + assert a3.shape()==(7,7,9) + a3.fill(2) + ind=Int3BasicCoordinate((4,5,6)) + assert a3[ind]==2 + a3[ind]=9 + assert a3[(4,5,6)]==9 + assert a3.find_max()==9 + +def test_FloatVoxelsOnCartesianGrid(): + origin=FloatCartesianCoordinate3D(0,1,6) + gridspacing=FloatCartesianCoordinate3D(1,1,2) + minind=Int3BasicCoordinate(3) + maxind=Int3BasicCoordinate(9) + indrange=IndexRange3D(minind,maxind) + image=FloatVoxelsOnCartesianGrid(indrange, origin,gridspacing) + org= image.get_origin() + assert org==origin + image.fill(2) + ind=Int3BasicCoordinate((4,4,4)) + assert image[ind]==2 + assert image[(5,3,4)]==2 + # construct from array + a3=FloatArray3D(indrange) + a3.fill(1.4); + image=FloatVoxelsOnCartesianGrid(a3, origin,gridspacing) + assert abs(image[ind]-1.4)<.001 + # change original array + a3.fill(2) + # shouldn't change image constructed from array + assert abs(image[ind]-1.4)<.001 + +def test_Scanner(): + s=Scanner.get_scanner_from_name("ECAT 962") + assert s.get_num_rings()==32 + assert s.get_num_detectors_per_ring()==576 + #l=s.get_all_names() + #print s + # does not work + #for a in l: + # print a + +def test_ProjDataInfo(): + s=Scanner.get_scanner_from_name("ECAT 962") + #ProjDataInfoCTI(const shared_ptr& scanner_ptr, + # const int span, const int max_delta, + # const int num_views, const int num_tangential_poss, + # + projdatainfo=ProjDataInfo.ProjDataInfoCTI(s,3,3,8,6) + #print projdatainfo + assert projdatainfo.get_scanner_ptr().get_num_rings()==32 + sinogram=projdatainfo.get_empty_sinogram(1,3) + assert sinogram.sum()==0 + assert sinogram.get_segment_num()==3 + assert sinogram.get_axial_pos_num()==1 + assert sinogram.get_num_views() == projdatainfo.get_num_views() + assert sinogram.get_proj_data_info_ptr() == projdatainfo + diff --git a/src/swig/test/python/test_numpy.py b/src/swig/test/python/test_numpy.py new file mode 100755 index 0000000000..40080a52ae --- /dev/null +++ b/src/swig/test/python/test_numpy.py @@ -0,0 +1,53 @@ +# Test file for conversions from STIR to numpy arrays (using py.test) +# Use as follows: +# on command line +# py.test test_numpy.py + + +# Copyright (C) 2013 University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +import py.test +from stir import * +import stirextra +import itertools + +def test_Array2D(): + minind=Int2BasicCoordinate((3,3)); + a=FloatArray2D(IndexRange2D(minind, Int2BasicCoordinate((9,8)))) + a.fill(2); + ind=Int2BasicCoordinate((4,5)); + a[ind]=4 + np=stirextra.to_numpy(a); + assert np[(0,0)]==2 + npind=(ind[1]-minind[1], ind[2]-minind[2]) + assert np[npind]==a[ind] + +def test_Array2Diterator(): + a=FloatArray2D(IndexRange2D(Int2BasicCoordinate((1,3)), Int2BasicCoordinate((3,9)))) + for i1,i2 in itertools.izip(a.flat(), range(a.size_all())): + i1=i2; + np=stirextra.to_numpy(a); + for i1,i2 in itertools.izip(a.flat(), np.flat): + assert abs(i1-i2)<.01 + +def test_Array3Diterator(): + a=FloatArray3D(IndexRange3D(Int3BasicCoordinate((1,3,-1)), Int3BasicCoordinate((3,9,5)))) + for i1,i2 in itertools.izip(a.flat(), range(a.size_all())): + i1=i2; + np=stirextra.to_numpy(a); + for i1,i2 in itertools.izip(a.flat(), np.flat): + assert abs(i1-i2)<.01 + diff --git a/src/test.mk b/src/test.mk new file mode 100644 index 0000000000..9b52504528 --- /dev/null +++ b/src/test.mk @@ -0,0 +1,126 @@ +# +# Author Kris Thielemans +# Copyright 2004- 2009 Hammersmith Imanet Ltd +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# This file will/can be included by a makefile skeleton in a subdirectory +# Requirements: +# the skeleton should set the following variables +# dir must be set to the subdirectory name (relative to the location of Makefile) +# $(dir)_TEST_SOURCES must be set to a list of .cxx and/or .c files (without path) +# that will be used for non-interactive tests +# $(dir)_TEST_INTERACTIVE_SOURCES is similar for interactive tests +# it must have a target run_$(dir)/some_test_exe +# for any 'some_test_exe' that needs command line arguments +# or other non-standard command line +# Ideally, all your run_$(dir)/some_test_exe targets depend on PHONY_TARGET (see below) +# similarly, it must have a target run_interactive_$(dir)/some_test_exe +# Result: +# targets build_tests_$(dir), clean_tests_$(dir) +# run_tests_$(dir), run_interactive_tests_$(dir) +# run_$(dir)/file for any file in $(dir)_TEST_SOURCES +# $(dir)/file for any file in $(dir)_TEST_SOURCES (which depends on $(DEST)$(dir)/file) +# (see below) +# some variables (but you shouldn't count on those remaining the same) +# +# +# Example for dir=SUBDIR +# +# make build_tests_SUBDIR will compile and link all executables +# make clean_tests_SUBDIR will remove all generated files +# make run_tests_SUBDIR will run tests for all (non-interactive) executables +# make run_SUBDIR/somefile will run a single test +# make SUBDIR/somefile will build a single test + +#$(warning including test.mk from $(dir)) + + +$(dir)_RUN_TEST_TARGETS:= \ + $(patsubst %.cxx, run_$(dir)/%, $(filter %.cxx, $($(dir)_TEST_SOURCES))) \ + $(patsubst %.c, run_$(dir)/%, $(filter %.c, $($(dir)_TEST_SOURCES))) +$(dir)_RUN_INTERACTIVE_TEST_TARGETS:= \ + $(patsubst %.cxx, run_$(dir)/%, $(filter %.cxx, $($(dir)_INTERACTIVE_TEST_SOURCES))) \ + $(patsubst %.c, run_$(dir)/%, $(filter %.c, $($(dir)_INTERACTIVE_TEST_SOURCES))) + + +run_tests_$(dir): $($(dir)_RUN_TEST_TARGETS) + +run_interactive_tests_$(dir): $($(dir)_RUN_INTERACTIVE_TEST_TARGETS) + +# default rule for run_$(dir)/some_test_exe +# This rule just runs the corresponding executable +run_$(dir)/% : $(DEST)$(dir)/% PHONY_TARGET + $< +# Notes on above rule: +# Ideally, we would make all targets in $($(dir)_RUN_TEST_TARGETS) phony. +# However, make does not look for built-in rules for phony targets. +# So, instead, we let them depend on a phony target. Sorry. +# +# For some reason, I need $(dir) in there. The following does not work +# run_% : $(DEST)% PHONY_TARGET +# (probably because of the /) + +.PHONY: PHONY_TARGET + +# variables for the build* and clean* targets +$(dir)_ALL_TEST_SOURCES:= $($(dir)_TEST_SOURCES) $($(dir)_TEST_INTERACTIVE_SOURCES) +$(dir)_ALL_TEST_SOURCES:= $(addprefix $(dir)/, $($(dir)_ALL_TEST_SOURCES)) + +$(dir)_TEST_OBJS:= \ + $(patsubst %.cxx, $(DEST)%$(O_SUFFIX), $(filter %.cxx, $($(dir)_ALL_TEST_SOURCES))) \ + $(patsubst %.c, $(DEST)%$(O_SUFFIX), $(filter %.c, $($(dir)_ALL_TEST_SOURCES))) +$(dir)_TEST_EXES:= \ + $(patsubst %$(O_SUFFIX), %, $($(dir)_TEST_OBJS)) +$(dir)_TEST_OBJS_without_DEST:= \ + $(patsubst %.cxx, %$(O_SUFFIX), $(filter %.cxx, $($(dir)_ALL_TEST_SOURCES))) \ + $(patsubst %.c, %$(O_SUFFIX), $(filter %.c, $($(dir)_ALL_TEST_SOURCES))) +$(dir)_TEST_EXES_without_DEST:= \ + $(patsubst %$(O_SUFFIX), %, $($(dir)_TEST_OBJS_without_DEST)) + +$(dir)_TEST_EXE_FILENAMES := $(addsuffix $(EXE_SUFFIX), $($(dir)_TEST_EXES)) + +.PHONY: build_tests_$(dir) clean_tests_$(dir) run_tests_$(dir) run_interactive_tests_$(dir) + + +# make sure 'make' keeps the .o files +# otherwise they will be deleted +.PRECIOUS: $($(dir)_ALL_TEST_OBJS)) + +# trick (from the GNU make manual) to define a target for every file which just +# depends on $(DEST)/file. The advantage for the user is that she doesn't +# have to type $(DEST) explictly anymore + +define PROGRAM_template +$(1): $(DEST)$(1) + +.PHONY: $(1) +endef + +$(foreach prog,$($(dir)_TEST_EXES_without_DEST),$(eval $(call PROGRAM_template,$(prog)))) + +build_tests_$(dir): $($(dir)_TEST_EXES) + +clean_tests_$(dir): + rm -f $($(@:clean_tests_%=%)_TEST_EXE_FILENAMES) + rm -f $($(@:clean_tests_%=%)_TEST_OBJS) + rm -f $(DEST)$(@:clean_tests_%=%)/*.P + + +ifneq ($(MAKECMDGOALS:clean%=clean),clean) + -include \ + $(patsubst %.cxx, $(DEST)%.P, $(filter %.cxx, $($(dir)_ALL_TEST_SOURCES))) \ + $(patsubst %.c, $(DEST)%.P, $(filter %.c, $($(dir)_ALL_TEST_SOURCES))) +endif + +# set to some garbage such that we get an error when the next skeleton forgets to set dir +dir := dir_not_set_in_test.mk diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt new file mode 100644 index 0000000000..7a47cf2f7a --- /dev/null +++ b/src/test/CMakeLists.txt @@ -0,0 +1,113 @@ +# Copyright (C) 2011-2012, Kris Thielemans +# Copyright (C) 2013, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file declaring all tests in the test subdirectory +set(dir test) + +set(dir_SIMPLE_TEST_EXE_SOURCES ${dir}_SIMPLE_TEST_EXE_SOURCES) +set(dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES ${dir}_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES) +set(dir_INVOLVED_TEST_EXE_SOURCES ${dir}_INVOLVED_TEST_EXE_SOURCES) + +set(${dir_SIMPLE_TEST_EXE_SOURCES} + test_ROIs + test_warp_image + test_DynamicDiscretisedDensity +) + +set(${dir_TEST_EXE_SOURCES_NO_REGISTRIES} + test_ArrayFilter + test_proj_data_info +) + +Set(${dir_INVOLVED_TEST_EXE_SOURCES} + test_OutputFileFormat + test_linear_regression + test_stir_math + # the next 2 are interactive, so we don't add a test for it, but only compile them + test_display + test_interpolate +) + +set(buildblock_simple_tests + test_Array + test_NestedIterator + test_VectorWithOffset + test_convert_array + test_IndexRange + test_coordinates + test_filename_functions + test_VoxelsOnCartesianGrid + test_zoom_image + test_ByteOrder + test_Scanner + test_ArcCorrection + test_find_fwhm_in_image +) + +include(stir_test_exe_targets) + +foreach(source ${buildblock_simple_tests}) + create_stir_test(${source} "buildblock;IO;buildblock" "") +endforeach() + +### add tests for the "involved" commands +### i.e. those that need command line arguments + +ADD_TEST(test_linear_regression + ${CMAKE_CURRENT_BINARY_DIR}/test_linear_regression ${CMAKE_CURRENT_SOURCE_DIR}/input/test_linear_regression.in +) + +## test_stir_math needs to know the location of the stir_math executable +# Note that we cannot use get_target_property(var stir_math LOCATION) as it doesn't work for Visual Studio. +# Luckily, the following is simple enough (and in the cmake add_test documentation) +ADD_TEST(NAME test_stir_math + COMMAND test_stir_math $ +) +# Final note: we could use this to avoid the use of ${CMAKE_CURRENT_BINARY_DIR} in the other tests, but both strategies work fine. + +## add tests for OutputFileFormat + +# we first construct a list of all input files +set(file_format_tests + test_InterfileOutputFileFormat.in + test_InterfileOutputFileFormat_short.in +) + +if (HAVE_ECAT) + #message("WARNING: ECAT6 tests currently disabled") + list(APPEND file_format_tests + test_ECAT7OutputFileFormat.in + ) +else(HAVE_ECAT) + #message("No ECAT6/7 support compiled, so no tests for this file format") +endif(HAVE_ECAT) + +if (HAVE_ITK) + list(APPEND file_format_tests + test_ITKDefaultOutputFileFormat.in + test_ITKNiftiOutputFileFormat.in + ) +endif() + +# now for each of these, add a test +foreach(file_format ${file_format_tests}) + set(test_name test_OutputFileFormat_${file_format}) + ADD_TEST(${test_name} + ${CMAKE_CURRENT_BINARY_DIR}/test_OutputFileFormat ${CMAKE_CURRENT_SOURCE_DIR}/input/${file_format} +) +endforeach() + + diff --git a/src/test/input/test_ECAT6OutputFileFormat.in b/src/test/input/test_ECAT6OutputFileFormat.in new file mode 100644 index 0000000000..25a022cd69 --- /dev/null +++ b/src/test/input/test_ECAT6OutputFileFormat.in @@ -0,0 +1,8 @@ +Test OutputFileFormat Parameters:= +output file format type := ecat6 +ecat6 Output File Format Parameters:= +number format := float +number_of_bytes_per_pixel:=4 +default scanner name := ECAT 953 +End ecat6 Output File Format Parameters:= +End:= diff --git a/src/test/input/test_ECAT7OutputFileFormat.in b/src/test/input/test_ECAT7OutputFileFormat.in new file mode 100644 index 0000000000..00c565eea4 --- /dev/null +++ b/src/test/input/test_ECAT7OutputFileFormat.in @@ -0,0 +1,8 @@ +Test OutputFileFormat Parameters:= +output file format type := ecat7 +ecat7 Output File Format Parameters:= +number format := float +number_of_bytes_per_pixel:=4 +default scanner name := ECAT 953 +End ecat7 Output File Format Parameters:= +End:= diff --git a/src/test/input/test_ITKDefaultOutputFileFormat.in b/src/test/input/test_ITKDefaultOutputFileFormat.in new file mode 100644 index 0000000000..b75d94a42b --- /dev/null +++ b/src/test/input/test_ITKDefaultOutputFileFormat.in @@ -0,0 +1,6 @@ +Test OutputFileFormat Parameters:= +output file format type := ITK +ITK Output File Format Parameters:= +;default extension:=.nhdr +End ITK Output File Format Parameters:= +End:= diff --git a/src/test/input/test_ITKNiftiOutputFileFormat.in b/src/test/input/test_ITKNiftiOutputFileFormat.in new file mode 100644 index 0000000000..5f8365fb0a --- /dev/null +++ b/src/test/input/test_ITKNiftiOutputFileFormat.in @@ -0,0 +1,8 @@ +Test OutputFileFormat Parameters:= +output file format type := ITK +ITK Output File Format Parameters:= +number format := float +number_of_bytes_per_pixel:=4 +default extension:=.nii +End ITK Output File Format Parameters:= +End:= diff --git a/src/test/input/test_InterfileOutputFileFormat.in b/src/test/input/test_InterfileOutputFileFormat.in new file mode 100644 index 0000000000..5017fb3be0 --- /dev/null +++ b/src/test/input/test_InterfileOutputFileFormat.in @@ -0,0 +1,7 @@ +Test OutputFileFormat Parameters:= +output file format type := interfile +interfile Output File Format Parameters:= +number format := float +number_of_bytes_per_pixel:=4 +End Interfile Output File Format Parameters:= +End:= diff --git a/src/test/input/test_InterfileOutputFileFormat_short.in b/src/test/input/test_InterfileOutputFileFormat_short.in new file mode 100644 index 0000000000..73c0a18a3e --- /dev/null +++ b/src/test/input/test_InterfileOutputFileFormat_short.in @@ -0,0 +1,7 @@ +Test OutputFileFormat Parameters:= +output file format type := interfile +interfile Output File Format Parameters:= +number format := signed integer +number_of_bytes_per_pixel:=2 +End Interfile Output File Format Parameters:= +End:= diff --git a/src/test/input/test_VAXfloat.in b/src/test/input/test_VAXfloat.in new file mode 100644 index 0000000000..61d80a8211 Binary files /dev/null and b/src/test/input/test_VAXfloat.in differ diff --git a/src/test/input/test_linear_regression.in b/src/test/input/test_linear_regression.in new file mode 100644 index 0000000000..e9629cc7a5 --- /dev/null +++ b/src/test/input/test_linear_regression.in @@ -0,0 +1,709 @@ +Test file for linear regression, produced by KT in Mathematica +test case 1 +4 +1 5 3 4 +1 5 3 4 +1 2 3 1 +2.7755575615628914e-16 1.0000000000000009 8.228805317586679e-29 4.716510364958222e-29 3.5122949526284634e-30 -1.2042154123297588e-29 +test case 2 +4 +1 5 3 4 +1 -3 4 4 +6 2 3 1 +2.2247838616714715 -0.3688760806916437 62.73198847262248 8.948799508342411 1.084702970708172 -2.6213655125447493 +test case 3 +10 +1 5 3 4 5 7 8 9 3 2 +1 -3 4 4 23 4 45 6 2 2 +6 2 3 1 4 1 9 6 7 8 +-5.013334071041269 3.738021467301096 8116.032588248312 78.8634626154204 2.6381371835763434 -12.292596663898275 +test case 4 +10 +1 5 3 4 5 7 8 9 3 2 +1 -3 4 4 23 4 45 6 2 2 +1 1 1 1 1 1 1 1 1 1 +-3.8695652173913038 2.6956521739130417 1430.3478260869565 81.47915353917257 2.8791220331863094 -13.531873555975661 +test case 5 +700 +2.3148010229331444 4.719642470180059 6.918727824639326 +9.471835143037103 11.841285284692034 14.251909116491376 +16.635224194724596 19.1922735009843 21.54608383249391 +23.32424843582256 26.100217427967177 27.99756977548617 +30.01287108405018 32.49130883696342 34.874373796714686 +36.90912430279809 39.61507543480712 41.70902261238963 +44.677457877427436 46.09928944004713 48.33637276290189 +50.79141196735614 53.65400816226512 56.19293086467561 +57.521571739968735 59.87176949717608 62.8352803376258 65.1210957216385 +67.3802864552767 69.61986038068471 71.5000561429012 74.5288222206542 +76.73420262278279 78.49561194486213 80.89983871493402 +83.33125244516803 85.82133153873261 87.40430310789871 +89.72546491821932 92.42212814236994 94.5062561039255 97.29528049550908 +98.94800704079188 101.5228387023228 103.66988334102359 +106.30386852815293 108.39399887852676 110.7299078376472 +112.84831160105485 115.43209903097684 117.85871854090097 +120.20881211600869 122.36802514577815 125.01223865029213 +126.85866239799975 129.47998989535446 131.73382252299535 +133.91662670543 136.65882368306575 138.14873745018645 +141.2124909842627 143.1123235975313 145.8333587648464 +147.9266093078165 150.20623488033723 152.61704310202217 +154.9853517240545 156.80377060549367 159.23635153931363 +161.31317457386925 163.89135284552773 165.6738627678465 +168.28803993825875 171.0810755428924 172.53263430462678 +175.26505065183778 178.02001479248062 179.46883689260022 +182.373971906627 184.7850607564833 186.58619226948525 +189.15221018717025 191.61514822356125 193.83632330629683 +195.8737012852225 197.83988658963895 200.88178945871485 +203.3097139984803 205.36746640488528 207.22284348761676 +210.19643773466032 212.10594339298663 214.03111486557165 +217.1096689137475 218.80508488913256 221.23208062514016 +223.8430749273129 225.4285933708551 227.9724505845058 +230.96702997330235 233.12306013483226 235.55975647825488 +237.49847867787875 239.38196921681907 242.03686786534698 +244.2075462910846 246.98333045431752 248.94564591052222 +250.86316658012447 253.36765970144563 255.40154099560266 +258.23593191204185 260.39570017523914 262.3448162138289 +264.70510326094234 266.9299885190552 269.4645853096675 +271.63514730008137 274.6000183718097 276.6979078939151 +278.92151038235454 280.8065539292262 283.5275677873039 +285.9308779206127 288.29845024752234 290.0467974509713 +292.12908910942514 294.9489087037936 296.9615823821753 +299.8392511598867 301.4457586551076 303.60326279327137 +305.99841580205083 308.67159145844107 310.54421765950497 +313.1673308812295 315.7027156268116 317.72677524461216 +320.5391143985626 322.2373423621743 324.5381303171441 +326.69162794453075 329.8390960267529 331.73943446825916 +334.1166199347895 336.6850740153045 338.41152823944896 +341.2085565476464 343.5181696872672 345.6382765643332 +347.5824391300238 349.85964784385277 352.4565873050919 +354.99902540444646 356.63668047491615 359.05638505058135 +361.558171503041 363.72743394600536 365.79246281541117 +368.88905416935194 371.1554558762294 372.60065870139323 +375.15334841684853 377.85171180717765 380.1173255590852 +382.7090307568624 384.4142523900956 386.51227733891847 +388.7007056242957 391.0239567415578 393.3027241506466 395.903720791272 +398.08253593702847 400.5856801772247 403.2202850206228 +404.8440729474192 407.7259486319366 409.98665477277814 +412.2836045457067 414.7876878968378 416.4677771288955 +418.85922082677274 421.3911417302955 424.0986337274859 +425.8123212526661 428.05856212537947 430.3377933134469 +432.6469219203082 435.3949956935809 437.34953136851703 +440.2235409233513 441.7346445813897 444.59429006928514 +446.5255746269592 449.42081677270465 451.63092379011766 +453.6117541322566 456.3398944497346 457.90053175208186 +460.7868508426984 463.18580550032 464.95323967695634 +467.51692720637516 470.1991629458606 472.2180283714244 +473.89401885018356 476.22578547607964 478.5005292183747 +481.10570711875835 483.83545672480403 486.1879921626326 +488.45360729806646 490.61071142517744 492.685925356287 +495.46445123928123 497.51896271667664 499.11642135589227 +501.5603507293277 503.74363446657657 506.8880389265589 +508.80466722363565 510.82045627959315 513.7431027144947 +515.3011880838604 518.1188617233157 520.6672166026367 +522.3261755081195 524.5020251379999 527.6008333518912 +529.7731977524531 531.4003900320399 533.6014959196251 +536.3951262331328 539.1377410276491 540.7123978694073 +542.9478886215586 545.8844148079553 547.8518156713621 +549.9479466301259 552.428925904882 555.0679934520631 556.8914649420343 +559.1043121635493 561.7408869783229 563.7633262284274 +565.8710086624412 568.4612094490545 570.8396988944625 +573.3444645051117 575.2037920598044 577.435033940935 579.9376737564625 +582.6436311532204 584.6305943073512 586.5346439088951 +589.1361778368374 591.3485049200875 593.8928532797021 +596.5222460394878 598.1882892152788 600.7640901121321 +602.6410376083398 605.4742994093618 607.9593633103967 +610.1960966600691 612.5495726663055 614.4699872458125 +616.6184763320738 619.1327704316416 621.6785640038644 623.308777796758 +626.3787774376112 628.6883059265299 630.6747719440599 633.373743855823 +635.2411036811487 637.1446747733094 639.4441776367087 +642.5390999469279 644.1049258443113 647.0961698532218 +649.1513243570064 650.9168539074401 654.1166366290325 +655.8320797410897 658.3102867486665 660.5425544980781 +662.5572733186358 665.3359830810206 667.760714082361 669.3725672522655 +672.5387969865619 674.103212649379 676.2821500784966 678.5637894555076 +680.9600195489505 683.514906722849 686.0073781344366 687.8900455996845 +690.7189158678019 692.6702319495396 695.163200497728 697.2509456527566 +699.8139900234904 702.0740620963178 703.8118761407214 +706.4340917453164 709.097353394458 710.941982355228 713.5015893920549 +716.1915372472382 718.1400800758221 720.5059992742074 +722.9408753096939 725.3189699949727 727.4012830892601 +729.5027866248283 732.0587252311974 734.455180539465 736.4412635403096 +739.2878799019794 740.6513470967606 743.4651349397806 +745.9223476725076 748.1176479524397 750.2881465990326 +752.3141892870239 754.5083576490172 756.743585856122 759.4762704583111 +762.1800975417074 764.0110042545591 766.701603500894 769.1746810662562 +771.488560294469 773.670924178737 775.2956042266864 777.6338057565622 +779.8695902994964 782.2696410894767 785.092817601858 787.1750805253648 +789.3144097600313 792.0283775491673 794.3049376998785 +796.3237334286042 798.9492748202507 800.5060298766597 +802.8872897474387 805.0355868295715 807.9350855332268 +810.5976722276424 812.0437038913167 814.7593163712603 +817.2549879915193 819.3866679730833 821.4421003904228 +823.9846353050041 826.4664276970502 828.715743794346 830.4464961637362 +832.9508295484418 835.4968373975538 837.6461027048692 +839.8536785618782 842.5757490230769 844.2824276375225 +847.0177251557019 849.2487408619996 851.2520155944726 +853.6331528172717 856.1116952790422 858.2614511145608 +860.4164287649012 863.1980672840448 865.3140230513998 867.317747223244 +870.0571123936409 872.6430792925255 874.9273550783164 +877.1756468328214 878.6724770886366 881.0766515954753 +883.4116112839703 886.2291506690849 888.5216475401947 +890.6798141979214 893.165508579101 895.0754721072067 897.9458985171178 +899.6973865603989 901.747783423399 904.726731245207 906.893882922645 +908.5642337431271 911.4360881443567 913.5652801306461 915.877454157744 +918.0661664590823 920.1220650929569 922.547532907402 925.420341764103 +927.3230871665568 929.3947100146404 931.8718860745805 +934.5478646754664 936.3464355710814 939.3830987306702 +941.3427354054955 943.0262171352714 945.96662137316 947.8175901515691 +950.1672632982888 952.2803186181536 954.769234812761 956.86980672817 +959.5405320530816 961.7864356955085 963.9050010696338 +966.4337185838132 969.2752519224355 971.5089815377645 +973.7388346105515 975.5116534908562 978.2277190150334 +979.8886397736615 982.5157474439947 984.5169434762157 +987.0558329404528 989.340775098195 991.4693118729132 993.7338447455455 +996.6130975349572 998.5145579629235 1001.002690499753 +1003.7162545939764 1005.5458342366683 1007.6342393447699 +1009.9334556869919 1012.8464478658062 1014.3053021835866 +1017.4478036492613 1018.928454617358 1021.612729281993 +1023.530050261151 1026.7388221114968 1028.2896200068064 +1030.5010757911366 1033.0023312461174 1035.8501823378353 +1038.0738725628116 1040.584132314921 1042.8464983056647 +1044.70940723964 1047.1045606898986 1049.6502875693755 +1051.3334007707076 1053.5948492767166 1055.801870190145 +1058.934032975399 1061.087566534039 1063.5606099319466 +1065.768414503153 1067.2875851095926 1070.2822643504526 +1071.9128062826853 1074.9399598857951 1077.0748558275995 +1079.4522140893012 1081.1739841711885 1083.9503398789886 +1086.1737800364629 1088.3498828431837 1090.523801833353 +1093.3764673161768 1095.389647721542 1097.6033845375189 +1100.2143945937128 1101.9719066262783 1104.7393601521665 +1106.5699837668112 1109.2195453169961 1111.070036436133 +1114.0053271767672 1115.9824172327721 1118.4589353850495 +1120.4016219329797 1123.1177420671745 1125.4001528823194 +1127.5461291023641 1129.7616620471847 1131.642886239575 +1134.8479387930179 1136.5721449311757 1139.311322168196 +1141.2691062031122 1143.5980559498344 1145.4483430978225 +1148.634854852019 1150.8794584815703 1153.2946714123154 +1154.8339485041097 1157.5629482257407 1159.3400983294036 +1162.224687645504 1164.4144031871133 1166.5929117896076 +1168.7347711526363 1170.942270412732 1173.9554678020638 +1175.4912898566279 1178.2170290854617 1180.4421175304124 +1182.6093386996993 1185.2296278094432 1187.3741428458866 +1189.6941787373942 1191.4371937685237 1194.618305641247 +1196.1050366427744 1198.39612278756 1201.588850670701 +1203.8834507892277 1205.425578161204 1207.6014513752446 +1210.5549021665915 1212.420502563487 1214.4854798318001 +1217.0767637297404 1219.140498979478 1222.127590773879 +1224.3507086791637 1226.0344933170084 1228.385031177414 +1231.1363009172512 1232.933679593702 1235.692375786596 +1238.1756924777146 1240.6066731078079 1242.5595367478154 +1245.2981970492017 1247.3384987091908 1249.8883674665608 +1251.6545001050408 1254.4020742616417 1256.5496480384897 +1258.104916677333 1260.6289219438368 1263.500622886397 +1265.9947458718984 1267.984414113846 1269.7434421120367 +1272.3238591566565 1275.05424689242 1277.356823339967 +1279.192733432873 1281.3893658396478 1284.0692157150058 +1285.9205224227155 1288.2590538391707 1290.9969900530518 +1293.4935232372911 1295.2138493149075 1297.8995170913552 +1300.1987930038501 1301.9550245281 1304.4254818483466 +1306.6450169863142 1309.4967187422083 1311.4053764896103 +1313.6205651710136 1315.6160950424774 1318.8960958558114 +1320.6106306177119 1323.1361510571674 1325.6726529304406 +1327.6722366991548 1329.9563837252917 1332.4793277172002 +1334.4799194975676 1336.582870859507 1339.4871680102858 +1341.4588052944846 1343.4208656583967 1346.0858808064552 +1348.7936447729946 1350.3449559795772 1352.9213485670414 +1355.5870878026046 1357.8386202448946 1360.2194741312305 +1361.876331580727 1363.9903690603962 1366.6332437552842 +1369.098908960217 1371.0602365382497 1373.1942732045848 +1375.4226131375722 1378.6627579030494 1380.3875836078091 +1382.8220365054299 1385.0662294122803 1387.083430185849 +1390.1076641102413 1391.7391656459229 1394.3790614019945 +1396.724624891364 1399.0867984518445 1401.3532848394675 +1403.5854166289998 1405.679668911787 1407.7654498848033 +1410.6661970368627 1412.946796384105 1414.9601947805565 +1417.6891183040761 1419.7758279764664 1421.713552628821 +1424.5612858203394 1426.6288817658265 1428.8815547718816 +1430.8909394912487 1433.79852791729 1435.441298158017 +1437.5595182664517 1440.6247100789683 1442.8150977314408 +1444.7336340477755 1447.5203526205287 1449.2456486769736 +1451.3904728400767 1454.2468355959309 1456.067067781061 +1458.8602320479736 1461.2108039282896 1463.2813857111275 +1465.5008707441984 1468.3134356638684 1469.9506091477326 +1472.5922674070514 1475.025042767732 1477.1998830350474 +1479.2893233273933 1482.1633856412247 1483.6434879958501 +1486.1089435437987 1488.5907954101033 1491.1220874832077 +1492.7839697293984 1495.4842334648301 1498.0756976786624 +1499.9884534354321 1502.1636171088696 1504.4385847878564 +1507.1852248385856 1509.5416178395012 1511.1965493278083 +1513.9783527398827 1516.6744209102962 1518.2602321283734 +1520.99567858361 1523.2649170760142 1525.6238117625633 +1527.867964721322 1530.4706358158776 1531.865034040967 +1534.4344884351701 1537.1045790800972 1539.5271478200273 +1541.756090497168 1544.1436930250668 1546.5824915968894 +1548.6431780906287 1550.4718570323378 1552.5679953464041 +1555.3940381614573 1557.579560981759 1559.4332722444813 +1562.0827705078184 1564.852420321956 1566.6830116539504 +1569.0549195045985 1571.308349597522 1573.7921881935824 +1576.1873330703404 1578.590002428584 1580.7845378349587 +1583.32422347226 1585.4166972544624 1587.724968387617 +1589.6500493997885 1591.8196443921627 1594.7895494344352 +1597.1688778904488 1599.0063563747217 1601.0371527952732 +1603.2463713438065 1606.0970208581107 1608.1383610283174 +1610.6431146338157 9.296412407913868 14.103033553989638 +17.893046169777598 23.734364597933933 27.966369277481125 +32.71264734201373 37.91768931242597 42.58305312024582 47.6886333027443 +51.06732355209193 57.1631379439524 60.26942219698936 64.90551055139414 +69.67647596675641 74.3614012816588 77.87288685945032 84.22036981847276 +88.14302562715993 93.46121306836247 97.01606433867508 +101.51659313085574 105.61078347898204 111.97595260972038 +116.56023255411613 119.22018072294186 124.1077499249924 +130.2829064399428 134.6258679561822 139.65381144546075 +143.3951025829787 147.9652171275168 153.24281483593637 +157.76517814271642 161.72777903088672 165.80207918356442 +171.573392638947 176.05966759132227 178.85130306413032 +183.84067790190556 189.7005057794967 193.43929777284953 +198.90827743697037 202.17946483354308 207.0844414408216 +211.92270464199373 216.89749395798833 221.4035122238227 +226.3242088867055 230.10252391905186 235.7897440329959 +239.72060578387993 244.89834093052326 249.24871247359113 +254.79464145001722 257.7553886563631 263.25552609458686 +267.6835343308747 271.8668624191305 277.35330947279874 +280.68213345563987 287.22386673955236 291.21555935500015 +296.3126315708931 300.3816276761432 304.78456896670286 +309.9072819180297 314.33316673735 318.09718623532154 323.2618643247091 +327.0097879600414 332.52965451352725 335.9729773486161 +340.9593404056572 346.62004392704546 349.8090487296473 +354.6746364180928 360.91062793206606 363.6254024770282 +369.45366007328414 374.4191103235059 377.82709360119134 +382.9585400578978 387.9003506004854 392.136976867866 396.6032268616389 +400.3429807028976 405.7877190295923 411.55534919172277 +415.21865789493603 419.43569878486784 425.0545522922423 +428.65816295640127 432.75679357022693 438.8259108248264 +442.524897778715 447.2851856077852 451.9974531645698 455.0058668977809 +460.1158490490677 466.61054918969234 470.6868252325036 +475.5804644207527 479.4621889757835 483.5914388661865 +488.85973163131223 493.2219243628549 498.7618383752981 +502.25446199832044 506.65650476967335 510.87894365995726 +515.5741193457058 520.8991128065975 525.2378468747372 +528.8432448750895 533.5195670534634 538.8409498501962 +543.6810533045102 547.8173340502631 553.3946692747483 +557.5557642424112 562.2836001399404 566.011467152482 571.0788202256805 +576.3452150527188 581.5967749074368 585.0310027317294 588.816631249897 +594.5537761865322 598.1370432761245 603.8090783688745 +607.6547928745989 611.4993141882118 616.2805385064512 +622.3301347089172 626.0806735288932 631.2002013816142 +636.2426916317138 640.2868898338276 645.9611064754297 649.359251531418 +653.1616383272036 657.6695557835644 664.3664372006814 +668.2034872890067 672.8780381872631 678.2580886310824 +681.4876169750008 686.658272236288 691.6812632798263 696.227085899353 +699.2709857251037 704.3044960497556 709.3442200037018 +714.8180075304786 717.6161928505047 722.4051818615437 +727.2636814972507 732.2878728215613 735.9355193216115 +742.2049804799296 746.6209898655368 750.2009829877338 +754.7744128461818 760.2457289485117 764.4593515383331 +770.1314272041692 773.6079756455003 777.8422416595049 781.98131335107 +786.8733385730867 790.7203586704994 796.3839694232169 +801.1000500712436 806.0462526737338 810.4493729453956 +814.6794733734612 819.9558300675417 824.0282451432552 +829.2331800948909 834.2742915119173 837.2921485702909 +841.9403723216936 847.0976607732794 852.4693110319877 +855.6711587047541 860.3393893339598 865.5232479270976 870.023582083476 +875.611807166421 879.2079621297905 884.5152722815973 888.381340423971 +893.430493815351 897.7346235567038 903.7949136110977 907.5973710007539 +911.5304437441073 917.48837088297 920.7455406657022 925.9178976272926 +931.1746136765656 934.6601257397148 939.3123605708112 +945.0436061153753 948.8824651062745 952.3197534180209 +957.4146997975317 961.3742950833876 966.6113064015204 +971.9803640840611 976.4914518704339 981.5507129999115 +985.7994992350993 990.1724019542705 994.9761795888365 +999.7693725759405 1002.5690054197482 1007.2377783975666 +1011.5812659777388 1018.1720015751863 1021.6385616756409 +1025.9494075145967 1031.6357253120368 1034.6541039478936 +1040.4639479990753 1045.8892817748817 1049.5233647412254 +1053.4104978325183 1059.9814828928006 1063.5695283568607 +1067.7086649436937 1071.2362027491306 1077.17017649128 +1082.9891642727996 1086.2172130732597 1090.285489749219 +1096.5706772561805 1100.6167623185293 1104.641033484423 +1109.5161171732786 1114.6016718364324 1118.5789839209624 +1122.859767506684 1127.744115598092 1131.9631101607915 +1136.2295764063658 1141.4240421946474 1145.8900116501984 +1150.899162161716 1155.340294631484 1159.5006774534218 +1164.6795138176797 1169.7176792689154 1174.1707662746232 +1177.792012509728 1183.0433110685492 1186.7475027776352 +1191.9816020018236 1197.9747994364682 1200.7578213193303 +1205.7768255214544 1209.5648396832942 1215.1337659520452 +1220.6417041460513 1225.1751536850222 1229.585855762332 +1233.473998445361 1237.6975885479594 1242.6120435242306 +1248.356279355966 1250.649956250714 1257.0075768977608 +1261.5128813625145 1265.4159847244819 1271.149278797292 +1274.9280630800808 1278.995202093599 1283.0452184498586 +1289.7572662875639 1292.8847520115316 1298.8476993159638 +1303.2636164480346 1306.5824668510957 1312.5269306922016 +1316.0708737945095 1321.2987767647403 1325.64870089905 +1329.68522654615 1335.295720109487 1339.7129210024086 +1342.7747024536886 1349.1876379981907 1352.4836765852565 +1356.7566416464424 1362.124746202975 1366.7800611004295 +1371.1707952227418 1376.1406569219603 1380.375467405683 +1385.851998020349 1389.7755931291426 1395.2954384721018 +1399.418201118119 1404.3672460088167 1408.9278938131788 +1411.6318220240669 1417.0357342670231 1422.6403153166154 +1426.2570200186692 1431.3330452593264 1436.9870333679728 +1441.155088770465 1445.761299909182 1450.0201242569178 +1455.2123309142842 1459.5674507722742 1463.4776233239254 +1469.0634826104756 1473.487584711309 1477.787389671845 +1482.906828101184 1486.122825688515 1491.9121173056265 +1496.335391651496 1501.1312349720408 1505.4273872164133 +1508.6939161875073 1513.7681456426792 1517.6033411588621 +1523.7955651923462 1529.258181920484 1532.3278303260636 +1538.1463211401929 1542.86251993302 1547.271148552511 +1551.7727415555985 1555.5850212310102 1559.6423956761018 +1564.458817638227 1569.205290783324 1574.7073979070847 +1578.7789130656263 1582.7712329269175 1588.8179011114794 +1592.8005698059005 1597.2560873771115 1602.059115621291 +1605.2825094599834 1610.0693348338596 1614.828700160698 +1619.9651994337837 1625.714363817304 1628.2659936749974 +1634.4331349683514 1638.7070175132994 1642.9865334912404 +1647.3196725348046 1652.3706150353314 1657.8358689607885 +1662.2137919356414 1665.334651303794 1669.9282193592294 +1675.1770513225615 1679.4085011523175 1684.6272533967092 +1689.749306293603 1692.6058183956438 1698.390600040838 +1703.2266835908085 1707.4932189164913 1712.1467027743524 +1716.3080905808545 1720.9573487569487 1725.0645187557934 +1731.1815033405685 1735.1937267635503 1738.8913550819511 +1744.431383787442 1749.8744858272692 1754.2071932723097 +1759.1716825471465 1762.26076875211 1766.8386168664806 +1771.3934013366681 1776.837031243352 1781.9325493928804 +1785.861565543919 1790.7849001843506 1794.6097778466426 +1800.1832430992777 1803.855747148275 1807.5943001435126 +1814.183094255834 1818.0900241827858 1821.7090443739226 +1826.8862095626578 1831.4257454988854 1835.8255054269925 +1840.927541033354 1844.6924827991072 1849.1343904169341 +1855.5941216395504 1858.8530552060847 1862.8852895267974 +1867.9627078697874 1873.9333528874404 1877.214438339604 +1883.2918881901294 1887.5256766264354 1891.0008034945595 +1895.952872795685 1899.7069880057786 1904.7158987797927 +1909.217560395282 1914.0971256474097 1918.7126878622662 +1923.7328045239583 1927.927536212496 1932.7880812734873 +1937.8264782996082 1942.9070590250728 1947.3020307855031 +1951.6605402401333 1955.5339955005009 1960.7726686081385 +1964.3079091459526 1970.0074850340484 1973.4487059737032 +1978.209960738351 1983.374556258512 1987.3930466944444 +1992.3568177835737 1997.4842841119157 2001.7737527639524 +2006.4401738987592 2012.249829777795 2015.9683853321228 +2019.3561923686705 2024.7430482513494 2030.5371419155285 +2032.8355808081644 2039.6286561561747 2042.754966977862 +2048.11066361592 2051.928521783091 2057.9266253706714 +2061.2944267377284 2065.3766681154193 2070.555853174952 +2076.618716224719 2080.88694170368 2086.127962141716 2090.145892436601 +2093.6441599662057 2098.4938950092355 2103.3711443581424 +2106.861608324686 2111.6704072022535 2116.4537211104757 +2122.1213145803476 2126.4932229925626 2131.5142148335826 +2136.5106728591263 2138.9841726648183 2144.6576421843984 +2148.4855586774083 2153.9557058812643 2158.673509048898 +2163.1291204013064 2166.558933306737 2172.261279143536 +2176.4968409334783 2181.373267226354 2185.340217082018 +2191.3743374398555 2194.968878791762 2199.427374789753 +2204.4960571158117 2208.2804424306196 2213.5977344336197 +2217.1657664650666 2223.0256499135585 2226.6267213201436 +2232.8764198532717 2236.672543472504 2241.1114350799753 +2245.316048461017 2250.692247188453 2255.4149012881053 +2259.625876402567 2263.9603425797527 2268.218738139555 +2274.0857808867977 2277.46694309583 2282.699063436217 +2287.3218972060768 2291.912513660444 2294.9267260138117 +2301.724725996361 2306.353018414314 2311.085138870691 2314.630668898 +2319.244283565741 2323.1552839806945 2328.919372405624 +2333.205018984441 2337.817562245597 2342.0788641274225 +2346.64682893312 2352.0935839044655 2355.10151378458 2360.586616938969 +2365.031927645015 2369.8677075018977 2375.1411712048275 +2378.967878799414 2384.146146758216 2387.2007644060677 +2393.84210776861 2396.6459815933376 2400.8336330977727 +2407.4740383922554 2411.9173817722485 2415.6929631790226 +2419.7484942270817 2425.4433694942563 2428.873098206507 +2433.337679198328 2438.2291218214573 2443.2383505098146 +2448.6555359609097 2453.4588150709055 2456.382292888337 +2461.5447666053487 2466.5540221763295 2470.472198131936 +2475.5503652433217 2480.477059103451 2485.8128509715016 +2489.504319332522 2495.0042184851054 2499.4762946973833 +2504.7707432028915 2508.2583377391843 2513.1705853873327 +2517.602256305128 2521.053361430643 2525.3653745601614 +2531.8220911602507 2536.158886810872 2540.780263224135 +2544.2276953618334 2549.392969338793 2554.3205363010566 +2559.124727263226 2563.368880290928 2567.2106764504556 +2572.5757696957075 2575.970705086896 2580.8966821589916 +2586.260311207134 2591.298710592256 2594.957854115394 +2600.7923628264693 2605.2560927220284 2608.4224158948723 +2613.3871109125025 2617.3340250872848 2623.4855073346953 +2626.820159589745 2631.9337494818596 2636.168650527123 +2642.4634161744443 2646.061272778873 2651.153486257724 +2655.5409551652897 2660.270446835651 2664.540736477816 +2669.428758994498 2673.172074874362 2677.6597703851953 +2683.1649667821084 2687.2580539076016 2691.67539271537 +2696.3994591780615 2702.466256189852 2705.500199792208 +2710.6830298889004 2715.543366456033 2720.04384029498 +2724.7130888797055 2728.5490048016154 2732.8578591213372 +2737.6236807052346 2742.779339397846 2746.9803542744917 +2750.5944429468927 2755.362407926362 2762.0258531401214 +2765.439399109202 2769.923996111241 2775.0216714485455 +2778.397094145623 2784.6673242348397 2788.264225726046 +2793.456704666437 2798.3390402380205 2802.7919315194695 +2807.264766547984 2811.990448476585 2815.4388404458127 +2820.3089016305694 2825.521400091951 2830.3466081816046 +2834.725751566107 2840.359896828954 2843.8635409706135 +2847.52292747637 2853.346412168261 2857.379542554462 +2861.8690980237207 2866.360519550008 2872.1205590281393 +2875.3401434452594 2879.9451019124795 2885.9388481014626 +2889.923464882516 2893.4728192104194 2899.0808761864328 +2903.482143435025 2907.1844246444953 2912.8808876909493 +2916.6161096384485 2921.89169495844 2926.7455841986825 +2931.17198606038 2935.294709546498 2941.345086776835 2944.419832632574 +2949.8120892314255 2955.0311685758847 2959.0221593004653 +2962.8734204643133 2968.832546676963 2972.1620705521636 +2976.261639750457 2981.9528614361734 2986.2924032317032 +2989.6169686396843 2995.322791648994 3000.6293965536574 +3004.019584021284 3008.3360924532512 3013.2406482139686 +3018.4449719091617 3023.7386963303343 3026.9199828148016 +3032.148953255528 3038.0993877104797 3040.566710269954 +3046.225273268304 3051.0038664786925 3055.479555077905 +3060.1546210385286 3065.1941046924185 3068.5817071782276 +3073.8061346135923 3079.1220743615654 3083.432034140255 +3088.3200674277705 3092.4532731774184 3098.0296711298615 +3101.6150655005704 3105.397275778776 3109.8238766237605 +3115.6100871085778 3119.478973047319 3122.9566275648076 +3128.7789047145984 3133.871390778243 3138.1589902325168 +3143.007674309279 3147.4795170041184 3151.7046805082887 +3156.9337169642126 3161.603807830586 3166.199961926213 +3171.3500594697593 3175.1396122717933 3180.0221006523584 +3183.993827312621 3188.4279851081938 3194.507578131539 +3199.1020332245876 3202.5405541352025 3206.998313978332 +3211.0925126309685 3216.504757445811 3221.1166775114416 +3225.388226869754 2.0314401309254406 1.6223653108374827 +1.6634831153308227 6.554587527761958 3.459968351075278 +2.32730174027039 2.610040232718448 5.724489092008183 6.502517668704514 +6.30306122368631 5.156925064277843 0.8833626678569376 +4.389615104910984 2.3551304715296033 0.3701983242751822 +2.341358033164527 4.883108192498953 3.9816161100688396 +3.6280927625379706 2.8657001574432868 0.7446955833458497 +1.8376775759017228 4.732400124371519 2.161916702797117 +5.713255452420409 0.31531226506423987 3.168917009040696 +2.6073291750351593 2.3532871013451313 4.98801052479385 +0.6588767763222478 3.8828400830269767 2.8507694326406168 +5.68494930110754 2.5019517120444057 3.0994774151700386 +5.461154327729632 3.429818829577938 2.2317533877692233 +0.8581193820055116 0.6780461352306802 6.448202719509099 +5.603660625231253 4.992419224562225 6.933350551884831 +4.710525143607376 0.9712605008597347 2.930502521765108 +1.3200950994644218 4.4952128785431364 4.802343491819038 +0.423173346729949 5.9668079981192905 6.507202353749286 +4.24346671549679 3.540333263702973 3.2160385654786747 +0.9222530526417455 1.841515003452386 0.5408558485329344 +4.7548842377490415 4.492434223063808 6.609761615683163 +6.682736466527423 4.176838102518362 5.044231503554709 +1.1061009904519095 1.790317241965198 4.243487550633531 +0.4337063599473332 0.23484048959217454 5.85981472020009 +3.0233924511691095 2.938493481404197 2.432496997773136 +5.5366413734701405 4.056584453049819 3.4312911276549114 +5.189030282276344 2.096308109767168 0.9405458875711442 +2.6090380750131654 3.447515278823959 1.6554522612342337 +3.1856616498221024 5.116603851949358 3.8377536631407976 +1.972715794706811 6.008823547303741 0.17237234839464832 +2.8316526726888878 0.28239855274161296 1.8653359966702094 +6.738665988447315 2.6968121830967138 1.4225838325415232 +5.8419435455011 3.9001725070431186 0.36431518532357754 +2.8859424590713822 1.8853590924512815 0.5688813793882074 +2.175284903047233 0.8896343493042141 1.0448132048801373 +4.959843304375042 5.727769624223273 6.23418208806998 4.859151555058035 +6.843239452425685 1.990015961082477 4.36146629336317 5.850328007754294 +6.770867104031036 6.158363288393589 4.179067740621557 +4.084992011084085 0.13220111558372108 3.561551105296876 +2.856483908080034 5.2430484655829845 3.2320286085406034 +3.297235919973298 6.9705414490086515 3.457689373131704 +2.7631472291523957 1.2219510169260652 6.180907099704438 +2.512876168251567 4.803303924777353 2.4941813927027914 +6.946725011634457 4.653724613193532 4.960064472351669 +0.6041654316203148 2.6852587182712875 5.803396605439237 +5.189197368320633 1.4458021432267263 5.50619097764973 +1.8184045943551526 5.156996252736912 4.88425103792985 +2.7497070695696966 3.5753561287721674 2.024967644196309 +1.687015117956553 2.779165620561045 0.21766675564046375 +6.261820415043913 0.5650641010304878 3.598258520856608 +4.7047905873888975 1.55851649026656 5.070882708327696 +3.651533509222151 0.1510659741953656 3.598452017914891 +4.566717276707382 1.0662747909508632 1.3476693687561283 +5.409254649594258 3.2209151334806556 2.560083813301133 +6.529264774400976 0.3522583968573466 5.3366640955508045 +6.810376743731436 3.053908645628809 5.327290752661037 +3.7496489775942528 4.131211123170391 2.936241889988345 +6.065470337617124 3.2845848765637644 0.6329526023137838 +5.231451302599448 4.606953847350565 5.213702168236067 +3.9814190930916338 5.180385328404082 1.1085018294356739 +0.7469848915286864 3.0151443021407704 3.9327159596479544 +2.6992471798414157 4.526069758048031 0.5550604888396374 +4.403451185246977 2.4469887829840693 6.189405662497227 +0.7446837451082013 1.4495425396181696 4.119698030323031 +2.5397566849029745 3.61347262193781 5.513300649629825 +5.054227692705907 6.25517180833921 3.0805200196240268 +0.3818493470303771 0.547273845355342 1.1414696401031421 +6.099100926532393 2.2014640186262957 6.438772015919668 +0.49448474857445546 3.183956624391623 5.268748058978342 +3.8395248360782532 2.9684149905264245 2.728896135551986 +0.9652968737313637 1.492536053094184 3.7790093280291983 +2.0842123904437844 6.515754334113194 4.372838022771153 +1.3392526431262242 5.4707397685059735 1.1024536844833701 +6.318610330065246 2.0840808347870143 2.4902197488819477 +0.8206043374529928 5.871336484709904 1.0426111946838723 +3.3911188223495548 5.619140318826697 6.432564468790235 +0.6481264461094168 0.30716219795793165 0.45039225984835596 +2.6930396327119834 4.679711455582992 4.578266062405946 +6.485095386116992 1.3005035796177995 1.0007021275537944 +2.5940536719621625 6.969341052003798 3.9276655568466468 +6.66144948442757 4.1233139034561885 5.966887367520427 +4.6090552267814004 4.677368649640555 1.7330941545742407 +5.246283030067435 5.737718742071497 3.734757454956684 +5.341975332224686 6.6271427112407375 6.305154273281261 +3.1866310088472667 5.1348131342667545 6.276750451392382 +3.712114640569278 5.506919553264274 0.6565470718608082 +6.79165506527539 2.5116110609514783 4.60621742571048 5.062493399898646 +6.822314013271592 5.583945504104832 4.94476794128291 +1.0391794964424579 0.9554266457511642 1.074890277323431 +0.3673992916423542 6.306085341868218 2.7091436156837294 +2.337171535251935 3.6326418366856714 1.0641100096435312 +3.082000904442992 3.0320172619706742 0.546010827838404 +2.929296875376777 3.80525045305061 6.319902621401397 2.03909127457413 +2.3727498035159686 4.0135953877752195 3.908291560449918 +4.432873848863649 4.3102564036173225 4.191281374503628 +5.324346056345087 6.4881059075807395 3.371076907174865 +3.335854728752464 4.349455779021656 6.2207066159383855 +4.064991565306648 0.7267111130687348 2.1122842437697216 +2.6880647792527155 3.1008815556631166 4.644710208625743 +6.080266981799047 2.242053951414311 0.2715846802863394 +0.9394597555751334 6.760364360397651 0.3029626768401812 +4.898834876770371 3.925864367799914 2.952072799947733 +2.8700888279765318 0.6885784731530483 6.734582993296285 +4.627726743602645 3.381982920395792 4.3175015659781835 +3.4987282645438214 0.3782709645809904 4.161276304457406 +0.35251000067153637 2.8720171514750867 5.265986720811269 +1.573211525204691 4.25162844500842 5.227306942849343 6.185719739012222 +6.33115757379038 4.080043764722081 4.387847187274209 +6.4253553786145705 6.128194896950199 6.18120888795171 +0.5619828194742964 3.5732825786668383 3.3581060689736675 +5.592630414798662 0.8273998261780113 5.945555835064192 +6.976123148577876 1.375128848820478 4.32867156163419 5.667284870483201 +2.91484684412047 1.1226188481489416 1.556654410159104 +0.5012981496719323 1.4416353189157791 3.870990403140522 +3.3293474673097614 1.3155784106597108 2.110477745125399 +6.790946638418441 5.941500280035551 1.89022303204514 +2.9822828481752004 0.7097377504667307 5.479517460561255 +5.316940453378303 6.624176779201533 2.117107335668069 +4.752117634383243 6.37138461831411 6.648053630623657 +0.8419784868475914 0.5234460727490533 0.8040997478309093 +3.8332067865031876 6.719359638698649 5.96679166258995 +0.4028015981589771 2.4915714675874088 2.948369235558129 +2.737444195280189 6.087223187499267 0.48109372246200954 +3.1574225971396883 3.7959439152446373 4.297000155454127 +4.49881087428681 2.5476848466729574 5.316426454683383 +5.980059702075824 4.874634095085276 0.5305775110048883 +0.6643088203001393 6.608675083761714 5.226580464461619 +6.6885990241572975 0.24086274755108594 5.904575335930804 +1.4933736779584321 6.969239385458647 1.2740710849611365 +5.601773737771827 6.001802210371023 4.120870149900519 +5.536626889680948 6.514550550272561 5.620708487909014 +1.0634475527608307 1.8406829744363102 2.317550394818434 +1.2218976136222046 5.515762706087873 3.5242565197529276 +3.3374906927426102 3.3472635185369284 5.085185195082985 +2.9599476994527882 3.7288156089808964 5.120683054075308 +5.396586170925689 2.8190849519017025 4.8242402730500915 +3.727309376116877 5.427346785467041 1.6450138669405658 +6.222466535278264 4.725507165745853 1.4064766355665224 +3.108386977259618 6.707915985005704 6.10479867783684 +0.4430290828056914 1.367704002823308 4.490365590187269 +4.982901064214635 1.9272663767178182 4.84344748307038 +1.2528748974446602 1.7356375456777073 3.842081181634833 +1.9834997836175925 4.524059288463763 3.6149544916023983 +5.445495010709145 6.16441483171589 6.699819015413672 6.887645115485522 +0.11814822524210379 4.619400964775324 0.5773524801354069 +2.2621379497396683 5.711671589675581 1.6110139875157066 +0.8694364951297028 3.157339271902829 5.36864250686989 +0.34330998469239843 3.379070904942433 5.174438207688193 +3.5413761301520723 2.4998625016220184 2.226196007497773 +3.538800662010486 6.699294948517239 0.6163627180044255 +4.702136719034009 6.923846170408088 1.3537999378080947 +1.4519478862885355 5.002317703620337 0.13620105492256576 +1.335651712565991 3.8325469215132117 4.52496522348493 +4.8740631051828975 2.6239801228904094 2.321532933997505 +3.7555287283552277 1.8167238332800688 4.255337616020519 +2.0782229493051063 0.4764578234127951 3.6422856255918754 +0.813961485868447 6.578360447683089 5.250261815915023 +0.20348496358138912 1.1146665373512077 6.061997729678662 +0.6481250968810135 0.27963879317330154 6.760866599543113 +4.710049843390127 2.6458073932606765 0.2434377382507358 +5.525214886977122 0.9775029218769163 5.120842169775746 +2.3693746330678387 3.0012347640867136 5.655969987879412 +1.4653134414205182 0.6526507997877697 5.745897148066194 +3.6777470385743056 1.0888556180077231 4.010365174195894 +5.031935662197747 4.099386590891217 2.838593802092701 +3.9068802106145055 4.01726912484654 5.037388861212554 +2.2904687052116874 3.727241417441204 4.256402525303426 +0.42733901782242645 6.644661311951011 3.5838036791904684 +5.731187638326304 6.4498360959455106 1.6238191421752652 +1.3144290461226298 2.8299528742395914 0.8938661080660986 +0.258505700754747 0.7617782463348599 4.084055726173396 +4.216119069491793 6.169650082747023 3.751413072138966 +6.052120063975649 0.2167324786005766 3.431056280654323 +6.844532861524461 2.13485093912911 2.1793436173880227 +1.240587575442636 3.2172914440832567 4.878448413825684 +1.8520045995655967 1.5959262634916251 6.633487764892789 +6.1472607754993795 2.402168503620086 6.97210712131636 +5.419058718770159 3.4173079012597887 1.6083023955539881 +6.813601420561613 4.757280472435299 6.3332521750863915 +4.392183326062194 0.7439513378145891 1.1058674002963338 +0.3811321111107423 4.275450847461618 4.312895057160266 +1.2613345387718735 5.246281171981632 2.1961072300735958 +3.17230748171763 5.044043094688616 0.4678327581559488 +0.4441026305079989 1.6763812182260052 5.410555329795828 +1.3205719826565694 5.041934126887913 1.7042740969096453 +6.991496611025669 4.903264081396781 3.5336317313339247 +1.8906726763480322 2.3342161385903704 5.5700119063103894 +6.14144840527173 1.2467213385334432 1.3283487382940369 +5.288879795199646 1.965997557810112 3.933826281373178 +0.1670141995221632 0.1425986232180146 6.769890327736516 +0.8615187996555471 2.1229711048335465 6.674765865062065 +6.425787697228517 6.185137581429543 3.712415775037718 +5.454193882405496 1.4838535703406055 4.580863484519897 +3.720919164012049 0.6509298010087157 4.950221839006681 +2.790190808171865 1.4867030254216789 2.080917894698327 +5.808773433734951 1.643469469638422 0.2583542871276423 +3.79203809949868 3.9427758759248395 4.709643188265245 +0.1913400876054791 3.7494394762806658 4.172885548188321 +3.9481243886096977 5.068368982771933 4.0746736112186 4.747097850959804 +4.762986807180154 1.4559532077342148 5.620479728813103 +3.363244280619199 0.2821233226602583 4.735034043722165 +5.069549927804387 5.413022441612518 4.4919325144883935 +3.348331018300487 3.0886320331060606 6.604249007877567 +2.948463044849972 3.1899767311728446 6.296593933607381 +2.7614731319527284 5.238819856584727 3.0986366435673656 +2.6471544573267156 5.588587583764406 1.3906954679750299 +5.030267660795433 5.572480846108116 0.941489732804602 +3.6277086607948745 3.674314453061218 6.952001117295014 +4.578245452185404 3.445585338134616 5.9392804093390525 +1.9824511894906263 6.165223010572885 5.953652823646222 +2.6909493910385662 5.893819156384566 6.5609740026953185 +3.105189778796251 6.500972659865721 6.597225222777185 +3.8995008707425907 4.866369922211524 3.5023360162983566 +4.05007076545047 5.310913286978184 3.5756744542364944 +5.472068355502923 5.477589919342353 4.469423554173582 6.94796579344162 +1.8977539024417054 5.5255888020473405 6.891178101988179 +3.602380455307004 2.9584734931026526 3.6431376125567145 +0.8259550914152931 4.648727631660781 0.3675241020640868 +4.749318456172148 1.2649810887199748 1.6435378528645304 +0.8665514421983653 5.152093233394963 4.365480217977384 +3.777167930653007 4.364215425900009 1.2020224679444942 +6.054566930999201 0.3014934764165127 5.892147070397086 +2.7244325486021412 1.6851433768256192 0.3535276829748931 +4.094393167955381 4.1988437465548 1.7939652748374406 3.75114722766789 +1.2359196748527284 0.6557061339980869 1.0680101834221474 +6.102419596007108 0.9683955727886415 2.9063876778259385 +6.803029094702173 4.558881743142578 0.2018441305902761 +4.7542944444309745 2.537548876724788 0.8817138124895714 +2.837628704690267 3.6522719764864817 3.4829819457255877 +0.6802203360730587 3.9454816342931815 1.0278394278843406 +4.520656384458118 1.9999724110456334 205.49430104518996 0.0004863072512754033 5.596407589408913e-10 -4.53509781376528e-7 diff --git a/src/test/modelling/CMakeLists.txt b/src/test/modelling/CMakeLists.txt new file mode 100644 index 0000000000..8b7a53d790 --- /dev/null +++ b/src/test/modelling/CMakeLists.txt @@ -0,0 +1,38 @@ +# +# +# Copyright 2011-07-01 - 2011 Kris Thielemans +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file declaring all tests in this subdirectory + +set(dir test/modelling) + +set(dir_SIMPLE_TEST_EXE_SOURCES ${dir}_SIMPLE_TEST_EXE_SOURCES) +set(dir_INVOLVED_TEST_EXE_SOURCES ${dir}_INVOLVED_TEST_EXE_SOURCES) + +set(${dir_SIMPLE_TEST_EXE_SOURCES} + test_ParametricDiscretisedDensity +) + +set(${dir_INVOLVED_TEST_EXE_SOURCES} + test_modelling +) + +ADD_TEST(test_modelling + ${CMAKE_CURRENT_BINARY_DIR}/test_modelling ${CMAKE_CURRENT_SOURCE_DIR}/input +) + +include(stir_test_exe_targets) + diff --git a/src/test/modelling/input/math_model_matrix.in b/src/test/modelling/input/math_model_matrix.in new file mode 100644 index 0000000000..4478027fe8 --- /dev/null +++ b/src/test/modelling/input/math_model_matrix.in @@ -0,0 +1,7 @@ +23 28 +18974.9 5.83211 +19961.2 5.25333 +20766.5 4.75236 +21417.3 4.32065 +21934. 3.94237 +22335.8 3.60228 diff --git a/src/test/modelling/input/model_array.in b/src/test/modelling/input/model_array.in new file mode 100644 index 0000000000..6dcb97c8e1 --- /dev/null +++ b/src/test/modelling/input/model_array.in @@ -0,0 +1,8 @@ + +23 28 +1 2 +11 22 +111 222 +1111 2222 +11111 22222 +111111 222222 diff --git a/src/test/modelling/input/plasma.if b/src/test/modelling/input/plasma.if new file mode 100644 index 0000000000..ebf3aa3ecf --- /dev/null +++ b/src/test/modelling/input/plasma.if @@ -0,0 +1,3656 @@ +3655 +0.378906 -0.0252499 -0.0235803 +1.48047 0.000483647 0.000451671 +2.57031 -0.00466304 -0.00435479 +3.66406 0.000483637 0.000451671 +4.75391 0.00563024 0.00525816 +5.84375 -0.0149558 -0.0139676 +6.9375 0.00563012 0.00525816 +8.02734 0.00563006 0.00525816 +9.11719 0.00563 0.00525816 +10.2109 -0.0046627 -0.00435479 +11.3008 -0.00466265 -0.00435479 +12.3906 0.0159225 0.0148713 +13.4844 -0.00980866 -0.00916121 +14.5742 0.00562971 0.00525816 +15.6641 0.0107758 0.0100647 +16.7578 -0.00466241 -0.00435479 +17.8477 -0.00466236 -0.00435479 +18.9375 0.00562948 0.00525816 +20.0312 -0.00980805 -0.00916121 +21.1211 -0.00980794 -0.00916121 +22.2109 0.0313587 0.0292912 +23.3047 0.010775 0.0100647 +24.4023 0.0107749 0.0100647 +25.4922 0.0159205 0.0148713 +26.5859 0.000483531 0.000451671 +27.6758 -0.00466192 -0.00435479 +28.7656 0.0107744 0.0100647 +29.8594 0.0210653 0.0196779 +30.9492 -0.00980703 -0.00916121 +32.0391 0.000483506 0.000451671 +33.1328 -0.00466168 -0.00435479 +34.2227 -0.00466163 -0.00435479 +35.3125 0.000483491 0.000451671 +36.4062 0.00562854 0.00525816 +37.4961 0.000483481 0.000451671 +38.5859 0.00562842 0.00525816 +39.6797 0.0159183 0.0148713 +40.7695 -0.00466134 -0.00435479 +41.8594 -0.00466129 -0.00435479 +42.9531 0.000483456 0.000451671 +44.043 -0.0098058 -0.00916121 +45.1328 -0.00466115 -0.00435479 +46.2266 0.000483441 0.000451671 +47.3164 -0.0149499 -0.0139676 +48.4062 0.000483431 0.000451671 +49.5 0.00562784 0.00525816 +50.5898 -0.00980519 -0.00916121 +51.6797 -0.0252376 -0.0235803 +52.7734 0.0159163 0.0148713 +53.8633 -0.00466076 -0.00435479 +54.9531 0.00562754 0.00525816 +56.0469 0.000483396 0.000451671 +57.1367 0.0416368 0.0389046 +58.2266 0.149674 0.139854 +59.3164 0.556249 0.519759 +60.4102 1.34949 1.26098 +61.5 3.26937 3.05496 +62.5898 6.21112 5.80385 +63.6836 11.0707 10.3449 +64.7734 16.8923 15.785 +65.8633 24.0206 22.4463 +66.957 32.5198 30.3887 +68.0469 41.0205 38.3328 +69.1367 48.7815 45.5857 +70.2344 56.0162 52.347 +71.3281 62.6105 58.51 +72.418 67.7393 63.3035 +73.5078 71.8937 67.1866 +74.6016 74.9154 70.0112 +75.6914 77.2451 72.1891 +76.7812 77.4703 72.4003 +77.875 79.2048 74.0221 +78.9648 81.6618 76.3191 +80.0547 83.0282 77.5969 +81.1484 86.6003 80.9362 +82.2383 91.3674 85.3924 +83.3281 93.3988 87.2919 +84.4219 93.779 87.6481 +85.5117 88.7071 82.9087 +86.6016 81.9711 76.6138 +87.6953 75.6856 70.7398 +88.7852 68.4192 63.9489 +89.875 63.4597 59.3141 +90.9688 56.1899 52.5197 +92.0586 51.899 48.5096 +93.1602 47.3499 44.2581 +94.25 43.8535 40.9904 +95.3398 41.0754 38.3941 +96.4336 38.892 36.3536 +97.5234 36.6236 34.2336 +98.6133 35.869 33.5286 +99.707 34.9799 32.6978 +100.797 33.5243 31.3375 +101.887 32.8543 30.7115 +102.98 31.5436 29.4866 +104.07 30.9025 28.8876 +105.16 30.504 28.5154 +106.254 30.2563 28.2842 +107.344 29.6756 27.7416 +108.434 29.5464 27.6211 +109.527 29.1648 27.2647 +110.617 27.9901 26.1668 +111.707 27.9738 26.1518 +112.801 27.3202 25.541 +113.891 26.1167 24.4162 +114.988 26.2553 24.546 +116.078 25.5341 23.872 +117.172 23.8331 22.282 +118.262 22.8966 21.4066 +119.352 22.5348 21.0686 +120.445 22.0566 20.6217 +121.535 21.9342 20.5075 +122.625 21.4617 20.0659 +123.715 21.2175 19.8378 +124.809 21.1536 19.7783 +125.898 21.148 19.7733 +126.988 20.2841 18.9657 +128.082 20.0827 18.7776 +129.172 19.8178 18.5301 +130.262 19.6007 18.3273 +131.355 20.0555 18.7528 +132.445 20.0289 18.7281 +133.535 20.3569 19.035 +134.629 19.2984 18.0454 +135.719 20.4519 19.1242 +136.809 20.4305 19.1044 +137.902 20.0279 18.7281 +138.992 20.2235 18.9112 +140.082 20.0115 18.7132 +141.176 19.5933 18.3223 +142.266 20.44 19.1143 +143.355 19.9156 18.6241 +144.449 19.9102 18.6192 +145.539 20.1746 18.8667 +146.629 20.2591 18.9459 +147.723 20.3066 18.9905 +148.812 20.2004 18.8914 +149.902 20.2585 18.9459 +150.996 20.163 18.8568 +152.086 19.824 18.54 +153.176 21.1054 19.7386 +154.27 20.2153 18.9063 +155.359 20.395 19.0746 +156.449 20.1989 18.8914 +157.543 19.6855 18.4114 +158.633 19.8599 18.5747 +159.723 19.9179 18.6291 +160.82 20.1505 18.8469 +161.914 19.965 18.6736 +163.004 19.547 18.2828 +164.094 20.314 19.0004 +165.188 19.4091 18.1542 +166.277 19.6785 18.4064 +167.367 19.2871 18.0405 +168.461 19.546 18.2828 +169.551 19.2867 18.0405 +170.641 19.4874 18.2284 +171.734 19.6987 18.4262 +172.824 19.2226 17.9811 +173.914 19.9575 18.6687 +175.008 19.0796 17.8477 +176.098 19.053 17.823 +177.188 19.7664 18.4905 +178.281 19.3432 18.0948 +179.371 19.4223 18.169 +180.461 19.5543 18.2927 +181.555 19.48 18.2234 +182.645 19.8448 18.5648 +183.742 19.8657 18.5846 +184.836 19.6011 18.3372 +185.926 20.1245 18.8271 +187.016 19.3416 18.0948 +188.109 19.648 18.3817 +189.199 20.071 18.7776 +190.289 18.9289 17.7093 +191.383 19.5945 18.3322 +192.473 18.7753 17.566 +193.562 19.5413 18.2828 +194.656 19.3401 18.0948 +195.746 18.8698 17.6549 +196.836 18.6162 17.4178 +197.93 19.2128 17.9762 +199.02 18.7742 17.566 +200.109 18.906 17.6895 +201.203 18.3199 17.1413 +202.293 17.7553 16.6132 +203.383 18.2667 17.0919 +204.477 18.8682 17.6549 +205.566 18.4246 17.24 +206.668 17.665 16.5294 +207.758 18.1182 16.9537 +208.848 18.1181 16.9537 +209.941 18.3552 17.1758 +211.031 17.7907 16.6477 +212.121 17.6693 16.5343 +213.215 17.511 16.3863 +214.305 17.7216 16.5836 +215.395 17.7741 16.6329 +216.488 17.2259 16.1201 +217.578 17.6842 16.5491 +218.672 17.7156 16.5787 +219.762 17.61 16.48 +220.852 17.3727 16.2581 +221.945 16.9986 15.9082 +223.035 17.6042 16.4751 +224.125 17.3563 16.2433 +225.219 17.0402 15.9476 +226.309 17.2401 16.1349 +227.398 17.3822 16.268 +228.492 16.687 15.6175 +229.582 16.8131 15.7357 +230.672 17.192 16.0905 +231.766 17.5501 16.4258 +232.855 17.0442 15.9525 +233.945 16.8546 15.7752 +235.039 17.186 16.0856 +236.129 16.9226 15.8392 +237.219 16.954 15.8688 +238.312 16.8064 15.7308 +239.402 16.68 15.6126 +240.492 16.6588 15.5929 +241.586 16.2746 15.2335 +242.676 16.7163 15.6471 +243.766 16.8793 15.7998 +244.859 16.0164 14.9923 +245.949 17.0105 15.923 +247.039 16.442 15.391 +248.133 16.0265 15.0022 +249.223 16.8311 15.7555 +250.312 16.3206 15.2778 +251.406 16.1259 15.0957 +252.5 15.6527 14.6529 +253.59 16.2569 15.2187 +254.684 15.8363 14.8251 +255.773 16.4302 15.3812 +256.863 15.316 14.3383 +257.957 15.9935 14.9727 +259.047 15.7621 14.7562 +260.137 16.4085 15.3615 +261.23 15.6987 14.6972 +262.32 15.7405 14.7365 +263.41 15.898 14.8841 +264.504 15.8243 14.8152 +265.594 15.7926 14.7857 +266.684 15.367 14.3874 +267.777 15.8185 14.8103 +268.867 15.3458 14.3678 +269.957 15.7972 14.7906 +271.051 15.7288 14.7267 +272.141 15.5448 14.5546 +273.23 15.7652 14.7611 +274.324 15.7598 14.7562 +275.43 15.2555 14.2842 +276.52 15.6019 14.6087 +277.609 15.0295 14.0729 +278.703 15.5071 14.5202 +279.793 15.5909 14.5988 +280.883 15.3073 14.3334 +281.977 14.9293 13.9796 +283.066 15.3856 14.4071 +284.16 15.2227 14.2547 +285.25 15.401 14.4218 +286.34 15.2644 14.294 +287.43 15.7578 14.7562 +288.523 15.7366 14.7365 +289.613 15.1643 14.2007 +290.703 15.4054 14.4267 +291.797 15.1901 14.2252 +292.887 14.8595 13.9157 +293.977 15.2318 14.2645 +295.07 15.006 14.0532 +296.16 14.6073 13.68 +297.25 14.8693 13.9255 +298.352 15.2889 14.3186 +299.441 14.9372 13.9894 +300.535 15.126 14.1663 +301.625 15.2674 14.2989 +302.715 15.3408 14.3678 +303.809 15.4771 14.4956 +304.898 14.6375 13.7094 +305.988 14.6373 13.7094 +307.082 14.5219 13.6014 +308.172 14.7577 13.8224 +309.262 14.7156 13.7831 +310.355 13.9765 13.091 +311.445 13.9188 13.0371 +312.535 14.3482 13.4394 +313.629 14.5682 13.6456 +314.719 14.8301 13.8911 +315.809 14.5364 13.6161 +316.902 14.9032 13.9599 +317.992 14.6619 13.734 +319.082 14.1429 13.248 +320.176 14.9185 13.9746 +321.266 14.5671 13.6456 +322.355 14.5826 13.6603 +323.449 14.1791 13.2824 +324.539 14.6924 13.7634 +325.629 14.3411 13.4345 +326.723 14.0948 13.2039 +327.812 14.0737 13.1842 +328.902 14.4403 13.5278 +329.996 13.5917 12.733 +331.086 14.3561 13.4492 +332.176 14.6861 13.7585 +333.27 14.2144 13.3167 +334.359 14.5914 13.6701 +335.449 13.8423 12.9684 +336.543 13.8788 13.0027 +337.633 14.6381 13.7143 +338.723 14.2974 13.3952 +339.816 14.0877 13.1989 +340.906 14.0091 13.1254 +341.996 13.8048 12.9341 +343.098 14.0088 13.1254 +344.188 14.2233 13.3265 +345.281 13.7992 12.9292 +346.371 14.2388 13.3413 +347.461 13.5215 12.6693 +348.555 13.94 13.0616 +349.645 14.1074 13.2186 +350.734 13.5263 12.6742 +351.828 13.8401 12.9684 +352.918 13.8347 12.9635 +354.008 13.8346 12.9635 +355.102 13.7768 12.9095 +356.191 14.3684 13.464 +357.281 13.8551 12.9831 +358.375 13.5253 12.6742 +359.465 13.2113 12.3801 +360.555 13.8651 12.9929 +361.648 13.4411 12.5957 +362.738 13.305 12.4683 +363.828 13.8072 12.939 +364.922 13.5558 12.7036 +366.02 14.1261 13.2382 +367.109 13.6864 12.8262 +368.203 13.6758 12.8164 +369.293 13.8587 12.988 +370.383 13.8324 12.9635 +371.477 13.4608 12.6153 +372.566 13.6961 12.836 +373.656 13.4658 12.6203 +374.75 13.8057 12.939 +375.84 13.2249 12.3948 +376.93 13.3189 12.483 +378.023 13.2874 12.4536 +379.113 13.5383 12.6889 +380.203 13.5957 12.7428 +381.297 13.3027 12.4683 +382.387 13.8413 12.9733 +383.477 13.1194 12.2968 +384.57 13.2918 12.4585 +385.66 13.5375 12.6889 +386.75 13.6053 12.7526 +387.844 13.3018 12.4683 +388.941 13.3592 12.5222 +390.035 13.0768 12.2576 +391.125 13.2962 12.4634 +392.215 13.1915 12.3654 +393.309 12.8517 12.047 +394.398 12.956 12.1449 +395.488 12.9715 12.1596 +396.582 12.6266 11.8364 +397.672 13.6457 12.7918 +398.762 13.0548 12.238 +399.855 12.9449 12.1351 +400.945 13.3263 12.4928 +402.035 13.3 12.4683 +403.129 12.7668 11.9686 +404.219 13.4356 12.5957 +405.309 13.2107 12.385 +406.402 13.1427 12.3213 +407.492 12.7872 11.9882 +408.582 12.7036 11.9099 +409.676 13.1213 12.3017 +410.766 12.745 11.949 +411.855 12.8912 12.0862 +412.949 12.6194 11.8315 +414.039 13.1365 12.3164 +415.129 13.105 12.287 +416.223 12.4415 11.6651 +417.312 13.1831 12.3605 +418.402 12.5091 11.7287 +419.496 12.7596 11.9637 +420.586 12.9527 12.1449 +421.676 12.6184 11.8315 +422.77 12.3416 11.5721 +423.859 12.498 11.7189 +424.949 12.618 11.8315 +426.043 12.5917 11.807 +427.133 12.8684 12.0666 +428.223 12.487 11.7091 +429.316 12.4452 11.67 +430.406 12.8001 12.0029 +431.496 13.0663 12.2527 +432.59 12.7163 11.9246 +433.68 12.3664 11.5966 +434.77 13.0607 12.2478 +435.863 12.9352 12.1302 +436.953 12.5591 11.7777 +438.043 13.2902 12.4634 +439.133 12.3344 11.5672 +440.227 12.8564 12.0568 +441.316 12.5691 11.7875 +442.406 12.5376 11.7581 +443.5 11.9427 11.2003 +444.59 12.5739 11.7924 +445.68 12.6625 11.8756 +446.773 12.5632 11.7826 +447.863 12.4117 11.6406 +448.953 12.2029 11.4449 +450.047 12.6358 11.8511 +451.137 12.8498 12.0519 +452.227 12.7765 11.9833 +453.32 12.7138 11.9246 +454.41 12.4944 11.7189 +455.5 12.1864 11.4302 +456.594 12.0976 11.347 +457.684 12.708 11.9197 +458.773 12.4729 11.6993 +459.867 12.1964 11.44 +460.957 12.2953 11.5329 +462.047 12.6239 11.8413 +463.141 12.2481 11.4889 +464.23 12.0915 11.3421 +465.32 12.1592 11.4057 +466.414 12.5138 11.7385 +467.504 12.2737 11.5134 +468.594 12.0389 11.2932 +469.688 12.2682 11.5085 +470.777 12.5551 11.7777 +471.867 11.8612 11.1269 +472.961 11.7828 11.0535 +474.051 12.0696 11.3226 +475.141 12.4032 11.6357 +476.234 12.0953 11.347 +477.324 12.2986 11.5378 +478.414 11.8866 11.1514 +479.508 12.2671 11.5085 +480.605 11.8654 11.1318 +481.695 12.1625 11.4106 +482.785 12.3554 11.5917 +483.879 11.8546 11.122 +484.969 11.7138 10.99 +486.059 12.2193 11.4644 +487.152 12.2036 11.4498 +488.242 12.2243 11.4693 +489.332 12.1773 11.4253 +490.426 11.9581 11.2198 +491.516 12.0101 11.2687 +492.605 11.593 10.8775 +493.699 11.89 11.1562 +494.789 11.8169 11.0878 +495.879 11.6865 10.9655 +496.973 11.4051 10.7016 +498.062 12.1554 11.4057 +499.152 11.7799 11.0535 +500.246 11.8006 11.0731 +501.336 12.155 11.4057 +502.426 12.207 11.4546 +503.527 12.1287 11.3813 +504.617 11.6074 10.8922 +505.707 12.4152 11.6504 +506.801 11.4196 10.7162 +507.891 11.7008 10.9802 +508.98 11.8934 11.1611 +510.074 11.2839 10.5892 +511.168 11.7577 11.034 +512.258 12.2892 11.5329 +513.352 12.1015 11.3568 +514.441 11.5751 10.8629 +515.531 12.2263 11.4742 +516.625 11.4549 10.7504 +517.715 11.6371 10.9215 +518.805 11.6943 10.9753 +519.898 11.6057 10.8922 +520.988 11.715 10.9949 +522.078 11.8191 11.0927 +523.172 11.72 10.9998 +524.262 11.5219 10.814 +525.352 11.5946 10.8824 +526.445 11.329 10.6332 +527.535 11.6726 10.9558 +528.625 11.3912 10.6918 +529.719 11.5837 10.8726 +530.809 11.792 11.0682 +531.898 11.5054 10.7993 +532.992 12.0628 11.3226 +534.082 11.3749 10.6771 +535.172 11.63 10.9166 +536.266 11.3799 10.682 +537.355 11.3538 10.6576 +538.445 11.1975 10.511 +539.539 11.1505 10.467 +540.629 11.3066 10.6136 +541.719 11.2857 10.5941 +542.812 11.2803 10.5892 +543.902 11.4572 10.7553 +544.992 11.8372 11.1122 +546.086 11.2383 10.5501 +547.176 11.8787 11.1514 +548.273 11.3317 10.638 +549.363 11.1911 10.5061 +550.453 11.4409 10.7407 +551.547 11.2742 10.5843 +552.637 11.3262 10.6332 +553.727 11.5186 10.814 +554.82 11.5342 10.8287 +555.91 11.4299 10.7309 +557 11.7005 10.9851 +558.094 11.4453 10.7456 +559.184 11.315 10.6234 +560.273 10.9975 10.3254 +561.367 11.3252 10.6332 +562.457 11.7103 10.9949 +563.547 10.7111 10.0568 +564.641 11.3144 10.6234 +565.73 11.2727 10.5843 +566.82 11.3766 10.682 +567.914 10.9967 10.3254 +569.004 10.6845 10.0324 +570.094 10.8976 10.2326 +571.195 11.5271 10.8238 +572.285 11.5686 10.8629 +573.379 10.97 10.3009 +574.469 11.0012 10.3303 +575.559 11.308 10.6185 +576.652 11.3807 10.6869 +577.742 10.902 10.2375 +578.832 11.3857 10.6918 +579.922 11.0578 10.384 +581.016 10.9589 10.2912 +582.105 11.3073 10.6185 +583.199 10.7818 10.1251 +584.289 11.3747 10.682 +585.379 11.0313 10.3596 +586.473 11.5671 10.8629 +587.562 11.2287 10.5452 +588.652 10.7761 10.1203 +589.746 11.0411 10.3693 +590.836 11.1243 10.4475 +591.926 10.6302 9.98355 +593.02 11.0096 10.34 +594.117 11.0875 10.4133 +595.207 11.3215 10.6332 +596.301 10.7701 10.1154 +597.391 11.0143 10.3449 +598.48 11.2118 10.5305 +599.574 11.0505 10.3791 +600.664 10.7385 10.0861 +601.754 10.8891 10.2277 +602.848 10.3692 9.73952 +603.938 10.8732 10.213 +605.027 11.0447 10.3742 +606.121 10.8003 10.1447 +607.211 10.5351 9.89569 +608.301 11.0288 10.3596 +609.395 10.67 10.0226 +610.484 10.5555 9.91521 +611.574 10.571 9.92986 +612.668 11.0127 10.3449 +613.758 10.6383 9.99332 +614.848 10.8877 10.2277 +615.941 10.5965 9.95427 +617.031 11.2515 10.5696 +618.121 10.7158 10.0665 +619.215 10.5702 9.92986 +620.305 10.6584 10.0128 +621.395 11.2198 10.5403 +622.488 10.3309 9.70536 +623.578 11.2976 10.6136 +624.668 10.606 9.96403 +625.762 10.9697 10.3058 +626.852 10.6889 10.0421 +627.941 10.6888 10.0421 +629.035 10.2368 9.61753 +630.125 10.7042 10.0568 +631.215 10.8912 10.2326 +632.309 10.5741 9.93474 +633.398 10.8702 10.213 +634.488 10.9533 10.2912 +635.582 10.9063 10.2472 +636.672 10.3243 9.70048 +637.762 10.8073 10.1544 +638.855 11.1867 10.511 +639.957 10.4019 9.77368 +641.047 10.8954 10.2375 +642.141 10.8692 10.213 +643.23 10.8588 10.2033 +644.32 10.869 10.213 +645.414 10.4169 9.78832 +646.504 10.8273 10.174 +647.594 10.3129 9.69072 +648.688 10.6192 9.97867 +649.777 10.9881 10.3254 +650.867 10.8216 10.1691 +651.961 10.6344 9.99332 +653.051 10.3487 9.72488 +654.141 10.7177 10.0718 +655.234 10.6981 10.0535 +656.324 10.6797 10.0363 +657.414 10.6601 10.018 +658.508 10.6407 9.99981 +659.598 10.6223 9.98268 +660.688 10.6029 9.96452 +661.781 10.5836 9.94645 +662.879 10.5653 9.92937 +663.973 10.546 9.91131 +665.062 10.5267 9.89335 +666.152 10.5085 9.87636 +667.246 10.4915 9.8604 +668.336 10.4723 9.84249 +669.426 10.4532 9.82463 +670.52 10.4351 9.80774 +671.609 10.416 9.78993 +672.699 10.397 9.77216 +673.789 10.3791 9.75537 +674.883 10.3601 9.73766 +675.973 10.3412 9.72 +677.062 10.3233 9.70331 +678.156 10.3045 9.68569 +679.246 10.2877 9.67003 +680.336 10.2689 9.65246 +681.43 10.2512 9.63592 +682.52 9.99802 9.39802 +683.609 10.3768 9.75416 +684.703 10.3196 9.70048 +685.797 10.0236 9.4224 +686.887 10.0132 9.41265 +687.98 10.2206 9.60777 +689.07 10.2413 9.62729 +690.16 10.2567 9.64193 +691.25 9.99199 9.39314 +692.344 10.4434 9.8176 +693.434 10.2305 9.61753 +694.527 10.2667 9.65168 +695.617 10.1784 9.56874 +696.707 10.1264 9.51996 +697.797 9.97061 9.37363 +698.891 10.2351 9.62241 +699.98 10.6295 9.99332 +701.074 9.82506 9.23709 +702.164 10.0843 9.48094 +703.254 10.2191 9.60777 +704.348 10.4578 9.83224 +705.438 10.3642 9.7444 +706.527 10.2292 9.61753 +707.621 10.0579 9.45655 +708.711 10.1615 9.55411 +709.801 10.1666 9.55899 +710.891 10.3066 9.69072 +711.984 10.1716 9.56386 +713.074 10.488 9.86152 +714.168 10.4672 9.842 +715.262 9.75113 9.16883 +716.352 10.7784 10.1349 +717.441 10.1243 9.51996 +718.535 10.1502 9.54435 +719.625 9.88554 9.2956 +720.715 9.99953 9.40289 +721.809 9.98387 9.38826 +722.898 9.80226 9.21758 +723.988 10.2742 9.66144 +725.082 10.0925 9.49069 +726.172 10.0042 9.40777 +727.262 9.98854 9.39314 +728.355 9.87953 9.29073 +729.445 10.2321 9.62241 +730.535 10.0971 9.49557 +731.637 10.2942 9.68096 +732.727 9.96727 9.37363 +733.816 10.2161 9.60777 +734.91 10.3561 9.73952 +736 10.1329 9.52972 +737.09 9.98241 9.38826 +738.184 10.2468 9.63705 +739.273 9.81627 9.23221 +740.363 10.2674 9.65656 +741.457 10.1791 9.57362 +742.547 10.236 9.62729 +743.637 9.88845 9.30048 +744.73 10.1632 9.55899 +745.82 9.64979 9.0762 +746.91 9.96591 9.37363 +748.004 9.76361 9.18345 +749.094 9.86719 9.28097 +750.184 10.3079 9.6956 +751.277 10.0899 9.49069 +752.367 9.78394 9.20296 +753.457 9.74756 9.16883 +754.559 9.54534 8.97871 +755.648 9.73699 9.15908 +756.742 9.83018 9.24684 +757.832 9.93376 9.34437 +758.922 9.78333 9.20296 +760.016 9.45676 8.89586 +761.105 10.0371 9.44191 +762.199 9.79338 9.21271 +763.289 9.74664 9.16883 +764.383 10.0524 9.45655 +765.473 9.64797 9.0762 +766.562 9.64268 9.07132 +767.656 10.0313 9.43704 +768.746 10.0364 9.44191 +769.836 9.88077 9.2956 +770.93 9.85994 9.2761 +772.02 9.97906 9.38826 +773.109 10.2175 9.61265 +774.203 9.75079 9.1737 +775.293 9.91136 9.32486 +776.387 9.49672 8.93485 +777.48 9.97853 9.38826 +778.57 9.59494 9.02745 +779.66 9.91613 9.32974 +780.754 9.29433 8.7448 +781.844 9.37191 8.81789 +782.934 10.0661 9.47118 +784.027 9.71361 9.13958 +785.117 9.98299 9.39314 +786.207 9.88959 9.30536 +787.301 9.66148 9.09082 +788.391 10.0708 9.47606 +789.48 9.83228 9.25172 +790.574 9.35559 8.80327 +791.664 10.0342 9.44191 +792.754 9.34503 8.79352 +793.848 9.64015 9.07132 +794.938 9.75404 9.17858 +796.027 9.67103 9.10057 +797.121 9.12203 8.58404 +798.211 9.23582 8.69121 +799.301 9.70181 9.12982 +800.395 9.58775 9.02258 +801.484 9.62391 9.0567 +802.574 9.45807 8.90073 +803.668 9.95012 9.36388 +804.758 9.8671 9.28585 +805.848 9.31797 8.76916 +806.938 9.39554 8.84225 +808.031 9.16766 8.62788 +809.121 9.57659 9.01283 +810.211 9.39524 8.84225 +811.305 9.60747 9.04208 +812.395 9.6747 9.10545 +813.484 9.57101 9.00796 +814.578 9.28096 8.73506 +815.668 9.10487 8.56942 +816.758 9.45161 8.89586 +817.852 9.41008 8.85687 +818.941 9.67926 9.11032 +820.031 9.47202 8.91535 +821.125 9.20273 8.66198 +822.227 9.54432 8.98359 +823.316 9.60117 9.0372 +824.41 9.28525 8.73993 +825.5 9.36281 8.81302 +826.59 9.33682 8.78865 +827.684 9.56452 9.00308 +828.773 9.43499 8.88124 +829.863 9.16056 8.62301 +830.957 9.28467 8.73993 +832.098 9.43986 8.88611 +833.191 9.74009 9.16883 +834.281 9.48108 8.9251 +835.371 9.39297 8.84225 +836.465 9.51194 8.95434 +837.555 9.5688 9.00796 +838.645 9.09251 8.55968 +839.738 9.62556 9.06158 +840.828 9.15959 8.62301 +841.918 9.44932 8.89586 +843.012 9.67185 9.10545 +844.102 9.05065 8.52072 +845.199 9.43867 8.88611 +846.289 9.34022 8.79352 +847.379 9.69216 9.12495 +848.473 9.36591 8.81789 +849.562 8.80708 8.29184 +850.652 9.92491 9.34437 +851.746 9.1845 8.64736 +852.836 9.14301 8.60839 +853.926 9.10152 8.56942 +855.02 9.04452 8.51584 +856.109 9.19964 8.66198 +857.199 9.27716 8.73506 +858.293 8.93045 8.4087 +859.383 9.30283 8.75942 +860.473 9.28721 8.7448 +861.566 9.46307 8.91048 +862.656 9.27149 8.73018 +863.746 9.23 8.69121 +864.84 9.29716 8.75454 +865.93 9.42126 8.87149 +867.031 9.47292 8.92023 +868.121 8.82102 8.30645 +869.211 9.30713 8.76429 +870.305 9.25529 8.71557 +871.395 9.27071 8.73018 +872.484 9.18784 8.65223 +873.578 9.46197 8.91048 +874.668 8.9911 8.46714 +875.758 9.28584 8.7448 +876.852 9.31161 8.76916 +877.941 9.07357 8.54507 +879.031 9.17174 8.63762 +880.125 9.36823 8.82276 +881.215 9.16638 8.63275 +882.305 9.03698 8.51097 +883.398 8.83523 8.32105 +884.488 8.73692 8.22855 +885.578 8.94362 8.42331 +886.672 9.64191 9.08107 +887.762 8.97446 8.45253 +888.852 9.13984 8.60839 +889.945 9.26389 8.72531 +891.035 8.88628 8.36975 +892.129 9.20679 8.67172 +893.223 9.27394 8.73506 +894.312 8.76711 8.25776 +895.402 9.08238 8.55481 +896.496 9.01506 8.49149 +897.586 9.18045 8.64736 +898.676 9.08727 8.55968 +899.77 9.15441 8.62301 +900.859 8.92163 8.40383 +901.949 8.90602 8.38922 +903.043 9.07138 8.54507 +904.133 8.88 8.36488 +905.223 9.00914 8.48662 +906.316 8.71958 8.21394 +907.406 9.18993 8.65711 +908.496 9.18466 8.65223 +909 8.96623 8.48095 +910 8.96132 8.47646 +911 8.95643 8.47197 +912 8.95154 8.46749 +913 8.94666 8.46303 +914 8.94179 8.45857 +915 8.93692 8.45413 +916 8.93207 8.44969 +917 8.92722 8.44526 +918 8.92238 8.44085 +919 8.91754 8.43644 +920 8.91272 8.43205 +921 8.9079 8.42766 +922 8.90309 8.42328 +923 8.89829 8.41892 +924 8.8935 8.41456 +925 8.88871 8.41021 +926 8.88394 8.40588 +927 8.87917 8.40155 +928 8.87441 8.39723 +929 8.86965 8.39292 +930 8.8649 8.38863 +931 8.86017 8.38434 +932 8.85543 8.38006 +933 8.85071 8.37579 +934 8.84599 8.37153 +935 8.84129 8.36727 +936 8.83659 8.36303 +937 8.83189 8.3588 +938 8.82721 8.35458 +939 8.82253 8.35036 +940 8.81786 8.34616 +941 8.8132 8.34196 +942 8.80854 8.33777 +943 8.80389 8.3336 +944 8.79925 8.32943 +945 8.79462 8.32527 +946 8.78999 8.32112 +947 8.78538 8.31698 +948 8.78076 8.31284 +949 8.77616 8.30872 +950 8.77157 8.3046 +951 8.76698 8.3005 +952 8.7624 8.2964 +953 8.75782 8.29231 +954 8.75325 8.28823 +955 8.74869 8.28416 +956 8.74414 8.2801 +957 8.7396 8.27605 +958 8.73506 8.272 +959 8.73053 8.26797 +960 8.72601 8.26394 +961 8.72149 8.25992 +962 8.71698 8.25591 +963 8.71248 8.25191 +964 8.70798 8.24791 +965 8.7035 8.24393 +966 8.69901 8.23995 +967 8.69454 8.23598 +968 8.69007 8.23202 +969 8.68561 8.22807 +970 8.68116 8.22412 +971 8.67672 8.22019 +972 8.67228 8.21626 +973 8.66784 8.21234 +974 8.66342 8.20843 +975 8.659 8.20452 +976 8.65459 8.20063 +977 8.65019 8.19674 +978 8.64579 8.19286 +979 8.6414 8.18899 +980 8.63701 8.18512 +981 8.63264 8.18127 +982 8.62827 8.17742 +983 8.6239 8.17358 +984 8.61955 8.16974 +985 8.6152 8.16592 +986 8.61085 8.1621 +987 8.60652 8.15829 +988 8.60219 8.15449 +989 8.59786 8.15069 +990 8.59355 8.1469 +991 8.58924 8.14312 +992 8.58493 8.13935 +993 8.58063 8.13559 +994 8.57634 8.13183 +995 8.57206 8.12808 +996 8.56778 8.12434 +997 8.56351 8.1206 +998 8.55925 8.11687 +999 8.55499 8.11315 +1000 8.55074 8.10944 +1001 8.54649 8.10573 +1002 8.54225 8.10203 +1003 8.53802 8.09834 +1004 8.5338 8.09465 +1005 8.52958 8.09097 +1006 8.52536 8.0873 +1007 8.52116 8.08364 +1008 8.51696 8.07998 +1009 8.51276 8.07633 +1010 8.50857 8.07268 +1011 8.50439 8.06905 +1012 8.50022 8.06542 +1013 8.49605 8.06179 +1014 8.49189 8.05818 +1015 8.48773 8.05457 +1016 8.48358 8.05096 +1017 8.47943 8.04736 +1018 8.47529 8.04377 +1019 8.47116 8.04019 +1020 8.46704 8.03661 +1021 8.46292 8.03304 +1022 8.4588 8.02948 +1023 8.45469 8.02592 +1024 8.45059 8.02237 +1025 8.4465 8.01882 +1026 8.44241 8.01529 +1027 8.43832 8.01175 +1028 8.43424 8.00823 +1029 8.43017 8.00471 +1030 8.4261 8.00119 +1031 8.42204 7.99768 +1032 8.41799 7.99418 +1033 8.41394 7.99069 +1034 8.4099 7.9872 +1035 8.40586 7.98372 +1036 8.40183 7.98024 +1037 8.3978 7.97677 +1038 8.39378 7.9733 +1039 8.38977 7.96984 +1040 8.38576 7.96639 +1041 8.38176 7.96294 +1042 8.37776 7.9595 +1043 8.37377 7.95606 +1044 8.36979 7.95263 +1045 8.36581 7.94921 +1046 8.36183 7.94579 +1047 8.35786 7.94237 +1048 8.3539 7.93897 +1049 8.34994 7.93556 +1050 8.34599 7.93217 +1051 8.34205 7.92878 +1052 8.33811 7.92539 +1053 8.33417 7.92201 +1054 8.33024 7.91863 +1055 8.32632 7.91526 +1056 8.3224 7.9119 +1057 8.31849 7.90854 +1058 8.31458 7.90519 +1059 8.31067 7.90184 +1060 8.30678 7.8985 +1061 8.30289 7.89516 +1062 8.299 7.89183 +1063 8.29512 7.8885 +1064 8.29124 7.88517 +1065 8.28737 7.88186 +1066 8.28351 7.87854 +1067 8.27965 7.87524 +1068 8.27579 7.87193 +1069 8.27194 7.86864 +1070 8.2681 7.86534 +1071 8.26426 7.86206 +1072 8.26043 7.85877 +1073 8.2566 7.85549 +1074 8.25277 7.85222 +1075 8.24896 7.84895 +1076 8.24514 7.84569 +1077 8.24133 7.84243 +1078 8.23753 7.83917 +1079 8.23373 7.83592 +1080 8.22994 7.83268 +1081 8.22615 7.82944 +1082 8.22237 7.8262 +1083 8.21859 7.82297 +1084 8.21482 7.81974 +1085 8.21105 7.81652 +1086 8.20729 7.8133 +1087 8.20353 7.81008 +1088 8.19977 7.80687 +1089 8.19603 7.80366 +1090 8.19228 7.80046 +1091 8.18854 7.79727 +1092 8.18481 7.79407 +1093 8.18108 7.79088 +1094 8.17736 7.7877 +1095 8.17364 7.78452 +1096 8.16992 7.78134 +1097 8.16621 7.77817 +1098 8.16251 7.775 +1099 8.15881 7.77183 +1100 8.15511 7.76867 +1101 8.15142 7.76551 +1102 8.14773 7.76236 +1103 8.14405 7.75921 +1104 8.14037 7.75606 +1105 8.1367 7.75292 +1106 8.13303 7.74978 +1107 8.12937 7.74665 +1108 8.12571 7.74352 +1109 8.12206 7.74039 +1110 8.11841 7.73727 +1111 8.11476 7.73415 +1112 8.11112 7.73103 +1113 8.10748 7.72792 +1114 8.10385 7.72481 +1115 8.10022 7.7217 +1116 8.0966 7.7186 +1117 8.09298 7.7155 +1118 8.08937 7.7124 +1119 8.08576 7.70931 +1120 8.08215 7.70622 +1121 8.07855 7.70313 +1122 8.07495 7.70005 +1123 8.07136 7.69697 +1124 8.06777 7.69389 +1125 8.06419 7.69082 +1126 8.06061 7.68775 +1127 8.05703 7.68468 +1128 8.05346 7.68162 +1129 8.04989 7.67856 +1130 8.04633 7.6755 +1131 8.04277 7.67244 +1132 8.03921 7.66939 +1133 8.03566 7.66634 +1134 8.03212 7.66329 +1135 8.02857 7.66025 +1136 8.02504 7.65721 +1137 8.0215 7.65417 +1138 8.01797 7.65113 +1139 8.01445 7.6481 +1140 8.01092 7.64507 +1141 8.0074 7.64204 +1142 8.00389 7.63902 +1143 8.00038 7.63599 +1144 7.99687 7.63297 +1145 7.99337 7.62995 +1146 7.98987 7.62694 +1147 7.98638 7.62393 +1148 7.98289 7.62092 +1149 7.9794 7.61791 +1150 7.97592 7.6149 +1151 7.97244 7.6119 +1152 7.96896 7.6089 +1153 7.96549 7.6059 +1154 7.96202 7.6029 +1155 7.95856 7.59991 +1156 7.9551 7.59691 +1157 7.95164 7.59392 +1158 7.94819 7.59094 +1159 7.94474 7.58795 +1160 7.94129 7.58497 +1161 7.93785 7.58198 +1162 7.93441 7.579 +1163 7.93098 7.57602 +1164 7.92755 7.57305 +1165 7.92412 7.57007 +1166 7.92069 7.5671 +1167 7.91727 7.56413 +1168 7.91386 7.56116 +1169 7.91044 7.55819 +1170 7.90703 7.55523 +1171 7.90363 7.55226 +1172 7.90022 7.5493 +1173 7.89682 7.54634 +1174 7.89343 7.54338 +1175 7.89003 7.54042 +1176 7.88665 7.53747 +1177 7.88326 7.53451 +1178 7.87988 7.53156 +1179 7.8765 7.52861 +1180 7.87312 7.52566 +1181 7.86975 7.52271 +1182 7.86638 7.51976 +1183 7.86301 7.51682 +1184 7.85965 7.51387 +1185 7.85629 7.51093 +1186 7.85294 7.50799 +1187 7.84958 7.50504 +1188 7.84623 7.5021 +1189 7.84289 7.49916 +1190 7.83954 7.49623 +1191 7.8362 7.49329 +1192 7.83287 7.49035 +1193 7.82953 7.48742 +1194 7.8262 7.48449 +1195 7.82287 7.48155 +1196 7.81955 7.47862 +1197 7.81623 7.47569 +1198 7.81291 7.47276 +1199 7.80959 7.46983 +1200 7.80628 7.4669 +1201 7.80297 7.46397 +1202 7.79966 7.46105 +1203 7.79636 7.45812 +1204 7.79306 7.45519 +1205 7.78976 7.45227 +1206 7.78647 7.44934 +1207 7.78317 7.44642 +1208 7.77988 7.4435 +1209 7.7766 7.44057 +1210 7.77332 7.43765 +1211 7.77003 7.43473 +1212 7.76676 7.43181 +1213 7.76348 7.42889 +1214 7.76021 7.42597 +1215 7.75694 7.42305 +1216 7.75367 7.42013 +1217 7.75041 7.41721 +1218 7.74715 7.41429 +1219 7.74389 7.41137 +1220 7.74064 7.40846 +1221 7.73739 7.40554 +1222 7.73414 7.40263 +1223 7.73089 7.39971 +1224 7.72765 7.3968 +1225 7.72441 7.39388 +1226 7.72117 7.39097 +1227 7.71793 7.38806 +1228 7.7147 7.38514 +1229 7.71147 7.38223 +1230 7.70824 7.37932 +1231 7.70502 7.37641 +1232 7.7018 7.3735 +1233 7.69858 7.37059 +1234 7.69536 7.36769 +1235 7.69215 7.36478 +1236 7.68894 7.36187 +1237 7.68573 7.35896 +1238 7.68253 7.35606 +1239 7.67933 7.35315 +1240 7.67613 7.35025 +1241 7.67293 7.34734 +1242 7.66974 7.34444 +1243 7.66655 7.34154 +1244 7.66336 7.33864 +1245 7.66017 7.33573 +1246 7.65699 7.33283 +1247 7.65381 7.32993 +1248 7.65063 7.32703 +1249 7.64746 7.32413 +1250 7.64429 7.32124 +1251 7.64112 7.31834 +1252 7.63795 7.31544 +1253 7.63479 7.31255 +1254 7.63163 7.30965 +1255 7.62847 7.30676 +1256 7.62531 7.30386 +1257 7.62216 7.30097 +1258 7.61901 7.29807 +1259 7.61586 7.29518 +1260 7.61272 7.29229 +1261 7.60958 7.2894 +1262 7.60644 7.28651 +1263 7.6033 7.28362 +1264 7.60016 7.28073 +1265 7.59703 7.27784 +1266 7.5939 7.27495 +1267 7.59078 7.27207 +1268 7.58766 7.26918 +1269 7.58453 7.2663 +1270 7.58142 7.26341 +1271 7.5783 7.26053 +1272 7.57519 7.25764 +1273 7.57208 7.25476 +1274 7.56897 7.25188 +1275 7.56586 7.249 +1276 7.56276 7.24612 +1277 7.55966 7.24324 +1278 7.55657 7.24036 +1279 7.55347 7.23748 +1280 7.55038 7.2346 +1281 7.54729 7.23172 +1282 7.5442 7.22885 +1283 7.54112 7.22597 +1284 7.53804 7.2231 +1285 7.53496 7.22022 +1286 7.53188 7.21735 +1287 7.52881 7.21447 +1288 7.52574 7.2116 +1289 7.52267 7.20873 +1290 7.5196 7.20586 +1291 7.51654 7.20299 +1292 7.51348 7.20012 +1293 7.51042 7.19725 +1294 7.50736 7.19439 +1295 7.50431 7.19152 +1296 7.50126 7.18865 +1297 7.49821 7.18579 +1298 7.49516 7.18292 +1299 7.49212 7.18006 +1300 7.48908 7.17719 +1301 7.48604 7.17433 +1302 7.48301 7.17147 +1303 7.47997 7.16861 +1304 7.47694 7.16575 +1305 7.47392 7.16289 +1306 7.47089 7.16003 +1307 7.46787 7.15717 +1308 7.46485 7.15432 +1309 7.46183 7.15146 +1310 7.45881 7.1486 +1311 7.4558 7.14575 +1312 7.45279 7.1429 +1313 7.44978 7.14004 +1314 7.44678 7.13719 +1315 7.44377 7.13434 +1316 7.44077 7.13149 +1317 7.43777 7.12864 +1318 7.43478 7.12579 +1319 7.43178 7.12294 +1320 7.42879 7.12009 +1321 7.42581 7.11725 +1322 7.42282 7.1144 +1323 7.41984 7.11155 +1324 7.41686 7.10871 +1325 7.41388 7.10587 +1326 7.4109 7.10302 +1327 7.40793 7.10018 +1328 7.40496 7.09734 +1329 7.40199 7.0945 +1330 7.39902 7.09166 +1331 7.39606 7.08882 +1332 7.39309 7.08598 +1333 7.39014 7.08315 +1334 7.38718 7.08031 +1335 7.38422 7.07747 +1336 7.38127 7.07464 +1337 7.37832 7.07181 +1338 7.37538 7.06897 +1339 7.37243 7.06614 +1340 7.36949 7.06331 +1341 7.36655 7.06048 +1342 7.36361 7.05765 +1343 7.36068 7.05482 +1344 7.35774 7.05199 +1345 7.35481 7.04917 +1346 7.35188 7.04634 +1347 7.34896 7.04351 +1348 7.34603 7.04069 +1349 7.34311 7.03787 +1350 7.3402 7.03504 +1351 7.33728 7.03222 +1352 7.33436 7.0294 +1353 7.33145 7.02658 +1354 7.32854 7.02376 +1355 7.32564 7.02094 +1356 7.32273 7.01812 +1357 7.31983 7.01531 +1358 7.31693 7.01249 +1359 7.31403 7.00968 +1360 7.31114 7.00686 +1361 7.30824 7.00405 +1362 7.30535 7.00124 +1363 7.30246 6.99843 +1364 7.29958 6.99561 +1365 7.29669 6.9928 +1366 7.29381 6.99 +1367 7.29093 6.98719 +1368 7.28806 6.98438 +1369 7.28518 6.98157 +1370 7.28231 6.97877 +1371 7.27944 6.97597 +1372 7.27657 6.97316 +1373 7.2737 6.97036 +1374 7.27084 6.96756 +1375 7.26798 6.96476 +1376 7.26512 6.96196 +1377 7.26226 6.95916 +1378 7.25941 6.95636 +1379 7.25656 6.95356 +1380 7.25371 6.95077 +1381 7.25086 6.94797 +1382 7.24801 6.94518 +1383 7.24517 6.94238 +1384 7.24233 6.93959 +1385 7.23949 6.9368 +1386 7.23665 6.93401 +1387 7.23382 6.93122 +1388 7.23099 6.92843 +1389 7.22816 6.92564 +1390 7.22533 6.92286 +1391 7.2225 6.92007 +1392 7.21968 6.91729 +1393 7.21686 6.9145 +1394 7.21404 6.91172 +1395 7.21122 6.90894 +1396 7.20841 6.90616 +1397 7.2056 6.90338 +1398 7.20279 6.9006 +1399 7.19998 6.89782 +1400 7.19717 6.89504 +1401 7.19437 6.89227 +1402 7.19157 6.88949 +1403 7.18877 6.88672 +1404 7.18597 6.88394 +1405 7.18318 6.88117 +1406 7.18038 6.8784 +1407 7.17759 6.87563 +1408 7.1748 6.87286 +1409 7.17202 6.87009 +1410 7.16923 6.86732 +1411 7.16645 6.86456 +1412 7.16367 6.86179 +1413 7.16089 6.85903 +1414 7.15812 6.85626 +1415 7.15534 6.8535 +1416 7.15257 6.85074 +1417 7.1498 6.84798 +1418 7.14703 6.84522 +1419 7.14427 6.84246 +1420 7.14151 6.8397 +1421 7.13875 6.83695 +1422 7.13599 6.83419 +1423 7.13323 6.83144 +1424 7.13047 6.82868 +1425 7.12772 6.82593 +1426 7.12497 6.82318 +1427 7.12222 6.82043 +1428 7.11948 6.81768 +1429 7.11673 6.81493 +1430 7.11399 6.81218 +1431 7.11125 6.80944 +1432 7.10851 6.80669 +1433 7.10577 6.80395 +1434 7.10304 6.8012 +1435 7.10031 6.79846 +1436 7.09758 6.79572 +1437 7.09485 6.79298 +1438 7.09212 6.79024 +1439 7.0894 6.7875 +1440 7.08668 6.78476 +1441 7.08396 6.78203 +1442 7.08124 6.77929 +1443 7.07852 6.77656 +1444 7.07581 6.77383 +1445 7.0731 6.77109 +1446 7.07039 6.76836 +1447 7.06768 6.76563 +1448 7.06497 6.76291 +1449 7.06227 6.76018 +1450 7.05957 6.75745 +1451 7.05687 6.75473 +1452 7.05417 6.752 +1453 7.05147 6.74928 +1454 7.04878 6.74656 +1455 7.04609 6.74383 +1456 7.0434 6.74111 +1457 7.04071 6.73839 +1458 7.03802 6.73568 +1459 7.03534 6.73296 +1460 7.03266 6.73024 +1461 7.02998 6.72753 +1462 7.0273 6.72482 +1463 7.02462 6.7221 +1464 7.02195 6.71939 +1465 7.01928 6.71668 +1466 7.01661 6.71397 +1467 7.01394 6.71126 +1468 7.01127 6.70856 +1469 7.00861 6.70585 +1470 7.00594 6.70315 +1471 7.00328 6.70044 +1472 7.00062 6.69774 +1473 6.99797 6.69504 +1474 6.99531 6.69234 +1475 6.99266 6.68964 +1476 6.99001 6.68694 +1477 6.98736 6.68424 +1478 6.98471 6.68155 +1479 6.98206 6.67885 +1480 6.97942 6.67616 +1481 6.97678 6.67346 +1482 6.97414 6.67077 +1483 6.9715 6.66808 +1484 6.96886 6.66539 +1485 6.96623 6.66271 +1486 6.9636 6.66002 +1487 6.96097 6.65733 +1488 6.95834 6.65465 +1489 6.95571 6.65196 +1490 6.95309 6.64928 +1491 6.95046 6.6466 +1492 6.94784 6.64392 +1493 6.94522 6.64124 +1494 6.9426 6.63856 +1495 6.93999 6.63589 +1496 6.93737 6.63321 +1497 6.93476 6.63054 +1498 6.93215 6.62786 +1499 6.92954 6.62519 +1500 6.92694 6.62252 +1501 6.92433 6.61985 +1502 6.92173 6.61718 +1503 6.91913 6.61451 +1504 6.91653 6.61185 +1505 6.91393 6.60918 +1506 6.91133 6.60652 +1507 6.90874 6.60386 +1508 6.90615 6.60119 +1509 6.90356 6.59853 +1510 6.90097 6.59587 +1511 6.89838 6.59322 +1512 6.8958 6.59056 +1513 6.89321 6.5879 +1514 6.89063 6.58525 +1515 6.88805 6.5826 +1516 6.88548 6.57994 +1517 6.8829 6.57729 +1518 6.88032 6.57464 +1519 6.87775 6.572 +1520 6.87518 6.56935 +1521 6.87261 6.5667 +1522 6.87004 6.56406 +1523 6.86748 6.56141 +1524 6.86491 6.55877 +1525 6.86235 6.55613 +1526 6.85979 6.55349 +1527 6.85723 6.55085 +1528 6.85468 6.54821 +1529 6.85212 6.54558 +1530 6.84957 6.54294 +1531 6.84701 6.54031 +1532 6.84446 6.53767 +1533 6.84192 6.53504 +1534 6.83937 6.53241 +1535 6.83682 6.52978 +1536 6.83428 6.52715 +1537 6.83174 6.52453 +1538 6.8292 6.5219 +1539 6.82666 6.51928 +1540 6.82412 6.51666 +1541 6.82159 6.51403 +1542 6.81906 6.51141 +1543 6.81652 6.50879 +1544 6.81399 6.50618 +1545 6.81147 6.50356 +1546 6.80894 6.50094 +1547 6.80642 6.49833 +1548 6.80389 6.49572 +1549 6.80137 6.49311 +1550 6.79885 6.49049 +1551 6.79633 6.48789 +1552 6.79382 6.48528 +1553 6.7913 6.48267 +1554 6.78879 6.48007 +1555 6.78628 6.47746 +1556 6.78377 6.47486 +1557 6.78126 6.47226 +1558 6.77875 6.46966 +1559 6.77624 6.46706 +1560 6.77374 6.46446 +1561 6.77124 6.46186 +1562 6.76874 6.45927 +1563 6.76624 6.45667 +1564 6.76374 6.45408 +1565 6.76125 6.45149 +1566 6.75875 6.4489 +1567 6.75626 6.44631 +1568 6.75377 6.44372 +1569 6.75128 6.44114 +1570 6.74879 6.43855 +1571 6.74631 6.43597 +1572 6.74382 6.43339 +1573 6.74134 6.43081 +1574 6.73886 6.42823 +1575 6.73638 6.42565 +1576 6.7339 6.42307 +1577 6.73142 6.42049 +1578 6.72895 6.41792 +1579 6.72648 6.41535 +1580 6.724 6.41277 +1581 6.72153 6.4102 +1582 6.71906 6.40763 +1583 6.7166 6.40507 +1584 6.71413 6.4025 +1585 6.71167 6.39993 +1586 6.7092 6.39737 +1587 6.70674 6.39481 +1588 6.70428 6.39225 +1589 6.70182 6.38969 +1590 6.69937 6.38713 +1591 6.69691 6.38457 +1592 6.69446 6.38201 +1593 6.69201 6.37946 +1594 6.68956 6.37691 +1595 6.68711 6.37435 +1596 6.68466 6.3718 +1597 6.68221 6.36926 +1598 6.67977 6.36671 +1599 6.67733 6.36416 +1600 6.67488 6.36162 +1601 6.67244 6.35907 +1602 6.67001 6.35653 +1603 6.66757 6.35399 +1604 6.66513 6.35145 +1605 6.6627 6.34891 +1606 6.66027 6.34637 +1607 6.65783 6.34384 +1608 6.6554 6.3413 +1609 6.65298 6.33877 +1610 6.65055 6.33624 +1611 6.64812 6.33371 +1612 6.6457 6.33118 +1613 6.64328 6.32865 +1614 6.64086 6.32612 +1615 6.63844 6.3236 +1616 6.63602 6.32108 +1617 6.6336 6.31855 +1618 6.63119 6.31603 +1619 6.62877 6.31351 +1620 6.62636 6.311 +1621 6.62395 6.30848 +1622 6.62154 6.30597 +1623 6.61913 6.30345 +1624 6.61672 6.30094 +1625 6.61432 6.29843 +1626 6.61191 6.29592 +1627 6.60951 6.29341 +1628 6.60711 6.2909 +1629 6.60471 6.2884 +1630 6.60231 6.2859 +1631 6.59991 6.28339 +1632 6.59752 6.28089 +1633 6.59512 6.27839 +1634 6.59273 6.27589 +1635 6.59034 6.2734 +1636 6.58795 6.2709 +1637 6.58556 6.26841 +1638 6.58317 6.26592 +1639 6.58079 6.26342 +1640 6.5784 6.26093 +1641 6.57602 6.25845 +1642 6.57363 6.25596 +1643 6.57125 6.25347 +1644 6.56887 6.25099 +1645 6.5665 6.24851 +1646 6.56412 6.24603 +1647 6.56174 6.24355 +1648 6.55937 6.24107 +1649 6.557 6.23859 +1650 6.55463 6.23612 +1651 6.55225 6.23364 +1652 6.54989 6.23117 +1653 6.54752 6.2287 +1654 6.54515 6.22623 +1655 6.54279 6.22376 +1656 6.54042 6.22129 +1657 6.53806 6.21883 +1658 6.5357 6.21637 +1659 6.53334 6.2139 +1660 6.53098 6.21144 +1661 6.52862 6.20898 +1662 6.52627 6.20653 +1663 6.52391 6.20407 +1664 6.52156 6.20161 +1665 6.51921 6.19916 +1666 6.51686 6.19671 +1667 6.51451 6.19426 +1668 6.51216 6.19181 +1669 6.50981 6.18936 +1670 6.50747 6.18691 +1671 6.50512 6.18447 +1672 6.50278 6.18203 +1673 6.50044 6.17959 +1674 6.4981 6.17715 +1675 6.49576 6.17471 +1676 6.49342 6.17227 +1677 6.49108 6.16983 +1678 6.48875 6.1674 +1679 6.48641 6.16497 +1680 6.48408 6.16254 +1681 6.48175 6.16011 +1682 6.47942 6.15768 +1683 6.47709 6.15525 +1684 6.47476 6.15283 +1685 6.47243 6.1504 +1686 6.4701 6.14798 +1687 6.46778 6.14556 +1688 6.46546 6.14314 +1689 6.46313 6.14072 +1690 6.46081 6.13831 +1691 6.45849 6.13589 +1692 6.45617 6.13348 +1693 6.45386 6.13107 +1694 6.45154 6.12866 +1695 6.44922 6.12625 +1696 6.44691 6.12384 +1697 6.4446 6.12143 +1698 6.44228 6.11903 +1699 6.43997 6.11663 +1700 6.43766 6.11423 +1701 6.43536 6.11183 +1702 6.43305 6.10943 +1703 6.43074 6.10703 +1704 6.42844 6.10464 +1705 6.42613 6.10225 +1706 6.42383 6.09985 +1707 6.42153 6.09746 +1708 6.41923 6.09507 +1709 6.41693 6.09269 +1710 6.41463 6.0903 +1711 6.41234 6.08792 +1712 6.41004 6.08554 +1713 6.40775 6.08316 +1714 6.40545 6.08078 +1715 6.40316 6.0784 +1716 6.40087 6.07602 +1717 6.39858 6.07365 +1718 6.39629 6.07127 +1719 6.394 6.0689 +1720 6.39171 6.06653 +1721 6.38943 6.06416 +1722 6.38714 6.0618 +1723 6.38486 6.05943 +1724 6.38258 6.05707 +1725 6.3803 6.05471 +1726 6.37802 6.05235 +1727 6.37574 6.04999 +1728 6.37346 6.04763 +1729 6.37118 6.04527 +1730 6.36891 6.04292 +1731 6.36663 6.04057 +1732 6.36436 6.03822 +1733 6.36208 6.03587 +1734 6.35981 6.03352 +1735 6.35754 6.03117 +1736 6.35527 6.02883 +1737 6.353 6.02649 +1738 6.35074 6.02414 +1739 6.34847 6.0218 +1740 6.3462 6.01947 +1741 6.34394 6.01713 +1742 6.34168 6.01479 +1743 6.33941 6.01246 +1744 6.33715 6.01013 +1745 6.33489 6.0078 +1746 6.33263 6.00547 +1747 6.33037 6.00314 +1748 6.32812 6.00082 +1749 6.32586 5.99849 +1750 6.3236 5.99617 +1751 6.32135 5.99385 +1752 6.3191 5.99153 +1753 6.31684 5.98922 +1754 6.31459 5.9869 +1755 6.31234 5.98459 +1756 6.31009 5.98227 +1757 6.30785 5.97996 +1758 6.3056 5.97765 +1759 6.30335 5.97535 +1760 6.30111 5.97304 +1761 6.29886 5.97074 +1762 6.29662 5.96843 +1763 6.29438 5.96613 +1764 6.29213 5.96383 +1765 6.28989 5.96154 +1766 6.28765 5.95924 +1767 6.28542 5.95695 +1768 6.28318 5.95465 +1769 6.28094 5.95236 +1770 6.27871 5.95007 +1771 6.27647 5.94778 +1772 6.27424 5.9455 +1773 6.272 5.94321 +1774 6.26977 5.94093 +1775 6.26754 5.93865 +1776 6.26531 5.93637 +1777 6.26308 5.93409 +1778 6.26085 5.93182 +1779 6.25862 5.92954 +1780 6.2564 5.92727 +1781 6.25417 5.925 +1782 6.25195 5.92273 +1783 6.24972 5.92046 +1784 6.2475 5.9182 +1785 6.24528 5.91593 +1786 6.24306 5.91367 +1787 6.24084 5.91141 +1788 6.23862 5.90915 +1789 6.2364 5.90689 +1790 6.23418 5.90463 +1791 6.23197 5.90238 +1792 6.22975 5.90013 +1793 6.22753 5.89788 +1794 6.22532 5.89563 +1795 6.22311 5.89338 +1796 6.2209 5.89113 +1797 6.21868 5.88889 +1798 6.21647 5.88665 +1799 6.21426 5.88441 +1800 6.21205 5.88217 +1801 6.20985 5.87993 +1802 6.20764 5.8777 +1803 6.20543 5.87546 +1804 6.20323 5.87323 +1805 6.20102 5.871 +1806 6.19882 5.86877 +1807 6.19662 5.86654 +1808 6.19441 5.86432 +1809 6.19221 5.8621 +1810 6.19001 5.85987 +1811 6.18781 5.85765 +1812 6.18561 5.85543 +1813 6.18342 5.85322 +1814 6.18122 5.851 +1815 6.17902 5.84879 +1816 6.17683 5.84658 +1817 6.17463 5.84437 +1818 6.17244 5.84216 +1819 6.17024 5.83995 +1820 6.16805 5.83775 +1821 6.16586 5.83555 +1822 6.16367 5.83334 +1823 6.16148 5.83115 +1824 6.15929 5.82895 +1825 6.1571 5.82675 +1826 6.15492 5.82456 +1827 6.15273 5.82236 +1828 6.15054 5.82017 +1829 6.14836 5.81798 +1830 6.14617 5.8158 +1831 6.14399 5.81361 +1832 6.14181 5.81142 +1833 6.13963 5.80924 +1834 6.13745 5.80706 +1835 6.13527 5.80488 +1836 6.13309 5.8027 +1837 6.13091 5.80053 +1838 6.12873 5.79835 +1839 6.12656 5.79618 +1840 6.12438 5.79401 +1841 6.1222 5.79184 +1842 6.12003 5.78967 +1843 6.11786 5.78751 +1844 6.11569 5.78534 +1845 6.11351 5.78318 +1846 6.11134 5.78102 +1847 6.10917 5.77886 +1848 6.107 5.7767 +1849 6.10484 5.77454 +1850 6.10267 5.77239 +1851 6.1005 5.77024 +1852 6.09834 5.76808 +1853 6.09617 5.76593 +1854 6.09401 5.76379 +1855 6.09184 5.76164 +1856 6.08968 5.7595 +1857 6.08752 5.75735 +1858 6.08536 5.75521 +1859 6.0832 5.75307 +1860 6.08104 5.75093 +1861 6.07888 5.7488 +1862 6.07672 5.74666 +1863 6.07457 5.74453 +1864 6.07241 5.7424 +1865 6.07026 5.74027 +1866 6.0681 5.73814 +1867 6.06595 5.73601 +1868 6.0638 5.73388 +1869 6.06164 5.73176 +1870 6.05949 5.72964 +1871 6.05734 5.72752 +1872 6.05519 5.7254 +1873 6.05305 5.72328 +1874 6.0509 5.72117 +1875 6.04875 5.71905 +1876 6.04661 5.71694 +1877 6.04446 5.71483 +1878 6.04232 5.71272 +1879 6.04017 5.71061 +1880 6.03803 5.7085 +1881 6.03589 5.7064 +1882 6.03375 5.7043 +1883 6.03161 5.7022 +1884 6.02947 5.7001 +1885 6.02733 5.698 +1886 6.02519 5.6959 +1887 6.02306 5.69381 +1888 6.02092 5.69171 +1889 6.01879 5.68962 +1890 6.01665 5.68753 +1891 6.01452 5.68544 +1892 6.01239 5.68335 +1893 6.01026 5.68127 +1894 6.00812 5.67918 +1895 6.00599 5.6771 +1896 6.00387 5.67502 +1897 6.00174 5.67294 +1898 5.99961 5.67086 +1899 5.99748 5.66879 +1900 5.99536 5.66671 +1901 5.99323 5.66464 +1902 5.99111 5.66257 +1903 5.98898 5.6605 +1904 5.98686 5.65843 +1905 5.98474 5.65636 +1906 5.98262 5.65429 +1907 5.9805 5.65223 +1908 5.97838 5.65017 +1909 5.97626 5.64811 +1910 5.97415 5.64605 +1911 5.97203 5.64399 +1912 5.96991 5.64193 +1913 5.9678 5.63988 +1914 5.96568 5.63782 +1915 5.96357 5.63577 +1916 5.96146 5.63372 +1917 5.95935 5.63167 +1918 5.95724 5.62963 +1919 5.95513 5.62758 +1920 5.95302 5.62553 +1921 5.95091 5.62349 +1922 5.9488 5.62145 +1923 5.9467 5.61941 +1924 5.94459 5.61737 +1925 5.94249 5.61534 +1926 5.94038 5.6133 +1927 5.93828 5.61127 +1928 5.93618 5.60923 +1929 5.93407 5.6072 +1930 5.93197 5.60517 +1931 5.92987 5.60315 +1932 5.92777 5.60112 +1933 5.92568 5.5991 +1934 5.92358 5.59707 +1935 5.92148 5.59505 +1936 5.91939 5.59303 +1937 5.91729 5.59101 +1938 5.9152 5.58899 +1939 5.91311 5.58698 +1940 5.91101 5.58496 +1941 5.90892 5.58295 +1942 5.90683 5.58094 +1943 5.90474 5.57893 +1944 5.90265 5.57692 +1945 5.90057 5.57491 +1946 5.89848 5.57291 +1947 5.89639 5.5709 +1948 5.89431 5.5689 +1949 5.89222 5.5669 +1950 5.89014 5.5649 +1951 5.88806 5.5629 +1952 5.88597 5.5609 +1953 5.88389 5.55891 +1954 5.88181 5.55691 +1955 5.87973 5.55492 +1956 5.87765 5.55293 +1957 5.87558 5.55094 +1958 5.8735 5.54895 +1959 5.87142 5.54696 +1960 5.86935 5.54498 +1961 5.86727 5.54299 +1962 5.8652 5.54101 +1963 5.86313 5.53903 +1964 5.86105 5.53705 +1965 5.85898 5.53507 +1966 5.85691 5.5331 +1967 5.85484 5.53112 +1968 5.85277 5.52915 +1969 5.85071 5.52717 +1970 5.84864 5.5252 +1971 5.84657 5.52323 +1972 5.84451 5.52127 +1973 5.84244 5.5193 +1974 5.84038 5.51733 +1975 5.83832 5.51537 +1976 5.83626 5.51341 +1977 5.83419 5.51144 +1978 5.83213 5.50948 +1979 5.83008 5.50753 +1980 5.82802 5.50557 +1981 5.82596 5.50361 +1982 5.8239 5.50166 +1983 5.82185 5.49971 +1984 5.81979 5.49775 +1985 5.81774 5.4958 +1986 5.81568 5.49386 +1987 5.81363 5.49191 +1988 5.81158 5.48996 +1989 5.80953 5.48802 +1990 5.80748 5.48607 +1991 5.80543 5.48413 +1992 5.80338 5.48219 +1993 5.80133 5.48025 +1994 5.79929 5.47832 +1995 5.79724 5.47638 +1996 5.7952 5.47444 +1997 5.79315 5.47251 +1998 5.79111 5.47058 +1999 5.78907 5.46865 +2000 5.78703 5.46672 +2001 5.78499 5.46479 +2002 5.78295 5.46286 +2003 5.78091 5.46094 +2004 5.77887 5.45901 +2005 5.77683 5.45709 +2006 5.7748 5.45517 +2007 5.77276 5.45325 +2008 5.77072 5.45133 +2009 5.76869 5.44941 +2010 5.76666 5.4475 +2011 5.76463 5.44558 +2012 5.76259 5.44367 +2013 5.76056 5.44176 +2014 5.75853 5.43985 +2015 5.75651 5.43794 +2016 5.75448 5.43603 +2017 5.75245 5.43412 +2018 5.75042 5.43222 +2019 5.7484 5.43032 +2020 5.74637 5.42841 +2021 5.74435 5.42651 +2022 5.74233 5.42461 +2023 5.74031 5.42271 +2024 5.73829 5.42082 +2025 5.73627 5.41892 +2026 5.73425 5.41702 +2027 5.73223 5.41513 +2028 5.73021 5.41324 +2029 5.72819 5.41135 +2030 5.72618 5.40946 +2031 5.72416 5.40757 +2032 5.72215 5.40568 +2033 5.72013 5.4038 +2034 5.71812 5.40191 +2035 5.71611 5.40003 +2036 5.7141 5.39815 +2037 5.71209 5.39627 +2038 5.71008 5.39439 +2039 5.70807 5.39251 +2040 5.70606 5.39064 +2041 5.70406 5.38876 +2042 5.70205 5.38689 +2043 5.70005 5.38502 +2044 5.69804 5.38314 +2045 5.69604 5.38127 +2046 5.69404 5.37941 +2047 5.69204 5.37754 +2048 5.69004 5.37567 +2049 5.68804 5.37381 +2050 5.68604 5.37194 +2051 5.68404 5.37008 +2052 5.68204 5.36822 +2053 5.68005 5.36636 +2054 5.67805 5.3645 +2055 5.67606 5.36264 +2056 5.67406 5.36079 +2057 5.67207 5.35893 +2058 5.67008 5.35708 +2059 5.66809 5.35523 +2060 5.66609 5.35338 +2061 5.66411 5.35153 +2062 5.66212 5.34968 +2063 5.66013 5.34783 +2064 5.65814 5.34599 +2065 5.65616 5.34414 +2066 5.65417 5.3423 +2067 5.65219 5.34046 +2068 5.6502 5.33861 +2069 5.64822 5.33677 +2070 5.64624 5.33494 +2071 5.64426 5.3331 +2072 5.64228 5.33126 +2073 5.6403 5.32943 +2074 5.63832 5.32759 +2075 5.63634 5.32576 +2076 5.63437 5.32393 +2077 5.63239 5.3221 +2078 5.63042 5.32027 +2079 5.62844 5.31845 +2080 5.62647 5.31662 +2081 5.6245 5.31479 +2082 5.62252 5.31297 +2083 5.62055 5.31115 +2084 5.61858 5.30933 +2085 5.61661 5.30751 +2086 5.61465 5.30569 +2087 5.61268 5.30387 +2088 5.61071 5.30205 +2089 5.60875 5.30024 +2090 5.60678 5.29842 +2091 5.60482 5.29661 +2092 5.60286 5.2948 +2093 5.60089 5.29299 +2094 5.59893 5.29118 +2095 5.59697 5.28937 +2096 5.59501 5.28756 +2097 5.59306 5.28576 +2098 5.5911 5.28395 +2099 5.58914 5.28215 +2100 5.58718 5.28035 +2101 5.58523 5.27855 +2102 5.58327 5.27675 +2103 5.58132 5.27495 +2104 5.57937 5.27315 +2105 5.57742 5.27136 +2106 5.57547 5.26956 +2107 5.57352 5.26777 +2108 5.57157 5.26597 +2109 5.56962 5.26418 +2110 5.56767 5.26239 +2111 5.56572 5.2606 +2112 5.56378 5.25881 +2113 5.56183 5.25703 +2114 5.55989 5.25524 +2115 5.55795 5.25346 +2116 5.55601 5.25167 +2117 5.55406 5.24989 +2118 5.55212 5.24811 +2119 5.55018 5.24633 +2120 5.54824 5.24455 +2121 5.54631 5.24277 +2122 5.54437 5.241 +2123 5.54243 5.23922 +2124 5.5405 5.23745 +2125 5.53856 5.23567 +2126 5.53663 5.2339 +2127 5.5347 5.23213 +2128 5.53277 5.23036 +2129 5.53083 5.22859 +2130 5.5289 5.22683 +2131 5.52698 5.22506 +2132 5.52505 5.2233 +2133 5.52312 5.22153 +2134 5.52119 5.21977 +2135 5.51927 5.21801 +2136 5.51734 5.21625 +2137 5.51542 5.21449 +2138 5.51349 5.21273 +2139 5.51157 5.21097 +2140 5.50965 5.20921 +2141 5.50773 5.20746 +2142 5.50581 5.20571 +2143 5.50389 5.20395 +2144 5.50197 5.2022 +2145 5.50006 5.20045 +2146 5.49814 5.1987 +2147 5.49622 5.19695 +2148 5.49431 5.19521 +2149 5.4924 5.19346 +2150 5.49048 5.19171 +2151 5.48857 5.18997 +2152 5.48666 5.18823 +2153 5.48475 5.18649 +2154 5.48284 5.18474 +2155 5.48093 5.18301 +2156 5.47902 5.18127 +2157 5.47712 5.17953 +2158 5.47521 5.17779 +2159 5.47331 5.17606 +2160 5.4714 5.17432 +2161 5.4695 5.17259 +2162 5.4676 5.17086 +2163 5.46569 5.16913 +2164 5.46379 5.1674 +2165 5.46189 5.16567 +2166 5.45999 5.16394 +2167 5.4581 5.16221 +2168 5.4562 5.16049 +2169 5.4543 5.15876 +2170 5.45241 5.15704 +2171 5.45051 5.15532 +2172 5.44862 5.1536 +2173 5.44673 5.15188 +2174 5.44483 5.15016 +2175 5.44294 5.14844 +2176 5.44105 5.14672 +2177 5.43916 5.14501 +2178 5.43727 5.14329 +2179 5.43539 5.14158 +2180 5.4335 5.13986 +2181 5.43161 5.13815 +2182 5.42973 5.13644 +2183 5.42784 5.13473 +2184 5.42596 5.13302 +2185 5.42408 5.13132 +2186 5.4222 5.12961 +2187 5.42032 5.1279 +2188 5.41844 5.1262 +2189 5.41656 5.1245 +2190 5.41468 5.12279 +2191 5.4128 5.12109 +2192 5.41093 5.11939 +2193 5.40905 5.11769 +2194 5.40717 5.11599 +2195 5.4053 5.1143 +2196 5.40343 5.1126 +2197 5.40156 5.1109 +2198 5.39968 5.10921 +2199 5.39781 5.10752 +2200 5.39595 5.10582 +2201 5.39408 5.10413 +2202 5.39221 5.10244 +2203 5.39034 5.10075 +2204 5.38848 5.09907 +2205 5.38661 5.09738 +2206 5.38475 5.09569 +2207 5.38288 5.09401 +2208 5.38102 5.09232 +2209 5.37916 5.09064 +2210 5.3773 5.08896 +2211 5.37544 5.08728 +2212 5.37358 5.0856 +2213 5.37172 5.08392 +2214 5.36986 5.08224 +2215 5.36801 5.08056 +2216 5.36615 5.07888 +2217 5.3643 5.07721 +2218 5.36244 5.07554 +2219 5.36059 5.07386 +2220 5.35874 5.07219 +2221 5.35689 5.07052 +2222 5.35504 5.06885 +2223 5.35319 5.06718 +2224 5.35134 5.06551 +2225 5.34949 5.06384 +2226 5.34764 5.06218 +2227 5.3458 5.06051 +2228 5.34395 5.05885 +2229 5.34211 5.05718 +2230 5.34027 5.05552 +2231 5.33842 5.05386 +2232 5.33658 5.0522 +2233 5.33474 5.05054 +2234 5.3329 5.04888 +2235 5.33106 5.04722 +2236 5.32923 5.04556 +2237 5.32739 5.04391 +2238 5.32555 5.04225 +2239 5.32372 5.0406 +2240 5.32188 5.03895 +2241 5.32005 5.03729 +2242 5.31822 5.03564 +2243 5.31638 5.03399 +2244 5.31455 5.03234 +2245 5.31272 5.0307 +2246 5.31089 5.02905 +2247 5.30906 5.0274 +2248 5.30724 5.02576 +2249 5.30541 5.02411 +2250 5.30358 5.02247 +2251 5.30176 5.02083 +2252 5.29994 5.01918 +2253 5.29811 5.01754 +2254 5.29629 5.0159 +2255 5.29447 5.01426 +2256 5.29265 5.01263 +2257 5.29083 5.01099 +2258 5.28901 5.00935 +2259 5.28719 5.00772 +2260 5.28537 5.00608 +2261 5.28356 5.00445 +2262 5.28174 5.00282 +2263 5.27993 5.00118 +2264 5.27811 4.99955 +2265 5.2763 4.99792 +2266 5.27449 4.99629 +2267 5.27268 4.99467 +2268 5.27087 4.99304 +2269 5.26906 4.99141 +2270 5.26725 4.98979 +2271 5.26544 4.98816 +2272 5.26364 4.98654 +2273 5.26183 4.98492 +2274 5.26003 4.9833 +2275 5.25822 4.98167 +2276 5.25642 4.98005 +2277 5.25462 4.97844 +2278 5.25282 4.97682 +2279 5.25102 4.9752 +2280 5.24922 4.97358 +2281 5.24742 4.97197 +2282 5.24562 4.97035 +2283 5.24382 4.96874 +2284 5.24203 4.96713 +2285 5.24023 4.96551 +2286 5.23844 4.9639 +2287 5.23665 4.96229 +2288 5.23485 4.96068 +2289 5.23306 4.95907 +2290 5.23127 4.95747 +2291 5.22948 4.95586 +2292 5.22769 4.95425 +2293 5.2259 4.95265 +2294 5.22412 4.95104 +2295 5.22233 4.94944 +2296 5.22054 4.94784 +2297 5.21876 4.94624 +2298 5.21698 4.94464 +2299 5.21519 4.94304 +2300 5.21341 4.94144 +2301 5.21163 4.93984 +2302 5.20985 4.93824 +2303 5.20807 4.93664 +2304 5.20629 4.93505 +2305 5.20452 4.93345 +2306 5.20274 4.93186 +2307 5.20096 4.93027 +2308 5.19919 4.92867 +2309 5.19741 4.92708 +2310 5.19564 4.92549 +2311 5.19387 4.9239 +2312 5.1921 4.92231 +2313 5.19033 4.92072 +2314 5.18856 4.91914 +2315 5.18679 4.91755 +2316 5.18502 4.91596 +2317 5.18325 4.91438 +2318 5.18149 4.9128 +2319 5.17972 4.91121 +2320 5.17796 4.90963 +2321 5.1762 4.90805 +2322 5.17443 4.90647 +2323 5.17267 4.90489 +2324 5.17091 4.90331 +2325 5.16915 4.90173 +2326 5.16739 4.90015 +2327 5.16563 4.89858 +2328 5.16388 4.897 +2329 5.16212 4.89542 +2330 5.16036 4.89385 +2331 5.15861 4.89228 +2332 5.15686 4.8907 +2333 5.1551 4.88913 +2334 5.15335 4.88756 +2335 5.1516 4.88599 +2336 5.14985 4.88442 +2337 5.1481 4.88285 +2338 5.14635 4.88128 +2339 5.1446 4.87972 +2340 5.14286 4.87815 +2341 5.14111 4.87658 +2342 5.13937 4.87502 +2343 5.13762 4.87345 +2344 5.13588 4.87189 +2345 5.13414 4.87033 +2346 5.1324 4.86877 +2347 5.13066 4.86721 +2348 5.12892 4.86565 +2349 5.12718 4.86409 +2350 5.12544 4.86253 +2351 5.1237 4.86097 +2352 5.12197 4.85941 +2353 5.12023 4.85786 +2354 5.1185 4.8563 +2355 5.11676 4.85475 +2356 5.11503 4.85319 +2357 5.1133 4.85164 +2358 5.11157 4.85009 +2359 5.10984 4.84853 +2360 5.10811 4.84698 +2361 5.10638 4.84543 +2362 5.10466 4.84388 +2363 5.10293 4.84233 +2364 5.1012 4.84079 +2365 5.09948 4.83924 +2366 5.09776 4.83769 +2367 5.09603 4.83615 +2368 5.09431 4.8346 +2369 5.09259 4.83306 +2370 5.09087 4.83151 +2371 5.08915 4.82997 +2372 5.08743 4.82843 +2373 5.08572 4.82689 +2374 5.084 4.82535 +2375 5.08228 4.82381 +2376 5.08057 4.82227 +2377 5.07885 4.82073 +2378 5.07714 4.81919 +2379 5.07543 4.81765 +2380 5.07372 4.81612 +2381 5.07201 4.81458 +2382 5.0703 4.81305 +2383 5.06859 4.81151 +2384 5.06688 4.80998 +2385 5.06518 4.80845 +2386 5.06347 4.80691 +2387 5.06176 4.80538 +2388 5.06006 4.80385 +2389 5.05836 4.80232 +2390 5.05665 4.80079 +2391 5.05495 4.79927 +2392 5.05325 4.79774 +2393 5.05155 4.79621 +2394 5.04985 4.79468 +2395 5.04816 4.79316 +2396 5.04646 4.79163 +2397 5.04476 4.79011 +2398 5.04307 4.78859 +2399 5.04137 4.78706 +2400 5.03968 4.78554 +2401 5.03799 4.78402 +2402 5.0363 4.7825 +2403 5.0346 4.78098 +2404 5.03292 4.77946 +2405 5.03123 4.77794 +2406 5.02954 4.77642 +2407 5.02785 4.7749 +2408 5.02616 4.77339 +2409 5.02448 4.77187 +2410 5.02279 4.77036 +2411 5.02111 4.76884 +2412 5.01943 4.76733 +2413 5.01775 4.76581 +2414 5.01606 4.7643 +2415 5.01438 4.76279 +2416 5.01271 4.76128 +2417 5.01103 4.75977 +2418 5.00935 4.75826 +2419 5.00767 4.75675 +2420 5.006 4.75524 +2421 5.00432 4.75373 +2422 5.00265 4.75223 +2423 5.00097 4.75072 +2424 4.9993 4.74921 +2425 4.99763 4.74771 +2426 4.99596 4.7462 +2427 4.99429 4.7447 +2428 4.99262 4.7432 +2429 4.99095 4.74169 +2430 4.98929 4.74019 +2431 4.98762 4.73869 +2432 4.98596 4.73719 +2433 4.98429 4.73569 +2434 4.98263 4.73419 +2435 4.98097 4.73269 +2436 4.9793 4.7312 +2437 4.97764 4.7297 +2438 4.97598 4.7282 +2439 4.97432 4.72671 +2440 4.97267 4.72521 +2441 4.97101 4.72372 +2442 4.96935 4.72222 +2443 4.9677 4.72073 +2444 4.96604 4.71924 +2445 4.96439 4.71775 +2446 4.96273 4.71626 +2447 4.96108 4.71477 +2448 4.95943 4.71328 +2449 4.95778 4.71179 +2450 4.95613 4.7103 +2451 4.95448 4.70881 +2452 4.95283 4.70732 +2453 4.95119 4.70584 +2454 4.94954 4.70435 +2455 4.94789 4.70287 +2456 4.94625 4.70138 +2457 4.94461 4.6999 +2458 4.94296 4.69842 +2459 4.94132 4.69693 +2460 4.93968 4.69545 +2461 4.93804 4.69397 +2462 4.9364 4.69249 +2463 4.93476 4.69101 +2464 4.93312 4.68953 +2465 4.93149 4.68805 +2466 4.92985 4.68658 +2467 4.92822 4.6851 +2468 4.92658 4.68362 +2469 4.92495 4.68215 +2470 4.92332 4.68067 +2471 4.92168 4.6792 +2472 4.92005 4.67772 +2473 4.91842 4.67625 +2474 4.91679 4.67478 +2475 4.91517 4.67331 +2476 4.91354 4.67184 +2477 4.91191 4.67037 +2478 4.91029 4.6689 +2479 4.90866 4.66743 +2480 4.90704 4.66596 +2481 4.90541 4.66449 +2482 4.90379 4.66302 +2483 4.90217 4.66156 +2484 4.90055 4.66009 +2485 4.89893 4.65863 +2486 4.89731 4.65716 +2487 4.89569 4.6557 +2488 4.89407 4.65424 +2489 4.89246 4.65277 +2490 4.89084 4.65131 +2491 4.88922 4.64985 +2492 4.88761 4.64839 +2493 4.886 4.64693 +2494 4.88438 4.64547 +2495 4.88277 4.64401 +2496 4.88116 4.64255 +2497 4.87955 4.6411 +2498 4.87794 4.63964 +2499 4.87633 4.63818 +2500 4.87473 4.63673 +2501 4.87312 4.63528 +2502 4.87151 4.63382 +2503 4.86991 4.63237 +2504 4.86831 4.63092 +2505 4.8667 4.62946 +2506 4.8651 4.62801 +2507 4.8635 4.62656 +2508 4.8619 4.62511 +2509 4.8603 4.62366 +2510 4.8587 4.62221 +2511 4.8571 4.62077 +2512 4.8555 4.61932 +2513 4.8539 4.61787 +2514 4.85231 4.61643 +2515 4.85071 4.61498 +2516 4.84912 4.61353 +2517 4.84752 4.61209 +2518 4.84593 4.61065 +2519 4.84434 4.6092 +2520 4.84275 4.60776 +2521 4.84116 4.60632 +2522 4.83957 4.60488 +2523 4.83798 4.60344 +2524 4.83639 4.602 +2525 4.8348 4.60056 +2526 4.83322 4.59912 +2527 4.83163 4.59769 +2528 4.83005 4.59625 +2529 4.82846 4.59481 +2530 4.82688 4.59338 +2531 4.8253 4.59194 +2532 4.82372 4.59051 +2533 4.82214 4.58907 +2534 4.82056 4.58764 +2535 4.81898 4.58621 +2536 4.8174 4.58478 +2537 4.81582 4.58334 +2538 4.81425 4.58191 +2539 4.81267 4.58048 +2540 4.81109 4.57905 +2541 4.80952 4.57763 +2542 4.80795 4.5762 +2543 4.80637 4.57477 +2544 4.8048 4.57334 +2545 4.80323 4.57192 +2546 4.80166 4.57049 +2547 4.80009 4.56907 +2548 4.79852 4.56764 +2549 4.79696 4.56622 +2550 4.79539 4.5648 +2551 4.79382 4.56337 +2552 4.79226 4.56195 +2553 4.79069 4.56053 +2554 4.78913 4.55911 +2555 4.78756 4.55769 +2556 4.786 4.55627 +2557 4.78444 4.55485 +2558 4.78288 4.55344 +2559 4.78132 4.55202 +2560 4.77976 4.5506 +2561 4.7782 4.54919 +2562 4.77664 4.54777 +2563 4.77509 4.54636 +2564 4.77353 4.54494 +2565 4.77198 4.54353 +2566 4.77042 4.54212 +2567 4.76887 4.54071 +2568 4.76732 4.53929 +2569 4.76576 4.53788 +2570 4.76421 4.53647 +2571 4.76266 4.53506 +2572 4.76111 4.53366 +2573 4.75956 4.53225 +2574 4.75801 4.53084 +2575 4.75647 4.52943 +2576 4.75492 4.52803 +2577 4.75337 4.52662 +2578 4.75183 4.52522 +2579 4.75028 4.52381 +2580 4.74874 4.52241 +2581 4.7472 4.521 +2582 4.74566 4.5196 +2583 4.74412 4.5182 +2584 4.74257 4.5168 +2585 4.74104 4.5154 +2586 4.7395 4.514 +2587 4.73796 4.5126 +2588 4.73642 4.5112 +2589 4.73488 4.5098 +2590 4.73335 4.5084 +2591 4.73181 4.50701 +2592 4.73028 4.50561 +2593 4.72875 4.50422 +2594 4.72721 4.50282 +2595 4.72568 4.50143 +2596 4.72415 4.50003 +2597 4.72262 4.49864 +2598 4.72109 4.49725 +2599 4.71956 4.49586 +2600 4.71803 4.49446 +2601 4.7165 4.49307 +2602 4.71498 4.49168 +2603 4.71345 4.49029 +2604 4.71193 4.48891 +2605 4.7104 4.48752 +2606 4.70888 4.48613 +2607 4.70736 4.48474 +2608 4.70583 4.48336 +2609 4.70431 4.48197 +2610 4.70279 4.48059 +2611 4.70127 4.4792 +2612 4.69975 4.47782 +2613 4.69823 4.47644 +2614 4.69672 4.47505 +2615 4.6952 4.47367 +2616 4.69368 4.47229 +2617 4.69217 4.47091 +2618 4.69065 4.46953 +2619 4.68914 4.46815 +2620 4.68763 4.46677 +2621 4.68611 4.46539 +2622 4.6846 4.46402 +2623 4.68309 4.46264 +2624 4.68158 4.46126 +2625 4.68007 4.45989 +2626 4.67856 4.45851 +2627 4.67705 4.45714 +2628 4.67555 4.45576 +2629 4.67404 4.45439 +2630 4.67254 4.45302 +2631 4.67103 4.45165 +2632 4.66953 4.45027 +2633 4.66802 4.4489 +2634 4.66652 4.44753 +2635 4.66502 4.44616 +2636 4.66352 4.4448 +2637 4.66202 4.44343 +2638 4.66052 4.44206 +2639 4.65902 4.44069 +2640 4.65752 4.43933 +2641 4.65602 4.43796 +2642 4.65453 4.43659 +2643 4.65303 4.43523 +2644 4.65153 4.43387 +2645 4.65004 4.4325 +2646 4.64855 4.43114 +2647 4.64705 4.42978 +2648 4.64556 4.42842 +2649 4.64407 4.42706 +2650 4.64258 4.4257 +2651 4.64109 4.42434 +2652 4.6396 4.42298 +2653 4.63811 4.42162 +2654 4.63662 4.42026 +2655 4.63513 4.4189 +2656 4.63365 4.41755 +2657 4.63216 4.41619 +2658 4.63068 4.41484 +2659 4.62919 4.41348 +2660 4.62771 4.41213 +2661 4.62622 4.41077 +2662 4.62474 4.40942 +2663 4.62326 4.40807 +2664 4.62178 4.40672 +2665 4.6203 4.40536 +2666 4.61882 4.40401 +2667 4.61734 4.40266 +2668 4.61586 4.40132 +2669 4.61439 4.39997 +2670 4.61291 4.39862 +2671 4.61143 4.39727 +2672 4.60996 4.39592 +2673 4.60848 4.39458 +2674 4.60701 4.39323 +2675 4.60554 4.39189 +2676 4.60407 4.39054 +2677 4.60259 4.3892 +2678 4.60112 4.38786 +2679 4.59965 4.38651 +2680 4.59818 4.38517 +2681 4.59672 4.38383 +2682 4.59525 4.38249 +2683 4.59378 4.38115 +2684 4.59231 4.37981 +2685 4.59085 4.37847 +2686 4.58938 4.37713 +2687 4.58792 4.37579 +2688 4.58646 4.37446 +2689 4.58499 4.37312 +2690 4.58353 4.37178 +2691 4.58207 4.37045 +2692 4.58061 4.36911 +2693 4.57915 4.36778 +2694 4.57769 4.36645 +2695 4.57623 4.36511 +2696 4.57477 4.36378 +2697 4.57331 4.36245 +2698 4.57186 4.36112 +2699 4.5704 4.35979 +2700 4.56895 4.35846 +2701 4.56749 4.35713 +2702 4.56604 4.3558 +2703 4.56458 4.35447 +2704 4.56313 4.35314 +2705 4.56168 4.35181 +2706 4.56023 4.35049 +2707 4.55878 4.34916 +2708 4.55733 4.34784 +2709 4.55588 4.34651 +2710 4.55443 4.34519 +2711 4.55298 4.34387 +2712 4.55154 4.34254 +2713 4.55009 4.34122 +2714 4.54865 4.3399 +2715 4.5472 4.33858 +2716 4.54576 4.33726 +2717 4.54431 4.33594 +2718 4.54287 4.33462 +2719 4.54143 4.3333 +2720 4.53999 4.33198 +2721 4.53855 4.33066 +2722 4.53711 4.32935 +2723 4.53567 4.32803 +2724 4.53423 4.32671 +2725 4.53279 4.3254 +2726 4.53135 4.32408 +2727 4.52992 4.32277 +2728 4.52848 4.32146 +2729 4.52704 4.32014 +2730 4.52561 4.31883 +2731 4.52418 4.31752 +2732 4.52274 4.31621 +2733 4.52131 4.3149 +2734 4.51988 4.31359 +2735 4.51845 4.31228 +2736 4.51702 4.31097 +2737 4.51559 4.30966 +2738 4.51416 4.30836 +2739 4.51273 4.30705 +2740 4.5113 4.30574 +2741 4.50987 4.30444 +2742 4.50845 4.30313 +2743 4.50702 4.30183 +2744 4.5056 4.30052 +2745 4.50417 4.29922 +2746 4.50275 4.29792 +2747 4.50133 4.29661 +2748 4.4999 4.29531 +2749 4.49848 4.29401 +2750 4.49706 4.29271 +2751 4.49564 4.29141 +2752 4.49422 4.29011 +2753 4.4928 4.28881 +2754 4.49138 4.28751 +2755 4.48997 4.28622 +2756 4.48855 4.28492 +2757 4.48713 4.28362 +2758 4.48572 4.28233 +2759 4.4843 4.28103 +2760 4.48289 4.27974 +2761 4.48147 4.27844 +2762 4.48006 4.27715 +2763 4.47865 4.27586 +2764 4.47724 4.27457 +2765 4.47582 4.27327 +2766 4.47441 4.27198 +2767 4.473 4.27069 +2768 4.47159 4.2694 +2769 4.47019 4.26811 +2770 4.46878 4.26682 +2771 4.46737 4.26553 +2772 4.46596 4.26425 +2773 4.46456 4.26296 +2774 4.46315 4.26167 +2775 4.46175 4.26039 +2776 4.46034 4.2591 +2777 4.45894 4.25782 +2778 4.45754 4.25653 +2779 4.45614 4.25525 +2780 4.45474 4.25397 +2781 4.45333 4.25268 +2782 4.45193 4.2514 +2783 4.45054 4.25012 +2784 4.44914 4.24884 +2785 4.44774 4.24756 +2786 4.44634 4.24628 +2787 4.44494 4.245 +2788 4.44355 4.24372 +2789 4.44215 4.24244 +2790 4.44076 4.24117 +2791 4.43936 4.23989 +2792 4.43797 4.23861 +2793 4.43658 4.23734 +2794 4.43519 4.23606 +2795 4.43379 4.23479 +2796 4.4324 4.23352 +2797 4.43101 4.23224 +2798 4.42962 4.23097 +2799 4.42823 4.2297 +2800 4.42685 4.22843 +2801 4.42546 4.22715 +2802 4.42407 4.22588 +2803 4.42268 4.22461 +2804 4.4213 4.22334 +2805 4.41991 4.22208 +2806 4.41853 4.22081 +2807 4.41714 4.21954 +2808 4.41576 4.21827 +2809 4.41438 4.21701 +2810 4.413 4.21574 +2811 4.41161 4.21448 +2812 4.41023 4.21321 +2813 4.40885 4.21195 +2814 4.40747 4.21068 +2815 4.40609 4.20942 +2816 4.40472 4.20816 +2817 4.40334 4.20689 +2818 4.40196 4.20563 +2819 4.40059 4.20437 +2820 4.39921 4.20311 +2821 4.39783 4.20185 +2822 4.39646 4.20059 +2823 4.39509 4.19934 +2824 4.39371 4.19808 +2825 4.39234 4.19682 +2826 4.39097 4.19556 +2827 4.3896 4.19431 +2828 4.38823 4.19305 +2829 4.38686 4.1918 +2830 4.38549 4.19054 +2831 4.38412 4.18929 +2832 4.38275 4.18803 +2833 4.38138 4.18678 +2834 4.38001 4.18553 +2835 4.37865 4.18428 +2836 4.37728 4.18303 +2837 4.37592 4.18177 +2838 4.37455 4.18052 +2839 4.37319 4.17927 +2840 4.37182 4.17803 +2841 4.37046 4.17678 +2842 4.3691 4.17553 +2843 4.36774 4.17428 +2844 4.36638 4.17304 +2845 4.36502 4.17179 +2846 4.36366 4.17054 +2847 4.3623 4.1693 +2848 4.36094 4.16805 +2849 4.35958 4.16681 +2850 4.35822 4.16557 +2851 4.35687 4.16432 +2852 4.35551 4.16308 +2853 4.35416 4.16184 +2854 4.3528 4.1606 +2855 4.35145 4.15936 +2856 4.35009 4.15812 +2857 4.34874 4.15688 +2858 4.34739 4.15564 +2859 4.34604 4.1544 +2860 4.34469 4.15316 +2861 4.34334 4.15193 +2862 4.34199 4.15069 +2863 4.34064 4.14945 +2864 4.33929 4.14822 +2865 4.33794 4.14698 +2866 4.33659 4.14575 +2867 4.33524 4.14451 +2868 4.3339 4.14328 +2869 4.33255 4.14205 +2870 4.33121 4.14081 +2871 4.32986 4.13958 +2872 4.32852 4.13835 +2873 4.32717 4.13712 +2874 4.32583 4.13589 +2875 4.32449 4.13466 +2876 4.32315 4.13343 +2877 4.32181 4.1322 +2878 4.32047 4.13098 +2879 4.31913 4.12975 +2880 4.31779 4.12852 +2881 4.31645 4.1273 +2882 4.31511 4.12607 +2883 4.31377 4.12484 +2884 4.31244 4.12362 +2885 4.3111 4.1224 +2886 4.30976 4.12117 +2887 4.30843 4.11995 +2888 4.30709 4.11873 +2889 4.30576 4.11751 +2890 4.30443 4.11628 +2891 4.30309 4.11506 +2892 4.30176 4.11384 +2893 4.30043 4.11262 +2894 4.2991 4.1114 +2895 4.29777 4.11019 +2896 4.29644 4.10897 +2897 4.29511 4.10775 +2898 4.29378 4.10653 +2899 4.29245 4.10532 +2900 4.29113 4.1041 +2901 4.2898 4.10289 +2902 4.28847 4.10167 +2903 4.28715 4.10046 +2904 4.28582 4.09924 +2905 4.2845 4.09803 +2906 4.28317 4.09682 +2907 4.28185 4.0956 +2908 4.28053 4.09439 +2909 4.2792 4.09318 +2910 4.27788 4.09197 +2911 4.27656 4.09076 +2912 4.27524 4.08955 +2913 4.27392 4.08834 +2914 4.2726 4.08714 +2915 4.27128 4.08593 +2916 4.26996 4.08472 +2917 4.26865 4.08351 +2918 4.26733 4.08231 +2919 4.26601 4.0811 +2920 4.2647 4.0799 +2921 4.26338 4.07869 +2922 4.26207 4.07749 +2923 4.26075 4.07628 +2924 4.25944 4.07508 +2925 4.25812 4.07388 +2926 4.25681 4.07268 +2927 4.2555 4.07148 +2928 4.25419 4.07028 +2929 4.25288 4.06908 +2930 4.25157 4.06788 +2931 4.25026 4.06668 +2932 4.24895 4.06548 +2933 4.24764 4.06428 +2934 4.24633 4.06308 +2935 4.24502 4.06189 +2936 4.24372 4.06069 +2937 4.24241 4.05949 +2938 4.2411 4.0583 +2939 4.2398 4.0571 +2940 4.23849 4.05591 +2941 4.23719 4.05472 +2942 4.23589 4.05352 +2943 4.23458 4.05233 +2944 4.23328 4.05114 +2945 4.23198 4.04995 +2946 4.23068 4.04875 +2947 4.22938 4.04756 +2948 4.22808 4.04637 +2949 4.22678 4.04518 +2950 4.22548 4.04399 +2951 4.22418 4.04281 +2952 4.22288 4.04162 +2953 4.22158 4.04043 +2954 4.22029 4.03924 +2955 4.21899 4.03806 +2956 4.21769 4.03687 +2957 4.2164 4.03569 +2958 4.2151 4.0345 +2959 4.21381 4.03332 +2960 4.21252 4.03213 +2961 4.21122 4.03095 +2962 4.20993 4.02977 +2963 4.20864 4.02859 +2964 4.20735 4.0274 +2965 4.20605 4.02622 +2966 4.20476 4.02504 +2967 4.20347 4.02386 +2968 4.20218 4.02268 +2969 4.2009 4.0215 +2970 4.19961 4.02033 +2971 4.19832 4.01915 +2972 4.19703 4.01797 +2973 4.19575 4.01679 +2974 4.19446 4.01562 +2975 4.19317 4.01444 +2976 4.19189 4.01327 +2977 4.1906 4.01209 +2978 4.18932 4.01092 +2979 4.18804 4.00974 +2980 4.18675 4.00857 +2981 4.18547 4.0074 +2982 4.18419 4.00623 +2983 4.18291 4.00505 +2984 4.18163 4.00388 +2985 4.18035 4.00271 +2986 4.17907 4.00154 +2987 4.17779 4.00037 +2988 4.17651 3.9992 +2989 4.17523 3.99804 +2990 4.17395 3.99687 +2991 4.17268 3.9957 +2992 4.1714 3.99453 +2993 4.17012 3.99337 +2994 4.16885 3.9922 +2995 4.16757 3.99104 +2996 4.1663 3.98987 +2997 4.16503 3.98871 +2998 4.16375 3.98754 +2999 4.16248 3.98638 +3000 4.16121 3.98522 +3001 4.15994 3.98406 +3002 4.15866 3.98289 +3003 4.15739 3.98173 +3004 4.15612 3.98057 +3005 4.15485 3.97941 +3006 4.15358 3.97825 +3007 4.15232 3.97709 +3008 4.15105 3.97593 +3009 4.14978 3.97478 +3010 4.14851 3.97362 +3011 4.14725 3.97246 +3012 4.14598 3.97131 +3013 4.14471 3.97015 +3014 4.14345 3.96899 +3015 4.14218 3.96784 +3016 4.14092 3.96668 +3017 4.13966 3.96553 +3018 4.13839 3.96438 +3019 4.13713 3.96322 +3020 4.13587 3.96207 +3021 4.13461 3.96092 +3022 4.13335 3.95977 +3023 4.13209 3.95862 +3024 4.13083 3.95747 +3025 4.12957 3.95632 +3026 4.12831 3.95517 +3027 4.12705 3.95402 +3028 4.12579 3.95287 +3029 4.12453 3.95172 +3030 4.12328 3.95058 +3031 4.12202 3.94943 +3032 4.12077 3.94828 +3033 4.11951 3.94714 +3034 4.11826 3.94599 +3035 4.117 3.94485 +3036 4.11575 3.9437 +3037 4.11449 3.94256 +3038 4.11324 3.94142 +3039 4.11199 3.94027 +3040 4.11074 3.93913 +3041 4.10949 3.93799 +3042 4.10824 3.93685 +3043 4.10698 3.93571 +3044 4.10574 3.93457 +3045 4.10449 3.93343 +3046 4.10324 3.93229 +3047 4.10199 3.93115 +3048 4.10074 3.93001 +3049 4.09949 3.92887 +3050 4.09825 3.92774 +3051 4.097 3.9266 +3052 4.09575 3.92546 +3053 4.09451 3.92433 +3054 4.09326 3.92319 +3055 4.09202 3.92206 +3056 4.09078 3.92092 +3057 4.08953 3.91979 +3058 4.08829 3.91866 +3059 4.08705 3.91753 +3060 4.08581 3.91639 +3061 4.08456 3.91526 +3062 4.08332 3.91413 +3063 4.08208 3.913 +3064 4.08084 3.91187 +3065 4.0796 3.91074 +3066 4.07836 3.90961 +3067 4.07713 3.90848 +3068 4.07589 3.90736 +3069 4.07465 3.90623 +3070 4.07341 3.9051 +3071 4.07218 3.90397 +3072 4.07094 3.90285 +3073 4.06971 3.90172 +3074 4.06847 3.9006 +3075 4.06724 3.89947 +3076 4.066 3.89835 +3077 4.06477 3.89723 +3078 4.06354 3.8961 +3079 4.0623 3.89498 +3080 4.06107 3.89386 +3081 4.05984 3.89274 +3082 4.05861 3.89162 +3083 4.05738 3.89049 +3084 4.05615 3.88937 +3085 4.05492 3.88826 +3086 4.05369 3.88714 +3087 4.05246 3.88602 +3088 4.05123 3.8849 +3089 4.05 3.88378 +3090 4.04878 3.88266 +3091 4.04755 3.88155 +3092 4.04632 3.88043 +3093 4.0451 3.87932 +3094 4.04387 3.8782 +3095 4.04265 3.87709 +3096 4.04142 3.87597 +3097 4.0402 3.87486 +3098 4.03897 3.87375 +3099 4.03775 3.87263 +3100 4.03653 3.87152 +3101 4.03531 3.87041 +3102 4.03408 3.8693 +3103 4.03286 3.86819 +3104 4.03164 3.86708 +3105 4.03042 3.86597 +3106 4.0292 3.86486 +3107 4.02798 3.86375 +3108 4.02676 3.86264 +3109 4.02554 3.86153 +3110 4.02433 3.86043 +3111 4.02311 3.85932 +3112 4.02189 3.85821 +3113 4.02068 3.85711 +3114 4.01946 3.856 +3115 4.01824 3.8549 +3116 4.01703 3.85379 +3117 4.01581 3.85269 +3118 4.0146 3.85159 +3119 4.01339 3.85048 +3120 4.01217 3.84938 +3121 4.01096 3.84828 +3122 4.00975 3.84718 +3123 4.00853 3.84608 +3124 4.00732 3.84498 +3125 4.00611 3.84388 +3126 4.0049 3.84278 +3127 4.00369 3.84168 +3128 4.00248 3.84058 +3129 4.00127 3.83948 +3130 4.00006 3.83839 +3131 3.99886 3.83729 +3132 3.99765 3.83619 +3133 3.99644 3.8351 +3134 3.99523 3.834 +3135 3.99403 3.83291 +3136 3.99282 3.83181 +3137 3.99161 3.83072 +3138 3.99041 3.82962 +3139 3.9892 3.82853 +3140 3.988 3.82744 +3141 3.9868 3.82635 +3142 3.98559 3.82526 +3143 3.98439 3.82416 +3144 3.98319 3.82307 +3145 3.98199 3.82198 +3146 3.98078 3.82089 +3147 3.97958 3.81981 +3148 3.97838 3.81872 +3149 3.97718 3.81763 +3150 3.97598 3.81654 +3151 3.97478 3.81545 +3152 3.97358 3.81437 +3153 3.97239 3.81328 +3154 3.97119 3.81219 +3155 3.96999 3.81111 +3156 3.96879 3.81002 +3157 3.9676 3.80894 +3158 3.9664 3.80786 +3159 3.9652 3.80677 +3160 3.96401 3.80569 +3161 3.96281 3.80461 +3162 3.96162 3.80353 +3163 3.96042 3.80244 +3164 3.95923 3.80136 +3165 3.95804 3.80028 +3166 3.95684 3.7992 +3167 3.95565 3.79812 +3168 3.95446 3.79704 +3169 3.95327 3.79597 +3170 3.95208 3.79489 +3171 3.95089 3.79381 +3172 3.9497 3.79273 +3173 3.94851 3.79166 +3174 3.94732 3.79058 +3175 3.94613 3.7895 +3176 3.94494 3.78843 +3177 3.94375 3.78735 +3178 3.94257 3.78628 +3179 3.94138 3.78521 +3180 3.94019 3.78413 +3181 3.939 3.78306 +3182 3.93782 3.78199 +3183 3.93663 3.78091 +3184 3.93545 3.77984 +3185 3.93426 3.77877 +3186 3.93308 3.7777 +3187 3.9319 3.77663 +3188 3.93071 3.77556 +3189 3.92953 3.77449 +3190 3.92835 3.77342 +3191 3.92717 3.77236 +3192 3.92598 3.77129 +3193 3.9248 3.77022 +3194 3.92362 3.76915 +3195 3.92244 3.76809 +3196 3.92126 3.76702 +3197 3.92008 3.76596 +3198 3.9189 3.76489 +3199 3.91772 3.76383 +3200 3.91655 3.76276 +3201 3.91537 3.7617 +3202 3.91419 3.76064 +3203 3.91301 3.75957 +3204 3.91184 3.75851 +3205 3.91066 3.75745 +3206 3.90948 3.75639 +3207 3.90831 3.75533 +3208 3.90713 3.75427 +3209 3.90596 3.75321 +3210 3.90479 3.75215 +3211 3.90361 3.75109 +3212 3.90244 3.75003 +3213 3.90127 3.74898 +3214 3.90009 3.74792 +3215 3.89892 3.74686 +3216 3.89775 3.7458 +3217 3.89658 3.74475 +3218 3.89541 3.74369 +3219 3.89424 3.74264 +3220 3.89307 3.74158 +3221 3.8919 3.74053 +3222 3.89073 3.73948 +3223 3.88956 3.73842 +3224 3.88839 3.73737 +3225 3.88722 3.73632 +3226 3.88605 3.73527 +3227 3.88489 3.73421 +3228 3.88372 3.73316 +3229 3.88255 3.73211 +3230 3.88139 3.73106 +3231 3.88022 3.73001 +3232 3.87906 3.72896 +3233 3.87789 3.72792 +3234 3.87673 3.72687 +3235 3.87556 3.72582 +3236 3.8744 3.72477 +3237 3.87324 3.72373 +3238 3.87208 3.72268 +3239 3.87091 3.72163 +3240 3.86975 3.72059 +3241 3.86859 3.71954 +3242 3.86743 3.7185 +3243 3.86627 3.71746 +3244 3.86511 3.71641 +3245 3.86395 3.71537 +3246 3.86279 3.71433 +3247 3.86163 3.71328 +3248 3.86047 3.71224 +3249 3.85931 3.7112 +3250 3.85815 3.71016 +3251 3.85699 3.70912 +3252 3.85584 3.70808 +3253 3.85468 3.70704 +3254 3.85352 3.706 +3255 3.85237 3.70496 +3256 3.85121 3.70393 +3257 3.85006 3.70289 +3258 3.8489 3.70185 +3259 3.84775 3.70081 +3260 3.84659 3.69978 +3261 3.84544 3.69874 +3262 3.84429 3.69771 +3263 3.84313 3.69667 +3264 3.84198 3.69564 +3265 3.84083 3.6946 +3266 3.83968 3.69357 +3267 3.83853 3.69254 +3268 3.83737 3.69151 +3269 3.83622 3.69047 +3270 3.83507 3.68944 +3271 3.83392 3.68841 +3272 3.83277 3.68738 +3273 3.83163 3.68635 +3274 3.83048 3.68532 +3275 3.82933 3.68429 +3276 3.82818 3.68326 +3277 3.82703 3.68223 +3278 3.82589 3.68121 +3279 3.82474 3.68018 +3280 3.82359 3.67915 +3281 3.82245 3.67812 +3282 3.8213 3.6771 +3283 3.82015 3.67607 +3284 3.81901 3.67505 +3285 3.81786 3.67402 +3286 3.81672 3.673 +3287 3.81558 3.67197 +3288 3.81443 3.67095 +3289 3.81329 3.66993 +3290 3.81215 3.6689 +3291 3.81101 3.66788 +3292 3.80986 3.66686 +3293 3.80872 3.66584 +3294 3.80758 3.66482 +3295 3.80644 3.6638 +3296 3.8053 3.66278 +3297 3.80416 3.66176 +3298 3.80302 3.66074 +3299 3.80188 3.65972 +3300 3.80074 3.6587 +3301 3.7996 3.65769 +3302 3.79846 3.65667 +3303 3.79733 3.65565 +3304 3.79619 3.65464 +3305 3.79505 3.65362 +3306 3.79391 3.6526 +3307 3.79278 3.65159 +3308 3.79164 3.65057 +3309 3.79051 3.64956 +3310 3.78937 3.64855 +3311 3.78824 3.64753 +3312 3.7871 3.64652 +3313 3.78597 3.64551 +3314 3.78483 3.6445 +3315 3.7837 3.64348 +3316 3.78257 3.64247 +3317 3.78143 3.64146 +3318 3.7803 3.64045 +3319 3.77917 3.63944 +3320 3.77804 3.63843 +3321 3.7769 3.63743 +3322 3.77577 3.63642 +3323 3.77464 3.63541 +3324 3.77351 3.6344 +3325 3.77238 3.63339 +3326 3.77125 3.63239 +3327 3.77012 3.63138 +3328 3.76899 3.63038 +3329 3.76787 3.62937 +3330 3.76674 3.62837 +3331 3.76561 3.62736 +3332 3.76448 3.62636 +3333 3.76336 3.62535 +3334 3.76223 3.62435 +3335 3.7611 3.62335 +3336 3.75998 3.62235 +3337 3.75885 3.62134 +3338 3.75772 3.62034 +3339 3.7566 3.61934 +3340 3.75548 3.61834 +3341 3.75435 3.61734 +3342 3.75323 3.61634 +3343 3.7521 3.61534 +3344 3.75098 3.61434 +3345 3.74986 3.61335 +3346 3.74873 3.61235 +3347 3.74761 3.61135 +3348 3.74649 3.61035 +3349 3.74537 3.60936 +3350 3.74425 3.60836 +3351 3.74313 3.60737 +3352 3.74201 3.60637 +3353 3.74089 3.60538 +3354 3.73977 3.60438 +3355 3.73865 3.60339 +3356 3.73753 3.60239 +3357 3.73641 3.6014 +3358 3.73529 3.60041 +3359 3.73417 3.59942 +3360 3.73305 3.59842 +3361 3.73194 3.59743 +3362 3.73082 3.59644 +3363 3.7297 3.59545 +3364 3.72859 3.59446 +3365 3.72747 3.59347 +3366 3.72635 3.59248 +3367 3.72524 3.59149 +3368 3.72412 3.59051 +3369 3.72301 3.58952 +3370 3.72189 3.58853 +3371 3.72078 3.58754 +3372 3.71967 3.58656 +3373 3.71855 3.58557 +3374 3.71744 3.58459 +3375 3.71633 3.5836 +3376 3.71521 3.58262 +3377 3.7141 3.58163 +3378 3.71299 3.58065 +3379 3.71188 3.57966 +3380 3.71077 3.57868 +3381 3.70966 3.5777 +3382 3.70854 3.57672 +3383 3.70743 3.57573 +3384 3.70632 3.57475 +3385 3.70522 3.57377 +3386 3.70411 3.57279 +3387 3.703 3.57181 +3388 3.70189 3.57083 +3389 3.70078 3.56985 +3390 3.69967 3.56887 +3391 3.69856 3.56789 +3392 3.69746 3.56692 +3393 3.69635 3.56594 +3394 3.69524 3.56496 +3395 3.69414 3.56398 +3396 3.69303 3.56301 +3397 3.69193 3.56203 +3398 3.69082 3.56106 +3399 3.68972 3.56008 +3400 3.68861 3.55911 +3401 3.68751 3.55813 +3402 3.6864 3.55716 +3403 3.6853 3.55619 +3404 3.6842 3.55521 +3405 3.68309 3.55424 +3406 3.68199 3.55327 +3407 3.68089 3.5523 +3408 3.67978 3.55133 +3409 3.67868 3.55036 +3410 3.67758 3.54938 +3411 3.67648 3.54841 +3412 3.67538 3.54745 +3413 3.67428 3.54648 +3414 3.67318 3.54551 +3415 3.67208 3.54454 +3416 3.67098 3.54357 +3417 3.66988 3.5426 +3418 3.66878 3.54164 +3419 3.66768 3.54067 +3420 3.66658 3.5397 +3421 3.66549 3.53874 +3422 3.66439 3.53777 +3423 3.66329 3.53681 +3424 3.66219 3.53584 +3425 3.6611 3.53488 +3426 3.66 3.53392 +3427 3.6589 3.53295 +3428 3.65781 3.53199 +3429 3.65671 3.53103 +3430 3.65562 3.53007 +3431 3.65452 3.5291 +3432 3.65343 3.52814 +3433 3.65233 3.52718 +3434 3.65124 3.52622 +3435 3.65014 3.52526 +3436 3.64905 3.5243 +3437 3.64796 3.52334 +3438 3.64686 3.52238 +3439 3.64577 3.52143 +3440 3.64468 3.52047 +3441 3.64359 3.51951 +3442 3.6425 3.51855 +3443 3.6414 3.5176 +3444 3.64031 3.51664 +3445 3.63922 3.51569 +3446 3.63813 3.51473 +3447 3.63704 3.51378 +3448 3.63595 3.51282 +3449 3.63486 3.51187 +3450 3.63377 3.51091 +3451 3.63268 3.50996 +3452 3.6316 3.50901 +3453 3.63051 3.50805 +3454 3.62942 3.5071 +3455 3.62833 3.50615 +3456 3.62724 3.5052 +3457 3.62616 3.50425 +3458 3.62507 3.5033 +3459 3.62398 3.50235 +3460 3.6229 3.5014 +3461 3.62181 3.50045 +3462 3.62072 3.4995 +3463 3.61964 3.49855 +3464 3.61855 3.4976 +3465 3.61747 3.49666 +3466 3.61638 3.49571 +3467 3.6153 3.49476 +3468 3.61422 3.49382 +3469 3.61313 3.49287 +3470 3.61205 3.49193 +3471 3.61096 3.49098 +3472 3.60988 3.49004 +3473 3.6088 3.48909 +3474 3.60772 3.48815 +3475 3.60663 3.4872 +3476 3.60555 3.48626 +3477 3.60447 3.48532 +3478 3.60339 3.48438 +3479 3.60231 3.48343 +3480 3.60123 3.48249 +3481 3.60015 3.48155 +3482 3.59907 3.48061 +3483 3.59799 3.47967 +3484 3.59691 3.47873 +3485 3.59583 3.47779 +3486 3.59475 3.47685 +3487 3.59367 3.47591 +3488 3.59259 3.47498 +3489 3.59152 3.47404 +3490 3.59044 3.4731 +3491 3.58936 3.47216 +3492 3.58828 3.47123 +3493 3.58721 3.47029 +3494 3.58613 3.46936 +3495 3.58505 3.46842 +3496 3.58398 3.46749 +3497 3.5829 3.46655 +3498 3.58182 3.46562 +3499 3.58075 3.46468 +3500 3.57967 3.46375 +3501 3.5786 3.46282 +3502 3.57752 3.46188 +3503 3.57645 3.46095 +3504 3.57538 3.46002 +3505 3.5743 3.45909 +3506 3.57323 3.45816 +3507 3.57216 3.45723 +3508 3.57108 3.4563 +3509 3.57001 3.45537 +3510 3.56894 3.45444 +3511 3.56787 3.45351 +3512 3.56679 3.45258 +3513 3.56572 3.45165 +3514 3.56465 3.45073 +3515 3.56358 3.4498 +3516 3.56251 3.44887 +3517 3.56144 3.44794 +3518 3.56037 3.44702 +3519 3.5593 3.44609 +3520 3.55823 3.44517 +3521 3.55716 3.44424 +3522 3.55609 3.44332 +3523 3.55502 3.44239 +3524 3.55395 3.44147 +3525 3.55288 3.44055 +3526 3.55182 3.43962 +3527 3.55075 3.4387 +3528 3.54968 3.43778 +3529 3.54861 3.43686 +3530 3.54755 3.43594 +3531 3.54648 3.43502 +3532 3.54541 3.43409 +3533 3.54435 3.43317 +3534 3.54328 3.43225 +3535 3.54221 3.43134 +3536 3.54115 3.43042 +3537 3.54008 3.4295 +3538 3.53902 3.42858 +3539 3.53795 3.42766 +3540 3.53689 3.42674 +3541 3.53582 3.42583 +3542 3.53476 3.42491 +3543 3.5337 3.42399 +3544 3.53263 3.42308 +3545 3.53157 3.42216 +3546 3.53051 3.42125 +3547 3.52944 3.42033 +3548 3.52838 3.41942 +3549 3.52732 3.41851 +3550 3.52626 3.41759 +3551 3.52519 3.41668 +3552 3.52413 3.41577 +3553 3.52307 3.41485 +3554 3.52201 3.41394 +3555 3.52095 3.41303 +3556 3.51989 3.41212 +3557 3.51883 3.41121 +3558 3.51777 3.4103 +3559 3.51671 3.40939 +3560 3.51565 3.40848 +3561 3.51459 3.40757 +3562 3.51353 3.40666 +3563 3.51247 3.40575 +3564 3.51141 3.40484 +3565 3.51036 3.40394 +3566 3.5093 3.40303 +3567 3.50824 3.40212 +3568 3.50718 3.40122 +3569 3.50612 3.40031 +3570 3.50507 3.3994 +3571 3.50401 3.3985 +3572 3.50295 3.39759 +3573 3.5019 3.39669 +3574 3.50084 3.39578 +3575 3.49979 3.39488 +3576 3.49873 3.39398 +3577 3.49767 3.39307 +3578 3.49662 3.39217 +3579 3.49556 3.39127 +3580 3.49451 3.39037 +3581 3.49346 3.38947 +3582 3.4924 3.38857 +3583 3.49135 3.38766 +3584 3.49029 3.38676 +3585 3.48924 3.38586 +3586 3.48819 3.38496 +3587 3.48713 3.38407 +3588 3.48608 3.38317 +3589 3.48503 3.38227 +3590 3.48398 3.38137 +3591 3.48292 3.38047 +3592 3.48187 3.37958 +3593 3.48082 3.37868 +3594 3.47977 3.37778 +3595 3.47872 3.37689 +3596 3.47767 3.37599 +3597 3.47662 3.37509 +3598 3.47556 3.3742 +3599 3.47451 3.37331 +3600 3.47346 3.37241 +3601 3.47241 3.37152 +3602 3.47136 3.37062 +3603 3.47032 3.36973 +3604 3.46927 3.36884 +3605 3.46822 3.36795 +3606 3.46717 3.36705 +3607 3.46612 3.36616 +3608 3.46507 3.36527 +3609 3.46402 3.36438 +3610 3.46298 3.36349 +3611 3.46193 3.3626 +3612 3.46088 3.36171 +3613 3.45983 3.36082 +3614 3.45879 3.35993 +3615 3.45774 3.35904 +3616 3.45669 3.35816 +3617 3.45565 3.35727 +3618 3.4546 3.35638 +3619 3.45356 3.35549 +3620 3.45251 3.35461 +3621 3.45146 3.35372 +3622 3.45042 3.35283 +3623 3.44937 3.35195 +3624 3.44833 3.35106 +3625 3.44729 3.35018 +3626 3.44624 3.3493 +3627 3.4452 3.34841 +3628 3.44415 3.34753 +3629 3.44311 3.34664 +3630 3.44207 3.34576 +3631 3.44102 3.34488 +3632 3.43998 3.344 +3633 3.43894 3.34312 +3634 3.43789 3.34223 +3635 3.43685 3.34135 +3636 3.43581 3.34047 +3637 3.43477 3.33959 +3638 3.43373 3.33871 +3639 3.43268 3.33783 +3640 3.43164 3.33695 +3641 3.4306 3.33607 +3642 3.42956 3.3352 +3643 3.42852 3.33432 +3644 3.42748 3.33344 +3645 3.42644 3.33256 +3646 3.4254 3.33169 +3647 3.42436 3.33081 +3648 3.42332 3.32993 +3649 3.42228 3.32906 +3650 3.42124 3.32818 +3651 3.4202 3.32731 +3652 3.41916 3.32643 +3653 3.41813 3.32556 +3654 3.41709 3.32468 +3655 3.41605 3.32381 +3656 3.41501 3.32294 +3657 3.41397 3.32206 +3658 3.41294 3.32119 +3659 3.4119 3.32032 +3660 3.41086 3.31945 +3661 3.40982 3.31858 +3662 3.40879 3.31771 +3663 3.40775 3.31684 +3664 3.40671 3.31597 +3665 3.40568 3.3151 +3666 3.40464 3.31423 +3667 3.40361 3.31336 +3668 3.40257 3.31249 +3669 3.40154 3.31162 +3670 3.4005 3.31075 +3671 3.39947 3.30988 +3672 3.39843 3.30902 +3673 3.3974 3.30815 +3674 3.39636 3.30728 +3675 3.39533 3.30642 +3676 3.39429 3.30555 +3677 3.39326 3.30469 +3678 3.39223 3.30382 +3679 3.39119 3.30296 +3680 3.39016 3.30209 +3681 3.38913 3.30123 +3682 3.38809 3.30036 +3683 3.38706 3.2995 +3684 3.38603 3.29864 +3685 3.385 3.29777 +3686 3.38396 3.29691 +3687 3.38293 3.29605 +3688 3.3819 3.29519 +3689 3.38087 3.29433 +3690 3.37984 3.29347 +3691 3.37881 3.29261 +3692 3.37778 3.29175 +3693 3.37675 3.29089 +3694 3.37571 3.29003 +3695 3.37468 3.28917 +3696 3.37365 3.28831 +3697 3.37262 3.28745 +3698 3.37159 3.28659 +3699 3.37056 3.28574 +3700 3.36954 3.28488 +3701 3.36851 3.28402 +3702 3.36748 3.28317 +3703 3.36645 3.28231 +3704 3.36542 3.28145 +3705 3.36439 3.2806 +3706 3.36336 3.27974 +3707 3.36233 3.27889 +3708 3.36131 3.27803 +3709 3.36028 3.27718 +3710 3.35925 3.27633 +3711 3.35822 3.27547 +3712 3.3572 3.27462 +3713 3.35617 3.27377 +3714 3.35514 3.27292 +3715 3.35412 3.27206 +3716 3.35309 3.27121 +3717 3.35206 3.27036 +3718 3.35104 3.26951 +3719 3.35001 3.26866 +3720 3.34899 3.26781 +3721 3.34796 3.26696 +3722 3.34693 3.26611 +3723 3.34591 3.26526 +3724 3.34488 3.26441 +3725 3.34386 3.26357 +3726 3.34283 3.26272 +3727 3.34181 3.26187 +3728 3.34079 3.26102 +3729 3.33976 3.26018 +3730 3.33874 3.25933 diff --git a/src/test/modelling/input/time.fdef b/src/test/modelling/input/time.fdef new file mode 100644 index 0000000000..4339e496a5 --- /dev/null +++ b/src/test/modelling/input/time.fdef @@ -0,0 +1,9 @@ +1 30 +1 15 +1 5 +4 10 +4 30 +4 60 +3 120 +1 119.8 +9 300 diff --git a/src/test/modelling/input/triple_plasma.if b/src/test/modelling/input/triple_plasma.if new file mode 100644 index 0000000000..995e3088b1 --- /dev/null +++ b/src/test/modelling/input/triple_plasma.if @@ -0,0 +1,4 @@ +3 +0.5 0.999947 0.0999947 +7573.8 0.450739 0.0450739 +30292.2 0.0412893 0.00412893 diff --git a/src/test/modelling/test.mk b/src/test/modelling/test.mk new file mode 100644 index 0000000000..6043f3279d --- /dev/null +++ b/src/test/modelling/test.mk @@ -0,0 +1,12 @@ +# +# +dir := test/modelling + +$(dir)_TEST_SOURCES := \ + test_modelling.cxx \ + test_ParametricDiscretisedDensity.cxx + +run_$(dir)/test_modelling: $(DEST)$(dir)/test_modelling PHONY_TARGET + $< test/modelling/input/ + +include $(WORKSPACE)/test.mk diff --git a/src/test/modelling/test_ParametricDiscretisedDensity.cxx b/src/test/modelling/test_ParametricDiscretisedDensity.cxx new file mode 100644 index 0000000000..0a66edb255 --- /dev/null +++ b/src/test/modelling/test_ParametricDiscretisedDensity.cxx @@ -0,0 +1,246 @@ +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + +\file +\ingroup test + +\brief testing stir::ParametricDiscretisedDensity class + +\author T. Borgeaud +\author Charalampos Tsoumpas + + + +*/ + +#include +#include "stir/RunTests.h" +#include "stir/IndexRange2D.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/stream.h" +#include "stir/Succeeded.h" +#include +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/Scanner.h" +#include +#include +#include + +#include +#include +//----------- +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/is_null_ptr.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::ifstream; +using std::istream; +using std::setw; +#endif + +START_NAMESPACE_STIR + +class ParametricDiscretisedDensityTests : public RunTests +{ +public: + ParametricDiscretisedDensityTests() + {} + void run_tests(); + //private: +}; + +void ParametricDiscretisedDensityTests::run_tests() +{ + set_tolerance(0.000000000000001); + + const unsigned num_params = ParametricVoxelsOnCartesianGrid::get_num_params(); + + //! Setup the scanner details first + const Scanner::Type test_scanner=Scanner::E966; + const shared_ptr scanner_sptr(new Scanner(test_scanner)); + VectorWithOffset num_axial_pos_per_segment; num_axial_pos_per_segment.resize(0,0); num_axial_pos_per_segment[0]=48; + VectorWithOffset min_ring_diff; min_ring_diff.resize(0,0); min_ring_diff[0]=0; + VectorWithOffset max_ring_diff; max_ring_diff.resize(0,0); max_ring_diff[0]=0; + const int num_views=144; const int num_tangential_poss=144; + ProjDataInfoCylindricalNoArcCorr proj_data_info(scanner_sptr,num_axial_pos_per_segment,min_ring_diff,max_ring_diff,num_views,num_tangential_poss); + //! Setup some of the image details + const CartesianCoordinate3D< float > origin (0.F,0.F,0.F); + const CartesianCoordinate3D grid_spacing (1.F,1.F,1.F); + const float zoom=1.F; + { + cerr << "Testing ParametricDiscretisedDensity class for one voxel..." << endl; + const CartesianCoordinate3D sizes (1,1,1); + + const shared_ptr parametric_image_sptr + ( + new ParametricVoxelsOnCartesianGrid( + ParametricVoxelsOnCartesianGridBaseType(proj_data_info, + zoom,grid_spacing,sizes))); + ParametricVoxelsOnCartesianGrid & parametric_image = *parametric_image_sptr; + parametric_image[0][0][0][1]=1.F; parametric_image[0][0][0][2]=2.F; + + check_if_equal(parametric_image[0][0][0][1],1.F,"check ParametricVoxelsOnCartesianGrid class implementation"); + check_if_equal(parametric_image[0][0][0][2],2.F,"check ParametricVoxelsOnCartesianGrid class implementation"); + } + + { + // Test of two frame images, read voxel + cerr << "Testing ParametricDiscretisedDensity class for more voxels: 63x128x128..." << endl; + + const CartesianCoordinate3D sizes (63,128,128); + + //const shared_ptr parametric_image_sptr = + // new ParametricVoxelsOnCartesianGrid(ParametricVoxelsOnCartesianGridBaseType(proj_data_info,zoom,grid_spacing,sizes)); + //ParametricVoxelsOnCartesianGrid & parametric_image = *parametric_image_sptr; + + //ParametricVoxelsOnCartesianGrid & parametric_image = *parametric_image_sptr; + ParametricVoxelsOnCartesianGrid parametric_image(ParametricVoxelsOnCartesianGridBaseType(proj_data_info,zoom,grid_spacing,sizes)); + for(int k=0;k<63;++k) + for(int j=-64;j<63;++j) + for(int i=-64;i<63;++i) + for(unsigned int par_num=1; par_num<=num_params; ++par_num) + parametric_image[k][j][i][par_num] = static_cast (par_num*(i*1.F+j*5.F-k*10.F)); + + cerr << "- Checking the [] operator. " << endl; + for(int k=0;k<63;++k) + for(int j=-64;j<63;++j) + for(int i=-64;i<63;++i) + for(unsigned int par_num=1; par_num<=num_params; ++par_num) + check_if_equal(parametric_image[k][j][i][par_num],static_cast (par_num*(i*1.F+j*5.F-k*10.F)), + "Please, check the [] operator implementation"); + + + cerr << "- Checking construct_single_density(param_num) implementation." << endl; + // TODO tests need to be rewritten to accomodate for other num_params!=2 + if (num_params!=2) + { + warning("test_ParametricDiscretisedDensity test only tests first 2 maps"); + } + ParametricVoxelsOnCartesianGrid::SingleDiscretisedDensityType single_density_1 = parametric_image.construct_single_density(1); + ParametricVoxelsOnCartesianGrid::SingleDiscretisedDensityType single_density_2 = parametric_image.construct_single_density(2); + + for(int k=0;k<63;++k) + for(int j=-64;j<63;++j) + for(int i=-64;i<63;++i) + { + check_if_equal(parametric_image[k][j][i][1],single_density_1[k][j][i], + "Please, check construct_single_density(param_num) implementation"); + check_if_equal(parametric_image[k][j][i][2],single_density_2[k][j][i], + "Please, check construct_single_density(param_num) implementation"); + for(unsigned int par_num=1; par_num<=num_params; ++par_num) + check_if_equal(parametric_image[k][j][i][par_num],static_cast (par_num*(i*1.F+j*5.F-k*10.F)), + "Please, check the construct_single_density(param_num) implementation"); + } + + ParametricVoxelsOnCartesianGrid::SingleDiscretisedDensityType::full_iterator cur_iter_1 = + single_density_1.begin_all(); + ParametricVoxelsOnCartesianGrid::SingleDiscretisedDensityType::full_iterator cur_iter_2 = + single_density_2.begin_all(); + for (; cur_iter_1!=single_density_1.end_all() && + cur_iter_2!=single_density_2.end_all(); + ++cur_iter_1, ++cur_iter_2) + check_if_equal(*cur_iter_1*2.F, *cur_iter_2, + "Please, check construct_single_density(param_num) implementation"); + + std::fill(single_density_1.begin_all(), single_density_1.end_all(), 1.F); + std::fill(single_density_2.begin_all(), single_density_2.end_all(), 2.F); + VectorWithOffset > v_test; + v_test.resize(1,2); v_test[1].reset(single_density_1.clone()); v_test[2].reset(single_density_2.clone()); +#if 0 + // test disabled as function currently removed from class + cerr << "- Checking constructor from(VectorWithOffset single_densities) implementation." << endl; + { + ParametricVoxelsOnCartesianGrid test_create_par(v_test); + + // test origin and index-range + check_if_equal(v_test[1]->get_origin(), test_create_par.get_origin(), + "test if origin is equal after create_parametric_image"); + check_if_equal(v_test[1]->get_index_range(), test_create_par.get_index_range(), + "test if index_range is equal after create_parametric_image"); + // test grid-spacing (only appropriate for VoxelsOnCartesianGrid) + check_if_equal(v_test[1]->get_grid_spacing(), test_create_par.get_grid_spacing(), + "test if grid-spacing is equal after create_parametric_image"); + + // test values + { + bool still_equal = true; + for(int k=0;still_equal && k<63;++k) + for(int j=-64;still_equal && j<63;++j) + for(int i=-64;still_equal && i<63;++i) + for(unsigned int par_num=1;par_num<=num_params;++par_num) + { + still_equal = + check_if_equal(test_create_par[k][j][i][par_num],static_cast (par_num), + "Please, check create_parametric_image(VectorWithOffset single_denisties) implementation"); + // next test doesn't have anything to do with test_create_par + //check_if_equal(parametric_image[k][j][i][par_num],static_cast (par_num*(i*1.F+j*5.F-k*10.F)), + // "Please, check the create_parametric_image(VectorWithOffset single_densities)"); + } + } + } +#endif +#if 0 + // test disabled as function currently removed from class + { + cerr << "- Checking update_parametric_image(VectorWithOffset) implementation." << endl; + parametric_image.update_parametric_image(v_test); + for(int k=0;k<63;++k) + for(int j=-64;j<63;++j) + for(int i=-64;i<63;++i) + for(unsigned int par_num=1;par_num<=num_params;++par_num) + check_if_equal(parametric_image[k][j][i][par_num],static_cast (par_num), + "Please, check update_parametric_image(VectorWithOffset single_densities) implementation"); + } +#endif + cerr << "- Checking update_parametric_image(single_density,param_num) implementation." << endl; + parametric_image.update_parametric_image(single_density_1,2); +#if 1 + parametric_image.update_parametric_image(single_density_2,1); + + // Check if the result has been reversed. + { + bool still_equal = true; + for(int k=0;still_equal && k<63;++k) + for(int j=-64;still_equal && j<63;++j) + for(int i=-64;still_equal && i<63;++i) + for(unsigned int par_num=1;still_equal && par_num<=num_params;++par_num) + still_equal = check_if_equal(parametric_image[k][j][i][par_num],static_cast (2+1-par_num), + "Please, check update_parametric_image(VectorWithOffset) implementation"); + } +#endif + } +} + +END_NAMESPACE_STIR +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 1) + { + cerr << "Usage : " << argv[0] << " \n"; + return EXIT_FAILURE; + } + ParametricDiscretisedDensityTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/modelling/test_modelling.cxx b/src/test/modelling/test_modelling.cxx new file mode 100644 index 0000000000..4620c1f6fc --- /dev/null +++ b/src/test/modelling/test_modelling.cxx @@ -0,0 +1,213 @@ +// +// +/*! + \file + \ingroup test + \brief tests parts of the modelling implementation + + \author Charalampos Tsoumpas + +*/ +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/RunTests.h" +#include "stir/modelling/PatlakPlot.h" +#include "stir/modelling/ModelMatrix.h" +#include "stir/modelling/PlasmaData.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/utilities.h" +#include + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief A simple class to test modelling functions. +*/ +class modellingTests : public RunTests +{ +public: + explicit modellingTests(const std::string& directory); + + void run_tests(); +private: + //istream& in; + std::string directory; + boost::shared_array full_filename_sptr; + + std::string add_directory(const std::string& filename); +}; + +modellingTests:: +modellingTests(const std::string& directory_v) + : directory(directory_v), + full_filename_sptr(new char[directory_v.length() + 100]) +{} + +string +modellingTests:: +add_directory(const std::string& filename) +{ + strcpy(this->full_filename_sptr.get(), filename.c_str()); + prepend_directory_name(this->full_filename_sptr.get(),this->directory.c_str()); + return std::string(this->full_filename_sptr.get()); +} + +void modellingTests::run_tests() +{ + std::cerr << "Testing basic modelling functions..." << std::endl; + set_tolerance(0.004); + + { + std::cerr << "Testing the reading of PlasmaData ..." << std::endl; + + PlasmaData file_plasma_data, testing_plasma_data; + file_plasma_data.read_plasma_data(this->add_directory("triple_plasma.if")); + std::vector this_plasma_blood_plot; + const PlasmaSample sample_1(0.5F,.999947F,.0999947F); + const PlasmaSample sample_2(7573.3F,.450739F,.0450739F); + const PlasmaSample sample_3(30292.2F,.0412893F,.00412893F); + this_plasma_blood_plot.push_back(sample_1); + this_plasma_blood_plot.push_back(sample_2); + this_plasma_blood_plot.push_back(sample_3); + testing_plasma_data.set_plot(this_plasma_blood_plot); + + + PlasmaData::const_iterator cur_iter_1, cur_iter_2; + + for (cur_iter_1=file_plasma_data.begin(), cur_iter_2=testing_plasma_data.begin(); + cur_iter_1!=file_plasma_data.end(), cur_iter_2!=testing_plasma_data.end() ; + ++cur_iter_1, ++cur_iter_2) + { + check_if_equal((*cur_iter_1).get_time_in_s(),(*cur_iter_2).get_time_in_s(), "Check Reading Time of PlasmaData "); + check_if_equal((*cur_iter_1).get_plasma_counts_in_kBq(),(*cur_iter_2).get_plasma_counts_in_kBq(), "Check Reading Plasma of PlasmaData "); + check_if_equal((*cur_iter_1).get_blood_counts_in_kBq(),(*cur_iter_2).get_blood_counts_in_kBq(), "Check Reading Blood of PlasmaData "); + } + } + + { + std::cerr << "Testing the reading and writing of the ModelMatrix ..." << std::endl; + + ModelMatrix<2> file_model_matrix, correct_model_matrix; + file_model_matrix.read_from_file(this->add_directory("model_array.in")); + file_model_matrix.write_to_file(this->add_directory("model_array.out")); + + BasicCoordinate<2,int> min_range; + BasicCoordinate<2,int> max_range; + min_range[1]=1; min_range[2]=23; + max_range[1]=2; max_range[2]=28; + IndexRange<2> data_range(min_range,max_range); + Array<2,float> correct_model_array(data_range); + correct_model_array[1][23]=1; correct_model_array[2][23]=2; + correct_model_array[1][24]=11; correct_model_array[2][24]=22; + correct_model_array[1][25]=111; correct_model_array[2][25]=222; + correct_model_array[1][26]=1111; correct_model_array[2][26]=2222; + correct_model_array[1][27]=11111; correct_model_array[2][27]=22222; + correct_model_array[1][28]=111111; correct_model_array[2][28]=222222; + + correct_model_matrix.set_model_array(correct_model_array); + + Array<2,float> file_model_array=file_model_matrix.get_model_array(); + Array<2,float> get_correct_model_array=correct_model_matrix.get_model_array(); + + for (unsigned int param_num=1;param_num<=2;++param_num) + for(unsigned int frame_num=23;frame_num<=28;++frame_num) + { + check_if_equal(file_model_array[param_num][frame_num],get_correct_model_array[param_num][frame_num],"Check ModelMatrix reading. "); + check_if_equal(file_model_array[param_num][frame_num],correct_model_array[param_num][frame_num],"Check ModelMatrix reading. "); + } + } + { + // This tests uses the results from the Mathematica. The used plasma and frame files are parts of the t00196 scan. + std::cerr << "\nTesting the sampling of PlasmaData into frames ..." << std::endl; + PlasmaData file_plasma_data, testing_plasma_data; + file_plasma_data.read_plasma_data(this->add_directory("plasma.if")); + std::vector this_plasma_blood_plot; + TimeFrameDefinitions time_frame_def(this->add_directory("time.fdef")); + file_plasma_data.set_isotope_halflife(6586.2F); + PlasmaData sample_plasma_data_in_frames = file_plasma_data.get_sample_data_in_frames(time_frame_def); + + const PlasmaSample sample_17(1, 11.4776, 10.7832); const PlasmaSample sample_18(1, 10.7523, 10.1135); const PlasmaSample sample_19(1, 10.0841, 9.50239); + const PlasmaSample sample_20(1, 9.24207, 8.7949); const PlasmaSample sample_21(1, 8.39741, 8.04141); const PlasmaSample sample_22(1, 7.74369, 7.36121); + const PlasmaSample sample_23(1, 7.18224, 6.78764); const PlasmaSample sample_24(1, 6.67699, 6.3266); const PlasmaSample sample_25(1, 6.23402, 5.93635); + const PlasmaSample sample_26(1, 5.8495, 5.593); const PlasmaSample sample_27(1, 5.50858, 5.29071); const PlasmaSample sample_28(1, 5.19509, 5.02458); + + TimeFrameDefinitions plasma_fdef=sample_plasma_data_in_frames.get_time_frame_definitions(); + + this_plasma_blood_plot.push_back(sample_17); this_plasma_blood_plot.push_back(sample_18); this_plasma_blood_plot.push_back(sample_19); + this_plasma_blood_plot.push_back(sample_20); this_plasma_blood_plot.push_back(sample_21); this_plasma_blood_plot.push_back(sample_22); + this_plasma_blood_plot.push_back(sample_23); this_plasma_blood_plot.push_back(sample_24); this_plasma_blood_plot.push_back(sample_25); + this_plasma_blood_plot.push_back(sample_26); this_plasma_blood_plot.push_back(sample_27); this_plasma_blood_plot.push_back(sample_28); + + testing_plasma_data.set_plot(this_plasma_blood_plot); + testing_plasma_data.set_isotope_halflife(6586.2F); + testing_plasma_data.decay_correct_PlasmaData(); + PlasmaData::const_iterator cur_iter_1, cur_iter_2; + + for (cur_iter_1=sample_plasma_data_in_frames.begin()+16, cur_iter_2=testing_plasma_data.begin(); + cur_iter_1!=sample_plasma_data_in_frames.end(), cur_iter_2!=testing_plasma_data.end() ; + ++cur_iter_1, ++cur_iter_2) + { + check_if_equal((*cur_iter_1).get_plasma_counts_in_kBq(),(*cur_iter_2).get_plasma_counts_in_kBq(),"Check Plasma when sampling PlasmaData into frames"); + check_if_equal((*cur_iter_1).get_blood_counts_in_kBq(),(*cur_iter_2).get_blood_counts_in_kBq(),"Check Blood when sampling PlasmaData into frames"); + } + assert(time_frame_def.get_num_frames()==plasma_fdef.get_num_frames()); + for (unsigned int frame_num=17 ; frame_num<=time_frame_def.get_num_frames() && frame_num<=plasma_fdef.get_num_frames(); ++frame_num) + { + check_if_equal(time_frame_def.get_start_time(frame_num),plasma_fdef.get_start_time(frame_num),"Check start time when sampling PlasmaData into frames"); + check_if_equal(time_frame_def.get_duration(frame_num),plasma_fdef.get_duration(frame_num),"Check duration when sampling PlasmaData into frames"); + check_if_equal(time_frame_def.get_end_time(frame_num),plasma_fdef.get_end_time(frame_num),"Check duration when sampling PlasmaData into frames"); + } + std::cerr << "\nTesting the creation of Model Matrix based on Plasma Data..." << std::endl; + PatlakPlot patlak_plot; + const unsigned int starting_frame=23; + ModelMatrix<2> stir_model_matrix=(patlak_plot.get_model_matrix(sample_plasma_data_in_frames,time_frame_def,starting_frame)); + ModelMatrix<2> mathematica_model_matrix; + mathematica_model_matrix.read_from_file(this->add_directory("math_model_matrix.in")); + stir_model_matrix.uncalibrate(10); + // stir_model_matrix.convert_to_total_frame_counts(time_frame_def); + Array<2,float> stir_model_array=stir_model_matrix.get_model_array(); + Array<2,float> mathematica_model_array=mathematica_model_matrix.get_model_array(); + + for(unsigned int frame_num=23;frame_num<=28;++frame_num) + { + check_if_equal(mathematica_model_array[1][frame_num]/10.F,stir_model_array[1][frame_num],"Check _model_array-1st column in ModelMatrix"); + check_if_equal(mathematica_model_array[2][frame_num]/10.F,stir_model_array[2][frame_num],"Check _model_array-2nd column in ModelMatrix"); + } + } + +} + + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 2) + { + cerr << "Usage : " << argv[0] << " \n"; + return EXIT_FAILURE; + } + modellingTests tests(argv[1]); + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/numerics/BSplines_timing.cxx b/src/test/numerics/BSplines_timing.cxx new file mode 100644 index 0000000000..797fbff4fd --- /dev/null +++ b/src/test/numerics/BSplines_timing.cxx @@ -0,0 +1,340 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! +\file +\ingroup numerics_test +\brief Allows executing timing tests for the stir::BSpline::BSplinesRegularGrid class + +\author Tim Borgeaud +\author Kris Thielemans + +*/ +//#define MYLINEAR + +#include "stir/Array.h" +#include "stir/IndexRange2D.h" +#include "stir/IndexRange3D.h" +#include "stir/IndexRange4D.h" + +#include "local/stir/numerics/more_interpolators.h" + +#include "stir/numerics/BSplines.h" +#include "stir/numerics/BSplinesRegularGrid.h" + + +#include +#include +#include +#include + +using std::cerr; + +using namespace stir; +using namespace BSpline; + + + +const int MAX_DIMS = 4; +const int DEF_DIMS = 1; + + +const int MAX_NUM = 10000000; +const int MIN_SIZE = 5; +const int MAX_TOTAL_GRID_ELEMENTS = 10000000; + +const int DEF_NUM = 1000; +const int DEF_SIZE = 10; + + +void usage(char *name) { + + cerr << "A program to test the BSplines interpolation implementation\n\n"; + + cerr << "Usage: " << name << " [-n number of interpolations] [-s grid size]\n"; + cerr << " [-i interpolator] [-d 2]\n\n"; + + cerr << " interpolator: near, linear, quadratic, cubic, omoms\n\n"; + +} + + + +template +double interpolate(int num, int size, BSplineType bs_type, Array grid) { + + // Create interpolator. + + struct timeval start; + gettimeofday(&start, NULL); + + BSplinesRegularGrid bsi(grid, bs_type); + + struct timeval end; + gettimeofday(&end, NULL); + + double total = (end.tv_sec - start.tv_sec) + ((end.tv_usec - start.tv_usec)/1000000.0); + + cout << "Constructed " << dims << " dimensional, " << size; + for (int d = 1 ; d < dims ; d++ ) { + cout << " x " << size; + } + cout << " element grid.\n"; + cout << "Time: " << total << " seconds\n"; + cout << "\n"; + + + BasicCoordinate pos; + + + + gettimeofday(&start, NULL); + + double foo = 0.0; + + // Now try some interpolation. + for (int i = 0 ; i < num ; i++ ) { + + // Set position + for (int d = 1 ; d < dims + 1 ; d++ ) { + pos[d] = (static_cast(size - 1)/(RAND_MAX)) * random(); + //cout << pos[d] << "\n"; + } + + // Get interpolation. + foo += bsi(pos); + } + + + gettimeofday(&end, NULL); + + total = (end.tv_sec - start.tv_sec) + ((end.tv_usec - start.tv_usec)/1000000.0); + + + cout << "Interpolations: " << num << "\n"; + cout << "Time: " << total << " seconds\n"; + cout << "\n"; + + ////////////// +#ifdef MYLINEAR + gettimeofday(&start, NULL); + + foo = 0.0; + + // Now try some interpolation. + for (int i = 0 ; i < num ; i++ ) { + + // Set position + for (int d = 1 ; d < dims + 1 ; d++ ) { + pos[d] = (static_cast(size - 1)/(RAND_MAX)) * random(); + //cout << pos[d] << "\n"; + } + + // Get interpolation. + foo += pull_linear_interpolate(grid,pos); + } + + gettimeofday(&end, NULL); + + total = (end.tv_sec - start.tv_sec) + ((end.tv_usec - start.tv_usec)/1000000.0); + + + cout << "linear Time: " << total << " seconds\n"; + cout << "\n"; +#endif //MYLINEAR + + ////////////// + cout << "foo: " << foo << "\n\n"; + + return(total); +} + + + + + + +int main(int argc, char **argv) { + + int grid_size = DEF_SIZE; + BSplineType bs_type = near_n; + int num = DEF_NUM; + int dimensions = DEF_DIMS; + + char opt_ch; + + // Options. + while ((opt_ch = getopt(argc, argv, "n:s:i:d:h")) != -1) + + switch (opt_ch) { + case 'h': + usage(basename(argv[0])); + exit(EXIT_SUCCESS); + + case 'n': + // Number of interpolations. + num = atoi(optarg); + break; + + case 's': + // Grid_Size + grid_size = atoi(optarg); + break; + + case 'i': + // Interpolation. + + if ( strcasecmp(optarg, "near") == 0 ) { + bs_type = near_n; + } else if ( strcasecmp(optarg, "linear") == 0 ) { + bs_type = linear; + } else if ( strcasecmp(optarg, "quadratic") == 0 ) { + bs_type = quadratic; + } else if ( strcasecmp(optarg, "cubic") == 0 ) { + bs_type = cubic; + } else if ( strcasecmp(optarg, "quartic") == 0 ) { + bs_type = quartic; + } else if ( strcasecmp(optarg, "quintic") == 0 ) { + bs_type = quintic; + } else if ( strcasecmp(optarg, "omoms") == 0 ) { + bs_type = oMoms; + } + + break; + + case 'd': + dimensions = atoi(optarg); + break; + + case '?': + default: + usage(basename(argv[0])); + exit(0); + break; + } + + argc -= optind; + + if ( argc > 0 ) { + usage(basename(argv[0])); + exit(EXIT_FAILURE); + } + + + + // Sanity check on grid dimensions and number of interpolations to carry out. + if ( num < 1 || num > MAX_NUM ) { + num = DEF_NUM; + cerr << "Number of interpolations out of range. Reset to: " << num << "\n"; + } + + + + if ( grid_size < MIN_SIZE ) { + grid_size = DEF_SIZE; + cerr << "Grid size too small. Reset to: " << grid_size << "\n"; + } else { + + int total_elements = grid_size; + + for (int d = 1 ; d < dimensions ; d++) { + total_elements *= grid_size; + } + + if ( total_elements > MAX_TOTAL_GRID_ELEMENTS ) { + grid_size = DEF_SIZE; + cerr << "Grid size too large for " << dimensions << " dimensions. Reset to: " + << grid_size << "\n"; + } + } + + + + if ( dimensions < 1 || dimensions > MAX_DIMS ) { + dimensions = DEF_DIMS; + cerr << "Dimensions out of range. Reset to: " << dimensions << "\n"; + } + + + int size[4] = {0, 0, 0, 0}; + for (int d = 0 ; d < dimensions ; d++) { + size[d] = grid_size; + } + + // Test arrays - Double precision. + Array<1, float> data_1(size[0]); + + IndexRange2D range2(size[1], size[1]); + Array<2, float> data_2(range2); + + IndexRange3D range3(size[2], size[2], size[2]); + Array<3, float> data_3(range3); + + IndexRange4D range4(size[3], size[3], size[3], size[3]); + Array<4, float> data_4(range4); + + + // Fill test arrays. + for (int i = 0 ; i < size[0] ; i++ ) { + data_1[i] = i; + + for (int j = 0 ; j < size[1] ; j++ ) { + data_2[i][j] = i * j; + + + for (int k = 0 ; k < size[2] ; k++) { + data_3[i][j][k] = i * j * k; + + for (int l = 0 ; l < size[3] ; l++) { + data_4[i][j][k][l] = i * j * k * l; + } + } + } + } + + + + + switch ( dimensions ) { +#ifndef MYLINEAR + case 1: + interpolate(num, size[0], bs_type, data_1); + break; + + case 2: + interpolate(num, size[1], bs_type, data_2); + break; +#endif + case 3: + interpolate(num, size[2], bs_type, data_3); + break; +#ifndef MYLINEAR + case 4: + interpolate(num, size[3], bs_type, data_4); + break; +#endif + default: + // Do nothing. + break; + + } + + return(0); + +} /* End of Main */ + diff --git a/src/test/numerics/CMakeLists.txt b/src/test/numerics/CMakeLists.txt new file mode 100644 index 0000000000..fe7e6efe2a --- /dev/null +++ b/src/test/numerics/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (C) 2011, Kris Thielemans +# Copyright (C) 2013, University College London +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file declaring all tests in this subdirectory + +set(dir test/numerics) + +set(dir_SIMPLE_TEST_EXE_SOURCES ${dir}_SIMPLE_TEST_EXE_SOURCES) +set(dir_INVOLVED_TEST_EXE_SOURCES ${dir}_INVOLVED_TEST_EXE_SOURCES) +set(dir_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES ${dir}_SIMPLE_TEST_EXE_SOURCES_NO_REGISTRIES) + +create_stir_test (test_IR_filters.cxx "" "") +create_stir_test (test_BSplines.cxx "buildblock" "") +create_stir_test (test_BSplinesRegularGrid.cxx "buildblock;IO;buildblock" "") +create_stir_test (test_BSplinesRegularGrid1D.cxx "buildblock;IO;buildblock" "") +create_stir_test (test_erf.cxx "" "") +create_stir_test (test_matrices.cxx "buildblock;IO;numerics_buildblock;buildblock" "") +create_stir_test (test_overlap_interpolate.cxx "buildblock" "") +create_stir_test (test_integrate_discrete_function.cxx "buildblock" "") + + +include(stir_test_exe_targets) + diff --git a/src/test/numerics/Makefile_BSpline_timings b/src/test/numerics/Makefile_BSpline_timings new file mode 100644 index 0000000000..0527d15a9c --- /dev/null +++ b/src/test/numerics/Makefile_BSpline_timings @@ -0,0 +1,32 @@ +# +# Test makefile for bsplines testing. +# +# + + +CC=g++ + + +# debugging and profiling. +#CFLAGS= -Wall -g -pg +CFLAGS= -Wall -DNDEBUG + + +INCLUDE="../../include" + +SRC=BSplines_timing.cxx + + +test: ${SRC} + ${CC} ${CFLAGS} -I ${INCLUDE} -o test ${SRC} + + + + +run: test + ./test + ${GPROF} + +# +# % gprof test test.gmon | less +# \ No newline at end of file diff --git a/src/test/numerics/test.mk b/src/test/numerics/test.mk new file mode 100644 index 0000000000..155e248b97 --- /dev/null +++ b/src/test/numerics/test.mk @@ -0,0 +1,57 @@ +# +# +dir := test/numerics + +$(dir)_TEST_SOURCES := \ + test_matrices.cxx \ + test_overlap_interpolate.cxx \ + test_integrate_discrete_function.cxx \ + test_IR_filters.cxx \ + test_BSplines.cxx \ + test_BSplinesRegularGrid1D.cxx \ + test_BSplinesRegularGrid.cxx \ + test_erf.cxx + + + + +################################################## +# rules to ignore registries +# note: have to be before include statement as that changes value of $(dir) +${DEST}$(dir)/test_matrices: ${DEST}$(dir)/test_matrices${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_overlap_interpolate: ${DEST}$(dir)/test_overlap_interpolate${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_integrate_discrete_function: ${DEST}$(dir)/test_integrate_discrete_function${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +ifeq ("$(FAST_test)","") + +${DEST}$(dir)/test_BSplinesRegularGrid: ${DEST}$(dir)/test_BSplinesRegularGrid$(O_SUFFIX) $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +else + +${DEST}$(dir)/test_BSplinesRegularGrid: ${DEST}$(dir)/test_BSplinesRegularGrid${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< ${DEST}buildblock/error${O_SUFFIX} $(LINKFLAGS) $(SYS_LIBS) + + +${DEST}$(dir)/test_BSplinesRegularGrid1D: ${DEST}$(dir)/test_BSplinesRegularGrid1D${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< ${DEST}buildblock/error${O_SUFFIX} $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_BSplines: ${DEST}$(dir)/test_BSplines${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< ${DEST}buildblock/error${O_SUFFIX} $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_IR_filters: ${DEST}$(dir)/test_IR_filters${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< ${DEST}buildblock/error${O_SUFFIX} $(LINKFLAGS) $(SYS_LIBS) + +endif + +include $(WORKSPACE)/test.mk + diff --git a/src/test/numerics/test_BSplines.cxx b/src/test/numerics/test_BSplines.cxx new file mode 100644 index 0000000000..5fcd84282f --- /dev/null +++ b/src/test/numerics/test_BSplines.cxx @@ -0,0 +1,457 @@ +/* + Copyright (C) 2005- 2009-10-27, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_test + \brief tests the BSplines + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ +#include "stir/RunTests.h" +#include "stir/Array.h" +#include "stir/IndexRange2D.h" +#include "stir/stream.h" +#include +#include "stir/numerics/BSplines1DRegularGrid.h" +#include +#include +#include +#include +#include "stir/shared_ptr.h" +#include +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::ifstream; +using std::istream; +using std::setw; +#endif +START_NAMESPACE_STIR +namespace BSpline { + /*! + \ingroup test + \brief A simple class to test the BSplines function. + */ + class BSplines_Tests : public RunTests + { + public: + BSplines_Tests() + {} + void run_tests(); + private: + template + bool check_at_sample_points(const std::vector& v, + BSplines1DRegularGrid& interpolator, + const char * const message) + { + std::vector out; + for (std::size_t i=0, imax=v.size(); i(i))); + std::cout << "IN: " << v << "OUT: " << out; + return + check_if_equal(v, out, message); + } + }; + void BSplines_Tests::run_tests() + { + cerr << "Testing BSplines set of functions..." << endl; + set_tolerance(0.001); + typedef double elemT; + static std::vector pre_input_sample; + //pre_input_sample.push_back(-5); + pre_input_sample.push_back(-14); pre_input_sample.push_back(8); pre_input_sample.push_back(-1); + pre_input_sample.push_back(13); pre_input_sample.push_back(-1); pre_input_sample.push_back(-2); + pre_input_sample.push_back(11); pre_input_sample.push_back(1); pre_input_sample.push_back(-8); + pre_input_sample.push_back(6); pre_input_sample.push_back(11); pre_input_sample.push_back(-14); + pre_input_sample.push_back(6); pre_input_sample.push_back(-3); pre_input_sample.push_back(10); + pre_input_sample.push_back(1); pre_input_sample.push_back(7); pre_input_sample.push_back(-2); + pre_input_sample.push_back(-5); pre_input_sample.push_back(-9); pre_input_sample.push_back(-9); + pre_input_sample.push_back(6); pre_input_sample.push_back(-5); pre_input_sample.push_back(2); + pre_input_sample.push_back(-10); pre_input_sample.push_back(6); pre_input_sample.push_back(-3); + pre_input_sample.push_back(11); pre_input_sample.push_back(11); pre_input_sample.push_back(3); + { + cerr << "Testing BSplines_weights cubic function..." << endl; + std::vector BSplines_weights_STIR_vector_3, BSplines_weights_correct_vector_3; + BSplines1DRegularGrid BSplines1DRegularGridTests; + for(elemT i=0.3; i<=3 ;++i) + BSplines_weights_STIR_vector_3.push_back(BSplines_weights(i,cubic)); + BSplines_weights_STIR_vector_3.push_back(BSplines_weights(0.,cubic)); + + BSplines_weights_correct_vector_3.push_back(0.590167); //1 + BSplines_weights_correct_vector_3.push_back(0.0571667); //2 + BSplines_weights_correct_vector_3.push_back(0.); //3 + BSplines_weights_correct_vector_3.push_back(0.666667); //4 + + std::vector:: iterator cur_iter_stir_out_3= BSplines_weights_STIR_vector_3.begin() + , cur_iter_test_3= BSplines_weights_correct_vector_3.begin() ; + for (; cur_iter_stir_out_3!=BSplines_weights_STIR_vector_3.end() && + cur_iter_test_3!=BSplines_weights_correct_vector_3.end(); + ++cur_iter_stir_out_3, ++cur_iter_test_3) + check_if_equal(*cur_iter_stir_out_3, *cur_iter_test_3, + "check cubic BSplines_weights implementation"); + } + { + cerr << "Testing BSplines_weights quadratic function..." << endl; + std::vector BSplines_weights_STIR_vector_2, BSplines_weights_correct_vector_2; + BSplines1DRegularGrid BSplines1DRegularGridTests; + for(elemT i=0.3; i<=3 ;++i) + BSplines_weights_STIR_vector_2.push_back(BSplines_weights(i,quadratic)); + BSplines_weights_STIR_vector_2.push_back(BSplines_weights(0.,quadratic)); + BSplines_weights_correct_vector_2.push_back(0.66); //1 + BSplines_weights_correct_vector_2.push_back(0.02); //2 + BSplines_weights_correct_vector_2.push_back(0.00); //3 + BSplines_weights_correct_vector_2.push_back(0.75); //4 + + std::vector:: iterator cur_iter_stir_out_2= BSplines_weights_STIR_vector_2.begin() + , cur_iter_test_2= BSplines_weights_correct_vector_2.begin() ; + for (; cur_iter_stir_out_2!=BSplines_weights_STIR_vector_2.end() && + cur_iter_test_2!=BSplines_weights_correct_vector_2.end(); + ++cur_iter_stir_out_2, ++cur_iter_test_2) + check_if_equal(*cur_iter_stir_out_2, *cur_iter_test_2, + "check BSplines_weights quadratic implementation"); + } + { + cerr << "Testing BSplines_weights quintic function..." << endl; + std::vector BSplines_weights_STIR_vector_5, BSplines_weights_correct_vector_5; + BSplines1DRegularGrid BSplines1DRegularGridTests; + for(elemT i=0.3; i<=3 ;++i) + BSplines_weights_STIR_vector_5.push_back(BSplines_weights(i,quintic)); + BSplines_weights_STIR_vector_5.push_back(BSplines_weights(0.,quintic)); + BSplines_weights_correct_vector_5.push_back(0.506823); //1 + BSplines_weights_correct_vector_5.push_back(0.109918); //2 + BSplines_weights_correct_vector_5.push_back(0.00140058); //3 + BSplines_weights_correct_vector_5.push_back(0.55); //4 + std::vector:: iterator cur_iter_stir_out= BSplines_weights_STIR_vector_5.begin() + , cur_iter_test= BSplines_weights_correct_vector_5.begin() ; + for (; cur_iter_stir_out!=BSplines_weights_STIR_vector_5.end() && + cur_iter_test!=BSplines_weights_correct_vector_5.end(); + ++cur_iter_stir_out, ++cur_iter_test) + check_if_equal(*cur_iter_stir_out, *cur_iter_test, + "check BSplines_weights quintic implementation"); + } + { + BSplines1DRegularGrid BSplines1DRegularGridTests; + cerr << "Testing oMoms_weight function..." << endl; + std::vector oMoms_weight_STIR_vector, oMoms_weight_correct_vector; + oMoms_weight_STIR_vector.push_back(oMoms_weight(0.)); + for(elemT i=0.3; i<=3 ;++i) + oMoms_weight_STIR_vector.push_back(oMoms_weight(i)); + oMoms_weight_correct_vector.push_back(0.619048);//1 + oMoms_weight_correct_vector.push_back(0.563976);//2 + oMoms_weight_correct_vector.push_back(0.0738333);//3 + oMoms_weight_correct_vector.push_back(0.); //4 + std::vector:: iterator cur_iter_stir_out= oMoms_weight_STIR_vector.begin() + , cur_iter_test= oMoms_weight_correct_vector.begin() ; + for (; cur_iter_stir_out!= oMoms_weight_STIR_vector.end() && + cur_iter_test!= oMoms_weight_correct_vector.end(); + ++cur_iter_stir_out, ++cur_iter_test) + check_if_equal(*cur_iter_stir_out, *cur_iter_test, + "check oMoms_weight implementation"); + } + { + cerr << "Testing BSplines_1st_der_weight function..." << endl; + BSplines1DRegularGrid BSplines1DRegularGridTests; + std::vector BSplines_1st_der_weight_STIR_vector, BSplines_1st_der_weight_correct_vector, + BSplines_1st_der_weight_est_vector; + + BSplines_1st_der_weight_STIR_vector.push_back(BSplines_1st_der_weight(0.,cubic)); + + for(elemT i=0.3; i<=3 ;++i) + BSplines_1st_der_weight_STIR_vector.push_back(BSplines_1st_der_weight(i,cubic)); + BSplines_1st_der_weight_correct_vector.push_back(0.); //1 + BSplines_1st_der_weight_correct_vector.push_back(-0.465); //2 + BSplines_1st_der_weight_correct_vector.push_back(-0.245); //3 + BSplines_1st_der_weight_correct_vector.push_back(0.); //4 + for ( std::vector:: iterator cur_iter_stir_out= BSplines_1st_der_weight_STIR_vector.begin() + , cur_iter_test= BSplines_1st_der_weight_correct_vector.begin(); + cur_iter_stir_out!=BSplines_1st_der_weight_STIR_vector.end() && + cur_iter_test!=BSplines_1st_der_weight_correct_vector.end(); + ++cur_iter_stir_out, ++cur_iter_test) + check_if_equal(*cur_iter_stir_out, *cur_iter_test, + "check BSplines_1st_der_weight implementation"); + } + { + cerr << "Testing BSplines 1st Derivative analytically..." << endl; + std::vector BSplines_1st_der_STIR_vector, + BSplines_1st_der_est_vector, new_input_sample(15,1); + new_input_sample[5]=7.; + new_input_sample[6]=9.; + new_input_sample[10]=91.; + BSplines1DRegularGrid BSplines1DRegularGridTest(new_input_sample,cubic); + const double epsilon = .0001; + for(double i=0; i<=new_input_sample.size()+3 ;++i) + { + BSplines_1st_der_STIR_vector.push_back(BSplines1DRegularGridTest.BSplines_1st_der(i)); + BSplines_1st_der_est_vector.push_back( + (BSplines1DRegularGridTest(i+epsilon) - + BSplines1DRegularGridTest(i-epsilon)) /(2*epsilon)); + } + for ( std::vector:: iterator cur_iter_stir_out= BSplines_1st_der_est_vector.begin() + , cur_iter_test=BSplines_1st_der_STIR_vector.begin(); + cur_iter_test!=BSplines_1st_der_STIR_vector.end(); + ++cur_iter_stir_out, ++cur_iter_test) + check_if_equal(*cur_iter_stir_out, *cur_iter_test, + "check cubic BSplines_1st_der_est or cubic BSplines implementation"); + } + { + cerr << "Testing BSplines: Nearest Neighbour values and constructor using a vector as input..." << endl; + { + const std::vector const_input_sample(10,1); + BSplines1DRegularGrid BSplines1DRegularGridTest1( + const_input_sample.begin(), const_input_sample.end(), near_n); + check_at_sample_points(const_input_sample, BSplines1DRegularGridTest1, + "check BSplines implementation for nearest interpolation"); + } + { + std::vector linear_input; + for (elemT i=0, imax=10; i + BSplines1DRegularGridTesti(linear_input, near_n); + + check_at_sample_points(linear_input, BSplines1DRegularGridTesti, + "check BSplines implementation for nearest interpolation"); + } + { + BSplines1DRegularGrid + BSplines1DRegularGridTest(pre_input_sample, near_n); + check_at_sample_points(pre_input_sample, BSplines1DRegularGridTest, + "check BSplines implementation for nearest interpolation"); + } + } + { + cerr << "Testing BSplines: Linear Interpolation values and constructor using a vector as input..." << endl; + { + const std::vector const_input_sample(10,1); + BSplines1DRegularGrid BSplines1DRegularGridTest1( + const_input_sample.begin(), const_input_sample.end(), linear); + check_at_sample_points(const_input_sample, BSplines1DRegularGridTest1, + "check BSplines implementation for linear interpolation"); + } + { + std::vector linear_input; + for (elemT i=0, imax=10; i + BSplines1DRegularGridTesti(linear_input, linear); + + check_at_sample_points(linear_input, BSplines1DRegularGridTesti, + "check BSplines implementation for linear interpolation"); + } + { + BSplines1DRegularGrid + BSplines1DRegularGridTest(pre_input_sample, linear); + check_at_sample_points(pre_input_sample, BSplines1DRegularGridTest, + "check BSplines implementation for linear interpolation"); + } + } + { + cerr << "Testing BSplines: Quadratic Interpolation values and constructor using a vector as input..." << endl; + { + const std::vector const_input_sample(10,1); + BSplines1DRegularGrid BSplines1DRegularGridTest1( + const_input_sample.begin(), const_input_sample.end(), quadratic); + check_at_sample_points(const_input_sample, BSplines1DRegularGridTest1, + "check BSplines implementation for quadratic interpolation"); + } + { + std::vector linear_input; + for (elemT i=0, imax=10; i + BSplines1DRegularGridTesti(linear_input, quadratic); + + check_at_sample_points(linear_input, BSplines1DRegularGridTesti, + "check BSplines implementation for quadratic interpolation"); + } + { + BSplines1DRegularGrid + BSplines1DRegularGridTest(pre_input_sample, quadratic); + check_at_sample_points(pre_input_sample, BSplines1DRegularGridTest, + "check BSplines implementation for quadratic interpolation"); + } + } + { + cerr << "Testing BSplines: Cubic Interpolation values and constructor using a vector as input..." << endl; + { + const std::vector const_input_sample(10,1); + BSplines1DRegularGrid BSplines1DRegularGridTest1( + const_input_sample.begin(), const_input_sample.end(), cubic); + check_at_sample_points(const_input_sample, BSplines1DRegularGridTest1, + "check BSplines implementation for cubic interpolation"); + } + { + std::vector linear_input; + for (elemT i=0, imax=10; i + BSplines1DRegularGridTesti(linear_input, cubic); + + check_at_sample_points(linear_input, BSplines1DRegularGridTesti, + "check BSplines implementation for cubic interpolation"); + } + { + BSplines1DRegularGrid + BSplines1DRegularGridTest(pre_input_sample, cubic); + check_at_sample_points(pre_input_sample, BSplines1DRegularGridTest, + "check BSplines implementation for cubic interpolation"); + } + } + { + cerr << "Testing BSplines: o-Moms Interpolation values and constructor using a vector as input..." << endl; + { + const std::vector const_input_sample(10,1); + BSplines1DRegularGrid BSplines1DRegularGridTest1( + const_input_sample.begin(), const_input_sample.end(), oMoms); + check_at_sample_points(const_input_sample, BSplines1DRegularGridTest1, + "check BSplines implementation for o-Moms interpolation"); + } + { + std::vector linear_input; + for (elemT i=0, imax=10; i + BSplines1DRegularGridTesti(linear_input, oMoms); + + check_at_sample_points(linear_input, BSplines1DRegularGridTesti, + "check BSplines implementation for o-Moms interpolation"); + } + } + { + cerr << "Testing BSplines Continuity..." << endl; + std::vector new_input_sample(12,1) , STIR_right_output_sample, + STIR_left_output_sample; + BSplines1DRegularGrid BSplines1DRegularGridTests( + new_input_sample.begin(), new_input_sample.end()); + // test if shifted copy of the B-spline functions add to 1 + for (double inc=0; inc<1; inc+=.1) + check_if_equal( + BSplines_weights(+inc,cubic)+ + BSplines_weights(+inc+1,cubic)+ + BSplines_weights(+inc+2,cubic)+ + BSplines_weights(+inc-1,cubic)+ + BSplines_weights(+inc-2,cubic), + 1., "test on cubic B-spline function"); + std::cerr << '\n'; + const elemT epsilon = 0.01; + for (elemT i=1, imax=10; i:: iterator cur_iter_stir_left_out= STIR_left_output_sample.begin(), + cur_iter_stir_right_out= STIR_right_output_sample.begin(); + for (; cur_iter_stir_left_out!=STIR_left_output_sample.end() && + cur_iter_stir_right_out!=STIR_right_output_sample.end(); + ++cur_iter_stir_left_out, ++cur_iter_stir_right_out) + check_if_equal(*cur_iter_stir_left_out, *cur_iter_stir_right_out, + "check BSplines implementation"); + } + { + cerr << "Testing BSplines 1st Derivative Continuity..." << endl; + std::vector new_input_sample, STIR_right_output_sample, STIR_left_output_sample; + + for (elemT i=0, imax=14; i BSplines1DRegularGridTests( + new_input_sample.begin(), new_input_sample.end()); + + std::cerr << '\n'; + const elemT epsilon = 0.0001; + for (elemT i=1, imax=13; i:: iterator cur_iter_stir_left_out= STIR_left_output_sample.begin(), + cur_iter_stir_right_out= STIR_right_output_sample.begin(); + for (; cur_iter_stir_left_out!=STIR_left_output_sample.end() && + cur_iter_stir_right_out!=STIR_right_output_sample.end(); + ++cur_iter_stir_left_out, ++cur_iter_stir_right_out) + check_if_equal(*cur_iter_stir_left_out, *cur_iter_stir_right_out, + "check BSplines implementation"); + } + { + cerr << "Testing BSplines values giving a vector as input..." << endl; + std::vector input_sample(10,1), output_sample_position, STIR_output_sample; + + BSplines1DRegularGrid BSplines1DRegularGridTests(input_sample); + for (elemT i=0, imax=23; i:: iterator cur_iter_stir_out = STIR_output_sample.begin(); + + for (; cur_iter_stir_out!=STIR_output_sample.end(); ++cur_iter_stir_out) + check_if_equal(*cur_iter_stir_out, (elemT)1, + "check BSplines implementation"); + } + /* { + cerr << "Testing interpolation results. Look at the text files!" << endl; + std::vector exp_input_sample; + std::vector STIR_output_sample; + int imax =30; + for(int i=0; i:: iterator cur_iter_stir_out= STIR_output_sample.begin(); + BSplines1DRegularGrid BSplines1DRegularGridTest( + pre_input_sample.begin(), pre_input_sample.end(), linear); + string output_string; + output_string += "gaussian"; //"noisy_inter" ; + ofstream out(output_string.c_str()); //output file // + + if(!out) + { + cout << "Cannot open text file.\n" ; + //return EXIT_FAILURE; + } + + + // STIR_output_sample.push_back(BSplines1DRegularGridTest(i)); + // cout << STIR_output_sample; + out << BSplines1DRegularGridTest.spline_type <<". B-Spline \n"; + out << "Position " << "\t" << " Value \n" ; + for (elemT i=0; i +#include "stir/shared_ptr.h" +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif +START_NAMESPACE_STIR + +namespace BSpline { + /*! + \ingroup numerics_test + \brief A simple class to BSplinesRegularGrid for 2D arrays. + */ + class BSplinesRegularGrid_Tests : public RunTests + { + public: + BSplinesRegularGrid_Tests() + {} + void run_tests(); + private: + template + bool check_at_sample_points(const Array<2,elemT>& v, + const BSplinesRegularGrid<2, elemT, elemT>& interpolator, + const char * const message) + { + Array<2,elemT> out(v.get_index_range()); + BasicCoordinate<2, elemT> relative_positions; + for (int j=out.get_min_index() ; j<=out.get_max_index() ; ++j) + for (int i=out[j].get_min_index() ; i<=out[j].get_max_index() ; ++i) + { + relative_positions[1]=j; + relative_positions[2]=i; + out[j][i]=interpolator(relative_positions); + } + // cout << "IN: \n" << v << "OUT: \n" << out; + return + check_if_equal(v, out, message); + } + template + bool check_near_sample_points(const Array<2,elemT>& v, + const BSplinesRegularGrid<2, elemT, elemT>& interpolator, + const BasicCoordinate<2, elemT>& epsilon, + const char * const message) + { + Array<2,elemT> out_near(v.get_index_range()); + BasicCoordinate<2, elemT> relative_positions; + for (int j=out_near.get_min_index() ; j<=out_near.get_max_index() ; ++j) + for (int i=out_near[j].get_min_index() ; i<=out_near[j].get_max_index() ; ++i) + { + relative_positions[1]=j+epsilon[1]; + relative_positions[2]=i+epsilon[2]; + out_near[j][i]=interpolator(relative_positions); + } + // cout << "IN: \n" << v << "out_near: \n" << out_near; + return + check_if_equal(v, out_near, message); + } + + template + bool check_at_half_way(const Array<2,elemT>& v, + const Array<2,elemT>& v_at_half, + const BSplinesRegularGrid<2, elemT, elemT>& interpolator, + const char * const message) + { + Array<2,elemT> out_at_half(v_at_half.get_index_range()), dv(v_at_half.get_index_range()); + BasicCoordinate<2, elemT> relative_positions; + for (int j=out_at_half.get_min_index() ; j<=out_at_half.get_max_index() ; ++j) + for (int i=out_at_half[j].get_min_index() ; i<=out_at_half[j].get_max_index() ; ++i) + { + relative_positions[1]=j+0.5; + relative_positions[2]=i+0.5; + out_at_half[j][i]=interpolator(relative_positions); + } + dv = (out_at_half - v_at_half)/v_at_half.sum(); + dv *= dv; + + // cout << "Checking BSplines implementation at half way:\n" ; + // cout << "IN: \n" << v_at_half << "OUT: \n" << out_at_half; + std::cout << "The mean deviation from the correct value is: " + << sqrt(dv.sum()/dv.size_all()) << endl; + return + check_if_zero(sqrt(dv.sum()/dv.size_all()), message); + } + + template + bool check_at_half_way(const Array<2,elemT>& v, + const BSplinesRegularGrid<2, elemT, elemT>& interpolator) + { + Array<2,elemT> out(v.get_index_range()); + BasicCoordinate<2, elemT> relative_positions; + for (int j=out.get_min_index() ; j<=out.get_max_index() ; ++j) + for (int i=out[j].get_min_index() ; i<=out[j].get_max_index() ; ++i) + { + relative_positions[1]=j+0.5; + relative_positions[2]=i+0.5; + out[j][i]=interpolator(relative_positions); + } + std::cout << "BSplines implementation at half way:\n" ; + std::cout << "IN: \n" << v << "OUT: \n" << out; + return true; + } + + + template + bool check_coefficients(const Array<2,elemT>& v, + const BSplinesRegularGrid<2, elemT, elemT>& interpolator, + const char * const message) + { + const Array<2,elemT> out=interpolator.get_coefficients(); + // cout << "IN: \n" << v << "Coefficients: \n" << out; + return + check_if_equal(v, out, message); + } + + template + bool check_gradient(const BSplinesRegularGrid& interpolator, + const BasicCoordinate& p, + const char * const message) + { + const elemT epsilon = static_cast(1.E-4); + BasicCoordinate gradient = + interpolator.gradient(p); + const elemT value = + interpolator(p); + BasicCoordinate numerical_gradient; + BasicCoordinate multidim_epsilon; + for (int d=1; d<=num_dimensions; ++d) + { + assign(multidim_epsilon,0); + multidim_epsilon[d]=epsilon; + numerical_gradient[d] = + (interpolator( p+multidim_epsilon) - value) / epsilon; + } + return + this->check_if_equal(gradient, numerical_gradient, message); + } + + + template + bool check_continuity_of_gradient(const BSplinesRegularGrid& interpolator, + const BasicCoordinate& p, + const char * const message) + { + // TODO + return true; + } + }; + + + void BSplinesRegularGrid_Tests::run_tests() + { + cerr << "\nTesting BSplinesRegularGrid class..." << endl; + double test_tolerance = 0.001; + set_tolerance(test_tolerance); + typedef double elemT; + BasicCoordinate<2, elemT> epsilon_1; epsilon_1[1]=-test_tolerance/50; epsilon_1[2]=test_tolerance/50; + BasicCoordinate<2, elemT> epsilon_2; epsilon_2[1]=-test_tolerance/50; epsilon_2[2]=-test_tolerance/50; + BasicCoordinate<2, elemT> epsilon_3; epsilon_3[1]=test_tolerance/50; epsilon_3[2]=-test_tolerance/50; + BasicCoordinate<2, elemT> epsilon_4; epsilon_4[1]=test_tolerance/50; epsilon_4[2]=test_tolerance/50; + + Array<1,elemT> const_1D = make_1d_array(1., 1., 1., 1., 1., 1.); + Array<1,elemT> linear_1D = make_1d_array(1., 2., 3., 4., 5., 6.,7.,8.,9.,10.); + Array<1,elemT> random_1D_1 = make_1d_array(-14., 8., -1., 13., -1., -2., 11., 1., -8.); + Array<1,elemT> random_1D_2 = make_1d_array(6., 11., -14., 6., -3., 10., 1., 7., -2.); + Array<1,elemT> random_1D_3 = make_1d_array(-5., -9., -9., 6., -5., 2., -10., 6., -3.); + Array<1,elemT> random_1D_4 = make_1d_array(11., 8., -1., -1., 12., 11., 11., 3., 1.); + Array<1,elemT> random_1D_5 = make_1d_array(8., -1., 13., -1., -2., 11., 1., -8., -14.); + Array<1,elemT> random_1D_6 = make_1d_array(-14., 8., -1., 13., -1., -2., 1., -8., 11.); + Array<1,elemT> random_1D_7 = make_1d_array(13., -1., -2., -14., 11., 1., -8., 8., -1.); + + Array<2,elemT> const_input_sample = make_array(const_1D, + const_1D, + const_1D, + const_1D, + const_1D, + const_1D); + Array<2,elemT> linear_const_input_sample = make_array(linear_1D, + linear_1D, + linear_1D, + linear_1D, + linear_1D, + linear_1D); + Array<2,elemT> random_input_sample = make_array(random_1D_1, + random_1D_2, + random_1D_3, + random_1D_4, + random_1D_5, + random_1D_6, + random_1D_7); + + + + const int jmax=30, imax=30; + BasicCoordinate<2,int> gauss_min, gauss_max, gauss_min_less, gauss_max_less ; + gauss_min[1]=0; gauss_max[1]=jmax; gauss_min[2]=0; gauss_max[2]=imax; + gauss_min_less[1]=0; gauss_max_less[1]=jmax-1; gauss_min_less[2]=0; gauss_max_less[2]=imax-1; + + IndexRange<2> gaussian_input_sample_range(gauss_min,gauss_max); + Array<2,elemT> gaussian_input_sample(gaussian_input_sample_range); + + IndexRange<2> gaussian_input_sample_range_less(gauss_min_less,gauss_max_less); + Array<2,elemT> gaussian_check_sample(gaussian_input_sample_range_less); + + for (int j=gauss_min[1] ; j<=gauss_max[1] ; ++j) + for (int i=gauss_min[2] ; i<=gauss_max[2] ; ++i) + { + gaussian_input_sample[j][i]= + exp(-((static_cast(i)-10.)*(static_cast(i)-10.)+ + (static_cast(j)-10.)*(static_cast(j)-10.))/400.); + if (j>gauss_max_less[1] || i>gauss_max_less[2]) + continue; + else + gaussian_check_sample[j][i]= + exp(-((static_cast(i)+0.5-10.)*(static_cast(i)+0.5-10.)+ + (static_cast(j)+0.5-10.)*(static_cast(j)+0.5-10.))/400.); + + } + + { + BSplinesRegularGrid<1, elemT> BSplinesRegularGridTest_const(const_1D, cubic); + BSplinesRegularGrid<1, elemT> BSplinesRegularGridTest_linear(linear_1D, cubic); + BSplinesRegularGrid<1, elemT> BSplinesRegularGridTest_random(random_1D_1, cubic); + BSplinesRegularGrid<1, elemT> BSplinesRegularGridTest_gaussian(gaussian_input_sample[14], cubic); + //////// gradient + { + BasicCoordinate<1,pos_type> p; + p[1] = 8.4; check_gradient(BSplinesRegularGridTest_gaussian, p, "gradient of cubic B-spline with Gaussian input"); + p[1] = 4.4; check_gradient(BSplinesRegularGridTest_gaussian, p, "gradient of cubic B-spline with Gaussian input"); + p[1] = 3.4; check_gradient(BSplinesRegularGridTest_linear, p, "gradient of cubic B-spline with linear input"); + p[1] = 2.4; check_gradient(BSplinesRegularGridTest_const, p, "gradient of cubic B-spline with const input"); + } + + } + { + cerr << "\nTesting BSplinesRegularGrid: Nearest Neighbour values and constructor using a 2D array as input..." << endl; + { + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_const( + const_input_sample, near_n); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_linear_const( + linear_const_input_sample, near_n); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, near_n); + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for nearest interpolation"); + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for nearest interpolation"); + // check_at_half_way(const_input_sample, BSplinesRegularGridTest_const); + check_at_sample_points(linear_const_input_sample, BSplinesRegularGridTest_linear_const, + "check BSplines implementation for nearest interpolation"); + // check_at_half_way(linear_const_input_sample, BSplinesRegularGridTest_linear_const); + check_at_sample_points(random_input_sample, BSplinesRegularGridTest_random, + "check BSplines implementation for nearest interpolation"); + // check_at_half_way(random_input_sample, BSplinesRegularGridTest_random); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_1, "Check BSplines implementation for nearest neighbour interpolation near samples: random test case 1"); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_2, "Check BSplines implementation for nearest neighbour interpolation near samples: random test case 2"); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_3, "Check BSplines implementation for nearest neighbour interpolation near samples: random test case 3"); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_4, "Check BSplines implementation for nearest neighbour interpolation near samples: random test case 4"); + } + } + { + cerr << "\nTesting BSplinesRegularGrid: linear interpolation values and constructor using a 2D array as input..." << endl; + { + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_const( + const_input_sample, linear); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_linear_const( + linear_const_input_sample, linear); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, linear); + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for linear interpolation"); + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for linear interpolation"); + // check_at_half_way(const_input_sample, BSplinesRegularGridTest_const); + check_at_sample_points(linear_const_input_sample, BSplinesRegularGridTest_linear_const, + "check BSplines implementation for linear interpolation"); + // check_at_half_way(linear_const_input_sample, BSplinesRegularGridTest_linear_const); + check_at_sample_points(random_input_sample, BSplinesRegularGridTest_random, + "check BSplines implementation for linear interpolation"); + // check_at_half_way(random_input_sample, BSplinesRegularGridTest_random); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_1, "Check BSplines implementation for linear interpolation near samples: random test case 1"); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_2, "Check BSplines implementation for linear interpolation near samples: random test case 2"); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_3, "Check BSplines implementation for linear interpolation near samples: random test case 3"); + check_near_sample_points(random_input_sample, BSplinesRegularGridTest_random, + epsilon_4, "Check BSplines implementation for linear interpolation near samples: random test case 4"); + } + } + { + cerr << "\nTesting BSplinesRegularGrid: quadratic interpolation values and constructor using a 2D array as input..." << endl; + { + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_const( + const_input_sample, quadratic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_linear_const( + linear_const_input_sample, quadratic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, quadratic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_gaussian( + gaussian_input_sample, quadratic); + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for quadratic interpolation"); + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for quadratic interpolation"); + // check_at_half_way(const_input_sample, BSplinesRegularGridTest_const); + check_at_sample_points(linear_const_input_sample, BSplinesRegularGridTest_linear_const, + "check BSplines implementation for quadratic interpolation"); + // check_at_half_way(linear_const_input_sample, BSplinesRegularGridTest_linear_const); + check_at_sample_points(random_input_sample, BSplinesRegularGridTest_random, + "check BSplines implementation for quadratic interpolation"); + // check_at_half_way(random_input_sample, BSplinesRegularGridTest_random); + check_at_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + "check BSplines implementation for quadratic interpolation"); + + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_1, "Check BSplines implementation for quadratic interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_2, "Check BSplines implementation for quadratic interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_3, "Check BSplines implementation for quadratic interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_4, "Check BSplines implementation for quadratic interpolation near samples"); + check_at_half_way(gaussian_input_sample, gaussian_check_sample, + BSplinesRegularGridTest_gaussian, + "check BSplines implementation for quadratic interpolation.\nProblems at half way!"); + } + } + { + cerr << "\nTesting BSplinesRegularGrid: Cubic interpolation values and constructor using a 2D array as input..." << endl; + { + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_const( + const_input_sample, cubic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_linear_const( + linear_const_input_sample, cubic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, cubic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_gaussian( + gaussian_input_sample, cubic); + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for cubic interpolation"); + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for cubic interpolation"); + // check_at_half_way(const_input_sample, BSplinesRegularGridTest_const); + check_at_sample_points(linear_const_input_sample, BSplinesRegularGridTest_linear_const, + "check BSplines implementation for cubic interpolation"); + // check_at_half_way(linear_const_input_sample, BSplinesRegularGridTest_linear_const); + check_at_sample_points(random_input_sample, BSplinesRegularGridTest_random, + "check BSplines implementation for cubic interpolation"); + // check_at_half_way(random_input_sample, BSplinesRegularGridTest_random); + + check_at_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + "check BSplines implementation for cubic interpolation"); + + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_1, "Check BSplines implementation for cubic interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_2, "Check BSplines implementation for cubic interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_3, "Check BSplines implementation for cubic interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_4, "Check BSplines implementation for cubic interpolation near samples"); + + check_at_half_way(gaussian_input_sample, gaussian_check_sample, + BSplinesRegularGridTest_gaussian, + "check BSplines implementation for cubic interpolation.\nProblems at half way!"); + + + //////// gradient + { + + check_gradient(BSplinesRegularGridTest_gaussian, Coordinate2D(1.1,2.2), "cubic-spline gradient: Gaussian test-case 1"); + check_gradient(BSplinesRegularGridTest_gaussian, Coordinate2D(3.1,4.2), "cubic-spline gradient: Gaussian test-case 2"); + check_gradient(BSplinesRegularGridTest_linear_const, Coordinate2D(3.1,4.2), "cubic-spline gradient: test-case linear const"); + } + + } + } + { + cerr << "\nTesting BSplinesRegularGrid: oMoms interpolation values and constructor using a 2D array as input..." << endl; + { + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_const( + const_input_sample, oMoms); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_linear_const( + linear_const_input_sample, oMoms); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, oMoms); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_gaussian( + gaussian_input_sample, oMoms); + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for oMoms interpolation"); + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for oMoms interpolation"); + // check_at_half_way(const_input_sample, BSplinesRegularGridTest_const); + check_at_sample_points(linear_const_input_sample, BSplinesRegularGridTest_linear_const, + "check BSplines implementation for oMoms interpolation"); + // check_at_half_way(linear_const_input_sample, BSplinesRegularGridTest_linear_const); + check_at_sample_points(random_input_sample, BSplinesRegularGridTest_random, + "check BSplines implementation for oMoms interpolation"); + // check_at_half_way(random_input_sample, BSplinesRegularGridTest_random); + + check_at_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + "check BSplines implementation for oMoms interpolation"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_1, "Check BSplines implementation for oMoms interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_2, "Check BSplines implementation for oMoms interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_3, "Check BSplines implementation for oMoms interpolation near samples"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_4, "Check BSplines implementation for oMoms interpolation near samples"); + + check_at_half_way(gaussian_input_sample, gaussian_check_sample, + BSplinesRegularGridTest_gaussian, + "check BSplines implementation for oMoms interpolation.\nProblems at half way!"); + } + } + { + cerr << "\nTesting BSplinesRegularGrid: Linear-Cubic interpolation values and constructor using a 2D array as input..." << endl; + { + BasicCoordinate<2,BSpline::BSplineType> linear_cubic; + + linear_cubic[1]=linear; + linear_cubic[2]=cubic; + + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_const( + const_input_sample, linear_cubic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_linear_const( + linear_const_input_sample, linear_cubic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, linear_cubic); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest_gaussian( + gaussian_input_sample, linear_cubic); + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for linear_cubic interpolation"); + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for linear_cubic interpolation"); + // check_at_half_way(const_input_sample, BSplinesRegularGridTest_const); + check_at_sample_points(linear_const_input_sample, BSplinesRegularGridTest_linear_const, + "check BSplines implementation for linear_cubic interpolation"); + // check_at_half_way(linear_const_input_sample, BSplinesRegularGridTest_linear_const); + check_at_sample_points(random_input_sample, BSplinesRegularGridTest_random, + "check BSplines implementation for linear_cubic interpolation"); + // check_at_half_way(random_input_sample, BSplinesRegularGridTest_random); + + check_at_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + "check BSplines implementation for linear_cubic interpolation"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_1, "Check BSplines implementation for linear-cubic interpolation near samples: gaussian test 1"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_2, "Check BSplines implementation for linear-cubic interpolation near samples: gaussian test 2"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_3, "Check BSplines implementation for linear-cubic interpolation near samples: gaussian test 3"); + check_near_sample_points(gaussian_input_sample, BSplinesRegularGridTest_gaussian, + epsilon_4, "Check BSplines implementation for linear-cubic interpolation near samples: gaussian test 4"); + + check_at_half_way(gaussian_input_sample, gaussian_check_sample, + BSplinesRegularGridTest_gaussian, + "check BSplines implementation for linear_cubic interpolation.\nProblems at half way!"); + } + } + /* { + cerr << "\nTesting BSplinesRegularGrid: Linear interpolation values and constructor using a 2D diamond array as input..." << endl; + Array<1,elemT> random_1D_1 = make_1d_array(-14., 8., -1., 13., -1., -2., 11., 1., -8.); + Array<1,elemT> random_1D_2 = make_1d_array(6., 11., -14., 6., -3., 10., 1.); + Array<1,elemT> random_1D_3 = make_1d_array(-5., -9., -9., 6., -5.); + Array<2,elemT> nonsquare = make_array(random_1D_1,random_1D_2,random_1D_3); + BSplinesRegularGrid<2, elemT, elemT> BSplinesRegularGridTest( + nonsquare, linear); + + check_at_sample_points(const_input_sample, BSplinesRegularGridTest, + "check BSplines implementation for cubic interpolation no square"); + }*/ + } + +} // end namespace BSpline + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 1) + { + cerr << "Usage : " << argv[0] << " \n"; + return EXIT_FAILURE; + } + BSpline::BSplinesRegularGrid_Tests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/numerics/test_BSplinesRegularGrid1D.cxx b/src/test/numerics/test_BSplinesRegularGrid1D.cxx new file mode 100644 index 0000000000..6e62cd70a3 --- /dev/null +++ b/src/test/numerics/test_BSplinesRegularGrid1D.cxx @@ -0,0 +1,286 @@ +/* + Copyright (C) 2005- 2009-10-27, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_test + \brief tests the stir::BSplinesRegularGrid class for the stir::Array 1D case + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ +#include "stir/RunTests.h" +#include "stir/Array.h" +#include "stir/make_array.h" +#include "stir/numerics/BSplines.h" +#include "stir/numerics/BSplinesRegularGrid.h" +#include +#include "stir/stream.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif +START_NAMESPACE_STIR +namespace BSpline { + /*! + \ingroup numerics_test + \brief A simple class to test the BSplinesRegularGrid class for 1D arrays + */ + class BSplinesRegularGrid1D_Tests : public RunTests + { + public: + BSplinesRegularGrid1D_Tests() + {} + void run_tests(); + private: + template + bool check_at_sample_points(const Array<1,elemT>& v, + BSplinesRegularGrid<1, elemT, elemT>& interpolator, + const char * const message) + { + IndexRange<1> out_range(static_cast(v.size())); + Array<1,elemT> out(out_range); + BasicCoordinate<1, elemT> relative_positions; + for (int i=0, imax=static_cast(v.size()); i + bool check_coefficients(const Array<1,elemT>& v, + BSplinesRegularGrid<1, elemT, elemT>& interpolator, + const char * const message) + { + IndexRange<1> out_range(static_cast(v.size())); + Array<1,elemT> out(out_range); + out=interpolator.get_coefficients(); + std::cout << "IN: " << v << "Coefficients: " << out; + return + check_if_equal(v, out, message); + } + }; + + void BSplinesRegularGrid1D_Tests::run_tests() + { + cerr << "\nTesting BSplinesRegularGrid class..." << endl; + set_tolerance(0.001); + typedef double elemT; + Array<1,elemT> const_input_sample = make_1d_array(1., 1., 1., 1., 1., 1.); + Array<1,elemT> linear_input_sample = make_1d_array(1., 2., 3., 4., 5., 6.); + Array<1,elemT> random_input_sample = make_1d_array(-14., 8., -1., 13., -1., -2., 11., 1., -8.); + { + cerr << "\nTesting BSplinesRegularGrid: Nearest Neighbour values and constructor using an 1D array as input..." << endl; + { + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_const( + const_input_sample, near_n); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_linear( + linear_input_sample, near_n); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, near_n); + BasicCoordinate<1,elemT> relative_positions; + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for nearest interpolation"); + + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for nearest interpolation"); + cerr << "At half points: " ; + for (int i=0, imax=static_cast(const_input_sample.size()); i(linear_input_sample.size()); i BSplinesRegularGridTest_const( + const_input_sample, linear); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_linear( + linear_input_sample, linear); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, linear); + BasicCoordinate<1,elemT> relative_positions; + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for linear interpolation"); + + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for linear interpolation"); + cerr << "At half points: " ; + for (int i=0, imax=static_cast(const_input_sample.size()); i(linear_input_sample.size()); i BSplinesRegularGridTest_const( + const_input_sample, quadratic); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_linear( + linear_input_sample, quadratic); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, quadratic); + BasicCoordinate<1,elemT> relative_positions; + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for quadratic interpolation"); + + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for quadratic interpolation"); + cerr << "At half points: " ; + for (std::size_t i=0, imax=const_input_sample.size(); i BSplinesRegularGridTest_const( + const_input_sample, cubic); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_linear( + linear_input_sample, cubic); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, cubic); + BasicCoordinate<1,elemT> relative_positions; + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for cubic interpolation"); + + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for cubic interpolation"); + cerr << "At half points: " ; + for (std::size_t i=0, imax=const_input_sample.size(); i BSplinesRegularGridTest_const( + const_input_sample, oMoms); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_linear( + linear_input_sample, oMoms); + BSplinesRegularGrid<1, elemT, elemT> BSplinesRegularGridTest_random( + random_input_sample, oMoms); + BasicCoordinate<1,elemT> relative_positions; + + check_coefficients(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for oMoms interpolation"); + + check_at_sample_points(const_input_sample, BSplinesRegularGridTest_const, + "check BSplines implementation for oMoms interpolation"); + cerr << "At half points: " ; + for (std::size_t i=0, imax=const_input_sample.size(); i +#include + + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup numerics_test + \brief A simple class to test the IIR_filter and FIR_filter function. +*/ +class IR_filterTests : public RunTests +{ +public: + IR_filterTests() + {} + void run_tests(); +private: + //istream& in; +}; + + +void IR_filterTests::run_tests() +{ + cerr << "Testing IR_filter function..." << endl; + + set_tolerance(0.001); + + std::vector input_test_signal, input_factors, poles, + output_FIR_test_value, output_IIR_test_value, + stir_FIR_output, stir_IIR_output; + + for (int i=1, imax=11; i:: iterator cur_iter_stir_out= stir_FIR_output.begin(), + cur_iter_FIR_out= output_FIR_test_value.begin(); + + for (; + cur_iter_stir_out!=stir_FIR_output.end() + && + cur_iter_FIR_out!=output_FIR_test_value.end(); + ++cur_iter_stir_out, ++cur_iter_FIR_out) + check_if_equal(*cur_iter_stir_out, *cur_iter_FIR_out, + "check FIR filter implementation"); + } + { + cerr << "Testing IIR_filter function..." << endl; + IIR_filter(stir_IIR_output.begin(), stir_IIR_output.end(), + input_test_signal.begin(), input_test_signal.end(), + input_factors.begin(), input_factors.end(), + poles.begin(), poles.end(),0); + std::vector:: iterator cur_iter_stir_IIR_out= + stir_IIR_output.begin(), + cur_iter_IIR_out= output_IIR_test_value.begin(); + for (; + cur_iter_stir_IIR_out!=stir_IIR_output.end() + && + cur_iter_IIR_out!=output_IIR_test_value.end(); + ++cur_iter_stir_IIR_out, ++cur_iter_IIR_out) + check_if_equal(*cur_iter_stir_IIR_out, *cur_iter_IIR_out, + "check IIR filter implementation"); + } +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 1) + { + cerr << "Usage : " << argv[0] << " \n"; + return EXIT_FAILURE; + } + IR_filterTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/numerics/test_erf.cxx b/src/test/numerics/test_erf.cxx new file mode 100644 index 0000000000..f7ca4f2a78 --- /dev/null +++ b/src/test/numerics/test_erf.cxx @@ -0,0 +1,130 @@ +// +// +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_test + \brief tests the error function stir::erf and its complementary + + \author Charalampos Tsoumpas + +*/ + +#include "stir/RunTests.h" +#include "stir/numerics/erf.h" +#include + +START_NAMESPACE_STIR + +/*! + \ingroup numerics_test + \brief A simple class to test the erf and erfc functions. +*/ +class erfTests : public RunTests +{ +public: + erfTests() + {} + void run_tests(); +private: + //istream& in; +}; + + +void erfTests::run_tests() +{ + std::cerr << "Testing Error Functions..." << std::endl; + + set_tolerance(0.000000000000001); + + //std::vector input, mathematica_results, STIR_results; + + { + + std::vector input_vector(10), + output_correct_vector(10), output_correct_vector_c(10), + STIR_vector(10), STIR_vector_c(10); + + output_correct_vector[0] = 0.0000000000000000000000000000000; + output_correct_vector[1] = 0.0112834155558496169159095235481; + output_correct_vector[2] = 0.0225645746918449442243658616474; + output_correct_vector[3] = 0.0338412223417354333022166542569; + output_correct_vector[4] = 0.0451111061451247520897490647292; + output_correct_vector[5] = 0.0563719777970166238312711126020; + output_correct_vector[6] = 0.0676215943933084420794314523912; + output_correct_vector[7] = 0.0788577197708907433569970386680; + output_correct_vector[8] = 0.0900781258410181607233921876161; + output_correct_vector[9] = 0.101280593914626883352498163244; + + output_correct_vector_c[0] = 1.00000000000000000000000000000; + output_correct_vector_c[1] = 0.988716584444150383084090476452; + output_correct_vector_c[2] = 0.977435425308155055775634138353; + output_correct_vector_c[3] = 0.966158777658264566697783345743; + output_correct_vector_c[4] = 0.954888893854875247910250935271; + output_correct_vector_c[5] = 0.943628022202983376168728887398; + output_correct_vector_c[6] = 0.932378405606691557920568547609; + output_correct_vector_c[7] = 0.921142280229109256643002961332; + output_correct_vector_c[8] = 0.909921874158981839276607812384; + output_correct_vector_c[9] = 0.898719406085373116647501836756; + + + for (int i=0 ; i<10 ; ++i) + { + input_vector[i] = 0.01*(static_cast(i)); + STIR_vector[i] = erf(input_vector[i]); + STIR_vector_c[i] = erfc(input_vector[i]); + } + std::vector:: iterator cur_iter_cor = output_correct_vector.begin(), + cur_iter_cor_c = output_correct_vector_c.begin(), + cur_iter_STIR = STIR_vector.begin(), + cur_iter_STIR_c = STIR_vector_c.begin(); + + for (cur_iter_STIR = STIR_vector.begin(); + cur_iter_STIR!=STIR_vector.end() && cur_iter_cor!=output_correct_vector.end(); + ++cur_iter_STIR, ++cur_iter_cor) + check_if_equal(*cur_iter_cor, *cur_iter_STIR, + "check erf() implementation"); + for (; + cur_iter_STIR_c!=STIR_vector_c.end() && cur_iter_cor_c!=output_correct_vector_c.end(); + ++cur_iter_STIR_c, ++cur_iter_cor_c) + check_if_equal(*cur_iter_cor_c, *cur_iter_STIR_c, + "check erfc() implementation"); + + for (cur_iter_STIR_c = STIR_vector_c.begin(), cur_iter_STIR = STIR_vector.begin(); + cur_iter_STIR!=STIR_vector.end() && + cur_iter_STIR_c!=STIR_vector_c.end(); + ++cur_iter_STIR, ++cur_iter_STIR_c) + check_if_equal(1.0, (*cur_iter_STIR_c) + (*cur_iter_STIR), + "check erfc() and erf() results"); + } +} + +END_NAMESPACE_STIR +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 1) + { + std::cerr << "Usage : " << argv[0] << " \n"; + return EXIT_FAILURE; + } + erfTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/numerics/test_integrate_discrete_function.cxx b/src/test/numerics/test_integrate_discrete_function.cxx new file mode 100644 index 0000000000..1ddb5d9e44 --- /dev/null +++ b/src/test/numerics/test_integrate_discrete_function.cxx @@ -0,0 +1,124 @@ +// +// +/*! + \file + \ingroup numerics_test + \brief Test stir::integrate_discrete_function + \author Charalampos Tsoumpas +*/ +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_test + \brief tests the integrate_discrete_function function +*/ + +#include "stir/RunTests.h" +#include +#include "stir/numerics/integrate_discrete_function.h" + +START_NAMESPACE_STIR + +/*! + \ingroup numerics_test + \brief A simple class to test the integrate_discrete_function function. +*/ +class integrate_discrete_functionTests : public RunTests +{ +public: + integrate_discrete_functionTests() + {} + void run_tests(); +}; + + +void integrate_discrete_functionTests::run_tests() +{ + std::cerr << "Testing integrate_discrete_function..." << std::endl; + + { + set_tolerance(0.000001); + + // Give a simple linear function. The analytical estimation of the integral is E=(tmax-tmin)*(fmax+fmin)/2 + const int Nmin=2; + const int Nmax=333; + + const float tmin=12; + const float tmax=123; + const float fmin=113; + const float fmax=1113; + + const float cor_integral_value=(tmax-tmin)*(fmax+fmin)*0.5; + std::vector input_vector_f(Nmax-Nmin+1), input_vector_t(Nmax-Nmin+1); + + for (int i=0;i<=Nmax-Nmin;++i) + { + input_vector_t[i]=tmin+i*(tmax-tmin)/(Nmax-Nmin); + input_vector_f[i]=fmin+i*(fmax-fmin)/(Nmax-Nmin); + } + + check_if_equal(integrate_discrete_function(input_vector_t,input_vector_f,0),cor_integral_value, + "check integrate_discrete_function implementation for linear function using rectangular approximation"); + check_if_equal(integrate_discrete_function(input_vector_t,input_vector_f), cor_integral_value, + "check integrate_discrete_function implementation for linear function using trapezoidal approximation"); + } + + // quadratic + { + std::vector coords(100); + std::vector values(100); + + // make non-uniform sampling + int i=0; + for (i=0; i<=50; ++i) + coords[i]=2*(i-50); + for (; i<=70; ++i) + coords[i]=coords[i-1]+1; + for (; i<100; ++i) + coords[i]=coords[i-1]+1.5; + + // fill values + for (i=0; i<100; ++i) + values[i]=2*coords[i]*coords[i]- 5*coords[i]+7; + + const double analytic_result = + (2*coords[99]*coords[99]*coords[99]/3 - 5*coords[0]*coords[99]/2+7*coords[99]) - + (2*coords[0]*coords[0]*coords[0]/3 - 5*coords[0]*coords[0]/2+7*coords[0]); + double stir_result=integrate_discrete_function(coords, values,1); + set_tolerance(.03); // expected accuracy is 3% + check_if_equal(stir_result, analytic_result, "check integrate_discrete_function implementation for quadratic function using trapezoidal approximation"); + stir_result=integrate_discrete_function(coords, values, 0); + set_tolerance(.03); + check_if_equal(stir_result, analytic_result, "check integrate_discrete_function implementation for linear function using rectangular approximation"); + } +} + +END_NAMESPACE_STIR +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 1) + { + std::cerr << "Usage : " << argv[0] << " \n"; + return EXIT_FAILURE; + } + integrate_discrete_functionTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/numerics/test_matrices.cxx b/src/test/numerics/test_matrices.cxx new file mode 100644 index 0000000000..a5fd1396e7 --- /dev/null +++ b/src/test/numerics/test_matrices.cxx @@ -0,0 +1,374 @@ +/* + Copyright (C) 2005, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_test + + \brief tests for functions in MatrixFunction.h etc. + + \author Kris Thielemans +*/ +#include "stir/numerics/max_eigenvector.h" +#include "stir/numerics/norm.h" +#include "stir/make_array.h" +#include "stir/Array_complex_numbers.h" +#include "stir/more_algorithms.h" +#include "stir/Coordinate2D.h" +#include "stir/Coordinate3D.h" +#include "stir/Succeeded.h" +#include "stir/RunTests.h" +#include "stir/stream.h" +#include +#include +# ifdef BOOST_NO_STDC_NAMESPACE + namespace std { using ::sqrt; using ::sin; using ::cos} +# endif + +START_NAMESPACE_STIR + + +/*! + \brief Tests MatrixFunction.h functionality + \ingroup test_numerics + +*/ +class MatrixTests : public RunTests +{ +public: + void run_tests(); +private: + void run_tests_1D(); + void run_tests_2D(); + void run_tests_max_eigenvector(); +}; + +// local function, copied from the Shape library +// takes Euler angles and make an orthogonal matrix +// note that because of STIR conventions, this matrix has determinant -1. +static +Array<2,float> +make_orthogonal_matrix(const float alpha, const float beta, const float gamma) +{ + return + make_array(make_1d_array( + std::sin(beta)*std::sin(gamma), + std::cos(gamma)*std::sin(alpha) + std::cos(alpha)*std::cos(beta)*std::sin(gamma), + std::cos(alpha)*std::cos(gamma) - std::cos(beta)*std::sin(alpha)*std::sin(gamma)), + make_1d_array( + std::cos(gamma)*std::sin(beta), + std::cos(alpha)*std::cos(beta)*std::cos(gamma) - std::sin(alpha)*std::sin(gamma), + -(std::cos(beta)*std::cos(gamma)*std::sin(alpha)) - std::cos(alpha)*std::sin(gamma)), + make_1d_array( + std::cos(beta), + -(std::cos(alpha)*std::sin(beta)), + std::sin(alpha)*std::sin(beta)) + ); +} + +void +MatrixTests:: +run_tests() +{ + std::cerr << "Testing numerics/MatrixFunction.h functions\n"; + run_tests_1D(); + run_tests_2D(); + run_tests_max_eigenvector(); +} + +void +MatrixTests:: +run_tests_1D() +{ + std::cerr << "Testing 1D stuff" << std::endl; + + { + const Array<1,float> v = make_1d_array(1.F,2.F,3.F,-5.F); + check_if_equal(norm(v),static_cast(std::sqrt(square(1.F)+square(2)+square(3)+square(5))), + "norm of float array"); + check_if_equal(inner_product(v,v),square(1.F)+square(2)+square(3)+square(5), + "inner_product of float array with itself"); + const Array<1,float> v2 = make_1d_array(7.F,8.F,3.3F,-5.F); + check_if_equal(inner_product(v,v2),1.F*7+2*8+3*3.3F+25, + "inner_product of float arrays"); + } + { + typedef std::complex complex_t; + const Array<1,complex_t > v = make_1d_array(complex_t(1.F,0.F), + complex_t(2.F,-3.F)); + check_if_equal(norm(v),static_cast(std::sqrt(square(1.F)+square(2)+square(3))), + "norm of complex array"); + check_if_equal(inner_product(v,v), + complex_t(square(1.F)+square(2)+square(3),0.F), + "inner_product of complex array with itself"); + const Array<1,complex_t > v2 = make_1d_array(complex_t(1.F,1.F), + complex_t(4.F,5.F)); + check_if_equal(inner_product(v,v2), + std::conj(v[0])*v2[0]+std::conj(v[1])*v2[1], + "inner_product of complex arrays"); + } +} + +void +MatrixTests:: +run_tests_2D() +{ + std::cerr << "Testing 2D stuff" << std::endl; + const Array<2,float> m1 = + make_array(make_1d_array(3.F,4.F), + make_1d_array(5.F,6.F), + make_1d_array(1.5F,-4.6F)); + // matrix*vector + { + const Array<1,float> v = make_1d_array(1.F,2.F); + check_if_equal(matrix_multiply(m1,v), + make_1d_array(m1[0][0]*v[0]+m1[0][1]*v[1], + m1[1][0]*v[0]+m1[1][1]*v[1], + m1[2][0]*v[0]+m1[2][1]*v[1]), + "matrix times vector"); + } + // matrix*matrix + { + const Array<2,float> m2 = + make_array(make_1d_array(1.F,4.3F,6.F,8.F), + make_1d_array(-5.F,6.5F,2.F,5.F)); + check_if_equal(matrix_multiply(m1,m2), + make_array(make_1d_array(m1[0][0]*m2[0][0]+m1[0][1]*m2[1][0], + m1[0][0]*m2[0][1]+m1[0][1]*m2[1][1], + m1[0][0]*m2[0][2]+m1[0][1]*m2[1][2], + m1[0][0]*m2[0][3]+m1[0][1]*m2[1][3]), + make_1d_array(m1[1][0]*m2[0][0]+m1[1][1]*m2[1][0], + m1[1][0]*m2[0][1]+m1[1][1]*m2[1][1], + m1[1][0]*m2[0][2]+m1[1][1]*m2[1][2], + m1[1][0]*m2[0][3]+m1[1][1]*m2[1][3]), + make_1d_array(m1[2][0]*m2[0][0]+m1[2][1]*m2[1][0], + m1[2][0]*m2[0][1]+m1[2][1]*m2[1][1], + m1[2][0]*m2[0][2]+m1[2][1]*m2[1][2], + m1[2][0]*m2[0][3]+m1[2][1]*m2[1][3])), + "matrix times matrix"); + } + + // transpose + { + const Array<2,float> m1_trans = + make_array(make_1d_array(m1[0][0],m1[1][0],m1[2][0]), + make_1d_array(m1[0][1],m1[1][1],m1[2][1])); + check_if_equal(matrix_transpose(m1), m1_trans, + "matrix transposition"); + } + // diagonal_matrix + { + const Array<2,float> d = + diagonal_matrix(2, 3.F); + check_if_equal(d, + make_array(make_1d_array(3.F,0.F), + make_1d_array(0.F,3.F)), + "diagonal_matrix with all diag-elems equal"); + const Array<2,float> d2 = + diagonal_matrix(Coordinate2D(3.F,4.F)); + check_if_equal(d2, + make_array(make_1d_array(3.F,0.F), + make_1d_array(0.F,4.F)), + "diagonal_matrix with differing diag-elems"); + } + +} + + +void +MatrixTests:: +run_tests_max_eigenvector() +{ + std::cerr << "Testing max_eigenvector stuff" << std::endl; + set_tolerance(.01); + float max_eigenvalue; + Array<1,float> max_eigenvector; + { + { + const Array<2,float> d = + diagonal_matrix(Coordinate3D(3.F,4.F,-2.F)); + Succeeded success = + absolute_max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + d, + make_1d_array(1.F,2.F,3.F), + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "abs_max_using_power: succeeded (float diagonal matrix)"); + + check_if_equal(max_eigenvalue, 4.F, + "abs_max_using_power: eigenvalue (float diagonal matrix)"); + check_if_equal(max_eigenvector, make_1d_array(0.F,1.F,0.F), + "abs_max_using_power: eigenvector (float diagonal matrix)"); + success = + absolute_max_eigenvector_using_shifted_power_method(max_eigenvalue, + max_eigenvector, + d, + make_1d_array(1.F,2.F,3.F), + .5F, // note: shift should be small enough that it doesn't make the most negative eigenvalue 'larger' + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "abs_max_using_shifted_power: succeeded (float diagonal matrix)"); + + check_if_equal(max_eigenvalue, 4.F, + "abs_max_using_shifted_power: eigenvalue (float diagonal matrix)"); + check_if_equal(max_eigenvector, make_1d_array(0.F,1.F,0.F), + "abs_max_using_shifted_power: eigenvector (float diagonal matrix)"); + + success = + max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + d, + make_1d_array(1.F,-2.F,-3.F), + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "max_using_power: succeeded (float diagonal matrix)"); + + check_if_equal(max_eigenvalue, 4.F, + "max_using_power: eigenvalue (float diagonal matrix)"); + check_if_equal(max_eigenvector, make_1d_array(0.F,1.F,0.F), + "max_using_power: eigenvector (float diagonal matrix)"); + + success = + max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + Array<2,float>(d*(-1.F)), + make_1d_array(1.F,2.F,3.F), + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "max_using_power: succeeded (float diagonal matrix with large negative value)"); + + check_if_equal(max_eigenvalue, 2.F, + "max_using_power: eigenvalue (float diagonal matrix with large negative value)"); + check_if_equal(max_eigenvector, make_1d_array(0.F,0.F,1.F), + "max_using_power: eigenvector (float diagonal matrix with large negative value)"); + } + } + + { + const float pi2=static_cast(_PI/2); + const Array<2,float> rotation = + // make_orthogonal_matrix(.2F,.4F,-1.F); + make_orthogonal_matrix(pi2,pi2,pi2); + std::cerr << rotation; + check_if_equal(matrix_multiply(rotation, matrix_transpose(rotation)), + diagonal_matrix(3,1.F), + "construct orthogonal matrix O.O^t"); + check_if_equal(matrix_multiply(matrix_transpose(rotation), rotation), + diagonal_matrix(3,1.F), + "construct orthogonal matrix O^t.O"); + + const Array<2,float> d = + diagonal_matrix(Coordinate3D(3.F,4.F,-2.F)); + + const Array<2,float> m = + matrix_multiply(rotation, matrix_multiply(d, matrix_transpose(rotation))); + Array<1,float> the_max_eigenvector = + matrix_multiply(rotation,make_1d_array(0.F,1.F,0.F)); + the_max_eigenvector /= (*abs_max_element(the_max_eigenvector.begin(), the_max_eigenvector.end())); + + // now repetition of tests with diagonal matrix + Succeeded success = + absolute_max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + m, + make_1d_array(1.F,2.F,3.F), + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "abs_max_using_power: succeeded (float non-diagonal matrix)"); + + check_if_equal(max_eigenvalue, 4.F, + "abs_max_using_power: eigenvalue (float non-diagonal matrix)"); + check_if_equal(max_eigenvector, the_max_eigenvector, + "abs_max_using_power: eigenvector (float non-diagonal matrix)"); + success = + absolute_max_eigenvector_using_shifted_power_method(max_eigenvalue, + max_eigenvector, + m, + make_1d_array(1.F,2.F,3.F), + .5F, // note: shift should be small enough that it doesn't make the most negative eigenvalue 'larger' + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "abs_max_using_shifted_power: succeeded (float non-diagonal matrix)"); + + check_if_equal(max_eigenvalue, 4.F, + "abs_max_using_shifted_power: eigenvalue (float non-diagonal matrix)"); + check_if_equal(max_eigenvector, the_max_eigenvector, + "abs_max_using_shifted_power: eigenvector (float non-diagonal matrix)"); + + success = + max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + m, + make_1d_array(1.F,-2.F,-3.F), + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "max_using_power: succeeded (float non-diagonal matrix)"); + + check_if_equal(max_eigenvalue, 4.F, + "max_using_power: eigenvalue (float non-diagonal matrix)"); + check_if_equal(max_eigenvector, the_max_eigenvector, + "max_using_power: eigenvector (float non-diagonal matrix)"); + + success = + max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + Array<2,float>(m*(-1.F)), + make_1d_array(1.F,2.F,3.F), + /*tolerance=*/ .001, + 1000UL); + check(success == Succeeded::yes, + "max_using_power: succeeded (float non-diagonal matrix with large negative value)"); + + check_if_equal(max_eigenvalue, 2.F, + "max_using_power: eigenvalue (float non-diagonal matrix with large negative value)"); + check_if_equal(max_eigenvector, matrix_multiply(rotation,make_1d_array(0.F,0.F,1.F)), + "max_using_power: eigenvector (float non-diagonal matrix with large negative value)"); + } + + { + // now test for a case where the power-method fails + const Array<2,float> d = + diagonal_matrix(Coordinate2D(3.F,-3.F)); + Succeeded success = + absolute_max_eigenvector_using_power_method(max_eigenvalue, + max_eigenvector, + d, + make_1d_array(1.F,2.F), + /*tolerance=*/ .001, + 100UL); + check(success == Succeeded::no, + "abs_max_using_power should have failed (float diagonal matrix with opposite max eigenvalues)"); + } +} + +END_NAMESPACE_STIR + + +int main() +{ + stir::MatrixTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/numerics/test_overlap_interpolate.cxx b/src/test/numerics/test_overlap_interpolate.cxx new file mode 100644 index 0000000000..e9438de93d --- /dev/null +++ b/src/test/numerics/test_overlap_interpolate.cxx @@ -0,0 +1,304 @@ +/* + Copyright (C) 2005- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup numerics_test + + \brief Test program for stir::overlap_interpolate + + \author Kris Thielemans +*/ +#include "stir/Array.h" +#include "stir/make_array.h" +#include "stir/RunTests.h" +#include "stir/numerics/overlap_interpolate.h" +#include "stir/stream.h" +#include "stir/Succeeded.h" +#include "boost/lambda/lambda.hpp" +#include +#include +#include + +START_NAMESPACE_STIR + + +/*! + \brief Test class for stir::overlap_interpolate + \ingroup numerics_test + +*/ +class overlap_interpolateTests : public RunTests +{ +public: + void run_tests(); +private: +#ifndef STIR_OVERLAP_NORMALISATION + template + static + void + divide_by_out_size( + ValueT& outvalues, + const BoundaryT& outboundaries) + { + typename ValueT::iterator iter = outvalues.begin(); + typename BoundaryT::const_iterator bound_iter = outboundaries.begin(); + for (; iter != outvalues.end(); ++iter, ++bound_iter) + { + *iter /= (*(bound_iter+1)) - (*bound_iter); + } + } +#endif + + template + Succeeded + test_case(const ValueT& invalues, + const BoundaryT& inboundaries, + const ValueT& outvalues, + const BoundaryT& outboundaries, + const char * const description) + { + ValueT my_outvalues = outvalues; + overlap_interpolate(my_outvalues.begin(), my_outvalues.end(), + outboundaries.begin(), outboundaries.end(), + invalues.begin(), invalues.end(), + inboundaries.begin(), inboundaries.end()); +#ifndef STIR_OVERLAP_NORMALISATION + divide_by_out_size(my_outvalues, outboundaries); +#endif + + const bool ret = check_if_equal(my_outvalues, outvalues,description); + if (!ret) + std::cerr << "\nres: " << my_outvalues << "should be " << outvalues; + return + ret ? Succeeded::yes : Succeeded::no; + } + + template + Succeeded + uniform_test_case(const ValueT& invalues, + const float zoom, const float offset, + const ValueT& outvalues, + const char * const description) + { + using namespace boost::lambda; + + ValueT my_outvalues = outvalues; + overlap_interpolate(my_outvalues, + invalues, zoom, offset); +#ifndef STIR_OVERLAP_NORMALISATION + std::for_each(my_outvalues.begin(), my_outvalues.end(), _1 *= zoom); +#endif + const bool ret = check_if_equal(my_outvalues, outvalues,description); + if (!ret) + std::cerr << "\nres: " << my_outvalues << "should be " << outvalues << '\n'; + return + ret ? Succeeded::yes : Succeeded::no; + } + + Succeeded + test_case_1d(const char * const input, + const char * const description) + { + std::istringstream s(input); + VectorWithOffset invalues, inboundaries, outvalues, outboundaries; + s >> invalues >> inboundaries >> outvalues >> outboundaries; + return test_case(invalues, inboundaries, outvalues, outboundaries, description); + } + + + Succeeded + uniform_test_case_1d(const char * const input, + const char * const description) + { + std::istringstream s(input); + VectorWithOffset invalues, outvalues; + int instartindex, outstartindex, outendindex; + float zoom, offset; + char out[10000]; + + s >> invalues + >> instartindex >> outstartindex >> outendindex + >> zoom >> offset + >> outvalues; + invalues.set_min_index(instartindex); + VectorWithOffset inboundaries(invalues.get_min_index(), invalues.get_max_index()+1); + for (int i=inboundaries.get_min_index(); i<=inboundaries.get_max_index(); ++i) + inboundaries[i]=i-.5F; + outvalues.set_min_index(outstartindex); + sprintf(out, "%s: inconsistent index sizes. Check test program", description); + if (!check_if_equal(outvalues.get_max_index(), outendindex-1, out)) + return Succeeded::no; + VectorWithOffset outboundaries(outstartindex, outendindex); + for (int i=outboundaries.get_min_index(); i<=outboundaries.get_max_index(); ++i) + outboundaries[i]=(i-.5F)/zoom+offset; + + sprintf(out, "%s: test general overlap_interpolate", description); + if (test_case(invalues, inboundaries, outvalues, outboundaries, out) == Succeeded::no) + return Succeeded::no; + + sprintf(out, "%s: test uniform overlap_interpolate", description); + if (uniform_test_case(invalues, zoom, offset, outvalues, out) == Succeeded::no) + return Succeeded::no; + return Succeeded::yes; + } + +}; + +void +overlap_interpolateTests::run_tests() +{ + std::cerr << "Tests for overlap_interpolate\n" + << "Everythings is fine if the program runs without any output." << std::endl; + + set_tolerance(.0005); + test_case_1d("{1,2.1,-3,4}" + "{2,3,4,5,6}" + "{1,2.1,-3,4}" + "{2,3,4,5,6}", + "equal boundaries"); + + test_case_1d("{1.1,2,3,4.5}" + "{2,3,4,5,7}" + "{0,1.1,2,3,4.5}" + "{-1,2,3,4,5,7}", + "equal boundaries, but longer at start"); + + test_case_1d("{1.1,2,3,4.5}" + "{2,3,4,5,7}" + "{1.1,2,3,4.5,0}" + "{2,3,4,5,7,10}", + "equal boundaries, but longer at end"); + + test_case_1d("{1.1,2,3,4.5}" + "{2,3,4,5,7}" + "{0,1.1,1.1,2,2,3,3,4.5,4.5,4.5,4.5}" + "{-1,2,2.5,3,3.3,4,4.8,5,5.1,5.2,5.6,7}", + "multiple out boxes in each in box"); + + test_case_1d("{1,5,2,16,7,4,2,4}" + "{-2,5,6,6.5,7,86,101,110,130}" + "{0.,0.2,1.,1.,1.,5.8,7.,7.,7.,6.53448,1.28421,0.,0.}" + "{-30,-4,-1.5,1,1.5,4,9,13,18,37,95,190,210,250}", + "arbitrary sizes case 1"); + test_case_1d("{-1,2.5,2,1.6,7,-4,4}" + "{-2.1,5.2,6.3,6.5,7.6,7.8,11,11.7}" + "{-0.516667,-0.0416667,1.6,1.55556}" + "{-5,1,7,7.1,8}", + "arbitrary sizes case 2"); + test_case_1d("{-1,2.56,2,11.6,7.3,-4,4}" + "{-2.1,5.2,6.3,6.5,7.6,7.8,11,11.7}" + "{-0.0333333,-1.,-1.,-1.,-0.4304,4.10182,9.58333,-4.,-4.,-2.,0.,0.}" + "{-5,-2,0,1,3.1,5.6,6.7,7.9,8.3,8.9,11.7,13,15}", + "arbitrary sizes case 3"); + test_case_1d("{0.594221,0.932554,0.930552,0.479434,0.44984,0.426074,0.574378,\ +0.893291}" + "{0,0.0253037,0.889616,1.52744,2.47386,3.11161,3.56033,4.02598,4.94703}" + "{0.923744,0.930552,0.509265,0.457499,0.44984}" + "{0,0.995915,1.46923,2.34955,2.82987,2.96136}", + "random case 1"); + test_case_1d("{0.43649,0.236381,0.978282,0.537264,0.503936,0.305829,0.498848,\ +0.0874235}" + "{0,0.0778616,0.809312,1.41487,1.47699,1.69054,1.78416,2.4433,2.86767}" + "{0.256752,0.925738,0.493403,0.387417,0.0874235,0.00196432,0.,0.,0.}" + "{0,0.764837,1.3928,2.13089,2.55935,2.85087,3.59851,3.85628,4.15325,5.00828}",\ + + "random case 2"); + test_case_1d("{0.511261,0.27949,0.759702,0.351098,0.205432,0.780642,0.672278,\ +0.273237}" + "{0,0.473981,0.649066,1.25922,1.31891,1.69927,2.21521,2.40101,2.69586}" + "{0.491445,0.577761,0.641911,0.672278,0.672278,0.29108,0.}" + "{0,0.75239,1.53024,2.28759,2.29091,2.29566,2.81574,3.27612}", + "random case 3"); + test_case_1d("{0.148291,0.493487,0.240592,0.700675,0.797193,0.288055,0.459951,\ +0.0283963,0.523956}" + "{0,0.814074,1.09894,1.51718,1.98145,2.41516,3.18408,3.41653,3.58595,4.26728}\ +" + "{0.209939,0.298013,0.559381,0.74738,0.40299,0.288055,0.288055}" + "{0,0.991066,1.46617,1.63226,2.30884,2.77983,2.79455,2.81236}", + "random case 4"); + test_case_1d("{0.183092,0.230392,0.314051,0.220611,0.895037}" + "{0,0.770442,1.0561,1.75275,1.83371,2.31929}" + "{0.18838,0.246126,0.314051,0.633862,0.}" + "{0,0.867418,1.0998,1.74705,2.4637,3.09868}", + "random case 5"); + test_case_1d("{0.0629649,0.965917,0.72559,0.15987,0.89687,0.289338,0.254605,0.\ +145144}" + "{0,0.879067,0.985312,1.00953,1.84062,2.49907,2.71028,2.96405,3.50949}" + "{0.140638,0.410539,0.178698,0.861756,0.217232,0.0726656,0.,0.}" + "{0,0.961802,1.09205,1.86024,2.53826,3.26768,3.75068,3.80222,3.84527}", + "random case 6"); + test_case_1d("{0.666452,0.517083,0.32595,0.883177,0.769582,0.227745,0.0713446,\ +0.738033}" + "{0,0.890515,1.01201,1.05915,1.96609,2.19815,3.10844,3.9018,4.2633}" + "{0.666452,0.626473,0.687369}" + "{0,0.270258,1.0503,1.07547}", + "random case 7"); + test_case_1d("{0.683484,0.540841,0.297046,0.973624,0.640437,0.874389,0.779963,\ +0.647674}" + "{0,0.75726,0.862067,1.41428,1.99061,2.00984,2.22413,2.65485,3.18405}" + "{0.683484,0.57681,0.557915,0.902686,0.701251,0.075033,0.,0.,0.}" + "{0,0.112286,1.09452,1.61495,2.35078,3.10157,3.81354,4.55392,5.2646,5.3319}", + "random case 8"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-2 -2 6 1 0" + "{1.,5.,2.,16.,7.,4.,2.,4.}", + "uniform equal in and out"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-2 -2 3 1 0" + "{1.,5.,2.,16.,7.}", + "uniform equal in and out, but short on right"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-2 0 6 1 0" + "{2.,16.,7.,4.,2.,4.}", + "uniform equal in and out, but short on left"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-2 0 10 1 0" + "{2.,16.,7.,4.,2.,4.,0.,0.,0.,0.}", + "uniform equal in and out, but short on left and long on right"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-1 -3 5 1 0" + "{0.,0.,1.,5.,2.,16.,7.,4.}", + "uniform equal in and out, but long on left and short on right"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-2 0 10 1 -2" + "{1.,5.,2.,16.,7.,4.,2.,4.,0.,0.}", + "uniform equal in and out, offset only"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-2 -1 10 0.3 -1" + "{0.,3.2,7.6,1.5,0.,0.,0.,0.,0.,0.,0.}", + "uniform test case 1"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "2 1 10 0.3 1.3" + "{7.88,3.42,0.,0.,0.,0.,0.,0.,0.}", + "uniform test case 2"); + uniform_test_case_1d("{1,5,2,16,7,4,2,4}" + "-2 -3 10 2.5 -2.2" + "{0.,0.,0.25,1.,1.,4.,5.,4.25,2.,2.,12.5,16.,13.75}", + "uniform test case 3"); +} + + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main() +{ + overlap_interpolateTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/run_tests.bat b/src/test/run_tests.bat new file mode 100755 index 0000000000..5de507ba8c --- /dev/null +++ b/src/test/run_tests.bat @@ -0,0 +1,74 @@ +@rem Batch programme to run STIR tests +@rem Kris Thielemans + +@if #%1==# goto usage + +@echo Running a sequence of non-interactive tests +@echo All tests should end with 'All tests ok !' +@echo There we go... +@pause +VC\test_VectorWithOffset\%1\test_VectorWithOffset +@pause Press any key to continue to next test programme +VC\test_ArcCorrection\%1\test_ArcCorrection +@pause Press any key to continue to next test programme +VC\test_Array\%1\test_Array +@pause +VC\test_convert_array\%1\test_convert_array +@pause +VC\test_IndexRange\%1\test_IndexRange +@pause +VC\test_coordinates\%1\test_coordinates +@pause +VC\test_ArrayFilter\%1\test_ArrayFilter +@pause +VC\test_NestedIterator\%1\test_NestedIterator +@pause +VC\test_filename_functions\%1\test_filename_functions +@pause +VC\test_linear_regression\%1\test_linear_regression input\test_linear_regression.in +rem next test is interactive and disabled +rem @pause +rem VC\test_interpolate\%1\test_interpolate +@pause +VC\test_VoxelsOnCartesianGrid\%1\test_VoxelsOnCartesianGrid +@pause +VC\test_DynamicDiscretisedDensity\%1\test_DynamicDiscretisedDensity +@pause +VC\test_zoom_image\%1\test_zoom_image +@pause +VC\test_proj_data_info\%1\test_proj_data_info + +@pause +VC\test_OutputFileFormat\%1\test_OutputFileFormat input/test_InterfileOutputFileFormat.in +@pause +VC\test_OutputFileFormat\%1\test_OutputFileFormat input/test_InterfileOutputFileFormat_short.in +@pause +VC\test_OutputFileFormat\%1\test_OutputFileFormat input/test_ECAT6OutputFileFormat.in +@pause +VC\test_OutputFileFormat\%1\test_OutputFileFormat input/test_ECAT7OutputFileFormat.in +@pause +VC\test_ByteOrder\%1\test_ByteOrder +@pause +VC\test_ROIs\%1\test_ROIs +@pause +VC\test_Scanner\%1\test_Scanner +@pause +rem next test disabled +rem VC\test_VAXfloat\%1\test_VAXfloat --read input\test_VAXfloat.in +@pause +@echo Executing test_stir_math +@echo This relies on having stir_math compiled (in the utilities workspace). +VC\test_stir_math\%1\test_stir_math ..\utilities\VC\stir_math\%1\stir_math +@echo. +@echo End of tests ! +@echo. + +@goto exit + +:usage +@echo Usage: run_tests configuration +@echo where the argument specifies the configuration name you want to test +@echo This will generally be Debug or Release +:exit + + diff --git a/src/test/test.mk b/src/test/test.mk new file mode 100644 index 0000000000..3f2d0ac4d0 --- /dev/null +++ b/src/test/test.mk @@ -0,0 +1,172 @@ +# +# +dir := test + +$(dir)_TEST_SOURCES := test_Array.cxx test_NestedIterator.cxx \ + test_VectorWithOffset.cxx \ + test_ArrayFilter.cxx \ + test_convert_array.cxx \ + test_IndexRange.cxx \ + test_coordinates.cxx \ + test_linear_regression.cxx \ + test_filename_functions.cxx \ + test_coordinates.cxx \ + test_VoxelsOnCartesianGrid.cxx \ + test_zoom_image.cxx \ + test_proj_data_info.cxx \ + test_stir_math.cxx \ + test_OutputFileFormat.cxx \ + test_ByteOrder.cxx \ + test_Scanner.cxx \ + test_ROIs.cxx \ + test_ArcCorrection.cxx \ + test_DynamicDiscretisedDensity.cxx \ + test_find_fwhm_in_image.cxx \ + test_warp_image.cxx + +(dir)_INTERACTIVE_TEST_SOURCES := \ + test_display.cxx \ + test_interpolate.cxx + + +# note: do not use $(dir) in the command lines as that variable +# will be something else when the command line gets executed! +# (see e.g. lib.mk) +run_$(dir)/test_linear_regression: $(DEST)$(dir)/test_linear_regression PHONY_TARGET + $< test/input/test_linear_regression.in + +run_$(dir)/test_OutputFileFormat: $(DEST)$(dir)/test_OutputFileFormat PHONY_TARGET + $< test/input/test_InterfileOutputFileFormat.in + $< test/input/test_InterfileOutputFileFormat_short.in +ifeq ($(HAVE_LLN_MATRIX),1) + echo WARNING: ECAT6 tests currently disabled + $< test/input/test_ECAT7OutputFileFormat.in +else + @echo No ECAT6/7 support compiled, so no tests for this file format +endif + + +ifeq ("$(IS_MS_VC)","") +run_$(dir)/test_stir_math: $(DEST)$(dir)/test_stir_math $(DEST)utilities/stir_math PHONY_TARGET + $< $(DEST)utilities/stir_math$(EXE_SUFFIX) +else +run_$(dir)/test_stir_math: $(DEST)$(dir)/test_stir_math $(DEST)utilities/stir_math PHONY_TARGET + $< `cygpath -w $(DEST)utilities/stir_math.exe` +endif + + +################################################## +# rules to ignore registries +# note: have to be before include statement as that changes value of $(dir) + +ifeq ("$(FAST_test)","") +${DEST}$(dir)/test_ArrayFilter: ${DEST}$(dir)/test_ArrayFilter${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_VectorWithOffset: ${DEST}$(dir)/test_VectorWithOffset${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_Array: ${DEST}$(dir)/test_Array${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_convert_array: ${DEST}$(dir)/test_convert_array${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_find_fwhm_in_image: ${DEST}$(dir)/test_find_fwhm_in_image$(O_SUFFIX) $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + + +else + # rules for test_VectorWithOffset et al that ignores $(STIR_LIB) completely as it's all inline (except for error()) + # somewhat dangerous though in case files/rules change +${DEST}$(dir)/test_VectorWithOffset: ${DEST}$(dir)/test_VectorWithOffset${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< ${DEST}buildblock/error${O_SUFFIX} $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_Array: ${DEST}$(dir)/test_Array${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} ${DEST}buildblock/warning${O_SUFFIX} \ + $(DEST)buildblock/IndexRange${O_SUFFIX} ${DEST}buildblock/ByteOrder${O_SUFFIX} \ + $(DEST)buildblock/utilities${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< \ + ${DEST}buildblock/error${O_SUFFIX} $(DEST)buildblock/IndexRange${O_SUFFIX} \ + ${DEST}buildblock/warning${O_SUFFIX} ${DEST}buildblock/ByteOrder${O_SUFFIX} \ + $(DEST)buildblock/utilities${O_SUFFIX} \ + $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_ArrayFilter: ${DEST}$(dir)/test_ArrayFilter${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} ${DEST}buildblock/warning${O_SUFFIX} \ + $(DEST)buildblock/IndexRange${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter1DUsingConvolution${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter2DUsingConvolution${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter3DUsingConvolution${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter1DUsingConvolutionSymmetricKernel${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilterUsingRealDFTWithPadding${O_SUFFIX} \ + $(DEST)numerics_buildblock/fourier${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< \ + ${DEST}buildblock/error${O_SUFFIX} $(DEST)buildblock/IndexRange${O_SUFFIX} \ + ${DEST}buildblock/warning${O_SUFFIX}\ + $(DEST)buildblock/IndexRange${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter1DUsingConvolution${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter2DUsingConvolution${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter3DUsingConvolution${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilter1DUsingConvolutionSymmetricKernel${O_SUFFIX} \ + $(DEST)buildblock/ArrayFilterUsingRealDFTWithPadding${O_SUFFIX} \ + $(DEST)numerics_buildblock/fourier${O_SUFFIX} \ + $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_NestedIterator: ${DEST}$(dir)/test_NestedIterator${O_SUFFIX} ${DEST}buildblock/error${O_SUFFIX} $(DEST)buildblock/IndexRange${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< ${DEST}buildblock/error${O_SUFFIX} $(DEST)buildblock/IndexRange${O_SUFFIX} $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_convert_array: ${DEST}$(dir)/test_convert_array${O_SUFFIX} \ + ${DEST}buildblock/error${O_SUFFIX} ${DEST}buildblock/warning${O_SUFFIX} + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< \ + ${DEST}buildblock/error${O_SUFFIX} \ + ${DEST}buildblock/warning${O_SUFFIX} \ +$(LINKFLAGS) $(SYS_LIBS) + +endif + + + +${DEST}$(dir)/test_IndexRange: ${DEST}$(dir)/test_IndexRange${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + + +${DEST}$(dir)/test_coordinates: ${DEST}$(dir)/test_coordinates${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + + +${DEST}$(dir)/test_linear_regression: ${DEST}$(dir)/test_linear_regression${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + + +${DEST}$(dir)/test_interpolate: ${DEST}$(dir)/test_interpolate${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + + +${DEST}$(dir)/test_filename_functions: ${DEST}$(dir)/test_filename_functions${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_ByteOrder: ${DEST}$(dir)/test_ByteOrder${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_stir_math: ${DEST}$(dir)/test_stir_math${O_SUFFIX} $(STIR_LIB) $(filter %IO_registries${O_SUFFIX},$(STIR_REGISTRIES)) $(EXTRA_LIBS) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(filter %IO_registries${O_SUFFIX},$(STIR_REGISTRIES)) $(EXTRA_LIBS) $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_OutputFileFormat: ${DEST}$(dir)/test_OutputFileFormat${O_SUFFIX} \ + $(STIR_LIB) $(filter %IO_registries${O_SUFFIX},$(STIR_REGISTRIES)) $(EXTRA_LIBS) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< \ + $(filter %IO_registries${O_SUFFIX},$(STIR_REGISTRIES)) \ + $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_proj_data_info: ${DEST}$(dir)/test_proj_data_info${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_ArcCorrection: ${DEST}$(dir)/test_ArcCorrection${O_SUFFIX} $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/test_ROIs: ${DEST}$(dir)/test_ROIs${O_SUFFIX} $(STIR_LIB) $(Shape_buildblock_REGISTRY_OBJS) + $(LINK) $(EXE_OUTFLAG)$(@)$(EXE_SUFFIX) $< $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) $(Shape_buildblock_REGISTRY_OBJS) + +include $(WORKSPACE)/test.mk + diff --git a/src/test/test_ArcCorrection.cxx b/src/test/test_ArcCorrection.cxx new file mode 100644 index 0000000000..de2ac3c2d7 --- /dev/null +++ b/src/test/test_ArcCorrection.cxx @@ -0,0 +1,187 @@ +// +// +/* + Copyright (C) 2005- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + + \brief Test program for stir::ArcCorrection + + \author Kris Thielemans + +*/ + +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/RunTests.h" +#include "stir/Viewgram.h" +#include "stir/Sinogram.h" +#include "stir/Bin.h" +#include "stir/ArcCorrection.h" +#include "stir/round.h" +#include "stir/index_at_maximum.h" + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief Test class for ArcCorrection + + The following 2 tests are performed: + + - a geometry test to see that a point in a sinogram is arc-corrected to the + correct location. + + - a uniformity test that checks that uniform data are arc-corrected to + uniform data with the same value. + + This is currently only done on sinograms and viewgrams. + + The tests are performed both at the default arc-corrected bin-size, + but also at twice as large bin-size. +*/ +class ArcCorrectionTests: public RunTests +{ +public: + void run_tests(); +protected: + void run_tests_for_specific_proj_data_info(const ArcCorrection&); +}; + +void +ArcCorrectionTests:: +run_tests_for_specific_proj_data_info(const ArcCorrection& arc_correction) +{ + const ProjDataInfoCylindricalArcCorr& proj_data_info_arc_corr = + arc_correction.get_arc_corrected_proj_data_info(); + const ProjDataInfoCylindricalNoArcCorr& proj_data_info_noarc_corr = + arc_correction.get_not_arc_corrected_proj_data_info(); + + const float sampling_in_s = proj_data_info_arc_corr.get_tangential_sampling(); + + for (int segment_num=proj_data_info_noarc_corr.get_min_segment_num(); + segment_num<=proj_data_info_noarc_corr.get_max_segment_num(); + ++segment_num) + { + const int axial_pos_num = 0; + Sinogram noarccorr_sinogram = + proj_data_info_noarc_corr.get_empty_sinogram(axial_pos_num, segment_num); + Sinogram arccorr_sinogram = + proj_data_info_arc_corr.get_empty_sinogram(axial_pos_num, segment_num); + + for (int view_num=proj_data_info_noarc_corr.get_min_view_num(); + view_num<=proj_data_info_noarc_corr.get_max_view_num(); + view_num+=3) + { + Viewgram noarccorr_viewgram = + proj_data_info_noarc_corr.get_empty_viewgram(view_num, segment_num); + Viewgram arccorr_viewgram = + proj_data_info_arc_corr.get_empty_viewgram(view_num, segment_num); + // test geometry by checking if single non-zero value gets put in the right bin + { + for (int tangential_pos_num=proj_data_info_noarc_corr.get_min_tangential_pos_num(); + tangential_pos_num<=proj_data_info_noarc_corr.get_max_tangential_pos_num(); + tangential_pos_num+=4) + { + noarccorr_sinogram.fill(0); + noarccorr_viewgram.fill(0); + noarccorr_viewgram[axial_pos_num][tangential_pos_num]=1; + noarccorr_sinogram[view_num][tangential_pos_num]=1; + arc_correction.do_arc_correction(arccorr_sinogram, noarccorr_sinogram); + arc_correction.do_arc_correction(arccorr_viewgram, noarccorr_viewgram); + check_if_equal(noarccorr_sinogram[view_num], noarccorr_viewgram[axial_pos_num], + "1 line in sinogram and viewgram (geometric test)"); + const int arccorr_tangential_pos_num_at_max= + index_at_maximum(arccorr_viewgram[axial_pos_num]); + + const float noarccorr_s = + proj_data_info_noarc_corr. + get_s(Bin(segment_num,view_num,axial_pos_num,tangential_pos_num)); + const float arccorr_s = + proj_data_info_arc_corr. + get_s(Bin(segment_num,view_num,axial_pos_num,arccorr_tangential_pos_num_at_max)); + check((arccorr_s - noarccorr_s)/sampling_in_s < 1.1, + "correspondence in location of maximum after arc-correction"); + } + } + // test if uniformity and counts are preserved + { + /* We set a viewgram to 1, and check if the transformed viewgram is also 1 + (except at the boundary). + */ + noarccorr_sinogram.fill(1); + noarccorr_viewgram.fill(1); + arc_correction.do_arc_correction(arccorr_sinogram, noarccorr_sinogram); + arc_correction.do_arc_correction(arccorr_viewgram, noarccorr_viewgram); + check_if_equal(noarccorr_sinogram[view_num], noarccorr_viewgram[axial_pos_num], + "1 line in sinogram and viewgram (uniformity test)"); + + const float max_s = + proj_data_info_noarc_corr. + get_s(Bin(segment_num,view_num,axial_pos_num, + proj_data_info_noarc_corr.get_max_tangential_pos_num())); + const float min_s = + proj_data_info_noarc_corr. + get_s(Bin(segment_num,view_num,axial_pos_num, + proj_data_info_noarc_corr.get_min_tangential_pos_num())); + for (int tangential_pos_num= round(min_s/sampling_in_s)+2; + tangential_pos_num<=round(max_s/sampling_in_s)-2; + ++tangential_pos_num) + check_if_equal(arccorr_viewgram[axial_pos_num][tangential_pos_num], 1.F, + "uniformity"); + } + } + } +} + + +void +ArcCorrectionTests::run_tests() +{ + cerr << "-------- Testing ArcCorrection --------\n"; + ArcCorrection arc_correction; + shared_ptr scanner_ptr(new Scanner(Scanner::E962)); + + shared_ptr proj_data_info_ptr( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span*/7, 10,/*views*/ 96, /*tang_pos*/128, /*arc_corrected*/ false)); + cerr << "Using default range and bin-size\n"; + { + arc_correction.set_up(proj_data_info_ptr); + run_tests_for_specific_proj_data_info(arc_correction); + } + cerr << "Using non-default range and bin-size\n"; + { + arc_correction.set_up(proj_data_info_ptr, + 128, + scanner_ptr->get_default_bin_size()*2); + run_tests_for_specific_proj_data_info(arc_correction); + } +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + +int main() +{ + ArcCorrectionTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_Array.cxx b/src/test/test_Array.cxx new file mode 100644 index 0000000000..f00cd17fb5 --- /dev/null +++ b/src/test/test_Array.cxx @@ -0,0 +1,775 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2011, Hammersmith Imanet Ltd + Copyright (C) 2013 Kris Thielemans + Copyright (C) 2013 University College London + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + \ingroup Array + + \brief tests for the stir::Array class + + \author Kris Thielemans + \author PARAPET project +*/ + +#ifndef NDEBUG +// set to high level of debugging +#ifdef _DEBUG +#undef _DEBUG +#endif +#define _DEBUG 2 +#endif + +#include "stir/Array.h" +#include "stir/Coordinate2D.h" +#include "stir/Coordinate3D.h" +#include "stir/Coordinate4D.h" +#include "stir/convert_array.h" +#include "stir/Succeeded.h" +#include "stir/IO/write_data.h" +#include "stir/IO/read_data.h" + +#include "stir/RunTests.h" + +#include "stir/ArrayFunction.h" +#include "stir/array_index_functions.h" +#include + +// for open_read/write_binary +#include "stir/utilities.h" + +#include +#include +#include +#include +#ifndef STIR_NO_NAMESPACES +using std::ofstream; +using std::ifstream; +using std::plus; +using std::bind2nd; +#endif + +START_NAMESPACE_STIR + + +/*! + \brief Tests Array functionality + \ingroup test + \warning Running this will create and delete 2 files with names + output.flt and output.other. Existing files with these names will be overwritten. + +*/ +class ArrayTests : public RunTests +{ +private: + // this function tests the next() function and compare it to using full_iterators + // sadly needs to be declared in the class for VC 6.0 + template + void + run_tests_on_next(const Array& test) + { + // exit if empty array (as do..while() loop would fail) + if (test.size() == 0) + return; + + BasicCoordinate index = get_min_indices(test); + typename Array::const_full_iterator iter = test.begin_all(); + do + { + check(*iter == test[index], "test on next(): element out of sequence?"); + ++iter; + } + while (next(index, test) && (iter != test.end_all())); + check (iter == test.end_all(), "test on next() : did we cover all elements?"); + } + + // functions that runs IO tests for an array of arbitrary dimension + // sadly needs to be declared in the class for VC 6.0 + template + void run_IO_tests(const Array&t1) + { + std::fstream os; + std::fstream is; + run_IO_tests_with_file_args(os, is, t1); + FILE* ofptr; + FILE* ifptr; + run_IO_tests_with_file_args(ofptr, is, t1); + run_IO_tests_with_file_args(ofptr, ifptr, t1); + } + template + void run_IO_tests_with_file_args(OFSTREAM& os, IFSTREAM& is, const Array&t1) + { + { + open_write_binary(os, "output.flt"); + check(write_data(os,t1)==Succeeded::yes, "write_data could not write array"); + close_file(os); + } + Array t2(t1.get_index_range()); + { + open_read_binary(is, "output.flt"); + check(read_data(is,t2)==Succeeded::yes, "read_data could not read from output.flt"); + close_file(is); + } + check_if_equal(t1 ,t2, "test out/in" ); + remove("output.flt"); + + { + open_write_binary(os, "output.flt"); + const Array copy=t1; + check(write_data(os,t1,ByteOrder::swapped)==Succeeded::yes, "write_data could not write array with swapped byte order"); + check_if_equal(t1 ,copy, "test out with byte-swapping didn't change the array" ); + close_file(os); + } + { + open_read_binary(is, "output.flt"); + check(read_data(is,t2,ByteOrder::swapped)==Succeeded::yes, "read_data could not read from output.flt"); + close_file(is); + } + check_if_equal(t1 ,t2, "test out/in (swapped byte order)" ); + remove("output.flt"); + + cerr <<"\tTests writing as shorts\n"; + run_IO_tests_mixed(os, is, t1, NumericInfo()); + cerr <<"\tTests writing as floats\n"; + run_IO_tests_mixed(os, is, t1, NumericInfo()); + cerr <<"\tTests writing as signed chars\n"; + run_IO_tests_mixed(os, is, t1, NumericInfo()); + + + /* check on failed IO. + Note: needs to be after the others, as we would have to call os.clear() + for ostream to be able to write again, but that's not defined for FILE*. + */ + { + const Array copy=t1; + cerr << "\n\tYou should now see a warning that writing failed. That's by intention.\n"; + check(write_data(os,t1,ByteOrder::swapped)!=Succeeded::yes, "write_data with swapped byte order should have failed"); + check_if_equal(t1 ,copy, "test out with byte-swapping didn't change the array even with failed IO" ); + } + + } + + //! function that runs IO tests with mixed types for array of arbitrary dimension + // sadly needs to be implemented in the class for VC 6.0 + template + void run_IO_tests_mixed(OFSTREAM& os, IFSTREAM& is, const Array&orig, NumericInfo output_type_info) + { + { + open_write_binary(os, "output.orig"); + elemT scale(1); + check(write_data(os, orig, NumericInfo(), scale)==Succeeded::yes, "write_data could not write array in original data type"); + close_file(os); + check_if_equal(scale ,static_cast(1), "test out/in: data written in original data type: scale factor should be 1" ); + } + elemT scale(1); + bool write_data_ok; + { + ofstream os; + open_write_binary(os, "output.other"); + write_data_ok=check(write_data(os,orig, output_type_info, scale)==Succeeded::yes, "write_data could not write array as other_type"); + close_file(os); + } + + if (write_data_ok) + { + // only do reading test if data was written + Array data_read_back(orig.get_index_range()); + { + open_read_binary(is, "output.other"); + check(read_data(is, data_read_back)==Succeeded::yes, "read_data could not read from output.other"); + close_file(is); + remove("output.other"); + } + + // compare with convert() + { + float newscale = scale; + Array origconverted = + convert_array(newscale, orig, NumericInfo()); + check_if_equal(newscale ,scale, "test read_data <-> convert : scale factor "); + check_if_equal(origconverted ,data_read_back, "test read_data <-> convert : data"); + } + + // compare orig/scale with data_read_back + { + const Array orig_scaled(orig/scale); + this->check_array_equality_with_rounding(orig_scaled, data_read_back, + "test out/in: data written as other_type, read as other_type"); + } + + // compare data written as original, but read as other_type + { + Array data_read_back2(orig.get_index_range()); + + ifstream is; + open_read_binary(is, "output.orig"); + + elemT in_scale = 0; + check(read_data(is, data_read_back2, NumericInfo(), in_scale)==Succeeded::yes, "read_data could not read from output.orig"); + // compare orig/in_scale with data_read_back2 + const Array orig_scaled(orig/in_scale); + this->check_array_equality_with_rounding(orig_scaled, data_read_back2, + "test out/in: data written as original_type, read as other_type"); + } + } // end of if(write_data_ok) + remove("output.orig"); + } + + //! a special version of check_if_equal just for this class + /*! we check up to .5 if output_type is integer, and up to tolerance otherwise + */ + template + bool check_array_equality_with_rounding(const Array& orig, const Array& data_read_back, const char*const message) + { + NumericInfo output_type_info; + bool test_failed=false; + typename Array::const_full_iterator diff_iter = orig.begin_all(); + typename Array::const_full_iterator data_read_back_iter = data_read_back.begin_all_const(); + while(diff_iter!=orig.end_all()) + { + if (output_type_info.integer_type()) + { + std::stringstream full_message; + // construct useful error message even though we use a boolean check + full_message << boost::format("unequal values are %2% and %3%. %1%: difference larger than .5") + % message % static_cast(*data_read_back_iter) % *diff_iter; + // difference should be maximum .5 (but we test with slightly larger tolerance to accomodate numerical precision) + test_failed = check(fabs(*diff_iter - *data_read_back_iter)<=.502, + full_message.str().c_str()); + } + else + { + std::string full_message = message; + full_message += ": difference larger than tolerance"; + test_failed = check_if_equal(static_cast(*data_read_back_iter), *diff_iter, + full_message.c_str()); + } + if (test_failed) + break; + diff_iter++; data_read_back_iter++; + } + return test_failed; + } + +public: + void run_tests(); +}; + + +void +ArrayTests::run_tests() +{ + + cerr << "Testing Array classes\n"; + { + cerr << "Testing 1D stuff" << endl; + + { + + Array<1,int> testint(IndexRange<1>(5)); + testint[0] = 2; + check_if_equal(testint.size(), size_t(5), "test size()"); + check_if_equal(testint.size_all(), size_t(5), "test size_all()"); + + Array<1,float> test(IndexRange<1>(10)); + check_if_zero(test, "Array1D not initialised to 0"); + + test[1] = (float)10.5; + test.set_offset(-1); + check_if_equal(test.size(), size_t(10), "test size() with non-zero offset"); + check_if_equal(test.size_all(), size_t(10), "test size_all() with non-zero offset"); + check_if_equal( test[0], 10.5F, "test indexing of Array1D"); + test += 1; + check_if_equal( test[0] , 11.5F, "test operator+=(float)"); + check_if_equal( test.sum(), 20.5F, "test operator+=(float) and sum()"); + check_if_zero( test - test, "test operator-(Array1D)"); + + BasicCoordinate<1,int> c; + c[1]=0; + check_if_equal(test[c] , 11.5F , "test operator[](BasicCoordinate)"); + test[c] = 12.5; + check_if_equal(test[c] , 12.5F , "test operator[](BasicCoordinate)"); + + { + Array<1,float> ref(-1,2); + ref[-1]=1.F;ref[0]=3.F;ref[1]=3.14F; + Array<1,float> test = ref; + + test += 1; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , ref[i]+1, "test operator+=(float)"); + test = ref; test -= 4; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , ref[i]-4, "test operator-=(float)"); + test = ref; test *= 3; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , ref[i]*3, "test operator*=(float)"); + test = ref; test /= 3; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , ref[i]/3, "test operator/=(float)"); + } + { + Array<1,float> test2; + test2 = test * 2; + check_if_equal( 2*test[0] , test2[0], "test operator*(float)"); + } + + { + Array<1,float> test2 = test; + test.grow(-2,test.get_max_index()); + Array<1,float> test3 = test2 + test; + check_if_zero(test3[-2], "test growing during operator+"); + } + + } +#if 1 + { + // tests on log/exp + Array<1,float> test(-3,10); + test.fill(1.F); + in_place_log(test); + { + Array<1,float> testeq(-3,10); + check_if_equal(test , testeq, "test in_place_log of Array1D"); + } + { + for (int i=test.get_min_index(); i<= test.get_max_index(); i++) + test[i] = 3.5F*i + 100; + } + Array<1,float> test_copy = test; + + in_place_log(test); + in_place_exp(test); + check_if_equal(test , test_copy, "test log/exp of Array1D"); + } +#endif + } + + { + cerr << "Testing 2D stuff" << endl; + { + const IndexRange<2> range(Coordinate2D(0,0),Coordinate2D(9,9)); + Array<2,float> test2(range); + check_if_equal(test2.size(), size_t(10), "test size()"); + check_if_equal(test2.size_all(), size_t(100), "test size_all()"); + // KT 17/03/98 added check on initialisation + check_if_zero(test2, "test Array<2,float> not initialised to 0" ); + +#if 0 + // KT 06/04/98 removed operator() + test2(3,4) = (float)23.3; +#else + test2[3][4] = (float)23.3; +#endif + //test2.set_offsets(-1,-4); + //check_if_equal( test2[2][0] , 23.3, "test indexing of Array2D"); + } + + + { + IndexRange<2> range(Coordinate2D(0,0),Coordinate2D(3,3)); + Array<2,float> testfp(range); + Array<2,float> t2fp(range); +#if 0 + // KT 06/04/98 removed operator() + testfp(3,2) = 3.3F; + t2fp(3,2) = 2.2F; +#else + testfp[3][2] = 3.3F; + t2fp[3][2] = 2.2F; +#endif + + Array<2,float> t2 = t2fp + testfp; + check_if_equal( t2[3][2] , 5.5F, "test operator +(Array2D)"); + t2fp += testfp; + check_if_equal( t2fp[3][2] , 5.5F, "test operator +=(Array2D)"); + check_if_equal(t2 , t2fp, "test comparing Array2D+= and +" ); + + { + BasicCoordinate<2,int> c; + c[1]=3; c[2]=2; + check_if_equal(t2[c], 5.5F, "test on operator[](BasicCoordinate)"); + t2[c] = 6.; + check_if_equal(t2[c], 6.F, "test on operator[](BasicCoordinate)"); + } + + // assert should break on next line (in Debug build) if uncommented + //t2[-4][3]=1.F; + // at() should throw error + { + bool exception_thrown=false; + try + { + t2.at(-4).at(3); + } + catch (...) + { + exception_thrown=true; + } + check(exception_thrown, "out-of-range index should throw an exception"); + } + + //t2.grow_height(-5,5); + IndexRange<2> larger_range(Coordinate2D(-5,0),Coordinate2D(5,3)); + t2.grow(larger_range); + t2[-4][3]=1.F; + check_if_equal( t2[3][2] , 6.F, "test on grow"); + + // test assignment + t2fp = t2; + check_if_equal(t2 , t2fp, "test operator=(Array2D)" ); + + { + Array<2,float> tmp; + tmp = t2 / 2; + check_if_equal( t2.sum()/2 , tmp.sum(), "test operator/(float)"); + } + + { + // copy constructor; + Array<2,float> t21(t2); + check_if_equal(t21 , t2, "test Array2D copy constructor" ); + // 'assignment constructor' (this simply calls copy constructor) + Array<2,float> t22 = t2; + check_if_equal(t22 , t2, "test Array2D copy constructor" ); + } + } + // size_all with irregular range + { + const IndexRange<2> range(Coordinate2D(-1,1),Coordinate2D(1,2)); + Array<2,float> test2(range); + check(test2.is_regular(), "test is_regular() with regular"); + check_if_equal(test2.size(), size_t(3), "test size() with non-zero offset"); + check_if_equal(test2.size_all(), size_t(6), "test size_all() with non-zero offset"); + test2[0].resize(-1,2); + check(!test2.is_regular(), "test is_regular() with irregular"); + check_if_equal(test2.size(), size_t(3), "test size() with irregular range"); + check_if_equal(test2.size_all(), size_t(6+2), "test size_all() with irregular range"); + } + // full iterator + { + IndexRange<2> range(Coordinate2D(0,0),Coordinate2D(2,2)); + Array<2,float> test2(range); + { + float value = 1.2F; + for (Array<2,float>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + *iter++ = value++; + } + { + float value = 1.2F; + Array<2,float>::const_full_iterator iter = test2.begin_all_const(); + for (int i=test2.get_min_index(); i<= test2.get_max_index(); ++i) + for (int j=test2[i].get_min_index(); j<= test2[i].get_max_index(); ++j) + { + check(iter != test2.end_all_const(), "test on 2D full iterator"); + check_if_equal(*iter++, test2[i][j], "test on 2D full iterator vs. index"); + check_if_equal(test2[i][j], value++, "test on 2D full iterator value"); + } + } + + const Array<2,float> empty; + check(empty.begin_all() == empty.end_all(), "test on 2D full iterator for empty range"); + } + // tests for next() + { + const IndexRange<2> range(Coordinate2D(-1,1),Coordinate2D(1,2)); + Array<2,int> test(range); + // fill array with numbers in sequence + { + Array<2,int>::full_iterator iter = test.begin_all(); + for (int i=0; iter!= test.end_all(); ++iter, ++i) + { + *iter = i; + } + } + std::cerr << "\tTest on next() with regular array\n"; + this->run_tests_on_next(test); + // now do test with irregular array + test[0].resize(0,2); + test[0][2] = 10; + std::cerr << "\tTest on next() with irregular array, case 1\n"; + this->run_tests_on_next(test); + test[1].resize(-2,2); + test[1][-2] = 20; + std::cerr << "\tTest on next() with irregular array, case 2\n"; + this->run_tests_on_next(test); + test[-1].resize(-2,0); + test[-1][-2] = 30; + std::cerr << "\tTest on next() with irregular array, case 3\n"; + this->run_tests_on_next(test); + } + } + + { + cerr << "Testing 3D stuff" << endl; + + IndexRange<3> range(Coordinate3D(0,-1,1),Coordinate3D(3,3,3)); + Array<3,float> test3(range); + check_if_equal(test3.size(), size_t(4), "test size()"); + check_if_equal(test3.size_all(), size_t(60), "test size_all() with non-zero offset"); + // KT 06/04/98 removed operator() +#if 0 + test3(1,2,1) = (float)6.6; +#else + test3[1][2][1] = (float)6.6; +#endif + test3[1][0][2] = (float)7.3; + test3[1][0][1] = -1; + + + check_if_equal( test3.sum() , 12.9F, "test on sum"); + check_if_equal( test3.find_max() , 7.3F, "test on find_max"); + check_if_equal( test3.find_min() , -1.F, "test on find_min"); + + { + Array<3,float> test3copy(test3); + BasicCoordinate<3,int> c; + c[1]=1; c[2]=0; c[3]=2; + check_if_equal(test3[c], 7.3F, "test on operator[](BasicCoordinate)"); + test3copy[c]=8.; + check_if_equal(test3copy[1][0][2], 8.F, "test on operator[](BasicCoordinate)"); + } + + Array<3,float> test3bis(range); + test3bis[1][2][1] = (float)6.6; + test3bis[1][0][1] = (float)1.3; + Array<3,float> test3ter = test3bis; + + test3ter += test3; + check_if_equal(test3ter[1][0][1] , .3F, "test on operator+=(Array3D)"); + + Array<3,float> test3quat = test3 + test3bis; + check_if_equal(test3quat , test3ter, "test summing Array3D"); + + { + Array<3,float> tmp= test3 - 2; + Array<3,float> tmp2 = test3; + tmp2.fill(1.F); + + check_if_zero( test3.sum() - 2*tmp2.sum() - tmp.sum(), "test operator-(float)"); + } + +#if !defined(_MSC_VER) || _MSC_VER>1300 + // VC 6.0 cannot compile this + in_place_apply_function(test3ter, bind2nd(plus(), 4.F)); + test3quat += 4.F; + check_if_equal(test3quat , test3ter, + "test in_place_apply_function and operator+=(NUMBER)"); +#endif + // size_all with irregular range + { + const IndexRange<3> range(Coordinate3D(-1,1,4),Coordinate3D(1,2,6)); + Array<3,float> test(range); + check(test.is_regular(), "test is_regular() with regular"); + check_if_equal(test.size(), size_t(3), "test size() with non-zero offset"); + check_if_equal(test.size_all(), size_t(3*2*3), "test size_all() with non-zero offset"); + test[0][1].resize(-1,2); + check(!test.is_regular(), "test is_regular() with irregular"); + check_if_equal(test.size(), size_t(3), "test size() with irregular range"); + check_if_equal(test.size_all(), size_t(3*2*3+4-3), "test size_all() with irregular range"); + } + // full iterator + { + IndexRange<3> range(Coordinate3D(0,0,1),Coordinate3D(2,2,3)); + Array<3,float> test(range); + { + float value = 1.2F; + for (Array<3,float>::full_iterator iter = test.begin_all(); + iter != test.end_all(); + ) + *iter++ = value++; + } + { + float value = 1.2F; + Array<3,float>::const_full_iterator iter = test.begin_all_const(); + for (int i=test.get_min_index(); i<= test.get_max_index(); ++i) + for (int j=test[i].get_min_index(); j<= test[i].get_max_index(); ++j) + for (int k=test[i][j].get_min_index(); k<= test[i][j].get_max_index(); ++k) + { + check(iter != test.end_all_const(), "test on 3D full iterator"); + check_if_equal(*iter++, test[i][j][k], "test on 3D full iterator vs. index"); + check_if_equal(test[i][j][k], value++, "test on 3D full iterator value"); + } + } + // test empty container + { + const Array<3,float> empty; + check(empty.begin_all() == empty.end_all(), "test on 3D full iterator for empty range"); + } + // test conversion from full_iterator to const_full_iterator + { + Array<3,float>::full_iterator titer= test.begin_all(); + Array<3,float>::const_full_iterator ctiter= titer; // this should compile + } + } + } + + + { + cerr << "Testing 4D stuff" << endl; + const IndexRange<4> range(Coordinate4D(-3,0,-1,1),Coordinate4D(-2,3,3,3)); + Array<4,float> test4(range); + test4.fill(1.); + test4[-3][1][2][1] = (float)6.6; +#if 0 + test4(-2,1,0,2) = (float)7.3; +#else + test4[-2][1][0][2] = (float)7.3; +#endif + { + float sum = test4.sum(); + check_if_equal( sum , 131.9F, "test on sum()"); + } + const IndexRange<4> larger_range(Coordinate4D(-3,0,-1,1),Coordinate4D(-1,3,3,5)); + test4.grow(larger_range); + check_if_equal(test4.get_index_range(), larger_range, "test Array4D grow index range"); + check_if_equal(test4.sum(), 131.9F , "test Array4D grow sum"); + { + const Array<4,float> test41 = test4; + check_if_equal(test4 , test41, "test Array4D copy constructor" ); + check_if_equal( test41[-3][1][2][1] , 6.6F, "test on indexing after grow"); + } + { + Array<4,float> test41 = test4; + const IndexRange<4> mixed_range(Coordinate4D(-4,1,0,1),Coordinate4D(-2,3,3,6)); + test41.resize(mixed_range); + check_if_equal(test41.get_index_range(), mixed_range, "test Array4D resize index range"); + check_if_equal( test41[-3][1][2][1] , 6.6F, "test on indexing after resize"); + } + { + BasicCoordinate<4,int> c; + c[1]=-2;c[2]=1;c[3]=0;c[4]=2; + check_if_equal(test4[c] , 7.3F , "test on operator[](BasicCoordinate)"); + test4[c]=1.; + check_if_equal(test4[c] , 1.F , "test on operator[](BasicCoordinate)"); + } + { + Array<4,float> test4bis(range); + test4bis[-2][1][2][1] = (float)6.6; + test4bis[-3][1][0][1] = (float)1.3; + Array<4,float> test4ter = test4bis; + + test4ter += test4; + check_if_equal(test4ter[-3][1][0][1] ,2.3F, "test on operator+=(Array4D)"); + check(test4ter.get_index_range() == larger_range, "test range for operator+=(Array4D) with grow"); + + // Note that test4 is bigger in size than test4bis. + Array<4,float> test4quat = test4bis + test4; + check_if_equal(test4quat ,test4ter, "test summing Array4D with grow"); + check(test4quat.get_index_range() == larger_range, "test range for operator+=(Array4D)"); + } + + // test on scalar multiplication, division + { + Array<4,float> test4bis = test4; + test4bis *= 6.F; + check_if_equal(test4bis.sum() ,test4.sum()*6, "test operator *=(float)"); + test4bis /= 5.F; + check_if_equal(test4bis.sum() ,test4.sum()*6.F/5, "test operator /=(float)"); + } + + // test on element-wise multiplication, division + { + Array<4,float> test4bis(range); + { + for (int i=test4bis.get_min_index(); i<= test4bis.get_max_index(); i++) + test4bis[i].fill(i+10.F); + } + // save for comparison later on + Array<4,float> test4ter = test4bis; + + // Note that test4 is bigger than test4bis, so it will grow with the *= + // new elements in test4bis will remain 0 because we're using multiplication + test4[-1].fill(666); + test4bis *= test4; + check_if_zero(test4bis[-1], "test operator *=(Array4D) grows ok"); + + check(test4.get_index_range() == test4bis.get_index_range(), "test operator *=(Array4D) grows ok: range"); + // compute the new sum. + { + float sum_check = 0; + for (int i=test4.get_min_index(); i<= -2; i++) + sum_check += test4[i].sum()*(i+10.F); + check_if_equal(test4bis.sum() ,sum_check, "test operator *=(Array4D)"); + } + // divide test4, but add a tiny number to avoid division by zero + const Array<4,float> test4quat = test4bis / (test4+.00001F); + test4ter.grow(test4.get_index_range()); + check_if_equal(test4ter ,test4quat, "test operator /(Array4D)"); + } + + // test operator+(float) + { + // KT 31/01/2000 new + Array<4,float> tmp= test4 + 2; + Array<4,float> tmp2 = test4; + tmp2.fill(1.F); + + // KT 20/12/2001 made check_if_zero compare relative to 1 by dividing + check_if_zero( (test4.sum() + 2*tmp2.sum() - tmp.sum())/test4.sum(), + "test operator+(float)"); + } + } + +#if 1 + { + cerr << "Testing 1D float IO" << endl; + Array<1,float> t1(IndexRange<1>(-1,10)); + for (int i=-1; i<=10; i++) + t1[i] = static_cast(sin(i* _PI/ 15.)); + run_IO_tests(t1); + } + { + cerr << "Testing 2D double IO" << endl; + IndexRange<2> range(Coordinate2D(-1,11),Coordinate2D(10,20)); + Array<2,double> t1(range); + for (int i=-1; i<=10; i++) + for (int j=11; j<=20; j++) + t1[i][j] = static_cast(sin(i*j* _PI/ 15.)); + run_IO_tests(t1); + } + { + cerr << "Testing 3D float IO" << endl; + + // construct test array which has rows of very different magnitudes, + // numbers in last rows do not fit into short integers + IndexRange<3> range(Coordinate3D(-1,11,21),Coordinate3D(10,20,30)); + Array<3,float> t1(range); + for (int i=-1; i<=10; i++) + for (int j=11; j<=20; j++) + for (int k=21; k<=30; k++) + t1[i][j][k] = static_cast(20000.*k*sin(i*j*k* _PI/ 3000.)); + run_IO_tests(t1); + } +#endif +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main() +{ + ArrayTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_ArrayFilter.cxx b/src/test/test_ArrayFilter.cxx new file mode 100644 index 0000000000..0b626ce98c --- /dev/null +++ b/src/test/test_ArrayFilter.cxx @@ -0,0 +1,452 @@ + +/*! + \file + \ingroup test + + \brief tests for the stir::ArrayFilter classes + + \author Kris Thielemans + + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/Array.h" +#include "stir/ArrayFilterUsingRealDFTWithPadding.h" +#include "stir/ArrayFilter1DUsingConvolution.h" +#include "stir/ArrayFilter1DUsingConvolutionSymmetricKernel.h" +#include "stir/ArrayFilter2DUsingConvolution.h" +#include "stir/IndexRange2D.h" +#include "stir/ArrayFilter3DUsingConvolution.h" +#include "stir/IndexRange3D.h" +#include "stir/Succeeded.h" +#include "stir/modulo.h" +#include "stir/RunTests.h" + +#include "stir/stream.h"//XXX +#include +#include + +#ifdef DO_TIMINGS +#include "stir/CPUTimer.h" +#endif + +START_NAMESPACE_STIR + + +/*! + \brief Tests Array functionality + \ingroup test + +*/ +class ArrayFilterTests : public RunTests +{ +public: + void run_tests(); +private: + + + +template +void +compare_results_1arg(const ArrayFunctionObject& filter1, + const ArrayFunctionObject& filter2, + const Array& test) +{ + { + Array out1(test); + Array out2(out1); + filter1(out1); + filter2(out2); + + check_if_equal( out1, out2, "test comparing output of filters, equal length"); + //std::cerr << out1 << out2; + } + { + Array out1(test); + BasicCoordinate min_indices, max_indices; + check(test.get_regular_range(min_indices, max_indices), "test only works for Arrays of regular range"); + const IndexRange larger_range(min_indices-2, max_indices+1); + out1.resize(larger_range); + + Array out2(out1); + filter1(out1); + filter2(out2); + + if (!check_if_equal( out1, out2, "test comparing output of filters, larger length")) + {}//std::cerr << out1 << out2; + } +} + +template +void +compare_results_2arg(const ArrayFunctionObject& filter1, + const ArrayFunctionObject& filter2, + const Array& test) +{ + BasicCoordinate min_indices, max_indices; + check(test.get_regular_range(min_indices, max_indices), "test only works for Arrays of regular range"); + { + Array out1(test.get_index_range()); + Array out2(out1.get_index_range()); + filter1(out1, test); + filter2(out2, test); + + check_if_equal( out1, out2, "test comparing output of filter2, equal length"); + //std::cerr << out1 << out2; + } + { + const IndexRange larger_range(min_indices-2, max_indices+1); + Array out1(larger_range); + Array out2(larger_range); + filter1(out1, test); + filter2(out2, test); + + check_if_equal( out1, out2, "test comparing output of filter2, larger length"); + //std::cerr << out1 << out2; + } + { + const IndexRange smaller_range(min_indices+2, max_indices-1); + Array out1(smaller_range); + Array out2(smaller_range); + filter1(out1, test); + filter2(out2, test); + + check_if_equal( out1, out2, "test comparing output of filters, smaller length"); + } + if (num_dimensions==1) + { + IndexRange influenced_range; + if (filter2.get_influenced_indices(influenced_range, test.get_index_range())==Succeeded::yes) + { + BasicCoordinate min_indices, max_indices; + check(influenced_range.get_regular_range(min_indices, max_indices), "test only works for Arrays of regular range"); + const IndexRange larger_range(min_indices-3, max_indices+4);// WARNING ALIASING +7 + //Array out1(IndexRange(influenced_range.get_min_index()-3, influenced_range.get_max_index()+4)); + Array out1(larger_range); + Array out2(out1.get_index_range()); + filter1(out1, test); + filter2(out2, test); + + check_if_equal( out1, out2, "test comparing output of filters, out range is in range+ kernel + extra"); + check_if_zero( out2[out2.get_min_index()], "test conv 0 beyond kernel length"); + check_if_zero( out2[out2.get_min_index()+1], "test conv 0 beyond kernel length"); + check_if_zero( out2[out2.get_min_index()+2], "test conv 0 beyond kernel length"); + check_if_zero( out2[out2.get_max_index()], "test conv 0 beyond kernel length"); + check_if_zero( out2[out2.get_max_index()-1], "test conv 0 beyond kernel length"); + check_if_zero( out2[out2.get_max_index()-2], "test conv 0 beyond kernel length"); + check_if_zero( out2[out2.get_max_index()-3], "test conv 0 beyond kernel length"); + + // really not necessary if above tests were ok, + // but in case they failed, this gives some extra info + check_if_zero( out1[out1.get_min_index()], "test DFT 0 beyond kernel length"); + check_if_zero( out1[out1.get_min_index()+1], "test DFT 0 beyond kernel length"); + check_if_zero( out1[out1.get_min_index()+2], "test DFT 0 beyond kernel length"); + check_if_zero( out1[out1.get_max_index()], "test DFT 0 beyond kernel length"); + check_if_zero( out1[out1.get_max_index()-1], "test DFT 0 beyond kernel length"); + check_if_zero( out1[out1.get_max_index()-2], "test DFT 0 beyond kernel length"); + check_if_zero( out1[out1.get_max_index()-3], "test DFT 0 beyond kernel length"); + //std::cerr << out1 << out2; + } + } +} + +}; +void +ArrayFilterTests::run_tests() +{ + std::cerr << "\nTesting 1D\n"; + { + const int size1 = 100; + Array<1,float> test(IndexRange<1>(100));// warning: not using 'size1' here. gcc 3.3 fails to compile it otherwise + Array<1,float> test_neg_offset(IndexRange<1>(-10,size1-11)); + Array<1,float> test_pos_offset(IndexRange<1>(10,size1+9)); + // initialise to some arbitrary values + for (int i=test.get_min_index(); i<=test.get_max_index(); ++i) + test[i]=i*i*2-i-100.F; + std::copy(test.begin(), test.end(), test_neg_offset.begin()); + std::copy(test.begin(), test.end(), test_pos_offset.begin()); + + { + const int kernel_half_length=30; + const int DFT_kernel_size=256; + // necessary to avoid aliasing in DFT + assert(DFT_kernel_size>=(kernel_half_length*2+1)*2); + assert(DFT_kernel_size>=2*size1+3);// note +3 as test grows the array + Array<1,float> kernel_for_DFT(IndexRange<1>(0,DFT_kernel_size-1)); + Array<1,float> kernel_for_conv(IndexRange<1>(-kernel_half_length,kernel_half_length)); + for (int i=-kernel_half_length; i DFT_filter; + check(DFT_filter.set_kernel(kernel_for_DFT)==Succeeded::yes, "initialisation DFT filter"); + ArrayFilter1DUsingConvolution conv_filter(kernel_for_conv); + + check(!DFT_filter.is_trivial(), "DFT is_trivial"); + check(!conv_filter.is_trivial(), "conv is_trivial"); + set_tolerance(test.find_max()*kernel_for_conv.sum()*1.E-6); + //std::cerr << get_tolerance(); + + cerr <<"Comparing DFT and Convolution with input offset 0\n"; + compare_results_2arg(DFT_filter, conv_filter, test); + compare_results_1arg(DFT_filter, conv_filter, test); + cerr <<"Comparing DFT and Convolution with input negative offset\n"; + compare_results_2arg(DFT_filter, conv_filter, test_neg_offset); + compare_results_1arg(DFT_filter, conv_filter, test_neg_offset); + cerr <<"Comparing DFT and Convolution with input positive offset\n"; + compare_results_2arg(DFT_filter, conv_filter, test_pos_offset); + compare_results_1arg(DFT_filter, conv_filter, test_pos_offset); + } + { + const int kernel_half_length=30; + Array<1,float> kernel_for_symconv(IndexRange<1>(0,kernel_half_length)); + Array<1,float> kernel_for_conv(IndexRange<1>(-kernel_half_length,kernel_half_length)); + for (int i=0; i test(IndexRange<1>(100)); + // initialise to some arbitrary values + for (int i=test.get_min_index(); i<=test.get_max_index(); ++i) + test[i]=i*i*2-i-100.F; + + + + ArrayFilter1DUsingConvolution conv_filter(kernel_for_conv); + ArrayFilter1DUsingConvolutionSymmetricKernel symconv_filter(kernel_for_symconv); + + check(!symconv_filter.is_trivial(), "symconv is_trivial"); + check(!conv_filter.is_trivial(), "conv is_trivial"); + set_tolerance(test.find_max()*kernel_for_conv.sum()*1.E-6); + cerr <<"Comparing SymmetricConvolution and Convolution\n"; + // note: SymmetricConvolution cannot handle different input and output ranges + compare_results_1arg(symconv_filter, conv_filter, test); + } + std::cerr << "Testing boundary conditions\n"; + { + Array<1,float> kernel(IndexRange<1>(-1,2)); + kernel[-1] = 1; + kernel[0] = 2; + kernel[1] = 3; + kernel[2] = .5; + const ArrayFilter1DUsingConvolution conv_filter_zero_BC(kernel); + const ArrayFilter1DUsingConvolution conv_filter_cst_BC(kernel, BoundaryConditions::constant); + { + Array<1,float> test(IndexRange<1>(101)); + // initialise to some arbitrary values + for (int i=test.get_min_index(); i<=test.get_max_index(); ++i) + test[i]=i*i*2-i-100.F; + set_tolerance(test.find_max()*kernel.sum()*1.E-6); + + Array<1,float> out_zero_BCs = test; + Array<1,float> out_cst_BCs = test; + conv_filter_zero_BC(out_zero_BCs); + conv_filter_cst_BC(out_cst_BCs); + // test if internal array elements are the same + { + Array<1,float> out_zero_BCs_small=out_zero_BCs; + out_zero_BCs_small.resize(out_zero_BCs.get_min_index() + kernel.get_max_index(), + out_zero_BCs.get_max_index() + kernel.get_min_index()); + Array<1,float> out_cst_BCs_small=out_cst_BCs; + out_cst_BCs_small.resize(out_cst_BCs.get_min_index() + kernel.get_max_index(), + out_cst_BCs.get_max_index() + kernel.get_min_index()); + check_if_equal(out_cst_BCs_small, out_zero_BCs_small, "comparing 1D with different boundary conditions: internal values"); + } + // edge + float left_boundary=test[0]*kernel[2] + test[0]*kernel[1] + test[0]*kernel[0] + test[1]*kernel[-1]; + check_if_equal(out_cst_BCs[0], left_boundary, "1D with cst BC: left edge"); + left_boundary=test[0]*kernel[0] + test[1]*kernel[-1]; + check_if_equal(out_zero_BCs[0], left_boundary, "1D with zero BC: left edge"); + float right_boundary=test[98]*kernel[2] + test[99]*kernel[1] + test[100]*kernel[0] + test[100]*kernel[-1]; + check_if_equal(out_cst_BCs[100], right_boundary, "1D with cst BC: right edge"); + right_boundary=test[98]*kernel[2] + test[99]*kernel[1] + test[100]*kernel[0]; + check_if_equal(out_zero_BCs[100], right_boundary, "1D with zero BC: right edge"); + } + { + Array<1,float> test(-2,5), test_out(-5,8); + test.fill(1.F); + set_tolerance(test.find_max()*kernel.sum()*1.E-6); + conv_filter_zero_BC(test_out, test); + check_if_equal(test_out[-5],0.F,"1D with zero BC: element -5"); + check_if_equal(test_out[-4],0.F,"1D with zero BC: element -4"); + check_if_equal(test_out[-3],kernel[-1],"1D with zero BC: element -3"); + check_if_equal(test_out[-2],kernel[-1]+kernel[0],"1D with zero BC: element -2"); + check_if_equal(test_out[-1],kernel[-1]+kernel[0]+kernel[1],"1D with zero BC: element -1"); + check_if_equal(test_out[0],kernel[2]+kernel[1]+kernel[0]+kernel[-1],"1D with zero BC: element 0"); + check_if_equal(test_out[4],kernel[2]+kernel[1]+kernel[0]+kernel[-1],"1D with zero BC: element 4"); + check_if_equal(test_out[5],kernel[2]+kernel[1]+kernel[0],"1D with zero BC: element 5"); + check_if_equal(test_out[6],kernel[2]+kernel[1],"1D with zero BC: element 6"); + check_if_equal(test_out[7],kernel[2],"1D with zero BC: element 7"); + check_if_equal(test_out[8],0.F,"1D with zero BC: element 8"); + conv_filter_cst_BC(test_out, test); + const float sum=kernel.sum(); + check_if_equal(test_out[-5],sum,"1D with cst BC: element -5"); + check_if_equal(test_out[-4],sum,"1D with cst BC: element -4"); + check_if_equal(test_out[-3],sum,"1D with cst BC: element -3"); + check_if_equal(test_out[-2],sum,"1D with cst BC: element -2"); + check_if_equal(test_out[-1],sum,"1D with cst BC: element -1"); + check_if_equal(test_out[0],sum,"1D with cst BC: element 0"); + check_if_equal(test_out[4],sum,"1D with cst BC: element 4"); + check_if_equal(test_out[5],sum,"1D with cst BC: element 5"); + check_if_equal(test_out[6],sum,"1D with cst BC: element 6"); + check_if_equal(test_out[7],sum,"1D with cst BC: element 7"); + check_if_equal(test_out[8],sum,"1D with cst BC: element 8"); + } + } // boundary conditions + + + } // 1D + + std::cerr << "\nTesting 2D\n"; + { + set_tolerance(.001F); + const int size1=6;const int size2=20; + Array<2,float> test(IndexRange2D(size1,size2)); + Array<2,float> test_neg_offset(IndexRange2D(-5,size1-6,-10,size2-11)); + Array<2,float> test_pos_offset(IndexRange2D(1,size1,2,size2+1)); + // initialise to some arbitrary values + { + Array<2,float>::full_iterator iter = test.begin_all(); + /*for (int i=-100; iter != test.end_all(); ++i, ++iter) + *iter = 1;//i*i*2.F-i-100.F;*/ + test[0][0]=1; + std::copy(test.begin_all(), test.end_all(), test_neg_offset.begin_all()); + std::copy(test.begin_all(), test.end_all(), test_pos_offset.begin_all()); + } + { + const int kernel_half_length=14; + const int DFT_kernel_size=64; + // necessary to avoid aliasing in DFT + assert(DFT_kernel_size>=(kernel_half_length*2+1)*2); + assert(DFT_kernel_size>=2*size2+3);// note +3 as test grows the array + assert(DFT_kernel_size>=2*size1+3);// note +3 as test grows the array + const Coordinate2D sizes(DFT_kernel_size/2,DFT_kernel_size); + Array<2,float> kernel_for_DFT(IndexRange2D(DFT_kernel_size/2,DFT_kernel_size)); + Array<2,float> kernel_for_conv(IndexRange2D(-(kernel_half_length/2),kernel_half_length/2, + -kernel_half_length,kernel_half_length)); + for (int i=-(kernel_half_length/2); i index(i,j); + kernel_for_conv[index] = i*i-3*i+1.F+j*i/20.F; + kernel_for_DFT[modulo(index,sizes)] = + kernel_for_conv[index]; + } + + + ArrayFilterUsingRealDFTWithPadding<2,float> DFT_filter; + check(DFT_filter.set_kernel(kernel_for_DFT)==Succeeded::yes, "initialisation DFT filter"); + ArrayFilter2DUsingConvolution conv_filter(kernel_for_conv); + + check(!DFT_filter.is_trivial(), "DFT is_trivial"); + check(!conv_filter.is_trivial(), "conv is_trivial"); + set_tolerance(test.find_max()*kernel_for_conv.sum()*1.E-6); + //std::cerr << get_tolerance(); + + cerr <<"Comparing DFT and Convolution with input offset 0\n"; + compare_results_2arg(DFT_filter, conv_filter, test); + compare_results_1arg(DFT_filter, conv_filter, test); + cerr <<"Comparing DFT and Convolution with input negative offset\n"; + compare_results_2arg(DFT_filter, conv_filter, test_neg_offset); + compare_results_1arg(DFT_filter, conv_filter, test_neg_offset); + cerr <<"Comparing DFT and Convolution with input positive offset\n"; + compare_results_2arg(DFT_filter, conv_filter, test_pos_offset); + compare_results_1arg(DFT_filter, conv_filter, test_pos_offset); + } + } + std::cerr << "\nTesting 3D\n"; + { + set_tolerance(.001F); + const int size1=5;const int size2=7; const int size3=6; + Array<3,float> test(IndexRange3D(size1,size2,size3)); + Array<3,float> test_neg_offset(IndexRange3D(-5,size1-6,-10,size2-11,-4,size3-5)); + Array<3,float> test_pos_offset(IndexRange3D(1,size1,2,size2+1,3,size3+4)); + // initialise to some arbitrary values + { + Array<3,float>::full_iterator iter = test.begin_all(); + for (int i=-100; iter != test.end_all(); ++i, ++iter) + *iter = 1;//i*i*2.F-i-100.F; + std::copy(test.begin_all(), test.end_all(), test_neg_offset.begin_all()); + std::copy(test.begin_all(), test.end_all(), test_pos_offset.begin_all()); + } + { + const int kernel_half_length=7; + const int DFT_kernel_size=32; + // necessary to avoid aliasing in DFT + assert(DFT_kernel_size>=(kernel_half_length*2+1)*2); + assert(DFT_kernel_size/2>=2*size1+3);// note +3 as test grows the array + assert(DFT_kernel_size>=2*size2+3);// note +3 as test grows the array + assert(DFT_kernel_size>=2*size3+3);// note +3 as test grows the array + const Coordinate3D sizes(DFT_kernel_size/2,DFT_kernel_size,DFT_kernel_size); + Array<3,float> kernel_for_DFT(IndexRange3D(DFT_kernel_size/2,DFT_kernel_size,DFT_kernel_size)); + Array<3,float> kernel_for_conv(IndexRange3D(-(kernel_half_length/2),kernel_half_length/2, + -kernel_half_length,kernel_half_length, + -kernel_half_length,kernel_half_length)); + for (int i=-(kernel_half_length/2); i index(i,j,k); + kernel_for_conv[index] = i*i-3*i+1.F+j*i/20.F+k; + kernel_for_DFT[modulo(index,sizes)] = + kernel_for_conv[index]; + } + + + ArrayFilterUsingRealDFTWithPadding<3,float> DFT_filter; + check(DFT_filter.set_kernel(kernel_for_DFT)==Succeeded::yes, "initialisation DFT filter"); + ArrayFilter3DUsingConvolution conv_filter(kernel_for_conv); + + check(!DFT_filter.is_trivial(), "DFT is_trivial"); + check(!conv_filter.is_trivial(), "conv is_trivial"); + set_tolerance(test.find_max()*kernel_for_conv.sum()*1.E-6); + //std::cerr << get_tolerance(); + + cerr <<"Comparing DFT and Convolution with input offset 0\n"; + compare_results_2arg(DFT_filter, conv_filter, test); + compare_results_1arg(DFT_filter, conv_filter, test); + cerr <<"Comparing DFT and Convolution with input negative offset\n"; + compare_results_2arg(DFT_filter, conv_filter, test_neg_offset); + compare_results_1arg(DFT_filter, conv_filter, test_neg_offset); + cerr <<"Comparing DFT and Convolution with input positive offset\n"; + compare_results_2arg(DFT_filter, conv_filter, test_pos_offset); + compare_results_1arg(DFT_filter, conv_filter, test_pos_offset); + } + } + +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main() +{ + ArrayFilterTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_ByteOrder.cxx b/src/test/test_ByteOrder.cxx new file mode 100644 index 0000000000..a8a82cbc36 --- /dev/null +++ b/src/test/test_ByteOrder.cxx @@ -0,0 +1,90 @@ +/*! + + \file + \ingroup test + + \brief Test program for stir::ByteOrder and ByteOrderDefine.h + + \author Kris Thielemans + \author PARAPET project + + +*/ +/* + Copyright (C) 2004- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ByteOrder.h" +#include "stir/ByteOrderDefine.h" +#include "stir/RunTests.h" + +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + + +/*! + \brief Test class for ByteOrder and the preprocessor defines from + ByteOrderDefine.h + \ingroup test +*/ +class ByteOrderTests : public RunTests +{ +public: + void run_tests(); +}; + +void +ByteOrderTests::run_tests() +{ + cerr << "Tests for ByteOrder\n" + << "Everythings is fine if the program runs without any output." << endl; + // if any of these is wrong, check ByteOrderDefine.h + +#if STIRIsNativeByteOrderBigEndian + check(ByteOrder::get_native_order() == ByteOrder::big_endian, + "STIRIsNativeByteOrderBigEndian preprocessor define is determined incorrectly."); +#else + check(ByteOrder::get_native_order() == ByteOrder::little_endian, + "STIRIsNativeByteOrderBigEndian preprocessor define is determined incorrectly."); +#endif + +#if STIRIsNativeByteOrderLittleEndian + check(ByteOrder::get_native_order() == ByteOrder::little_endian, + "STIRIsNativeByteOrderBigEndian preprocessor define is determined incorrectly."); +#else + check(ByteOrder::get_native_order() == ByteOrder::big_endian, + "STIRIsNativeByteOrderBigEndian preprocessor define is determined incorrectly."); +#endif + +} + + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main() +{ + ByteOrderTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_DynamicDiscretisedDensity.cxx b/src/test/test_DynamicDiscretisedDensity.cxx new file mode 100644 index 0000000000..6bdf6eeed4 --- /dev/null +++ b/src/test/test_DynamicDiscretisedDensity.cxx @@ -0,0 +1,284 @@ +// +// +/* + Copyright (C) 2005- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + \brief tests the stir::DynamicDiscretisedDensity class + + \author Charalampos Tsoumpas + \author Kris Thielemans +*/ + +#include "stir/RunTests.h" +#include "stir/IndexRange2D.h" +#include "stir/stream.h" +#include "stir/Succeeded.h" +#include +#include "stir/DynamicDiscretisedDensity.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/DiscretisedDensity.h" +#include "stir/shared_ptr.h" +#include "stir/TimeFrameDefinitions.h" +#include "stir/Scanner.h" +#include "stir/IO/read_from_file.h" +#include +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +START_NAMESPACE_STIR + + class DynamicDiscretisedDensityTests : public RunTests + { + public: + DynamicDiscretisedDensityTests() + {} + void run_tests(); + //private: + }; + + void DynamicDiscretisedDensityTests::run_tests() +{ + { + // Simple Test of one voxel + cerr << "Testing DynamicDiscretisedDensity class for one voxel..." << endl; + + set_tolerance(0.000000000000001); + const CartesianCoordinate3D< float > origin (0.F,0.F,0.F); + BasicCoordinate<3, float > grid_spacing ; + grid_spacing[1] = 1.F; + grid_spacing[2] = 1.F; + grid_spacing[3] = 1.F; + BasicCoordinate<3,int> sizes ; + sizes[1]=1; + sizes[2]=1; + sizes[3]=1; + IndexRange<3> range(sizes); + + const shared_ptr > + frame1_sptr(new VoxelsOnCartesianGrid (range, origin, grid_spacing)); + (*frame1_sptr)[0][0][0] = 1.F; + + std::vector< std::pair< double, double > > time_frame_definitions_vector(1) ; + std::pair< double, double > time_frame_pair(1.,1.) ; + time_frame_definitions_vector[0]=time_frame_pair; + const TimeFrameDefinitions time_frame_definitions(time_frame_definitions_vector); + const double scan_start_time_in_secs_since_1970 = double(1277478034); // somewhere in June 2010... + + Scanner::Type test_scanner=Scanner::E966; + shared_ptr scanner_sptr(new Scanner(test_scanner)); + DynamicDiscretisedDensity dynamic_image(time_frame_definitions, scan_start_time_in_secs_since_1970, scanner_sptr); + dynamic_image.set_density_sptr(frame1_sptr, 1); + check_if_equal(dynamic_image[1][0][0][0],1.F,"check DynamicDiscretisedDensity class implementation"); + } + { + // Test of two frame images, read voxel + cerr << "Writing DynamicDiscretisedDensity class for two frames 63x128x128..." << endl; + + set_tolerance(0.001); + const CartesianCoordinate3D< float > origin (0.F,0.F,0.F); + BasicCoordinate<3, float > grid_spacing ; + grid_spacing[1] = 2.425F; + grid_spacing[2] = 2.0594F; + grid_spacing[3] = 2.0594F; + BasicCoordinate<3,int> min_size, max_size; + min_size[1]=0; min_size[2]=-64; min_size[3]=-64; + max_size[1]=63; max_size[2]=63; max_size[3]=63; + + IndexRange<3> range(min_size,max_size); + const shared_ptr > + frame1_2_sptr(new VoxelsOnCartesianGrid (range, origin, grid_spacing)); + const shared_ptr > + frame2_2_sptr(new VoxelsOnCartesianGrid (range, origin, grid_spacing)); + + for(int k=min_size[3];k > time_frame_definitions_vector(2) ; + std::pair< double, double > first_time_frame_pair(1.,3.) ; + std::pair< double, double > second_time_frame_pair(3.,6.) ; + + time_frame_definitions_vector[0]=first_time_frame_pair; + time_frame_definitions_vector[1]=second_time_frame_pair; + + const TimeFrameDefinitions time_frame_definitions(time_frame_definitions_vector); + const double scan_start_time_in_secs_since_1970 = double(1277478034); // somewhere in June 2010... + Scanner::Type test_scanner=Scanner::E966; + shared_ptr scanner_sptr(new Scanner(test_scanner)); + + DynamicDiscretisedDensity empty_dynamic_image(time_frame_definitions, + scan_start_time_in_secs_since_1970, + scanner_sptr,frame1_2_sptr); + + DynamicDiscretisedDensity dynamic_image(time_frame_definitions, + scan_start_time_in_secs_since_1970, + scanner_sptr); + dynamic_image.set_density_sptr(frame1_2_sptr, 1); + dynamic_image.set_density_sptr(frame2_2_sptr, 2); + + string string_test("STIRtmp_dyn2f.img"); + string string_empty_test("STIRtmp_dyn2f_empty.img"); + +#ifdef HAVE_LLN_MATRIX + check(dynamic_image.write_to_ecat7(string_test)==Succeeded::yes,"check DynamicDiscretisedDensity::write_to_ecat7 implementation"); +#endif + check_if_equal((empty_dynamic_image.get_density(1)).find_min(),0.F,"check DynamicDiscretisedDensity constructor implementation"); + check_if_equal((empty_dynamic_image.get_density(1)).find_max(),0.F,"check DynamicDiscretisedDensity constructor implementation"); + check_if_equal((empty_dynamic_image.get_density(2)).find_min(),0.F,"check DynamicDiscretisedDensity constructor implementation"); + check_if_equal((empty_dynamic_image.get_density(2)).find_max(),0.F,"check DynamicDiscretisedDensity constructor implementation"); +} + { + // Test of three frame images, read voxel + cerr << "Testing DynamicDiscretisedDensity class for three frames..." << endl; + + set_tolerance(0.001); + const CartesianCoordinate3D< float > origin (0.F,0.F,0.F); + BasicCoordinate<3, float > grid_spacing ; + grid_spacing[1] = 2.425F; + grid_spacing[2] = 2.0594F; + grid_spacing[3] = 2.0594F; + BasicCoordinate<3,int> min_size, max_size; + min_size[1]=0; min_size[2]=-64; min_size[3]=-64; + max_size[1]=63; max_size[2]=63; max_size[3]=63; + IndexRange<3> range(min_size,max_size); + const shared_ptr > + frame1_3_sptr(new VoxelsOnCartesianGrid (range, origin, grid_spacing)); + const shared_ptr > + frame2_3_sptr(new VoxelsOnCartesianGrid (range, origin, grid_spacing)); + const shared_ptr > + frame3_3_sptr(new VoxelsOnCartesianGrid (range, origin, grid_spacing)); + + for(int k=min_size[3];k > time_frame_definitions_vector(3) ; + std::pair< double, double > first_time_frame_pair(1.,3.) ; + std::pair< double, double > second_time_frame_pair(3.,6.) ; + std::pair< double, double > third_time_frame_pair(6.5,7.) ; + + time_frame_definitions_vector[0]=first_time_frame_pair; + time_frame_definitions_vector[1]=second_time_frame_pair; + time_frame_definitions_vector[2]=third_time_frame_pair; + + const TimeFrameDefinitions time_frame_definitions(time_frame_definitions_vector); + const double scan_start_time_in_secs_since_1970 = double(1277478034); // somewhere in June 2010... + Scanner::Type test_scanner=Scanner::E966; + shared_ptr scanner_sptr(new Scanner(test_scanner)); + DynamicDiscretisedDensity dynamic_image(time_frame_definitions, + scan_start_time_in_secs_since_1970, + scanner_sptr); + dynamic_image.set_density_sptr(frame1_3_sptr, 1); + dynamic_image.set_density_sptr(frame2_3_sptr, 2); + dynamic_image.set_density_sptr(frame3_3_sptr, 3); + + // testing full iterators + { + DiscretisedDensity<3,float>::const_full_iterator dens_iter; + DynamicDiscretisedDensity::const_full_iterator dyn_dens_iter = dynamic_image.begin_all_const(); + bool ok_upto_now = true; + // check frame 1 + dens_iter = frame1_3_sptr->begin_all_const(); + while (ok_upto_now && dens_iter != frame1_3_sptr->end_all_const()) + { + ok_upto_now = check_if_equal(*dyn_dens_iter++, *dens_iter++, "check full-iterator: frame 1"); + } + // check frame 2 + dens_iter = frame2_3_sptr->begin_all_const(); + while (ok_upto_now && dens_iter != frame2_3_sptr->end_all_const()) + { + ok_upto_now = check_if_equal(*dyn_dens_iter++, *dens_iter++, "check full-iterator: frame 1"); + } + // check frame 3 + dens_iter = frame3_3_sptr->begin_all_const(); + while (ok_upto_now && dens_iter != frame3_3_sptr->end_all_const()) + { + ok_upto_now = check_if_equal(*dyn_dens_iter++, *dens_iter++, "check full-iterator: frame 1"); + } + } +#ifndef HAVE_LLN_MATRIX + warning("write_to_ecat7 not tested as LLN library not present"); +#else + string string_test("STIRtmp_dyn3f.img");//TODO: Use the path info!!! + // string string_test2("./local/samples/dyn_image_write_to_ecat7_test2.img"); + // dynamic_image.write_to_ecat7(string_test); + check(dynamic_image.write_to_ecat7(string_test)==Succeeded::yes,"check DynamicDiscretisedDensity::write_to_ecat7 implementation"); + shared_ptr< DynamicDiscretisedDensity > + dyn_image_read_test_sptr(read_from_file(string_test)); + const DynamicDiscretisedDensity & dyn_image_read_test = *dyn_image_read_test_sptr; + // dyn_image_read_test.write_to_ecat7(string_test2); + + for(int k=min_size[3];k range1(1,3); + IndexRange<1> range2(2,4); + VectorWithOffset< IndexRange<1> > range2d(3,4); + range2d[3]=range1; + range2d[4]=range2; + IndexRange<2> idx_range2d = range2d; + + check(idx_range2d[3].get_min_index() == range1.get_min_index(), + "testing constructor from base_type"); + check(idx_range2d[3].get_max_index() == range1.get_max_index(), + "testing constructor from base_type"); + check(idx_range2d.is_regular()==false, + "testing is_regular on irregular range"); + } + // make a regular range + { + IndexRange<1> range1(1,3); + VectorWithOffset< IndexRange<1> > range2d(3,4); + range2d[3]=range1; + range2d[4]=range1; + IndexRange<2> idx_range2d = range2d; + + check(idx_range2d[3].get_min_index() == range1.get_min_index(), + "testing constructor from base_type"); + check(idx_range2d[3].get_max_index() == range1.get_max_index(), + "testing constructor from base_type"); + check(idx_range2d.is_regular()==true, + "testing is_regular on irregular range"); + + IndexRange2D another_idx_range2d(3,4, 1,3); + check(another_idx_range2d == idx_range2d, "test IndexRange2D"); + } + + { + Coordinate3D low(1,2,3); + Coordinate3D high(3,4,5); + IndexRange<3> idx_range3d(low, high); + + check(idx_range3d[3].get_max_index() == 4, + "testing constructor from 2 Coordinate objects"); + check(idx_range3d.is_regular()==true, + "testing is_regular on regular range"); + Coordinate3D low_test, high_test; + if (idx_range3d.get_regular_range(low_test, high_test)) + { + check_if_equal(low, low_test, "testing is_regular on regular range: lower indices"); + check_if_equal(high, high_test, "testing is_regular on regular range: higher indices"); + } + + IndexRange3D another_idx_range3d(low[1],high[1], low[2], high[2], low[3], high[3]); + check(another_idx_range3d == idx_range3d, "test IndexRange3D"); + } + { + const Coordinate3D sizes(3,4,5); + const IndexRange<3> idx_range3d(sizes); + + check(idx_range3d.get_max_index() == 2, + "testing constructor from 1 Coordinate object"); + check(idx_range3d[0].get_max_index() == 3, + "testing constructor from 1 Coordinate object"); + check(idx_range3d[0][0].get_max_index() == 4, + "testing constructor from 1 Coordinate object"); + check(idx_range3d.is_regular()==true, + "testing is_regular on regular range"); + Coordinate3D low_test, high_test; + if (idx_range3d.get_regular_range(low_test, high_test)) + { + check_if_equal(Coordinate3D(0,0,0), low_test, "testing is_regular on regular range: lower indices"); + check_if_equal(sizes-1, high_test, "testing is_regular on regular range: higher indices"); + } + + const IndexRange3D another_idx_range3d(sizes[1], sizes[2], sizes[3]); + check(another_idx_range3d == idx_range3d, "test IndexRange3D"); + } + +} + +END_NAMESPACE_STIR + + + +USING_NAMESPACE_STIR + + +int main() +{ + IndexRange_Tests tests; + tests.run_tests(); + return tests.main_return_value(); + +} diff --git a/src/test/test_NestedIterator.cxx b/src/test/test_NestedIterator.cxx new file mode 100644 index 0000000000..39bfcbde78 --- /dev/null +++ b/src/test/test_NestedIterator.cxx @@ -0,0 +1,440 @@ +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup test + + \brief tests for the stir::NestedIterator class + + \author Kris Thielemans + +*/ + +#include "stir/Array.h" +#include "stir/BasicCoordinate.h" +#include "stir/Succeeded.h" + +#include "stir/RunTests.h" +#include "stir/NestedIterator.h" +#include "stir/shared_ptr.h" +#include +#include +#include + +START_NAMESPACE_STIR + +/*! + \brief Tests NestedIterator functionality + \ingroup test + + \todo Code is ugly. Copy-paste with tiny modifications. +*/ +class NestedIteratorTests : public RunTests +{ +private: + +public: + void run_tests(); +}; + + +void +NestedIteratorTests::run_tests() +{ + + std::cerr << "Testing NestedIterator\n"; + { + std::cerr << "Compare with full iterator\n"; + { + IndexRange<2> range(make_coordinate(0,0),make_coordinate(2,2)); + Array<2,float> test2(range); + + { + float value = 1.2F; + for (Array<2,float>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + *iter++ = value++; + } + + check(test2.begin()->begin() == BeginEndFunction::iterator>().begin(test2.begin()), "begin"); + check((test2.begin()+1)->begin() == BeginEndFunction::iterator>().begin(test2.begin()+1), "begin"); + typedef NestedIterator::iterator> FullIter; + FullIter fiter1; + FullIter fiter(test2.begin(),test2.end()); + //fiter1=fiter; + const FullIter fiter_end(test2.end(),test2.end()); + for (Array<2,float>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + { + check(fiter!=fiter_end, "fiter"); + check(*fiter++ == *iter++,"fiter=="); + } + + check(fiter==fiter_end,"fiter end"); + // check(test2.begin()->begin() == make_begin_function(test2.begin())(), "begin"); + + const Array<2,float> empty; + check(empty.begin_all() == empty.end_all(), "test on 2D full iterator for empty range"); + } + } + + std::cerr<< " full iterator coord\n"; + { + IndexRange<2> range(make_coordinate(0,0),make_coordinate(2,2)); + typedef BasicCoordinate<2,float> elemT; + Array<2,elemT > test2(range); + + { + float value = 1.2F; + for (Array<2,elemT>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + { + *iter++ = make_coordinate(value,value+.3F); + ++value; + } + } + + check(test2.begin()->begin() == BeginEndFunction::iterator>().begin(test2.begin()), "begin"); + check((test2.begin()+1)->begin() == BeginEndFunction::iterator>().begin(test2.begin()+1), "begin"); + typedef NestedIterator::iterator> + FullIter; + FullIter fiter1; + FullIter fiter(test2.begin(),test2.end()); + //fiter1=fiter; + const FullIter fiter_end(test2.end(),test2.end()); + { + for (Array<2,elemT>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + { + check(fiter!=fiter_end, "fiter"); + check(*fiter++ == *iter++,"fiter=="); + } + } + check(fiter==fiter_end,"fiter end"); + } + + std::cerr<< " full iterator coord\n"; + { + IndexRange<2> range(make_coordinate(0,0),make_coordinate(2,2)); + typedef BasicCoordinate<2,float> elemT; + Array<2,elemT > test(range); + + { + float value = 1.2F; + for (Array<2,elemT>::full_iterator iter = test.begin_all(); + iter != test.end_all(); + ) + { + *iter++ = make_coordinate(value,value+.3F); + ++value; + } + } + + const Array<2,elemT> test2 = test; +# if defined __GNUC__ && __GNUC__ < 3 + // at some point, it seemed we needed a work-around for gcc 3 or earlier, but that is no longer the case + typedef BeginEndFunction::const_iterator> constbeginendfunction_type; +#else + typedef ConstBeginEndFunction::const_iterator> constbeginendfunction_type; +#endif + + check(test2.begin()->begin() == constbeginendfunction_type().begin(test2.begin()), "begin"); + check((test2.begin()+1)->begin() == constbeginendfunction_type().begin(test2.begin()+1), "begin"); + typedef NestedIterator::const_iterator, constbeginendfunction_type> + FullIter; + FullIter fiter1; + FullIter fiter(test2.begin(),test2.end()); + //fiter1=fiter; + FullIter fiter_end(test2.end(),test2.end()); + + { + for (Array<2,elemT>::const_full_iterator iter = test2.begin_all_const(); + iter != test2.end_all_const(); + ) + { + check(fiter!=fiter_end, "fiter"); + check(*fiter++ == *iter++,"fiter=="); + } + } + check(fiter==fiter_end,"fiter end"); + } + + std::cerr<< " full iterator coord full\n"; + { + IndexRange<2> range(make_coordinate(0,0),make_coordinate(2,2)); + typedef BasicCoordinate<2,float> elemT; + Array<2,elemT > test2(range); + + { + float value = 1.2F; + for (Array<2,elemT>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + { + *iter++ = make_coordinate(value,value+.3F); + ++value; + } + } + + check(test2.begin()->begin() == BeginEndFunction::iterator>().begin(test2.begin()), "begin"); + check((test2.begin()+1)->begin() == BeginEndFunction::iterator>().begin(test2.begin()+1), "begin"); + typedef + NestedIterator::full_iterator, + BeginEndFunction::full_iterator> > + FullIter; + FullIter fiter1; + FullIter fiter(test2.begin_all(),test2.end_all()); + //fiter1=fiter; + FullIter fiter_end(test2.end_all(),test2.end_all()); + + { + for (Array<2,elemT>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + { + check(fiter!=fiter_end, "fiter"); + check_if_equal(*fiter++, *iter->begin(),"fiter== 0"); + check_if_equal(*fiter++,*(iter->begin()+1),"fiter== 1"); + ++iter; + } + } + check(fiter==fiter_end,"fiter end"); + } + + std::cerr<< " full iterator coord full const\n"; + { + IndexRange<2> range(make_coordinate(0,0),make_coordinate(2,2)); + typedef BasicCoordinate<2,float> elemT; + Array<2,elemT > test(range); + + { + float value = 1.2F; + for (Array<2,elemT>::full_iterator iter = test.begin_all(); + iter != test.end_all(); + ) + { + *iter++ = make_coordinate(value,value+.3F); + ++value; + } + + } + const Array<2,elemT> test2 = test; + + check(test2.begin_all_const()->begin() == ConstBeginEndFunction::const_full_iterator>().begin(test2.begin_all_const()), "begin"); + typedef + NestedIterator::const_full_iterator, + ConstBeginEndFunction::const_full_iterator> > + FullIter; + FullIter fiter1; + FullIter fiter(test2.begin_all_const(),test2.end_all_const()); + //fiter1=fiter; + FullIter fiter_end(test2.end_all_const(),test2.end_all_const()); + + { + for (Array<2,elemT>::const_full_iterator iter = test2.begin_all_const(); + iter != test2.end_all_const(); + ) + { + check(fiter!=fiter_end, "fiter"); + check_if_equal(*fiter++, *iter->begin(),"fiter== 0"); + check_if_equal(*fiter++,*(iter->begin()+1),"fiter== 1"); + ++iter; + } + } + check(fiter==fiter_end,"fiter end"); + } + + std::cerr<< " full iterator coord full\n"; + { + IndexRange<2> range(make_coordinate(0,0),make_coordinate(2,2)); + typedef BasicCoordinate<2,float> elemT; + Array<2,elemT > test2(range); + + { + float value = 1.2F; + for (Array<2,elemT>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + { + *iter++ = make_coordinate(value,value+.3F); + ++value; + } + } + + check(test2.begin()->begin() == BeginEndFunction::iterator>().begin(test2.begin()), "begin"); + check((test2.begin()+1)->begin() == BeginEndFunction::iterator>().begin(test2.begin()+1), "begin"); + typedef + NestedIterator::full_iterator, + BeginEndFunction::full_iterator> > + FullIter; + FullIter fiter1; + FullIter fiter(test2.begin_all(),test2.end_all()); + //fiter1=fiter; + FullIter fiter_end(test2.end_all(),test2.end_all()); + + { + for (Array<2,elemT>::full_iterator iter = test2.begin_all(); + iter != test2.end_all(); + ) + { + check(fiter!=fiter_end, "fiter"); + check_if_equal(*fiter++, *iter->begin(),"fiter== 0"); + check_if_equal(*fiter++,*(iter->begin()+1),"fiter== 1"); + ++iter; + } + } + check(fiter==fiter_end,"fiter end"); + } + std::cerr<< " NestedIterator vector\n"; + { + typedef std::list C2; + typedef std::vector C1; + C1 c(2); + c[0].push_back(1); c[0].push_back(2); + c[1].push_back(3); c[1].push_back(4); c[1].push_back(5); + // normal iterator + { + typedef NestedIterator FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + int count=1; + while (fiter != fiter_end) + { + check_if_equal(*fiter++, count++, "nestiterator of vector"); + } + check_if_equal(count, 6, "nestiterator of vector: num elements"); + } + // const iterator + { + typedef NestedIterator > FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + int count=1; + while (fiter != fiter_end) + { + check_if_equal(*fiter++, count++, "nestiterator of vector"); + } + check_if_equal(count, 6, "nestiterator of vector: num elements"); + } + // test conversion from full_iterator to const_full_iterator + { + typedef NestedIterator > CFullIter; + typedef NestedIterator FullIter; + FullIter fiter(c.begin(),c.end()); + CFullIter cfiter= fiter; // this should compile + } + } + std::cerr<< " NestedIterator vector\n"; + { + typedef std::list C2; + typedef std::vector C1; + C1 c(2); + c[0] = new C2; + c[1] = new C2; + c[0]->push_back(1); c[0]->push_back(2); + c[1]->push_back(3); c[1]->push_back(4); c[1]->push_back(5); + // normal iterator + { + typedef NestedIterator > FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + int count=1; + while (fiter != fiter_end) + { + check_if_equal(*fiter++, count++, "nestiterator of vector< list *>"); + } + check_if_equal(count, 6, "nestiterator of vector: num elements"); + } + // const iterator + { + typedef NestedIterator > FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + int count=1; + while (fiter != fiter_end) + { + check_if_equal(*fiter++, count++, "nestiterator of vector< list *>"); + } + check_if_equal(count, 6, "nestiterator of vector: num elements"); + } + delete c[0]; + delete c[1]; + } + + std::cerr<< " NestedIterator vector< shared_ptr >\n"; + { + IndexRange<2> range1(make_coordinate(0,0),make_coordinate(1,2)); + IndexRange<2> range2(make_coordinate(0,0),make_coordinate(1,3)); + typedef int elemT; + typedef Array<2,int> C2; + typedef std::vector > C1; + C1 c(2); + c[0].reset(new C2(range1)); + c[1].reset(new C2(range2)); + int count = 1; + for (C2::full_iterator fullarrayiter = c[0]->begin_all(); fullarrayiter != c[0]->end_all(); + ++fullarrayiter, ++count) + *fullarrayiter = count; + for (C2::full_iterator fullarrayiter = c[1]->begin_all(); fullarrayiter != c[1]->end_all(); + ++fullarrayiter, ++count) + *fullarrayiter = count; + + // normal iterator + { + typedef NestedIterator > FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + count=1; + while (fiter != fiter_end) + { + check_if_equal(*fiter++, count++, "nestiterator of vector>>"); + } + check_if_equal(count, static_cast(c[0]->size_all() + c[1]->size_all() + 1), + "nestiterator of vector>>: num elements"); + } + // const iterator + { + typedef NestedIterator > FullIter; + FullIter fiter(c.begin(),c.end()); + const FullIter fiter_end(c.end(),c.end()); + count=1; + while (fiter != fiter_end) + { + check_if_equal(*fiter++, count++, "nestiterator of vector>>"); + } + check_if_equal(count, static_cast(c[0]->size_all() + c[1]->size_all() + 1), + "nestiterator of vector>>: num elements"); + } + } + +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main() +{ + NestedIteratorTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_OutputFileFormat.cxx b/src/test/test_OutputFileFormat.cxx new file mode 100644 index 0000000000..3520a74374 --- /dev/null +++ b/src/test/test_OutputFileFormat.cxx @@ -0,0 +1,250 @@ +// +// +/*! + + \file + \ingroup test + + \brief A simple program to test the stir::OutputFileFormat function. + + \author Kris Thielemans + + + + To run the test, you should use a command line argument with the name of a file. + This should contain a test par file. + See stir::OutputFileFormatTests class documentation for file contents. + + \warning Overwrites files STIRtmp.* in the current directory + + \todo The current implementation requires that the output file format as also + readable by stir::read_from_file. At least we should provide a + run-time switch to not run that part of the tests. +*/ +/* + Copyright (C) 2002- 2011, Hammersmith Imanet Ltd + + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#ifdef HAVE_LLN_MATRIX +#include "stir/IO/ECAT6OutputFileFormat.h" // need this for test on pixel_size +#endif +#include "stir/RunTests.h" +#include "stir/KeyParser.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/IndexRange3D.h" + +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::ifstream; +using std::istream; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief A simple class to test the OutputFileFormat function. + + The class reads input from a stream, whose contents should be as + follows: + + \verbatim + Test OutputFileFormat Parameters:= + output file format type := + ; here are parameters specific for the file format + End:= + \endverbatim + + \warning Overwrites files STIRtmp.* in the current directory + \todo Delete STIRtmp.* files, but that's a bit difficult as we don't know which ones + are written. +*/ +class OutputFileFormatTests : public RunTests +{ +public: + OutputFileFormatTests(istream& in) ; + + void run_tests(); +private: + istream& in; + shared_ptr > > output_file_format_ptr; + KeyParser parser; +}; + +OutputFileFormatTests:: +OutputFileFormatTests(istream& in) : + in(in) +{ + output_file_format_ptr.reset(); + parser.add_start_key("Test OutputFileFormat Parameters"); + parser.add_parsing_key("output file format type", &output_file_format_ptr); + parser.add_stop_key("END"); +} + +void OutputFileFormatTests::run_tests() +{ + cerr << "Testing OutputFileFormat parsing function..." << endl; + cerr << "WARNING: will overwite files called STIRtmp*\n"; + + if (!check(parser.parse(in), "parsing failed")) + return; + + if (!check(!is_null_ptr(output_file_format_ptr), + "parsing failed to set output_file_format_ptr")) + return; +#if 0 + cerr << "Output parameters after reading from input file:\n" + << "-------------------------------------------\n"; + cerr << static_cast(*output_file_format_ptr).parameter_info(); + + cerr << "-------------------------------------------\n\n"; +#endif + cerr << "Now writing to file and reading it back." << endl; + // construct density and write to file + { +#ifdef HAVE_LLN_MATRIX + USING_NAMESPACE_ECAT + USING_NAMESPACE_ECAT6 + // TODO get next info from OutputFileFormat class instead of hard-wiring + // this in here + const bool supports_different_xy_pixel_sizes = + dynamic_cast(output_file_format_ptr.get()) == 0 + ? true : false; + const bool supports_origin_z_shift = + dynamic_cast(output_file_format_ptr.get()) == 0 + ? true : false; + const bool supports_origin_xy_shift = + true; +#else + const bool supports_different_xy_pixel_sizes = true; + const bool supports_origin_z_shift = true; + const bool supports_origin_xy_shift = + true; +#endif + + CartesianCoordinate3D origin (0.F,0.F,0.F); + if (supports_origin_xy_shift) + { origin.x()=2.4F; origin.y() = -3.5F; } + if (supports_origin_z_shift) + { origin.z()=6.4F; } + + CartesianCoordinate3D grid_spacing (3.F,4.F,supports_different_xy_pixel_sizes?5.F:4.F); + + IndexRange<3> + range(CartesianCoordinate3D(0,-15,-14), + CartesianCoordinate3D(4,14,14)); + + VoxelsOnCartesianGrid image(range,origin, grid_spacing); + { + // fill with some data + for (int z=image.get_min_z(); z<=image.get_max_z(); ++z) + for (int y=image.get_min_y(); y<=image.get_max_y(); ++y) + for (int x=image.get_min_x(); x<=image.get_max_x(); ++x) + image[z][y][x]= + 300*sin(static_cast(x*_PI)/image.get_max_x()) + *sin(static_cast(y+10*_PI)/image.get_max_y()) + *cos(static_cast(z*_PI/3)/image.get_max_z()); + } + + // write to file + + string filename = "STIRtmp"; + const Succeeded success = + output_file_format_ptr->write_to_file(filename,image); + + if (check( success==Succeeded::yes, "test writing to file")) + { + + // now read it back + + std::auto_ptr > + density_ptr = read_from_file >(filename); + + const VoxelsOnCartesianGrid * image_as_read_ptr = + dynamic_cast< VoxelsOnCartesianGrid const *> + (density_ptr.get()); + + set_tolerance(.00001); + if (check(!is_null_ptr(image_as_read_ptr), "test on image type read back from file")) + { + check_if_equal(image_as_read_ptr->get_grid_spacing(), grid_spacing, "test on grid spacing read back from file"); + + + if (output_file_format_ptr->get_type_of_numbers().integer_type()) + { + set_tolerance(image.find_max()/ + pow(2.,static_cast(output_file_format_ptr->get_type_of_numbers().size_in_bits()))); + } + + check_if_equal(image, *density_ptr, "test on data read back from file"); + set_tolerance(.00001); + check_if_equal(density_ptr->get_origin(), origin, "test on origin read back from file"); + } + } + if (is_everything_ok()) + { + + } + else + cerr << "You can check what was written in STIRtmp.*\n"; + + } + + + +} + + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 2) + { + cerr << "Usage : " << argv[0] << " filename\n" + << "See source file for the format of this file.\n\n"; + return EXIT_FAILURE; + } + + + ifstream in(argv[1]); + if (!in) + { + cerr << argv[0] + << ": Error opening input file " << argv[1] << "\nExiting.\n"; + + return EXIT_FAILURE; + } + + OutputFileFormatTests tests(in); + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_ROIs.cxx b/src/test/test_ROIs.cxx new file mode 100644 index 0000000000..1d2a7bbccc --- /dev/null +++ b/src/test/test_ROIs.cxx @@ -0,0 +1,403 @@ +// +// +/* + Copyright (C) 2004- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup test + + \brief Test program for ROI functionality (and a bit of stir::Shape3D hierarchy) + + \author Kris Thielemans + \author C. Ross Schmidtlein (added stir::Box3D test) + +*/ + +/*! + \def test_ROIs_DISPLAY + Enable visual display of the ROIs +*/ + +// uncomment for visual display of the ROIs +//#define test_ROIs_DISPLAY + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/MinimalImageFilter3D.h" +#include "stir/Shape/EllipsoidalCylinder.h" +#include "stir/Shape/Ellipsoid.h" +#include "stir/Shape/Box3D.h" +#include "stir/Shape/DiscretisedShape3D.h" +#include "stir/evaluation/ROIValues.h" +#include "stir/evaluation/compute_ROI_values.h" +#include "stir/IndexRange.h" +#include "stir/RunTests.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" +#include "stir/make_array.h" +#include "stir/numerics/determinant.h" +#ifdef test_ROIs_DISPLAY +#include "stir/display.h" +#endif +#include + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief Test class for compute_ROI_values and Shape3D hierarchy + + Visual tests can be enabled by setting the compiler define test_ROIs_DISPLAY. + + \todo Tests are currently somewhat simplistic + +*/ +class ROITests : public RunTests +{ +public: + void run_tests(); +private: + //! Run a series of tests for a shape + /*! + This function tests ROI values and Shape3D::geometric_volume before and after + translating and scaling the shape. + \warning fills /changes image and shape + \warning + If you want to add new tests, the "scale" and "set_direction_vectors" test-code + does not work for all shapes as it assumes that the + transformed shape is inside the original one. + You can disable the "set_direction_vectors" test by setting the do_rotated_ROI_test to false. + */ + void run_tests_one_shape(Shape3D& shape, + VoxelsOnCartesianGrid& image, + const bool do_rotated_ROI_test=true); +}; + +void +ROITests::run_tests_one_shape(Shape3D& shape, + VoxelsOnCartesianGrid& image, + const bool do_rotated_ROI_test) +{ + shape.construct_volume(image, Coordinate3D(1,1,1)); + + if (dynamic_cast(&shape) != 0) + { +#ifdef test_ROIs_DISPLAY + shared_ptr > copy_sptr = + static_cast(shape).get_discretised_density().clone(); +#endif + MinimalImageFilter3D erosion_filter(make_coordinate(2,2,2)); + erosion_filter.apply(static_cast(shape).get_discretised_density()); +#ifdef test_ROIs_DISPLAY + const float max = copy_sptr->find_max(); + *copy_sptr -= static_cast(shape).get_discretised_density(); + *copy_sptr += max/2; + display(*copy_sptr, + max, + "Original - erosion"); +#endif + } + const CartesianCoordinate3D voxel_size = image.get_voxel_size(); + const float voxel_volume = voxel_size.x() * voxel_size.y() * voxel_size.z(); + + image *= 2; +#ifdef test_ROIs_DISPLAY + display(image, image.find_max(), "image corresponding to shape (before erosion in the discretised case)"); +#endif + + { + const ROIValues ROI_values = + compute_total_ROI_values(image, shape, Coordinate3D(1,1,1)); + + check_if_equal(ROI_values.get_mean(), 2.F, "ROI mean"); + check_if_equal(ROI_values.get_stddev(), 0.F, "ROI stddev"); + check_if_equal(ROI_values.get_max(), 2.F, "ROI max"); + check_if_equal(ROI_values.get_min(), 2.F, "ROI min"); + // check volume + // test supposes that shape is entirely within the volume + const float volume = shape.get_geometric_volume(); + if (volume>=0) // only test it if it's implemented + { + const double old_tolerance = get_tolerance(); + set_tolerance(pow(volume/voxel_volume,1.F/3)*.1); + check_if_equal(ROI_values.get_roi_volume(), volume, "ROI volume"); + set_tolerance(old_tolerance); + } + } + // test on translation (image and shape translate same way) + { + const CartesianCoordinate3D translation (3,1,20); + image.set_origin(image.get_origin()+translation); + shape.translate(translation); + const ROIValues ROI_values = + compute_total_ROI_values(image, shape, Coordinate3D(1,1,1)); + + check_if_equal(ROI_values.get_mean(), 2.F, "ROI mean after translation"); + check_if_equal(ROI_values.get_stddev(), 0.F, "ROI stddev after translation"); + check_if_equal(ROI_values.get_max(), 2.F, "ROI max after translation"); + check_if_equal(ROI_values.get_min(), 2.F, "ROI min after translation"); + // check volume + // test supposes that shape is entirely within the volume + const float volume = shape.get_geometric_volume(); + if (volume>=0) // only test it if it's implemented + { + const double old_tolerance = get_tolerance(); + set_tolerance(pow(volume/voxel_volume,1.F/3)*.1); + check_if_equal(ROI_values.get_roi_volume(), volume, "ROI volume after translation"); + set_tolerance(old_tolerance); + } + image.set_origin(image.get_origin()-translation); + shape.translate(translation*-1); + } + // test on translation (image and shape translate separately) + { + const CartesianCoordinate3D translation (3,1,10); + image.set_origin(image.get_origin()+translation); + const ROIValues ROI_values = + compute_total_ROI_values(image, shape, Coordinate3D(1,1,1)); + image.set_origin(image.get_origin()-translation); + shape.translate(translation*-1); + const ROIValues ROI_values2 = + compute_total_ROI_values(image, shape, Coordinate3D(1,1,1)); + shape.translate(translation); + + check_if_equal(ROI_values.get_mean(), ROI_values2.get_mean(), "ROI mean after translation shape vs. image"); + check_if_equal(ROI_values.get_stddev(), ROI_values2.get_stddev(), "ROI stddev after translation shape vs. image"); + check_if_equal(ROI_values.get_max(), ROI_values2.get_max(), "ROI max after translation shape vs. image"); + check_if_equal(ROI_values.get_min(), ROI_values2.get_min(), "ROI min after translation shape vs. image"); + } + // test on scaling (test only works if all scale factors < 1) + if (dynamic_cast(&shape) == 0) + { + const float volume_before_scale = shape.get_geometric_volume(); + const CartesianCoordinate3D scale(.5F,.9F,.8F); + const float total_scale = scale[1]*scale[2]*scale[3]; + shared_ptr new_shape_sptr(shape.clone()); + new_shape_sptr->scale_around_origin(scale); + + const ROIValues ROI_values = + compute_total_ROI_values(image, *new_shape_sptr, Coordinate3D(1,1,1)); + + check_if_equal(ROI_values.get_mean(), 2.F, "ROI mean after scale"); + check_if_equal(ROI_values.get_stddev(), 0.F, "ROI stddev after scale"); + check_if_equal(ROI_values.get_max(), 2.F, "ROI max after scale"); + check_if_equal(ROI_values.get_min(), 2.F, "ROI min after scale"); + // check volume + // test supposes that shape is entirely within the volume + const float volume = new_shape_sptr->get_geometric_volume(); + if (volume>=0) // only test it if it's implemented + { + check_if_equal(volume_before_scale*total_scale, volume, "shape volume after scale"); + const double old_tolerance = get_tolerance(); + set_tolerance(pow(volume/voxel_volume,1.F/3)*.1); + check_if_equal(ROI_values.get_roi_volume(), volume, "ROI volume after scale"); + set_tolerance(old_tolerance); + } +#ifdef test_ROIs_DISPLAY + VoxelsOnCartesianGrid image2 = image; + new_shape_sptr->construct_volume(image2, Coordinate3D(1,1,1)); + image2 *= 4; + image2 -= image; + image2 += 2; + display(image2, image2.find_max(), "(image corresponding to scaled (.5,.9,.8) shape)*2 - (original shape) + 1"); +#endif + } + + // test on setting direction vectors (test only works if new shape is smaller than original) + if (dynamic_cast(&shape) != 0) + { + const float volume_before_scale = shape.get_geometric_volume(); + // rotate over 45 degrees around 1 and scale + const Array<2,float> direction_vectors= + make_array(make_1d_array(1.F,0.F,0.F), + make_1d_array(0.F,1.F,1.F), + make_1d_array(0.F,-2.F,2.F)); + const float total_scale = 1/determinant(direction_vectors); + shared_ptr + new_shape_sptr(dynamic_cast(shape.clone())); + check(new_shape_sptr->set_direction_vectors(direction_vectors) == Succeeded::yes, "set_direction_vectors"); + //std::cerr << new_shape_sptr->parameter_info(); + + const ROIValues ROI_values = + compute_total_ROI_values(image, *new_shape_sptr, Coordinate3D(1,1,1)); + + if (do_rotated_ROI_test) + { + check_if_equal(ROI_values.get_mean(), 2.F, "ROI mean after changing direction vectors"); + check_if_equal(ROI_values.get_stddev(), 0.F, "ROI stddev after changing direction vectors"); + check_if_equal(ROI_values.get_min(), 2.F, "ROI min after changing direction vectors"); + } + check_if_equal(ROI_values.get_max(), 2.F, "ROI max after changing direction vectors"); + // check volume + // test supposes that shape is entirely within the volume + const float volume = new_shape_sptr->get_geometric_volume(); + if (volume>=0) // only test it if it's implemented + { + check_if_equal(volume_before_scale*total_scale, volume, "shape volume after changing direction vectors"); + const double old_tolerance = get_tolerance(); + set_tolerance(pow(volume/voxel_volume,1.F/3)*.1); + check_if_equal(ROI_values.get_roi_volume(), volume, "ROI volume after changing direction vectors"); + set_tolerance(old_tolerance); + } +#ifdef test_ROIs_DISPLAY + VoxelsOnCartesianGrid image2 = image; + new_shape_sptr->construct_volume(image2, Coordinate3D(1,1,1)); + image2 *= 4; + image2 -= image; + image2 += 2; + display(image2, image2.find_max(), "(image corresponding to rotated and scaled (x,y) shape)*2 - (original shape) + 1"); +#endif + } + // test on parsing + if (dynamic_cast(&shape) == 0) + { + shared_ptr shape_sptr(shape.clone()); + KeyParser parser; + parser.add_start_key("start"); + parser.add_stop_key("stop"); + parser.add_parsing_key("shape type", &shape_sptr); + // construct stream with all info + std::stringstream str; + str << parser.parameter_info(); + // now read it back in and check + if (check(parser.parse(str) && !is_null_ptr(shape_sptr), + "parsing parameters failed")) + { + // check if it's what we expect + if(!check(*shape_sptr == shape, + "parsed shape not equal to original")) + { + std::cerr << "Original: \n" << shape.parameter_info() + << "\nParsed: \n" << shape_sptr->parameter_info(); + } + } + } +} + +void +ROITests::run_tests() + +{ + cerr << "Tests for compute_ROI_values and Shape3D hierarchy\n"; + + CartesianCoordinate3D origin (0,0,0); + CartesianCoordinate3D grid_spacing (3,4,5); + + const IndexRange<3> + range(Coordinate3D(0,-45,-44), + Coordinate3D(24,44,45)); + VoxelsOnCartesianGrid image(range,origin, grid_spacing); + + /* WARNING: + If you want to add new tests, the "scale" and "set_direction_vectors" test-code + in run_tests_one_shape() does not work for all shapes as it assumes that the + transformed shape is inside the original one. + You can disable the "set_direction_vectors" test by setting the do_rotated_ROI_test to false. + */ + { + std::cerr << "\tTests with ellipsoidal cylinder.\n"; + // object at centre of image + EllipsoidalCylinder + cylinder(/*length*/image.size()*grid_spacing.z()/3, + /*radius_x*/image[0][0].size()*grid_spacing.x()/4, + /*radius_y*/image[0].size()*grid_spacing.y()/4, + /*centre*/CartesianCoordinate3D((image.get_min_index()+image.get_max_index())/2*grid_spacing.z(), 0,0)); + this->run_tests_one_shape(cylinder, image); + } + image.set_origin(origin); + { + std::cerr << "\tTests with ellipsoidal cylinder and wedge.\n"; + // object at centre of image + EllipsoidalCylinder + cylinder(/*length*/image.size()*grid_spacing.z()/3, + /*radius_x*/image[0][0].size()*grid_spacing.x()/4, + /*radius_y*/image[0].size()*grid_spacing.y()/4, + /* theta_1 */ 10.F, + /* theta_2 */ 280.F, + /*centre*/CartesianCoordinate3D((image.get_min_index()+image.get_max_index())/2*grid_spacing.z(), 0,0)); + this->run_tests_one_shape(cylinder, image, /*do_rotated_ROI_test=*/ false); + } + image.set_origin(origin); + { + std::cerr << "\tTests with ellipsoid.\n"; + // object at centre of image + Ellipsoid + ellipsoid(CartesianCoordinate3D(/*radius_z*/image.size()*grid_spacing.z()/3, + /*radius_y*/image[0].size()*grid_spacing.y()/5, + /*radius_x*/image[0][0].size()*grid_spacing.x()/4), + /*centre*/CartesianCoordinate3D((image.get_min_index()+image.get_max_index())/2*grid_spacing.z(), 0,0)); + this->run_tests_one_shape(ellipsoid, image); + } + { + std::cerr << "\tTests with Box3D.\n"; + // object at centre of image + Box3D + box(/*length_x*/image[0][0].size()*grid_spacing.x()/4, + /*length_y*/image[0].size()*grid_spacing.y()/5, + /*length_z*/image.size()*grid_spacing.z()/3, + /*centre*/CartesianCoordinate3D((image.get_min_index()+image.get_max_index())/2*grid_spacing.z(), 0,0)); + this->run_tests_one_shape(box, image); + } + { + std::cerr << "\tTests with DiscretisedShape3D.\n"; + // object at centre of image + Ellipsoid + ellipsoid(CartesianCoordinate3D(/*radius_z*/image.size()*grid_spacing.z()/3, + /*radius_y*/image[0].size()*grid_spacing.y()/5, + /*radius_x*/image[0][0].size()*grid_spacing.x()/4), + /*centre*/CartesianCoordinate3D((image.get_min_index()+image.get_max_index())/2*grid_spacing.z(), 0,0)); + // note: it is important to use num_samples=(1,1,1) here, otherwise tests will fail + // this is because the shape would have smooth edges, and the tests do not take + // that into account + ellipsoid.construct_volume(image, make_coordinate(1,1,1)); + { + DiscretisedShape3D discretised_shape(image); + std::cerr << "\t\tidentical image\n"; + this->run_tests_one_shape(discretised_shape, image); + } + // need to fill in image again, as the tests change it + ellipsoid.construct_volume(image, make_coordinate(1,1,1)); + { + std::cerr << "\t\tNot-identical image\n"; + DiscretisedShape3D discretised_shape(image); + CartesianCoordinate3D other_origin (2,4,9); + CartesianCoordinate3D other_grid_spacing (3.3,4.4,5.5); + + const IndexRange<3> + other_range(Coordinate3D(-1,-40,-43), + Coordinate3D(25,45,47)); + VoxelsOnCartesianGrid other_image(other_range,other_origin, other_grid_spacing); + this->run_tests_one_shape(discretised_shape, other_image); + } + + } + +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + + +int main() +{ + ROITests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_Scanner.cxx b/src/test/test_Scanner.cxx new file mode 100644 index 0000000000..74427ab4e6 --- /dev/null +++ b/src/test/test_Scanner.cxx @@ -0,0 +1,170 @@ +// +// +/* + Copyright (C) 2004- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup test + + \brief Test program for stir::Scanner hierarchy + + \author Kris Thielemans + +*/ + +#include "stir/RunTests.h" +#include "stir/Scanner.h" +#include "stir/Succeeded.h" +#include "stir/shared_ptr.h" +#ifdef HAVE_LLN_MATRIX +#include "ecat_model.h" +extern "C" { + EcatModel *ecat_model(int); +} + +#include "stir/IO/stir_ecat_common.h" +#endif +#include +#include + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief Test class for Scanner +*/ +class ScannerTests: public RunTests +{ +public: + void run_tests(); +private: + void test_scanner(const Scanner&); +}; + + +void +ScannerTests:: +run_tests() +{ + Scanner::Type type= Scanner::E931; + while (type != Scanner::Unknown_scanner) + { + if (type!=Scanner::User_defined_scanner) + test_scanner(Scanner(type)); + // tricky business to find next type + int int_type = type; + ++int_type; + type = static_cast(int_type); + } +} + +void +ScannerTests:: +test_scanner(const Scanner& scanner) +{ + set_tolerance(.00001); + cerr << "Tests for scanner model " << scanner.get_name()<<'\n'; + + check(scanner.check_consistency() == Succeeded::yes, "check_consistency"); + + /* check if number of non-arccorrected tangential positions is smaller than the maximum + allowed for a full-ring tomograph + */ + { + check(scanner.get_max_num_non_arccorrected_bins() <= scanner.get_num_detectors_per_ring(), + "too large max_num_non_arccorrected_bins compared to num_detectors_per_ring"); + } + /* check if default_bin_size is close to the central bin size. This is especially true + for CTI scanners. + To avoid warnings/errors, we exclude some scanners where we know the bin-size for sure + from the test. + */ + if (scanner.get_type() != Scanner::Advance && + scanner.get_type() != Scanner::DiscoveryLS && + scanner.get_type() != Scanner::DiscoveryST && + scanner.get_type() != Scanner::DiscoverySTE && + scanner.get_type() != Scanner::DiscoveryRX/* && + scanner.get_type() != Scanner::HZLR*/) + { + const float natural_bin_size = + scanner.get_inner_ring_radius()*float(_PI)/scanner.get_num_detectors_per_ring(); + if (fabs(natural_bin_size - scanner.get_default_bin_size())> .03) + warning("central bin size (derived from inner ring radius and num detectors) %g\n" + "differs from given default bin size %g\n" + "(unequal values do not necessarily mean there's an error as " + "it's a convention used by the scanner manufacturer)\n", + natural_bin_size, scanner.get_default_bin_size()); + } + // (weak) test on get_scanner_from_name + { + string name = scanner.get_name(); + name += " "; + shared_ptr scanner_from_name_sptr(Scanner::get_scanner_from_name(name)); + check_if_equal(scanner.get_type(), scanner_from_name_sptr->get_type(), + "get_scanner_from_name"); + } +#ifdef HAVE_LLN_MATRIX + if (scanner.get_type() <= Scanner::E966) // TODO relies on ordering of enum + { + // compare with info from ecat_model + + cerr << "Comparing STIR scanner info with LLN matrix\n"; + short ecat_type = ecat::find_ECAT_system_type(scanner); + if (ecat_type==0) + return; + + EcatModel * ecat_scanner_info = ecat_model(static_cast(ecat_type)); + if (ecat_scanner_info==0) + return; + check_if_equal(scanner.get_num_axial_buckets(), ecat_scanner_info->rings, + "number of rings of buckets"); + if (scanner.get_type() != Scanner::E925) // ART is a partial ring tomograph + check_if_equal(scanner.get_num_axial_buckets()*scanner.get_num_transaxial_buckets(), + ecat_scanner_info->nbuckets, + "total number of buckets"); + check_if_equal(scanner.get_num_transaxial_blocks_per_bucket(), ecat_scanner_info->transBlocksPerBucket, + "transaxial blocks per bucket"); + check_if_equal(scanner.get_num_axial_blocks_per_bucket(), ecat_scanner_info->axialBlocksPerBucket, + "axial blocks per bucket"); + check_if_equal(scanner.get_num_transaxial_blocks_per_bucket() * scanner.get_num_axial_blocks_per_bucket(), + ecat_scanner_info->blocks, + "total number of blocks"); + check_if_equal(scanner.get_num_axial_crystals_per_block(), ecat_scanner_info->axialCrystalsPerBlock, + "number of crystals in the axial direction"); + check_if_equal(scanner.get_num_transaxial_crystals_per_block(), ecat_scanner_info->angularCrystalsPerBlock, + "number of transaxial crystals"); + check_if_equal(scanner.get_inner_ring_radius(), ecat_scanner_info->crystalRad*10, + "detector radius"); + check_if_equal(scanner.get_ring_spacing()/2, ecat_scanner_info->planesep*10, + "plane separation"); + check_if_equal(scanner.get_default_bin_size(), ecat_scanner_info->binsize*10, + "bin size (spacing of transaxial elements)"); + } +#endif +} + +END_NAMESPACE_STIR + + +int main() +{ +USING_NAMESPACE_STIR + + ScannerTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_VectorWithOffset.cxx b/src/test/test_VectorWithOffset.cxx new file mode 100644 index 0000000000..19d5c7db3d --- /dev/null +++ b/src/test/test_VectorWithOffset.cxx @@ -0,0 +1,656 @@ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2007-10-08, Hammersmith Imanet Ltd + Copyright (C) 2012-06-01 - 2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup test + + \brief Test program for stir::VectorWithOffset + + \author Kris Thielemans + \author PARAPET project + + +*/ +#ifndef NDEBUG +// set to high level of debugging +#ifdef _DEBUG +#undef _DEBUG +#endif +#define _DEBUG 2 +#endif + +#include "stir/VectorWithOffset.h" +#include "stir/RunTests.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::sort; +using std::find; +using std::greater; +using std::size_t; +#endif + +START_NAMESPACE_STIR + + +/*! + \brief Test class for VectorWithOffset + \ingroup test + +*/ +class VectorWithOffsetTests : public RunTests +{ +public: + void run_tests(); +}; + +void +VectorWithOffsetTests::run_tests() +{ + cerr << "Tests for VectorWithOffset\n" + << "Everythings is fine if the program runs without any output." << endl; + + VectorWithOffset v(-3, 40); + check_if_equal(v.get_min_index(), -3, "test basic constructor and get_min_index"); + check_if_equal(v.get_max_index(), 40, "test basic constructor and get_max_index"); + check(v.size()== 40+3+1, "test basic constructor and size"); + check(v.capacity()== 40+3+1, "test basic constructor and capacity"); + + for (int i=v.get_min_index(); i<=v.get_max_index(); i++) + v[i] = 2*i; + check_if_equal(v[4], 8, "test operator[]"); + + int *ptr = v.get_data_ptr(); + ptr[4+3] = 5; + v.release_data_ptr(); + check_if_equal(v[4], 5, "test get_data_tr/release_data_ptr"); + + // iterator tests + { + { + int value = -3; + for (VectorWithOffset::iterator iter = v.begin(); + iter != v.end(); + iter++, value++) + *iter = value; + check_if_equal(v[4], 4, "test iterators operator++ and *"); + } + { + VectorWithOffset::const_iterator iter = v.begin(); + check_if_equal(*(iter+4-v.get_min_index()), 4, "test iterators operator+ and *"); + iter += 4-v.get_min_index(); + check_if_equal(*iter, 4, "test iterators operator+= and *"); + ++iter; + check_if_equal(*(iter-1), 4, "test iterators operator+= and *"); + --iter; + check_if_equal(*iter, 4, "test iterators operator+= and *"); + } + { + const VectorWithOffset& const_v = v; + VectorWithOffset::const_iterator iter = const_v.begin(); + check_if_equal(*(iter+4-v.get_min_index()), 4, "test iterators operator+ and *"); + iter += 4-v.get_min_index(); + check_if_equal(*iter, 4, "test iterators operator+= and *"); + ++iter; + check_if_equal(*(iter-1), 4, "test iterators operator+= and *"); + --iter; + check_if_equal(*iter, 4, "test iterators operator+= and *"); + } + + + { + VectorWithOffset::iterator p=find(v.begin(), v.end(), 6); + check_if_zero(p - v.begin() - 9, "test iterators: find"); + check_if_equal(*p, 6, "test iterators: find"); + } + + sort(v.begin(), v.end(), greater()); + check_if_equal(v[-3], 40, "test iterators: sort"); + check_if_equal(v[0], 37, "test iterators: sort"); + + { + VectorWithOffset::reverse_iterator pr = v.rbegin(); + check_if_equal(*pr++, -3, "test reverse iterator operator++ and *"); + check_if_equal(*(pr+2), 0, "test reverse iterator operator++ and *"); + } + + sort(v.rbegin(), v.rend(), greater()); + check_if_equal(v[-3], -3, "test reverse iterators after sort"); + check_if_equal(v[0], 0, "test reverse iterators after sort"); + + } // end test iterators + + + { + VectorWithOffset test = v; + test.set_min_index(-1); + check( test.size()==v.size(), "test set_min_index (size)"); + check( test.capacity()==v.capacity(), "test set_min_index (capacity)"); + check_if_equal( test[-1], v[v.get_min_index()], "test set_min_index (operator[])"); + } + + /**********************************************************************/ + // tests on reserve() + /**********************************************************************/ + { + // tests on reserve() with 0 length + { + // check reserve 0,max + { + VectorWithOffset test; + check_if_equal(test.capacity(), size_t(0), + "check capacity after default constructor"); + test.reserve(2); + check_if_equal(test.size(), size_t(0), + "check reserve of empty vector (0,max) (size)"); + check_if_equal(test.capacity(), size_t(2), + "check reserve of empty vector (0,max) (capacity)"); + check_if_equal(test.get_capacity_min_index(), 0, + "check reserve of empty vector (0,max) (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), 1, + "check reserve of empty vector (0,max) (capacity_max_index)"); + } + // check reserve -1,2 + { + VectorWithOffset test; + test.reserve(-1,2); + check_if_equal(test.size(), size_t(0), + "check reserve of empty vector (-1,2) (size)"); + check_if_equal(test.capacity(), size_t(4), + "check reserve of empty vector (-1,2) (capacity)"); + // note: for length 0 vectors, get_capacity_min_index() is always 0 + check_if_equal(test.get_capacity_min_index(), 0, + "check reserve of empty vector (-1,2) (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), 3, + "check reserve of empty vector (-1,2) (capacity_max_index)"); + } + // check reserve -1,2 and then 1,6 + { + VectorWithOffset test; + test.reserve(-1,2); + test.reserve(1,6); + check_if_equal(test.size(), size_t(0), + "check reserve of empty vector (-1,2 and then 1,6) (size)"); + check_if_equal(test.capacity(), size_t(6), + "check reserve of empty vector (-1,2 and then 1,6) (capacity)"); + // note: for length 0 vectors, get_capacity_min_index() is always 0 + check_if_equal(test.get_capacity_min_index(), 0, + "check reserve of empty vector (-1,2 and then 1,6) (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), 5, + "check reserve of empty vector (-1,2 and then 1,6) (capacity_max_index)"); + } + } // end of tests length 0 + + // tests of reserve() with non-zero length + { + const VectorWithOffset ref = v; + VectorWithOffset test = ref; + // check reserve within range (should have no effect) + test.reserve(0,1); + check_if_equal(test.size(), ref.size(), + "check reserve within range (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index(), + "check reserve within range (get_min_index)"); + check_if_equal(test, ref, + "check reserve within range (values)"); + check_if_equal(test.capacity(), ref.size(), + "check reserve within range (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index(), + "check reserve within range (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index(), + "check reserve within range (capacity_max_index)"); + // check reserve within range on low index (should reserve space at higher indices only) + test.reserve(0,test.get_max_index()+5); + check_if_equal(test.size(), ref.size(), + "check reserve within range on low index (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index(), + "check reserve within range on low index (get_min_index)"); + check_if_equal(test, ref, + "check reserve within range on low index (values)"); + check_if_equal(test.capacity(), ref.size()+5, + "check reserve within range on low index (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index(), + "check reserve within range on low index (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index()+5, + "check reserve within range on low index (capacity_max_index)"); + // check reserve within range on high index (should reserve space at low indices only) + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + test.reserve(test.get_min_index()-5,0); + check_if_equal(test.size(), ref.size(), + "check reserve within range on high index (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index(), + "check reserve within range on high index (get_min_index)"); + check_if_equal(test, ref, + "check reserve within range on high index (values)"); + check_if_equal(test.capacity(), ref.size()+5, + "check reserve within range on high index (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index()-5, + "check reserve within range on high index (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index(), + "check reserve within range on high index (capacity_max_index)"); + // check reserve for both ranges + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + test.reserve(test.get_min_index()-5,test.get_max_index()+4); + check_if_equal(test.size(), ref.size(), + "check reserve (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index(), + "check reserve (get_min_index)"); + check_if_equal(test, ref, + "check reserve (values)"); + check_if_equal(test.capacity(), ref.size()+9, + "check reserve (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index()-5, + "check reserve (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index()+4, + "check reserve (capacity_max_index)"); + } + } + /**********************************************************************/ + // tests on resize() + /**********************************************************************/ + { + // tests on resize() with 0 length + { + // check resize 0,max + { + VectorWithOffset test; + check_if_equal(test.capacity(), size_t(0), + "check capacity after default constructor"); + test.resize(2); + check_if_equal(test.size(), size_t(2), + "check resize of empty vector (0,max) (size)"); + check_if_equal(test.capacity(), size_t(2), + "check resize of empty vector (0,max) (capacity)"); + check_if_equal(test.get_min_index(), 0, + "check resize of empty vector (0,max) (min_index)"); + check_if_equal(test.get_max_index(), 1, + "check resize of empty vector (0,max) (max_index)"); + } + // check resize -1,2 + { + VectorWithOffset test; + test.resize(-1,2); + check_if_equal(test.size(), size_t(4), + "check resize of empty vector (-1,2) (size)"); + check_if_equal(test.capacity(), size_t(4), + "check resize of empty vector (-1,2) (capacity)"); + check_if_equal(test.get_min_index(), -1, + "check resize of empty vector (-1,2) (min_index)"); + check_if_equal(test.get_max_index(), 2, + "check resize of empty vector (-1,2) (max_index)"); + } + // check resize -1,2 and then 1,6 + { + VectorWithOffset test; + test.resize(-1,2); + test.resize(1,6); + check_if_equal(test.size(), size_t(6), + "check resize of empty vector (-1,2 and then 1,6) (size)"); + check_if_equal(test.capacity(), size_t(8), + "check resize of empty vector (-1,2 and then 1,6) (capacity)"); + // note: for length 0 vectors, get_min_index() is always 0 + check_if_equal(test.get_min_index(), 1, + "check resize of empty vector (-1,2 and then 1,6) (min_index)"); + check_if_equal(test.get_max_index(), 6, + "check resize of empty vector (-1,2 and then 1,6) (max_index)"); + } + } // end of tests length 0 + + // tests of resize() with non-zero length + { + const VectorWithOffset ref = v; + VectorWithOffset test = ref; + // check resize with identical range (should have no effect) + test.resize(ref.get_min_index(), ref.get_max_index()); + check_if_equal(test.size(), ref.size(), + "check resize with identical range (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index(), + "check resize with identical range (get_min_index)"); + check_if_equal(test, ref, + "check resize with identical range (values)"); + check_if_equal(test.capacity(), ref.size(), + "check resize with identical range (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index(), + "check resize with identical range (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index(), + "check resize with identical range (capacity_max_index)"); + // check resize with grow on high index (should resize space at higher indices only) + test.resize(ref.get_min_index(),test.get_max_index()+5); + check_if_equal(test.size(), ref.size()+5, + "check resize with grow on high index (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index(), + "check resize with grow on high index (get_min_index)"); + for (int i=ref.get_min_index(); i<=ref.get_max_index(); ++i) + check_if_equal(test[i], ref[i], + "check resize with grow on high index (values)"); + check_if_equal(test.capacity(), ref.size()+5, + "check resize with grow on high index (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index(), + "check resize with grow on high index (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index()+5, + "check resize with grow on high index (capacity_max_index)"); + // check resize with grow on low index (should resize space at low indices only) + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + test.resize(test.get_min_index()-5,ref.get_max_index()); + check_if_equal(test.size(), ref.size()+5, + "check resize with grow on low index (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index()-5, + "check resize with grow on low index (get_min_index)"); + for (int i=ref.get_min_index(); i<=ref.get_max_index(); ++i) + check_if_equal(test[i], ref[i], + "check resize with grow on low index (values)"); + check_if_equal(test.capacity(), ref.size()+5, + "check resize with grow on low index (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index()-5, + "check resize with grow on low index (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index(), + "check resize with grow on low index (capacity_max_index)"); + // check grow for both ranges + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + test.resize(test.get_min_index()-5,test.get_max_index()+4); + check_if_equal(test.size(), ref.size()+9, + "check resize with grow at both ends (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index()-5, + "check resize with grow at both ends (get_min_index)"); + for (int i=ref.get_min_index(); i<=ref.get_max_index(); ++i) + check_if_equal(test[i], ref[i], + "check resize with grow at both ends (values)"); + check_if_equal(test.capacity(), ref.size()+9, + "check resize with grow at both ends (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index()-5, + "check resize with grow at both ends (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index()+4, + "check resize with grow at both ends (capacity_max_index)"); + // check resize with shrink for both ranges + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + test.resize(test.get_min_index()+5,test.get_max_index()-4); + check_if_equal(test.size(), ref.size()-9, + "check resize with shrink at both ends(size)"); + check_if_equal(test.get_min_index(), ref.get_min_index()+5, + "check resize with shrink at both ends(get_min_index)"); + for (int i=test.get_min_index(); i<=test.get_max_index(); ++i) + check_if_equal(test[i], ref[i], + "check resize with shrink at both ends (values)"); + check_if_equal(test.capacity(), ref.size(), + "check resize with shrink at both ends(capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index(), + "check resize with shrink at both ends(capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index(), + "check resize with shrink at both ends(capacity_max_index)"); + // check resize with shrink at left and grow at right + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + test.resize(test.get_min_index()+5,test.get_max_index()+4); + check_if_equal(test.size(), ref.size()-1, + "check resize with shrink at left and grow at right (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index()+5, + "check resize with shrink at left and grow at right (get_min_index)"); + for (int i=test.get_min_index(); i<=ref.get_max_index(); ++i) + check_if_equal(test[i], ref[i], + "check resize with shrink at left and grow at right (values)"); + check_if_equal(test.capacity(), ref.size()+4, + "check resize with shrink at left and grow at right (capacity)"); + check_if_equal(test.get_capacity_min_index(), ref.get_min_index(), + "check resize with shrink at left and grow at right (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), ref.get_max_index()+4, + "check resize with shrink at left and grow at right (capacity_max_index)"); + // check resize with resize non-overlapping to right + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + // not: test new size is smaller than original size, so no reallocation should occur + test.resize(test.get_max_index()+20,test.get_max_index()+20+ref.size()-3); + check_if_equal(test.size(), size_t(ref.size()-2), + "check resize with resize non-overlapping to right (size)"); + check_if_equal(test.get_min_index(), ref.get_max_index()+20, + "check resize with resize non-overlapping to right (get_min_index)"); + check_if_equal(test.capacity(), ref.size(), + "check resize with resize non-overlapping to right (capacity)"); + check_if_equal(test.get_capacity_min_index(), test.get_min_index(), + "check resize with resize non-overlapping to right (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), test.get_min_index()+static_cast(test.capacity())-1, + "check resize with resize non-overlapping to right (capacity_max_index)"); + // check resize with resize non-overlapping to left + test.recycle(); + check_if_equal(test.capacity(), size_t(0), "test recycle"); + test = ref; + // not: test new size is larger than original size, so reallocation should occur + test.resize(test.get_min_index()-300,test.get_min_index()-300+ref.size()+4); + check_if_equal(test.size(), size_t(ref.size()+5), + "check resize with resize non-overlapping to left (size)"); + check_if_equal(test.get_min_index(), ref.get_min_index()-300, + "check resize with resize non-overlapping to left (get_min_index)"); + check_if_equal(test.capacity(), test.size(), + "check resize with resize non-overlapping to left (capacity)"); + check_if_equal(test.get_capacity_min_index(), test.get_min_index(), + "check resize with resize non-overlapping to left (capacity_min_index)"); + check_if_equal(test.get_capacity_max_index(), test.get_max_index(), + "check resize with resize non-overlapping to left (capacity_max_index)"); + } + } + + /**********************************************************************/ + // tests on operator += etc + /**********************************************************************/ + { + const VectorWithOffset ref = v; + VectorWithOffset test = ref; + + test = ref; test += ref; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , ref[i]*2, "test operator+=(VectorWithOffset)"); + test = ref; test -= ref; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , 0, "test operator-=(VectorWithOffset)"); + test = ref; test *= ref; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , ref[i]*ref[i], "test operator*=(VectorWithOffset)"); + + const int minimum = *std::min_element(ref.begin(), ref.end()); + const int ensure_non_zero = + minimum<= 0 ? -minimum+1 : 0; + VectorWithOffset denominator = ref; + test = ref; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + { + denominator[i] += ensure_non_zero; + test[i]+=10000; + } + test /= denominator; + for (int i=ref.get_min_index(); i<= ref.get_max_index(); ++i) + check_if_equal( test[i] , (ref[i]+10000)/(ref[i]+ensure_non_zero), "test operator/=(VectorWithOffset)"); + + } + + // some checks with min_index==0 + { + VectorWithOffset v0(40); + check_if_equal(v0.get_min_index(), 0, "test 1-arg constructor and get_min_index"); + check_if_equal(v0.get_max_index(), 40-1, "test 1-arg constructor and get_max_index"); + check_if_equal(v0.size(), size_t(40), "test 1-arg constructor and size"); + check_if_equal(v0.capacity(), size_t(40), "test 1-arg constructor and capacity"); + } + + // tests on empty + { + { + VectorWithOffset test; + check(test.empty(), "test default constructor gives empty vector"); + } + { + VectorWithOffset test(1,-1); + check(test.empty(), "test reverse range gives empty vector"); + } + { + VectorWithOffset test(3,6); + check(!test.empty(), "test vector says !empty()"); + test.resize(0); + check(test.empty(), "test vector resized to size 0 is empty()"); + } + } + + // tests on at() with out-of-range + { + { + VectorWithOffset test; + try + { + int a=test.at(5); + // if we get here, there's a problem, so we report that by failing the next test. + check(false, "test out-of-range on empty vector"); + } + catch (std::out_of_range& e) + { + } + } + { + VectorWithOffset test(1,54); + try + { + test[4]=1; + check_if_equal(test.at(4),1, "test using at() to read content"); + test.at(3)=2; + check_if_equal(test[3],2, "test using at() to set content"); + + int a=test.at(55); + // if we get here, there's a problem, so we report that by failing the next test. + check(false, "test out-of-range on vector"); + } + catch (std::out_of_range& e) + { + } + } + } + + // checks on using existing data_ptr with constructor indices starting at 0 + { + const int size=100; + int data[size]; + std::fill(data, data+size, 12345); + check_if_equal(data[0], 12345, "test filling data block at 0"); + check_if_equal(data[size-1], 12345, "test filling data block at end"); + // set data_ptr to somewhere in the block to check overrun + int * data_ptr = data+10; + + const int vsize = size-20; + VectorWithOffset v(vsize, data_ptr, data + size); + check(!v.owns_memory_for_data(), "test vector using data_ptr: should not allocate new memory"); + check(data_ptr == v.get_data_ptr(), "test vector using data_ptr: get_data_ptr()"); + v.release_data_ptr(); + check_if_equal(v[1], 12345, "test vector using data_ptr: vector at 1 after construction"); + v[1]=1; + check_if_equal(data_ptr[1], 1, "test filling vector using data_ptr: data at 1 after setting"); + check_if_equal(v[1], 1, "test filling vector using data_ptr: vector at 1 after setting"); + v.fill(2); + check_if_equal(std::accumulate(v.begin(), v.end(), 0), 2*vsize , "test filling vector using data_ptr"); + check_if_equal(data_ptr[0], 2, "test filling vector using data_ptr: data at 0"); + check_if_equal(data_ptr[-1], 12345, "test filling vector using data_ptr: data block before vector"); + check_if_equal(data_ptr[vsize], 12345, "test filling vector using data_ptr: data block after vector"); + + // test resize using existing memory + v[1]=5; + v.resize(1,vsize-5); + check(!v.owns_memory_for_data(), "test vector using data_ptr: resize should not allocate new memory"); + check(data_ptr+1 == v.get_data_ptr(), "test vector using data_ptr: get_data_ptr() after resize"); + v.release_data_ptr(); + check_if_equal(v[1], 5 , "test resizing vector using data_ptr: data at 1"); + v[1]=6; + check_if_equal(data_ptr[1], 6, "test resizing vector using data_ptr: data should still be refered to"); + check_if_equal(std::accumulate(v.begin(), v.end(), 0), 6+v[2]*(v.get_length()-1) , "test resizing vector using data_ptr"); + + // test resize that should allocate new memory + v.resize(-1,vsize-2); + check(v.owns_memory_for_data(), "test vector using data_ptr: resize should allocate new memory"); + v.fill(7); + check_if_equal(data[9], 12345, "test vector using data_ptr: after resize data block at 9"); + check_if_equal(data[size-9], 12345, "test vector using data_ptr: after resize data block at end-9"); + check_if_equal(data_ptr[1], 6, "test vector using data_ptr: after resize data 1"); + } + + // checks on using existing data_ptr with constructor indices starting at -3 + { + const int size=100; + int data[size]; + std::fill(data, data+size, 12345); + check_if_equal(data[0], 12345, "test filling data block at 0"); + check_if_equal(data[size-1], 12345, "test filling data block at end"); + // set data_ptr to somewhere in the block to check overrun + int * data_ptr = data+10; + + const int vsize = size-20; + VectorWithOffset v(-3, vsize-4, data_ptr, data + size); + check_if_equal(v.get_length(), vsize, "test vector using data_ptr (negative min_index):size"); + // first essentially same tests as above + check(!v.owns_memory_for_data(), "test vector using data_ptr (negative min_index): should not allocate new memory"); + check(data_ptr == v.get_data_ptr(), "test vector using data_ptr (negative min_index): get_data_ptr()"); + v.release_data_ptr(); + check_if_equal(v[1], 12345, "test vector using data_ptr (negative min_index): vector at 1 after construction"); + check_if_equal(v[-3], 12345, "test vector using data_ptr (negative min_index): vector at -3 after construction"); + v[-3]=1; + check_if_equal(data_ptr[0], 1, "test filling vector using data_ptr (negative min_index) data at -3 after setting"); + check_if_equal(v[-3], 1, "test filling vector using data_ptr (negative min_index) vector at -3 after setting"); + v.fill(2); + check_if_equal(std::accumulate(v.begin(), v.end(), 0), 2*vsize , "test filling vector using data_ptr (negative min_index)"); + check_if_equal(data_ptr[0], 2, "test filling vector using data_ptr (negative min_index) data at 0"); + check_if_equal(data_ptr[-1], 12345, "test filling vector using data_ptr (negative min_index) data block before vector"); + check_if_equal(data_ptr[vsize], 12345, "test filling vector using data_ptr (negative min_index) data block after vector"); + + // assignment that doesn't reallocate + v = VectorWithOffset(2,6); + check(!v.owns_memory_for_data(), "test vector using data_ptr (negative min_index): assignment should not allocate new memory"); + v[4]=4; + check_if_equal(v[4], 4, "test vector using data_ptr (negative min_index): vector at 4 after assignment and setting"); + // vector will again start at data_ptr + check_if_equal(data_ptr[4-v.get_min_index()], 4, "test vector using data_ptr (negative min_index): data at 4-min_index after assignment and setting"); + // another assignment that does not reallocate + v = VectorWithOffset(size-(data_ptr-data) ); + check(!v.owns_memory_for_data(), "test vector using data_ptr (negative min_index): 2nd assignment should not allocate new memory"); + // assignment that does reallocate + v = VectorWithOffset(size-(data_ptr-data)+1 ); + check(v.owns_memory_for_data(), "test vector using data_ptr (negative min_index): 3rd assignment should allocate new memory"); + } +} + + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main() +{ + VectorWithOffsetTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_VoxelsOnCartesianGrid.cxx b/src/test/test_VoxelsOnCartesianGrid.cxx new file mode 100644 index 0000000000..3b32bd50a0 --- /dev/null +++ b/src/test/test_VoxelsOnCartesianGrid.cxx @@ -0,0 +1,264 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + + \brief Test program for stir::VoxelsOnCartesianGrid and image hierarchy + + \author Sanida Mustafovic + \author Kris Thielemans + \author PARAPET project + +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ProjDataInfo.h" +#include "stir/ProjDataInfoCylindricalArcCorr.h" +#include "stir/Scanner.h" +#include "stir/IndexRange.h" + +#include +#include +#include "stir/RunTests.h" + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief Test class for VoxelsOnCartesianGrid and image hierarchy + +*/ +class VoxelsOnCartesianGridTests : public RunTests +{ +public: + void run_tests(); +}; + + +void +VoxelsOnCartesianGridTests::run_tests() + +{ + cerr << "Tests for VoxelsOnCartesianGrid and the image hierarchy\n"; + + CartesianCoordinate3D origin (0,1,2); + CartesianCoordinate3D grid_spacing (3,4,5); + + IndexRange<3> + range(CartesianCoordinate3D(0,-15,-14), + CartesianCoordinate3D(4,14,15)); + + Array<3,float> test1(range); + + { + cerr << "Tests with default constructor\n"; + + VoxelsOnCartesianGrid ob1; + + // Check set.* & constructor + + ob1.set_origin(origin); + ob1.set_grid_spacing (grid_spacing); + + check_if_equal( ob1.get_grid_spacing(), grid_spacing,"test on grid_spacing"); + check_if_equal( ob1.get_origin(), origin, "test on origin"); + } + + { + cerr << "Tests with 2nd constructor (array, origin, grid_spacing)\n"; + + VoxelsOnCartesianGrid ob2(test1,origin, grid_spacing); + test1[1][12][5] = float(5.5); + test1[4][5][-5] = float(4.5); + + check_if_equal( ob2.get_grid_spacing(),grid_spacing, "test on grid_spacing"); + check_if_equal( ob2.get_origin(), origin, "test on origin"); + check_if_equal( test1.sum(), 10.F, "test on arrays"); + } + { + + cerr << "Tests with 3rd constructor(index_range, origin, grid_spacing)\n"; + VoxelsOnCartesianGrid ob3(range,origin, grid_spacing); + + check( ob3.get_index_range() == range, "test on range"); + check_if_equal( ob3.get_grid_spacing(),grid_spacing, "test on grid_spacing"); + check_if_equal( ob3.get_origin(), origin, "test on origin"); + + const BasicCoordinate<3,int> indices = make_coordinate(1,2,3); + const CartesianCoordinate3D coord = + ob3.get_physical_coordinates_for_indices(indices); + const CartesianCoordinate3D rel_coord = + ob3.get_relative_coordinates_for_indices(indices); + + check_if_equal(coord, rel_coord + origin, + "test on get_physical_coordinates_for_indices"); + check_if_equal(rel_coord, grid_spacing*BasicCoordinate<3,float>(indices), + "test on get_relative_coordinates_for_indices"); + check_if_equal(indices, ob3.get_indices_closest_to_relative_coordinates(rel_coord), + "test on get_indices_closest_to_relative_coordinates"); + check_if_equal(indices, ob3.get_indices_closest_to_physical_coordinates(coord), + "test on get_indices_closest_to_relative_coordinates"); + check_if_equal(indices,ob3.get_indices_closest_to_relative_coordinates(rel_coord + grid_spacing/3), + "test on get_indices_closest_to_relative_coordinates (not on grid point)"); + + + } + + shared_ptr scanner_ptr(new Scanner(Scanner::E953)); + shared_ptr proj_data_info_ptr( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span=*/1, + /*max_delta=*/5, + /*num_views=*/8, + /*num_tang_poss=*/16)); + + { + cerr << "Tests with constructor with ProjDataInfo with default sizes\n"; + + const float zoom=2.3F; + //KT 10/12/2001 removed make_xy_size_odd things + + VoxelsOnCartesianGrid + ob4(*proj_data_info_ptr,zoom,origin); + + IndexRange<3> obtained_range = ob4.get_index_range(); + CartesianCoordinate3D low_bound, high_bound; + check(obtained_range.get_regular_range(low_bound, high_bound), "test regular range"); + + // KT 11/09/2001 adapted as this constructor now takes zoom into account + const bool is_arccorrected = + dynamic_cast(proj_data_info_ptr.get()) != 0; + check(is_arccorrected, "ProjDataInfoCTI should have returned arc-corrected data"); + if (is_arccorrected) + { + const int FOVradius_in_bins = + max(proj_data_info_ptr->get_max_tangential_pos_num(), + -proj_data_info_ptr->get_min_tangential_pos_num()); + const int diameter_int = + 2*static_cast(ceil(FOVradius_in_bins * zoom)) + 1; + + check_if_equal(low_bound, CartesianCoordinate3D(0,-(diameter_int/2),-(diameter_int/2)), + "test on index range: lower bounds"); + check_if_equal(high_bound, CartesianCoordinate3D(30,+(diameter_int/2),+(diameter_int/2)), + "test on index range: higher bounds"); + } + check_if_equal(ob4.get_grid_spacing(), + CartesianCoordinate3D(scanner_ptr->get_ring_spacing()/2, + scanner_ptr->get_default_bin_size()/zoom, + scanner_ptr->get_default_bin_size()/zoom), + "test on grid spacing"); + check_if_equal(ob4.get_origin(), origin); + } + { + + cerr << "Tests with constructor with ProjDataInfo with non-default sizes\n"; + // KT 10/12/2001 changed to allow for new format of constructor, and add z_size + const int xy_size = 100; + const float zoom=3.1F; + const int min_xy = -(xy_size/2); + const int max_xy = -(xy_size/2)+xy_size-1; + const int z_size = 9; + + VoxelsOnCartesianGrid + ob5(*proj_data_info_ptr,zoom,origin,CartesianCoordinate3D(z_size,xy_size,xy_size)); + // put in some data for further testing + ob5.fill(1.F); + ob5[1][1][1]=5.F; + + IndexRange<3> obtained_range = ob5.get_index_range(); + CartesianCoordinate3D low_bound, high_bound; + check(obtained_range.get_regular_range(low_bound, high_bound), "test regular range"); + + check_if_equal(low_bound, CartesianCoordinate3D(0,min_xy,min_xy),"test on index range: lower bounds"); + check_if_equal(high_bound, CartesianCoordinate3D(z_size-1,max_xy,max_xy),"test on index range: higher bounds"); + check_if_equal(ob5.get_grid_spacing(), + CartesianCoordinate3D(scanner_ptr->get_ring_spacing()/2, + scanner_ptr->get_default_bin_size()/zoom, + scanner_ptr->get_default_bin_size()/zoom), + "test on grid spacing"); + check_if_equal(ob5.get_origin(), origin); + + { + cerr << "Tests get_empty_voxels_on_cartesian_grid\n"; + + shared_ptr< VoxelsOnCartesianGrid > emp(ob5.get_empty_voxels_on_cartesian_grid()); + + IndexRange<3> obtained_range2 = emp->get_index_range(); + check_if_equal( emp->get_origin(), ob5.get_origin(), "test on origin"); + check_if_equal( emp->get_grid_spacing(), ob5.get_grid_spacing(),"test on grid_spacing"); + check(emp->get_index_range() == ob5.get_index_range(),"test on index range"); + + } + + { + cerr << "Tests get_empty_copy()\n"; + + shared_ptr > emp(ob5.get_empty_copy()); + + VoxelsOnCartesianGrid* emp1 = + dynamic_cast* >(emp.get()); + check(emp1 != 0, "test on pointer conversion from get_empty_copy"); + + IndexRange<3> obtained_range3 = emp1->get_index_range(); + check_if_equal( emp->get_origin(), ob5.get_origin(), "test on origin"); + check_if_equal( emp1->get_grid_spacing(), ob5.get_grid_spacing(),"test on grid_spacing"); + check(emp->get_index_range() == ob5.get_index_range(),"test on index range"); + } + { + cerr << "Tests has_same_characteristics()\n"; + shared_ptr > emp (ob5.get_empty_copy()); + check(ob5.has_same_characteristics(*emp), "test on has_same_characteristics after get_empty_copy"); + check(ob5 != *emp, "test on operator!= after get_empty_copy"); + *emp += ob5; + check(ob5 == *emp, "test on operator== after get_empty_copy and operator+="); + emp->set_origin(ob5.get_origin()+1.F); + check(ob5 != *emp, "test on operator!= after shifting origin"); + emp->set_origin(ob5.get_origin()); + check(ob5 == *emp, "test on operator== after shifting origin back to original"); + dynamic_cast& >(*emp). + set_grid_spacing(ob5.get_grid_spacing()+.3F); + check(ob5 != *emp, "test on operator!= after changing voxel size"); + dynamic_cast& >(*emp). + set_grid_spacing(ob5.get_grid_spacing()); + check(ob5 == *emp, "test on operator== after changing voxel size back to original"); + { + IndexRange<3> range = emp->get_index_range(); + range.resize(0,0); + emp->resize(range); + check(!ob5.has_same_characteristics(*emp), "test on has_same_characteristics after resize"); + } + } + + } +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + + +int main() +{ + VoxelsOnCartesianGridTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_convert_array.cxx b/src/test/test_convert_array.cxx new file mode 100644 index 0000000000..e97fe77af3 --- /dev/null +++ b/src/test/test_convert_array.cxx @@ -0,0 +1,247 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + \brief tests for the stir::convert_array functions + + \author Kris Thielemans + \author PARAPET project + +*/ + +#include "stir/Array.h" +#include "stir/convert_array.h" +#include "stir/NumericInfo.h" +#include "stir/IndexRange3D.h" +#include "stir/RunTests.h" +#include +#include +#include + +START_NAMESPACE_STIR + +//! tests convert_array functionality +class convert_array_Tests : public RunTests +{ +public: + void run_tests(); +}; + + +void +convert_array_Tests::run_tests() +{ + + cerr << "Test program for 'convert_array'." << endl + << "Everything is fine when there is no output below." << endl; + + // 1D + { + Array<1,float> tf1(1,20); + tf1.fill(100.F); + + Array<1,short> ti1(1,20); + ti1.fill(100); + + { + // float -> short with a preferred scale factor + float scale_factor = float(1); + Array<1,short> ti2 = convert_array(scale_factor, tf1, NumericInfo()); + + check(scale_factor == float(1),"test convert_array float->short 1D"); + check_if_equal(ti1, ti2, "test convert_array float->short 1D"); + } + + + { + // float -> short with automatic scale factor + float scale_factor = 0; + Array<1,short> ti2 = convert_array(scale_factor, tf1, NumericInfo()); + + check(fabs(NumericInfo().max_value()/1.01 / ti2[1] -1) < 1E-4); + for (int i=1; i<= 20; i++) + ti2[i] = short( double(ti2[i]) *scale_factor); + check(ti1 == ti2); + } + + tf1 *= 1E20F; + { + // float -> short with a preferred scale factor that needs to be adjusted + float scale_factor = 1; + Array<1,short> ti2 = convert_array(scale_factor, tf1, NumericInfo()); + + check(fabs(NumericInfo().max_value()/1.01 / ti2[1] -1) < 1E-4); + for (int i=1; i<= 20; i++) + check(fabs(double(ti2[i]) *scale_factor / tf1[i] - 1) < 1E-4) ; + + } + + { + // short -> float with a scale factor = 1 + float scale_factor = 1; + Array<1,float> tf2 = convert_array(scale_factor, ti1, NumericInfo()); + Array<1,short> ti2(1,20); + + + check(scale_factor == float(1)); + check(tf2[1] == 100.F); + for (int i=1; i<= 20; i++) + ti2[i] = short(double(tf2[i]) *scale_factor) ; + check(ti1 == ti2); + } + + { + // short -> float with a preferred scale factor = .01 + float scale_factor = .01F; + Array<1,float> tf2 = convert_array(scale_factor, ti1, NumericInfo()); + Array<1,short> ti2(1,20); + + check(scale_factor == float(.01)); + //TODO double->short + for (int i=1; i<= 20; i++) + ti2[i] = short(double(tf2[i]) *scale_factor + 0.5) ; + check(ti1 == ti2); + } + + tf1.fill(-3.2F); + ti1.fill(-3); + { + // positive float -> unsigned short with a preferred scale factor + float scale_factor = 1; + Array<1,short> ti2 = convert_array(scale_factor, tf1, NumericInfo()); + + check(scale_factor == float(1)); + check(ti1 == ti2); + } + + { + Array<1,unsigned short> ti3(1,20); + ti3.fill(0); + + // negative float -> unsigned short with a preferred scale factor + float scale_factor = 1; + Array<1,unsigned short> ti2 = + convert_array(scale_factor, tf1, NumericInfo()); + + check(scale_factor == float(1)); + check(ti3 == ti2); + } + } + // 3D + + { + Array<3,float> tf1(IndexRange3D(1,30,1,182,-2,182)); + tf1.fill(100.F); + + Array<3,short> ti1(tf1.get_index_range()); + ti1.fill(100); + + { + // float -> short with a preferred scale factor + float scale_factor = float(1); + Array<3,short> ti2 = convert_array(scale_factor, tf1, NumericInfo()); + + check(scale_factor == float(1)); + check(ti1 == ti2); + } + + { + // float -> short with automatic scale factor + float scale_factor = 0; + Array<3,short> ti2 = convert_array(scale_factor, tf1, NumericInfo()); +#ifndef DO_TIMING_ONLY + check(fabs(NumericInfo().max_value()/1.01 / (*ti2.begin_all()) -1) < 1E-4); + const Array<3,short>::full_iterator iter_end= ti2.end_all(); + for (Array<3,short>::full_iterator iter= ti2.begin_all(); + iter != iter_end; + ++iter) + *iter = short( double((*iter)) *scale_factor); + check(ti1 == ti2); +#endif + } + + tf1 *= 1E20F; + { + // float -> short with a preferred scale factor that needs to be adjusted + float scale_factor = 1; + Array<3,short> ti2 = convert_array(scale_factor, tf1, NumericInfo()); + +#ifndef DO_TIMING_ONLY + check(fabs(NumericInfo().max_value()/1.01 / (*ti2.begin_all()) -1) < 1E-4); + Array<3,short>::full_iterator iter_ti2= ti2.begin_all(); + const Array<3,short>::full_iterator iter_ti2_end= ti2.end_all(); + Array<3,float>::full_iterator iter_tf1= tf1.begin_all(); + for (; + iter_ti2 != iter_ti2_end; + ++iter_ti2, ++iter_tf1) + check(fabs(double(*iter_ti2) *scale_factor / *iter_tf1 - 1) < 1E-4) ; +#endif + } + } + // tests on convert_range + { + std::vector vin(10,2); + std::vector vout(10); + float scale_factor=0; + convert_range(vout.begin(), scale_factor, vin.begin(), vin.end()); + { + std::vector::const_iterator iter_out= vout.begin(); + std::vector::const_iterator iter_in= vin.begin(); + for (; + iter_out != vout.end(); + ++iter_in, ++iter_out) + check(fabs(double(*iter_out) *scale_factor / *iter_in - 1) < 1E-4, + "convert_range signed char->int") ; + } + } + // equal type + { + std::vector vin(10,2); + std::vector vout(10); + float scale_factor=3; + convert_range(vout.begin(), scale_factor, vin.begin(), vin.end()); + { + check_if_equal(scale_factor, 1.F, "scale_factor should be 1 when using equal types"); + std::vector::const_iterator iter_out= vout.begin(); + std::vector::const_iterator iter_in= vin.begin(); + for (; + iter_out != vout.end(); + ++iter_in, ++iter_out) + check(fabs(double(*iter_out) *scale_factor / *iter_in - 1) < 1E-4, + "convert_range equal types") ; + } + } +} + +END_NAMESPACE_STIR + + + +USING_NAMESPACE_STIR + + + +int main() +{ + convert_array_Tests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_coordinates.cxx b/src/test/test_coordinates.cxx new file mode 100644 index 0000000000..c2ce4907da --- /dev/null +++ b/src/test/test_coordinates.cxx @@ -0,0 +1,378 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup test + + \brief A simple program to test the Coordinate classes + + \author Kris Thielemans + \author PARAPET project + + + +*/ + +#include "stir/Coordinate2D.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/Coordinate4D.h" +#include "stir/round.h" +#include "stir/RunTests.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + + +START_NAMESPACE_STIR + +/*! + \brief Class with tests for BasicCoordinate, Coordinate3D et al. + \ingroup test +*/ +class coordinateTests : public RunTests +{ +public: + void run_tests(); +}; + + +void +coordinateTests::run_tests() +{ + cerr << "Testing Coordinate classes" << endl + <<" (There should be only informative messages here starting with 'Testing')" << endl; + + { + cerr << "Testing BasicCoordinate<3,float>" << endl; + + BasicCoordinate<3, float> a; + a[1]=1;a[2]=2;a[3]=3; + BasicCoordinate<3, float> copy_of_a; + copy_of_a[1]=1;copy_of_a[2]=2;copy_of_a[3]=3; + BasicCoordinate<3, float> b; + b[1]=-1;b[2]=-3;b[3]=5; + BasicCoordinate<3, float> a_plus_b; + a_plus_b[1]=0;a_plus_b[2]=-1;a_plus_b[3]=8; + + + check(a[3]==3, "testing operator[]"); + check_if_equal(inner_product(a,b), 8.F, "testing inner_product"); + check_if_equal(norm(a), 3.74166, "testing norm"); + + a += b; + check_if_zero(a- a_plus_b, "testing operator+=(BasicCoordinate)"); + a -= b; + check_if_equal(a, copy_of_a, "testing operator-=(BasicCoordinate)"); + + { + BasicCoordinate<3, float> b2(3.F); + check_if_zero(norm(b2-3.F), "testing constructor with single element, and operator-"); + b2.fill(4.F); + check_if_zero(norm(b2-4.F), "testing fill, and operator-"); + } + + { + BasicCoordinate<3, float> b1 = b; + check_if_zero(norm(b1-b), "testing copy constructor, and operator-"); + + b1 = a; + check_if_zero(norm(a-b1), "testing assignment"); + } + + a *= 4; + check(a[1] == copy_of_a[1]*4, "testing operator*=(float)"); + check_if_equal(norm(a), norm(copy_of_a)*4, "testing operator*=(float)"); + a /= 4; + check_if_zero(norm(a-copy_of_a), "testing operator/=(float)"); + + { + BasicCoordinate<3, float> a1; + a1 = b; + a1 *= 3; + a1 += a; + a1 -= 4; + BasicCoordinate<3, float> a2 = (b*3+a)-4; + check_if_zero(norm(a1-a2), "testing various numerical operators"); + } + + // basic iterator tests + { +#ifndef STIR_NO_NAMESPACES + float *p=std::find(b.begin(), b.end(), -3); +#else + float *p=find(b.begin(), b.end(), -3); +#endif + check_if_zero(p - b.begin() - 1, "iterator test"); + BasicCoordinate<3, float> b_sorted; + b_sorted[1]=-3;b_sorted[2]=-1;b_sorted[3]=5; +#ifndef STIR_NO_NAMESPACES + std::sort(b.begin(), b.end()); +#else + sort(b.begin(), b.end()); +#endif + check_if_zero(norm(b-b_sorted), "testing iterators via STL sort"); + } + } + { + cerr << "Testing join/cut_first_dimension/comparisons on BasicCoordinate" << endl; + + // join + { + BasicCoordinate<3, int> a; + a[1]=1;a[2]=2;a[3]=3; + { + BasicCoordinate<4, int> a4 = join(0, a); + check_if_equal(a4[1], 0, "testing join of float with BasicCoordinate"); + check_if_equal(a4[2], 1, "testing join of float with BasicCoordinate"); + check_if_equal(a4[3], 2, "testing join of float with BasicCoordinate"); + check_if_equal(a4[4], 3, "testing join of float with BasicCoordinate"); + } + { + BasicCoordinate<4, int> a4 = join(a, 0); + check_if_equal(a4[1], 1, "testing join of BasicCoordinate with float"); + check_if_equal(a4[2], 2, "testing join of BasicCoordinate with float"); + check_if_equal(a4[3], 3, "testing join of BasicCoordinate with float"); + check_if_equal(a4[4], 0, "testing join of BasicCoordinate with float"); + } + } + // cut*dimension + { + BasicCoordinate<3, int> a; + a[1]=1;a[2]=2;a[3]=3; + const BasicCoordinate<2, int> start = cut_last_dimension(a); + check_if_equal(start[1], 1, "testing cut_last_dimension"); + check_if_equal(start[2], 2, "testing cut_last_dimension"); + const BasicCoordinate<2, int> end = cut_first_dimension(a); + check_if_equal(end[1], 2, "testing cut_first_dimension"); + check_if_equal(end[2], 3, "testing cut_first_dimension"); + } + // comparison 2D + { + BasicCoordinate<2, int> a; + a[1]=1;a[2]=2; + BasicCoordinate<2, int> b; + b[1]=1;b[2]=1; + check(a==a, "2D operator=="); + check(a<=a, "2D operator<= (when equal)"); + check(a>=a, "2D operator>= (when equal)"); + check(a>b, "2D operator>"); + check(b=b, "2D operator>= (when not equal)"); + check(b<=a, "2D operator<= (when not equal)"); + check(a!=b, "2D operator!="); + } + // comparison 3D + { + BasicCoordinate<3, int> a; + a[1]=1;a[2]=2;a[3]=3; + BasicCoordinate<3, int> b; + b[1]=1;b[2]=1;b[3]=3; + check(a==a, "3D operator=="); + check(a<=a, "3D operator<= (when equal)"); + check(a>=a, "3D operator>= (when equal)"); + check(a>b, "3D operator>"); + check(b=b, "3D operator>= (when not equal)"); + check(b<=a, "3D operator<= (when not equal)"); + check(a!=b, "3D operator!="); + } + // comparison 4D + { + BasicCoordinate<4, int> a; + a[1]=1;a[2]=2;a[3]=3; a[4]=1; + BasicCoordinate<4, int> b; + b[1]=1;b[2]=1;b[3]=3; b[4]=2; + check(a==a, "4D operator=="); + check(a<=a, "4D operator<= (when equal)"); + check(a>=a, "4D operator>= (when equal)"); + check(a>b, "4D operator>"); + check(b=b, "4D operator>= (when not equal)"); + check(b<=a, "4D operator<= (when not equal)"); + check(a!=b, "4D operator!="); + } + } + + // essentially the same as BasicCoordinate<3,float>, but now with Coordinate3D + // also, at the end, some conversions are tested + { + cerr << "Testing Coordinate3D" << endl; + + Coordinate3D a; + a[1]=1;a[2]=2;a[3]=3; + // use new constructor + Coordinate3D copy_of_a(1,2,3); + Coordinate3D b; + b[1]=-1;b[2]=-3;b[3]=5; + Coordinate3D a_plus_b; + a_plus_b[1]=0;a_plus_b[2]=-1;a_plus_b[3]=8; + + check(a[3]==3, "testing operator[]"); + check_if_equal(inner_product(a,b), 8.F, "testing inner_product"); + check_if_equal(norm(a), 3.74166, "testing norm"); + + a += b; + check_if_zero(norm(a - a_plus_b), "testing operator+=(BasicCoordinate)"); + a -= b; + check_if_zero(norm(a - copy_of_a), "testing operator-=(BasicCoordinate)"); + + { + Coordinate3D b1 = b; + check_if_zero(norm(b1-b), "testing copy constructor, and operator-"); + + b1 = a; + check_if_zero(norm(a-b1), "testing assignment"); + } + + a *= 4; + check_if_zero(norm(a)- norm(copy_of_a)*4, "testing operator*=(float)"); + check_if_zero(a[1]- copy_of_a[1]*4, "testing operator*=(float)"); + a /= 4; + check_if_zero(norm(a-copy_of_a), "testing operator/=(float)"); + + { + Coordinate3D a1; + a1 = b; + a1 *= 3; + a1 += a; + a1 -= 4; + Coordinate3D a2 = (b*3+a)-4; + check_if_zero(norm(a1-a2), "testing various numerical operators"); + } + + { + BasicCoordinate<3,float> gen_a(a); + a = gen_a; + check_if_zero(norm(a-copy_of_a), "testing conversions"); + check_if_zero(norm(gen_a-copy_of_a), "testing conversions"); + } + + } + + // essentially the same as above, but now with CartesianCoordinate3D + { + cerr << "Testing CartesianCoordinate3D" << endl; + + CartesianCoordinate3D a; + a[1]=1;a[2]=2;a[3]=3; + // use new constructor + CartesianCoordinate3D copy_of_a(1,2,3); + CartesianCoordinate3D b; + b[1]=-1;b[2]=-3;b[3]=5; + CartesianCoordinate3D a_plus_b; + a_plus_b[1]=0;a_plus_b[2]=-1;a_plus_b[3]=8; + + check(a[3]==3, "testing operator[]"); + check_if_equal(inner_product(a,b), 8.F, "testing inner_product"); + check_if_equal(norm(a), 3.74166, "testing norm"); + + a += b; + check_if_zero(norm(a - a_plus_b), "testing operator+=(BasicCoordinate)"); + a -= b; + check_if_zero(norm(a - copy_of_a), "testing operator-=(BasicCoordinate)"); + + { + CartesianCoordinate3D b1 = b; + check_if_zero(norm(b1-b), "testing copy constructor, and operator-"); + + b1 = a; + check_if_zero(norm(a-b1), "testing assignment"); + } + + a *= 4; + check_if_zero(norm(a)- norm(copy_of_a)*4, "testing operator*=(float)"); + check_if_zero(a[1]- copy_of_a[1]*4, "testing operator*=(float)"); + a /= 4; + check_if_zero(norm(a-copy_of_a), "testing operator/=(float)"); + + { + CartesianCoordinate3D a1; + a1 = b; + a1 *= 3; + a1 += a; + a1 -= 4; + CartesianCoordinate3D a2 = (b*3+a)-4; + check_if_zero(norm(a1-a2), "testing various numerical operators"); + } + + { + BasicCoordinate<3,float> gen_a(a); + a = gen_a; + check_if_zero(norm(a-copy_of_a), "testing conversions"); + check_if_zero(norm(gen_a-copy_of_a), "testing conversions"); + } + + } + + { + cerr << "Testing round with coordinates" << endl; + const Coordinate3D af(1.1F,-1.1F,3.6F); + const Coordinate3D aint = round(af); + check_if_equal(aint, Coordinate3D (1,-1,4)); + } + { + cerr << "Testing constructor with different types of coordinates" << endl; + /* Note: C++ rules for automatic conversion are such that the code below + would not work if 'af' is defined as + const Coordinate3D af(1.1F,-1.1F,3.6F); + */ + const BasicCoordinate<3,float> af = Coordinate3D (1.1F,-1.1F,3.6F); + const BasicCoordinate<3,int> aint(af); + check_if_equal(aint, Coordinate3D (1,-1,3)); + const BasicCoordinate<3,float> af2(aint); + check_if_equal(af2, Coordinate3D (1.F,-1.F,3.F)); + } + + { + cerr << "Testing make_coordinate" << endl; + check_if_equal(make_coordinate(1.F)[1],1.F, "test make_coordinate with 1 arg"); + check_if_equal(make_coordinate(1.F,3.4F),Coordinate2D(1.F,3.4F), + "test make_coordinate with 2 args"); + check_if_equal(make_coordinate(1.,3.4,-4.8),Coordinate3D(1.,3.4,-4.8), + "test make_coordinate with 3 args"); + check_if_equal(make_coordinate(1,2,3,4),Coordinate4D(1,2,3,4), + "test make_coordinate with 4 args"); + check_if_equal(make_coordinate(1,2,3,4,5),join(Coordinate4D(1,2,3,4),5), + "test make_coordinate with 5 args"); + check_if_equal(make_coordinate(1,2,3,4,5,6),join(join(Coordinate4D(1,2,3,4),5),6), + "test make_coordinate with 6 args"); + } +} + + +END_NAMESPACE_STIR + + + +USING_NAMESPACE_STIR + + + +int main() +{ + coordinateTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_display.cxx b/src/test/test_display.cxx new file mode 100644 index 0000000000..9de7a3968c --- /dev/null +++ b/src/test/test_display.cxx @@ -0,0 +1,110 @@ +/*! + + \file + \ingroup test + + \brief Very simple test program for stir::display() + + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/VectorWithOffset.h" +#include "stir/Array.h" +#include "stir/IndexRange3D.h" + +#include "stir/display.h" +#include "stir/utilities.h" // for ask_... facilities + +USING_NAMESPACE_STIR + +int +main() +{ + std::cerr << "Tests display with a few very simple bitmaps.\n" + << "You should see 10 bitmaps (4th and 5th brighter) twice, and then a single bitmap\n"; + + typedef float test_type; + + // provide a test example. This could easily be changed in reading + // something from file + // note: sizes are prime numbers to avoid having accidental matches + // with 'word-boundaries' etc. This is especailly an issue + // when using X windows. + Array<3,test_type> t(IndexRange3D(10,87,123)); + + VectorWithOffset scale_factors(10); + scale_factors.fill(1.F); + // make images 3 and 4 stand out + scale_factors[3] = 1.3F; + scale_factors[4] = 1.5F; + for (int i=0; i text(t.get_min_index(), t.get_max_index()); + for (int i=t.get_min_index(); i<= t.get_max_index(); i++) + { + text[i] = new char [15]; + sprintf(text[i], "image %d", i); + } + + display(t, scale_factors, text, maxi, "Test display 3D all args", scale); + display(t,t.find_max()/2,"Test display 3D 3 args, half the colour scale" ); + + for (int i=t.get_min_index(); i<= t.get_max_index(); i++) + delete[] text[i]; + + + display(*t.begin(), "Test display 2D, 2 args"); + return EXIT_SUCCESS; +} diff --git a/src/test/test_filename_functions.cxx b/src/test/test_filename_functions.cxx new file mode 100644 index 0000000000..814291be24 --- /dev/null +++ b/src/test/test_filename_functions.cxx @@ -0,0 +1,353 @@ +/*! + + \file + \ingroup test + + \brief Test program for filename functions defined in utility.h + + \author Kris Thielemans + \author PARAPET project +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/utilities.h" +#include "stir/RunTests.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::string; +#endif + +START_NAMESPACE_STIR + +/*! + \brief Test class for filename functions defined in utility.h + \ingroup test +*/ +class FilenameTests : public RunTests +{ +public: + void run_tests(); +}; + +void FilenameTests::run_tests() +{ + char filename_with_directory[max_filename_length]; + + cerr << "Testing various filename utilities "; +#if defined(__OS_VAX__) + + cerr << "(using VAX-VMS filesystem conventions)" << endl; + + // relative names either contain no '[', or have '[.' +#if 0 + // tests disabled as add_extension is disabled + strcpy(filename_with_directory, "[dir.name]filename"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "[dir.name]filename.img") == 0); + strcpy(filename_with_directory, "[dir.name]filename.v"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "[dir.name]filename.v") == 0); +#endif + + strcpy(filename_with_directory, "[dir.name]filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + strcpy(filename_with_directory, "filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + + { + // same checks but with string versions + string filename_with_directory = "[dir.name]filename"; + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "[dir.name]filename.img"); + filename_with_directory = "[dir.name]filename.v"; + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "[dir.name]filename.v"); + + filename_with_directory = "[dir.name]filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + filename_with_directory = "filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + } + check(is_absolute_pathname("da0:[bladi.b]bla.v") == true); + check(is_absolute_pathname("[.bladi]bla.v") == false); + check(is_absolute_pathname("bla.v") == false); + + strcpy(filename_with_directory, "[.b]c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "da0:[a]"), + "da0:[a.b]c.v") == 0); + strcpy(filename_with_directory, "c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "da0:[a.b]"), + "da0:[a.b]c.v") == 0); + strcpy(filename_with_directory, "da0:[b]c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "da0:[b]c.v") == 0); + +#elif defined(__OS_WIN__) + + cerr << "(using Windows filesystem conventions)" << endl; + + // relative names do not start with '\' or '?:\' + // but we allow forward slashes as well +#if 0 + // tests disabled as add_extension is disabled + strcpy(filename_with_directory, "dir.name\\filename"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name\\filename.img") == 0); + strcpy(filename_with_directory, "dir.name\\filename.v"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name\\filename.v") == 0); + strcpy(filename_with_directory, "dir.name/filename"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name/filename.img") == 0); + strcpy(filename_with_directory, "dir.name/filename.v"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name/filename.v") == 0); +#endif + strcpy(filename_with_directory, "dir.name\\filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + strcpy(filename_with_directory, "dir.name/filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + strcpy(filename_with_directory, "a:filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + strcpy(filename_with_directory, "filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + + { + // same checks with string versions + string filename_with_directory = "dir.name\\filename"; + + check(get_directory_name(filename_with_directory) == "dir.name\\"); + + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name\\filename.img"); + filename_with_directory = "dir.name\\filename.v"; + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name\\filename.v"); + filename_with_directory = "dir.name/filename"; + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name/filename.img"); + filename_with_directory = "dir.name/filename.v"; + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name/filename.v"); + + filename_with_directory = "dir.name\\filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + filename_with_directory = "dir.name/filename.v"; + + check(get_directory_name(filename_with_directory) == "dir.name/"); + + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + filename_with_directory = "a:filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + filename_with_directory = "filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + } + check(is_absolute_pathname("\\bladi\\bla.v") == true); + check(is_absolute_pathname("a:\\bladi\\bla.v") == true); + check(is_absolute_pathname("bladi\\bla.v") == false); + check(is_absolute_pathname("/bladi/bla.v") == true); + check(is_absolute_pathname("a:/bladi/bla.v") == true); + check(is_absolute_pathname("bladi/bla.v") == false); + check(is_absolute_pathname("bla.v") == false); + + strcpy(filename_with_directory, "b\\c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "a\\b\\c.v") == 0); + strcpy(filename_with_directory, "b\\c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a\\"), + "a\\b\\c.v") == 0); + strcpy(filename_with_directory, "b\\c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a:"), + "a:b\\c.v") == 0); + strcpy(filename_with_directory, "c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a\\b"), + "a\\b\\c.v") == 0); + strcpy(filename_with_directory, "\\b\\c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "\\b\\c.v") == 0); + strcpy(filename_with_directory, "b/c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "a\\b/c.v") == 0); + strcpy(filename_with_directory, "b/c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a/"), + "a/b/c.v") == 0); + strcpy(filename_with_directory, "b/c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a:"), + "a:b/c.v") == 0); + strcpy(filename_with_directory, "c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a/b"), + "a/b\\c.v") == 0); + strcpy(filename_with_directory, "/b/c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "/b/c.v") == 0); + + +#elif defined(__OS_MAC__) + + cerr << "(using MacOS filesystem conventions)" << endl; + + // relative names either have no ':' or do not start with ':' +#if 0 + // tests disabled as add_extension is disabled + strcpy(filename_with_directory, "dir.name:filename"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name:filename.img") == 0); + strcpy(filename_with_directory, "dir.name:filename.v"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name:filename.v") == 0); + + strcpy(filename_with_directory, "dir.name:filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + strcpy(filename_with_directory, "filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); +#endif + + { + // same checks with string versions + string filename_with_directory = "dir.name:filename"; + + check(get_directory_name(filename_with_directory) == "dir.name:"); + + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name:filename.img"); + filename_with_directory = "dir.name:filename.v"; + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name:filename.v"); + + filename_with_directory = "dir.name:filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + filename_with_directory = "filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + } + check(is_absolute_pathname("bladi:bla.v") == true); + check(is_absolute_pathname(":bladi:bla.v") == false); + check(is_absolute_pathname("bla.v") == false); + + strcpy(filename_with_directory, ":b:c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "a:b:c.v") == 0); + strcpy(filename_with_directory, ":b:c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a:"), + "a:b:c.v") == 0); + strcpy(filename_with_directory, "c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a:b:"), + "a:b:c.v") == 0); + strcpy(filename_with_directory, "c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a:b"), + "a:b:c.v") == 0); + strcpy(filename_with_directory, "b:c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "b:c.v") == 0); + +#else // defined(__OS_UNIX__) + + cerr << "(using Unix filesystem conventions)" << endl; + +#if 0 + // tests disabled as add_extension is disabled + strcpy(filename_with_directory, "dir.name/filename"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name/filename.img") == 0); + strcpy(filename_with_directory, "dir.name/filename.v"); + add_extension(filename_with_directory, ".img"); + check(strcmp(filename_with_directory, "dir.name/filename.v") == 0); + + strcpy(filename_with_directory, "dir.name/filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); + strcpy(filename_with_directory, "filename.v"); + check(strcmp(find_filename(filename_with_directory), "filename.v") == 0); +#endif + + { + // same checks with string versions + string filename_with_directory = "dir.name/filename"; + check(get_directory_name(filename_with_directory) == "dir.name/"); + + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name/filename.img"); + filename_with_directory = "dir.name/filename.v"; + add_extension(filename_with_directory, ".img"); + check(filename_with_directory == "dir.name/filename.v"); + + filename_with_directory = "dir.name/filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + filename_with_directory = "filename.v"; + check(filename_with_directory.substr( + find_pos_of_filename(filename_with_directory), + string::npos) + == "filename.v"); + + } + + check(is_absolute_pathname("/bladi/bla.v") == true); + check(is_absolute_pathname("bladi/bla.v") == false); + check(is_absolute_pathname("bla.v") == false); + + strcpy(filename_with_directory, "b/c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "a/b/c.v") == 0); + strcpy(filename_with_directory, "b/c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a/"), + "a/b/c.v") == 0); + strcpy(filename_with_directory, "c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a/b"), + "a/b/c.v") == 0); + strcpy(filename_with_directory, "/b/c.v"); + check(strcmp(prepend_directory_name(filename_with_directory, "a"), + "/b/c.v") == 0); +#endif /* Unix */ +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR +int main() +{ + FilenameTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_find_fwhm_in_image.cxx b/src/test/test_find_fwhm_in_image.cxx new file mode 100644 index 0000000000..8cd0a23c5e --- /dev/null +++ b/src/test/test_find_fwhm_in_image.cxx @@ -0,0 +1,372 @@ +/* + Copyright (C) 2004 - 2009-11-03, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup test + + \brief A simple program to test stir::find_fwhm_in_image + + \author Pablo Aguiar + \author Kris Thielemans + + To run the test, simply run the executable. +*/ + +#include "stir/RunTests.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/SeparableCartesianMetzImageFilter.h" +#define DO_DISPLAY 0 + +#if DO_DISPLAY +#include "stir/display.h" +#endif +#include "stir/find_fwhm_in_image.h" +#include "stir/Coordinate3D.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::ifstream; +using std::istream; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief A simple class to test the find_fwhm_in_image function. +*/ +class find_fwhm_in_imageTests : public RunTests +{ +public: + find_fwhm_in_imageTests() + {} + void run_tests(); +private: + //istream& in; +}; + +void set_Gaussian_filter_fwhm(SeparableCartesianMetzImageFilter& filter, + const float fwhm_z, + const float fwhm_y, + const float fwhm_x) +{ + std::string buffer; + std::stringstream parameterstream(buffer); + + parameterstream << "Separable Cartesian Metz Filter Parameters :=\n" + << "x-dir filter FWHM (in mm):= " << fwhm_x << "\n" + << "y-dir filter FWHM (in mm):= " << fwhm_y << "\n" + << "z-dir filter FWHM (in mm):= " << fwhm_z << "\n" + << "x-dir filter Metz power:= .0\n" + << "y-dir filter Metz power:= .0\n" + << "z-dir filter Metz power:=.0\n" + << "END Separable Cartesian Metz Filter Parameters :=\n"; + filter.parse(parameterstream); +} + + +void find_fwhm_in_imageTests::run_tests() +{ + cerr << "Testing find_fwhm_in_image function..." << endl; + + set_tolerance(1.0); + + CartesianCoordinate3D origin (0,1,2); + CartesianCoordinate3D grid_spacing (2,1.4F,2.5F); + + IndexRange<3> + range(CartesianCoordinate3D(0,-65,-64), + CartesianCoordinate3D(24,64,65)); + + + + VoxelsOnCartesianGrid image(range,origin, grid_spacing); + SeparableCartesianMetzImageFilter filter; + set_Gaussian_filter_fwhm(filter, 12,14,12); + + { + // point source + image.fill(0); + Coordinate3D location_of_maximum(12,0,0); + + image[location_of_maximum] = 1; + + check_if_equal(image[location_of_maximum], 1.F, + "for parameter constant, should be equal"); + + filter.apply(image); +#if DO_DISPLAY + std::cerr << "min, max: " << image.find_min() <<", " << image.find_max() << '\n'; + display(image,image.find_max()); +#endif + + const std::list > result = + find_fwhm_in_image(image, 1, 2, 0, true); + + check(result.size() == 1, "check only 1 maximum for single point source case"); + + std::list >::const_iterator current_result_iter = + result.begin(); + + check_if_equal(current_result_iter->voxel_location, location_of_maximum, + "check location of maximum for single point source case"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(12,14,12), + "check resolution for single point source case"); + + + } + + { + // two spheres in a slice + image.fill(0); + Coordinate3D location_of_maximum(12,0,0); + image[location_of_maximum]=2; + image[12][0][18]=1; + set_Gaussian_filter_fwhm(filter, 12,14,12); + filter.apply(image); +#if DO_DISPLAY + display(image, image.find_max()); +#endif + const std::list > result = + find_fwhm_in_image(image, 1, 2, 0, true); + + check(result.size() == 1, "check only 1 maximum for 2 point sources in 1 slice"); + + std::list >::const_iterator current_result_iter = + result.begin(); + + check_if_equal(current_result_iter->voxel_location, location_of_maximum, + "check location of maximum for 2 point sources in 1 slice"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(12,14,12), + "check resolution for 2 point sources in 1 slice"); + } + + { + SeparableCartesianMetzImageFilter filter2; + set_Gaussian_filter_fwhm(filter2, 13,14,11); + + // two spheres in different slices + image.fill(0); + Coordinate3D location_of_maximum(14,0,0); + image[location_of_maximum]=2; + image[3][0][0]=1; + filter2.apply(image); +#if DO_DISPLAY + display(image, image.find_max()); +#endif + const std::list > result = + find_fwhm_in_image(image, 1, 2, 0, true); + + check(result.size() == 1, "check only 1 maximum for 2 point sources in different slices"); + + std::list >::const_iterator current_result_iter = + result.begin(); + + check_if_equal(current_result_iter->voxel_location, location_of_maximum, + "check location of maximum for 2 point sources in different slices"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(13,14,11), + "check resolution for 2 point sources in different slices"); + } + + { + // 3 spheres source + image.fill(0.0005F); + Coordinate3D location_of_maximum1(12,0,0); + image[location_of_maximum1] = 5; + + Coordinate3D location_of_maximum2(19,32,36); + Coordinate3D location_of_maximum3(3,-32,-32); + image[location_of_maximum2]=3.F; + image[location_of_maximum3]=1.2F; + // other_image[24][10][0]=1; + //other_image[0][0][10]=1; + //other_image[14][64][0]=1; + //other_image[8][0][65]=1; + + set_Gaussian_filter_fwhm(filter, 12,14,12); + filter.apply(image); + +#if DO_DISPLAY + display(image, image.find_max()); +#endif + + const std::list > result = + find_fwhm_in_image(image, 2, 2, 0, true); + + check(result.size() == 2, "check only 2 maxima from 3 point source case"); + + std::list >::const_iterator current_result_iter = + result.begin(); + + check_if_equal(current_result_iter->voxel_location, location_of_maximum1, + "check location of 1st maximum for 3 point source case"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(12,14,12), + "check resolution for 1st maximum 3 point source case"); + ++current_result_iter; + check_if_equal(current_result_iter->voxel_location, location_of_maximum2, + "check location of 2nd maximum for 3 point source case"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(12,14,12), + "check resolution for 2nd maximum 3 point source case"); + //++current_result_iter; + //check_if_equal(current_result_iter->voxel_location, location_of_maximum3, + // "check location of 3rd maximum for 3 point source case"); + //check_if_equal(current_result_iter->resolution, + // Coordinate3D(4,4,4), + // "check resolution for 3rd maximum 3 point source case"); + + } + + { + // test line source in y-direction + image.fill(0); + const int z_location = 12; + const int x_location = 0; + for (int y=image[z_location].get_min_index(); + y<=image[z_location].get_max_index();++y) + image[z_location][y][x_location] = 1; + set_Gaussian_filter_fwhm(filter, 12,0,10); + filter.apply(image); + const std::list > result = + find_fwhm_in_image(image, image[z_location].get_length(), 2, 2, true); + #if DO_DISPLAY + display(image, image.find_max()); +#endif + check(result.size() == static_cast(image[z_location].get_length()) , + "check number of maxima in line source along y axis"); + int y=image[z_location].get_min_index(); + for(std::list >::const_iterator current_result_iter = + result.begin(); + current_result_iter != result.end(); + ++current_result_iter) + { + Coordinate3D location_of_maximum(z_location,y,x_location); + check_if_equal(current_result_iter->voxel_location, location_of_maximum, + "check location of maximum in line source along y axis"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(12,0,10), + "check resolution in line source along y axisXXX"); + ++y; + } + + } + + { + // test line source in x-direction + image.fill(0); + const int z_location = 9; + const int y_location = 0; + for (int x=image[z_location][y_location].get_min_index(); + x<=image[z_location][y_location].get_max_index();++x) + { + image[z_location][y_location][x] = 1; + } + set_Gaussian_filter_fwhm(filter, 12,10,0); + filter.apply(image); + const std::list > result = + find_fwhm_in_image(image, image[z_location].get_length(), 2, 3, true); + #if DO_DISPLAY + display(image, image.find_max()); +#endif + check(result.size() == static_cast(image[z_location][y_location].get_length()) , + "check number of maxima in line source along x axis"); + int x=image[z_location][y_location].get_min_index(); + for(std::list >::const_iterator current_result_iter = + result.begin(); + current_result_iter != result.end(); + ++current_result_iter) + { + Coordinate3D location_of_maximum(z_location,y_location,x); + check_if_equal(current_result_iter->voxel_location, location_of_maximum, + "check location of maximum in line source along x axis"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(12,10,0), + "check resolution in line source along x axis"); + ++x; + } + } + + { + // test line source in z-direction + image.fill(0); + + const int y_location = 0; + const int x_location = 0; + for (int z=image.get_min_index(); z<=image.get_max_index();++z) + { + image[z][y_location][x_location] = 1; + } + set_Gaussian_filter_fwhm(filter, 12,11,10); + filter.apply(image); + const std::list > result = + find_fwhm_in_image(image, image.get_length(), 2, 1, true); +#if DO_DISPLAY + display(image, image.find_max()); +#endif + check(result.size() == static_cast(image.get_length()) , + "check number of maxima in line source along z axis"); + int z=image.get_min_index(); + for(std::list >::const_iterator current_result_iter = + result.begin(); + current_result_iter != result.end(); + ++current_result_iter) + { + Coordinate3D location_of_maximum(z, y_location,x_location); + check_if_equal(current_result_iter->voxel_location, location_of_maximum, + "check location of maximum in line source along z axis"); + check_if_equal(current_result_iter->resolution, + Coordinate3D(0,11,10), + "check resolution in line source along z axis"); + ++z; + } + } + + /* + const double old_tolerance = get_tolerance(); + set_tolerance(error_on_chi_square); + check_if_equal(expected_chi_square, chi_square, + "for parameter chi_square, should be equal"); + */ +} + + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if (argc != 1) + { + cerr << "Usage : " << argv[0] << " \n"; + return EXIT_FAILURE; + } + + find_fwhm_in_imageTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_interpolate.cxx b/src/test/test_interpolate.cxx new file mode 100644 index 0000000000..1800b28d65 --- /dev/null +++ b/src/test/test_interpolate.cxx @@ -0,0 +1,163 @@ +// +// +/*! + + \file + \ingroup test + + \brief Interactive test program for overlap_interpolate + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/numerics/overlap_interpolate.h" +#include "stir/Array.h" +#include "stir/IndexRange2D.h" +#include "stir/utilities.h" +#include "stir/stream.h" + +#ifndef STIR_NO_NAMESPACES +using std::cout; +using std::endl; +#endif + +USING_NAMESPACE_STIR + +int +main(int argc, char *argv[]) +{ + if (ask ("1D", false)) + { + typedef Array<1,float> array; + + array in(-9,9); + // initialise with some data + for (int i=-9; i<=9; i++) + in[i] = .5*square(i-6)+3.*i-30; + + + do + { + const float zoom = + ask_num("Zoom ", 0., 100., 1.); + const float offset = + ask_num("Offset ", -100., 100., 0.); + const float min2 = (in.get_min_index()-.5 - offset)*zoom; + const float max2 = (in.get_max_index()+.5 - offset)*zoom; + cout << "Range of non-zero 'out' coordinates : (" + << min2 << ", " << max2 << ")" << endl; + const int out_min = + ask_num("Start index ", (int)(min2-20), (int)(max2+20), (int)min2); + const int out_max = + ask_num("End index ", out_min, (int)(max2+20), (int)max2); + + array out(out_min, out_max); + // fill with some junk to see if it sets it to 0 + out.fill(111111111.F); + + overlap_interpolate(out, in, zoom, offset, true); + cout << "in:" << in; + cout << "out:" << out; + + cout << "old sum : " << in.sum() << ", new sum : " << out.sum() << endl; + + { + Array<1,float> in_coords(in.get_min_index(), in.get_max_index()+1); + for (int i=in_coords.get_min_index(); i<=in_coords.get_max_index(); ++i) + in_coords[i]=i-.5F; + Array<1,float> out_coords(out.get_min_index(), out.get_max_index()+1); + for (int i=out_coords.get_min_index(); i<=out_coords.get_max_index(); ++i) + out_coords[i]=(i-.5F)/zoom+offset; + array new_out(out.get_index_range()); + overlap_interpolate(new_out.begin(), new_out.end(), + out_coords.begin(), out_coords.end(), + in.begin(), in.end(), + in_coords.begin(), in_coords.end() + ); + cout << new_out; + new_out -= out; + cout << "diff:\n" << new_out; + } + } while (ask("More ?", true)); + } + + + if (ask ("2D", true)) + { + + typedef Array<2,float> array; + + array in(IndexRange2D(-4,4,3,6)); + // initialise with arbitrary data + for (int i=-4; i<=4; i++) + for (int j=3; j<=6; j++) + in[i][j] = .5*square(i-6)+3.*i-30+j; + + do + { + const float zoom = + ask_num("Zoom ", 0., 100., 1.); + const float offset = + ask_num("Offset ", -100., 100., 0.); + const float min2 = (in.get_min_index()-.5 - offset)*zoom; + const float max2 = (in.get_max_index()+.5 - offset)*zoom; + cout << "Range of non-zero 'out' coordinates : (" + << min2 << ", " << max2 << ")" << endl; + const int out_min = + ask_num("Start index ", (int)(min2-20), (int)(max2+20), (int)min2); + const int out_max = + ask_num("End index ", out_min, (int)(max2+20), (int)max2); + + array out(IndexRange2D(out_min, out_max, 3,6)); + + + // fill with some junk to see if it sets it to 0 + out.fill(111111111.F); + + overlap_interpolate(out, in, zoom, offset, true); + cout << out; + + cout << "old sum : " << in.sum() << ", new sum : " << out.sum() << endl; + { + Array<1,float> in_coords(in.get_min_index(), in.get_max_index()+1); + for (int i=in_coords.get_min_index(); i<=in_coords.get_max_index(); ++i) + in_coords[i]=i-.5F; + Array<1,float> out_coords(out.get_min_index(), out.get_max_index()+1); + for (int i=out_coords.get_min_index(); i<=out_coords.get_max_index(); ++i) + out_coords[i]=(i-.5F)/zoom+offset; + array new_out(out.get_index_range()); + overlap_interpolate(new_out.begin(), new_out.end(), + out_coords.begin(), out_coords.end(), + in.begin(), in.end(), + in_coords.begin(), in_coords.end() + ); + cout << new_out; + new_out -= out; + cout << "diff:\n" << new_out; + } + + } while (ask("More ?", true)); + } + + + return EXIT_SUCCESS; +} diff --git a/src/test/test_linear_regression.cxx b/src/test/test_linear_regression.cxx new file mode 100644 index 0000000000..c1b5bfa7b3 --- /dev/null +++ b/src/test/test_linear_regression.cxx @@ -0,0 +1,246 @@ +// +// +/*! + + \file + \ingroup test + + \brief A simple programme to test the stir::linear_regression function. + + \author Kris Thielemans + \author PARAPET project + + + + + To run the test, you should use a command line argument with the name of a file. + This should contain a number of test cases for the fit. + See linear_regressionTests for file contents. +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/linear_regression.h" +#include "stir/RunTests.h" +#include "stir/ArrayFunction.h" + +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::ifstream; +using std::istream; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief A simple class to test the linear_regression function. + + The class reads input from a stream, whose contents should be as follows: + + 1 line with some general text
          + 1 line with some text for the next test case
          + list_of_numbers
          + 1 line with some text for the next test case
          + list_of_numbers
          + ... + + + where list_of_numbers is the following list of numbers + (white space is ignored) + + number_of_points
          + coordinates
          + data
          + weights
          + expected_constant expected_scale
          + expected_chi_square
          + expected_variance_of_constant expected_variance_of_scale
          + expected_covariance_of_constant_with_scale
          + +*/ +class linear_regressionTests : public RunTests +{ +public: + linear_regressionTests(istream& in) + : in(in) + {} + + void run_tests(); +private: + istream& in; +}; + + +void linear_regressionTests::run_tests() +{ + cerr << "Testing linear_regression function..." << endl; + + char text[200]; + in.get(text,200); + cerr << text << endl; + int test_case = 0; + + while (in) + { + // first get rid of EOL + in.getline(text,200); + // now get real text + in.get(text,200); + test_case ++; + + int size = 0; + in >> size; + if (size<=0) + break; + + cerr << text << endl; + Array<1,float> coordinates(size); + Array<1,float> measured_data(size); + Array<1,float> weights(size); + for (int i=0; i> coordinates[i]; + for (int i=0; i> measured_data[i]; + for (int i=0; i> weights[i]; + + double expected_scale; + double expected_constant; + double expected_variance_of_scale; + double expected_variance_of_constant; + double expected_covariance_of_constant_with_scale; + double expected_chi_square; + + in >> expected_constant >> expected_scale + >> expected_chi_square + >> expected_variance_of_constant >> expected_variance_of_scale + >> expected_covariance_of_constant_with_scale; + + + double scale=0; + double constant=0; + double variance_of_scale=0; + double variance_of_constant=0; + double covariance_of_constant_with_scale=0; + double chi_square = 0; + + linear_regression( + constant, scale, + chi_square, + variance_of_constant, + variance_of_scale, + covariance_of_constant_with_scale, + measured_data, + coordinates, + weights); + + check_if_equal(expected_constant, constant, + "for parameter constant, should be equal"); + check_if_equal(expected_scale, scale, + "for parameter scale, should be equal"); + + // KT 24/01/2001 changed tolerance for this comparisons + /* chi_square is computed as a + + chi^2 = weights.(data - (constant + scale coordinates))^2 + + There's a subtraction of nearly matching floating + point numbers. This means there's a lot of potential for + numerical error. + Float computations have a precision of about 10^-5. Which + means you can really trust numbers upto 10^-5 times some value + related to the size of the numbers you're adding/subtracing. + + So, we're really computing + chi^2 +- 10^-5*(weights.data) + */ + double error_on_chi_square = 0; + { + for (int i=0; i +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::setw; +using std::endl; +using std::min; +using std::max; +using std::size_t; +#endif + +START_NAMESPACE_STIR + +static inline +int intabs(const int x) +{ return x>=0?x:-x; } + +// prints a michelogram to the screen +#if 0 +// TODO move somewhere else +void michelogram(const ProjDataInfoCylindrical& proj_data_info) +{ + cerr << '{'; + for (int ring1=0; ring1get_num_rings(); ++ring1) + { + cerr << '{'; + for (int ring2=0; ring2get_num_rings(); ++ring2) + { + int segment_num=0; + int ax_pos_num = 0; + if (proj_data_info.get_segment_axial_pos_num_for_ring_pair(segment_num, ax_pos_num, ring1, ring2) + == Succeeded::yes) + cerr << '{' << setw(3) << segment_num << ',' << setw(2) << ax_pos_num << "}"; + else + cerr << "{} "; + if (ring2 != proj_data_info.get_scanner_ptr()->get_num_rings()-1) + cerr << ','; + + } + cerr << '}'; + if (ring1 != proj_data_info.get_scanner_ptr()->get_num_rings()-1) + cerr << ','; + cerr << endl; + } + cerr << '}' << endl; +} +#endif + +/*! + \ingroup test + \brief Test class for ProjDataInfo +*/ +class ProjDataInfoTests: public RunTests +{ +protected: + void test_generic_proj_data_info(ProjDataInfo& proj_data_info); +}; + +void +ProjDataInfoTests:: +test_generic_proj_data_info(ProjDataInfo& proj_data_info) +{ + cerr << "\tTests on get_LOR/get_bin\n"; + int max_diff_segment_num=0; + int max_diff_view_num=0; + int max_diff_axial_pos_num=0; + int max_diff_tangential_pos_num=0; + for (int segment_num=proj_data_info.get_min_segment_num(); + segment_num<=proj_data_info.get_max_segment_num(); + ++segment_num) + { + for (int view_num=proj_data_info.get_min_view_num(); + view_num<=proj_data_info.get_max_view_num(); + view_num+=3) + { + // loop over axial_positions. Avoid using first and last positions, as + // if there is axial compression, the central LOR of a bin might actually not + // fall within the scanner. In this case, the get_bin(get_LOR(org_bin)) code + // will return an out-of-range bin (i.e. value<0). + int axial_pos_num_margin=0; + const ProjDataInfoCylindrical* const proj_data_info_cyl_ptr = + dynamic_cast(&proj_data_info); + if (proj_data_info_cyl_ptr!=0) + { + axial_pos_num_margin = + std::max( + round(ceil(proj_data_info_cyl_ptr->get_average_ring_difference(segment_num) - + proj_data_info_cyl_ptr->get_min_ring_difference(segment_num))), + round(ceil(proj_data_info_cyl_ptr->get_max_ring_difference(segment_num) - + proj_data_info_cyl_ptr->get_average_ring_difference(segment_num)))); + } + for (int axial_pos_num=proj_data_info.get_min_axial_pos_num(segment_num)+axial_pos_num_margin ; + axial_pos_num<=proj_data_info.get_max_axial_pos_num(segment_num)-axial_pos_num_margin; + axial_pos_num+=3) + { + for (int tangential_pos_num=proj_data_info.get_min_tangential_pos_num()+1; + tangential_pos_num<=proj_data_info.get_max_tangential_pos_num()-1; + tangential_pos_num+=1) + { + const Bin org_bin(segment_num,view_num,axial_pos_num,tangential_pos_num, /* value*/1); + LORInAxialAndNoArcCorrSinogramCoordinates lor; + proj_data_info.get_LOR(lor, org_bin); + { + const Bin new_bin = proj_data_info.get_bin(lor); +#if 1 + const int diff_segment_num = + intabs(org_bin.segment_num() - new_bin.segment_num()); + const int diff_view_num = + intabs(org_bin.view_num() - new_bin.view_num()); + const int diff_axial_pos_num = + intabs(org_bin.axial_pos_num() - new_bin.axial_pos_num()); + const int diff_tangential_pos_num = + intabs(org_bin.tangential_pos_num() - new_bin.tangential_pos_num()); + if (new_bin.get_bin_value()>0) + { + if (diff_segment_num>max_diff_segment_num) + max_diff_segment_num=diff_segment_num; + if (diff_view_num>max_diff_view_num) + max_diff_view_num=diff_view_num; + if (diff_axial_pos_num>max_diff_axial_pos_num) + max_diff_axial_pos_num=diff_axial_pos_num; + if (diff_tangential_pos_num>max_diff_tangential_pos_num) + max_diff_tangential_pos_num=diff_tangential_pos_num; + } + if (!check(org_bin.get_bin_value() == new_bin.get_bin_value(), "round-trip get_LOR then get_bin: value") || + !check(diff_segment_num<=0, "round-trip get_LOR then get_bin: segment") || + !check(diff_view_num<=1, "round-trip get_LOR then get_bin: view") || + !check(diff_axial_pos_num<=1, "round-trip get_LOR then get_bin: axial_pos") || + !check(diff_tangential_pos_num<=1, "round-trip get_LOR then get_bin: tangential_pos")) + +#else + if (!check(org_bin == new_bin, "round-trip get_LOR then get_bin")) +#endif + { + cerr << "\tProblem at segment = " << org_bin.segment_num() + << ", axial pos " << org_bin.axial_pos_num() + << ", view = " << org_bin.view_num() + << ", tangential_pos_num = " << org_bin.tangential_pos_num() << "\n"; + if (new_bin.get_bin_value()>0) + cerr << "\tround-trip to segment = " << new_bin.segment_num() + << ", axial pos " << new_bin.axial_pos_num() + << ", view = " << new_bin.view_num() + << ", tangential_pos_num = " << new_bin.tangential_pos_num() + <<'\n'; + } + } + // repeat test but with different type of LOR + { + LORAs2Points lor_as_points; + lor.get_intersections_with_cylinder(lor_as_points, lor.radius()); + const Bin new_bin = proj_data_info.get_bin(lor_as_points); +#if 1 + const int diff_segment_num = + intabs(org_bin.segment_num() - new_bin.segment_num()); + const int diff_view_num = + intabs(org_bin.view_num() - new_bin.view_num()); + const int diff_axial_pos_num = + intabs(org_bin.axial_pos_num() - new_bin.axial_pos_num()); + const int diff_tangential_pos_num = + intabs(org_bin.tangential_pos_num() - new_bin.tangential_pos_num()); + if (new_bin.get_bin_value()>0) + { + if (diff_segment_num>max_diff_segment_num) + max_diff_segment_num=diff_segment_num; + if (diff_view_num>max_diff_view_num) + max_diff_view_num=diff_view_num; + if (diff_axial_pos_num>max_diff_axial_pos_num) + max_diff_axial_pos_num=diff_axial_pos_num; + if (diff_tangential_pos_num>max_diff_tangential_pos_num) + max_diff_tangential_pos_num=diff_tangential_pos_num; + } + if (!check(org_bin.get_bin_value() == new_bin.get_bin_value(), "round-trip get_LOR then get_bin (LORAs2Points): value") || + !check(diff_segment_num<=0, "round-trip get_LOR then get_bin (LORAs2Points): segment") || + !check(diff_view_num<=1, "round-trip get_LOR then get_bin (LORAs2Points): view") || + !check(diff_axial_pos_num<=1, "round-trip get_LOR then get_bin (LORAs2Points): axial_pos") || + !check(diff_tangential_pos_num<=1, "round-trip get_LOR then get_bin (LORAs2Points): tangential_pos")) + +#else + if (!check(org_bin == new_bin, "round-trip get_LOR then get_bin")) +#endif + { + cerr << "\tProblem at segment = " << org_bin.segment_num() + << ", axial pos " << org_bin.axial_pos_num() + << ", view = " << org_bin.view_num() + << ", tangential_pos_num = " << org_bin.tangential_pos_num() << "\n"; + if (new_bin.get_bin_value()>0) + cerr << "\tround-trip to segment = " << new_bin.segment_num() + << ", axial pos " << new_bin.axial_pos_num() + << ", view = " << new_bin.view_num() + << ", tangential_pos_num = " << new_bin.tangential_pos_num() + <<'\n'; + } + } + } + } + } + } + cerr << "Max Deviation: segment = " << max_diff_segment_num + << ", axial pos " << max_diff_axial_pos_num + << ", view = " << max_diff_view_num + << ", tangential_pos_num = " << max_diff_tangential_pos_num << "\n"; +} + + +/*! + \ingroup test + \brief Test class for ProjDataInfoCylindrical +*/ +class ProjDataInfoCylindricalTests: public ProjDataInfoTests +{ +protected: + void test_cylindrical_proj_data_info(ProjDataInfoCylindrical& proj_data_info); +}; + + +void +ProjDataInfoCylindricalTests:: +test_cylindrical_proj_data_info(ProjDataInfoCylindrical& proj_data_info) +{ + cerr << "\tTesting consistency between different implementations of geometric info\n"; + { + const Bin bin(proj_data_info.get_max_segment_num(), + 1, + proj_data_info.get_max_axial_pos_num(proj_data_info.get_max_segment_num())/2, + 1); + check_if_equal(proj_data_info.get_sampling_in_m(bin), + proj_data_info.ProjDataInfo::get_sampling_in_m(bin), + "test consistency get_sampling_in_m"); + check_if_equal(proj_data_info.get_sampling_in_t(bin), + proj_data_info.ProjDataInfo::get_sampling_in_t(bin), + "test consistency get_sampling_in_t"); +#if 0 + // ProjDataInfo has no default implementation for get_tantheta + // I just leave the code here to make this explicit + check_if_equal(proj_data_info.get_tantheta(bin), + proj_data_info.ProjDataInfo::get_tantheta(bin), + "test consistency get_tantheta"); +#endif + check_if_equal(proj_data_info.get_costheta(bin), + proj_data_info.ProjDataInfo::get_costheta(bin), + "test consistency get_costheta"); + + check_if_equal(proj_data_info.get_costheta(bin), + cos(atan(proj_data_info.get_tantheta(bin))), + "cross check get_costheta and get_tantheta"); + + // try the same with a non-standard ring spacing + const float old_ring_spacing = proj_data_info.get_ring_spacing(); + proj_data_info.set_ring_spacing(2.1F); + + check_if_equal(proj_data_info.get_sampling_in_m(bin), + proj_data_info.ProjDataInfo::get_sampling_in_m(bin), + "test consistency get_sampling_in_m"); + check_if_equal(proj_data_info.get_sampling_in_t(bin), + proj_data_info.ProjDataInfo::get_sampling_in_t(bin), + "test consistency get_sampling_in_t"); +#if 0 + check_if_equal(proj_data_info.get_tantheta(bin), + proj_data_info.ProjDataInfo::get_tantheta(bin), + "test consistency get_tantheta"); +#endif + check_if_equal(proj_data_info.get_costheta(bin), + proj_data_info.ProjDataInfo::get_costheta(bin), + "test consistency get_costheta"); + + check_if_equal(proj_data_info.get_costheta(bin), + cos(atan(proj_data_info.get_tantheta(bin))), + "cross check get_costheta and get_tantheta"); + // set back to usual value + proj_data_info.set_ring_spacing(old_ring_spacing); + } + + if (proj_data_info.get_max_ring_difference(0) == proj_data_info.get_min_ring_difference(0) + && proj_data_info.get_max_ring_difference(1) == proj_data_info.get_min_ring_difference(1) + && proj_data_info.get_max_ring_difference(2) == proj_data_info.get_min_ring_difference(2) + ) + { + // these tests work only without axial compression + cerr << "\tTest ring pair to segment,ax_pos (span 1)\n"; + for (int ring1=0; ring1get_num_rings(); ++ring1) + for (int ring2=0; ring2get_num_rings(); ++ring2) + { + int segment_num = 0, axial_pos_num = 0; + check(proj_data_info. + get_segment_axial_pos_num_for_ring_pair(segment_num, + axial_pos_num, + ring1, + ring2) == + Succeeded::yes, + "test if segment,ax_pos_num found for a ring pair"); + check_if_equal(segment_num, ring2-ring1, + "test if segment_num is equal to ring difference\n"); + check_if_equal(axial_pos_num, min(ring2,ring1), + "test if segment_num is equal to ring difference\n"); + + int check_ring1 = 0, check_ring2 = 0; + proj_data_info. + get_ring_pair_for_segment_axial_pos_num(check_ring1, + check_ring2, + segment_num, + axial_pos_num); + check_if_equal(ring1, check_ring1, + "test ring1 equal after going to segment/ax_pos and returning\n"); + check_if_equal(ring2, check_ring2, + "test ring2 equal after going to segment/ax_pos and returning\n"); + + const ProjDataInfoCylindrical::RingNumPairs& ring_pairs = + proj_data_info. + get_all_ring_pairs_for_segment_axial_pos_num(segment_num, + axial_pos_num); + + check_if_equal(ring_pairs.size(), static_cast(1), + "test total number of ring-pairs for 1 segment/ax_pos should be 1 for span=1\n"); + check_if_equal(ring1, ring_pairs[0].first, + "test ring1 equal after going to segment/ax_pos and returning (version with all ring_pairs)\n"); + check_if_equal(ring2, ring_pairs[0].second, + "test ring2 equal after going to segment/ax_pos and returning (version with all ring_pairs)\n"); + } + } + + cerr << "\tTest ring pair to segment,ax_pos and vice versa (for any axial compression)\n"; + { + for (int segment_num=proj_data_info.get_min_segment_num(); + segment_num<=proj_data_info.get_max_segment_num(); + ++segment_num) + for (int axial_pos_num=proj_data_info.get_min_axial_pos_num(segment_num); + axial_pos_num<=proj_data_info.get_max_axial_pos_num(segment_num); + ++axial_pos_num) + { + const ProjDataInfoCylindrical::RingNumPairs& ring_pairs = + proj_data_info. + get_all_ring_pairs_for_segment_axial_pos_num(segment_num, + axial_pos_num); + for (ProjDataInfoCylindrical::RingNumPairs::const_iterator iter = ring_pairs.begin(); + iter != ring_pairs.end(); + ++iter) + { + int check_segment_num = 0, check_axial_pos_num = 0; + check(proj_data_info. + get_segment_axial_pos_num_for_ring_pair(check_segment_num, + check_axial_pos_num, + iter->first, + iter->second) == + Succeeded::yes, + "test if segment,ax_pos_num found for a ring pair"); + check_if_equal(check_segment_num, segment_num, + "test if segment_num is consistent\n"); + check_if_equal(check_axial_pos_num, axial_pos_num, + "test if axial_pos_num is consistent\n"); + } + } + } + + test_generic_proj_data_info(proj_data_info); +} + +/*! + \ingroup test + \brief Test class for ProjDataInfoCylindricalArcCorr +*/ + +class ProjDataInfoCylindricalArcCorrTests: public ProjDataInfoCylindricalTests +{ +public: + void run_tests(); +}; + + +void +ProjDataInfoCylindricalArcCorrTests::run_tests() + +{ + cerr << "-------- Testing ProjDataInfoCylindricalArcCorr --------\n"; + { + // Test on the empty constructor + + ProjDataInfoCylindricalArcCorr ob1; + + // Test on set.* & get.* + constructor + const float test_tangential_sampling = 1.5; + //const float test_azimuthal_angle_sampling = 10.1; + + ob1.set_tangential_sampling(test_tangential_sampling); + // Set_azimuthal_angle_sampling + // ob1.set_azimuthal_angle_sampling(test_azimuthal_angle_sampling); + + + check_if_equal( ob1.get_tangential_sampling(), test_tangential_sampling,"test on tangential_sampling"); + //check_if_zero( ob1.get_azimuthal_angle_sampling() - test_azimuthal_angle_sampling, " test on azimuthal_angle_sampling"); + + } + { + shared_ptr scanner_ptr(new Scanner(Scanner::E953)); + + VectorWithOffset num_axial_pos_per_segment(-1,1); + VectorWithOffset min_ring_diff(-1,1); + VectorWithOffset max_ring_diff(-1,1); + // simulate span=3 for segment 0, span=1 for segment 2 + num_axial_pos_per_segment[-1]=14; + num_axial_pos_per_segment[0]=31; + num_axial_pos_per_segment[1]=14; + // KT 28/11/2001 corrected typo (bug): min_ring_diff[-1] was initialised twice, and max_ring_diff[-1] wasn't + min_ring_diff[-1] = max_ring_diff[-1] = -2; + min_ring_diff[ 0] = -1; max_ring_diff[ 0] = 1; + min_ring_diff[+1] = max_ring_diff[+1] = +2; + const int num_views = 96; + const int num_tangential_poss = 128; + + const float bin_size = 1.2F; + + + //Test on the constructor + ProjDataInfoCylindricalArcCorr + ob2(scanner_ptr, bin_size, + num_axial_pos_per_segment, min_ring_diff, max_ring_diff, + num_views,num_tangential_poss); + + check_if_equal( ob2.get_tangential_sampling(), bin_size,"test on tangential_sampling"); + check_if_equal( ob2.get_azimuthal_angle_sampling() , _PI/num_views, " test on azimuthal_angle_sampling"); + check_if_equal( ob2.get_axial_sampling(1), scanner_ptr->get_ring_spacing(), "test on axial_sampling"); + check_if_equal( ob2.get_axial_sampling(0), scanner_ptr->get_ring_spacing()/2, "test on axial_sampling for segment0"); + + { + // segment 0 + Bin bin(0,10,10,20); + float theta = ob2.get_tantheta(bin); + float phi = ob2.get_phi(bin); + // Get t + float t = ob2.get_t(bin); + //! Get s + float s = ob2.get_s(bin); + + check_if_equal( theta, 0.F,"test on get_tantheta, seg 0"); + check_if_equal( phi, 10*ob2.get_azimuthal_angle_sampling(), " get_phi , seg 0"); + // KT 25/10/2000 adjust to new convention + const float ax_pos_origin = + (ob2.get_min_axial_pos_num(0) + ob2.get_max_axial_pos_num(0))/2.F; + check_if_equal( t, (10-ax_pos_origin)*ob2.get_axial_sampling(0) , "get_t, seg 0"); + check_if_equal( s, 20*ob2.get_tangential_sampling() , "get_s, seg 0"); + } + { + // Segment 1 + Bin bin (1,10,10,20); + float theta = ob2.get_tantheta(bin); + float phi = ob2.get_phi(bin); + // Get t + float t = ob2.get_t(bin); + // Get s + float s = ob2.get_s(bin); + + float thetatest = 2*ob2.get_axial_sampling(1)/(2*sqrt(square(scanner_ptr->get_effective_ring_radius())-square(s))); + + check_if_equal( theta, thetatest,"test on get_tantheta, seg 1"); + check_if_equal( phi, 10*ob2.get_azimuthal_angle_sampling(), " get_phi , seg 1"); + // KT 25/10/2000 adjust to new convention + const float ax_pos_origin = + (ob2.get_min_axial_pos_num(1) + ob2.get_max_axial_pos_num(1))/2.F; + check_if_equal( t, (10-ax_pos_origin)/sqrt(1+square(thetatest))*ob2.get_axial_sampling(1) , "get_t, seg 1"); + check_if_equal( s, 20*ob2.get_tangential_sampling() , "get_s, seg 1"); + } + +#if 0 + // disabled to get noninteractive test + michelogram(ob2); + cerr << endl; +#endif + } + +#if 0 + + // disabled to get noninteractive test + { + shared_ptr scanner_ptr = new Scanner(Scanner::E953); + + shared_ptr proj_data_info_ptr = + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span*/1, 10,/*views*/ 96, /*tang_pos*/128, /*arc_corrected*/ true); + michelogram(dynamic_cast(*proj_data_info_ptr)); + cerr << endl; + } + { + shared_ptr scanner_ptr = new Scanner(Scanner::E953); + + shared_ptr proj_data_info_ptr = + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span*/7, 10,/*views*/ 96, /*tang_pos*/128, /*arc_corrected*/ true); + michelogram(dynamic_cast(*proj_data_info_ptr)); + cerr << endl; + } +#endif + + + shared_ptr scanner_ptr(new Scanner(Scanner::E953)); + cerr << "Tests with proj_data_info without mashing and axial compression\n\n"; + // Note: test without axial compression requires that all ring differences + // are in some segment, so use maximum ring difference + shared_ptr proj_data_info_ptr( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span*/1, scanner_ptr->get_num_rings()-1, + /*views*/ scanner_ptr->get_num_detectors_per_ring()/2, + /*tang_pos*/64, + /*arc_corrected*/ true)); +test_cylindrical_proj_data_info(dynamic_cast(*proj_data_info_ptr)); + + cerr << "\nTests with proj_data_info with mashing and axial compression\n\n"; + proj_data_info_ptr.reset( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span*/5, scanner_ptr->get_num_rings()-1, + /*views*/ scanner_ptr->get_num_detectors_per_ring()/2/8, + /*tang_pos*/64, + /*arc_corrected*/ true)); + test_cylindrical_proj_data_info(dynamic_cast(*proj_data_info_ptr)); +} + + +/*! + \ingroup test + \brief Test class for ProjDataInfoCylindricalNoArcCorr +*/ + +class ProjDataInfoCylindricalNoArcCorrTests: public ProjDataInfoCylindricalTests +{ +public: + void run_tests(); +private: + void test_proj_data_info(ProjDataInfoCylindricalNoArcCorr& proj_data_info); +}; + + +void +ProjDataInfoCylindricalNoArcCorrTests:: +run_tests() +{ + cerr << "\n-------- Testing ProjDataInfoCylindricalNoArcCorr --------\n"; + shared_ptr scanner_ptr(new Scanner(Scanner::E953)); + cerr << "Tests with proj_data_info without mashing and axial compression\n\n"; + // Note: test without axial compression requires that all ring differences + // are in some segment, so use maximum ring difference + shared_ptr proj_data_info_ptr( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span*/1, scanner_ptr->get_num_rings()-1, + /*views*/ scanner_ptr->get_num_detectors_per_ring()/2, + /*tang_pos*/64, + /*arc_corrected*/ false)); + test_proj_data_info(dynamic_cast(*proj_data_info_ptr)); + + cerr << "\nTests with proj_data_info with mashing and axial compression\n\n"; + proj_data_info_ptr.reset( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span*/5, scanner_ptr->get_num_rings()-1, + /*views*/ scanner_ptr->get_num_detectors_per_ring()/2/8, + /*tang_pos*/64, + /*arc_corrected*/ false)); + test_proj_data_info(dynamic_cast(*proj_data_info_ptr)); +} + +void +ProjDataInfoCylindricalNoArcCorrTests:: +test_proj_data_info(ProjDataInfoCylindricalNoArcCorr& proj_data_info) +{ + test_cylindrical_proj_data_info(proj_data_info); + + const int num_detectors = proj_data_info.get_scanner_ptr()->get_num_detectors_per_ring(); + +#ifndef TEST_ONLY_GET_BIN + if (proj_data_info.get_view_mashing_factor()==1) + { + // these tests work only without mashing + int det_num_a; + int det_num_b; + int tang_pos_num; + int view; + + cerr << "\n\tTest code for sinogram <-> detector conversions."; + + for (det_num_a = 0; det_num_a < num_detectors; det_num_a++) + for (det_num_b = 0; det_num_b < num_detectors; det_num_b++) + { + int det1, det2; + bool positive_segment; + + // skip case of equal detectors (as this is a singular LOR) + if (det_num_a == det_num_b) + continue; + + positive_segment = + proj_data_info.get_view_tangential_pos_num_for_det_num_pair(view, tang_pos_num, det_num_a, det_num_b); + proj_data_info.get_det_num_pair_for_view_tangential_pos_num(det1, det2, view, tang_pos_num); + + if (!check((det_num_a == det1 && det_num_b == det2 && positive_segment) || + (det_num_a == det2 && det_num_b == det1 && !positive_segment))) + { + cerr << "Problem at det1 = " << det_num_a << ", det2 = " << det_num_b + << "\n dets -> sino -> dets gives new detector numbers " + << det1 << ", " << det2 << endl; + continue; + } + if (!check(view < num_detectors/2)) + { + cerr << "Problem at det1 = " << det_num_a << ", det2 = " << det_num_b + << ":\n view is too big : " << view << endl; + } + if (!check(tang_pos_num < num_detectors/2 && tang_pos_num >= -(num_detectors/2))) + { + cerr << "Problem at det1 = " << det_num_a << ", det2 = " << det_num_b + << ":\n tang_pos_num is out of range : " << tang_pos_num << endl; + } + } // end of detectors_to_sinogram, sinogram_to_detector test + + + for (view = 0; view < num_detectors/2; ++view) + for (tang_pos_num = -(num_detectors/2)+1; tang_pos_num < num_detectors/2; ++tang_pos_num) + { + int new_tang_pos_num, new_view; + bool positive_segment; + + proj_data_info.get_det_num_pair_for_view_tangential_pos_num(det_num_a, det_num_b, view, tang_pos_num); + positive_segment = + proj_data_info.get_view_tangential_pos_num_for_det_num_pair(new_view, new_tang_pos_num, det_num_a, det_num_b); + + if (tang_pos_num != new_tang_pos_num || view != new_view || !positive_segment) + { + cerr << "Problem at view = " << view << ", tang_pos_num = " << tang_pos_num + << "\n sino -> dets -> sino gives new view, tang_pos_num :" + << new_view << ", " << new_tang_pos_num + << " with detector swapping " << positive_segment + << endl; + } + } // end of sinogram_to_detector, detectors_to_sinogram test + + } // end of tests that work only without mashing + + if (proj_data_info.get_view_mashing_factor()==1 + && proj_data_info.get_max_ring_difference(0) == proj_data_info.get_min_ring_difference(0) + && proj_data_info.get_max_ring_difference(1) == proj_data_info.get_min_ring_difference(1) + && proj_data_info.get_max_ring_difference(2) == proj_data_info.get_min_ring_difference(2) + ) + { + // these tests work only without mashing and axial compression + + cerr << "\n\tTest code for detector,ring -> bin and back conversions."; + + DetectionPositionPair<> det_pos_pair; + for (det_pos_pair.pos1().axial_coord() = 0; + det_pos_pair.pos1().axial_coord() <= 2; + det_pos_pair.pos1().axial_coord()++) + for (det_pos_pair.pos2().axial_coord() = 0; + det_pos_pair.pos2().axial_coord() <= 2; + det_pos_pair.pos2().axial_coord()++) + for (det_pos_pair.pos1().tangential_coord() = 0; + det_pos_pair.pos1().tangential_coord() < (unsigned)num_detectors; + det_pos_pair.pos1().tangential_coord()++) + for (det_pos_pair.pos2().tangential_coord() = 0; + det_pos_pair.pos2().tangential_coord() < (unsigned)num_detectors; + det_pos_pair.pos2().tangential_coord()++) + { + // skip case of equal detector numbers (as this is either a singular LOR) + // or an LOR parallel to the scanner axis + if (det_pos_pair.pos1().tangential_coord() == det_pos_pair.pos2().tangential_coord()) + continue; + Bin bin; + DetectionPositionPair<> new_det_pos_pair; + const bool there_is_a_bin = + proj_data_info.get_bin_for_det_pos_pair(bin, det_pos_pair) == + Succeeded::yes; + if (there_is_a_bin) + proj_data_info.get_det_pos_pair_for_bin(new_det_pos_pair, bin); + if (!check(there_is_a_bin, "checking if there is a bin for this det_pos_pair") || + !check(det_pos_pair == new_det_pos_pair, "checking if we round-trip to the same detection positions")) + { + cerr << "Problem at det1 = " << det_pos_pair.pos1().tangential_coord() + << ", det2 = " << det_pos_pair.pos2().tangential_coord() + << ", ring1 = " << det_pos_pair.pos1().axial_coord() + << ", ring2 = " << det_pos_pair.pos2().axial_coord() + << endl; + if (there_is_a_bin) + cerr << " dets,rings -> bin -> dets,rings, gives new numbers:\n\t" + << "det1 = " << new_det_pos_pair.pos1().tangential_coord() + + << ", det2 = " << new_det_pos_pair.pos2().tangential_coord() + << ", ring1 = " << new_det_pos_pair.pos1().axial_coord() + << ", ring2 = " << new_det_pos_pair.pos2().axial_coord() + << endl; + } + + } // end of get_bin_for_det_pos_pair and vice versa code + + cerr << "\n\tTest code for bin -> detector,ring and back conversions. (This might take a while...)"; + + { + Bin bin; + // set value for comparison later on + bin.set_bin_value(0); + for (bin.segment_num() = max(-5,proj_data_info.get_min_segment_num()); + bin.segment_num() <= min(5,proj_data_info.get_max_segment_num()); + ++bin.segment_num()) + for (bin.axial_pos_num() = proj_data_info.get_min_axial_pos_num(bin.segment_num()); + bin.axial_pos_num() <= proj_data_info.get_max_axial_pos_num(bin.segment_num()); + ++bin.axial_pos_num()) + for (bin.view_num() = 0; bin.view_num() < num_detectors/2; ++bin.view_num()) + for (bin.tangential_pos_num() = -(num_detectors/2)+1; + bin.tangential_pos_num() < num_detectors/2; + ++bin.tangential_pos_num()) + { + + Bin new_bin; + // set value for comparison with bin + new_bin.set_bin_value(0); + DetectionPositionPair<> det_pos_pair; + proj_data_info.get_det_pos_pair_for_bin(det_pos_pair, bin); + + const bool there_is_a_bin = + proj_data_info.get_bin_for_det_pos_pair(new_bin, + det_pos_pair) == + Succeeded::yes; + if (!check(there_is_a_bin, "checking if there is a bin for this det_pos_pair") || + !check(bin == new_bin, "checking if we round-trip to the same bin")) + { + cerr << "Problem at segment = " << bin.segment_num() + << ", axial pos " << bin.axial_pos_num() + << ", view = " << bin.view_num() + << ", tangential_pos_num = " << bin.tangential_pos_num() << "\n"; + if (there_is_a_bin) + cerr << " bin -> dets -> bin, gives new numbers:\n\t" + << "segment = " << new_bin.segment_num() + << ", axial pos " << new_bin.axial_pos_num() + << ", view = " << new_bin.view_num() + << ", tangential_pos_num = " << new_bin.tangential_pos_num() + << endl; + } + + } // end of get_det_pos_pair_for_bin and back code + } + } // end of tests which require no mashing nor axial compression + + { + cerr << "\n\tTest code for bins <-> detectors routines that work with any mashing and axial compression"; + + Bin bin; + // set value for comparison later on + bin.set_bin_value(0); + vector > det_pos_pairs; + for (bin.segment_num() = proj_data_info.get_min_segment_num(); + bin.segment_num() <= proj_data_info.get_max_segment_num(); + ++bin.segment_num()) + for (bin.axial_pos_num() = proj_data_info.get_min_axial_pos_num(bin.segment_num()); + bin.axial_pos_num() <= proj_data_info.get_max_axial_pos_num(bin.segment_num()); + ++bin.axial_pos_num()) + for (bin.view_num() = proj_data_info.get_min_view_num(); + bin.view_num() <= proj_data_info.get_max_view_num(); + ++bin.view_num()) + for (bin.tangential_pos_num() = proj_data_info.get_min_tangential_pos_num(); + bin.tangential_pos_num() <= proj_data_info.get_max_tangential_pos_num(); + ++bin.tangential_pos_num()) + { + proj_data_info.get_all_det_pos_pairs_for_bin(det_pos_pairs, bin); + Bin new_bin; + // set value for comparison with bin + new_bin.set_bin_value(0); + for (std::vector >::const_iterator det_pos_pair_iter = det_pos_pairs.begin(); + det_pos_pair_iter != det_pos_pairs.end(); + ++det_pos_pair_iter) + { + const bool there_is_a_bin = + proj_data_info.get_bin_for_det_pos_pair(new_bin, + *det_pos_pair_iter) == + Succeeded::yes; + if (!check(there_is_a_bin, "checking if there is a bin for this det_pos_pair") || + !check(bin == new_bin, "checking if we round-trip to the same bin")) + { + cerr << "Problem at segment = " << bin.segment_num() + << ", axial pos " << bin.axial_pos_num() + << ", view = " << bin.view_num() + << ", tangential_pos_num = " << bin.tangential_pos_num() << "\n"; + if (there_is_a_bin) + cerr << " bin -> dets -> bin, gives new numbers:\n\t" + << "segment = " << new_bin.segment_num() + << ", axial pos " << new_bin.axial_pos_num() + << ", view = " << new_bin.view_num() + << ", tangential_pos_num = " << new_bin.tangential_pos_num() + << endl; + } + } // end of iteration of det_pos_pairs + } // end of loop over all bins + } // end of get_all_det_pairs_for_bin and back code +#endif //TEST_ONLY_GET_BIN + + { + cerr << endl; + cerr << "\tTesting find scanner coordinates given cartesian and vice versa." << endl; + { + const int num_detectors_per_ring = + proj_data_info.get_scanner_ptr()->get_num_detectors_per_ring(); + const int num_rings = + proj_data_info.get_scanner_ptr()->get_num_rings(); + + for ( int Ring_A = 0; Ring_A < num_rings; Ring_A+=num_rings/3) + for ( int Ring_B = 0; Ring_B < num_rings; Ring_B+=num_rings/3) + for ( int det1 =0; det1 < num_detectors_per_ring; ++det1) + for ( int det2 =0; det2 < num_detectors_per_ring; ++det2) + { + if (det1==det2) + continue; + CartesianCoordinate3D coord_1; + CartesianCoordinate3D coord_2; + + proj_data_info.find_cartesian_coordinates_given_scanner_coordinates (coord_1,coord_2, + Ring_A,Ring_B, + det1,det2); + + const CartesianCoordinate3D coord_1_new = coord_1 + (coord_2-coord_1)*5; + const CartesianCoordinate3D coord_2_new = coord_1 + (coord_2-coord_1)*2; + + int det1_f, det2_f,ring1_f, ring2_f; + + check(proj_data_info.find_scanner_coordinates_given_cartesian_coordinates(det1_f, det2_f, ring1_f, ring2_f, + coord_1_new, coord_2_new) == + Succeeded::yes); + if (det1_f == det1 && Ring_A == ring1_f) + { + check_if_equal( det1_f, det1, "test on det1"); + check_if_equal( Ring_A, ring1_f, "test on ring1"); + check_if_equal( det2_f, det2, "test on det2"); + check_if_equal( Ring_B, ring2_f, "test on ring1"); + } + else + { + check_if_equal( det2_f, det1, "test on det1"); + check_if_equal( Ring_B, ring1_f, "test on ring1"); + check_if_equal( det1_f, det2, "test on det2"); + check_if_equal( Ring_A, ring2_f, "test on ring1"); + } + } + } + } +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + +int main() +{ + ProjDataInfoCylindricalArcCorrTests tests; + tests.run_tests(); + ProjDataInfoCylindricalNoArcCorrTests tests1; + tests1.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_stir_math.cxx b/src/test/test_stir_math.cxx new file mode 100644 index 0000000000..782639c75a --- /dev/null +++ b/src/test/test_stir_math.cxx @@ -0,0 +1,356 @@ +/*! + + \file + \ingroup test + + \brief Test program for the stir_math utility + + Takes as single command line argument the filename of the stir_math executable + (with a relative or absolute path). If no argument is given, the executable im + the path is used. + \warning will overwite (and then delete) files called STIR$$*. + \author Kris Thielemans +*/ +/* + Copyright (C) 2002-2003, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfo.h" +#include "stir/Scanner.h" +#include "stir/IndexRange.h" +#include "stir/CartesianCoordinate3D.h" + +#include "stir/RunTests.h" +#include "stir/IO/InterfileOutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/ProjDataInterfile.h" +#include "stir/SegmentByView.h" +#include "stir/thresholding.h" +#include "stir/Succeeded.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACE +using std::generate; +#endif + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief Test class for the stir_math utility + + \warning will overwite (and then delete) files called STIR$$*. +*/ +class stir_mathTests : public RunTests +{ +public: + stir_mathTests(const string& stir_math_executable) + : stir_math_executable(stir_math_executable) + {} + + void run_tests(); +private: + string stir_math_executable; + //! returns true if it ran it successfully + bool run_stir_math(const char * const arguments); + +}; + + +bool +stir_mathTests:: +run_stir_math(const char * const arguments) +{ + static string cmdline; + static string error_string; + + cmdline = stir_math_executable; + cmdline += ' ' ; + cmdline += arguments; + error_string = "error executing command '"; + error_string += cmdline; + error_string += "'"; + cerr << "\nExecuting '" << cmdline << "'\n"; + return check(system(cmdline.c_str())==EXIT_SUCCESS, + "executing previous command returned non-zero status\n."); +} + +void +stir_mathTests::run_tests() + +{ + cerr << "Tests for the stir_math utility\n"; + cerr << "WARNING: will overwite (and then delete) files called STIRtmp*\n"; + + // images + { + CartesianCoordinate3D origin (0,0,0); + CartesianCoordinate3D grid_spacing (3,4,5); + IndexRange<3> + range(CartesianCoordinate3D(0,-2,-3), + CartesianCoordinate3D(1,2,3)); + VoxelsOnCartesianGrid data1(range,origin, grid_spacing); + VoxelsOnCartesianGrid data2(range,origin, grid_spacing); + VoxelsOnCartesianGrid data3(range,origin, grid_spacing); + VoxelsOnCartesianGrid calc_data; + shared_ptr > out_data_ptr; + + // fill with some random numbers + srand(1); + generate(data1.begin_all(), data1.end_all(), rand); + generate(data2.begin_all(), data2.end_all(), rand); + generate(data3.begin_all(), data3.end_all(), rand); + + InterfileOutputFileFormat output_file_format; + check(output_file_format.write_to_file("STIRtmp1.v", data1)== Succeeded::yes, + "test writing Interfile image STIRtmp1"); + check(output_file_format.write_to_file("STIRtmp2.v", data2)== Succeeded::yes, + "test writing Interfile image STIRtmp2"); + check(output_file_format.write_to_file("STIRtmp3.v", data3)== Succeeded::yes, + "test writing Interfile image STIRtmp3"); + + set_tolerance(data1.find_max()/10000); + + // add + if (run_stir_math("STIRtmpout.v STIRtmp1.hv STIRtmp2.hv STIRtmp3.hv")) + { + out_data_ptr = read_from_file >("STIRtmpout.hv"); + calc_data = data1; + calc_data += data2 + data3; + + check_if_equal( calc_data, *out_data_ptr,"test on adding"); + } + // mult + if (run_stir_math("--mult STIRtmpout.v STIRtmp1.hv STIRtmp2.hv STIRtmp3.hv")) + { + out_data_ptr = read_from_file >("STIRtmpout.hv"); + calc_data = data1; + calc_data *= data2 * data3; + + check_if_equal( calc_data, *out_data_ptr,"test on multiplying"); + } + // add with power etc + // range for rand() is 0 to RAND_MAX + const float min_threshold = RAND_MAX/5.F; + const float max_threshold = RAND_MAX/2.F; + { + char cmd_args[1000]; + sprintf(cmd_args, "--add-scalar 3.1 --power 2 --times-scalar 3.2 --min-threshold %g --max-threshold %g " + "STIRtmpout.v STIRtmp1.hv STIRtmp2.hv STIRtmp3.hv", + min_threshold, max_threshold); + if (run_stir_math(cmd_args)) + { + out_data_ptr = read_from_file >("STIRtmpout.hv"); + calc_data.fill(0); + VoxelsOnCartesianGrid data2_thresholded(data2); + VoxelsOnCartesianGrid data3_thresholded(data3); + threshold_upper_lower( data2_thresholded.begin_all(), data2_thresholded.end_all(), + min_threshold, max_threshold); + threshold_upper_lower( data3_thresholded.begin_all(), data3_thresholded.end_all(), + min_threshold, max_threshold); + calc_data += data1 + (data2_thresholded*data2_thresholded)*3.2F + 3.1F + (data3_thresholded*data3_thresholded)*3.2F + 3.1F; + + check_if_equal( calc_data, *out_data_ptr,"test with thresholding, power and scalar multiplication and addition"); + } + } + // add with power etc and including-first + if (run_stir_math("--power 2 --times-scalar 3.2 --including-first STIRtmpout.v STIRtmp1.hv STIRtmp2.hv STIRtmp3.hv")) + { + out_data_ptr = read_from_file >("STIRtmpout.hv"); + calc_data.fill(0); + calc_data += (data1*data1 + data2*data2 + data3*data3)*3.2F; + check_if_equal( calc_data, *out_data_ptr,"test with power and scalar multiplication with --including-first"); + } + // add with power etc and accumulate + if (run_stir_math("--accumulate --power 2 --times-scalar 3.2 --add-scalar 3.1 --divide-scalar 2.1 --mult STIRtmp1.hv STIRtmp3.hv")) + { + calc_data.fill(0); + calc_data += data1; + calc_data += (data3*data3)*3.2F/2.1F + 3.1F; + out_data_ptr = read_from_file >("STIRtmp1.hv"); + check_if_equal( calc_data, *out_data_ptr,"test with power and scalar multiplication, division and addition with --accumulate"); + } + // add with power etc and accumulate and including-first + if (run_stir_math("--accumulate --power 2 --times-scalar 3.2 --including-first STIRtmp2.hv STIRtmp3.hv")) + { + calc_data.fill(0); + calc_data += data2; + calc_data *= calc_data * 3.2F; + calc_data += (data3*data3)*3.2F; + out_data_ptr = read_from_file >("STIRtmp2.hv"); + check_if_equal( calc_data, *out_data_ptr,"test with power and scalar multiplication with --including-first and --accumulate"); + } + + remove("STIRtmp1.ahv"); + remove("STIRtmp1.hv"); + remove("STIRtmp1.v"); + remove("STIRtmp2.ahv"); + remove("STIRtmp2.hv"); + remove("STIRtmp2.v"); + remove("STIRtmp3.ahv"); + remove("STIRtmp3.hv"); + remove("STIRtmp3.v"); + remove("STIRtmpout.ahv"); + remove("STIRtmpout.hv"); + remove("STIRtmpout.v"); + } + + // projdata + { + // to keep testing code below as close as possible to the image case, we'll just + // take a single segment in the data. + + shared_ptr scanner_ptr(new Scanner(Scanner::E953)); + shared_ptr proj_data_info_ptr( + ProjDataInfo::ProjDataInfoCTI(scanner_ptr, + /*span=*/1, + /*max_delta=*/0, + /*num_views=*/8, + /*num_tang_poss=*/16)); + SegmentByView data1 = proj_data_info_ptr->get_empty_segment_by_view(0); + SegmentByView data2 = proj_data_info_ptr->get_empty_segment_by_view(0); + SegmentByView data3 = proj_data_info_ptr->get_empty_segment_by_view(0); + SegmentByView calc_data = proj_data_info_ptr->get_empty_segment_by_view(0); + shared_ptr out_data_ptr; + + // fill with some random numbers + srand(1); + generate(data1.begin_all(), data1.end_all(), rand); + generate(data2.begin_all(), data2.end_all(), rand); + generate(data3.begin_all(), data3.end_all(), rand); + + // first create files and close them afterwards + // This is necessary because system() requires all streams to be flushed. + { + shared_ptr exam_info_sptr(new ExamInfo); + + ProjDataInterfile proj_data1(exam_info_sptr, proj_data_info_ptr, "STIRtmp1"); + ProjDataInterfile proj_data2(exam_info_sptr, proj_data_info_ptr, "STIRtmp2"); + ProjDataInterfile proj_data3(exam_info_sptr, proj_data_info_ptr, "STIRtmp3"); + + proj_data1.set_segment(data1); + proj_data2.set_segment(data2); + proj_data3.set_segment(data3); + + set_tolerance(data1.find_max()/10000); + } + + // add + if (run_stir_math("-s STIRtmpout.hs STIRtmp1.hs STIRtmp2.hs STIRtmp3.hs")) + { + out_data_ptr = ProjData::read_from_file("STIRtmpout.hs"); + calc_data = data1; + calc_data += data2 + data3; + + check_if_equal( calc_data, out_data_ptr->get_segment_by_view(0), + "test on adding"); + } + // mult + if (run_stir_math("-s --mult STIRtmpout.hs STIRtmp1.hs STIRtmp2.hs STIRtmp3.hs")) + { + out_data_ptr = ProjData::read_from_file("STIRtmpout.hs"); + calc_data = data1; + calc_data *= data2 * data3; + + check_if_equal( calc_data, out_data_ptr->get_segment_by_view(0), + "test on multiplying"); + } + // add with power etc + // range for rand() is 0 to RAND_MAX + const float min_threshold = RAND_MAX/5.F; + const float max_threshold = RAND_MAX/2.F; + { + char cmd_args[1000]; + sprintf(cmd_args, "-s --add-scalar 3.1 --power 2 --times-scalar 3.2 --min-threshold %g --max-threshold %g " + "STIRtmpout.hs STIRtmp1.hs STIRtmp2.hs STIRtmp3.hs", + min_threshold, max_threshold); + if (run_stir_math(cmd_args)) + { + out_data_ptr = ProjData::read_from_file("STIRtmpout.hs"); + calc_data.fill(0); + SegmentByView data2_thresholded(data2); + SegmentByView data3_thresholded(data3); + threshold_upper_lower( data2_thresholded.begin_all(), data2_thresholded.end_all(), + min_threshold, max_threshold); + threshold_upper_lower( data3_thresholded.begin_all(), data3_thresholded.end_all(), + min_threshold, max_threshold); + calc_data += data1 + (data2_thresholded*data2_thresholded)*3.2F + 3.1F + (data3_thresholded*data3_thresholded)*3.2F + 3.1F; + + check_if_equal( calc_data, out_data_ptr->get_segment_by_view(0), + "test with thresholding, power and scalar multiplication and addition"); + } + } + + // add with power etc and including-first + if (run_stir_math("-s --power 2 --times-scalar 3.2 --including-first STIRtmpout.hs STIRtmp1.hs STIRtmp2.hs STIRtmp3.hs")) + { + out_data_ptr = ProjData::read_from_file("STIRtmpout.hs"); + calc_data.fill(0); + calc_data += (data1*data1 + data2*data2 + data3*data3)*3.2F; + check_if_equal( calc_data, out_data_ptr->get_segment_by_view(0), + "test with power and scalar multiplication with --including-first"); + } + // add with power etc and accumulate + if (run_stir_math("-s --accumulate --power 2 --times-scalar 3.2 --divide-scalar 1.9 --add-scalar 3.1 --mult STIRtmp1.hs STIRtmp3.hs")) + { + calc_data.fill(0); + calc_data += data1; + calc_data += (data3*data3)*3.2F/1.9F+3.1F; + out_data_ptr = ProjData::read_from_file("STIRtmp1.hs"); + check_if_equal( calc_data, out_data_ptr->get_segment_by_view(0), + "test with power and scalar multiplication, division and addition with --accumulate"); + } + // add with power etc and accumulate and including-first + if (run_stir_math("-s --accumulate --power 2 --times-scalar 3.2 --including-first STIRtmp2.hs STIRtmp3.hs")) + { + calc_data.fill(0); + calc_data += data2; + calc_data *= calc_data * 3.2F; + calc_data += (data3*data3)*3.2F; + out_data_ptr = ProjData::read_from_file("STIRtmp2.hs"); + check_if_equal( calc_data, out_data_ptr->get_segment_by_view(0), + "test with power and scalar multiplication with --including-first and --accumulate"); + } + + remove("STIRtmp1.hs"); + remove("STIRtmp1.s"); + remove("STIRtmp2.hs"); + remove("STIRtmp2.s"); + remove("STIRtmp3.hs"); + remove("STIRtmp3.s"); + remove("STIRtmpout.hs"); + remove("STIRtmpout.s"); + } + +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + + +int main(int argc, char** argv) +{ + stir_mathTests tests(argc==2?argv[1] : "stir_math"); + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_warp_image.cxx b/src/test/test_warp_image.cxx new file mode 100644 index 0000000000..7077ec59e6 --- /dev/null +++ b/src/test/test_warp_image.cxx @@ -0,0 +1,183 @@ +// +// +/* + Copyright (C) 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + \ingroup spatial_transformation + + \brief A simple program to test the warp image functions + \author Charalampos Tsoumpas +*/ + +#include "stir/CartesianCoordinate3D.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/GatedDiscretisedDensity.h" +#include "stir/IndexRange.h" +#include "stir/spatial_transformation/warp_image.h" +#include "stir/RunTests.h" +#include "stir/spatial_transformation/GatedSpatialTransformation.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + +/*! + \brief Class with tests for warp_image functions. + \ingroup test +*/ +class warp_imageTests : public RunTests +{ +public: + void run_tests(); +}; + +void +warp_imageTests::run_tests() +{ + std::cerr << "Tests for warp_image" << std::endl; + + CartesianCoordinate3D origin (0,1,2); + CartesianCoordinate3D grid_spacing (3,4,5); + + IndexRange<3> + range(CartesianCoordinate3D(0,-15,-14), + CartesianCoordinate3D(40,44,45)); + + VoxelsOnCartesianGrid image(range, origin, grid_spacing); + image.fill(0.F); + + const BasicCoordinate<3,int> indices = make_coordinate(10,22,23); + image[indices] = 1.F; + const CartesianCoordinate3D coord = + image.get_physical_coordinates_for_indices(indices); + + VoxelsOnCartesianGrid motion_x(range, origin, grid_spacing); + VoxelsOnCartesianGrid motion_y(range, origin, grid_spacing); + VoxelsOnCartesianGrid motion_z(range, origin, grid_spacing); + + motion_x.fill(3*grid_spacing[3]); + motion_y.fill(2*grid_spacing[2]); + motion_z.fill(grid_spacing[1]); + + // horrible way - but it works. I need to make it simpler. + const shared_ptr > image_sptr(image.clone()) ; + const shared_ptr > motion_x_sptr(motion_x.clone()) ; + const shared_ptr > motion_y_sptr(motion_y.clone()) ; + const shared_ptr > motion_z_sptr(motion_z.clone()) ; + vector > gate_sequence; + gate_sequence.resize(2); + for (unsigned int current_gate = 1; + current_gate <= 2; + ++current_gate) + { + gate_sequence[current_gate-1].first = current_gate; + gate_sequence[current_gate-1].second = 1; + } + + TimeGateDefinitions gate_defs(gate_sequence); + + const VoxelsOnCartesianGrid new_image=warp_image(image_sptr,motion_x_sptr,motion_y_sptr,motion_z_sptr,BSpline::BSplineType(1),0); + const BasicCoordinate<3,int> new_indices = make_coordinate(indices[1]-1,indices[2]-2,indices[3]-3); + + { + check_if_equal(image[indices],1.F, "testing original image at non-zero point"); + check_if_equal(image[new_indices],0.F, "testing original image at new location"); + check_if_equal(new_image[indices],0.F, "testing warped image at original location"); + check_if_equal(new_image[new_indices],1.F, "testing warped image at new location"); + } + std::cerr << "Tests for class GatedSpatialTransformation::warp_image etc" << std::endl; + const shared_ptr > new_image_sptr(new_image.clone()) ; + GatedDiscretisedDensity gated_image(image_sptr,2); + gated_image.set_density_sptr(image_sptr,1); + gated_image.set_density_sptr(new_image_sptr,2); + gated_image.set_time_gate_definitions(gate_defs); + VoxelsOnCartesianGrid reverse_motion_x(range, origin, grid_spacing); + VoxelsOnCartesianGrid reverse_motion_y(range, origin, grid_spacing); + VoxelsOnCartesianGrid reverse_motion_z(range, origin, grid_spacing); + reverse_motion_x.fill(-3*grid_spacing[3]); + reverse_motion_y.fill(-2*grid_spacing[2]); + reverse_motion_z.fill(-1*grid_spacing[1]); + + // horrible way - but it works. I need to make it simpler. + const shared_ptr > reverse_motion1_x_sptr(motion_x.get_empty_copy()) ; + const shared_ptr > reverse_motion1_y_sptr(motion_y.get_empty_copy()) ; + const shared_ptr > reverse_motion1_z_sptr(motion_z.get_empty_copy()) ; + const shared_ptr > reverse_motion2_x_sptr(reverse_motion_x.clone()) ; + const shared_ptr > reverse_motion2_y_sptr(reverse_motion_y.clone()) ; + const shared_ptr > reverse_motion2_z_sptr(reverse_motion_z.clone()) ; + + GatedDiscretisedDensity reverse_gated_motion_x(image_sptr,2); + reverse_gated_motion_x.set_density_sptr(reverse_motion1_x_sptr,1); + reverse_gated_motion_x.set_density_sptr(reverse_motion2_x_sptr,2); + reverse_gated_motion_x.set_time_gate_definitions(gate_defs); + + GatedDiscretisedDensity reverse_gated_motion_y(image_sptr,2); + reverse_gated_motion_y.set_density_sptr(reverse_motion1_y_sptr,1); + reverse_gated_motion_y.set_density_sptr(reverse_motion2_y_sptr,2); + reverse_gated_motion_y.set_time_gate_definitions(gate_defs); + + GatedDiscretisedDensity reverse_gated_motion_z(image_sptr,2); + reverse_gated_motion_z.set_density_sptr(reverse_motion1_z_sptr,1); + reverse_gated_motion_z.set_density_sptr(reverse_motion2_z_sptr,2); + reverse_gated_motion_z.set_time_gate_definitions(gate_defs); + + GatedSpatialTransformation mvtest; + mvtest.set_gate_defs(gate_defs); + mvtest.set_spatial_transformations(reverse_gated_motion_z,reverse_gated_motion_y,reverse_gated_motion_x); + VoxelsOnCartesianGrid accumulated_image(range, origin, grid_spacing); + mvtest.warp_image(accumulated_image,gated_image); + { + // simple test for gated_image values + check_if_equal((gated_image.get_density(1))[indices],1.F, "testing 1st gate (i.e. original image) at non-zero point"); + check_if_equal((gated_image.get_density(1))[new_indices],0.F, "testing 1st gate at new location of the non-zero point"); + check_if_equal((gated_image.get_density(2))[indices],0.F, "testing 2nd gate at the original location of non-zero point"); + check_if_equal((gated_image.get_density(2))[new_indices],1.F, "testing 2nd gate at the new location of the non-zero point"); + check_if_equal((int)gated_image.get_time_gate_definitions().get_num_gates(),2, "testing gate_defs of gated_image are set correctly"); + + // test if motion vectors have been set correctly + check_if_equal((reverse_gated_motion_z.get_density(2))[indices],-1*grid_spacing[1], "testing the input to set the motion in z"); + check_if_equal((mvtest.get_spatial_transformation_z().get_density(2))[indices],-1*grid_spacing[1], "testing GatedSpatialTransformation class get the motion vector z correctly"); + check_if_equal((mvtest.get_spatial_transformation_z().get_density(2))[new_indices],-1*grid_spacing[1], "testing GatedSpatialTransformation class get the motion vector z correctly"); + check_if_equal((mvtest.get_spatial_transformation_y().get_density(2))[indices],-2*grid_spacing[2], "testing GatedSpatialTransformation class get the motion vector y correctly"); + check_if_equal((mvtest.get_spatial_transformation_y().get_density(2))[new_indices],-2*grid_spacing[2], "testing GatedSpatialTransformation class get the motion vector y correctly"); + check_if_equal((mvtest.get_spatial_transformation_x().get_density(2))[indices],-3*grid_spacing[3], "testing GatedSpatialTransformation class get the motion vector x correctly"); + check_if_equal((mvtest.get_spatial_transformation_x().get_density(2))[new_indices],-3*grid_spacing[3], "testing GatedSpatialTransformation class get the motion vector x correctly"); + check_if_equal((int)gate_defs.get_num_gates(),2, "testing gate_defs are set correctly"); + check_if_equal((int)reverse_gated_motion_z.get_time_gate_definitions().get_num_gates(),2, "testing GatedSpatialTransformation class get the motion vector x correctly"); + check_if_equal((int)(mvtest.get_time_gate_definitions()).get_num_gates(),2, "testing GatedSpatialTransformation class time_gate_difinitions"); + // actual test for accumulate_warp_image + check_if_equal(accumulated_image[indices], 2.F, "testing the accumulated image at the original location of non-zero point"); + check_if_equal(accumulated_image[new_indices], 0.F, "testing the accumulated image at the location where the non-zero point had moved"); + } +} +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main() +{ + warp_imageTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/test/test_zoom_image.cxx b/src/test/test_zoom_image.cxx new file mode 100644 index 0000000000..6e8857e778 --- /dev/null +++ b/src/test/test_zoom_image.cxx @@ -0,0 +1,182 @@ +// +// +/* + Copyright (C) 2006- 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup test + + \brief Test program for stir::zoom_image (and stir::centre_of_gravity) + + \author Kris Thielemans + +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IndexRange.h" +#include "stir/zoom.h" +#include "stir/centre_of_gravity.h" + +#include +#include +#include "stir/RunTests.h" + +START_NAMESPACE_STIR + +/*! + \ingroup test + \brief Test class for zoom_image (and centre_of_gravity) + + The tests check if a point source remains in the same physical location + after zooming. This is done by checking the centre of gravity of the + zoomed image. +*/ +class zoom_imageTests : public RunTests +{ +public: + void run_tests(); +}; + + +void +zoom_imageTests::run_tests() + +{ + std::cerr << "Tests for zoom_image\n"; + + CartesianCoordinate3D origin (0,1,2); + CartesianCoordinate3D grid_spacing (3,4,5); + + IndexRange<3> + range(CartesianCoordinate3D(0,-15,-14), + CartesianCoordinate3D(4,14,15)); + + VoxelsOnCartesianGrid image(range,origin, grid_spacing); + image.fill(0.F); + + const BasicCoordinate<3,int> indices = make_coordinate(1,2,3); + image[indices] = 1.F; + const CartesianCoordinate3D coord = + image.get_physical_coordinates_for_indices(indices); + + { + // check if centre_of_gravity_in_mm returns same point + check_if_equal(coord, + find_centre_of_gravity_in_mm(image), + "test on get_physical_coordinates_for_indices and find_centre_of_gravity_in_mm"); + } + + // we cannot have very good accuracy in the centre of gravity + // calculation for zooming a single pixel + // the following threshold seems very reasonable (.3mm distance) and works. + const double tolerance_for_distance = .3; + const double old_tolerance = this->get_tolerance(); + + // test 2 arg zoom_image + { + CartesianCoordinate3D new_origin (4.F,5.F,6.F); + CartesianCoordinate3D new_grid_spacing (2.2F,3.1F,4.3F); + + IndexRange<3> + new_range(CartesianCoordinate3D(-1,-16,-17), + CartesianCoordinate3D(5,15,20)); + + VoxelsOnCartesianGrid new_image(new_range,new_origin, new_grid_spacing); + zoom_image(new_image, image); + { + // check if centre_of_gravity_in_mm returns same point + this->set_tolerance(tolerance_for_distance); + check_if_equal(coord, + find_centre_of_gravity_in_mm(new_image), + "test on 2-argument zoom_image"); + this->set_tolerance(old_tolerance); + check_if_equal(new_range, new_image.get_index_range(), + "test on 2-argument argument zoom_image: index range"); + check_if_equal(new_grid_spacing, new_image.get_voxel_size(), + "test on 2-argument argument zoom_image: voxel size"); + check_if_equal(new_origin, new_image.get_origin(), + "test on 2-argument argument zoom_image: origin"); + + } + } + + + // test multiple argument zoom_image + { + const CartesianCoordinate3D zooms(1.3F,1.2F,1.5F); + const CartesianCoordinate3D offsets_in_mm(3.F,4.F,5.5F); + const Coordinate3D new_sizes(30,40,50); + const VoxelsOnCartesianGrid new_image = + zoom_image(image, zooms, offsets_in_mm, new_sizes); + { + // check if centre_of_gravity_in_mm returns same point + this->set_tolerance(tolerance_for_distance); + check_if_equal(coord, + find_centre_of_gravity_in_mm(new_image), + "test on multiple argument zoom_image"); + this->set_tolerance(old_tolerance); + check_if_equal(new_sizes, new_image.get_lengths(), + "test on multiple argument zoom_image: index range"); + check_if_equal(new_image.get_voxel_size(), image.get_voxel_size()/zooms, + "test on multiple argument zoom_image: voxel size"); + + } + } + + // test multiple argument zoom_image in 2D + { + const float zoom = 1.3F; + const CartesianCoordinate3D zooms(1.F,zoom,zoom); + const CartesianCoordinate3D offsets_in_mm(0.F,4.F,5.5F); + const int new_size = 30; + const VoxelsOnCartesianGrid new_image = + zoom_image(image, zoom, offsets_in_mm.x(), offsets_in_mm.y(), new_size); + { + // check if centre_of_gravity_in_mm returns same point + this->set_tolerance(tolerance_for_distance); + check_if_equal(coord, + find_centre_of_gravity_in_mm(new_image), + "test on multiple argument (2d) zoom_image"); + this->set_tolerance(old_tolerance); + check_if_equal(image.get_min_z(), new_image.get_min_z(), + "test on multiple argument (2d) zoom_image: min_z"); + check_if_equal(image.get_max_z(), new_image.get_max_z(), + "test on multiple argument (2d) zoom_image: max_z"); + check_if_equal(new_size, new_image.get_x_size(), + "test on multiple argument (2d) zoom_image: x_size"); + check_if_equal(new_size, new_image.get_y_size(), + "test on multiple argument (2d) zoom_image: y_size"); + check_if_equal(new_image.get_voxel_size(), image.get_voxel_size()/zooms, + "test on multiple argument (2d) zoom_image: voxel size"); + + } + } + +} + +END_NAMESPACE_STIR + + +USING_NAMESPACE_STIR + + +int main() +{ + zoom_imageTests tests; + tests.run_tests(); + return tests.main_return_value(); +} diff --git a/src/utilities/CMakeLists.txt b/src/utilities/CMakeLists.txt new file mode 100644 index 0000000000..809ba77036 --- /dev/null +++ b/src/utilities/CMakeLists.txt @@ -0,0 +1,74 @@ +# +# +# Copyright 2011-01-01 - 2011-06-30 Hammersmith Imanet Ltd +# Copyright 2011-07-01 - 2013 Kris Thielemans + +# This file is part of STIR. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# This file 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 Lesser General Public License for more details. +# +# See STIR/LICENSE.txt for details + +# cmake file for building STIR. See the STIR User's Guide and http://www.cmake.org. +set(dir utilities) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + manip_image + stir_write_pgm + manip_projdata + display_projdata + do_linear_regression + postfilter + compare_projdata + compare_image + extract_segments + correct_projdata + stir_math + list_projdata_info + list_image_info + list_image_values + list_detector_and_bin_info + find_maxima_in_image + create_projdata_template + SSRB + poisson_noise + get_time_frame_info + generate_image + list_ROI_values + zoom_image + find_fwhm_in_image + abs_image + convert_to_binary_image + rebin_projdata + write_proj_matrix_by_bin + forward_project + back_project + calculate_attenuation_coefficients + attenuation_coefficients_to_projections + conv_GATE_raw_ECAT_projdata_to_interfile + conv_gipl_to_interfile + conv_interfile_to_gipl + shift_image + shift_image_origin + warp_and_accumulate_gated_images + warp_gated_images + warp_image + apply_RL_deconvolution + zeropad_planes +) + +if (AVW_FOUND) + list(APPEND ${dir_EXE_SOURCES} conv_AVW) +endif() + +include(stir_exe_targets) diff --git a/src/utilities/SSRB.cxx b/src/utilities/SSRB.cxx new file mode 100644 index 0000000000..9ec0263704 --- /dev/null +++ b/src/utilities/SSRB.cxx @@ -0,0 +1,114 @@ +// +// +/* + Copyright (C) 2002- 2005, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \ingroup utilities + \brief Main program for stir::SSRB + + \author Kris Thielemans + + + \par Usage: + \code + SSRB [-t num_tangential_poss_to_trim] \ + output_filename input_projdata_name [num_segments_to_combine \ + [ num_views_to_combine [do_normalisation [max_in_segment_num_to_process ]]]] + \endcode + \param num_segments_to_combine has to be odd. It is used as the number of segments + in the original data to combine. + \param num_views_to_combine has to be at least 1 (which is the default). + It is used as the number of views in the original data to combine. + \param num_tangential_poss_to_trim has to be smaller than the available number + of tangential positions. + \param do_normalisation has to be 1 (normalise the result, which is the default) or 0 + \param max_in_segment_num_to_process defaults to all segments + + \par Example: + \code + SSRB out in.hs 3 2 + \endcode + If in.hs is a file without axial compression (span=1) nor mashing, then the + output would correspond to a span=3 file with mashing factor 2, and would be + normalised (at least as far as SSRB concerns). \a num_segments_to_combine=3 + results in ring differences -1,0,1 to be combined all into segment 0, etc. + \see + stir::SSRB(const std::string& output_filename, + const stir::ProjData& in_projdata, + const int num_segments_to_combine, + const int num_views_to_combine, + const int num_tang_poss_to_trim, + const bool do_normalisation, + const int max_in_segment_num_to_process + ) + for info on parameters and restrictions. +*/ +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +#include "stir/SSRB.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::cerr; +#endif + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + int num_tangential_poss_to_trim = 0; + if (argc>1 && strcmp(argv[1], "-t")==0) + { + num_tangential_poss_to_trim = atoi(argv[2]); + argc -= 2; argv += 2; + } + if (argc > 7 || argc < 3 ) + { + cerr << "Usage:\n" + << argv[0] << " [-t num_tangential_poss_to_trim] \\\n" + << "\toutput_filename input_projdata_name \\\n" + << "\t[num_segments_to_combine \\\n" + <<"\t[ num_views_to_combine [do_norm [max_in_segment_num_to_process ]]]]\n" + << "num_segments_to_combine has to be odd. It is used as the number of segments\n" + << " in the original data to combine.\n" + << "num_views_to_combine has to be at least 1 (which is the default)\n" + << "num_tangential_poss_to_trim has to be smaller than the available number\n" + << " of tangential positions.\n" + << "do_norm has to be 1 (normalise the result, which is the default) or 0\n" + << "max_in_segment_num_to_process defaults to all segments\n"; + exit(EXIT_FAILURE); + } + const string output_filename = argv[1]; + shared_ptr in_projdata_ptr = ProjData::read_from_file(argv[2]); + const int span = argc<=3?1 : atoi(argv[3]); + const int num_views_to_combine = argc<=4 ? 1 : atoi(argv[4]); + const bool do_norm = argc<=5 ? true : atoi(argv[5]) != 0; + const int max_segment_num_to_process = argc <=6 ? -1 : atoi(argv[6]); + SSRB(output_filename, + *in_projdata_ptr, + span, + num_views_to_combine, + num_tangential_poss_to_trim, + do_norm, + max_segment_num_to_process + ); + return EXIT_SUCCESS; +} diff --git a/src/utilities/abs_image.cxx b/src/utilities/abs_image.cxx new file mode 100644 index 0000000000..a5ae5259e6 --- /dev/null +++ b/src/utilities/abs_image.cxx @@ -0,0 +1,151 @@ +// +// +/* + Copyright (C) 2006- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \brief It produces the absolute value image of an image. + \author Kris Thielemans + \author Charalampos Tsoumpas + + + \todo Potentially, in the future it should be included in stir_math as an option. + + \par Usage: + \code + abs_image [-p || -d] -o output_filename -i input_filename + \endcode + Use -p switch for parametric images, or the -d switch for dynamic images. +*/ +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/DiscretisedDensity.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/DynamicDiscretisedDensity.h" +#include +#include "stir/getopt.h" + +int main(int argc, char * argv[]) +{ + USING_NAMESPACE_STIR; + const char * output_filename = 0; + const char * input_filename = 0; + bool do_parametric=0; + bool do_dynamic=0; + + const char * const usage = "abs_image [ -p | -d ] -o output_filename -i input_filename\n"; + opterr = 0; + { + char c; + + while ((c = getopt (argc, argv, "i:o:(p||d)")) != -1) + switch (c) + { + case 'i': + input_filename = optarg; + break; + case 'o': + output_filename = optarg; + break; + case 'p': + do_parametric=true; + break; + case 'd': + do_dynamic=true; + break; + case '?': + std::cerr << usage; + return EXIT_FAILURE; + default: + if (isprint (optopt)) + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf (stderr, + "Unknown option character `\\x%x'.\n", + optopt); + std::cerr << usage; + return EXIT_FAILURE; + } + } + + if (output_filename==0 || input_filename==0) + { + std::cerr << usage; + return EXIT_FAILURE; + } + + if(do_parametric)// A better way will be to template it... + { + shared_ptr + input_image_sptr(ParametricVoxelsOnCartesianGrid::read_from_file(input_filename)); + shared_ptr output_image_sptr(input_image_sptr->clone()); + ParametricVoxelsOnCartesianGrid::full_iterator out_iter = output_image_sptr->begin_all(); + ParametricVoxelsOnCartesianGrid::const_full_iterator in_iter = input_image_sptr->begin_all_const(); + while( in_iter != input_image_sptr->end_all_const()) + { + if (*in_iter<0.F) + *out_iter = -(*in_iter); + ++in_iter; ++out_iter; + } + Succeeded success = + OutputFileFormat::default_sptr()-> + write_to_file(output_filename, *output_image_sptr); + return success==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; + } + else if(do_dynamic)// A better way will be to template it... + { + const shared_ptr + input_image_sptr(read_from_file(input_filename)); + const DynamicDiscretisedDensity input_image = *input_image_sptr; + DynamicDiscretisedDensity output_image = input_image; + for(unsigned int frame_num=1;frame_num<=(input_image.get_time_frame_definitions()).get_num_frames();++frame_num) + { + DiscretisedDensity<3,float>::full_iterator out_iter = output_image[frame_num].begin_all(); + DiscretisedDensity<3,float>::const_full_iterator in_iter = input_image[frame_num].begin_all_const(); + while( in_iter != input_image[frame_num].end_all_const()) + { + if (*in_iter<0.F) + *out_iter = -(*in_iter); + ++in_iter; ++out_iter; + } + } + Succeeded success = + output_image.write_to_ecat7(output_filename); + return success==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; + } + else + { + shared_ptr > + input_image_sptr(read_from_file >(input_filename)); + + shared_ptr > output_image_sptr(input_image_sptr->clone()); + DiscretisedDensity<3,float>::full_iterator out_iter = output_image_sptr->begin_all(); + DiscretisedDensity<3,float>::const_full_iterator in_iter = input_image_sptr->begin_all_const(); + while( in_iter != input_image_sptr->end_all_const()) + { + if (*in_iter<0.F) + *out_iter = -(*in_iter); + ++in_iter; ++out_iter; + } + Succeeded success = + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, *output_image_sptr); + return success==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; + } +} diff --git a/src/utilities/attenuation_coefficients_to_projections.cxx b/src/utilities/attenuation_coefficients_to_projections.cxx new file mode 100644 index 0000000000..8678b537bf --- /dev/null +++ b/src/utilities/attenuation_coefficients_to_projections.cxx @@ -0,0 +1,120 @@ +/* + Copyright (C) 2002 - 2011-12-31, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 + Lesser GNU General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + + \brief Takes the logarithm of attenuation coefficients to 'convert' them to line integrals. + + \par Usage + \verbatim + attenuation_coefficients_to_projections \ + --AF|--ACF + \endverbatim + Use --AF if input are attenuation factors, --ACF for + attenuation correction factors (i.e. the inverse of the former). + + \warning Currently thresholds ACF values to maximum 150 (and AF to minimum 1/150) + to prevent log() to grow too large. + \todo get threshold from command line + + \author Kris Thielemans +*/ + + +#include "stir/ProjData.h" +#include "stir/ProjDataInterfile.h" +#include "stir/Viewgram.h" +#include "stir/ArrayFunction.h" +#include "stir/thresholding.h" +#include + +USING_NAMESPACE_STIR + +static void print_usage_and_exit() +{ + std::cerr<<"\nUsage:\nattenuation_coefficients_to_projections\n\t" + << " --AF|--ACF \n"; + exit(EXIT_FAILURE); +} + +int +main (int argc, char * argv[]) +{ + + // TODO get this from cmdline + const float acf_threshold=150.F; + + if (argc!=4) + print_usage_and_exit(); + + bool doACF=true;// initialise to avoid compiler warning + if (strcmp(argv[1],"--ACF")==0) + doACF=true; + else if (strcmp(argv[1],"--AF")==0) + doACF=false; + else + print_usage_and_exit(); + + ++argv; --argc; + + shared_ptr attenuation_proj_data_ptr = + ProjData::read_from_file(argv[2]); + + const string output_file_name = argv[1]; + + shared_ptr + out_proj_data_ptr(new ProjDataInterfile(attenuation_proj_data_ptr->get_exam_info_sptr(), + attenuation_proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(), + output_file_name)); + + for (int segment_num = attenuation_proj_data_ptr->get_min_segment_num(); + segment_num<= attenuation_proj_data_ptr->get_max_segment_num(); + ++segment_num) + for ( int view_num = attenuation_proj_data_ptr->get_min_view_num(); + view_num<=attenuation_proj_data_ptr->get_max_view_num(); + ++view_num) + { + Viewgram viewgram = attenuation_proj_data_ptr->get_viewgram(view_num,segment_num); + + if (doACF) + { + // threshold minimum to arbitrary value as log will otherwise explode) + threshold_lower(viewgram.begin_all(), viewgram.end_all(), 1/acf_threshold); + in_place_log(viewgram); + } + else + { + // threshold maximum to arbitrary value as log will otherwise explode) + threshold_upper(viewgram.begin_all(), viewgram.end_all(), acf_threshold); + in_place_log(viewgram); + viewgram *= -1.F; + } + + if (out_proj_data_ptr->set_viewgram(viewgram) != Succeeded::yes) + { + warning("Error setting output viewgram at segment %d view %d. Exiting", + segment_num, view_num); + return EXIT_FAILURE; + } + } + + + return EXIT_SUCCESS; +} + diff --git a/src/utilities/back_project.cxx b/src/utilities/back_project.cxx new file mode 100644 index 0000000000..ada3c2b224 --- /dev/null +++ b/src/utilities/back_project.cxx @@ -0,0 +1,117 @@ +/* + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 + Lesser GNU General Public License for more details. + + See STIR/LICENSE.txt for details + +*/ + +/*! + \file + \ingroup utilities + \author Kris Thielemans + + \brief Back project an image. + + \par Usage: + \verbatim + back_project output-filename image_to_back_project template_proj_data_file [backprojector-parfile ]\n" + \endverbatim + The template_proj_data_file will be used to get the scanner, mashing etc. details + (its data will \e not be used, nor will it be overwritten). + + The default projector uses the ray-tracing matrix. + \par Example parameter file for specifying the back projector + \verbatim + Back Projector parameters:= + type := Matrix + Back projector Using Matrix Parameters := + Matrix type := Ray Tracing + Ray tracing matrix parameters := + End Ray tracing matrix parameters := + End Back Projector Using Matrix Parameters := + End:= + \endverbatim +*/ + +#include "stir/ProjData.h" +#include "stir/DiscretisedDensity.h" +#include "stir/IO/read_from_file.h" +#include "stir/recon_buildblock/BackProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#include "stir/IO/OutputFileFormat.h" +#include +#include + +static void print_usage_and_exit() +{ + std::cerr<<"\nUsage:\nback_project output-filename proj_data_to_back_project template_image [backprojector-parfile ]\n"; + std::cerr<<"The default projector uses the ray-tracing matrix.\n\n"; + std::cerr<<"Example parameter file:\n\n" + <<"Back Projector parameters:=\n" + <<" type := Matrix\n" + <<" Back projector Using Matrix Parameters :=\n" + <<" Matrix type := Ray Tracing\n" + <<" Ray tracing matrix parameters :=\n" + <<" End Ray tracing matrix parameters :=\n" + <<" End Back Projector Using Matrix Parameters :=\n" + <<"End:=\n"; + + exit(EXIT_FAILURE); +} + + +int +main (int argc, char * argv[]) +{ + using namespace stir; + + if (argc!=4 && argc!=5 ) + print_usage_and_exit(); + + const std::string output_filename = argv[1]; + + shared_ptr proj_data_sptr = + ProjData::read_from_file(argv[2]); + + shared_ptr > + image_density_sptr(read_from_file >(argv[3])); + + shared_ptr back_projector_sptr; + if (argc>=5) + { + KeyParser parser; + parser.add_start_key("Back Projector parameters"); + parser.add_parsing_key("type", &back_projector_sptr); + parser.add_stop_key("END"); + parser.parse(argv[4]); + } + else + { + shared_ptr PM(new ProjMatrixByBinUsingRayTracing()); + back_projector_sptr.reset(new BackProjectorByBinUsingProjMatrixByBin(PM)); + } + + back_projector_sptr->set_up(proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone(), + image_density_sptr ); + + image_density_sptr->fill(0.F); + + back_projector_sptr->back_project(*image_density_sptr, *proj_data_sptr); + + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, *image_density_sptr); + + return EXIT_SUCCESS; +} + diff --git a/src/utilities/calculate_attenuation_coefficients.cxx b/src/utilities/calculate_attenuation_coefficients.cxx new file mode 100644 index 0000000000..8ef373b977 --- /dev/null +++ b/src/utilities/calculate_attenuation_coefficients.cxx @@ -0,0 +1,208 @@ +/* + Copyright (C) 2001 - 2011-12-31, Hammersmith Imanet Ltd + Copyright (C) 2013, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 + Lesser GNU General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + + \brief Calculates attenuation coefficients (as an alternative to correct_projdata). + + \par Usage + \verbatim + calculate_attenuation_coefficients + --AF|--ACF [forwardprojector-parfile] + \endverbatim + --ACF calculates the attenuation correction factors, --AF calculates + the attenuation factor (i.e. the inverse of the ACFs). + + The attenuation_image has to contain an estimate of the mu-map for the image. It will be used + to estimate attenuation factors as exp(-forw_proj(*attenuation_image_ptr)). + + \warning attenuation image data are supposed to be in units cm^-1. + Reference: water has mu .096 cm^-1. + + \author Sanida Mustafovic + \author Kris Thielemans + \author Nicolas A Karakatsanis +*/ + +#include "stir/ProjDataInterfile.h" +#include "stir/RelatedViewgrams.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Viewgram.h" +#include "stir/ArrayFunction.h" +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#include "stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#include "stir/IO/read_from_file.h" +#include "stir/info.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::endl; +using std::cerr; +#endif + + +START_NAMESPACE_STIR + +// The start..., end_... parameters could obviously be removed, as we're +// removing the defaults anyway. However, they're there now, so we can just +// as well leave them in +static +void +do_segments(const VoxelsOnCartesianGrid& image, + ProjData& proj_data, + const int start_segment_num, const int end_segment_num, + const int start_view, const int end_view, + const int start_tangential_pos_num, const int end_tangential_pos_num, + ForwardProjectorByBin& forw_projector, + const bool doACF) +{ + shared_ptr + symmetries_sptr(forw_projector.get_symmetries_used()->clone()); + + for (int segment_num = start_segment_num; segment_num <= end_segment_num; ++segment_num) + for (int view= start_view; view<=end_view; view++) + { + const ViewSegmentNumbers vs(view, segment_num); + if (!symmetries_sptr->is_basic(vs)) + continue; + + RelatedViewgrams viewgrams = + proj_data.get_empty_related_viewgrams(vs, symmetries_sptr); + + forw_projector.forward_project(viewgrams, image, + viewgrams.get_min_axial_pos_num(), + viewgrams.get_max_axial_pos_num(), + start_tangential_pos_num, end_tangential_pos_num); + + // do the exp + for (RelatedViewgrams::iterator viewgrams_iter= viewgrams.begin(); + viewgrams_iter != viewgrams.end(); + ++viewgrams_iter) + { + Viewgram& viewgram = *viewgrams_iter; + if (!doACF) + viewgram *= -1; + in_place_exp(viewgram); + } + + if (!(proj_data.set_related_viewgrams(viewgrams) == Succeeded::yes)) + error("Error set_related_viewgrams\n"); + } +} + + + +static void print_usage_and_exit() +{ + std::cerr<<"\nUsage: calculate_attenuation_coefficients --AF|--ACF [forwardprojector-parfile ]\n" + <<"\t--ACF calculates the attenuation correction factors\n" + <<"\t--AF calculates the attenuation factor (i.e. the inverse of the ACFs)\n" + <<"The input image has to give the attenuation (or mu) values at 511 keV, and be in units of cm^-1.\n"; + exit(EXIT_FAILURE); +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int +main (int argc, char * argv[]) +{ + + if (argc!=5 && argc!=6 ) + print_usage_and_exit(); + + bool doACF=true;// initialise to avoid compiler warning + if (strcmp(argv[1],"--ACF")==0) + doACF=true; + else if (strcmp(argv[1],"--AF")==0) + doACF=false; + else + print_usage_and_exit(); + + ++argv; --argc; + + shared_ptr > + attenuation_density_ptr(read_from_file >(argv[2])); + VoxelsOnCartesianGrid * attenuation_image_ptr = + dynamic_cast *> (attenuation_density_ptr.get()); + + info(boost::format("attenuation image data are supposed to be in units cm^-1\n" + "Reference: water has mu .096 cm^-1\n" + "Max in attenuation image: %g") % + attenuation_image_ptr->find_max()); +#ifndef NEWSCALE + /* + cerr << "WARNING: multiplying attenuation image by x-voxel size " + << " to correct for scale factor in forward projectors...\n"; + */ + // projectors work in pixel units, so convert attenuation data + // from cm^-1 to pixel_units^-1 + const float rescale = attenuation_image_ptr->get_voxel_size().x()/10; +#else + const float rescale = + .1F; +#endif + *attenuation_image_ptr *= rescale; + + shared_ptr template_proj_data_ptr = + ProjData::read_from_file(argv[3]); + + shared_ptr forw_projector_ptr; + if (argc==5) + { + KeyParser parser; + parser.add_start_key("Forward Projector parameters"); + parser.add_parsing_key("type", &forw_projector_ptr); + parser.add_stop_key("END"); + parser.parse(argv[4]); + } + else + { + forw_projector_ptr.reset(new ForwardProjectorByBinUsingRayTracing()); + } + + forw_projector_ptr->set_up(template_proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(), + attenuation_density_ptr ); + cerr << "\n\nForward projector used:\n" << forw_projector_ptr->parameter_info(); + + const string output_file_name = argv[1]; + shared_ptr + out_proj_data_ptr( + new ProjDataInterfile(template_proj_data_ptr->get_exam_info_sptr(), + template_proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(), + output_file_name)); + + do_segments(*attenuation_image_ptr,*out_proj_data_ptr, + out_proj_data_ptr->get_min_segment_num(), out_proj_data_ptr->get_max_segment_num(), + out_proj_data_ptr->get_min_view_num(), + out_proj_data_ptr->get_max_view_num(), + out_proj_data_ptr->get_min_tangential_pos_num(), + out_proj_data_ptr->get_max_tangential_pos_num(), + *forw_projector_ptr, + doACF); + + return EXIT_SUCCESS; +} + diff --git a/src/utilities/compare_image.cxx b/src/utilities/compare_image.cxx new file mode 100644 index 0000000000..c132cda630 --- /dev/null +++ b/src/utilities/compare_image.cxx @@ -0,0 +1,168 @@ +// +// + +/*! +\file +\ingroup utilities +\brief compare images to see if they are identical, allowing for small differences + +\author Matthew Jacobson +\author Kris Thielemans +\author PARAPET project +\author Charalampos Tsoumpas: Add the tolerance as input + +This utility compares two images. They are deemed identical if +their maximum absolute relative difference is less than a hard-coded tolerance +value. +Diagnostic output is written to stdout, and the return value indicates +if the files are identical or not. +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009-06-22, Hammersmith Imanet Ltd + Copyright (C) 2011-12-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/* Modification History: + + KT 12/09/2001 added rim_truncation option +*/ + +#include "stir/DiscretisedDensity.h" +#include "stir/ArrayFunction.h" +#include "stir/recon_array_functions.h" +#include "stir/IO/read_from_file.h" +#include "stir/is_null_ptr.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::cout; +using std::endl; +#endif + + + +//********************** main + + + +USING_NAMESPACE_STIR + + +int main(int argc, char *argv[]) +{ + if(argc<3 || argc>7) + { + cerr << "Usage: \n" << argv[0] << "\n\t" + << "[-r rimsize] \n\t" + << "[-t tolerance] \n\t" + << "old_image new_image \n\t" + << "'rimsize' has to be a nonnegative integer.\n\t" + << "'tolerance' is by default .0005 \n\t" + << "When the -r option is used, the (radial) rim of the\n\t" + << "images will be set to 0, for 'rimsize' pixels.\n"; + return(EXIT_FAILURE); + } + // skip program name + --argc; + ++argv; + int rim_truncation_image = -1; + float tolerance = .0005F ; + + // first process command line options + + while (argc>0 && argv[0][0]=='-') + { + if (strcmp(argv[0], "-r")==0) + { + if (argc<2) + { cerr << "Option '-r' expects a nonnegative (integer) argument\n"; exit(EXIT_FAILURE); } + rim_truncation_image = atoi(argv[1]); + argc-=2; argv+=2; + } + if (strcmp(argv[0], "-t")==0) + { + if (argc<2) + { cerr << "Option '-t' expects a (float) argument\n"; exit(EXIT_FAILURE); } + tolerance = static_cast(atof(argv[1])); + argc-=2; argv+=2; + } + } + + shared_ptr< DiscretisedDensity<3,float> > + first_operand(read_from_file >(argv[0])); + + if (is_null_ptr(first_operand)) + { cerr << "Could not read first file\n"; exit(EXIT_FAILURE); } + + shared_ptr< DiscretisedDensity<3,float> > + second_operand(read_from_file >(argv[1])); + if (is_null_ptr(second_operand)) + { cerr << "Could not read 2nd file\n"; exit(EXIT_FAILURE); } + + // check if images are compatible + { + string explanation; + if (!first_operand->has_same_characteristics(*second_operand, + explanation)) + { + warning("input images do not have the same characteristics.\n%s", + explanation.c_str()); + return EXIT_FAILURE; + } + } + + if (rim_truncation_image>=0) + { + truncate_rim(*first_operand, rim_truncation_image); + truncate_rim(*second_operand, rim_truncation_image); + } + + float reference_max=first_operand->find_max(); + float reference_min=first_operand->find_min(); + + float amplitude=fabs(reference_max)>fabs(reference_min)? + fabs(reference_max):fabs(reference_min); + + *first_operand -= *second_operand; + const float max_error=first_operand->find_max(); + const float min_error=first_operand->find_min(); + in_place_abs(*first_operand); + const float max_abs_error=first_operand->find_max(); + + const bool same=(max_abs_error/amplitude<=tolerance); + + cout << "\nMaximum absolute error = "< +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::cout; +using std::endl; +using std::max; +#endif + + + +START_NAMESPACE_STIR + + +//*********************** functions + +// WARNING: modifies input1 +void +update_comparison(SegmentByView& input1, const SegmentByView &input2, + float &max_pos_error, float& max_neg_error, float &litude) +{ + const float reference_max=input1.find_max(); + const float reference_min=input1.find_min(); + + const float local_amplitude= + fabs(reference_max)>fabs(reference_min)? + fabs(reference_max):fabs(reference_min); + + amplitude=local_amplitude>amplitude?local_amplitude:amplitude; + + input1-=input2; + const float max_local_pos_error=input1.find_max(); + const float max_local_neg_error=input1.find_min(); + + max_pos_error=max_local_pos_error>max_pos_error? max_local_pos_error:max_pos_error; + max_neg_error=max_local_neg_error0 && argv[0][0]=='-') + { + if (strcmp(argv[0], "-t")==0) + { + if (argc<2) + { cerr << "Option '-t' expects a (float) argument\n"; exit(EXIT_FAILURE); } + tolerance = static_cast(atof(argv[1])); + argc-=2; argv+=2; + } + else + { + std::cerr << "Unknown option '" << argv[0] <<"'\n"; exit(EXIT_FAILURE); + } + } + + if(argc<2) + { + cerr<< "Usage:" << progname << " [-t tolerance] old_projdata new_projdata [max_segment_num]\n"; + exit(EXIT_FAILURE); + } + + + + shared_ptr first_operand=ProjData::read_from_file(argv[0]); + shared_ptr second_operand=ProjData::read_from_file(argv[1]); + + int max_segment=first_operand->get_max_segment_num(); + if(argc==3 && atoi(argv[2])>=0 && atoi(argv[2]) first_sptr(first_operand->get_proj_data_info_ptr()->clone()); + shared_ptr second_sptr(second_operand->get_proj_data_info_ptr()->clone()); + if (argc==4) + { + first_sptr->reduce_segment_range(-max_segment, max_segment); + second_sptr->reduce_segment_range(-max_segment, max_segment); + } + if (*first_sptr != *second_sptr) + { + cout << "\nProjection data sizes or other data characteristics are not identical. \n" + << "Use list_projdata_info to investigate.\n"; + return EXIT_FAILURE; } + } + + float max_pos_error=0.F, max_neg_error=0.F, amplitude=0.F; + for (int segment_num = -max_segment; segment_num <= max_segment ; segment_num++) + { + SegmentByView input1=first_operand->get_segment_by_view(segment_num); + const SegmentByView input2=second_operand->get_segment_by_view(segment_num); + + update_comparison(input1,input2,max_pos_error,max_neg_error, amplitude); + } + + const float max_abs_error=max(max_pos_error, -max_neg_error); + bool same=(max_abs_error/amplitude<=tolerance)?true:false; + + cout << "\nMaximum absolute error = "< +#include + +void print_usage_and_exit( const char * const program_name) +{ + { + std::cerr << "Usage : " << program_name << " [ --flip_z ] imagefile\n"; + + AVW_List* list = AVW_ListFormats(AVW_SUPPORT_READ); + std::cerr << "Supported file formats for reading by AVW:\n "; + for (int i=0; iNumberOfEntries; ++i) + { + std::cerr << list->Entry[i] << '\n'; + } + exit(EXIT_FAILURE); + } +} + +int +main(int argc, char **argv) +{ + const char * const program_name = argv[0]; + // skip program name + --argc; + ++argv; + + bool flip_z = false; + + // first process command line options + while (argc>0 && argv[0][0]=='-') + { + if (strcmp(argv[0], "--flip_z")==0) + { + flip_z = true; + argc-=1; argv+=1; + } + else + { + std::cerr << "Unknown option '" << argv[0] <<"'\n"; + print_usage_and_exit(program_name); + } + } + + if (argc != 1) + print_usage_and_exit(program_name); + + char *imagefile = argv[0]; + stir::shared_ptr > > + output_file_format_sptr = + stir::OutputFileFormat >::default_sptr(); + { + // open non-existent file first + // this is necessary to get AVW_LoadObjectMap to work + AVW_ImageFile *avw_file= AVW_OpenImageFile("xxx non-existent I hope","r"); + } + + std::cout << "Reading ImageMap " << imagefile << '\n'; + AVW_ImageFile*avw_file = AVW_OpenImageFile(imagefile,"r"); + if(!avw_file) + { + AVW_Error("AVW_OpenImageFile"); + std::cout << std::flush; + exit(EXIT_FAILURE); + } + + std::cout << "Number of volumes: " << avw_file->NumVols << '\n'; + unsigned int min_volume_num = 0; + unsigned int max_volume_num = avw_file->NumVols-1; + if (!stir::ask("Attempt all data-sets (Y) or single data-set (N)", true)) + { + min_volume_num = max_volume_num = + stir::ask_num("Volume number ? ", 1U, avw_file->NumVols, 1U) + - 1; // subtract 1 as AVW numbering starts from 0 + } + { + AVW_Volume *volume = NULL; + for (unsigned int volume_num=min_volume_num; volume_num<=max_volume_num; ++volume_num) + { + { + volume = AVW_ReadVolume(avw_file, volume_num, volume); + if(!volume) + { + AVW_Error("AVW_ReadVolume"); + stir::warning("Error in volume %d. Skipping...", volume_num+1);//, AVW_ErrorMessage); + continue; + } + stir::shared_ptr > stir_volume_sptr = + stir::AVW::AVW_Volume_to_VoxelsOnCartesianGrid(volume, flip_z); + if (stir::is_null_ptr(stir_volume_sptr)) + { + stir::warning("Error converting volume to STIR format. Skipping...", volume_num); + continue; + } + char *header_filename = new char[strlen(imagefile) + 100]; + { + strcpy(header_filename, imagefile); + // keep extension, just in case we would have conflicts otherwise + // but replace the . with a _ + char * dot_ptr = strchr(stir::find_filename(header_filename),'.'); + if (dot_ptr != NULL) + *dot_ptr = '_'; + // now add stuff to say which frame, gate, bed, data this was + sprintf(header_filename+strlen(header_filename), "_f%dg%dd%db%d", + volume_num+1, 1, 0, 0); + } + if (output_file_format_sptr->write_to_file(header_filename, *stir_volume_sptr) + == stir::Succeeded::no) + { + stir::warning("Error writing %s", header_filename); + } + else + { + std::cout << "Wrote " << header_filename << '\n'; + } + delete[] header_filename; + } + } + AVW_DestroyVolume(volume); + } + AVW_CloseImageFile(avw_file); + + + return(EXIT_SUCCESS); +} + + diff --git a/src/utilities/conv_GATE_raw_ECAT_projdata_to_interfile.cxx b/src/utilities/conv_GATE_raw_ECAT_projdata_to_interfile.cxx new file mode 100644 index 0000000000..49fd882e94 --- /dev/null +++ b/src/utilities/conv_GATE_raw_ECAT_projdata_to_interfile.cxx @@ -0,0 +1,122 @@ +/* + Copyright (C) 2005- 2009, Hammersmith Imanet Ltd + Copyright (C) 2010- 2013, King's College London + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + \brief This program converts GATE ECAT output (.ima) into STIR interfile format + + \author Charalampos Tsoumpas + \author Pablo Aguiar + \author Kris Thielemans + */ + +#include "stir/ProjDataInterfile.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/Sinogram.h" +#include "stir/Scanner.h" +#include "stir/IO/read_data.h" +#include "stir/Succeeded.h" + +#define NUMARG 8 + +int main(int argc,char **argv) +{ + using namespace stir; + + static const char * const options[]={ + "argv[1] GATE file\n", + "argv[2] Angles in GATE file\n", + "argv[3] Bins in GATE file\n", + "argv[4] Rings in GATE file\n", + "argv[5] STIR scanner name\n", + "argv[6] maximum ring difference to use for writing\n", + "argv[7] STIR file name\n" + }; + if (argc!=NUMARG){ + std::cerr << "\n\nConvert GATE ECAT format to STIR\n\n"; + std::cerr << "Not enough arguments !!! ..\n"; + for (int i=1;i=num_rings) + error("Cannot have max ring difference larger than the number of rings"); + if (num_tangential_poss%2 != 1) + warning("Not sure if STIR can handle GATE data with even number of tangential positions.\n" + "Proceed at your risk (but you might have artifacts)"); + if( sizeof(short int)!=2 ) + error("Expected Input Data should be in UINT16 format\nand size of short int is should be 2\n") ; + shared_ptr scanner_sptr( Scanner::get_scanner_from_name(scanner_name)); + if (is_null_ptr(scanner_sptr)) + error("Scanner '%s' is not a valid name", scanner_name); + + FILE *GATE_file ; + if( (GATE_file=fopen(GATE_filename,"rb"))==NULL) + error("Cannot open GATE file %s", GATE_filename); + else { + long GATE_file_size=fseek(GATE_file, 0, SEEK_END); + GATE_file_size=ftell(GATE_file); + rewind(GATE_file); + std::cerr << GATE_file_size << " size of file" << std::endl; + std::cerr << num_bins_per_sino << " bins per sino" << std::endl; + + if( GATE_file_size%num_bins_per_sino!=0 ) + error("Expected Input Data should be multiple of the number of bins per sinogram. Check input for bins and angles or GATE file.\n") ; + } + const float STIR_scanner_length = + scanner_sptr->get_num_rings() * scanner_sptr->get_ring_spacing(); + scanner_sptr->set_num_rings(num_rings); + scanner_sptr->set_ring_spacing(STIR_scanner_length/num_rings); + scanner_sptr->set_num_detectors_per_ring(num_views*2); + shared_ptr proj_data_info_sptr( + ProjDataInfo::ProjDataInfoCTI( scanner_sptr, + /*span=*/1, + /*max_delta=*/max_ring_difference, + num_views, + num_tangential_poss, + /*arc_corrected =*/ false)); + shared_ptr exam_info_sptr(new ExamInfo); + ProjDataInterfile proj_data(exam_info_sptr, proj_data_info_sptr, + STIR_output_filename, std::ios::out); + + for (int segment_num=0; segment_num<=max_ring_difference; segment_num = (segment_num<=0) ? 1+segment_num*-1 : -1*segment_num) + { + for (int axial_pos_num = proj_data.get_min_axial_pos_num(segment_num); + axial_pos_num <= proj_data.get_max_axial_pos_num(segment_num); + axial_pos_num++) + { + Sinogram sino = proj_data.get_empty_sinogram(axial_pos_num,segment_num); + read_data(GATE_file, sino); + proj_data.set_sinogram(sino); + } + } + fclose(GATE_file); + + return EXIT_SUCCESS; +} diff --git a/src/utilities/conv_gipl_to_interfile.cxx b/src/utilities/conv_gipl_to_interfile.cxx new file mode 100644 index 0000000000..a272810779 --- /dev/null +++ b/src/utilities/conv_gipl_to_interfile.cxx @@ -0,0 +1,174 @@ +/* + Copyright (C) 2009 - 2013, King's College London + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + + \brief This program converts Images from GIPL (Guy's Imaging Processing Lab) format to Interfile Format. + \author Charalampos Tsoumpas + */ + +#include "stir/IO/InterfileOutputFileFormat.h" +#include "stir/shared_ptr.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/IO/GIPL_ImageFormat.h" + +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::ios; +using std::iostream; +using std::cout; +using std::endl; +using std::fstream; +using std::cerr; +using std::endl; +#endif + + +USING_NAMESPACE_STIR + +// ------------------------------------------------------------------------- +// Main function +// ------------------------------------------------------------------------- + +int main(int argc, char* argv[]) +{ + if(argc>3 || argc<2) { + std::cerr<<"Usage: " << argv[0] << " \n" + << "\nConversion of an image from gipl format to interfile.\n" + << "Orientation flag can be: 1, 2 or 3\n" + << " For Transverse set to: 1 \n" + << " For Coronal set to: 2 \n" + << " For Sagittal set to: 3 \n" + << "\t Orientation defaults to Transverse \n" + << "output file will change only extension\n"; + exit(EXIT_FAILURE); + } + + Image * image= new Image; + image->GiplRead(argv[1]); + string filename(argv[1]); + string output_filename; + string::iterator string_iter; + for(string_iter=filename.begin(); + string_iter!=filename.end() && *string_iter!='.' ; + ++string_iter) + output_filename.push_back(*string_iter); + const int orientation = (argc==2) ? 1 : atoi(argv[2]) ; + + if (orientation==1) { + BasicCoordinate<3,int> min_range; BasicCoordinate<3,int> max_range; + min_range[1]=0; max_range[1]=image->m_dim[2]-1; + min_range[2]=-static_cast(floor(image->m_dim[1]/2.F)); max_range[2]=min_range[2] + image->m_dim[1]-1; + min_range[3]=-static_cast(floor(image->m_dim[0]/2.F)); max_range[3]=min_range[3] + image->m_dim[0]-1; + IndexRange<3> data_range(min_range,max_range); + Array<3,float> v_array(data_range); + + for (int k_out=min_range[1]; k_out<=max_range[1]; ++k_out) + for (int j_out=min_range[2]; j_out<=max_range[2]; ++j_out) + for (int i_out=min_range[3]; i_out<=max_range[3]; ++i_out) + { + int index = i_out-min_range[3] + image->ImageOffset[0]*(j_out-min_range[2]) + image->ImageOffset[1]*(k_out-min_range[1]); + if (image->m_image_type==15) + v_array[k_out][j_out][i_out]=(float)image->vData[index]; + else if (image->m_image_type==64) + v_array[k_out][j_out][i_out]=image->vData_f[index]; + } + const CartesianCoordinate3D + grid_spacing(image->m_pixdim[2],image->m_pixdim[1],image->m_pixdim[0]); + CartesianCoordinate3D origin(0.F,0.F,0.F); + // TODO not sure if this is correct for even/odd-sized data. + origin[1]=static_cast(image->m_origin[2]+image->m_pixdim[2]*image->m_dim[2]/2.F); + origin[2]=static_cast(image->m_origin[1]+image->m_pixdim[1]*image->m_dim[1]/2.F); + origin[3]=static_cast(image->m_origin[0]+image->m_pixdim[0]*image->m_dim[0]/2.F); + const VoxelsOnCartesianGrid new_image(v_array,origin,grid_spacing); + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, new_image); + } + else if (orientation==2) { + BasicCoordinate<3,int> min_range; BasicCoordinate<3,int> max_range; + min_range[1]=0; max_range[1]=image->m_dim[1]-1; + min_range[2]=-static_cast(floor(image->m_dim[2]/2.F)); max_range[2]=min_range[2] + image->m_dim[2]-1; + min_range[3]=-static_cast(floor(image->m_dim[0]/2.F)); max_range[3]=min_range[3] + image->m_dim[0]-1; + + IndexRange<3> data_range(min_range,max_range); + Array<3,float> v_array(data_range); + + for (int k_out=min_range[1]; k_out<=max_range[1]; ++k_out) + for (int j_out=min_range[2]; j_out<=max_range[2]; ++j_out) + for (int i_out=min_range[3]; i_out<=max_range[3]; ++i_out) + { + int index = i_out-min_range[3] + image->ImageOffset[0]*(k_out-min_range[1]) + image->ImageOffset[1]*(j_out-min_range[2]); + if (image->m_image_type==15) + v_array[k_out][j_out][i_out]=(float)image->vData[index]; + else if (image->m_image_type==64) + v_array[k_out][j_out][i_out]=image->vData_f[index]; + } + const CartesianCoordinate3D + grid_spacing(image->m_pixdim[1],image->m_pixdim[2],image->m_pixdim[0]); + CartesianCoordinate3D origin(0.F,0.F,0.F); + origin[2]=static_cast(image->m_origin[2]+image->m_pixdim[2]*image->m_dim[2]/2.F); + origin[1]=static_cast(image->m_origin[1]+image->m_pixdim[1]*image->m_dim[1]/2.F); + origin[3]=static_cast(image->m_origin[0]+image->m_pixdim[0]*image->m_dim[0]/2.F); + const VoxelsOnCartesianGrid new_image(v_array,origin,grid_spacing); + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, new_image); + } + else if (orientation==3) { + BasicCoordinate<3,int> min_range; BasicCoordinate<3,int> max_range; + min_range[1]=0; max_range[1]=image->m_dim[1]-1; + min_range[2]=-static_cast(floor(image->m_dim[0]/2.F)); max_range[2]=min_range[2] + image->m_dim[0]-1; + min_range[3]=-static_cast(floor(image->m_dim[2]/2.F)); max_range[3]=max_range[3] + image->m_dim[2]-1; + + IndexRange<3> data_range(min_range,max_range); + Array<3,float> v_array(data_range); + + for (int k_out=min_range[1]; k_out<=max_range[1]; ++k_out) + for (int j_out=min_range[2]; j_out<=max_range[2]; ++j_out) + for (int i_out=min_range[3]; i_out<=max_range[3]; ++i_out) + { + int index = j_out-min_range[2] + image->ImageOffset[0]*(k_out-min_range[1]) + image->ImageOffset[1]*(max_range[3]-i_out); + if (image->m_image_type==15) + v_array[k_out][j_out][i_out]=(float)image->vData[index]; + else if (image->m_image_type==64) + v_array[k_out][j_out][i_out]=image->vData_f[index]; + } + const CartesianCoordinate3D + grid_spacing(image->m_pixdim[1],image->m_pixdim[0],image->m_pixdim[2]); + CartesianCoordinate3D origin(0.F,0.F,0.F); + origin[3]=static_cast(image->m_origin[2]+image->m_pixdim[2]*image->m_dim[2]/2.F); + origin[1]=static_cast(image->m_origin[1]+image->m_pixdim[1]*image->m_dim[1]/2.F); + origin[2]=static_cast(image->m_origin[0]+image->m_pixdim[0]*image->m_dim[0]/2.F); + + const VoxelsOnCartesianGrid new_image(v_array,origin,grid_spacing); + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, new_image); + } + else + { + std::cerr << "Orientation flag is not recognised." << std::endl; + exit(EXIT_FAILURE); + } + return EXIT_SUCCESS; +} diff --git a/src/utilities/conv_interfile_to_gipl.cxx b/src/utilities/conv_interfile_to_gipl.cxx new file mode 100644 index 0000000000..9df04dbbeb --- /dev/null +++ b/src/utilities/conv_interfile_to_gipl.cxx @@ -0,0 +1,160 @@ +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + + \brief This program converts Images from Interfile Format to GIPL (Guy's Imaging Processing Lab) format. + \author Charalampos Tsoumpas + */ + +#include "stir/IO/InterfileOutputFileFormat.h" +#include "stir/shared_ptr.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/IO/GIPL_ImageFormat.h" + +// general header files +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::ios; +using std::iostream; +using std::cout; +using std::endl; +using std::fstream; +using std::cerr; +using std::endl; +#endif + + +USING_NAMESPACE_STIR + +// ------------------------------------------------------------------------- +// Main function +// ------------------------------------------------------------------------- + +int main(int argc, char* argv[]) +{ + if(argc>3 || argc<2) { + std::cerr<<"Usage: " << argv[0] << " \n" + << "\nConversion of an image from image file format to giplfile.\n" + << "Orientation flag can be: 1, 2 or 3\n" + << " For Transverse set to: 1 \n" + << " For Coronal set to: 2 \n" + << " For Sagittal set to: 3 \n" + << "\t Orientation defaults to Coronal \n" + << "output file will change only extension\n"; + exit(EXIT_FAILURE); + } + string filename(argv[1]); + const shared_ptr > image_sptr(DiscretisedDensity<3,float>::read_from_file(filename)); + string output_filename; + string::iterator string_iter; + for(string_iter=filename.begin(); + string_iter!=filename.end() && *string_iter!='.' ; + ++string_iter) + output_filename.push_back(*string_iter); + output_filename+=".gipl"; + const int orientation = (argc==2) ? 2 : atoi(argv[2]) ; + + const DiscretisedDensity<3,float>& input_image = *image_sptr; + const DiscretisedDensityOnCartesianGrid <3,float>* image_cartesian_ptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (image_sptr.get()); + + const IndexRange<3> data_range=image_sptr->get_index_range(); + BasicCoordinate<3,int> min_range; BasicCoordinate<3,int> max_range; + data_range.get_regular_range(min_range,max_range); + + const int num_voxels=(max_range[3]-min_range[3]+1)*(max_range[2]-min_range[2]+1)*(max_range[1]-min_range[1]+1); + Image image(num_voxels,64); + const Coordinate3D origin=input_image.get_origin(); + const Coordinate3D grid_spacing=image_cartesian_ptr->get_grid_spacing(); + if (orientation==1){ + image.m_dim[2]=max_range[1]-min_range[1]+1; + image.m_dim[1]=max_range[2]-min_range[2]+1; + image.m_dim[0]=max_range[3]-min_range[3]+1; + image.m_pixdim[2]=grid_spacing[1]; + image.m_pixdim[1]=grid_spacing[2]; + image.m_pixdim[0]=grid_spacing[3]; + image.m_origin[2]=origin[1]-image.m_pixdim[2]*image.m_dim[2]/2.F; + image.m_origin[1]=origin[2]-image.m_pixdim[1]*image.m_dim[1]/2.F; + image.m_origin[0]=origin[3]-image.m_pixdim[0]*image.m_dim[0]/2.F; + image.ImageOffset[1]=image.m_dim[0]*image.m_dim[1]; + image.ImageOffset[0]=image.m_dim[0]; + for (int k_out=min_range[1]; k_out<=max_range[1]; k_out++) + for (int j_out=min_range[2]; j_out<=max_range[2]; j_out++) + for (int i_out=min_range[3]; i_out<=max_range[3]; i_out++) + { + int index = i_out-min_range[3] + image.ImageOffset[0]*(j_out-min_range[2]) + image.ImageOffset[1]*(k_out-min_range[1]); + image.vData_f[index]=input_image[k_out][j_out][i_out]; + } + } + else if (orientation==2) { + image.m_dim[2]=max_range[2]-min_range[2]+1; + image.m_dim[1]=max_range[1]-min_range[1]+1; + image.m_dim[0]=max_range[3]-min_range[3]+1; + image.m_pixdim[2]=grid_spacing[2]; + image.m_pixdim[1]=grid_spacing[1]; + image.m_pixdim[0]=grid_spacing[3]; + image.m_origin[2]=origin[2]-image.m_pixdim[2]*image.m_dim[2]/2.F; + image.m_origin[1]=origin[1]-image.m_pixdim[1]*image.m_dim[1]/2.F; + image.m_origin[0]=origin[3]-image.m_pixdim[0]*image.m_dim[0]/2.F; + image.ImageOffset[1]=image.m_dim[0]*image.m_dim[1]; + image.ImageOffset[0]=image.m_dim[0]; + for (int k_out=min_range[1]; k_out<=max_range[1]; k_out++) + for (int j_out=min_range[2]; j_out<=max_range[2]; j_out++) + for (int i_out=min_range[3]; i_out<=max_range[3]; i_out++) + { + int index = i_out-min_range[3] + image.ImageOffset[0]*(k_out-min_range[1]) + image.ImageOffset[1]*(j_out-min_range[2]); + image.vData_f[index]=input_image[k_out][j_out][i_out]; + } + } + else if (orientation==3) { + image.m_dim[0]=max_range[2]-min_range[2]+1; + image.m_dim[1]=max_range[1]-min_range[1]+1; + image.m_dim[2]=max_range[3]-min_range[3]+1; + image.m_pixdim[0]=grid_spacing[2]; + image.m_pixdim[1]=grid_spacing[1]; + image.m_pixdim[2]=grid_spacing[3]; + image.m_origin[2]=origin[3]-image.m_pixdim[2]*image.m_dim[2]/2.F; + image.m_origin[1]=origin[1]-image.m_pixdim[1]*image.m_dim[1]/2.F; + image.m_origin[0]=origin[2]-image.m_pixdim[0]*image.m_dim[0]/2.F; + image.ImageOffset[1]=image.m_dim[0]*image.m_dim[1]; + image.ImageOffset[0]=image.m_dim[0]; + for (int k_out=min_range[1]; k_out<=max_range[1]; k_out++) + for (int j_out=min_range[2]; j_out<=max_range[2]; j_out++) + for (int i_out=min_range[3]; i_out<=max_range[3]; i_out++) + { + int index = j_out-min_range[2] + image.ImageOffset[0]*(k_out-min_range[1]) + image.ImageOffset[1]*(max_range[3]-i_out); + image.vData_f[index]=input_image[k_out][j_out][i_out]; + } + } + else + { + std::cerr << "Orientation flag is not recognised." << std::endl; + exit(EXIT_FAILURE); + } + + std::cerr << "Now writing image in gipl format" << std::endl; + image.GiplWrite(output_filename.c_str()); + return EXIT_SUCCESS; +} diff --git a/src/utilities/convert_to_binary_image.cxx b/src/utilities/convert_to_binary_image.cxx new file mode 100644 index 0000000000..7bb7981876 --- /dev/null +++ b/src/utilities/convert_to_binary_image.cxx @@ -0,0 +1,72 @@ +// +// +/* + Copyright (C) 2004- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief This program outputs a binary image (voxel values 0 or 1) where all values + strictly below a threshold are set to 0, and others to 1. + + \author Kris Thielemans + +*/ +#include "stir/DiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if(argc!=4) { + std::cerr<<"Usage: " << argv[0] << " threshold\n"; + exit(EXIT_FAILURE); + } + + // get parameters from command line + + std::string output_filename = argv[1]; + char const * const input_filename = argv[2]; + const float threshold = atof(argv[3]); + // read image + + shared_ptr > + density_ptr(read_from_file >(input_filename)); + + // binarise + for (DiscretisedDensity<3,float>::full_iterator iter = density_ptr->begin_all(); + iter != density_ptr->end_all(); + ++iter) + { + if (*iter < threshold) + *iter = 0.F; + else + *iter = 1.F; + } + shared_ptr > > output_file_format_sptr = + OutputFileFormat >::default_sptr(); + output_file_format_sptr->set_type_of_numbers(NumericType::SCHAR); + output_file_format_sptr->set_scale_to_write_data(1); + + return + output_file_format_sptr->write_to_file(output_filename, *density_ptr) == Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; + +} diff --git a/src/utilities/correct_projdata.cxx b/src/utilities/correct_projdata.cxx new file mode 100644 index 0000000000..ec95e5b374 --- /dev/null +++ b/src/utilities/correct_projdata.cxx @@ -0,0 +1,610 @@ +// +// +/* + Copyright (C) 2000- 2013, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + + \brief A utility applying/undoing some corrections on projection data + + This is useful to precorrect projection data. There's also the option to undo + the correction. + + Here's a sample .par file +\verbatim +correct_projdata Parameters := + input file := trues.hs + + ; Current way of specifying time frames, pending modifications to + ; STIR to read time info from the headers + ; see class documentation for stir::TimeFrameDefinitions for the format of this file + ; time frame definition filename := frames.fdef + + ; if a frame definition file is specified, you can say that the input data + ; corresponds to a specific time frame + ; the number should be between 1 and num_frames and defaults to 1 + ; this is currently only used to pass the relevant time to the normalisation + ; time frame number := 1 + + ; output file + ; for future compatibility, do not use an extension in the name of + ; the output file. It will be added automatically + output filename := precorrected + + ; default value for next is -1, meaning 'all segments' + ; maximum absolute segment number to process := + + + ; use data in the input file, or substitute data with all 1's + ; (useful to get correction factors only) + ; default is '1' + ; use data (1) or set to one (0) := + + ; precorrect data, or undo precorrection + ; default is '1' + ; apply (1) or undo (0) correction := + + ; parameters specifying correction factors + ; if no value is given, the corresponding correction will not be performed + + ; random coincidences estimate, subtracted before anything else is done + ;randoms projdata filename := random.hs + ; normalisation (or binwise multiplication, so can contain attenuation factors as well) + Bin Normalisation type := from projdata + Bin Normalisation From ProjData := + normalisation projdata filename:= norm.hs + End Bin Normalisation From ProjData:= + + ; attenuation image, will be forward projected to get attenuation factors + ; OBSOLETE + ;attenuation image filename := attenuation_image.hv + + ; forward projector used to estimate attenuation factors, defaults to Ray Tracing + ; OBSOLETE + ;forward_projector type := Ray Tracing + + ; scatter term to be subtracted AFTER norm+atten correction + ; defaults to 0 + ;scatter projdata filename := scatter.hs + + ; to interpolate to uniform sampling in 's', set value to 1 + ; arc correction := 1 +END:= +\endverbatim + +Time frame definition is only necessary when the normalisation type uses +this time info for dead-time correction. + +\warning arc-correction can currently not be undone. + +The following gives a brief explanation of the non-obvious parameters. + +
            +
          • use data (1) or set to one (0):
            +Use the data in the input file, or substitute data with all 1's. This is useful to get correction factors only. Its value defaults to 1. +
          • +
          • +apply (1) or undo (0) correction:
            +Precorrect data, or undo precorrection. Its value defaults to 1. +
          • +
          • +Bin Normalisation type:
            +Normalisation (or binwise multiplication, so can contain attenuation factors +as well). \see stir::BinNormalisation +
          • +
          • +attenuation image filename: obsolete
            +Specify the attenuation image, which will be forward projected to get +attenuation factors. Has to be in units cm^-1. +This parameter will be removed. Use instead a "chained" bin normalisation +with a bin normalisation "from attenuation image" +\see stir::ChainedBinNormalisation +\see stir::BinNormalisationFromAttenuationImage +
          • +
          • +forward_projector type: obsolete
            +Forward projector used to estimate attenuation factors, defaults to +Ray Tracing. \see stir::ForwardProjectorUsingRayTracing +This parameter will be removed. +
          • +
          + + \author Kris Thielemans + +*/ + +#include "stir/utilities.h" +#include "stir/CPUTimer.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/ProjDataInterfile.h" +#include "stir/RelatedViewgrams.h" +#include "stir/ParsingObject.h" +#include "stir/ArcCorrection.h" +#include "stir/Succeeded.h" +#include "stir/recon_buildblock/TrivialBinNormalisation.h" +#include "stir/recon_buildblock/ChainedBinNormalisation.h" +#include "stir/recon_buildblock/BinNormalisationFromAttenuationImage.h" +#include "stir/TrivialDataSymmetriesForViewSegmentNumbers.h" +#include "stir/ArrayFunction.h" +#include "stir/TimeFrameDefinitions.h" +#ifndef USE_PMRT +#include "stir/recon_buildblock/ForwardProjectorByBinUsingRayTracing.h" +#else +#include "stir/recon_buildblock/ForwardProjectorByBinUsingProjMatrixByBin.h" +#include "stir/recon_buildblock/ProjMatrixByBinUsingRayTracing.h" +#endif +#include "stir/is_null_ptr.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::fstream; +using std::ifstream; +using std::cout; +using std::string; +#endif + +START_NAMESPACE_STIR + + + +// TODO most of this is identical to ReconstructionParameters, so make a common class +/*! \ingroup utilities + \brief class to do precorrections + + \todo Preliminary class interface. At some point, this class should move to the + library, instead of being in correct_projdata.cxx. +*/ +class CorrectProjDataApplication : public ParsingObject +{ +public: + + CorrectProjDataApplication(const char * const par_filename); + + //! set-up variables before processing + Succeeded set_up(); + //! do precorrection + /*! set_up() has to be run first */ + Succeeded run() const; + + // shared_ptrs such that they clean up automatically at exit + shared_ptr input_projdata_ptr; + shared_ptr scatter_projdata_ptr; + shared_ptr randoms_projdata_ptr; + shared_ptr output_projdata_ptr; + shared_ptr normalisation_ptr; + shared_ptr > attenuation_image_ptr; + shared_ptr forward_projector_ptr; + //! apply_or_undo_correction==true means: apply it + bool apply_or_undo_correction; + //! use input data, or replace it with all 1's + /*! use_data_or_set_to_1 == true means: use the data*/ + bool use_data_or_set_to_1; + int max_segment_num_to_process; + int frame_num; + TimeFrameDefinitions frame_defs; + + bool do_arc_correction; +private: + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + string input_filename; + string output_filename; + string scatter_projdata_filename; + string atten_image_filename; + string norm_filename; + string randoms_projdata_filename; + string frame_definition_filename; + + shared_ptr arc_correction_sptr; + +}; + + +Succeeded +CorrectProjDataApplication:: +run() const +{ + ProjData& output_projdata = *output_projdata_ptr; + const ProjData& input_projdata = *input_projdata_ptr; + + const bool do_scatter = !is_null_ptr(scatter_projdata_ptr); + const bool do_randoms = !is_null_ptr(randoms_projdata_ptr); + + + // TODO + shared_ptr + symmetries_ptr( + is_null_ptr(forward_projector_ptr) ? + new TrivialDataSymmetriesForViewSegmentNumbers + : + forward_projector_ptr->get_symmetries_used()->clone() + ); + + for (int segment_num = output_projdata.get_min_segment_num(); segment_num <= output_projdata.get_max_segment_num() ; segment_num++) + { + cerr<is_basic(view_seg_nums)) + continue; + + // ** first fill in the data ** + RelatedViewgrams + viewgrams = input_projdata.get_empty_related_viewgrams(view_seg_nums, + symmetries_ptr); + if (use_data_or_set_to_1) + { + viewgrams += + input_projdata.get_related_viewgrams(view_seg_nums, + symmetries_ptr); + } + else + { + viewgrams.fill(1.F); + } + + if (do_arc_correction && !apply_or_undo_correction) + { + error("Cannot undo arc-correction yet. Sorry."); + // TODO + //arc_correction_sptr->undo_arc_correction(output_viewgrams, viewgrams); + } + + if (do_scatter && !apply_or_undo_correction) + { + viewgrams += + scatter_projdata_ptr->get_related_viewgrams(view_seg_nums, + symmetries_ptr); + } + + if (do_randoms && apply_or_undo_correction) + { + viewgrams -= + randoms_projdata_ptr->get_related_viewgrams(view_seg_nums, + symmetries_ptr); + } +#if 0 + if (frame_num==-1) + { + int num_frames = frame_def.get_num_frames(); + for ( int i = 1; i<=num_frames; i++) + { + //cerr << "Doing frame " << i << endl; + const double start_frame = frame_def.get_start_time(i); + const double end_frame = frame_def.get_end_time(i); + //cerr << "Start time " << start_frame << endl; + //cerr << " End time " << end_frame << endl; + // ** normalisation ** + if (apply_or_undo_correction) + { + normalisation_ptr->apply(viewgrams,start_frame,end_frame); + } + else + { + normalisation_ptr->undo(viewgrams,start_frame,end_frame); + } + } + } + + + + else +#endif + { + const double start_frame = frame_defs.get_start_time(frame_num); + const double end_frame = frame_defs.get_end_time(frame_num); + if (apply_or_undo_correction) + { + normalisation_ptr->apply(viewgrams,start_frame,end_frame); + } + else + { + normalisation_ptr->undo(viewgrams,start_frame,end_frame); + } + } + if (do_scatter && apply_or_undo_correction) + { + viewgrams -= + scatter_projdata_ptr->get_related_viewgrams(view_seg_nums, + symmetries_ptr); + } + + if (do_randoms && !apply_or_undo_correction) + { + viewgrams += + randoms_projdata_ptr->get_related_viewgrams(view_seg_nums, + symmetries_ptr); + } + + if (do_arc_correction && apply_or_undo_correction) + { + viewgrams = arc_correction_sptr->do_arc_correction(viewgrams); + } + + // output + { + // Unfortunately, segment range in output_projdata and input_projdata can be + // different. + // Hence, output_projdata.set_related_viewgrams(viewgrams) would not work. + // So, we need an extra viewgrams object to take this into account. + // The trick relies on calling Array::operator+= instead of + // RelatedViewgrams::operator= + RelatedViewgrams + output_viewgrams = + output_projdata.get_empty_related_viewgrams(view_seg_nums, + symmetries_ptr); + output_viewgrams += viewgrams; + + if (!(output_projdata.set_related_viewgrams(viewgrams) == Succeeded::yes)) + { + warning("CorrectProjData: Error set_related_viewgrams\n"); + return Succeeded::no; + } + } + + } + + } + return Succeeded::yes; +} + + +void +CorrectProjDataApplication:: +set_defaults() +{ + input_projdata_ptr.reset(); + max_segment_num_to_process = -1; + normalisation_ptr.reset(); + use_data_or_set_to_1= true; + apply_or_undo_correction = true; + scatter_projdata_filename = ""; + atten_image_filename = ""; + norm_filename = ""; + normalisation_ptr.reset(new TrivialBinNormalisation); + randoms_projdata_filename = ""; + attenuation_image_ptr.reset(); + frame_num = 1; + frame_definition_filename = ""; + +#ifndef USE_PMRT + forward_projector_ptr.reset(new ForwardProjectorByBinUsingRayTracing); +#else + shared_ptr PM(new ProjMatrixByBinUsingRayTracing); + forward_projector_ptr.reset(new ForwardProjectorByBinUsingProjMatrixByBin(PM)); +#endif + + do_arc_correction= false; +} + +void +CorrectProjDataApplication:: +initialise_keymap() +{ + parser.add_start_key("correct_projdata Parameters"); + parser.add_key("input file",&input_filename); + parser.add_key("time frame definition filename", &frame_definition_filename); + parser.add_key("time frame number", &frame_num); + + parser.add_key("output filename",&output_filename); + parser.add_key("maximum absolute segment number to process", &max_segment_num_to_process); + + parser.add_key("use data (1) or set to one (0)", &use_data_or_set_to_1); + parser.add_key("apply (1) or undo (0) correction", &apply_or_undo_correction); + parser.add_parsing_key("Bin Normalisation type", &normalisation_ptr); + parser.add_key("randoms projdata filename", &randoms_projdata_filename); + parser.add_key("attenuation image filename", &atten_image_filename); + parser.add_parsing_key("forward projector type", &forward_projector_ptr); + parser.add_key("scatter_projdata_filename", &scatter_projdata_filename); + parser.add_key("arc correction", &do_arc_correction); + parser.add_stop_key("END"); +} + + +bool +CorrectProjDataApplication:: +post_processing() +{ + if (is_null_ptr(normalisation_ptr)) + { + warning("Invalid normalisation object\n"); + return true; + } + + // read time frame def + if (frame_definition_filename.size()!=0) + frame_defs = TimeFrameDefinitions(frame_definition_filename); + else + { + // make a single frame starting from 0 to 1. + vector > frame_times(1, pair(0,1)); + frame_defs = TimeFrameDefinitions(frame_times); + } + + if (frame_num<=0) + { + warning("frame_num should be >= 1 \n"); + return true; + } + + if (static_cast(frame_num)> frame_defs.get_num_frames()) + { + warning("frame_num is %d, but should be less than the number of frames %d.\n", + frame_num, frame_defs.get_num_frames()); + return true; + } + input_projdata_ptr = ProjData::read_from_file(input_filename); + + if (scatter_projdata_filename!="" && scatter_projdata_filename != "0") + scatter_projdata_ptr = ProjData::read_from_file(scatter_projdata_filename); + + if (randoms_projdata_filename!="" && randoms_projdata_filename != "0") + randoms_projdata_ptr = ProjData::read_from_file(randoms_projdata_filename); + + return false; +} + +Succeeded +CorrectProjDataApplication:: +set_up() +{ + const int max_segment_num_available = + input_projdata_ptr->get_max_segment_num(); + if (max_segment_num_to_process<0 || + max_segment_num_to_process > max_segment_num_available) + max_segment_num_to_process = max_segment_num_available; + shared_ptr + input_proj_data_info_sptr(input_projdata_ptr->get_proj_data_info_ptr()->clone()); + shared_ptr output_proj_data_info_sptr; + + if (!do_arc_correction) + output_proj_data_info_sptr = input_proj_data_info_sptr; + else + { + arc_correction_sptr = + shared_ptr(new ArcCorrection); + arc_correction_sptr->set_up(input_proj_data_info_sptr); + output_proj_data_info_sptr = + arc_correction_sptr->get_arc_corrected_proj_data_info_sptr(); + } + output_proj_data_info_sptr->reduce_segment_range(-max_segment_num_to_process, + max_segment_num_to_process); + + // construct output_projdata + { +#if 0 + // attempt to do mult-frame data, but then we should have different input data anyway + if (frame_definition_filename.size()!=0 && frame_num==-1) + { + const int num_frames = frame_defs.get_num_frames(); + for ( int current_frame = 1; current_frame <= num_frames; current_frame++) + { + char ext[50]; + sprintf(ext, "_f%dg1b0d0", current_frame); + const string output_filename_with_ext = output_filename + ext; + output_projdata_ptr = new ProjDataInterfile(input_projdata_ptr->get_exam_info_sptr(), + output_proj_data_info_sptr,output_filename_with_ext); + } + } + else +#endif + { + string output_filename_with_ext = output_filename; +#if 0 + if (frame_definition_filename.size()!=0) + { + char ext[50]; + sprintf(ext, "_f%dg1b0d0", frame_num); + output_filename_with_ext += ext; + } +#endif + output_projdata_ptr.reset(new ProjDataInterfile(input_projdata_ptr->get_exam_info_sptr(), + output_proj_data_info_sptr,output_filename_with_ext)); + } + + } + + // read attenuation image and add it to the normalisation object + if(atten_image_filename!="0" && atten_image_filename!="") + { + + shared_ptr atten_sptr + (new BinNormalisationFromAttenuationImage(atten_image_filename, + forward_projector_ptr)); + + normalisation_ptr = + shared_ptr + ( new ChainedBinNormalisation(normalisation_ptr, + atten_sptr)); + } + else + { + // get rid of this object for now + // this is currently checked to find the symmetries: bad + // TODO + forward_projector_ptr.reset(); + } + + // set up normalisation object + if ( + normalisation_ptr->set_up(input_proj_data_info_sptr) + != Succeeded::yes) + { + warning("correct_projdata: set-up of normalisation failed\n"); + return Succeeded::no; + } + + return Succeeded::yes; + +} + +CorrectProjDataApplication:: +CorrectProjDataApplication(const char * const par_filename) +{ + set_defaults(); + if (par_filename!=0) + parse(par_filename) ; + else + ask_parameters(); + +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int main(int argc, char *argv[]) +{ + + if(argc!=2) + { + cerr<<"Usage: " << argv[0] << " par_file\n" + << endl; + } + CorrectProjDataApplication correct_proj_data_application( argc==2 ? argv[1] : 0); + + if (argc!=2) + { + cerr << "Corresponding .par file input \n" + << correct_proj_data_application.parameter_info() << endl; + } + + + CPUTimer timer; + timer.start(); + + if (correct_proj_data_application.set_up() == Succeeded::no) + return EXIT_FAILURE; + + Succeeded success = + correct_proj_data_application.run(); + timer.stop(); + cerr << "CPU time : " << timer.value() << "secs" << endl; + return success==Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; + +} diff --git a/src/utilities/create_projdata_template.cxx b/src/utilities/create_projdata_template.cxx new file mode 100644 index 0000000000..650616bd3f --- /dev/null +++ b/src/utilities/create_projdata_template.cxx @@ -0,0 +1,68 @@ +/*! + \file + \ingroup utilities + + \brief A utility that creates a template projection data. + \par Usage + \verbatim + create_projdata_template output_filename + \endverbatim + This will ask questions to the user about the scanner, the data size, + etc. It will then output new projection data (in Interfile format). + However, the binary file will not contain any data. + + This utility is mainly useful to create a template that can then + be used for other STIR utilities (such as fwdtest, lm_to_projdata etc.). + + \author Kris Thielemans +*/ +/* + Copyright (C) 2004, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/ProjDataInterfile.h" +#include "stir/ImagingModality.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfo.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + + +USING_NAMESPACE_STIR + +int main(int argc, char *argv[]) +{ + + if(argc!=2) + { + cerr<<"Usage: " << argv[0] << " output_filename\n"; + return EXIT_FAILURE; + } + + + shared_ptr proj_data_info_ptr(ProjDataInfo::ask_parameters()); + + const string output_file_name = argv[1]; + shared_ptr exam_info_sptr(new ExamInfo); + // TODO, Currently all stir::Scanner types are PET. + exam_info_sptr->imaging_modality = ImagingModality::PT; + shared_ptr proj_data_ptr(new ProjDataInterfile(exam_info_sptr, proj_data_info_ptr, output_file_name)); + + return EXIT_SUCCESS; +} diff --git a/src/utilities/display_projdata.cxx b/src/utilities/display_projdata.cxx new file mode 100644 index 0000000000..f7f378f03f --- /dev/null +++ b/src/utilities/display_projdata.cxx @@ -0,0 +1,79 @@ +// +// +/*! + \file + \ingroup utilities + + \brief This program displays projection data by segment + + \author Kris Thielemans + \author PARAPET project + +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/ProjData.h" +#include "stir/Sinogram.h" +#include "stir/SegmentByView.h" +#include "stir/SegmentBySinogram.h" + +#include "stir/display.h" +#include "stir/utilities.h" + + +#ifndef STIR_NO_NAMESPACES +using std::cout; +#endif + +USING_NAMESPACE_STIR + + +int main(int argc, char *argv[]) +{ + if(argc<2) { + cout<<"Usage: display_projdata
          (*.hs)\n"; + exit(EXIT_FAILURE); + } + + + + shared_ptr s3d = ProjData::read_from_file(argv[1]); + + do { + int segment_num = ask_num("Which segment number do you want to display", + s3d->get_min_segment_num(), s3d->get_max_segment_num(), 0); + + if(ask_num("Display as SegmentByView (0) or BySinogram (1)?", 0,1,0)==0) + { + SegmentByView segment= s3d->get_segment_by_view(segment_num); + const float maxi = + ask_num("Maximum in color scale (default is actual max)",0.F,2*segment.find_max(),segment.find_max()); + display(segment,maxi); + } + else + { + SegmentBySinogram segment = s3d->get_segment_by_sinogram(segment_num); + const float maxi = + ask_num("Maximum in color scale (default is actual max)",0.F,2*segment.find_max(),segment.find_max()); + display(segment,maxi); + } + } + while (ask("Display another segment ?",true)); + + return EXIT_SUCCESS; +} diff --git a/src/utilities/do_linear_regression.cxx b/src/utilities/do_linear_regression.cxx new file mode 100644 index 0000000000..d21f9f523c --- /dev/null +++ b/src/utilities/do_linear_regression.cxx @@ -0,0 +1,138 @@ +// +// +/*! + \file + \ingroup utilities + + \brief + A simple programme to perform weighted least squares. + + \author Kris Thielemans + \author PARAPET project + + + This performs a weighted least squares fit.
          + stdev and covariance are computed using the estimated + variance chi_square/(n-2). + + The file should contain data in the following format:
          + number_of_points
          + coordinates
          + data
          + weights +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/linear_regression.h" +#include "stir/VectorWithOffset.h" + +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cout; +using std::cerr; +using std::endl; +using std::ifstream; +#endif + +USING_NAMESPACE_STIR + + +int main(int argc, char **argv) +{ + + if (argc != 2) + { + cerr << "Usage : " << argv[0] << " filename\n" + << "This performs a weighted least squares fit.\n" + << "stdev and covariance are computed using the estimated " + << "variance chi_square/(n-2).\n\n" + << "The file should contain data in the following format:\n\n" + << "number_of_points\n" + << "coordinates\n" + << "data\n" + << "weights\n" << endl; + return EXIT_FAILURE; + } + + + + ifstream in(argv[1]); + if (!in) + { + cerr << argv[0] + << ": Error opening input file " << argv[1] << "\nExiting." + << endl; + return EXIT_FAILURE; + } + + int size; + in >> size; + + VectorWithOffset coordinates(size); + VectorWithOffset measured_data(size); + VectorWithOffset weights(size); + for (int i=0; i> coordinates[i]; + if (!in) + error("%s: error reading input file %s after the %d-th coordinate\n", + argv[0], argv[1], i); + } + for (int i=0; i> measured_data[i]; + if (!in) + error("%s: error reading input file %s after the %d-th measured_data\n", + argv[0], argv[1], i); + } + for (int i=0; i> weights[i]; + if (!in) + error("%s: error reading input file %s after the %d-th weight\n", + argv[0], argv[1], i); + } + + double scale=0; + double constant=0; + double variance_of_scale=0; + double variance_of_constant=0; + double covariance_of_constant_with_scale=0; + double chi_square = 0; + + linear_regression( + constant, scale, + chi_square, + variance_of_constant, + variance_of_scale, + covariance_of_constant_with_scale, + measured_data, + coordinates, + weights); + + cout << "scale = " << scale << " +- " << sqrt(variance_of_scale) + << ", cst = " << constant << " +- " << sqrt(variance_of_constant) + << "\nchi_square = " << chi_square + << "\ncovariance = " << covariance_of_constant_with_scale + << endl; + return EXIT_SUCCESS; +} + diff --git a/src/utilities/ecat/CMakeLists.txt b/src/utilities/ecat/CMakeLists.txt new file mode 100644 index 0000000000..bc7da310e5 --- /dev/null +++ b/src/utilities/ecat/CMakeLists.txt @@ -0,0 +1,16 @@ +# +# +set(dir utilities/ecat) + +set(dir_EXE_SOURCES ${dir}_EXE_SOURCES) + +set(${dir_EXE_SOURCES} + is_ecat7_file copy_ecat7_header + ifheaders_for_ecat7 conv_to_ecat7 print_ecat_singles_values + convecat6_if + conv_to_ecat6 + ecat_swap_corners +) + + +include(stir_exe_targets) diff --git a/src/utilities/ecat/conv_to_ecat6.cxx b/src/utilities/ecat/conv_to_ecat6.cxx new file mode 100644 index 0000000000..63710322bc --- /dev/null +++ b/src/utilities/ecat/conv_to_ecat6.cxx @@ -0,0 +1,319 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! +\file +\ingroup ECAT_utilities +\brief Conversion from interfile (or any format that we can read) + to ECAT 6 cti (image and sinogram data) +\author Kris Thielemans +\author PARAPET project + +This programme is used to convert image or projection data into CTI ECAT 6 data (input +can be any format currently supported by the library). It normally should be run as +follows +
          conv_to_ecat6 [-k] [-i]  outputfilename.img input_filename1 [input_filename2 ...] scanner_name
          +
          +(for images) +
          conv_to_ecat6 -s[2] [-k] [-i] outputfilename.scn input_filename1 [input_filename2 ...]
          +
          +(for projection data)
          +If there are no command line parameters, the user is asked for the filenames and options +instead. Unless the -i option is used, the data will be assigned a frame number in the +order that they occur on the command line.
          +See buildblock/Scanner.cxx for supported scanner names, but examples are ECAT 953, +ART, Advance. ECAT HR+, etc. If the scanner_name contains a space, the scanner name has to +be surrounded by double quotes (") when used as a command line argument. + +\par Command line options: +
            +
          • -s2: This option forces output to 2D sinograms (ignoring higher segments).
          • +
          • -k: the existing ECAT6 file will NOT be overwritten, but added to. Any existing +data in the ECAT6 file with the same <frame,gate,data,bed> specification will be +overwritten.
          • +
          • -i: ask for <frame,gate,data,bed> for each dataset
          • +
          +Note that to store projection data in ECAT6, a 3D sinogram cannot be axially compressed +(CTI span=1). + +*/ + + +#include "stir/DiscretisedDensity.h" +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +#include "stir/utilities.h" +#include "stir/IO/stir_ecat6.h" +#include "stir/IO/ecat6_utils.h" +#include "stir/IO/read_from_file.h" +#include "stir/Succeeded.h" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::cout; +using std::endl; +using std::vector; +using std::string; +using std::size_t; +#endif + +USING_NAMESPACE_STIR +USING_NAMESPACE_ECAT +USING_NAMESPACE_ECAT6 + + +int main(int argc, char *argv[]) +{ + char cti_name[1000], scanner_name[1000] = ""; + vector filenames; + bool its_an_image = true; + bool its_a_2D_sinogram = false; + bool add_to_existing = false; + bool interactive = false; + + if(argc>=4) + { + if (strncmp(argv[1],"-s",2)==0) + { + its_an_image = false; + its_a_2D_sinogram = strlen(argv[1])==3 && argv[1][2]=='2'; + if (its_a_2D_sinogram) + cout << "I will write 2D sinograms\n"; + + while (argv[2][0] == '-') + { + if (strcmp(argv[2],"-k")==0) + add_to_existing = true; + else if (strcmp(argv[2],"-i")==0) + interactive = true; + else + warning("Ignored unrecognised option: %s.", argv[2]); + + argv++; argc--; + } + strcpy(cti_name,argv[2]); + int num_files = argc-3; + argv+=3; + filenames.reserve(num_files); + for (; num_files>0; --num_files, ++argv) + filenames.push_back(*argv); + } + else + { + its_an_image = true; + strcpy(cti_name,argv[1]); + int num_files = argc-3; + argv+=2; + filenames.reserve(num_files); + for (; num_files>0; --num_files, ++argv) + filenames.push_back(*argv); + strcpy(scanner_name,*argv); + } + } + else + { + cerr<< "\nConversion from data to ECAT6 CTI.\n" + << "Multiples files can be written to a single ECAT 6 file.\n" + << "Unless the -i option is used, the data will be assigned a frame number in \n" + << "the order that they occur on the command line.\n\n" + << "Usage: 2 possible forms depending on data type\n" + << "For sinogram data:\n" + << "\tconv_to_ecat6 -s[2] [-k] [-i] output_ECAT6_name orig_filename1 [orig_filename2 ...]\n" + << "\tThe -s2 option forces output to 2D sinograms (ignoring higher segments).\n" + << "For image data:\n" + << "\tconv_to_ecat6 [-k] [-i] output_ECAT6_name orig_filename1 [orig_filename2 ...] scanner_name\n" + << "scanner_name has to be recognised by the Scanner class\n" + << "Examples are : \"ECAT 953\", \"RPT\" etc.\n" + << "(the quotes are required when used as a command line argument)\n\n" + << "Options:\n" + << " -k: the existing ECAT6 file will NOT be overwritten,\n" + << "\tbut added to. Any existing data in the ECAT6 file with the same \n" + << "\tspecification will be overwritten.\n" + << " -i: ask for for each dataset\n\n" + << "I will now ask you the same info interactively...\n\n"; + + its_an_image = ask("Converting images?",true); + if (!its_an_image) + its_a_2D_sinogram = ask("Write as 2D sinogram?",false); + + int num_files = ask_num("Number of files",1,10000,1); + filenames.reserve(num_files); + char cur_name[max_filename_length]; + for (; num_files>0; --num_files) + { + ask_filename_with_extension(cur_name,"Name of the input file? ",its_an_image?".hv":".hs"); + filenames.push_back(cur_name); + } + + ask_filename_with_extension(cti_name,"Name of the ECAT6 file? ", + its_an_image ? ".img" : ".scn"); + } + + size_t num_frames, num_gates, num_bed_poss, num_data; + if (interactive) + { + num_frames = ask_num("Num frames?",static_cast(1),filenames.size(), filenames.size()); + num_gates = ask_num("Num gates?",static_cast(1),filenames.size()/num_frames, filenames.size()/num_frames); + num_bed_poss = ask_num("Num bed positions?",static_cast(1),filenames.size(), filenames.size()); + num_data = ask_num("Num data?",static_cast(1),filenames.size()/num_frames, filenames.size()/num_frames); + } + else + { + num_frames = filenames.size(); + num_gates=1; + num_bed_poss=1; + num_data=1; + } + size_t min_frame_num = 1; + size_t max_frame_num = num_frames; + size_t min_bed_num = 0; + size_t max_bed_num = num_bed_poss-1; + size_t min_gate_num = 1; + size_t max_gate_num = num_gates; + size_t min_data_num = 0; + + if (its_an_image) + { + + shared_ptr scanner_ptr( + strlen(scanner_name)==0 ? + Scanner::ask_parameters() : + Scanner::get_scanner_from_name(scanner_name)); + + // read first image + cerr << "Reading " << filenames[0] << endl; + shared_ptr > + density_ptr(read_from_file >(filenames[0])); + + ECAT6_Main_header mhead; + make_ECAT6_Main_header(mhead, *scanner_ptr, filenames[0], *density_ptr); + mhead.num_frames = filenames.size(); + + FILE *fptr= cti_create (cti_name, &mhead); + if (fptr == NULL) + { + warning("conv_to_ecat6: error opening output file %s\n", cti_name); + return EXIT_FAILURE; + } + size_t frame_num = 1; + + while (1) + { + if (DiscretisedDensity_to_ECAT6(fptr, + *density_ptr, + mhead, + frame_num) + == Succeeded::no) + { + fclose(fptr); + return EXIT_FAILURE; + } + if (++frame_num > filenames.size()) + { + fclose(fptr); + return EXIT_SUCCESS; + } + cerr << "Reading " << filenames[frame_num-1] << endl; + density_ptr = + read_from_file >(filenames[frame_num-1]); + } + } + else + { + + // read first data set + cerr << "Reading " << filenames[0] << endl; + shared_ptr proj_data_ptr = + ProjData::read_from_file(filenames[0]); + + ECAT6_Main_header mhead; + FILE *fptr; + + if (add_to_existing) + { + fptr = fopen(cti_name,"wb+"); + if (!fptr) + error("Error opening cti file %s\n", cti_name); + if (cti_read_ECAT6_Main_header (fptr, &mhead) == EXIT_FAILURE) + error("Error reading main header from cti file %s\n", cti_name); + } + else + { + make_ECAT6_Main_header(mhead, filenames[0], *proj_data_ptr->get_proj_data_info_ptr()); + mhead.num_frames = num_frames; + mhead.num_gates = num_gates; + mhead.num_bed_pos = num_bed_poss-1; + //mhead.num_data = num_data; + + fptr = cti_create (cti_name, &mhead); + if (fptr == NULL) + { + warning("conv_to_ecat6: error opening output file %s\n", cti_name); + return EXIT_FAILURE; + } + } + size_t frame_num = 1; + + while (1) + { + size_t current_frame_num, current_bed_num, current_gate_num, current_data_num; + if (interactive) + { + current_frame_num= + ask_num("Frame number ? ", min_frame_num, max_frame_num, min_frame_num); + current_bed_num= + ask_num("Bed number ? ", min_bed_num, max_bed_num, min_bed_num); + current_gate_num= + ask_num("Gate number ? ", min_gate_num, max_gate_num, min_gate_num); + current_data_num= + ask_num("Data number ? ",0,7, 0); + } + else + { + current_frame_num = frame_num; + current_bed_num = min_bed_num; + current_gate_num = min_gate_num; + current_data_num = min_data_num; + } + if (ProjData_to_ECAT6(fptr, + *proj_data_ptr, + mhead, + current_frame_num, current_gate_num, current_data_num, current_bed_num, + its_a_2D_sinogram) + == Succeeded::no) + { + fclose(fptr); + return EXIT_FAILURE; + } + if (++frame_num > filenames.size()) + { + fclose(fptr); + return EXIT_SUCCESS; + } + cerr << "Reading " << filenames[frame_num-1] << endl; + proj_data_ptr = + ProjData::read_from_file(filenames[frame_num-1]); + } + } +} + + diff --git a/src/utilities/ecat/conv_to_ecat7.cxx b/src/utilities/ecat/conv_to_ecat7.cxx new file mode 100644 index 0000000000..61f8300445 --- /dev/null +++ b/src/utilities/ecat/conv_to_ecat7.cxx @@ -0,0 +1,314 @@ +/*! +\file +\ingroup ECAT_utilities +\brief Conversion from interfile (or any format that we can read) + to ECAT 7 cti (image and sinogram data) +\author Kris Thielemans +\author PARAPET project + + +This programme is used to convert image or projection data into CTI ECAT 7 data (input +can be any format currently supported by the library). It normally should be run as +follows +
          conv_to_ecat7 output_ECAT7_name input_filename1 [input_filename2 ...] scanner_name
          +
          +(for images) +
          conv_to_ecat7 -s output_ECAT7_name  input_filename1 [input_filename2 ...]
          +
          +(for emission projection data) +
          conv_to_ecat7 -a output_ECAT7_name  input_filename1 [input_filename2 ...]
          +
          +(for sinogram-attenuation data)
          +If there are no command line parameters, the user is asked for the filenames and options +instead. The data will be assigned a frame number in the +order that they occur on the command line.
          +See buildblock/Scanner.cxx for supported scanner names, but examples are ECAT 953, +ART, Advance. ECAT HR+, etc. If the scanner_name contains a space, the scanner name has to +be surrounded by double quotes (") when used as a command line argument. +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009, Hammersmith Imanet Ltd + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#ifdef HAVE_LLN_MATRIX + +#include "stir/DiscretisedDensity.h" +#include "stir/ProjData.h" +#include "stir/shared_ptr.h" +#include "stir/utilities.h" +#include "stir/Succeeded.h" +#include "stir/IO/stir_ecat7.h" +#include "stir/IO/read_from_file.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::vector; +using std::string; +#endif + +USING_NAMESPACE_STIR +USING_NAMESPACE_ECAT +USING_NAMESPACE_ECAT7 + + + + +void usage() { + + cerr << "\nConversion from data to ECAT7 CTI.\n" + << "Multiples files can be written to a single ECAT 7 file.\n" + << "The data will be assigned a frame number in the " + << "order that they occur on the command line.\n\n" + << "Usage: 3 possible forms depending on data type\n" + << "For sinogram data:\n" + << "\tconv_to_ecat7 -s [-n] output_ECAT7_name orig_filename1 [orig_filename2 ...]\n" + << "For sinogram-attenuation data:\n" + << "\tconv_to_ecat7 -a [-n] output_ECAT7_name orig_filename1 [orig_filename2 ...]\n" + << "For image data:\n" + << "\tconv_to_ecat7 output_ECAT7_name orig_filename1 [orig_filename2 ...] scanner_name\n" + << "scanner_name has to be recognised by the Scanner class\n" + << "Examples are : \"ECAT 953\", \"RPT\" etc.\n" + << "(the quotes are required when used as a command line argument)\n\n"; +} + + + + + + +int main(int argc, char *argv[]) +{ + char cti_name[1000], scanner_name[1000] = ""; + vector filenames; + bool its_an_image = true; + bool write_as_attenuation = false; + float scale_factor = 0.0; + + + int arg_index = 1; + + /* Check options - single letters only */ + while ( arg_index < argc && argv[arg_index][0] == '-' ) { + + int i = 1; + char c; + + while ( (c = argv[arg_index][i]) != '\0' ) { + + switch ( c ) { + + case 's': + its_an_image = false; + break; + + case 'a': + its_an_image = false; + write_as_attenuation = true; + break; + + case 'n': + scale_factor = 1.0F; + break; + + default: + cerr << "Error: Unknown option " << c << " \n\n"; + usage(); + exit(0); + break; + + } + + i++; + } + + arg_index++; + } + + + + + /* Check number of remaining arguments */ + if ( (its_an_image == false && argc - arg_index >= 1) || argc - arg_index >= 2) { + + // Warn about scaling option on it's own. + if ( its_an_image == true && scale_factor != 0.0F ) { + cerr << "Warning: option -n has no effect when converting images.\n\n"; + } + + + /* Parse remaining arguments */ + strcpy(cti_name, argv[arg_index]); + arg_index++; + + + int num_files; + + if ( its_an_image ) { + + for (num_files = argc - arg_index - 1; num_files > 0; --num_files, arg_index++) { + filenames.push_back(argv[arg_index]); + } + + strcpy(scanner_name, argv[arg_index]); + + } else { + + for (num_files = argc - arg_index; num_files>0; --num_files, arg_index++) { + filenames.push_back(argv[arg_index]); + } + } + + } else { + + usage(); + + cerr << "I will now ask you the same info interactively...\n\n"; + + its_an_image = ask("Converting images?",true); + + if (!its_an_image) { + write_as_attenuation = ask("Write as attenuation data?",false); + } else { + if ( ask("Fix scale factor to 1.0?", false) ) { + scale_factor = 1.0F; + } + } + + int num_files = ask_num("Number of files",1,10000,1); + filenames.reserve(num_files); + char cur_name[max_filename_length]; + for (; num_files>0; --num_files) + { + ask_filename_with_extension(cur_name,"Name of the input file? ",its_an_image?".hv":".hs"); + filenames.push_back(cur_name); + } + + ask_filename_with_extension(cti_name,"Name of the ECAT7 file? ", + its_an_image ? ".img" : ".scn"); + + } + + + + if (its_an_image) + { + + shared_ptr scanner_ptr( + strlen(scanner_name)==0 ? + Scanner::ask_parameters() : + Scanner::get_scanner_from_name(scanner_name)); + + // read first image + cerr << "Reading " << filenames[0] << endl; + shared_ptr > density_ptr( + read_from_file >(filenames[0])); + + Main_header mhead; + make_ECAT7_main_header(mhead, *scanner_ptr, filenames[0], *density_ptr); + mhead.num_frames = filenames.size(); + mhead.acquisition_type = + mhead.num_frames>1 ? DynamicEmission : StaticEmission; + + MatrixFile* mptr= matrix_create (cti_name, MAT_CREATE, &mhead); + if (mptr == 0) + { + warning(boost::format("conv_to_ecat7: error opening output file %s. Remove first if it exists already") % cti_name); + return EXIT_FAILURE; + } + unsigned int frame_num = 1; + + while (1) + { + if (DiscretisedDensity_to_ECAT7(mptr, + *density_ptr, + frame_num) + == Succeeded::no) + { + matrix_close(mptr); + return EXIT_FAILURE; + } + if (++frame_num > filenames.size()) + { + matrix_close(mptr); + return EXIT_SUCCESS; + } + cerr << "Reading " << filenames[frame_num-1] << endl; + density_ptr = + read_from_file >(filenames[frame_num-1]); + } + } + else + { + + // read first data set + cerr << "Reading " << filenames[0] << endl; + shared_ptr proj_data_ptr = + ProjData::read_from_file(filenames[0]); + + Main_header mhead; + // TODO exam_info currently used from the first frame, which means that time frame info is incorrect + // better to use DynamicProjData etc. + make_ECAT7_main_header(mhead, filenames[0], + *proj_data_ptr->get_exam_info_ptr(), + *proj_data_ptr->get_proj_data_info_ptr(), + write_as_attenuation, + NumericType::SHORT); + // fix time frame info + mhead.num_frames = filenames.size(); + if (!write_as_attenuation) + { + mhead.acquisition_type = + mhead.num_frames>1 ? DynamicEmission : StaticEmission; + } + MatrixFile* mptr= matrix_create (cti_name, MAT_CREATE, &mhead); + if (mptr == 0) + { + warning(boost::format("conv_to_ecat7: error opening output file %s. Remove first if it exists already") % cti_name); + return EXIT_FAILURE; + } + + unsigned int frame_num = 1; + + while (1) + { + if (ProjData_to_ECAT7(mptr, *proj_data_ptr, + frame_num, 1, 0, 0, scale_factor) == Succeeded::no) + { + matrix_close(mptr); + return EXIT_FAILURE; + } + if (++frame_num > filenames.size()) + { + matrix_close(mptr); + return EXIT_SUCCESS; + } + cerr << "Reading " << filenames[frame_num-1] << endl; + proj_data_ptr = + ProjData::read_from_file(filenames[frame_num-1]); + } + } +} + + +#endif + diff --git a/src/utilities/ecat/convecat6_if.cxx b/src/utilities/ecat/convecat6_if.cxx new file mode 100644 index 0000000000..417bc4b464 --- /dev/null +++ b/src/utilities/ecat/convecat6_if.cxx @@ -0,0 +1,240 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009, Hammersmith Imanet Ltd + Copyright 2011 - 2011, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup ECAT_utilities + \brief Conversion from ECAT 6 cti to interfile (image and sinogram data) + \author Kris Thielemans + \author Damien Sauge + \author Sanida Mustafovic + \author PARAPET project + + \par Usage: +
          convecat6_if [output_file_name_without_extension cti_data_file_name [scanner_name]]
          +  
          + The optional \a scanner_name can be used to force to a particular scanner + (ignoring the system_type in the main header). + \a scanner_name has to be recognised by the Scanner class. + Examples are : ECAT 953, RPT, ECAT HR+, Advance etc. If the \a scanner_name + contains a space, the scanner name has to be surrounded by double quotes + (") when used as a command line argument. +
          + The program asks if all frames should be written or not. If so, all + sinograms/images are converted for a fixed 'data' number. For each data set, + a suffix is added to the output_filename of the form "_f#g#b#d#" where the # + are replaced by the corresponding number of the frame, gate, bed, data. + + \warning CTI ECAT files seem to have a peculiarity that frames and gates are + numbered from 1, while bed positions are numbered from 0. Similarly, the number + of bed positions in the main header seems to be 1 less than the actual number + present. This is at least the case for single bed studies. If this is not true + for multi-bed studies, the code would have to be adapted. + \warning Most of the data in the ECAT 6 headers is ignored (except dimensions) + \warning Data are multiplied with the subheader.scale_factor, In addition, for + emission sinograms, the data are multiplied with subheader.loss_correction_fctr + (unless the loss correction factor is < 0, in which case it is assumed to be 1). + \warning Currently, the decay correction factor is ignored. + + \todo This could easily be used to convert to other file formats. For images, + this simply involves changing the OutputFileFormat. For projection data, + we would have to extend OutputFileFormat to handle projection data. +*/ + + +#include "stir/utilities.h" +#include "stir/IO/InterfileOutputFileFormat.h" +#include "stir/shared_ptr.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IO/stir_ecat6.h" +#include "stir/IO/ecat6_utils.h" +#include "stir/Scanner.h" +#include "stir/Succeeded.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::cout; +using std::endl; +using std::min; +using std::max; +#endif + + + +USING_NAMESPACE_STIR +USING_NAMESPACE_ECAT +USING_NAMESPACE_ECAT6 + +int +main(int argc, char *argv[]) +{ + std::string cti_name; + std::string out_name; + char * scanner_name_ptr = 0; + FILE *cti_fptr; + + if(argc==3 || argc==4) + { + cti_name = argv[2]; + out_name = argv[1]; + if (argc>3) + scanner_name_ptr = argv[3]; + } + else + { + cerr<<"\nConversion from ECAT6 CTI data to interfile.\n"; + cerr<<"Usage: convecat6_if [output_file_name_without_extension cti_data_file_name [scanner_name]]\n" + <<"The optional scanner_name can be used to force to a particular scanner" + <<" (ignoring the system_type in the main header).\n" + << "scanner_name has to be recognised by the Scanner class\n" + << "Examples are : \"ECAT 953\", \"RPT\" etc.\n" + << "(the quotes are required when used as a command line argument)\n" + << endl; + + if (argc!=1) + exit(EXIT_FAILURE); + + out_name = ask_filename_with_extension("Name of the output file? (.hv/.hs and .v/.s will be added)",""); + cti_name = ask_filename_with_extension("Name of the input data file? ",".scn"); + + } + + + // open input file, read main header + cti_fptr=fopen(cti_name.c_str(), "rb"); + if(!cti_fptr) { + error("Error opening input file: %s",cti_name.c_str()); + } + ECAT6_Main_header mhead; + if(cti_read_ECAT6_Main_header(cti_fptr, &mhead)!=EXIT_SUCCESS) { + error("Unable to read main header in file: %s",cti_name.c_str()); + } + + if (scanner_name_ptr != 0) + { + // force scanner + shared_ptr scanner_ptr( + Scanner::get_scanner_from_name(scanner_name_ptr)); + mhead.system_type = find_ECAT_system_type(*scanner_ptr); + } + + // funnily enough, num_bed_pos seems to be offset with 1 + // (That's to say, in a singled bed study, num_bed_pos==0) + // TODO maybe not true for multi-bed studies + const int num_frames = max(static_cast( mhead.num_frames),1); + const int num_bed_poss = max(static_cast( mhead.num_bed_pos) + 1,1); + const int num_gates = max(static_cast( mhead.num_gates),1); + + + int min_frame_num = 1; + int max_frame_num = num_frames; + int min_bed_num = 0; + int max_bed_num = num_bed_poss-1; + int min_gate_num = 1; + int max_gate_num = num_gates; + int data_num = 0; + bool do_all = true; + + if (ask("Attempt all data-sets (Y) or single data-set (N)", true)) + { + data_num=ask_num("Data number ? ",0,8, 0); + + cout << "Processing frames " << min_frame_num << '-' << max_frame_num + << ", gates " << min_gate_num << '-' << max_gate_num + << ", bed positions " << min_bed_num << '-' << max_bed_num + << endl; + } + else + { + do_all = false; + min_frame_num= max_frame_num= + ask_num("Frame number ? ", min_frame_num, max_frame_num, min_frame_num); + min_bed_num= max_bed_num= + ask_num("Bed number ? ", min_bed_num, max_bed_num, min_bed_num); + min_gate_num= max_gate_num= + ask_num("Gate number ? ", min_gate_num, max_gate_num, min_gate_num); + data_num= + ask_num("Data number ? ",0,7, 0); + } + + switch(mhead.file_type) + { + case matImageFile: + { + char *new_out_filename = new char[out_name.size()+100]; + for (int frame_num=min_frame_num; frame_num<=max_frame_num;++frame_num) + for (int bed_num=min_bed_num; bed_num<=max_bed_num;++bed_num) + for (int gate_num=min_gate_num; gate_num<=max_gate_num;++gate_num) + { + strcpy(new_out_filename, out_name.c_str()); + if (do_all) + sprintf(new_out_filename+strlen(new_out_filename), "_f%dg%db%dd%d", + frame_num, gate_num, bed_num, data_num); + cout << "Writing " << new_out_filename << endl; + shared_ptr > image_ptr( + ECAT6_to_VoxelsOnCartesianGrid(frame_num, gate_num, data_num, bed_num, + cti_fptr, mhead)); + InterfileOutputFileFormat output_file_format; + output_file_format.write_to_file(new_out_filename,*image_ptr); + } + delete[] new_out_filename; + break; + } + case matScanFile: + case matAttenFile: + case matNormFile: + { + const int max_ring_diff= + ask_num("Max ring diff to store (-1 == num_rings-1)",-1,100,-1); + + const bool arccorrected = + ask("Consider the data to be arc-corrected?",false); + + char *new_out_filename = new char[out_name.size()+100]; + for (int frame_num=min_frame_num; frame_num<=max_frame_num;++frame_num) + for (int bed_num=min_bed_num; bed_num<=max_bed_num;++bed_num) + for (int gate_num=min_gate_num; gate_num<=max_gate_num;++gate_num) + { + strcpy(new_out_filename, out_name.c_str()); + if (do_all) + sprintf(new_out_filename+strlen(new_out_filename), "_f%dg%db%dd%d", + frame_num, gate_num, bed_num, data_num); + cout << "Writing " << new_out_filename << endl; + ECAT6_to_PDFS(frame_num, gate_num, data_num, bed_num, + max_ring_diff, arccorrected, + new_out_filename, cti_fptr, mhead); + } + delete[] new_out_filename; + break; + } + default: + { + error("\nSupporting only image, scan, atten or norm file type at the moment. Sorry.\n"); + } + } + fclose(cti_fptr); + + return EXIT_SUCCESS; +} diff --git a/src/utilities/ecat/copy_ecat7_header.cxx b/src/utilities/ecat/copy_ecat7_header.cxx new file mode 100644 index 0000000000..fa6d94792b --- /dev/null +++ b/src/utilities/ecat/copy_ecat7_header.cxx @@ -0,0 +1,652 @@ +// +// +/* + Copyright (C) 2002 - 2009, Hammersmith Imanet Ltd + Copyright 2011 - 2012, Kris Thielemans + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 + Lesser GNU General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! +\file +\ingroup utilities +\ingroup ECAT +\brief Copy contents of an ECAT7 header from 1 file to another + +\par Usage + +To copy the main header: +\verbatim + copy_ecat7_header [--copy] output_ECAT7_name input_ECAT7_name +\endverbatim +without --copy, num_planes etc are preserved. + +To copy a subheader (but keeping essential info) +\verbatim + copy_ecat7_header output_ECAT7_name f,g,d,b input_ECAT7_name f,g,d,b +\endverbatim + +\author Kris Thielemans +*/ + + +#include "stir/Succeeded.h" +#include "stir/utilities.h" +#include "stir/IO/stir_ecat7.h" + +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::cout; +using std::string; +using std::ostream; +#endif + +USING_NAMESPACE_STIR +USING_NAMESPACE_ECAT +USING_NAMESPACE_ECAT7 +#define STIR_DO_IT(x) out_sh.x =in_sh.x; + +void copy_subheader(Image_subheader& out_sh, const Image_subheader& in_sh) +{ + /* + short data_type; + short num_dimensions; + short x_dimension; + short y_dimension; + short z_dimension; + short align_0; + float z_offset; + float x_offset; + float y_offset; + float scale_factor; + short image_min; + short image_max; + float x_pixel_size; + float y_pixel_size; + float z_pixel_size; + short align_1; + short align_2; + short align_3; + */ + if (out_sh.recon_zoom==0) + { + warning("Copying recon_zoom from template as original zoom is 0. I didn't check the pixel sizes though"); + STIR_DO_IT(recon_zoom); + } + else + { + if (fabs(in_sh.recon_zoom - out_sh.recon_zoom)<.05) + warning("recon_zoom field in template (%g) and output (%g) is different.\n" + "Keeping original value for zoom (%g) (also keeping the original voxel sizes)", + out_sh.recon_zoom, in_sh.recon_zoom, in_sh.recon_zoom); + } + + STIR_DO_IT(frame_duration); + STIR_DO_IT(frame_start_time); + STIR_DO_IT(filter_code); + STIR_DO_IT(num_r_elements); + STIR_DO_IT(num_angles); + STIR_DO_IT(z_rotation_angle); + STIR_DO_IT(decay_corr_fctr); + STIR_DO_IT(processing_code); + STIR_DO_IT(gate_duration); + STIR_DO_IT(r_wave_offset); + STIR_DO_IT(num_accepted_beats); + STIR_DO_IT(filter_cutoff_frequency); + STIR_DO_IT(filter_resolution); + STIR_DO_IT(filter_ramp_slope); + STIR_DO_IT(filter_order); + STIR_DO_IT(filter_scatter_fraction); + STIR_DO_IT(filter_scatter_slope); + //STIR_DO_IT(x_resolution); + //STIR_DO_IT(y_resolution); + //STIR_DO_IT(z_resolution); + for (int i=0; i<40; ++i) + STIR_DO_IT(annotation[i]); + STIR_DO_IT(mt_1_1); + STIR_DO_IT(mt_1_2); + STIR_DO_IT(mt_1_3); + STIR_DO_IT(mt_2_1); + STIR_DO_IT(mt_2_2); + STIR_DO_IT(mt_2_3); + STIR_DO_IT(mt_3_1); + STIR_DO_IT(mt_3_2); + STIR_DO_IT(mt_3_3); + STIR_DO_IT(rfilter_cutoff); + STIR_DO_IT(rfilter_resolution); + STIR_DO_IT(rfilter_code); + STIR_DO_IT(rfilter_order); + STIR_DO_IT(zfilter_cutoff); + STIR_DO_IT(zfilter_resolution); + STIR_DO_IT(zfilter_code); + STIR_DO_IT(zfilter_order); + STIR_DO_IT(mt_1_4); + STIR_DO_IT(mt_2_4); + STIR_DO_IT(mt_3_4); + STIR_DO_IT(scatter_type); + STIR_DO_IT(recon_type); + STIR_DO_IT(recon_views); +} + + +void copy_subheader(Image_subheader& out_sh, const Scan3D_subheader& in_sh) +{ + warning("Copying only timing and gating info from scan to image subheader\n"); + /* + short data_type; + short num_dimensions; + short x_dimension; + short y_dimension; + short z_dimension; + short align_0; + float z_offset; + float x_offset; + float y_offset; + float scale_factor; + short image_min; + short image_max; + float x_pixel_size; + float y_pixel_size; + float z_pixel_size; + short align_1; + float x_resolution; + float y_resolution; + float z_resolution; + short align_2; + short align_3; + + // if (out_sh.recon_zoom==0) + { + warning("Filling in recon_zoom as well\n"); + STIR_DO_IT(recon_zoom); + } +#if 0 + else + { + warning("Keeping recon_zoom\n"); + } +#endif + STIR_DO_IT(filter_code); + STIR_DO_IT(z_rotation_angle); + STIR_DO_IT(processing_code); + STIR_DO_IT(filter_cutoff_frequency); + STIR_DO_IT(filter_resolution); + STIR_DO_IT(filter_ramp_slope); + STIR_DO_IT(filter_order); + STIR_DO_IT(filter_scatter_fraction); + STIR_DO_IT(filter_scatter_slope); + for (int i=0; i<40; ++i) + STIR_DO_IT(annotation[i]); + STIR_DO_IT(mt_1_1); + STIR_DO_IT(mt_1_2); + STIR_DO_IT(mt_1_3); + STIR_DO_IT(mt_2_1); + STIR_DO_IT(mt_2_2); + STIR_DO_IT(mt_2_3); + STIR_DO_IT(mt_3_1); + STIR_DO_IT(mt_3_2); + STIR_DO_IT(mt_3_3); + STIR_DO_IT(rfilter_cutoff); + STIR_DO_IT(rfilter_resolution); + STIR_DO_IT(rfilter_code); + STIR_DO_IT(rfilter_order); + STIR_DO_IT(zfilter_cutoff); + STIR_DO_IT(zfilter_resolution); + STIR_DO_IT(zfilter_code); + STIR_DO_IT(zfilter_order); + STIR_DO_IT(mt_1_4); + STIR_DO_IT(mt_2_4); + STIR_DO_IT(mt_3_4); + STIR_DO_IT(scatter_type); + STIR_DO_IT(recon_type); + STIR_DO_IT(recon_views); + STIR_DO_IT(decay_corr_fctr); +*/ + STIR_DO_IT(frame_duration); + STIR_DO_IT(frame_start_time); + STIR_DO_IT(num_r_elements); + STIR_DO_IT(num_angles); + STIR_DO_IT(gate_duration); + STIR_DO_IT(r_wave_offset); + STIR_DO_IT(num_accepted_beats); +} + +void copy_subheader(Scan3D_subheader& out_sh, const Scan3D_subheader& in_sh) +{ + /* + short data_type; + short num_dimensions; + short num_r_elements; + short num_angles; + short num_z_elements[64]; + short ring_difference; + short storage_order; + short axial_compression; + float x_resolution; + float v_resolution; + float z_resolution; + float w_resolution; + float scale_factor; + short scan_min; + short scan_max; +*/ + + STIR_DO_IT(frame_start_time); + STIR_DO_IT(frame_duration); + STIR_DO_IT(prompts); + STIR_DO_IT(net_trues); + STIR_DO_IT(delayed); + STIR_DO_IT(multiples); + STIR_DO_IT(tot_avg_cor); + STIR_DO_IT(tot_avg_uncor); + STIR_DO_IT(loss_correction_fctr); + STIR_DO_IT(corrections_applied); + STIR_DO_IT(gate_duration); + STIR_DO_IT(r_wave_offset); + STIR_DO_IT(num_accepted_beats); + STIR_DO_IT(total_coin_rate); + for (int i=0; i<128; ++i) + STIR_DO_IT(uncor_singles[i]); +} + +void copy_subheader(Attn_subheader& out_sh, const Attn_subheader& in_sh) +{ + /* + short data_type; + short num_dimensions; + short num_r_elements; + short num_angles; + short num_z_elements; + short ring_difference; + float scale_factor; + short z_elements[64]; + */ + //STIR_DO_IT(x_resolution); + //STIR_DO_IT(y_resolution); + //STIR_DO_IT(z_resolution); + //STIR_DO_IT(w_resolution); + STIR_DO_IT(x_offset); + STIR_DO_IT(y_offset); + STIR_DO_IT(x_radius); + STIR_DO_IT(y_radius); + STIR_DO_IT(tilt_angle); + STIR_DO_IT(attenuation_coeff); + STIR_DO_IT(attenuation_type); + STIR_DO_IT(attenuation_min); + STIR_DO_IT(attenuation_max); + STIR_DO_IT(skull_thickness); + STIR_DO_IT(num_additional_atten_coeff); + STIR_DO_IT(edge_finding_threshold); + for (int i=0; i<8; ++i) + STIR_DO_IT(additional_atten_coeff[i]); +} + +void copy_subheader(MatrixData * data_out, + const MatrixData * data_in) +{ + MatrixFile *mptr = data_out->matfile; + switch (mptr->mhptr->file_type) + { +#if 0 + case CTISinogram: + copy_subheader( + *reinterpret_cast(data_out->shptr), + *reinterpret_cast(data_in->shptr)); + break; + case Normalization: + copy_subheader( + *reinterpret_cast(data_out->shptr), + *reinterpret_cast(data_in->shptr)); + break; +#endif + case PetImage: + case ByteVolume: + case PetVolume: + { + switch(data_in->matfile->mhptr->file_type) + { + case Byte3dSinogram: + case Short3dSinogram: + case Float3dSinogram : + copy_subheader( + *reinterpret_cast(data_out->shptr), + *reinterpret_cast(data_in->shptr)); + break; + case PetImage: + case ByteVolume: + case PetVolume: + copy_subheader( + *reinterpret_cast(data_out->shptr), + *reinterpret_cast(data_in->shptr)); + break; + default: + error("\ncopy_subheader: cannot copy input subheader to subheader of type image\n"); + } + break; + } + case AttenCor: + copy_subheader( + *reinterpret_cast(data_out->shptr), + *reinterpret_cast(data_in->shptr)); + break; + case Byte3dSinogram: + case Short3dSinogram: + case Float3dSinogram : + copy_subheader( + *reinterpret_cast(data_out->shptr), + *reinterpret_cast(data_in->shptr)); + break; + default: + case ByteProjection: + case PetProjection: + error("copy_subheader: file_type not supported yet\n"); + } +} + +void update_main_header(Main_header& mh_out, const Main_header& mh_in) + { + Main_header mh = mh_in; + mh.num_planes = mh_out.num_planes; + mh.num_frames = mh_out.num_frames; + mh.num_gates = mh_out.num_gates; + mh.num_bed_pos = mh_out.num_bed_pos; + mh.file_type = mh_out.file_type; + + mh_out = mh; + } + +Succeeded +copy_main_header(MatrixFile * mout_ptr, MatrixFile *min_ptr) + { + update_main_header(*mout_ptr->mhptr, *min_ptr->mhptr); + + if (mat_write_main_header(mout_ptr->fptr, mout_ptr->mhptr)) + return Succeeded::no; + else + return Succeeded::yes; + } + +class ECAT_dataset_spec +{ +public: +ECAT_dataset_spec(); +ECAT_dataset_spec(const char *const spec); +ECAT_dataset_spec(const string&); +int matnum() const; +int frame_num; +int plane_num; +int gate_num; +int data_num; +int bed_pos_num; +private: + +void decode_spec(const char * const spec); +void set_defaults(); +}; + +void +ECAT_dataset_spec:: +set_defaults() +{ + frame_num=1; + gate_num=1; + data_num=0; + bed_pos_num=0; +} + +void +ECAT_dataset_spec:: +decode_spec(const char * const spec) +{ + set_defaults(); + sscanf(spec, "%d,%d,%d,%d", + &frame_num, &gate_num, &data_num, &bed_pos_num); +} + +ECAT_dataset_spec:: +ECAT_dataset_spec() +{ + set_defaults(); +} + +ECAT_dataset_spec:: +ECAT_dataset_spec(const char * const spec) +{ + decode_spec(spec); +} + +ECAT_dataset_spec:: +ECAT_dataset_spec(const string& spec) +{ + decode_spec(spec.c_str()); +} + +int +ECAT_dataset_spec:: +matnum() const +{ + return mat_numcod (frame_num, 1, gate_num, data_num, bed_pos_num); +} + +ostream& operator<<(ostream& s, const ECAT_dataset_spec& spec) +{ + s << spec.frame_num << ',' + << spec.gate_num << ',' + << spec.data_num << ',' + << spec.bed_pos_num; + return s; +} + +Succeeded +mat_write_any_subheader( + MatrixData * data) +{ + struct MatDir matdir; + + matrix_errno = MAT_OK; + matrix_errtxt[0] = '\0'; + if (data==NULL) + { + matrix_errno = MAT_READ_FROM_NILFPTR; + return Succeeded::no; + } + + MatrixFile *mptr = data->matfile; + if (mptr == NULL) + { + matrix_errno = MAT_READ_FROM_NILFPTR ; + return Succeeded::no; + } + else if (mptr->mhptr == NULL) matrix_errno = MAT_NOMHD_FILE_OBJECT ; + else if (data->shptr == NULL) matrix_errno = MAT_NIL_SHPTR ; + if (matrix_errno != MAT_OK) return Succeeded::no ; + + if (matrix_find (mptr, data->matnum, &matdir) != 0) + return Succeeded::no; + + const int strtblk = matdir.strtblk; + + int return_value=0; + switch (mptr->mhptr->file_type) + { + case CTISinogram: + return_value = mat_write_scan_subheader (mptr->fptr, mptr->mhptr, strtblk, + reinterpret_cast(data->shptr)); + break; + case PetImage: + case ByteVolume: + case PetVolume: + return_value = mat_write_image_subheader (mptr->fptr, mptr->mhptr, strtblk, + reinterpret_cast(data->shptr)); + break; + case AttenCor: + return_value = mat_write_attn_subheader (mptr->fptr, mptr->mhptr, strtblk, + reinterpret_cast(data->shptr)); + break; + case Normalization: + return_value = mat_write_norm_subheader (mptr->fptr, mptr->mhptr, strtblk, + reinterpret_cast(data->shptr)); + break; + case Byte3dSinogram: + case Short3dSinogram: + case Float3dSinogram : + return_value = mat_write_Scan3D_subheader (mptr->fptr, mptr->mhptr, strtblk, + reinterpret_cast(data->shptr)); + + break; + default: + case ByteProjection: + case PetProjection: + case PolarMap: + case Norm3d: + fprintf (stderr, "Not implemented yet\n"); + matrix_errno = MAT_WRITE_ERROR; + } + if (return_value) + { + matrix_perror("error in writing subheader"); + return Succeeded::no; + } + else + return Succeeded::yes; + +} + + + + +int main(int argc, char *argv[]) +{ + + bool update=true; // switch between update and straight copy + if (argc>1 && strcmp(argv[1], "--copy")==0) + { + update=false; + --argc; ++ argv; + } + + if(argc!=3 && argc!=5) + { + cerr<< "\nCopy contents of ECAT7 headers.\n" + << "Usage: \n" + << "To copy the main header:\n" + << "\t" << argv[0] << " [--copy] output_ECAT7_name input_ECAT7_name\n" + << " without --copy, num_planes etc are preserved.\n" + << "or to copy a subheader (but keeping essential info)\n" + << "\t" << argv[0] << " output_ECAT7_name f,g,d,b input_ECAT7_name f,g,d,b\n\n"; + return EXIT_FAILURE; + } + + const string output_name = argv[1]; + const string input_name = argc==3? argv[2] :argv[3]; + + const bool write_main_header = argc==3; + +#ifndef USE_MATRIX_LIB_FOR_MAINHEADER + if (write_main_header) + { + FILE * in_fptr = fopen(input_name.c_str(), "rb"); + if (!in_fptr) + { + error("Error opening '%s' for reading: %s", + input_name.c_str(), strerror(errno)); + } + FILE * out_fptr = fopen(output_name.c_str(), "rb+"); + if (!out_fptr) + { + error("Error opening '%s' for reading and writing: %s", + output_name.c_str(), strerror(errno)); + } + Main_header mh_in; + if (mat_read_main_header(in_fptr, &mh_in)!=0) + error("Error reading main header from %s", input_name.c_str()); + if (update) + { + Main_header mh_out; + if (mat_read_main_header(out_fptr, &mh_out)!=0) + error("Error reading main header from %s", output_name.c_str()); + update_main_header(mh_out, mh_in); + if (mat_write_main_header(out_fptr, &mh_out)) + error("Error writing main header to %s", output_name.c_str()); + } + else + { + if (mat_write_main_header(out_fptr, &mh_in)) + error("Error writing main header to %s", output_name.c_str()); + } + fclose(in_fptr); + fclose(out_fptr); + return EXIT_SUCCESS; + } +#endif + + MatrixFile *min_ptr= + matrix_open( input_name.c_str(), MAT_READ_ONLY, MAT_UNKNOWN_FTYPE); + if (!min_ptr) { + matrix_perror(input_name.c_str()); + exit(EXIT_FAILURE); + } + MatrixFile *mout_ptr= + matrix_open( output_name.c_str(), MAT_OPEN_EXISTING, MAT_UNKNOWN_FTYPE); + if (!mout_ptr) { + matrix_perror(output_name.c_str()); + exit(EXIT_FAILURE); + } +#ifdef USE_MATRIX_LIB_FOR_MAINHEADER + if (write_main_header) + { + if (copy_main_header(mout_ptr, min_ptr) == Succeeded::no) + return EXIT_FAILURE; + else + return EXIT_SUCCESS; + } +#endif + + assert(!write_main_header); + + const ECAT_dataset_spec out_spec(argv[2]); + const ECAT_dataset_spec in_spec(argv[4]); + cerr << "Attempting to read in '" << in_spec <<"' and out '" + << out_spec << "'" << endl; + MatrixData * mindata_ptr = + matrix_read(min_ptr, in_spec.matnum(), MAT_SUB_HEADER); + if (mindata_ptr == NULL) + { + matrix_perror("Error reading input subheader"); + return EXIT_FAILURE; + } + MatrixData * moutdata_ptr = + matrix_read(mout_ptr, out_spec.matnum(), MAT_SUB_HEADER); + if (moutdata_ptr == NULL) + { + matrix_perror("Error reading output subheader"); + return EXIT_FAILURE; + } + + copy_subheader(moutdata_ptr, mindata_ptr); + if (mat_write_any_subheader(moutdata_ptr) == Succeeded::no) + return EXIT_FAILURE; + + free_matrix_data(moutdata_ptr); + free_matrix_data(mindata_ptr); + matrix_close(mout_ptr); + matrix_close(min_ptr); + return EXIT_SUCCESS; +} diff --git a/src/utilities/ecat/ecat_swap_corners.cxx b/src/utilities/ecat/ecat_swap_corners.cxx new file mode 100644 index 0000000000..567329a062 --- /dev/null +++ b/src/utilities/ecat/ecat_swap_corners.cxx @@ -0,0 +1,253 @@ +/* + Copyright (C) CTI PET Inc + Copyright (C) 2002-2005, Hammersmith Imanet Ltd + + This file is part of STIR. + + The dets_to_ve() and compute_swap_lors_mashed() functions are from CTI, and + come under a somewhat restrictive license. + + The main() function of this file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \ingroup ECAT + \brief A (slightly dangerous) utility to perform so-called corner-swapping + for ECAT6 projection data. + + \author Christian Michel + \author CTI PET Inc + \author Kris Thielemans + + \par Usage + \code + ecat_swap_corners out_name in_name + \endcode + + \par What does it do? + + For some historical reason, CTI scanners store 3D sinograms + sometimes in a 'corner-swapped' mode. What happens is that some + corners of the positive and negative segments are interchanged. + (As a consequence, segment 0 is never affected).

          + + Below is a summary of what Kris Thielemans understood about + corner-swapping from various emails with CTI people. However, he + might have totally misunderstood this, so beware!

          + + Corner-swapped mode occurs ALWAYS for ECAT6 data straight + from the scanner. However, data which have been normalised using + the import_3dscan utility from CTI are already corner-swapped + correctly. Unfortunately, there is no field in the ECAT6 header + that allows you to find out which mode it is in. + + For ECAT7 data, the situation is even more confusing. Data acquired + directly in projection data have to be corner-swapped when the + acquisition was in 'volume-mode' (i.e. stored by sinograms), but + NOT when acquired in 'view-mode' (i.e. stored by view). It seems that + bkproj_3D_sun follows this convention by assuming that any ECAT7 + projection data stored in 'volume-mode' has to be corner swapped, and + when it writes projection data in 'view-mode', it does the corner swapping + for you. + So, although there is strictly speaking no field in the ECAT7 header + concerning corner swapping, it seems that the storage mode field + determines the corner swapping as well. +
          + When the data is acquired in listmode, this changes somewhat. + Apparently, there is a parameter in the set-up of listmode scans + that allows you to put the ACS in 'volume-mode' or 'view-mode'. The + resulting listmode files encode the sinogram coordinates then with + corner-swapping or without. After the acquisition, the listmode data + has then to be binned into projection data. It is then up to the + binning program to take this corner-swapping into account. This is + easiest to do by generating 'volume-mode' projection data when a + 'volume-mode' when the listmode setup was in 'volume-mode', and + similar for 'view-mode'.
          + If this sounds confusing to you, KT would agree. + Here seems to be the best thing to do:

          + Do all acquisitions in 'view-mode', set-up your listmode scan + in 'view-mode', bin the data in 'view-mode'. Forget about + corner-swapping.

          + If you cannot do this, then this utility will corner-swap the + projection data for you. + + \par Who implemented this and how was it tested? + + The actual corner swapping code was supplied by Christian Michel, + based on code by Larry Byars.
          + KT has tested it by performing a very long cylinder scan in + 'volume-mode' on the ECAT 966, and looking at the delayeds. The oblique + segments had obvious discontinuities in the efficiency patterns. + After applyying this utility, these discontinuities appeared. + + \warning This utility does not (and cannot) check for you if the + data has to be corner-swapped or not. So, it can do the wrong thing. + +*/ +#include "stir/ProjDataInterfile.h" +#include "stir/utilities.h" +#include "stir/SegmentBySinogram.h" +#include "stir/Succeeded.h" +#include +#include +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::min; +using std::max; +using std::swap; +#endif + +USING_NAMESPACE_STIR + +static void dets_to_ve( int da, int db, int *v, int *e, int ndets) +{ + int h,x,y,a,b,te; + + h=ndets/2; + x=max(da,db); + y=min(da,db); + a=((x+y+h+1)%ndets)/2; + b=a+h; + te=abs(x-y-h); + if ((ynviews*nmash/2) continue; + nodup = 1; + for (j=0; j0) && (e org_proj_data_ptr = + ProjData::read_from_file(argv[2]); + ProjDataInterfile + new_proj_data(org_proj_data_ptr->get_exam_info_sptr(), + org_proj_data_ptr->get_proj_data_info_ptr()->create_shared_clone(), + argv[1]); + + + const int num_tang_poss = org_proj_data_ptr->get_num_tangential_poss(); + const int min_tang_pos_num = org_proj_data_ptr->get_min_tangential_pos_num(); + const int min_view_num = org_proj_data_ptr->get_min_view_num(); + + const int mash = + org_proj_data_ptr->get_proj_data_info_ptr()->get_scanner_ptr()->get_num_detectors_per_ring() / + org_proj_data_ptr->get_num_views() / 2; + cerr << "Mash factor determined from data is " << mash << endl; + + + int num_swapped = 0; + int *swap_lors = + compute_swap_lors_mashed(org_proj_data_ptr->get_num_tangential_poss(), + org_proj_data_ptr->get_num_views(), + mash, + &num_swapped); + + // first do segment 0 (no swapping) + new_proj_data.set_segment(org_proj_data_ptr->get_segment_by_sinogram(0)); + + // now the rest + for (int segment_num=1; segment_num<=org_proj_data_ptr->get_max_segment_num(); ++segment_num) + { + for (int axial_pos_num=org_proj_data_ptr->get_min_axial_pos_num(segment_num); + axial_pos_num<=org_proj_data_ptr->get_max_axial_pos_num(segment_num); + ++axial_pos_num) + { + Sinogram sino1= + org_proj_data_ptr->get_sinogram(axial_pos_num, segment_num, false); + Sinogram sino2= + org_proj_data_ptr->get_sinogram(axial_pos_num, -segment_num, false); + + for (int i=0; i +#include +#include + +#include +#include +#include + +#include + +#ifndef STIR_NO_NAMESPACES +using std::string; +using std::ios; +using std::iostream; +using std::fstream; +using std::cerr; +using std::endl; +#endif + + +USING_NAMESPACE_STIR +USING_NAMESPACE_ECAT +USING_NAMESPACE_ECAT7 + +int +main( int argc, char **argv) +{ + MatrixFile *mptr; + + if (argc<2) + { + cerr << "usage : "<< argv[0] << " filename\n"; + exit(EXIT_FAILURE); + } + + mptr = matrix_open( argv[1], MAT_READ_ONLY, MAT_UNKNOWN_FTYPE); + if (!mptr) { + matrix_perror(argv[1]); + exit(EXIT_FAILURE); + } + + const int num_frames = std::max(static_cast( mptr->mhptr->num_frames),1); + // funnily enough, num_bed_pos seems to be offset with 1 + // (That's to say, in a singled bed study, num_bed_pos==0) + // TODO maybe not true for multi-bed studies + const int num_bed_poss = static_cast( mptr->mhptr->num_bed_pos) + 1; + const int num_gates = std::max(static_cast( mptr->mhptr->num_gates),1); + + fclose(mptr->fptr); + delete mptr; + + string interfile_header_filename; + if (ask("Attempt all data-sets (Y) or single data-set (N)", true)) + { + const int data_num=ask_num("Data number ? ",0,8, 0); + + for (int frame_num=1; frame_num<=num_frames;++frame_num) + for (int bed_num=0; bed_num1 && argv[1][0] == '-') + { + if (strcmp(argv[1], "--image") == 0) + { + option = opt_image; --argc; ++argv; break; + } + if (strcmp(argv[1], "--emission") == 0) + { + option = opt_emission; --argc; ++argv; break; + } + if (strcmp(argv[1], "--ACF") == 0) + { + option = opt_ACF; --argc; ++argv; break; + } + else + print_usage_and_exit(prog_name); + } + if (argc!=2) + print_usage_and_exit(prog_name); + + const char * filename = argv[1]; + + bool value; + switch (option) + { + case opt_none: value = stir::ecat::ecat7::is_ECAT7_file(filename); break; + case opt_image: value = stir::ecat::ecat7::is_ECAT7_image_file(filename); break; + case opt_emission: value = stir::ecat::ecat7::is_ECAT7_emission_file(filename); break; + case opt_ACF: value = stir::ecat::ecat7::is_ECAT7_attenuation_file(filename); break; + default: value=false; + } + + if (value) + std::cout << "yes\n"; + else + std::cout << "no\n"; + return EXIT_SUCCESS; +} diff --git a/src/utilities/ecat/print_ecat_singles_values.cxx b/src/utilities/ecat/print_ecat_singles_values.cxx new file mode 100644 index 0000000000..e0594fec04 --- /dev/null +++ b/src/utilities/ecat/print_ecat_singles_values.cxx @@ -0,0 +1,129 @@ +/* + Copyright (C) 2004-2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + + \file + \brief Utility program that prints out values from an sgl file. + + \author Kris Thielemans + \author Tim Borgeaud +*/ + + +#include "stir/data/SinglesRatesFromECAT7.h" + + +#include +#include +#include +#include + + +#ifndef STIR_NO_NAMESPACES +using std::cout; +using std::cerr; +using std::endl; +using std::setw; +using std::string; +using std::vector; +#endif + +USING_NAMESPACE_STIR + + + + +int +main (int argc, char **argv) +{ + + vector columns; + + // Check arguments. + // Singles filename + optional bin indices. + if (argc < 2) { + cerr << "Program to print out values from a singles file.\n\n"; + cerr << "Usage: " << argv[0] << " sgl_filename [bin_index ...]\n\n"; + cerr << "If no bin index values are supplied, all bins are output.\n\n"; + exit(EXIT_FAILURE); + } + + const string ecat7_filename = argv[1]; + + for (int arg = 2 ; arg < argc ; ++arg) { + columns.push_back(atoi(argv[arg])); + } + + + // Singles file object. + ecat::ecat7::SinglesRatesFromECAT7 singles_from_ecat7; + + + // Read the singles file. + singles_from_ecat7.read_singles_from_file(ecat7_filename); + + + // Get total number of frames + int num_frames = singles_from_ecat7.get_num_frames(); + + // Get scanner details and, from these, the number of singles units. + const Scanner *scanner = singles_from_ecat7.get_scanner_ptr(); + int total_singles_units = scanner->get_num_singles_units(); + + + // If no columns are set. Create a vector with all columns. + if ( columns.size() == 0 ) { + for (int singles_bin = 0 ; singles_bin < total_singles_units ; ++singles_bin) { + columns.push_back(singles_bin); + } + } + + + // Print columns + cout << "# Frame Frame time "; + for (vector::iterator col = columns.begin() ; col < columns.end() ; ++col) { + cout << setw(9) << *col << " "; + } + cout << "\n"; + + + // Loop over all frames. + for (int frame = 1 ; frame <= num_frames ; ++frame) { + + // Ouput frame number, start and end times. + cout << setw(2) << frame << " " + << setw(8) << singles_from_ecat7.get_time_frame_definitions().get_start_time(frame) << " to " + << setw(8) << singles_from_ecat7.get_time_frame_definitions().get_end_time(frame) << " "; + + for (vector::iterator col = columns.begin() ; col < columns.end() ; ++col) { + + if ( *col >= 0 && *col < total_singles_units ) { + float val = singles_from_ecat7.get_singles_rate(*col, frame); + + cout << setw(9) << val << " "; + } + } + + // Output the end of line. + cout << endl; + + } + + + + return EXIT_SUCCESS; +} diff --git a/src/utilities/exe.mk b/src/utilities/exe.mk new file mode 100644 index 0000000000..021b1b2ca1 --- /dev/null +++ b/src/utilities/exe.mk @@ -0,0 +1,64 @@ +# +# + +dir:=utilities + +$(dir)_SOURCES:=manip_image.cxx \ + stir_write_pgm.cxx \ + manip_projdata.cxx \ + display_projdata.cxx \ + do_linear_regression.cxx \ + postfilter.cxx \ + compare_projdata.cxx \ + compare_image.cxx \ + extract_segments.cxx \ + correct_projdata.cxx \ + stir_math.cxx \ + list_projdata_info.cxx \ + list_image_info.cxx \ + list_image_values.cxx \ + list_detector_and_bin_info.cxx \ + find_maxima_in_image.cxx \ + create_projdata_template.cxx \ + SSRB.cxx \ + poisson_noise.cxx \ + get_time_frame_info.cxx \ + generate_image.cxx \ + list_ROI_values.cxx \ + zoom_image.cxx \ + find_fwhm_in_image.cxx \ + abs_image.cxx \ + convert_to_binary_image.cxx \ + rebin_projdata.cxx \ + write_proj_matrix_by_bin.cxx \ + forward_project.cxx \ + back_project.cxx \ + calculate_attenuation_coefficients.cxx \ + attenuation_coefficients_to_projections.cxx \ + conv_GATE_raw_ECAT_projdata_to_interfile.cxx \ + conv_gipl_to_interfile.cxx \ + conv_interfile_to_gipl.cxx \ + shift_image.cxx \ + shift_image_origin.cxx \ + warp_and_accumulate_gated_images.cxx \ + warp_gated_images.cxx \ + warp_image.cxx \ + apply_RL_deconvolution \ + zeropad_planes.cxx + +ifeq ($(HAVE_AVW),1) + $(dir)_SOURCES += conv_AVW.cxx +endif + +${DEST}$(dir)/poisson_noise: ${DEST}$(dir)/poisson_noise$(O_SUFFIX) \ + $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$@ $< \ + $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + +${DEST}$(dir)/conv_AVW: ${DEST}$(dir)/conv_AVW$(O_SUFFIX) \ + $(STIR_LIB) + $(LINK) $(EXE_OUTFLAG)$@ $< \ + $(STIR_LIB) $(LINKFLAGS) $(SYS_LIBS) + + +include $(WORKSPACE)/exe.mk diff --git a/src/utilities/extract_segments.cxx b/src/utilities/extract_segments.cxx new file mode 100644 index 0000000000..30f6c1b17a --- /dev/null +++ b/src/utilities/extract_segments.cxx @@ -0,0 +1,101 @@ +// +// +/*! + \file + \ingroup utilities + + \brief This program extracts projection data by segment into 3d + image files + + \author Kris Thielemans + \author PARAPET project + + + This utility extracts projection data by segment into a sequence of + 3d image files. It is mainly useful to import segments into external + image display/manipulation programmes which do not understand 3D-PET + data, but can read Interfile images. +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2008, Hammersmith Imanet Ltd + Copyright (C) 2014, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/ProjData.h" +#include "stir/SegmentByView.h" +#include "stir/SegmentBySinogram.h" +#include "stir/IO/interfile.h" +#include "stir/utilities.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/Bin.h" +#include "boost/format.hpp" + + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +USING_NAMESPACE_STIR + + +int main(int argc, char *argv[]) +{ + if(argc<2) { + cerr<<"Usage: " << argv[0] << " (*.hs)\n"; + exit(EXIT_FAILURE); + } + + char const * const filename = argv[1]; + + shared_ptr s3d = ProjData::read_from_file(filename); + + const bool extract_by_view = + ask_num("Extract as SegmentByView (0) or BySinogram (1)?", 0,1,0)==0; + + for (int segment_num = s3d->get_min_segment_num(); + segment_num <= s3d->get_max_segment_num(); + ++segment_num) + { + string output_filename=filename; + replace_extension(output_filename, ""); + output_filename+="seg"; + output_filename+=boost::str(boost::format("%d") % segment_num); + + Bin central_bin(segment_num,0,0,0); + const float m_spacing = s3d->get_proj_data_info_ptr()->get_sampling_in_m(central_bin); + const float s_spacing = s3d->get_proj_data_info_ptr()->get_sampling_in_s(central_bin); + const float m = s3d->get_proj_data_info_ptr()->get_m(central_bin); + const float s = s3d->get_proj_data_info_ptr()->get_s(central_bin); + + if (extract_by_view) + { + SegmentByView segment= s3d->get_segment_by_view(segment_num); + write_basic_interfile(output_filename + "_by_view.hv", + segment, + CartesianCoordinate3D(1.F, m_spacing, s_spacing), + CartesianCoordinate3D(0.F, m, s)); + } + else { + SegmentBySinogram segment = s3d->get_segment_by_sinogram(segment_num); + write_basic_interfile(output_filename + "_by_sino.hv", + segment, + CartesianCoordinate3D(m_spacing, 1.F, s_spacing), + CartesianCoordinate3D(m, 0.F, s)); + } + } + + return EXIT_SUCCESS; +} diff --git a/src/utilities/find_fwhm_in_image.cxx b/src/utilities/find_fwhm_in_image.cxx new file mode 100644 index 0000000000..3d889071d7 --- /dev/null +++ b/src/utilities/find_fwhm_in_image.cxx @@ -0,0 +1,147 @@ +/* + Copyright (C) 2004 - 2011-12-31, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \brief List of FWHM and location of maximum in the image + + \author Charalampos Tsoumpas + \author Kris Thielemans + \author Sanida Mustafovic + + \par Usage: + \code + find_fwhm_in_image filename [num_maxima] [level] [dimension] [nema] + \endcode + \param num_maxima defaults to 1 + \param level defaults to 2 (half maximum) + \param dimension: + for point sources (default) set to 0 + for line source along z, y, x -axis, + set to: 1, 2, 3 respectively + \param NEMA defaults to 1 + + + If you have point sources, it prints the value of the [num_maxima] maximum point source with its location + and the resolution at the three dimensions, sorting from the maximum to the minimum. If you have a line + source, a text file is returned that it contains the maximum value at its one slice, which is sorted from + the mimimum to maximum slice index, at the wanted direction, with its location and the resolution at the + three dimensions. The resolution at the axis of the line is set to be 0. If given as [num_maxima] less + than the total slices it returns the results for some slices by sampling with the same step the total + slices of the wanted dimension. The [nema] parameter enables the oportunity of using the NEMA Standards + Publication NU 2-2001. If it is set to 0 the function estimates the FWHM using 3D interpolation, for + closer approximation. +*/ +#include "stir/shared_ptr.h" +#include "stir/DiscretisedDensity.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/find_fwhm_in_image.h" +#include "stir/IO/read_from_file.h" +#include +#include +#include +#include +#include +#include +#ifndef STIR_NO_NAMESPACES +using std::setw; +#endif + +/***********************************************************/ +int main(int argc, char *argv[]) +{ + USING_NAMESPACE_STIR + if (argc< 2 || argc>6) + { + std::cerr << "Usage:" << argv[0] << " input_image [num_maxima] [level] [dimension] [nema]\n" + << "\tnum_maxima defaults to 1\n" + << "\tlevel of maximum defaults at half maximum: 2\n" + << "\tfor point sources dimension set to 0 (default)\n" + << "\tfor line source along z, y, x -axis dimension set to 1, 2, 3 respectively:\n" + << "\tnema defaults to 1, NEMA Standards NU 2-2001 is enabled\n" + << "returns a file containing the resolutions\n\n"; + + return EXIT_FAILURE; + } + const unsigned short num_maxima = argc>=3 ? atoi(argv[2]) : 1 ; + const float level = argc>=4 ? static_cast(atof(argv[3])) : 2 ; + const int dimension = argc>=5 ? atoi(argv[4]) : 0 ; + const bool nema = argc>=6 ? (atoi(argv[5])!=0) : true ; + std::cerr << "Finding " << num_maxima << " maxima\n" ; + shared_ptr< DiscretisedDensity<3,float> > + input_image_sptr(read_from_file >(argv[1])); + DiscretisedDensity<3,float>& input_image = *input_image_sptr; + std::list > list_res_index = + find_fwhm_in_image(input_image,num_maxima,level,dimension,nema); + std::list >:: iterator current_iter=list_res_index.begin(); + if (dimension!=0) + { + std::string output_string; + std::string input_string(argv[1]); + std::string slices_string(argv[2]); + std::string:: iterator string_iter; + for(string_iter=input_string.begin(); + string_iter!=input_string.end() && *string_iter!='.' ; + ++string_iter) + output_string.push_back(*string_iter); + if (argc>=4) + { + std::string level_string(argv[3]); + output_string += '_' + slices_string + "_slices_FW" + level_string + 'M' ; + } + else + output_string += '_' + slices_string + "_slices_FWHM" ; + + std::ofstream out(output_string.c_str()); //output file // + if(!out) + { + std::cerr << "Cannot open text file.\n" ; + return EXIT_FAILURE; + } + out << "Slice\t Z\tY\t X\tResZ(mm) ResY(mm) ResX(mm) Value\n"; + for (short counter=0 ; counter!=num_maxima ; ++counter) + { + out << setw(3) << counter+1 << "\t" + << setw(3) << current_iter->voxel_location[1] << "\t" + << setw(3) << current_iter->voxel_location[2] << "\t" + << setw(3) << current_iter->voxel_location[3] << "\t" + << setw(6) << current_iter->resolution[1]<< "\t" + << setw(6) << current_iter->resolution[2]<< "\t" + << setw(6) << current_iter->resolution[3]<< "\t" + << setw(9) << current_iter->voxel_value << "\n" ; + ++current_iter; + } + out.close(); + } + else + for (short counter=0 ; counter!=num_maxima ; ++counter) + { + std::cout << counter+1 << ". max: " << setw(6) << current_iter->voxel_value + << " at: " << setw(3) << current_iter->voxel_location[1] + << " (Z) ," << setw(3) << current_iter->voxel_location[2] + << " (Y) ," << setw(3) << current_iter->voxel_location[3] << " (X) \n" ; + std::cout << " \n The resolution in z axis is " + << setw(6) << (current_iter->resolution[1]) + << ", \n The resolution in y axis is " + << setw(6) << (current_iter->resolution[2]) + << ", \n The resolution in x axis is " + << setw(6) << (current_iter->resolution[3]) + << ", in mm relative to origin. \n \n"; + ++current_iter; + } + return EXIT_SUCCESS; +} diff --git a/src/utilities/find_maxima_in_image.cxx b/src/utilities/find_maxima_in_image.cxx new file mode 100644 index 0000000000..55cf6083c3 --- /dev/null +++ b/src/utilities/find_maxima_in_image.cxx @@ -0,0 +1,156 @@ +// +// +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 + Lesser GNU General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \brief List coordinates of maxima in the image to stdout + + If more than 1 maximum is asked for, repeat the following: + + # find the current maximum, and then + # mask the neighbourhood (specified as a box) out + # go to step 1 + + \author Sanida Mustafovic + \author Kris Thielemans + + + \par Usage: + \code + find_maxima_in_image filename [num_maxima [ half_mask_size_xy [half_mask_size z]] ] + \endcode + \param num_maxima defaults to 1 + \param half_mask_size_xy defaults to 1 (giving a 3x3 mask in the plane) + \param half_mask_size_z defaults to \a half_mask_size_xy +*/ +#include "stir/shared_ptr.h" +#include "stir/DiscretisedDensity.h" +#include "stir/DiscretisedDensityOnCartesianGrid.h" +#include "stir/IO/read_from_file.h" + +#include +#include +#include + + +#ifndef STIR_NO_NAMESPACES +using std::endl; +using std::cout; +using std::cerr; +using std::setw; +#endif + +USING_NAMESPACE_STIR + +int main(int argc, char *argv[]) +{ + + if (argc< 2 || argc>5) + { + cerr << "Usage:" << argv[0] << " input_image [num_maxima [ half_mask_size_xy [half_mask_size z]] ]\n" + << "\tnum_maxima defaults to 1\n" + << "\thalf_mask_size_xy defaults to 1\n" + << "\thalf_mask_size_z defaults to half_mask_size_xy" <=3 ? atoi(argv[2]) : 1; + const int mask_size_xy = argc>=4 ? atoi(argv[3]) : 1; + const int mask_size_z = argc>=5 ? atoi(argv[4]) : mask_size_xy; + + cerr << "Finding " << num_maxima << " maxima, each at least \n\t" + << mask_size_xy << " pixels from each other in x,y direction, and\n\t" + << mask_size_z << " pixels from each other in z direction.\n"; + + shared_ptr< DiscretisedDensity<3,float> > + input_image_sptr(read_from_file >(argv[1])); + DiscretisedDensity<3,float>& input_image = *input_image_sptr; + + const float mask_value = std::min(input_image.find_min()-100, -1.E20F); + + for (unsigned int maximum_num=0; maximum_num!=num_maxima; ++ maximum_num) + { + const float current_maximum = input_image.find_max(); + int max_k=0, max_j=0,max_i=0; // initialise to avoid compiler warnings + bool found=false; + { + const int min_k_index = input_image.get_min_index(); + const int max_k_index = input_image.get_max_index(); + for ( int k = min_k_index; k<= max_k_index && !found; ++k) + { + const int min_j_index = input_image[k].get_min_index(); + const int max_j_index = input_image[k].get_max_index(); + for ( int j = min_j_index; j<= max_j_index && !found; ++j) + { + const int min_i_index = input_image[k][j].get_min_index(); + const int max_i_index = input_image[k][j].get_max_index(); + for ( int i = min_i_index; i<= max_i_index && !found; ++i) + { + if ( input_image[k][j][i] == current_maximum) + { + max_k = k; + max_j = j; + max_i = i; + cout << "max: " << setw(6) << current_maximum + << " at: " + << setw(3) << max_k + << ',' << setw(3) << max_j + << ',' << setw(3) << max_i; + { + BasicCoordinate<3,float> phys_coord = + input_image. + get_physical_coordinates_for_indices(make_coordinate(max_k, max_j, max_i)); + cout << " which is " + << setw(6) << phys_coord[1] + << ',' << setw(6) << phys_coord[2] + << ',' << setw(6) < +#include + +static void print_usage_and_exit() +{ + std::cerr<<"\nUsage:\nforward_project output-filename image_to_forward_project template_proj_data_file [forwardprojector-parfile ]\n"; + std::cerr<<"The default projector uses the ray-tracing matrix.\n\n"; + std::cerr<<"Example parameter file:\n\n" + <<"Forward Projector parameters:=\n" + <<" type := Matrix\n" + <<" Forward projector Using Matrix Parameters :=\n" + <<" Matrix type := Ray Tracing\n" + <<" Ray tracing matrix parameters :=\n" + <<" End Ray tracing matrix parameters :=\n" + <<" End Forward Projector Using Matrix Parameters :=\n" + <<"End:=\n"; + + exit(EXIT_FAILURE); +} + + +int +main (int argc, char * argv[]) +{ + using namespace stir; + + if (argc!=4 && argc!=5 ) + print_usage_and_exit(); + + const std::string output_filename = argv[1]; + + shared_ptr > + image_density_sptr(read_from_file >(argv[2])); + + shared_ptr template_proj_data_sptr = + ProjData::read_from_file(argv[3]); + + shared_ptr forw_projector_sptr; + if (argc>=5) + { + KeyParser parser; + parser.add_start_key("Forward Projector parameters"); + parser.add_parsing_key("type", &forw_projector_sptr); + parser.add_stop_key("END"); + parser.parse(argv[4]); + } + else + { + shared_ptr PM(new ProjMatrixByBinUsingRayTracing()); + forw_projector_sptr.reset(new ForwardProjectorByBinUsingProjMatrixByBin(PM)); + } + + forw_projector_sptr->set_up(template_proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone(), + image_density_sptr ); + + ProjDataInterfile output_projdata(template_proj_data_sptr->get_exam_info_sptr(), + template_proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone(), + output_filename); + + forw_projector_sptr->forward_project(output_projdata, *image_density_sptr); + + return EXIT_SUCCESS; +} + diff --git a/src/utilities/generate_image.cxx b/src/utilities/generate_image.cxx new file mode 100644 index 0000000000..8bcefa7a1b --- /dev/null +++ b/src/utilities/generate_image.cxx @@ -0,0 +1,344 @@ +/* + Copyright (C) 2003-2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief A utility to generate images consistening of uniform objects added/subtracted together + + \par Example .par file + \code + generate_image Parameters := + output filename:= somefile + ; optional keyword to specify the output file format + ; example below uses Interfile with 16-bit unsigned integers + output file format type:= Interfile + interfile Output File Format Parameters:= + number format := unsigned integer + number_of_bytes_per_pixel:=2 + ; fix the scale factor to 1 + ; comment out next line to let STIR use the full dynamic + ; range of the output type + scale_to_write_data:= 1 + End Interfile Output File Format Parameters:= + + + X output image size (in pixels):= 13 + Y output image size (in pixels):= 13 + Z output image size (in pixels):= 15 + X voxel size (in mm):= 4 + Y voxel size (in mm):= 4 + Z voxel size (in mm):= 5 + + ; parameters that determine subsampling of border voxels + ; to obtain smooth edges + ; setting these to 1 will just check if the centre of the voxel is in or out + ; default to 5 + Z number of samples to take per voxel := 5 + Y number of samples to take per voxel := 5 + X number of samples to take per voxel := 5 + + ; now starts an enumeration of objects + ; Shape3D hierarchy for possible shapes and their parameters + shape type:= ellipsoidal cylinder + Ellipsoidal Cylinder Parameters:= + radius-x (in mm):= 1 + radius-y (in mm):= 2 + length-z (in mm):= 3 + origin (in mm):= {z,y,x} + END:= + value := 10 + + ; here comes another shape + next shape:= + shape type:= ellipsoid + ; etc + + ; as many shapes as you want + END:= + \endcode + + \warning If the shape is smaller than the voxel-size, or the shape + is at the edge of the image, the current + mechanism of generating the image might miss the shape entirely. + + \warning Does not currently support interactive parsing, so a par file + must be given on the command line. + + \author Kris Thielemans +*/ +#include "stir/Shape/Shape3D.h" +#include "stir/KeyParser.h" +#include "stir/is_null_ptr.h" +#include "stir/CartesianCoordinate3D.h" +#include "stir/IndexRange3D.h" +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include + +START_NAMESPACE_STIR + + +class GenerateImage : public KeyParser +{ +public: + + GenerateImage(const char * const par_filename); + + + Succeeded compute(); +private: + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + vector > shape_ptrs; + shared_ptr current_shape_ptr; + vector values; + float current_value; + string output_filename; + shared_ptr > > + output_file_format_sptr; + + void increment_current_shape_num(); + + int output_image_size_x; + int output_image_size_y; + int output_image_size_z; + float output_voxel_size_x; + float output_voxel_size_y; + float output_voxel_size_z; + + CartesianCoordinate3D num_samples; +}; + + +void GenerateImage:: +increment_current_shape_num() +{ + if (!is_null_ptr( current_shape_ptr)) + { + shape_ptrs.push_back(current_shape_ptr); + values.push_back(current_value); + current_shape_ptr.reset(); + } +} + +void +GenerateImage:: +set_defaults() +{ + output_image_size_x=128; + output_image_size_y=128; + output_image_size_z=1; + output_voxel_size_x=1; + output_voxel_size_y=1; + output_voxel_size_z=1; + num_samples = CartesianCoordinate3D(5,5,5); + shape_ptrs.resize(0); + values.resize(0); + output_filename.resize(0); + output_file_format_sptr = + OutputFileFormat >::default_sptr(); +} + +void +GenerateImage:: +initialise_keymap() +{ + add_start_key("generate_image Parameters"); + add_key("output filename",&output_filename); + add_parsing_key("output file format type",&output_file_format_sptr); + add_key("X output image size (in pixels)",&output_image_size_x); + add_key("Y output image size (in pixels)",&output_image_size_y); + add_key("Z output image size (in pixels)",&output_image_size_z); + add_key("X voxel size (in mm)",&output_voxel_size_x); + add_key("Y voxel size (in mm)",&output_voxel_size_y); + add_key("Z voxel size (in mm)",&output_voxel_size_z); + + add_key("Z number of samples to take per voxel", &num_samples.z()); + add_key("Y number of samples to take per voxel", &num_samples.y()); + add_key("X number of samples to take per voxel", &num_samples.x()); + + add_parsing_key("shape type", ¤t_shape_ptr); + add_key("value", ¤t_value); + add_key("next shape", KeyArgument::NONE, + (KeywordProcessor)&GenerateImage::increment_current_shape_num); + add_stop_key("END"); + +} + + +bool +GenerateImage:: +post_processing() +{ + assert(values.size() == shape_ptrs.size()); + + if (!is_null_ptr( current_shape_ptr)) + { + shape_ptrs.push_back(current_shape_ptr); + values.push_back(current_value); + } + if (output_filename.size()==0) + { + warning("You have to specify an output_filename\n"); + return true; + } + if (is_null_ptr(output_file_format_sptr)) + { + warning("You have specified an invalid output file format\n"); + return true; + } + if (output_image_size_x<=0) + { + warning("X output_image_size should be strictly positive\n"); + return true; + } + if (output_image_size_y<=0) + { + warning("Y output_image_size should be strictly positive\n"); + return true; + } + if (output_image_size_z<=0) + { + warning("Z output_image_size should be strictly positive\n"); + return true; + } + if (output_voxel_size_x<=0) + { + warning("X output_voxel_size should be strictly positive\n"); + return true; + } + if (output_voxel_size_y<=0) + { + warning("Y output_voxel_size should be strictly positive\n"); + return true; + } + if (output_voxel_size_z<=0) + { + warning("Z output_voxel_size should be strictly positive\n"); + return true; + } + if (num_samples.z()<=0) + { + warning("number of samples to take in z-direction should be strictly positive\n"); + return true; + } + if (num_samples.y()<=0) + { + warning("number of samples to take in y-direction should be strictly positive\n"); + return true; + } + if (num_samples.x()<=0) + { + warning("number of samples to take in x-direction should be strictly positive\n"); + return true; + } + return false; +} + +//! \brief parses parameters +/*! \warning Currently does not support interactive input, due to + the use of the 'next shape' keyword. +*/ +GenerateImage:: +GenerateImage(const char * const par_filename) +{ + initialise_keymap(); + set_defaults(); + if (par_filename!=0) + { + if (parse(par_filename) == false) + exit(EXIT_FAILURE); + } + else + ask_parameters(); + +#if 0 + // doesn't work due to problem Shape3D::parameter_info being ambiguous + for (vector >::const_iterator iter = shape_ptrs.begin(); + iter != shape_ptrs.end(); + ++iter) + { + std::cerr << (**iter).parameter_info() << '\n'; + } +#endif + +} + + +Succeeded +GenerateImage:: +compute() +{ +#if 0 + shared_ptr > density_ptr( + read_from_file >(template_filename)); + shared_ptr > out_density_ptr = + density_ptr->clone(); + out_density_ptr->fill(0); + VoxelsOnCartesianGrid current_image = + dynamic_cast& >(*density_ptr); + +#else + VoxelsOnCartesianGrid + current_image(IndexRange3D(0,output_image_size_z-1, + -(output_image_size_y/2), + -(output_image_size_y/2)+output_image_size_y-1, + -(output_image_size_x/2), + -(output_image_size_x/2)+output_image_size_x-1), + CartesianCoordinate3D(0,0,0), + CartesianCoordinate3D(output_voxel_size_z, + output_voxel_size_y, + output_voxel_size_x)); + shared_ptr > out_density_ptr(current_image.clone()); +#endif + std::vector::const_iterator value_iter = values.begin(); + for (std::vector >::const_iterator iter = shape_ptrs.begin(); + iter != shape_ptrs.end(); + ++iter, ++value_iter) + { + std::cerr << "Next shape\n"; //(**iter).parameter_info() << '\n'; + current_image.fill(0); + (**iter).construct_volume(current_image, num_samples); + current_image *= *value_iter; + *out_density_ptr += current_image; + } + return + output_file_format_sptr->write_to_file(output_filename, *out_density_ptr); + +} + +END_NAMESPACE_STIR + +/************************ main ************************/ + +USING_NAMESPACE_STIR +int main(int argc, char * argv[]) +{ + + if ( argc!=2) { + std::cerr << "Usage: " << argv[0] << " par_file\n"; + exit(EXIT_FAILURE); + } + GenerateImage application(argc==2 ? argv[1] : 0); + Succeeded success = application.compute(); + + return success==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/src/utilities/get_time_frame_info.cxx b/src/utilities/get_time_frame_info.cxx new file mode 100644 index 0000000000..bb6fd46037 --- /dev/null +++ b/src/utilities/get_time_frame_info.cxx @@ -0,0 +1,174 @@ +// +// + +/*! + \file + \ingroup utilities + + \brief Prints start time and duration of a frame to stdout + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +#include "stir/TimeFrameDefinitions.h" +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::cout; +#endif + +USING_NAMESPACE_STIR + +void print_usage_and_exit(char const * const prog_name) +{ + cerr << "Usage:\n" << prog_name << " PARAMETERS\n" + << "where PARAMETERS has two possibilities:\n\n" + << "1) print number of time frames\n" + << "\t--num-time-frames Frame_def_filename\n\n" + << "2) print info for one or more time frames\n" + << "\t[--msecs] \\\n" + << "\t[--duration | --start-time | --end-time | --mid-time] \\\n" + << "\tFrame_def_filename start_frame_number [end_frame_number]\n\n" + << "Use the --duration option to get only the frame_duration on stdout,\n" + << "and similarly for --start-time, --mid-time and --end-time.\n" + << "Without these options, both will be printed to stdout, together with some text.\n\n" + << "Times are reported in seconds unless the --msecs option is used.\n\n" + << "end_frame_number defaults to start_frame_number to print just a single frame."<< endl; + exit(EXIT_FAILURE); +} + +int +main(int argc, char* argv[]) +{ + const char * const prog_name = argv[0]; + + bool units_secs = true; + bool only_duration = false; + bool only_start_time = false; + bool only_end_time = false; + bool only_mid_time = false; + bool only_num_time_frames = false; + + while (argc>=2 && argv[1][1]=='-') + { + if (strcmp(argv[1], "--num-time-frames")==0) + { + only_num_time_frames = true; + --argc; ++argv; + } + else + { + if (strcmp(argv[1], "--msecs")==0) + { + units_secs=false; + --argc; ++argv; + } + else if (strcmp(argv[1], "--duration")==0 && !only_start_time && !only_end_time && !only_mid_time) + { + only_duration = true; + --argc; ++argv; + } + else if (strcmp(argv[1], "--start-time")==0 && !only_duration && !only_end_time && !only_mid_time) + { + only_start_time = true; + --argc; ++argv; + } + else if (strcmp(argv[1], "--end-time")==0 && !only_duration && !only_start_time && !only_mid_time) + { + only_end_time = true; + --argc; ++argv; + } + else if (strcmp(argv[1], "--mid-time")==0 && !only_duration && !only_start_time && !only_end_time) + { + only_mid_time = true; + --argc; ++argv; + } + else + print_usage_and_exit(prog_name); + } + } + + // we need at least one argument: the filename + if(argc <2) + print_usage_and_exit(prog_name); + + const TimeFrameDefinitions time_def(argv[1]); + + if (only_num_time_frames) + { + if(argc !=2) + print_usage_and_exit(prog_name); + cout << time_def.get_num_frames() << std::endl; + exit(EXIT_SUCCESS); + } + + // normal case of info for one or more frames + if(argc !=3 && argc!=4) + print_usage_and_exit(prog_name); + const unsigned int start_frame_num = atoi(argv[2]); + const unsigned int end_frame_num = + argc>3 ? atoi(argv[3]) : start_frame_num; + + + for (unsigned frame_num = start_frame_num; frame_num<=end_frame_num; ++frame_num) + { + if (frame_num > time_def.get_num_frames() || frame_num<1) + { + /* Note: we intentionally check this in the loop. + This way, we do get output for valid frames. + */ + warning("frame_num should be between 1 and %d\n", + time_def.get_num_frames()); + exit(EXIT_FAILURE); + } + const double start_frame = time_def.get_start_time(frame_num); + const double end_frame = time_def.get_end_time(frame_num); + const double frame_duration = end_frame-start_frame; + const double mid_frame = (start_frame+end_frame)/2; + + // make sure results never get printed as scientific + // because we pass it on to header_doc/edit_ecat_header + // which expects an int + cout.setf(std::ios::fixed, std::ios::floatfield); + + const int units = units_secs ? 1 : 1000; + const std::string units_string = units_secs ? " secs" : " millisecs"; + if (only_duration) + cout << frame_duration*units << endl; + else if (only_start_time) + cout << start_frame*units << endl; + else if (only_end_time) + cout << end_frame*units << endl; + else if (only_end_time) + cout << end_frame*units << endl; + else if (only_mid_time) + cout << mid_frame*units << endl; + else + cout << "Start of frame " << frame_num << " : " << start_frame*units << units_string + << "\nMiddle of frame " << frame_num << " : " << mid_frame*units << units_string + << "\nEnd of frame " << frame_num << " : " << end_frame*units << units_string + << "\nFrame duration " << frame_num << " : " << frame_duration*units << units_string << endl; + + + } + return EXIT_SUCCESS; +} + diff --git a/src/utilities/list_ROI_values.cxx b/src/utilities/list_ROI_values.cxx new file mode 100644 index 0000000000..a6f5a2fda2 --- /dev/null +++ b/src/utilities/list_ROI_values.cxx @@ -0,0 +1,300 @@ +/* + Copyright (C) 2000 - 2007, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief Utility program for getting ROI values + + The .par file has the following format + \verbatim + ROIValues Parameters := + + ; give the ROI an (optional) name. Defaults to the empty string. + ROI name := some name + ; see Shape3D hierarchy for possible values + ROI Shape type:=ellipsoid + ;; ellipsoid parameters here + + ; if more than 1 ROI is desired, you can do this + next shape := + ROI name := some other name + ROI Shape type:=ellipsoidal cylinder + ;; parameters here + + number of samples to take for ROI template-z:=1 + number of samples to take for ROI template-y:=1 + number of samples to take for ROI template-x:=1 + + ; specify (optional) filter to apply before computing ROI values + ; see ImageProcessor hierarchy for possible values + Image Filter type:=None + End:= + \endverbatim + + \author Kris Thielemans +*/ +#include "stir/utilities.h" +#include "stir/evaluation/compute_ROI_values.h" +#include "stir/Shape/DiscretisedShape3D.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/DataProcessor.h" +#include "stir/KeyParser.h" +#include "stir/is_null_ptr.h" +#include "stir/IO/read_from_file.h" +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::ofstream; +#endif + + +START_NAMESPACE_STIR +//TODO repetition of postfilter.cxx to be able to use its .par file +class ROIValuesParameters : public KeyParser +{ +public: + ROIValuesParameters(); + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + std::vector > shape_ptrs; + std::vector shape_names; + CartesianCoordinate3D num_samples; + shared_ptr > > filter_ptr; +private: + shared_ptr current_shape_sptr; + string current_shape_name; + void increment_current_shape_num(); +}; + +ROIValuesParameters::ROIValuesParameters() +{ + set_defaults(); + initialise_keymap(); +} + +void ROIValuesParameters:: +increment_current_shape_num() +{ + if (!is_null_ptr( current_shape_sptr)) + { + shape_ptrs.push_back(current_shape_sptr); + shape_names.push_back(current_shape_name); + current_shape_sptr.reset(); + current_shape_name = ""; + } +} + +void +ROIValuesParameters:: +set_defaults() +{ + shape_ptrs.resize(0); + shape_names.resize(0); + + filter_ptr.reset(); + current_shape_sptr.reset(); + current_shape_name = ""; + num_samples = CartesianCoordinate3D(1,1,1); +} + +void +ROIValuesParameters:: +initialise_keymap() +{ + add_start_key("ROIValues Parameters"); + add_key("ROI name", ¤t_shape_name); + add_parsing_key("ROI Shape type", ¤t_shape_sptr); + add_key("next shape", KeyArgument::NONE, + (KeywordProcessor)&ROIValuesParameters::increment_current_shape_num); + add_key("number of samples to take for ROI template-z", &num_samples.z()); + add_key("number of samples to take for ROI template-y", &num_samples.y()); + add_key("number of samples to take for ROI template-x", &num_samples.x()); + add_parsing_key("Image Filter type", &filter_ptr); + add_stop_key("END"); +} + +bool +ROIValuesParameters:: +post_processing() +{ + assert(shape_names.size() == shape_ptrs.size()); + + if (!is_null_ptr( current_shape_sptr)) + { + increment_current_shape_num(); + } + if (num_samples.z()<=0) + { + warning("number of samples to take in z-direction should be strictly positive\n"); + return true; + } + if (num_samples.y()<=0) + { + warning("number of samples to take in y-direction should be strictly positive\n"); + return true; + } + if (num_samples.x()<=0) + { + warning("number of samples to take in x-direction should be strictly positive\n"); + return true; + } + return false; +} + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +int +main(int argc, char *argv[]) +{ + bool do_CV=false; + bool do_V=false; + const char * const progname = argv[0]; + + if (argc>1 && strcmp(argv[1],"--CV")==0) + { + do_CV=true; + --argc; ++argv; + } + if (argc>1 && strcmp(argv[1],"--V")==0) + { + do_V=true; + --argc; ++argv; + if(strcmp(argv[1],"--CV")==0) + { + do_CV=true; + --argc;++argv; + } + } + if(argc!=6 && argc!=5 && argc!=4 && argc!=3) + { + cerr<<"\nUsage: " << progname << " \\\n" + << "\t[--CV] [--V] output_filename data_filename [ ROI_filename.par [min_plane_num max_plane_num]]\n"; + cerr << "Normally, only mean and stddev are listed.\n" + << "Use the option --CV to output the Coefficient of Variation as well.\n" + << "Use the option --V to output the Total Volume, as well.\n";; + cerr << "If [min_plane_num] is set to 0 and no [max_plane_num given] then sum of the plane values will be listed.\n"; + cerr << "When ROI_filename.par is not given, the user will be asked for the parameters.\n" + "Use this to see what a .par file should look like.\n."< > + image_ptr(read_from_file >(input_file)); + ROIValuesParameters parameters; + if (argc<4) + parameters.ask_parameters(); + else + { + if (parameters.parse(argv[3]) == false) + exit(EXIT_FAILURE); + } + cerr << "Parameters used (aside from names and ROIs):\n\n" << parameters.parameter_info() << endl; + + + const int min_plane_number = + argc==6 ? atoi(argv[4])-1 : image_ptr->get_min_index(); + const int max_plane_number = + argc==6 ? atoi(argv[5])-1 : image_ptr->get_max_index(); + + const bool by_plane=argc==5 ? (atoi(argv[4])!=0):true ; + + if (parameters.filter_ptr!=0) + parameters.filter_ptr->apply(*image_ptr); + + out << input_file << '\n'; + out << std::setw(15) << "ROI"; + + if(by_plane) + out << std::setw(10) << "Plane_num" ; + out << std::setw(15) << "Mean " + << std::setw(15) << "Stddev"; + if (do_CV) + out << std::setw(15) << "CV"; + if (do_V) + out << std::setw(15) << "Volume"; + out <<'\n'; + { + std::vector >::const_iterator current_shape_iter = + parameters.shape_ptrs.begin(); + std::vector::const_iterator current_name_iter = + parameters.shape_names.begin(); + for (; + current_shape_iter != parameters.shape_ptrs.end(); + ++current_shape_iter, ++current_name_iter) + { + if(by_plane) + { + VectorWithOffset values; + compute_ROI_values_per_plane(values, *image_ptr, **current_shape_iter, parameters.num_samples); + + for (int i=min_plane_number;i<=max_plane_number;i++) + { + out << std::setw(15) << *current_name_iter + << std::setw(10) << i+1 + << std::setw(15) << values[i].get_mean() + << std::setw(15) << values[i].get_stddev(); + if (do_CV) + out << std::setw(15) << values[i].get_CV(); + if (do_V) + out << std::setw(15) << values[i].get_roi_volume(); + out <<'\n'; + } + } + if(!by_plane) + { + ROIValues values; + values=compute_total_ROI_values(*image_ptr, **current_shape_iter, parameters.num_samples); + out << std::setw(15) << *current_name_iter + << std::setw(15) << values.get_mean() + << std::setw(15) << values.get_stddev(); + if (do_CV) + out << std::setw(15) << values.get_CV(); + if (do_V) + out << std::setw(15) << values.get_roi_volume(); + out <<'\n'; + } +#if 0 + for (VectorWithOffset::const_iterator iter = values.begin(); + iter != values.end(); + iter++) + { + std::cout << iter->report(); + } +#endif + } + } + + return EXIT_SUCCESS; +} diff --git a/src/utilities/list_detector_and_bin_info.cxx b/src/utilities/list_detector_and_bin_info.cxx new file mode 100644 index 0000000000..a79ab3e032 --- /dev/null +++ b/src/utilities/list_detector_and_bin_info.cxx @@ -0,0 +1,145 @@ +// +// +/* + Copyright (C) 2011- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief A utility that lists bin and detector info for a given (cylindrical) scanner on stdout. + + \par Usage + + \code + list_detector_and_bin_info scanner_name crystal1 crystal2 ring1 ring2 + \endcode + + This will list various things such as detection coordinates, bins etc to stdout. + This is really only useful for developers who need to get their head round the + STIR conventions. + + Currently bin info is listed for non-arccorrected projection data without any + compression. + + \author Kris Thielemans + +*/ + +#include "stir/ProjDataInfoCylindricalNoArcCorr.h" +#include "stir/LORCoordinates.h" +#include "stir/Bin.h" +#include "stir/Scanner.h" +#include "stir/stream.h" +#include + +USING_NAMESPACE_STIR + +int main(int argc, char *argv[]) +{ + + if(argc!=6) + { + std::cerr<<"Usage: " << argv[0] << " scanner_name crystal1 crystal2 ring1 ring2\n"; + std::cerr<<"\nLists detection and bin info for non-arccorrected projection data without any compression.\n"; + return EXIT_FAILURE; + + } + shared_ptr scanner_sptr(Scanner::get_scanner_from_name(argv[1])); + if (scanner_sptr->get_type() == Scanner::Unknown_scanner) + { + std::cerr << "I did not recognise the scanner\n"; + return (EXIT_FAILURE); + } + + shared_ptr proj_data_info_sptr + (dynamic_cast + ( + ProjDataInfo::ProjDataInfoCTI(scanner_sptr, + 1, scanner_sptr->get_num_rings()-1, + scanner_sptr->get_num_detectors_per_ring()/2, + scanner_sptr->get_default_num_arccorrected_bins(), + false) + )); + + + + { + using std::cout; + + Bin bin; + int det_num_a = atoi(argv[2]); + int det_num_b = atoi(argv[3]); + int ring_a = atoi(argv[4]); + int ring_b = atoi(argv[5]); + + DetectionPositionPair<> det_pos; + LORInAxialAndNoArcCorrSinogramCoordinates lor; + + proj_data_info_sptr->get_bin_for_det_pair (bin, + det_num_a, ring_a, det_num_b, ring_b); + cout << "bin: (segment " << bin.segment_num() << ", axial pos " << bin.axial_pos_num() + << ", view = " << bin.view_num() + << ", tangential_pos_num = " << bin.tangential_pos_num() << ")\n"; + cout << "bin coordinates: (tantheta: " << proj_data_info_sptr->get_tantheta(bin) + << ", m: " << proj_data_info_sptr->get_m(bin) + << ", phi: " << proj_data_info_sptr->get_phi(bin) + << ", s: " << proj_data_info_sptr->get_s(bin) + << ")\n"; + proj_data_info_sptr->get_LOR(lor, bin); + cout << "LOR cylindrical: (z1: " << lor.z1() << ", z2: " << lor.z2() + << ", phi: " << lor.phi() << ", beta: " << lor.beta() << " (= s: " << lor.s() << ")" + << ")\n"; + + LORAs2Points lor_points; + lor.get_intersections_with_cylinder(lor_points, scanner_sptr->get_effective_ring_radius()); + cout << "Detection position Cartesian: " << lor_points.p1() << lor_points.p2() <<'\n'; + + proj_data_info_sptr->get_det_pos_pair_for_bin(det_pos, bin); + cout << "Detection position index " + <<"(c:" << det_pos.pos1().tangential_coord() + << ",r:" << det_pos.pos1().axial_coord() + << ",l:" << det_pos.pos1().radial_coord() + << ")-" + << "(c:" << det_pos.pos2().tangential_coord() + << ",r:" << det_pos.pos2().axial_coord() + << ",l:" << det_pos.pos2().radial_coord() + << ")"; + +#if 0 + { + CartesianCoordinate3D coord_1, coord_2; + proj_data_info_sptr->find_cartesian_coordinates_given_scanner_coordinates (coord_1,coord_2, + ring_a,ring_b, + det_num_a, det_num_b); + const CartesianCoordinate3D + shift(scanner_sptr->get_ring_spacing()*(scanner_sptr->get_num_rings()-1)/2.F, 0.F,0.F); + cout << "\nObsolete function:\n" + << "find_cartesian_coordinates_given_scanner_coordinates (after shift in z)\n" + << coord_1 - shift << coord_2 - shift <<'\n'; + // will give same result as above + proj_data_info_sptr->find_bin_given_cartesian_coordinates_of_detection(bin, coord_1, coord_2); + cout << "bin: (segment " << bin.segment_num() << ", axial pos " << bin.axial_pos_num() + << ", view = " << bin.view_num() + << ", tangential_pos_num = " << bin.tangential_pos_num() << ")\n"; + } +#endif + + cout << '\n'; + } + + return EXIT_SUCCESS; +} diff --git a/src/utilities/list_image_info.cxx b/src/utilities/list_image_info.cxx new file mode 100644 index 0000000000..2114653e6c --- /dev/null +++ b/src/utilities/list_image_info.cxx @@ -0,0 +1,79 @@ +// +// +/* + Copyright (C) 2006- 2012, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief This program lists basic image info + + \author Thielemans + + + \warning It only supports stir::VoxelsOnCartesianGrid type of images. +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/stream.h" +#include "stir/Succeeded.h" + +#include +#include +USING_NAMESPACE_STIR + +int main(int argc, char *argv[]) +{ + if(argc!=2) + { + std::cerr<<"\nUsage: list_image_info image_filename"; + return EXIT_FAILURE; + } + std::auto_ptr >image_aptr = + std::auto_ptr > + (dynamic_cast *>( + DiscretisedDensity<3,float>::read_from_file(argv[1])) + ); + + BasicCoordinate<3,int> min_indices, max_indices; + if (!image_aptr->get_regular_range(min_indices, max_indices)) + error("Non-regular range of coordinates. That's strange.\n"); + + BasicCoordinate<3,float> edge_min_indices(min_indices), edge_max_indices(max_indices); + edge_min_indices-= 0.5F; + edge_max_indices+= 0.5F; + + std::cout << "\nOrigin in mm {z,y,x} :" << image_aptr->get_origin() + << "\nVoxel-size in mm {z,y,x}:" << image_aptr->get_voxel_size() + << "\nMin_indices {z,y,x} :" << min_indices + << "\nMax_indices {z,y,x} :" << max_indices + << "\nNumber of voxels {z,y,x}:" << max_indices - min_indices + 1 + << "\nPhysical coordinate of first index in mm {z,y,x} :" + << image_aptr->get_physical_coordinates_for_indices(min_indices) + << "\nPhysical coordinate of last index in mm {z,y,x} :" + << image_aptr->get_physical_coordinates_for_indices(max_indices) + << "\nPhysical coordinate of first edge in mm {z,y,x} :" + << image_aptr->get_physical_coordinates_for_indices(edge_min_indices) + << "\nPhysical coordinate of last edge in mm {z,y,x} :" + << image_aptr->get_physical_coordinates_for_indices(edge_max_indices) + << "\nImage min: " << image_aptr->find_min() + << "\nImage max: " << image_aptr->find_max() + << "\nImage sum: " << image_aptr->sum() + << std::endl; + + return EXIT_SUCCESS; +} diff --git a/src/utilities/list_image_values.cxx b/src/utilities/list_image_values.cxx new file mode 100644 index 0000000000..b9d5bdd534 --- /dev/null +++ b/src/utilities/list_image_values.cxx @@ -0,0 +1,84 @@ +/* + Copyright (C) 2002- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 + Lesser GNU General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + \brief Utility to extract image values along profiles (or another box-shape) + \author Sanida Mustafovic + \author Kris Thielemans + + \par Usage + \code + list_image_values output_file_name input_image \\ + min_plane max_plane min_col max_col min_row max_row + \endcode + Indices need to be in the STIR convention (plane starts from 0, col,row are centred around 0) + +*/ + +#include "stir/DiscretisedDensity.h" +#include "stir/IO/read_from_file.h" +#include +#include + + + +USING_NAMESPACE_STIR + +int main(int argc, char *argv[]) +{ + + if (argc!= 9) + { + std::cerr << "Usage:\n" << argv[0] << " output_profile_name input_image min_plane max_plane min_col max_col min_row max_row\n"; + return(EXIT_FAILURE); + } + + const char * const output_filename = argv[1]; + const char * const input_filename = argv[2]; + + + shared_ptr > + input_image_sptr(read_from_file >(input_filename)); + const DiscretisedDensity<3,float>& input_image = + *input_image_sptr; + + const int min_plane_num = atoi(argv[3]); + const int max_plane_num = atoi(argv[4]); + const int min_column_num = atoi(argv[5]); + const int max_column_num = atoi(argv[6]); + const int min_row_num = atoi(argv[7]); + const int max_row_num = atoi(argv[8]); + + std::ofstream profile_file(output_filename); + + using std::setw; + profile_file << setw(8) << "plane" << setw(8) << "row" + << setw(8) << "column" << setw(10) << "value" <<'\n'; + + for (int plane = min_plane_num;plane <=max_plane_num;plane++) + for (int row = min_row_num;row <=max_row_num;row++) + for (int column = min_column_num;column<=max_column_num;column++) + { + profile_file << setw(8) << plane << setw(8) << row + << setw(8) << column + << setw(10) << input_image[plane][row][column] << '\n'; + } + + return EXIT_SUCCESS; +} + diff --git a/src/utilities/list_projdata_info.cxx b/src/utilities/list_projdata_info.cxx new file mode 100644 index 0000000000..305d57268d --- /dev/null +++ b/src/utilities/list_projdata_info.cxx @@ -0,0 +1,181 @@ +/* + Copyright (C) 2002 - 2005-06-09, Hammersmith Imanet Ltd + Copyright (C) 2011-07-01 - 2012, Kris Thielemans + Copyright (C) 2013, University College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief A utility that lists size info on the projection data on stdout. + + \par Usage + +

          +  list_projdata_info [--all  | --min | --max | --sum | --geom | --exam] projdata_filename
          +  
          + Add one or more options to print the exam/geometric/min/max/sum information. + If no option is specified, geometric info is printed. + + \author Kris Thielemans +*/ + +#include "stir/ProjData.h" +#include "stir/ExamInfo.h" +#include "stir/ProjDataInfo.h" +#include "stir/SegmentByView.h" +#include "stir/is_null_ptr.h" +#include +#include +#include + +USING_NAMESPACE_STIR + +void print_usage_and_exit(const std::string& program_name) +{ + std::cerr<<"Usage: " << program_name << " [--all | --min | --max | --sum | --geom | --exam] projdata_file\n" + <<"\nAdd one or more options to print the exam/geometric/min/max/sum information.\n" + <<"\nIf no option is specified, geometric info is printed.\n"; + exit(EXIT_FAILURE); +} + +int main(int argc, char *argv[]) +{ + const char * const program_name = argv[0]; + // skip program name + --argc; + ++argv; + + // default values + bool print_exam = false; + bool print_geom = false; + bool print_min = false; + bool print_max = false; + bool print_sum = false; + bool no_options = true; // need this for default behaviour + + // first process command line options + while (argc>0 && argv[0][0]=='-' && argc>=2) + { + no_options=false; + if (strcmp(argv[0], "--all")==0) + { + print_min = print_max = print_sum = print_geom = print_exam = true; + --argc; ++argv; + } + else if (strcmp(argv[0], "--max")==0) + { + print_max = true; + --argc; ++argv; + } + else if (strcmp(argv[0], "--min")==0) + { + print_min = true; + --argc; ++argv; + } + else if (strcmp(argv[0], "--sum")==0) + { + print_sum = true; + --argc; ++argv; + } + else if (strcmp(argv[0], "--geom")==0) + { + print_geom = true; + --argc; ++argv; + } + else if (strcmp(argv[0], "--exam")==0) + { + print_exam = true; + --argc; ++argv; + } + else + print_usage_and_exit(program_name); + } + if (no_options) + print_geom = true; + + if(argc!=1) + { + print_usage_and_exit(program_name); + } + + // set filename to last remaining argument + const std::string filename(argv[0]); + + shared_ptr proj_data_sptr(ProjData::read_from_file(filename)); + + if (is_null_ptr(proj_data_sptr)) + { + warning("Could not read %s", filename.c_str()); + return EXIT_FAILURE; + } + + if (print_exam) + { + const ExamInfo& exam_info = *proj_data_sptr->get_exam_info_ptr(); + std::cout << "Modality: " << proj_data_sptr->get_exam_info_ptr()->imaging_modality.get_name() << '\n'; + std::cout << "Patient position: " << exam_info.patient_position.get_position_as_string() << '\n'; + std::cout << "Scan start time in secs since 1970 UTC: " << exam_info.start_time_in_secs_since_1970 << '\n'; + if (exam_info.time_frame_definitions.get_num_time_frames() == 1) + { + std::cout << "Time frame start - end (duration), all in secs: " + << exam_info.time_frame_definitions.get_start_time(1) + << " - " + << exam_info.time_frame_definitions.get_end_time(1) + << " (" + << exam_info.time_frame_definitions.get_duration(1) + << ")\n"; + } + } + if (print_geom) + std::cout << proj_data_sptr->get_proj_data_info_ptr()->parameter_info() << std::endl; + + if (print_min || print_max || print_sum) + { + const int min_segment_num = proj_data_sptr->get_min_segment_num(); + const int max_segment_num = proj_data_sptr->get_max_segment_num(); + bool accumulators_initialized = false; + float accum_min=std::numeric_limits::max(); // initialize to very large in case projdata is empty (although that's unlikely) + float accum_max=std::numeric_limits::min(); + double sum=0.; + for (int segment_num = min_segment_num; segment_num<= max_segment_num; ++segment_num) + { + const SegmentByView seg(proj_data_sptr->get_segment_by_view(segment_num)); + const float this_max=seg.find_max(); + const float this_min=seg.find_min(); + sum+=static_cast(seg.sum()); + if(!accumulators_initialized) + { + accum_max=this_max; + accum_min=this_min; + accumulators_initialized=true; + } + else + { + if (accum_maxthis_min) accum_min=this_min; + } + } + if (print_min) + std::cout << "\nData min: " << accum_min; + if (print_max) + std::cout << "\nData max: " << accum_max; + if (print_sum) + std::cout << "\nData sum: " << sum; + std::cout << "\n"; + } + return EXIT_SUCCESS; +} diff --git a/src/utilities/manip_image.cxx b/src/utilities/manip_image.cxx new file mode 100644 index 0000000000..e4b1153944 --- /dev/null +++ b/src/utilities/manip_image.cxx @@ -0,0 +1,606 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief This program performs operations on image data + + \author Matthew Jacobson + \author (with help from Kris Thielemans) + \author PARAPET project + + + \warning It only supports stir::VoxelsOnCartesianGrid type of images. +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/display.h" +#include "stir/utilities.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/Succeeded.h" +#include "stir/recon_array_functions.h" +#include "stir/ArrayFunction.h" +#include "stir/zoom.h" + + +#include +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::iostream; +using std::ofstream; +using std::ios; +using std::cerr; +using std::endl; +using std::swap; +#endif + +USING_NAMESPACE_STIR + +static void trim_edges(VoxelsOnCartesianGrid& main_buffer); +static void get_plane(VoxelsOnCartesianGrid& main_buffer); +static void get_plane_row(VoxelsOnCartesianGrid& main_buffer); + +static VoxelsOnCartesianGrid ask_interfile_image(const char *const input_query); + +static void show_menu(); +static void show_math_menu(); +static void math_mode(VoxelsOnCartesianGrid &main_buffer, int &quit_from_math); + +static VoxelsOnCartesianGrid +transpose_13(const VoxelsOnCartesianGrid & image) +{ + CartesianCoordinate3D origin = image.get_origin(); + swap(origin.x(), origin.z()); + CartesianCoordinate3D voxel_size = image.get_voxel_size(); + swap(voxel_size.x(), voxel_size.z()); + VoxelsOnCartesianGrid + out(IndexRange3D(image.get_min_x(),image.get_max_x(), + image.get_min_y(),image.get_max_y(), + image.get_min_z(),image.get_max_z()), + origin, + voxel_size); + for (int x=image.get_min_x(); x<=image.get_max_x(); ++x) + for (int y=image.get_min_y(); y<=image.get_max_y(); ++y) + for (int z=image.get_min_z(); z<=image.get_max_z(); ++z) + out[x][y][z] = image[z][y][x]; + return out; +} + +static VoxelsOnCartesianGrid +transpose_12(const VoxelsOnCartesianGrid & image) +{ + CartesianCoordinate3D origin = image.get_origin(); + swap(origin.y(), origin.z()); + CartesianCoordinate3D voxel_size = image.get_voxel_size(); + swap(voxel_size.y(), voxel_size.z()); + VoxelsOnCartesianGrid + out(IndexRange3D(image.get_min_y(),image.get_max_y(), + image.get_min_z(),image.get_max_z(), + image.get_min_x(),image.get_max_x()), + origin, + voxel_size); + for (int y=image.get_min_y(); y<=image.get_max_y(); ++y) + for (int z=image.get_min_z(); z<=image.get_max_z(); ++z) + for (int x=image.get_min_x(); x<=image.get_max_x(); ++x) + out[y][z][x] = image[z][y][x]; + return out; +} + +int main(int argc, char *argv[]) +{ + // file input + VoxelsOnCartesianGrid main_buffer; + if(argc>1) + { + main_buffer= + * dynamic_cast *>( + DiscretisedDensity<3,float>::read_from_file(argv[1])); + } + else { + cerr< (*.hv)"<0 && plane <=ze-zs+1 ) { + plane = ask_num("Input plane # (0 to exit)", 0, ze-zs+1, zs); + + if(plane==0) break; + + for (int y=ys; y <= ye; y++) + for (int x=xs; x<= xe; x++) + cerr<0 && plane <=ze-zs+1 ) { + plane = ask_num("Input plane # (0 to exit)", 0, ze-zs+1, zs); + + if(plane==0) break; + + cerr << "Min and Max in plane " + << main_buffer[zs+plane-1].find_min() + << " " << main_buffer[zs+plane-1].find_max() << endl; + + cerr << "Number of counts = " + << main_buffer[zs+plane-1].sum() + << endl; + } + break; + } + + case 5: // min-max image + { + cerr << "Min and Max in image " << main_buffer.find_min() + << " " << main_buffer.find_max() << endl; + break; + } + + case 6: // trim + { + trim_edges(main_buffer); + break; + } + + case 7: // get plane + { + get_plane(main_buffer); + break; + } + + case 8: // get row + { + get_plane_row(main_buffer); + break; + } + + case 9: // counts + { + cerr< >::default_sptr()-> + write_to_file(outfile, main_buffer); + break; + } + + case 13: show_menu(); + + } // end switch main mode + } while(choice>0 && choice<=13 && (!quit_from_math)); + return EXIT_SUCCESS; +} + +void trim_edges(VoxelsOnCartesianGrid& input_image) +{ + const int xe=input_image.get_max_x(); + const int xs=input_image.get_min_x(); + const int xm=(xs+xe)/2; + const int rim_trunc=ask_num("By how many voxels to trim the FOV? ",0,(int)(xe-xm),2); + + truncate_rim(input_image,rim_trunc); + + if(ask("Zero end planes?",false)) truncate_end_planes(input_image); +} + +void get_plane(VoxelsOnCartesianGrid& input_image) +{ + int zs,ys,xs, ze,ye,xe; + + zs=input_image.get_min_z(); + ys=input_image.get_min_y(); + xs=input_image.get_min_x(); + + ze=input_image.get_max_z(); + ye=input_image.get_max_y(); + xe=input_image.get_max_x(); + + const int zm=(ze+zs)/2; + + int plane=ask_num("Which plane?",1,ze-zs+1,(int)zm-zs+1); + + ofstream profile; + ask_filename_and_open(profile, "Output filename ", ".prof", ios::out); + + for (int y=ys; y<= ye; y++) + for (int x=xs; x<= xe; x++) + profile<& input_image) +{ + int zs,ys,xs, ze,ye,xe; + + zs=input_image.get_min_z(); + ys=input_image.get_min_y(); + xs=input_image.get_min_x(); + + ze=input_image.get_max_z(); + ye=input_image.get_max_y(); + xe=input_image.get_max_x(); + + float zm=(zs+ze)/2.F; + float ym=(ys+ye)/2.F; + float xm=(xs+xe)/2.F; + + int axdir=ask_num("Which axis direction (z=0,y=1,x=2)?",0,2,2); + + if (axdir==0) { + int xcoord=ask_num("X COORDINATE: ",1,xe-xs+1,(int)xm-xs+1); + int ycoord=ask_num("Y COORDINATE: ",1,ye-ys+1,(int)ym-ys+1); + + ofstream profile; + ask_filename_and_open(profile, "Output filename ", ".prof", ios::out); + + for (int z=zs; z<= ze; z++) + profile< ask_interfile_image(const char *const input_query) +{ + char filename[max_filename_length]; + + ask_filename_with_extension(filename, input_query, ".hv"); + + shared_ptr > + image_ptr(read_from_file >(filename)); + return + * dynamic_cast*>(image_ptr.get()); + +} + + +void show_menu() +{ + cerr<<"\n\ +MAIN MODE:\n\ +0. Quit\n\ +1. Display image\n\ +2. Display all numeric data\n\ +3. Display numeric data per plane\n\ +4. Minimum, maximum & counts per plane \n\ +5. Minimum & maximum in image\n\ +6. Radial truncation \n\ +7. Get plane\n\ +8. Get row\n\ +9. Counts\n\ +10. Math mode\n\ +11. Reload main buffer\n\ +12. Write buffer to file\n\ +13. Redisplay menu"< Math buffer\n\ +13. Math buffer --> Main Buffer\n\ +14. Reload main buffer\n\ +15. Redisplay menu\n\ +16. Main mode"< &main_buffer, int &quit_from_math) +{ + VoxelsOnCartesianGrid math_buffer=main_buffer; //initialize math buffer + int operation; + + show_math_menu(); + + do { + operation=ask_num("Choose Operation: ",0,16,15); + + switch(operation) { // math mode + + case 0: // quit + { + quit_from_math=1; + break; + } + + case 1: // display math buffer + { + display(math_buffer, math_buffer.find_max()); + break; + } + + case 2: // absolute difference + { + + VoxelsOnCartesianGrid aux_image= + ask_interfile_image("What image to compare with?"); + + math_buffer-=aux_image; + in_place_abs(math_buffer); + + //MJ 07/10/2000 removed trimming + //trim_edges(math_buffer); + + cerr < aux_image= + ask_interfile_image("What image to add?"); + + math_buffer+=aux_image; + break; + } + + + case 4: // image subtraction + { + VoxelsOnCartesianGrid aux_image= + ask_interfile_image("What image to subtract?"); + + math_buffer-=aux_image; + break; + } + + case 5: // image multiplication + { + VoxelsOnCartesianGrid aux_image= + ask_interfile_image("What image to multiply?"); + + math_buffer*=aux_image; + break; + } + + case 6: // image division + { + VoxelsOnCartesianGrid aux_image= + ask_interfile_image("What image to divide?"); + + divide_array(math_buffer, aux_image); + break; + } + + case 7: //scalar addition + { + float scalar=ask_num("What scalar to add?", -100000.F,+100000.F,0.F); + + math_buffer+=scalar; + break; + } + + case 8: //scalar mulltiplication + { + float scalar=ask_num("What scalar to multiply?", -100000.F,+100000.F,1.F); + + math_buffer*=scalar; + break; + } + + case 9: //scalar division + { + float scalar=0.0; + + do { + scalar=ask_num("What scalar to divide?", -100000.F,+100000.F,1.F); + + if(scalar==0.0) cerr<(math_buffer.get_x_size()*zoom_x * 2), + static_cast(math_buffer.get_x_size()*zoom_x)); + const int new_size_y = + ask_num("New y size (pixels)", 1, + static_cast(math_buffer.get_y_size()*zoom_y * 2), + new_size_x); + const int new_size_z = + ask_num("New z size (pixels)", 1, + static_cast(math_buffer.get_z_size()*zoom_z * 2), + static_cast(math_buffer.get_z_size()*zoom_z)); + zoom_image_in_place(math_buffer, + CartesianCoordinate3D(zoom_z, zoom_y, zoom_x), + CartesianCoordinate3D(offset_z, offset_y, offset_x), + CartesianCoordinate3D(new_size_z, new_size_y, new_size_x)); + break; + } + + case 11: + { + cerr << "Min and Max in image " << math_buffer.find_min() + << " " << math_buffer.find_max() << endl; + break; + } + + case 12: //reinitialize math buffer + { + math_buffer=main_buffer; + break; + } + + case 13: //dump math buffer to main buffer + { + main_buffer=math_buffer; + break; + } + + case 14: //reload main buffer in math mode + { + main_buffer = ask_interfile_image("File to load in buffer? "); + break; + } + + case 15: //redisplay menu + { + show_math_menu(); + break; + } + + + case 16: //go back to main mode + { + show_menu(); + } + + } // end switch math mode + } while(operation>0 && operation<16); +} diff --git a/src/utilities/manip_projdata.cxx b/src/utilities/manip_projdata.cxx new file mode 100644 index 0000000000..665f0e3432 --- /dev/null +++ b/src/utilities/manip_projdata.cxx @@ -0,0 +1,545 @@ +/*! +\file +\ingroup utilities +\brief process sinogram data + +\author Matthew Jacobson +\author Sanida Mustafovic and Kris Thielemans (conversion to new design) +\author PARAPET project + +This utility programme processes (interfile) sinogram data +(maximum number of segments as input). It can +
            +
          • display by View - by Segment +
          • do operations between two data +
          • do operations with a scalar +
          +*/ +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000 - 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +// TODO get rid of 2 copies of the segments ByView and BySinogram +// TODO get rid of pos, neg segments (can now do each one separately) +// MJ doesn't think doing each one separately is a good idea (for display) + + + +#include "stir/ProjDataFromStream.h" +#include "stir/SegmentByView.h" +#include "stir/SegmentBySinogram.h" +#include "stir/Sinogram.h" +#include "stir/Viewgram.h" + +//#include "stir/Scanner.h" +#include "stir/ArrayFunction.h" +#include "stir/recon_array_functions.h" +#include "stir/display.h" +#include "stir/IO/interfile.h" +#include "stir/utilities.h" +#include "stir/shared_ptr.h" +#include "stir/is_null_ptr.h" + +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::fstream; +#endif + + + +START_NAMESPACE_STIR + +// in relation with show_math_menu() +// _menu HAS to be the last option +enum options { _quit, _display_view, _display_sino, _absdiff, _add_sino, _subtract_sino, + _mult_sino, _div_sino, _add_scalar, _mult_scalar, _div_scalar, _stats, + _pos_ind, _trunc_neg, _trim, _zero_ends, /*_pad_ends,*/ _restart, _menu}; + +//*********************** prototypes + +// operations between two datas +void do_math(enum options operation, SegmentByView& sino1,SegmentByView &sino2, + float &accum_max, float &accum_min, float &accum_sum, bool accumulators_initialized); + +// display, operations with a scalar, others +void do_math(enum options operation, SegmentByView& sino1, SegmentBySinogram& seg_sinogram, float &accum_max, float &accum_min, float &accum_sum, bool accumulators_initialized,float scalar=0.0); + +void make_buffer_header(const char *data_filename,const char *header_filename, + ProjData& input_sino, int limit_segments, + NumericType::Type output_type=NumericType::FLOAT); + +void show_math_menu(); + +float pos_indicate(float x); + +shared_ptr ask_proj_data(const char *const input_query); +//*********************** functions + +void do_math(enum options operation, SegmentByView& sino1,SegmentByView &sino2, + float &accum_max, float &accum_min, float &accum_sum, bool accumulators_initialized) +{ + switch(operation) + { + + case _absdiff: { //absolute difference + sino1-=sino2; + in_place_abs(sino1); + + if(!accumulators_initialized) { + accum_max=sino1.find_max(); + accum_min=sino1.find_min(); + accum_sum=sino1.sum(); + accumulators_initialized=true; + } + else { + if (accum_maxsino1.find_min()) accum_min= sino1.find_min(); + accum_sum+=sino1.sum(); + } + break; + } + + case _add_sino: { // sinogram addition + sino1+=sino2; + break; + } + + + case _subtract_sino: { // sinogram subtraction + sino1-=sino2; + break; + } + + case _mult_sino: { // image multiplication + sino1*=sino2; + break; + } + + case _div_sino: { // sinogram division + divide_array(sino1,sino2); + break; + } + + + //MJ 07/14/2000 empty default to suppress warning in gcc 2.95.2 + default: + { + //empty statement + } + + + + } // end switch +} + + +void do_math(enum options operation, SegmentByView& sino1, SegmentBySinogram& seg_sinogram, float &accum_max, float &accum_min, float &accum_sum, bool accumulators_initialized,float scalar) +{ + switch(operation) + { + + case _display_view: { //display math buffer by View + char title[100]; + sprintf(title, "Segment %d", sino1.get_segment_num()); + display(sino1,sino1.find_max(), title); + if(ask("Display single viewgram?",false)) { + int vs=sino1.get_min_view_num(); + int ve=sino1.get_max_view_num(); + int view_num=ask_num("Which viewgram?",vs,ve,vs); + + Viewgram viewgram=sino1.get_viewgram(view_num); + display(viewgram); + } + break; + } + + case _display_sino: { //display math buffer by sinogram + char title[100]; + sprintf(title, "Segment %d", sino1.get_segment_num()); + display(seg_sinogram, seg_sinogram.find_max()); + break; + } + + case _add_scalar: { //scalar addition + sino1+=scalar; + break; + } + + case _mult_scalar: { //scalar multiplication + sino1*=scalar; + break; + } + + case _div_scalar: { //scalar division + sino1/=scalar; + break; + } + + case _stats: { //global min&max + number of counts + if(!accumulators_initialized) { + accum_max=sino1.find_max(); + accum_min=sino1.find_min(); + accum_sum=sino1.sum(); + accumulators_initialized=true; + } + else { + if (accum_maxsino1.find_min()) accum_min= sino1.find_min(); + accum_sum+=sino1.sum(); + } + break; + } + + case _pos_ind: + { + in_place_apply_function(sino1,pos_indicate); //positive indicator + break; + } + + case _trim: + { + truncate_rim(sino1, (int) scalar); //trim rim + break; + } + + case _trunc_neg: + { + in_place_apply_function(sino1,neg_trunc); + break; + } + + + //MJ 07/14/2000 empty default to suppress warning in gcc 2.95.2 + default: + { + //empty statement + } + + + } //end switch +} + +shared_ptr ask_proj_data(const char *const input_query) +{ + char filename[max_filename_length]; + + //system("ls *hs"); + ask_filename_with_extension(filename, input_query, ".hs"); + + return + ProjData::read_from_file(filename); +} + +void show_math_menu() +{ + assert(_menu == 17); + + // KT disabled Pad end planes: 16. Pad end planes of segment 0 \n +cerr<<"\n\ +MENU:\n\ +0. Quit\n\ +1. Display viewgrams\n\ +2. Display sinograms\n\ +3. Subtract projection array\n\ + and take absolute value\n\ +4. Add projection array\n\ +5. Subtract projection array\n\ +6. Multiply projection array\n\ +7. Divide projection array\n\ +8. Add scalar\n\ +9. Multiply scalar\n\ +10. Divide scalar \n\ +11. Minimum, maximum & total counts \n\ +12. Binarise array (1 if >0, 0 otherwise) \n\ +13. Truncate negatives \n\ +14. Apply tangential truncating window\n\ + (scalar operand = No. of bins to truncate)\n\ +15. Apply axial truncating window to segment 0 \n\ + (scalar operand = No. of planes to truncate)\n\ +16. Restart\n\ +17. Redisplay menu"<0.0)?1.0F:0.0F; +} + +END_NAMESPACE_STIR + +//********************** main + + + +USING_NAMESPACE_STIR + + +int main(int argc, char *argv[]) +{ + bool quit=false,reload=false; + + shared_ptr first_operand; + ProjDataFromStream *output_proj_data= NULL; + // Start + do { //(re)start from here + bool buffer_opened=false; + char output_buffer_header[max_filename_length]; + + if (first_operand==NULL) + { + + if (reload) + // changed the ask... returns ponter + first_operand=ask_proj_data("Input sinogram"); //new + //ProjDataFromStream(ask_proj_data("Input sinogram")); + + else // just starting + { + if(argc<2) + { + cerr< (*.hs)"<get_max_segment_num(), first_operand->get_max_segment_num() ); + + + do { //math operations loop + float accum_max, accum_min, accum_sum; + show_math_menu(); + enum options operation; + + operation= + static_cast( + ask_num("Choose Operation: ", + 0,static_cast(_menu), static_cast(_menu)) + ); + if (operation==_menu) continue; //redisplay menu + if (operation==_restart || operation==_quit) { //restart or quit +#if 1 + assert(output_proj_data == NULL); +#else + // enable this when using the output buffer for reading/writing at the same time + if (output_proj_data != NULL) + { + delete output_proj_data; + output_proj_data = NULL; + } +#endif + first_operand.reset(); + if(operation==_restart) reload=true; + if(operation==_quit) quit=true; + break; + } + + if (operation!= _display_view && operation!= _display_sino + && operation!= _stats &&!buffer_opened) + { + //operation result is a sinogram + + char output_buffer_root[max_filename_length]; + char output_buffer_filename[max_filename_length]; + + ask_filename_with_extension(output_buffer_root, "Output to which file (without extension)?", ""); + sprintf(output_buffer_filename, "%s.%s",output_buffer_root , "s"); + // TODO relies on write_basic_interfile_PDFS_header using .hs extension + sprintf(output_buffer_header, "%s.%s",output_buffer_root , "hs"); + shared_ptr new_sino_ptr(new fstream); + open_write_binary(*new_sino_ptr, output_buffer_filename); + shared_ptr pdi_ptr = + first_operand->get_proj_data_info_ptr()->create_shared_clone(); + pdi_ptr->reduce_segment_range(-limit_segments, limit_segments); + output_proj_data = new ProjDataFromStream(first_operand->get_exam_info_sptr(), + pdi_ptr, new_sino_ptr); + write_basic_interfile_PDFS_header(output_buffer_filename, *output_proj_data); + buffer_opened=true; + } + + shared_ptr second_operand; + float *scalar=NULL; + + if(operation==_absdiff || operation==_add_sino || operation==_subtract_sino || + operation==_mult_sino || operation==_div_sino) //requiring 2nd sinogram operand + second_operand= ask_proj_data("Second sinogram operand" ); + + if(operation==_add_scalar || operation==_mult_scalar || operation==_div_scalar || + operation==_trim || operation==_zero_ends ) { //requiring scalar operand + bool need_int=false; + float upper_bound=100000.F,lower_bound=-100000.F,deflt=0.F; + + if(operation==_trim) { + need_int=true; + upper_bound=(float) (first_operand->get_proj_data_info_ptr()->get_num_tangential_poss()/2 +1); + lower_bound=deflt=0.0; + } + + if(operation==_zero_ends) { + need_int=true; + upper_bound=(float) (first_operand->get_proj_data_info_ptr()->get_num_axial_poss(0)/2+1); + lower_bound=deflt=1.0; + } + + do scalar= new float (ask_num("Scalar Operand: ",(need_int)?(int)lower_bound:lower_bound , + (need_int)?(int)upper_bound: upper_bound,(need_int)?(int)deflt:deflt)); + while(*scalar==0.0 && operation==_div_scalar ); + + } +// first do segment 0 + { + SegmentByView seg1=first_operand->get_segment_by_view(0); + SegmentBySinogram seg_sinogram=first_operand->get_segment_by_sinogram(0); +#if 0 + // TODO grow statement is wrong + // also this can't work anymore, as set_segment would complain about incompatible sizes + if(operation == _pad_ends) + { + + // TODO this is wrong, as other scanners could have merged segment 0 as well + // find out from min_ring_difference etc. + bool merges_seg0=(first_operand->get_proj_data_info_ptr()->get_scanner_ptr()->type== + Scanner::Advance || + seg1.get_proj_data_info_ptr()->get_scanner_ptr()->type==Scanner::HZLR )? true:false; + + if((merges_seg0 && + seg1.get_num_axial_poss() == + 2*(first_operand->get_proj_data_info_ptr()->get_scanner_ptr()->num_rings)-3 + ) + || // TODO something wrong here says MJ + (!merges_seg0 + && seg1.get_num_axial_poss() == + first_operand->get_proj_data_info_ptr()->get_scanner_ptr()->num_rings)) + { + //seg1.grow_height(seg1.get_min_axial_pos_num()-1,seg1.get_max_axial_pos_num()+1); + seg1.grow(seg1.get_min_axial_pos_num()-1,seg1.get_max_axial_pos_num()+1); + + } + else + { + cerr<<"Number of rings is consistent. Operation had no effect"< seg2=second_operand->get_segment_by_view(0); + do_math(operation,seg1,seg2,accum_max,accum_min,accum_sum,false); + } + + else if(scalar != NULL) { + if(operation==_zero_ends ) + for(int i=seg1.get_min_view_num();i<=seg1.get_max_view_num();i++) + for(int j=0;j<*scalar;j++ ) { + seg1[i][seg1.get_min_axial_pos_num()+j].fill(0); + seg1[i][seg1.get_max_axial_pos_num()-j].fill(0); + + + } + else do_math(operation,seg1,seg_sinogram,accum_max,accum_min,accum_sum,false,*scalar); + + + } + + else do_math(operation,seg1,seg_sinogram,accum_max,accum_min,accum_sum,false); + + + + + //Write sinogram result to file + if(operation!= _display_view && operation!= _display_sino && operation!= _stats && buffer_opened) + output_proj_data->set_segment(seg1); + } +//Now do other segments + + + + + if(limit_segments>0) + for (int segment_num = 1; segment_num <= limit_segments ; segment_num++) { + if((operation==_display_view || operation==_display_sino) && ask("Abort display",false)) break; + SegmentByView seg1_pos=first_operand->get_segment_by_view(segment_num); + SegmentByView seg1_neg=first_operand->get_segment_by_view(-segment_num); + SegmentBySinogram seg_sinogram_pos=first_operand->get_segment_by_sinogram(segment_num); + SegmentBySinogram seg_sinogram_neg=first_operand->get_segment_by_sinogram(-segment_num); + + if(!is_null_ptr(second_operand)) { + SegmentByView seg2_pos=second_operand->get_segment_by_view(segment_num); + SegmentByView seg2_neg=second_operand->get_segment_by_view(-segment_num); + do_math(operation,seg1_pos,seg2_pos,accum_max,accum_min,accum_sum,true); + do_math(operation,seg1_neg,seg2_neg,accum_max,accum_min,accum_sum,true); + } + else if(scalar != NULL) { + do_math(operation,seg1_pos,seg_sinogram_pos,accum_max,accum_min,accum_sum,true,*scalar); + do_math(operation,seg1_neg,seg_sinogram_neg,accum_max,accum_min,accum_sum,true,*scalar); + } + else { + do_math(operation,seg1_pos,seg_sinogram_pos,accum_max,accum_min,accum_sum,true); + if((operation==_display_view || operation==_display_sino) + && ask("Abort display",false)) break; + do_math(operation,seg1_neg,seg_sinogram_neg,accum_max,accum_min,accum_sum,true); + if((operation==_display_view || operation==_display_sino) + && segment_numset_segment(seg1_neg); + output_proj_data->set_segment(seg1_pos); + } + } + + +//if buffer changed, reinitialize first operand to output of previous math operation + if(operation!= _display_view && operation!= _display_sino && operation!= _stats && buffer_opened) + { + // at the moment, we close the output buffer, and will reopen it later on + // this is to avoid conflicts with reading and writing from/to the same file + // alternatively, the output_proj_data would use a read/write file, and + // we would do first_operand = output_proj_data + + if (output_proj_data != NULL) + { + delete output_proj_data; + output_proj_data = NULL; + } + buffer_opened = false; + + first_operand=ProjData::read_from_file(output_buffer_header); + } + +//Get accumulator results and de-allocate + if (operation ==_absdiff || operation ==_stats) cerr< +#include +#include +#include +#include + +#endif +#include "stir/round.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +using std::cout; +#endif + + +START_NAMESPACE_STIR + + +#ifndef RAND + // try boost::mt19937 or boost::ecuyer1988 instead of boost::minstd_rand + typedef boost::mt19937 base_generator_type; + // initialize by reproducible seed + static base_generator_type generator(boost::uint32_t(43)); +#else +#error can not do normal distribution +inline double random01() { return static_cast(rand()) / RAND_MAX; } +#endif + + +// Generate a random number according to a Poisson distribution +// with mean mu +int generate_poisson_random(const float mu) +{ + static boost::uniform_01 random01(generator); + // normal distribution with mean=0 and sigma=1 + static boost::normal_distribution normal_distrib01(0., 1.); + + // check if mu is large. If so, use the normal distribution + // note: the threshold must be such that exp(threshold) is still a floating point number + if (mu > 60.F) + { + // get random number of normal distribution of mean=mu and sigma=sqrt(mu) +#if 0 + boost::normal_distribution normal_distrib(mu, sqrt(mu)); +# if 0 + // this works, but sligthly more involved syntax + boost::variate_generator > + randomnormal(generator, + normal_distrib); + const double random = randomnormal(); +# else + const double random=normal_distrib(random01); +# endif + +#else + // get random with mean=0, sigma=1 and use scaling with sqrt(mu) and addition of mu + // this has the advantage that we don't have to construct a normal_distrib + // object every time. This will speed things up, especially because the + // normal_distribution is implemented using with a polar method that calls + // generator::operator() twice only on 'odd'- number of invocations + const double random=normal_distrib01(random01)*sqrt(mu) + mu; +#endif + return random<=0 ? 0 : round(random); + } + else + { + double u = random01(); + + // prevent problems of n growing too large (or even to infinity) + // when u is very close to 1 + if (u>1-1.E-6) + u = 1-1.E-6; + + const double upper = exp(mu)*u; + double accum = 1.; + double term = 1.; + int n = 1; + + while(accum seg_input= input_projdata.get_segment_by_view(seg); + SegmentByView seg_output= + output_projdata.get_empty_segment_by_view(seg,false); + + cerr << "Segment " << seg << endl; + + for(int view=seg_input.get_min_view_num();view<=seg_input.get_max_view_num();view++) + for(int ax_pos=seg_input.get_min_axial_pos_num();ax_pos<=seg_input.get_max_axial_pos_num();ax_pos++) + for(int tang_pos=seg_input.get_min_tangential_pos_num();tang_pos<=seg_input.get_max_tangential_pos_num();tang_pos++) + { + const float bin = seg_input[view][ax_pos][tang_pos]; + const int random_poisson = generate_poisson_random(bin*scaling_factor); + seg_output[view][ax_pos][tang_pos] = + preserve_mean ? + random_poisson / scaling_factor + : + static_cast(random_poisson); + } + if (output_projdata.set_segment(seg_output) == Succeeded::no) + exit(EXIT_FAILURE); + } +} + + + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + + +void usage() +{ + cerr <<"Usage: poisson_noise [-p | --preserve-mean] scaling_factor seed-unsigned-int\n" + <<"The seed value for the random number generator has to be strictly positive.\n" + << "Without the -p option, the mean of the output data will" + << " be equal to\nscaling_factor*mean_of_input, otherwise it" + << "will be equal to mean_of_input.\n" + << "The options -p and --preserve-mean are identical.\n"; +} + +int +main (int argc,char *argv[]) +{ + if(argc<5) + { + usage(); + return(EXIT_FAILURE); + } + + bool preserve_mean = false; + + // option processing + if (argv[1][0] == '-') + { + if (strcmp(argv[1],"-p")==0 || + strcmp(argv[1],"--preserve-mean")==0) + preserve_mean = true; + else + { + usage(); + return(EXIT_FAILURE); + } + ++argv; + } + + const char *const filename = argv[1]; + const float scaling_factor = static_cast(atof(argv[3])); + shared_ptr in_data = ProjData::read_from_file(argv[2]); + +#ifndef RAND + boost::uint32_t seed = atoi(argv[4]); + // check seed!=0 as current generator used does not allow this value + if (seed==0) + error("Seed value has to be non-zero.\n"); + generator.seed(seed); +#else + unsigned int seed = atoi(argv[4]); + // check seed!=0 as Darren Hogg observed strange statistics on Linux with a zero seed + if (seed==0) + error("Seed value has to be non-zero.\n"); + srand(seed); +#endif + + + ProjDataInterfile new_data(in_data->get_exam_info_sptr(),in_data->get_proj_data_info_ptr()->create_shared_clone(), filename); + + + poisson_noise(new_data,*in_data, scaling_factor, preserve_mean); + + return EXIT_SUCCESS; +} + + + diff --git a/src/utilities/postfilter.cxx b/src/utilities/postfilter.cxx new file mode 100644 index 0000000000..e8d4bad854 --- /dev/null +++ b/src/utilities/postfilter.cxx @@ -0,0 +1,212 @@ +// +// +/* + Copyright (C) 2000 PARAPET partners + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + + \brief This program performs filtering on image data + + \author Sanida Mustafovic + \author Kris Thielemans + \author Matthew Jacobson + \author PARAPET project + + + This program enables calling any ImageProcessor object on input data, + and writing it to file. It can take the following command line: + \verbatim + postfilter [[-verbose] + \endverbatim + This is done to make it easy to process a lot of files with the same + ImageProcessor. However, if the number of command line arguments is not + correct, appropriate questions will be asked interactively. + + If the --verbose option is used, the filter-parameters that are going to be + used will be written to stdout. This is useful for checking/debugging. + + \par Example .par file + (but see stir::MedianImageFilter3D to see if the following example is still correct) + \verbatim + PostFilteringParameters := + Postfilter type :=Median + Median Filter Parameters := + mask radius x := 1 + mask radius y := 2 + mask radius z := 3 + End Median Filter Parameters:= + End PostFiltering Parameters:= + \endverbatim + +*/ + +#include "stir/utilities.h" +#include "stir/KeyParser.h" +#include "stir/DiscretisedDensity.h" +#include "stir/DataProcessor.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/is_null_ptr.h" +#include "stir/Succeeded.h" + +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + + +START_NAMESPACE_STIR + +DiscretisedDensity<3,float>* ask_image(const char *const input_query) +{ + + char filename[max_filename_length]; + ask_filename_with_extension(filename, + input_query, + ""); + + return DiscretisedDensity<3,float>::read_from_file(filename); + +} + +class PostFiltering +{ +public: + PostFiltering(); + shared_ptr > > filter_ptr; +public: + KeyParser parser; + +}; + +PostFiltering::PostFiltering() +{ + filter_ptr.reset(); + parser.add_start_key("PostFilteringParameters"); + parser.add_parsing_key("PostFilter type", &filter_ptr); + parser.add_stop_key("END PostFiltering Parameters"); + +} + + +END_NAMESPACE_STIR + +USING_NAMESPACE_STIR + +static void +print_usage() +{ + cerr<<"\nUsage: postfilter [--verbose] \n"< > input_image_ptr; + PostFiltering post_filtering; + string out_filename; + bool verbose = false; + + // option processing + if (argc>1 && argv[1][0] == '-') + { + if (strcmp(argv[1], "--verbose") == 0) + { + verbose = true; + --argc; ++argv; + } + else + { + print_usage(); + return EXIT_FAILURE; + } + } + + if (argc!=4) + { + print_usage(); + } + if (argc>1) + { + out_filename = argv[1]; + } + else + { + char outfile[max_filename_length]; + ask_filename_with_extension(outfile, + "Output to which file: ", ""); + out_filename = outfile; + } + if (argc>2) + { + input_image_ptr = + read_from_file >(argv[2]); + } + else + { + input_image_ptr.reset(ask_image("Image to process?")); + } + if (argc>3) + { + if (post_filtering.parser.parse(argv[3]) == false) + { + warning("postfilter aborting because error in parsing. Not writing any output"); + return EXIT_FAILURE; + } + } + else + { + cerr << "\nI'm going to ask you for the type of filter (or image processor)\n" + "Possible values:\n"; + DataProcessor >::list_registered_names(cerr); + + post_filtering.parser.ask_parameters(); + } + + if (is_null_ptr(post_filtering.filter_ptr)) + { + warning("postfilter: No filter set. Not writing any output.\n"); + return EXIT_FAILURE; + } + + if (is_null_ptr(input_image_ptr)) + { + warning("postfilter: No input image. Not writing any output.\n"); + return EXIT_FAILURE; + } + + if (verbose) + { + cerr << "PostFilteringParameters:\n" << post_filtering.parser.parameter_info(); + } + + post_filtering.filter_ptr->apply(*input_image_ptr); + + if (OutputFileFormat >::default_sptr()-> + write_to_file(out_filename,*input_image_ptr) == Succeeded::yes) + return EXIT_SUCCESS; + else + return EXIT_FAILURE; +} + + diff --git a/src/utilities/rebin_projdata.cxx b/src/utilities/rebin_projdata.cxx new file mode 100644 index 0000000000..350b9b340f --- /dev/null +++ b/src/utilities/rebin_projdata.cxx @@ -0,0 +1,140 @@ +// +// + +/*! + \file + \ingroup utilities + + \brief A utility to rebin projection data. + + + Here's a sample .par file +\verbatim +rebin_projdata Parameters := + rebinning type := FORE + FORE Parameters := + ... + End FORE Parameters:= +END:= +\endverbatim + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2003- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + + +#include "stir/recon_buildblock/ProjDataRebinning.h" +#include "stir/Succeeded.h" +#include "stir/shared_ptr.h" +#include "stir/is_null_ptr.h" +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::endl; +#endif + +START_NAMESPACE_STIR + +// TODO most of this is identical to others, so make a common class +class RebinProjDataParameters : public ParsingObject +{ +public: + + RebinProjDataParameters(const char * const par_filename); + shared_ptr proj_data_rebinning_sptr; +private: + + virtual void set_defaults(); + virtual void initialise_keymap(); + virtual bool post_processing(); + +}; + +void +RebinProjDataParameters:: +set_defaults() +{ + proj_data_rebinning_sptr.reset(); +} + +void +RebinProjDataParameters:: +initialise_keymap() +{ + parser.add_start_key("Rebin_projdata Parameters"); + parser.add_parsing_key("rebinning type", &proj_data_rebinning_sptr); + parser.add_stop_key("END"); +} + + +bool +RebinProjDataParameters:: +post_processing() +{ + if (is_null_ptr(proj_data_rebinning_sptr)) + { + warning("Invalid rebinning object\n"); + return true; + } + + return false; +} + +RebinProjDataParameters:: +RebinProjDataParameters(const char * const par_filename) +{ + set_defaults(); + Succeeded success = Succeeded::yes; + if (par_filename!=0) + success = parse(par_filename)==true? Succeeded::yes : Succeeded::no; + else + ask_parameters(); + + + if (success== Succeeded::no || + proj_data_rebinning_sptr->set_up()!= Succeeded::yes) + error("Rebin_projdata: set-up failed\n"); + +} + +END_NAMESPACE_STIR + + +int main(int argc, char *argv[]) +{ + USING_NAMESPACE_STIR + + if(argc!=2) + { + cerr<<"Usage: " << argv[0] << " par_file\n" + << endl; + } + RebinProjDataParameters parameters( argc==2 ? argv[1] : 0); + + if (argc!=2) + { + cerr << "Corresponding .par file input \n" + << parameters.parameter_info() << endl; + } + + return + parameters.proj_data_rebinning_sptr->rebin() == Succeeded::yes? + EXIT_SUCCESS: EXIT_FAILURE; +} diff --git a/src/utilities/shift_image.cxx b/src/utilities/shift_image.cxx new file mode 100644 index 0000000000..5db773bc1b --- /dev/null +++ b/src/utilities/shift_image.cxx @@ -0,0 +1,108 @@ +/* + Copyright (C) 2010 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + \brief This program shifts the origin of an image. + \author Charalampos Tsoumpas +*/ +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/Succeeded.h" +#include "stir/round.h" + +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +USING_NAMESPACE_STIR + + +int main(int argc, char **argv) +{ + if(argc<3 || argc>7) { + cerr<<"Usage: " << argv[0] << " [x-shift] [y-shift] [z-shift] [extend_borders]\n" + << "all shifts are in mm and defaults are set to 0mm\n" + << "extend borders is either 1 or 0, defaults to 0\n"; + exit(EXIT_FAILURE); + } + + // get parameters from command line + char const * const output_filename = argv[1]; + char const * const input_filename = argv[2]; + const float x_shift_in_mm = (argc>3) ? static_cast(atof(argv[3])) : 0; + const float y_shift_in_mm = (argc>4) ? static_cast(atof(argv[4])) : 0; + const float z_shift_in_mm = (argc>5) ? static_cast(atof(argv[5])) : 0; + const int extend_borders = (argc>6) ? atoi(argv[6]) : 0; + + // read image + const shared_ptr > density_sptr( + DiscretisedDensity<3,float>::read_from_file(input_filename)); + const DiscretisedDensityOnCartesianGrid <3,float>* density_cartesian_sptr = + dynamic_cast< DiscretisedDensityOnCartesianGrid<3,float>* > (density_sptr.get()); + const BasicCoordinate<3,float> grid_spacing=density_cartesian_sptr->get_grid_spacing(); + const CartesianCoordinate3D origin=density_cartesian_sptr->get_origin(); + + const Coordinate3D image_shift(z_shift_in_mm,y_shift_in_mm,x_shift_in_mm); + const int voxel_shift_z=stir::round(image_shift[1]/grid_spacing[1]); + const int voxel_shift_y=stir::round(image_shift[2]/grid_spacing[2]); + const int voxel_shift_x=stir::round(image_shift[3]/grid_spacing[3]); + const Coordinate3D num_voxels_to_shift(voxel_shift_z,voxel_shift_y,voxel_shift_x); + + const float actual_z_shift_in_mm = static_cast (voxel_shift_z)*grid_spacing[1]; + const float actual_y_shift_in_mm = static_cast (voxel_shift_y)*grid_spacing[2]; + const float actual_x_shift_in_mm = static_cast (voxel_shift_x)*grid_spacing[3]; + + std::cerr << "Actual z shift: " << actual_z_shift_in_mm << "mm\n"; + std::cerr << "Actual y shift: " << actual_y_shift_in_mm << "mm\n"; + std::cerr << "Actual x shift: " << actual_x_shift_in_mm << "mm\n"; + + BasicCoordinate<3,int> min; BasicCoordinate<3,int> max; + const IndexRange<3> range=density_sptr->get_index_range(); + if (!range.get_regular_range(min,max)) + error("image is not in regular grid.\n"); + BasicCoordinate<3,int> out_min=min; BasicCoordinate<3,int> out_max=max; + if (extend_borders==1) { + out_min[1]-=abs(voxel_shift_z) ; + out_min[2]-=abs(voxel_shift_y) ; + out_min[3]-=abs(voxel_shift_x) ; + out_max[1]+=abs(voxel_shift_z) ; + out_max[2]+=abs(voxel_shift_y) ; + out_max[3]+=abs(voxel_shift_x) ; + } + const IndexRange<3> out_range(out_min,out_max); + VoxelsOnCartesianGrid out_density(out_range,origin,grid_spacing); + + BasicCoordinate<3,int> c, d; + for (c[1]=min[1]; c[1]<=max[1]; ++c[1]) + for (c[2]=min[2]; c[2]<=max[2]; ++c[2]) + for (c[3]=min[3]; c[3]<=max[3]; ++c[3]) + { + d=c+num_voxels_to_shift; + if (d[1]>=out_min[1] && d[2]>=out_min[2] && d[3]>=out_min[3] && d[1]<=out_max[1] && d[2]<=out_max[2] && d[3]<=out_max[3]) + out_density[d] = (*density_sptr)[c]; + } + + // write image + Succeeded res = + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, out_density); + return res==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} + diff --git a/src/utilities/shift_image_origin.cxx b/src/utilities/shift_image_origin.cxx new file mode 100644 index 0000000000..8387d35f10 --- /dev/null +++ b/src/utilities/shift_image_origin.cxx @@ -0,0 +1,66 @@ +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + \brief This program shifts the origin of an image. + \author Charalampos Tsoumpas + */ +#include "stir/DiscretisedDensity.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/Succeeded.h" + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +USING_NAMESPACE_STIR + + +int main(int argc, char **argv) +{ + if(argc<3 || argc>6) { + cerr<<"Usage: " << argv[0] << " [x-shift] [y-shift] [z-shift] ] ] ]\n" + << "all shifts are in mm and defaults are set to 0mm\n"; + exit(EXIT_FAILURE); + } + + // get parameters from command line + char const * const output_filename = argv[1]; + char const * const input_filename = argv[2]; + const float x_shift_in_mm = (argc>3) ? static_cast(atof(argv[3])) : 0; + const float y_shift_in_mm = (argc>4) ? static_cast(atof(argv[4])) : 0; + const float z_shift_in_mm = (argc>5) ? static_cast(atof(argv[5])) : 0; + + // read image + shared_ptr > density_sptr( + DiscretisedDensity<3,float>::read_from_file(input_filename)); + shared_ptr > out_density_sptr(density_sptr->clone()); + const Coordinate3D origin=density_sptr->get_origin(); + const Coordinate3D origin_shift(z_shift_in_mm,y_shift_in_mm,x_shift_in_mm); + out_density_sptr->set_origin(origin+origin_shift); + + // write image + Succeeded res = + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, *out_density_sptr); + return res==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} + + + + diff --git a/src/utilities/stir_math.cxx b/src/utilities/stir_math.cxx new file mode 100644 index 0000000000..221f05fc1e --- /dev/null +++ b/src/utilities/stir_math.cxx @@ -0,0 +1,612 @@ +/* + Copyright (C) 2001- 2009, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ + +/*! + \file + \ingroup utilities + \brief add or multiply data, with some other basic math manipulations + + This is a command line utility for adding, multiplying, thresholding ... data, + with a somewhat awkward syntax. + The command line arguments are as follows (but everything has to fit on 1 line): + \code + [--output-format parameter-filename ] + [-s [--max_segment_num_to_process number] ] + [--add | --mult] + [--power power_float] + [--times-scalar mult_scalar_float] + [--divide-scalar divide_scalar_float] + [--add-scalar add_scalar_float] + [--min-threshold min_threshold] + [--max-threshold max_threshold] + [--including-first] + [--verbose] + output_filename_with_extension in_data1 [in_data2 [in_data3...]] + \endcode + or + \code + [--output-format parameter-filename ] + --accumulate + [-s] + [--add | --mult] + [--power power_float] + [--times-scalar mult_scalar_float] + [--divide-scalar divide_scalar_float] + [--add-scalar add_scalar_float] + [--min-threshold min_threshold] + [--max-threshold max_threshold] + [--including-first] + [--verbose] + out_and_input_filename in_data2 [in_data3 [in_data4...]] + \endcode + + '--add' is default, and outputs the sum of the result of processed data. + '--mult' outputs the multiplication of the result of processed data.
          + The '--include-first' option can be used such that power and scalar + multiplication are done on the first input argument as well. + Otherwise these manipulations are done only on the 2nd, 3rd,.. argument.
          + The '--accumulate' option can be used to say that the first filename given will be + used for input AND output. Note that when using this option together with + '--including-first', the data in the + first filename will first be manipulated according to '--power' and '--times-scalar'.
          + The '-s' option is necessary if the arguments are projection data. + Otherwise, it is assumed the data are images.
          + For projection data, you can restrict the number of segments read/written + using the --max_segment_num_to_process option (unless --accumulate is used). + For example, using 2 as an argument of this option, will read/write + segments -2,-1,0,1,2.
          + Multiple occurences of '--times-scalar' and '--divide-scalar' are + allowed and will just result in accumulation of the factors.

          + The order of the manipulations is as follows:
          + (1) thresholding (2) power (3) scalar multiplication (4) scalar addition. + + The '--output-format' option can be used to write the output in + a different file format then the default (although this currently only + works for images). The parameter file should have the following format: + \verbatim + output file format parameters:= + output file format type:= + END:= + \endverbatim + See the stir::OutputFileFormat hierarchy for possible values. + + \par Examples +

            +
          • subtracting 2 files
            + \code stir_math --times-scalar -1 output in1 in2 \endcode +
          • sum the square of each file
            + \code stir_math --power 2 --including-first output in1 in2 \endcode +
          • Dividing 2 files after thresholding the 2nd file
            + \code stir_math --mult --power -1 --min-threshold .1 output in1 in2 \endcode +
          • Dividing 2 files, with first file set to the quotient
            + \code stir_math --accumulate --mult --power -1 in1 in2 \endcode + +
          + \warning There is no check that the data sizes and other info are compatible + and the output will have the largest data size in the input, + and the characteristics (like voxel-size or so) are taken from the first input data. + Hence, lots of funny effects can happen if data are not compatible. + + \warning When '--accumulate' is not used, the output file HAS to be different from all + the input files. + \warning The result of using non-integral powers on negative numbers is probably + system-dependent. + \warning For future compatibility, it is recommended to put the command line arguments + in the order that they will be executed (i.e. as listed above). It might be + that we take the order into account in a future release. + \author Kris Thielemans +*/ + +#include "stir/ArrayFunction.h" +#include "stir/DiscretisedDensity.h" +#include "stir/SegmentByView.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +#include "stir/Succeeded.h" +#include "stir/ProjDataInterfile.h" +#include "stir/ExamInfo.h" +#include "stir/utilities.h" +#include "stir/Succeeded.h" +#include "stir/NumericInfo.h" +#include "stir/KeyParser.h" +#include "stir/is_null_ptr.h" +#include "stir/modelling/ParametricDiscretisedDensity.h" +#include "stir/DynamicDiscretisedDensity.h" + +#include +#include +#include +#include +#include +#ifndef STIR_NO_NAMESPACES +using std::cerr; +using std::cout; +using std::endl; +using std::fstream; +using std::unary_function; +using std::transform; +#endif + + +USING_NAMESPACE_STIR + +// a function object that takes a power of a float, and then multiplies with a float, and finally adds a float +class pow_times_add: public unary_function +{ +public: + pow_times_add(const float add_scalar, const float mult_scalar, const float power, + const float min_threshold, const float max_threshold) + : add(add_scalar), mult(mult_scalar), power(power), + min_threshold(min_threshold), max_threshold(max_threshold) + {} + + float operator()(float const arg) const + { + const float value = min(max(arg, min_threshold), max_threshold); + return add+mult*(power==1?value : pow(value,power)); + } +private: + const float add; + const float mult; + const float power; + const float min_threshold; + const float max_threshold; +}; + +template +void process_data(const string& output_file_name, + const int num_files, char **argv, + const bool no_math_on_data, + const bool except_first, + const bool verbose, + const bool do_add, + const FunctionObjectT& pow_times_add_object, + const OutputFileFormat& output_format) +{ + std::auto_ptr< DataT > image_ptr = + read_from_file(*argv); + if (!no_math_on_data && !except_first ) + in_place_apply_function(*image_ptr, pow_times_add_object); + + shared_ptr< DataT > current_image_ptr; + + for (int i=1; ibegin_all(), image_ptr->end_all(), + current_image_ptr->begin_all(), + image_ptr->begin_all(), + std::plus()); + } + else + { + // *image_ptr *= *current_image_ptr; + std::transform(image_ptr->begin_all(), image_ptr->end_all(), + current_image_ptr->begin_all(), + image_ptr->begin_all(), + std::multiplies()); + } + } + + if (verbose) + cout << "Writing output image " << output_file_name << endl; + output_format.write_to_file(output_file_name, *image_ptr); +} + +template //class DataT, for DynProjectionData ? +void process_data(const string& output_file_name, + const int num_files, char **argv, + const bool no_math_on_data, + const bool except_first, + const bool verbose, + const bool do_add, + const FunctionObjectT& pow_times_add_object) +{ + shared_ptr + dyn_image_sptr(DynamicDiscretisedDensity::read_from_file(*argv)); + DynamicDiscretisedDensity & dyn_image = *dyn_image_sptr; + for(unsigned int frame_num=1;frame_num<=(dyn_image_sptr->get_time_frame_definitions()).get_num_frames();++frame_num) + { + if (!no_math_on_data && !except_first ) + in_place_apply_function(dyn_image[frame_num], pow_times_add_object); + } + shared_ptr dyn_current_image_sptr; + + for (int i=1; i(argv[i]); + DynamicDiscretisedDensity & dyn_current_image = *dyn_current_image_sptr; + for(unsigned int frame_num=1;frame_num<=(dyn_image_sptr->get_time_frame_definitions()).get_num_frames();++frame_num) + { + if (!no_math_on_data) + in_place_apply_function(dyn_current_image[frame_num], pow_times_add_object); + if (do_add) + { + // TODO the next line doesn't work with some DataT, but its replacement is ugly! + // also, it would be better to be able to call += on each element + //*image_ptr += *current_image_ptr; + std::transform(dyn_image[frame_num].begin_all(), dyn_image[frame_num].end_all(), + dyn_current_image[frame_num].begin_all(), + dyn_image[frame_num].begin_all(), + std::plus()); + } + else + { + // *image_ptr *= *current_image_ptr; + std::transform(dyn_image[frame_num].begin_all(), dyn_image[frame_num].end_all(), + dyn_current_image[frame_num].begin_all(), + dyn_image[frame_num].begin_all(), + std::multiplies()); + } + } + } + + if (verbose) + cout << "Writing output image " << output_file_name << endl; + dyn_image_sptr->write_to_ecat7(output_file_name); +} + +int +main(int argc, char **argv) +{ + if(argc<3) + { + cerr<< "Usage: " << argv[0] << "\n\t" + << "[--output-format parameter-filename ]\n\t" + << "[--parametric || --dynamic]\n\t" + << "[-s [--max_segment_num_to_process number] ]\n\t" + << "[--accumulate] [--add | --mult]\n\t" + << "[--power power_float]\n\t" + << "[--times-scalar mult_scalar_float]\n\t" + << "[--divide-scalar div_scalar_float]\n\t" + << "[--add-scalar add_scalar_float]\n\t" + << "[--min-threshold min_threshold]\n\t" + << "[--max-threshold max_threshold]\n\t" + << "[--including-first] [--verbose]\n\t" + << "output_filename_with_extension in_data1 [in_data2 [in_data3...]]\n\n" + << "(but everything on 1 line).\n" + << "'--add' is default, and outputs the sum of the result of processed data.\n" + << "'--mult' outputs the multiplication of the result of processed data.\n" + << "The '--include-first' option can be used such that power and\n\t" + << "scalar multiplication are done on the first input argument\n\t" + << "as well. " + << "Otherwise these manipulations are done only on the 2nd, 3rd,.. argument.\n" + << "The '--accumulate' option can be used to say that the first filename given will be " + "used for input AND output. Note that when using this option together with " + "'--including-first', the data in the first filename will first be manipulated " + "according to '--power', '--times-scalar' and '--divide-scalar'.\n\n" + << "Multiple occurences of '--times-scalar' and '--divide-scalar' are\n" + << "allowed and will just result in accumulation of the factors.\n\n" + << "The order of the manipulations is as follows:\n" + << "(1) thresholding (2) power (3) scalar multiplication (4) scalar addition.\n\n" + << "The '-s' option is necessary if the arguments are projection data." + << " Otherwise, it is assumed the data are images.\n\n" + << "For projection data, you can restrict the number of segments read/written\n" + << "using the --max_segment_num_to_process option (unless --accumulate is used).\n" + << "For example, using 2 as an argument of this option, will read/write" + << "segments -2,-1,0,1,2.\n\n" + << "WARNING: there is no check that the data sizes and other info are compatible " + << "and the output will have the largest data size in the input, " + << "and the characteristics (like voxel-size or so) are taken from the first input data. " + << "Hence, lots of funny effects can happen if data are not compatible.\n\n" + << "WARNING: For future compatibility, it is recommended to put \n" + << "the command line arguments in the order that they will be\n" + << "executed (i.e. as listed above). It might be that\n" + << "we take the order into account in a future release.\n"; + exit(EXIT_FAILURE); + } + const char * const program_name = argv[0]; + // skip program name + --argc; + ++argv; + + bool do_add = true; + bool accumulate=false; + float add_scalar = 0.F; + float mult_scalar = 1.F; + float min_threshold = NumericInfo().min_value(); + float max_threshold = NumericInfo().max_value(); + float power = 1; + bool except_first = true; + bool verbose = false; + bool do_projdata = false; + bool parametric = false; + bool dynamic = false; + + int max_segment_num_to_process = -1; + shared_ptr > > + output_format_sptr = + OutputFileFormat >::default_sptr(); + + + // first process command line options + + while (argc>0 && argv[0][0]=='-') + { + if (strcmp(argv[0], "--max_segment_num_to_process")==0) + { + if (argc<2) + { cerr << "Option '--max_segment_num_to_process' expects a (int) argument\n"; exit(EXIT_FAILURE); } + max_segment_num_to_process = atoi(argv[1]); + argc-=2; argv+=2; + } + else if (strcmp(argv[0], "--output-format")==0) + { + if (argc<2) + { + cerr << "Option '--output-format' expects a (filename) argument\n"; + exit(EXIT_FAILURE); + } + KeyParser parser; + parser.add_start_key("output file format parameters"); + parser.add_parsing_key("output file format type", &output_format_sptr); + parser.add_stop_key("END"); + if (parser.parse(argv[1]) == false || is_null_ptr(output_format_sptr)) + { + cerr << "Error parsing output file format from " << argv[1]<(atof(argv[1])); + argc-=2; argv+=2; + } + else if (strcmp(argv[0], "--times-scalar")==0) + { + if (argc<2) + { cerr << "Option '--times-scalar' expects a (float) argument\n"; exit(EXIT_FAILURE); } + mult_scalar *= static_cast(atof(argv[1])); + argc-=2; argv+=2; + } + else if (strcmp(argv[0], "--divide-scalar")==0) + { + if (argc<2) + { cerr << "Option '--divide-scalar' expects a (float) argument\n"; exit(EXIT_FAILURE); } + mult_scalar /= static_cast(atof(argv[1])); + argc-=2; argv+=2; + } + else if (strcmp(argv[0], "--max-threshold")==0) + { + if (argc<2) + { cerr << "Option '--max-threshold' expects a (float) argument\n"; exit(EXIT_FAILURE); } + max_threshold = static_cast(atof(argv[1])); + argc-=2; argv+=2; + } + else if (strcmp(argv[0], "--min-threshold")==0) + { + if (argc<2) + { cerr << "Option '--min-threshold' expects a (float) argument\n"; exit(EXIT_FAILURE); } + min_threshold = static_cast(atof(argv[1])); + argc-=2; argv+=2; + } + else if (strcmp(argv[0], "--power")==0) + { + if (argc<2) + { cerr << "Option '--power' expects an argument\n"; exit(EXIT_FAILURE); } + power = static_cast(atof(argv[1])); + argc-=2; argv+=2; + } + else if (strcmp(argv[0], "--including-first")==0) + { + except_first = false; + argc-=1; argv+=1; + } + else if (strcmp(argv[0], "--verbose")==0) + { + verbose = true; + argc-=1; argv+=1; + } + else if (strcmp(argv[0], "-s")==0) + { + do_projdata = true; + argc-=1; argv+=1; + } + else if (strcmp(argv[0], "--parametric")==0) + { + parametric = true; + argc-=1; argv+=1; + } + else if (strcmp(argv[0], "--dynamic")==0) + { + dynamic = true; + argc-=1; argv+=1; + } + else if (strcmp(argv[0], "--add")==0) + { + do_add = true; + argc-=1; argv+=1; + } + else if (strcmp(argv[0], "--mult")==0) + { + do_add = false; + argc-=1; argv+=1; + } + else if (strcmp(argv[0], "--accumulate")==0) + { + accumulate = true; + argc-=1; argv+=1; + } + else + { cerr << "Unknown option '" << argv[0] <<"'\n"; exit(EXIT_FAILURE); } + } + + if (argc==0) + { cerr << "No output file (nor input files) on command line\n"; exit(EXIT_FAILURE); } + + // find output filename + const string output_file_name = *argv; + if (!accumulate) + { + --argc; ++argv; + } + + // some basic error checking and output + const int num_files = argc; + + if (num_files==0) + { cerr << "No input files on command line\n"; exit(EXIT_FAILURE); } + + const bool no_math_on_data = power==1 && mult_scalar==1 && add_scalar==0 && + min_threshold == NumericInfo().min_value() && + max_threshold == NumericInfo().max_value(); + + + if (verbose) + { + cout << program_name << ": " + << (do_add ? "adding " : "multiplying ") + << num_files; + if (!no_math_on_data) + cout <<" files after thresholding to a min value of " + << min_threshold << "\n and a max value of " + << max_threshold << "\n and then taking a power of " + << power << "\n and then multiplying with " + << mult_scalar << "\n and then adding " + << add_scalar + << (except_first?"\n except for" : " including") + <<" the first file"; + cout << endl; + } + + // construct function object that does the manipulations on each data + pow_times_add pow_times_add_object(add_scalar, mult_scalar, power, min_threshold, max_threshold); + + // start the main processing + if (!do_projdata) + { + + if (!parametric && !dynamic) + { + process_data(output_file_name, + num_files, argv, + no_math_on_data, + except_first, + verbose, + do_add, + pow_times_add_object, + *output_format_sptr); + } + else if (parametric) + { + shared_ptr > + output_format_sptr = + OutputFileFormat::default_sptr(); + + process_data(output_file_name, + num_files, argv, + no_math_on_data, + except_first, + verbose, + do_add, + pow_times_add_object, + *output_format_sptr); + } + else if (dynamic) + { + process_data(output_file_name, + num_files, argv, + no_math_on_data, + except_first, + verbose, + do_add, + pow_times_add_object); + } + } + else // do_projdata + { + vector< shared_ptr > all_proj_data(num_files); + shared_ptr out_proj_data_ptr; + if (accumulate) + { + all_proj_data[0] = ProjData::read_from_file(argv[0], std::ios::in | std::ios::out); + out_proj_data_ptr = all_proj_data[0]; + + if (max_segment_num_to_process>=0) + warning("Parameter max_segment_num_to_process will be ignored."); + } + else + { + all_proj_data[0] = ProjData::read_from_file(argv[0]); + shared_ptr + output_proj_data_info_sptr((*all_proj_data[0]).get_proj_data_info_ptr()->clone()); + if (max_segment_num_to_process>=0) + { + output_proj_data_info_sptr-> + reduce_segment_range(-max_segment_num_to_process, + max_segment_num_to_process); + } + out_proj_data_ptr.reset(new ProjDataInterfile((*all_proj_data[0]).get_exam_info_sptr(), + output_proj_data_info_sptr, + output_file_name)); + } + if (num_files>1) + { + // reset time-frames as we don't really know what's happening with all this + ExamInfo new_exam_info(*out_proj_data_ptr->get_exam_info_ptr()); + new_exam_info.set_time_frame_definitions(TimeFrameDefinitions()); + out_proj_data_ptr->set_exam_info(new_exam_info); + } + // read rest of projection data headers + for (int i=1; iget_min_segment_num(); + segment_num <= out_proj_data_ptr->get_max_segment_num(); + ++segment_num) + { + if (verbose) + cout << "Processing segment num " << segment_num << " for all files" << endl; + SegmentByView segment_by_view = + (*all_proj_data[0]).get_segment_by_view(segment_num); + if (!no_math_on_data && !except_first ) + in_place_apply_function(segment_by_view, pow_times_add_object); + for (int i=1; i current_segment_by_view = + (*all_proj_data[i]).get_segment_by_view(segment_num); + if (!no_math_on_data) + in_place_apply_function(current_segment_by_view, pow_times_add_object); + if(do_add) + segment_by_view += current_segment_by_view; + else + segment_by_view *= current_segment_by_view; + } + + if (!(out_proj_data_ptr->set_segment(segment_by_view) == Succeeded::yes)) + warning("Error set_segment %d\n", segment_num); + } + } + return EXIT_SUCCESS; +} diff --git a/src/utilities/stir_write_pgm.cxx b/src/utilities/stir_write_pgm.cxx new file mode 100644 index 0000000000..2bf3eda394 --- /dev/null +++ b/src/utilities/stir_write_pgm.cxx @@ -0,0 +1,234 @@ +// +// +/* + Copyright (C) 2003, Hammersmith Imanet Ltd + Copyright (C) 2012-07-01 - 2012, Kris Thielemans + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief This program writes a PGM bitmap for an image (preliminary) + + Run to get a usage message. + + \author Kris Thielemans + + + \warning It only supports stir::VoxelsOnCartesianGrid type of images. +*/ + +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/IO/read_from_file.h" +#include "stir/round.h" +#include "stir/IndexRange3D.h" +#include "stir/Coordinate2D.h" +#include "stir/shared_ptr.h" +#include "stir/error.h" + +#include +#include +#include + +START_NAMESPACE_STIR +/* helper functions. + Currently copied from manip_image. +*/ +static VoxelsOnCartesianGrid +transpose_13(const VoxelsOnCartesianGrid & image) +{ + CartesianCoordinate3D origin = image.get_origin(); + std::swap(origin.x(), origin.z()); + CartesianCoordinate3D voxel_size = image.get_voxel_size(); + std::swap(voxel_size.x(), voxel_size.z()); + VoxelsOnCartesianGrid + out(IndexRange3D(image.get_min_x(),image.get_max_x(), + image.get_min_y(),image.get_max_y(), + image.get_min_z(),image.get_max_z()), + origin, + voxel_size); + for (int x=image.get_min_x(); x<=image.get_max_x(); ++x) + for (int y=image.get_min_y(); y<=image.get_max_y(); ++y) + for (int z=image.get_min_z(); z<=image.get_max_z(); ++z) + out[x][y][z] = image[z][y][x]; + return out; +} + +static VoxelsOnCartesianGrid +transpose_12(const VoxelsOnCartesianGrid & image) +{ + CartesianCoordinate3D origin = image.get_origin(); + std::swap(origin.y(), origin.z()); + CartesianCoordinate3D voxel_size = image.get_voxel_size(); + std::swap(voxel_size.y(), voxel_size.z()); + VoxelsOnCartesianGrid + out(IndexRange3D(image.get_min_y(),image.get_max_y(), + image.get_min_z(),image.get_max_z(), + image.get_min_x(),image.get_max_x()), + origin, + voxel_size); + for (int y=image.get_min_y(); y<=image.get_max_y(); ++y) + for (int z=image.get_min_z(); z<=image.get_max_z(); ++z) + for (int x=image.get_min_x(); x<=image.get_max_x(); ++x) + out[y][z][x] = image[z][y][x]; + return out; +} + +template +static +void +write_pgm (const std::string& filename, + const Array<2,elemT>& plane, + const double min_threshold, const double max_threshold) +{ + if (plane.get_length() == 0) + return; + + Coordinate2D min_indices; + Coordinate2D max_indices; + + if (!plane.get_regular_range(min_indices, max_indices)) + { + warning("write_pgm: can only display 'regular' arrays. Returning.\n"); + return; + } + + FILE *pgm = fopen ( filename.c_str() , "wb"); + if (pgm == NULL) + { + error("Error opening file %s for output to PGM.",filename.c_str()); + } + const int pgm_max = 255; + { + const int X = max_indices[2] - min_indices[2] + 1; + const int Y = (max_indices[1] - min_indices[1] + 1); + fprintf ( pgm, "P5\n#created by STIR\n%d %d\n%d\n", X , Y, pgm_max); + } + + for ( int y = min_indices[1]; y <= max_indices[1]; y++) + { + for ( int x = min_indices[2]; x <= max_indices[2]; x++) + { + double val = static_cast(plane[y][x]); + if (val>max_threshold) + val=max_threshold; + else if (val(stir::round(val)) ); + } + } + fclose ( pgm); +} + +END_NAMESPACE_STIR + +void print_usage_and_exit(const std::string& program_name) +{ + std::cerr<< "Usage: " << program_name << "\n\t" + << "[--min min_value] [--max max_value] \\\n\t" + << "[--orientation t|c|s] [--slice_index idx] \\\n\t" + << "output_filename.pgm input_filename \n" + << "min_value default to 0, max_value to max in image\n" + <<"oritentation defaults to transverse\n" + << "slice index is zero-based and defaults to the middle of the image (using rounding)\n"; + exit(EXIT_FAILURE); +} + +int +main(int argc, char **argv) +{ + const char * const program_name = argv[0]; + // skip program name + --argc; + ++argv; + + double min_threshold=0.; + double max_threshold=-1.; + char orientation = 't'; + int slice_index = -1; + + // first process command line options + while (argc>0 && argv[0][0]=='-' && argc>=2) + { + if (strcmp(argv[0], "--max")==0) + { + max_threshold = atof(argv[1]); + } + else if (strcmp(argv[0], "--min")==0) + { + min_threshold = atof(argv[1]); + } + else if (strcmp(argv[0], "--orientation")==0) + { + orientation = argv[1][0]; + } + else if (strcmp(argv[0], "--slice_index")==0) + { + slice_index = atoi(argv[1]); + } + else + { + std::cerr << "Unknown option: " < image( + dynamic_cast &> + (* stir::read_from_file >(input_filename))); + + if (max_threshold < min_threshold) + max_threshold = image.find_max(); + + switch (orientation) + { + case 't': case 'T': + // transverse, nothing to do at the moment + break; + case 's': case 'S': + // sagital + image=stir::transpose_13(image); + break; + case 'c': case 'C': + // coronal + image=stir::transpose_12(image); + break; + default: + stir::error("Unsupported orientation %d, has to be t,s, or c", orientation); + } + + if (slice_index<0) + slice_index = stir::round(image.get_length()/2.); + else if (slice_index >= image.get_length()) + stir::error("Requested slice index too large"); + + stir::write_pgm (filename, + image[slice_index + image.get_min_index()], + min_threshold, max_threshold); + + return EXIT_SUCCESS; +} diff --git a/src/utilities/warp_and_accumulate_gated_images.cxx b/src/utilities/warp_and_accumulate_gated_images.cxx new file mode 100644 index 0000000000..0f98586f8a --- /dev/null +++ b/src/utilities/warp_and_accumulate_gated_images.cxx @@ -0,0 +1,63 @@ +// +/* + Copyright (C) 2009 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + \ingroup spatial_transformation + + \brief This program corrects the motion from an image. + \author Charalampos Tsoumpas + */ +#include "stir/IO/OutputFileFormat.h" +#include "stir/DiscretisedDensity.h" +#include "stir/GatedDiscretisedDensity.h" +#include "stir/spatial_transformation/GatedSpatialTransformation.h" +#include "stir/Succeeded.h" +#include +#include +#include + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +USING_NAMESPACE_STIR + +using namespace BSpline; + + +int main(int argc, char **argv) +{ + if(argc<3 || argc>4) { + cerr<<"Usage: " << argv[0] << " \n"; + exit(EXIT_FAILURE); + } + // GatedDiscretisedDensity tmp; + const GatedDiscretisedDensity gated_density(argv[2]); + GatedSpatialTransformation transformation; + if(argc==3) + transformation.read_from_files(argv[2]); + else if(argc==4) + transformation.read_from_files(argv[3]); + shared_ptr > corrected_image_sptr((gated_density[1]).get_empty_copy()); + transformation.warp_image(*corrected_image_sptr,gated_density); + + const Succeeded res = OutputFileFormat >::default_sptr()-> + write_to_file(argv[1], *corrected_image_sptr); + return res==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/src/utilities/warp_image.cxx b/src/utilities/warp_image.cxx new file mode 100644 index 0000000000..1affc716d7 --- /dev/null +++ b/src/utilities/warp_image.cxx @@ -0,0 +1,71 @@ +/* + Copyright (C) 2010 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + \ingroup spatial_transformation + + \brief This program warps an image. + \author Charalampos Tsoumpas +*/ +#include "stir/spatial_transformation/warp_image.h" +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" + +USING_NAMESPACE_STIR + + +int main(int argc, char **argv) +{ + if(argc<6 || argc>8) { + std::cerr<<"Usage: " << argv[0] << " [x-motion-field] [y-motion-field] [z-motion-field] [spline_type] [extend_borders]\n" + << "all shifts are in mm\n" + << "x, y, z are in STIR conventions\n" + << "extend borders is either 1 or 0, defaults to 0\n"; + exit(EXIT_FAILURE); + } + + // get parameters from command line + char const * const output_filename = argv[1]; + char const * const input_filename = argv[2]; + char const * const motion_x_filename = argv[3]; + char const * const motion_y_filename = argv[4]; + char const * const motion_z_filename = argv[5]; + const int interpolation_type = (argc==6) ? 3 : atoi(argv[6]); + const bool extend_borders = (argc<=7) ? false : (atoi(argv[7])!=0); + + const BSpline::BSplineType spline_type = static_cast (interpolation_type); + + std::cerr << "Interpolating using with splines level: " << spline_type << "\n"; + // read image + const shared_ptr > density_sptr(read_from_file >(input_filename)); + const shared_ptr > motion_x_sptr( + read_from_file >(motion_x_filename)); + const shared_ptr > motion_y_sptr( + read_from_file >(motion_y_filename)); + const shared_ptr > motion_z_sptr( + read_from_file >(motion_z_filename)); + + const VoxelsOnCartesianGrid out_density=warp_image(density_sptr, motion_x_sptr, motion_y_sptr, motion_z_sptr, spline_type, extend_borders); + + // write image + Succeeded res = + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, out_density); + return res==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/src/utilities/write_proj_matrix_by_bin.cxx b/src/utilities/write_proj_matrix_by_bin.cxx new file mode 100644 index 0000000000..86164c11f3 --- /dev/null +++ b/src/utilities/write_proj_matrix_by_bin.cxx @@ -0,0 +1,129 @@ +// +// + +/*! + \file + \ingroup utilities + + \brief Program that writes a projection matrix by bin to file + + \author Kris Thielemans + +*/ +/* + Copyright (C) 2004- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details +*/ + +#include "stir/recon_buildblock/ProjMatrixByBinFromFile.h" +#include "stir/KeyParser.h" +#include "stir/ProjDataInfo.h" +#include "stir/ProjData.h" +// for ask_filename... +#include "stir/utilities.h" +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/Succeeded.h" +#include "stir/is_null_ptr.h" +#include "stir/Coordinate3D.h" +#include "stir/IO/read_from_file.h" + +#ifndef STIR_NO_NAMESPACES +using std::endl; +using std::cerr; +using std::endl; +#endif + + +int +main(int argc, char **argv) +{ + USING_NAMESPACE_STIR + if (argc==1 || argc>5) + { + cerr <<"Usage: " << argv[0] << " \\\n" + << "\toutput-filename [proj_data_file [projmatrixbybin-parfile [template-image]]]\n"; + exit(EXIT_FAILURE); + } + const string output_filename_prefix= + argc>1? argv[1] : ask_string("Output filename prefix"); + + shared_ptr proj_data_info_sptr; + if (argc>2) + { + shared_ptr proj_data_sptr = ProjData::read_from_file(argv[2]); + proj_data_info_sptr=proj_data_sptr->get_proj_data_info_ptr()->create_shared_clone(); + } + else + { + proj_data_info_sptr.reset(ProjDataInfo::ask_parameters()); + } + shared_ptr proj_matrix_sptr; + + if (argc>3) + { + KeyParser parser; + parser.add_start_key("ProjMatrixByBin parameters"); + parser.add_parsing_key("type", &proj_matrix_sptr); + parser.add_stop_key("END"); + parser.parse(argv[3]); + } + + shared_ptr > image_sptr; + + if (argc>4) + { + image_sptr = read_from_file >(argv[4]); + } + else + { + const float zoom = ask_num("Zoom factor (>1 means smaller voxels)",0.F,100.F,1.F); + int xy_size = static_cast(proj_data_info_sptr->get_num_tangential_poss()*zoom); + xy_size = ask_num("Number of x,y pixels",3,xy_size*2,xy_size); + int z_size = 2*proj_data_info_sptr->get_scanner_ptr()->get_num_rings()-1; + z_size = ask_num("Number of z pixels",1,1000,z_size); + VoxelsOnCartesianGrid * vox_image_ptr = + new VoxelsOnCartesianGrid(*proj_data_info_sptr, + zoom, + Coordinate3D(0,0,0), + Coordinate3D(z_size,xy_size,xy_size)); + const float z_origin = + ask_num("Shift z-origin (in pixels)", + -vox_image_ptr->get_length()/2, + vox_image_ptr->get_length()/2, + 0) + *vox_image_ptr->get_voxel_size().z(); + vox_image_ptr->set_origin(Coordinate3D(z_origin,0,0)); + + image_sptr.reset(vox_image_ptr); + } + + while (is_null_ptr(proj_matrix_sptr)) + { + proj_matrix_sptr.reset(ProjMatrixByBin::ask_type_and_parameters()); + } + + proj_matrix_sptr->set_up(proj_data_info_sptr, + image_sptr); + + return + ProjMatrixByBinFromFile:: + write_to_file(output_filename_prefix, + *proj_matrix_sptr, + proj_data_info_sptr, + *image_sptr) == Succeeded::yes ? + EXIT_SUCCESS : EXIT_FAILURE; +} + +//cache_proj_matrix_elems_for_one_bin diff --git a/src/utilities/zeropad_planes.cxx b/src/utilities/zeropad_planes.cxx new file mode 100644 index 0000000000..45ebcec4ef --- /dev/null +++ b/src/utilities/zeropad_planes.cxx @@ -0,0 +1,76 @@ +/* + Copyright (C) 2011 - 2013, King's College London + This file is part of STIR. + + This file is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.3 of the License, or + (at your option) any later version. + + This file 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 Lesser General Public License for more details. + + See STIR/LICENSE.txt for details + */ +/*! + \file + \ingroup utilities + + \brief This program zero pads the start & end planes of an image. + \author Charalampos Tsoumpas + */ +#include "stir/DiscretisedDensity.h" +#include "stir/Succeeded.h" +#include "stir/IO/OutputFileFormat.h" + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if(argc!=4) { + std::cerr << "Usage: " << argv[0] + << " [number of axial planes] \n"; + exit(EXIT_FAILURE); + } + char const * const output_filename_prefix = argv[1]; + char const * const input_filename = argv[2]; + const int num_planes = atoi(argv[3]); + + const shared_ptr > image_sptr(DiscretisedDensity<3,float>::read_from_file(input_filename)); + const shared_ptr > out_image_sptr(image_sptr->clone()); + + BasicCoordinate<3,int> c, min, max; + min[1]=image_sptr->get_min_index(); + max[1]=image_sptr->get_max_index(); + + for (c[1]=min[1]; c[1]<=min[1]+num_planes-1; ++c[1]) + { + min[2]=(*image_sptr)[c[1]].get_min_index(); + max[2]=(*image_sptr)[c[1]].get_max_index(); + for (c[2]=min[2]; c[2]<=max[2]; ++c[2]) + { + min[3]=(*image_sptr)[c[1]][c[2]].get_min_index(); + max[3]=(*image_sptr)[c[1]][c[2]].get_max_index(); + for (c[3]=min[3]; c[3]<=max[3]; ++c[3]) + (*out_image_sptr)[c[1]][c[2]][c[3]]=0.F; + } + } + for (c[1]=max[1]; c[1]>=max[1]-num_planes+1; --c[1]) + { + min[2]=(*image_sptr)[c[1]].get_min_index(); + max[2]=(*image_sptr)[c[1]].get_max_index(); + for (c[2]=min[2]; c[2]<=max[2]; ++c[2]) + { + min[3]=(*image_sptr)[c[1]][c[2]].get_min_index(); + max[3]=(*image_sptr)[c[1]][c[2]].get_max_index(); + for (c[3]=min[3]; c[3]<=max[3]; ++c[3]) + (*out_image_sptr)[c[1]][c[2]][c[3]]=0.F; + } + } + const Succeeded res = OutputFileFormat >::default_sptr()-> + write_to_file(output_filename_prefix, *out_image_sptr); + + return res==Succeeded::yes ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/src/utilities/zoom_image.cxx b/src/utilities/zoom_image.cxx new file mode 100644 index 0000000000..542c5afca2 --- /dev/null +++ b/src/utilities/zoom_image.cxx @@ -0,0 +1,150 @@ +// +// +/* + Copyright (C) 2000- 2011, Hammersmith Imanet Ltd + This file is part of STIR. + + This file 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 2.0 of the License, or + (at your option) any later version. + + This file 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. + + See STIR/LICENSE.txt for details +*/ +/*! + \file + \ingroup utilities + + \brief This program serves as a stand-alone zoom/trim utility for + image files + Run without arguments to get a usage message. + \see zoom_image_in_place for conventions + \author Kris Thielemans + +*/ +#include "stir/VoxelsOnCartesianGrid.h" +#include "stir/zoom.h" +#include "stir/IO/OutputFileFormat.h" +#include "stir/IO/read_from_file.h" +//#include "stir/utilities.h" +#include "stir/Succeeded.h" + + +#ifndef STIR_NO_NAMESPACES +using std::cerr; +#endif + +USING_NAMESPACE_STIR + +int main(int argc, char **argv) +{ + if(argc<4) { + cerr<<"Usage: \n" + << '\t' << argv[0] << " sizexy [zoomxy [offset_in_mm_x [offset_in_mm_y [sizez [zoomz [offset_in_mm_z]]]]]]]\n" + << "or alternatively\n" + << '\t' << argv[0] << " --template template_filename \n"; + + exit(EXIT_FAILURE); + } + + // get parameters from command line + if (strcmp(argv[1], "--template")==0) + { + char const * const template_filename = argv[2]; + char const * const output_filename = argv[3]; + char const * const input_filename = argv[4]; + + shared_ptr > + density_sptr(read_from_file >(input_filename)); + shared_ptr > + output_density_sptr(read_from_file >(template_filename)); + output_density_sptr->fill(0); + + // zoom + { + const VoxelsOnCartesianGrid * image_ptr = + dynamic_cast *>(density_sptr.get()); + if (image_ptr==NULL) + error("Input image is not of VoxelsOnCartesianGrid type. Sorry\n"); + VoxelsOnCartesianGrid * output_image_ptr = + dynamic_cast *>(output_density_sptr.get()); + if (output_image_ptr==NULL) + error("Output image is not of VoxelsOnCartesianGrid type. Sorry\n"); + zoom_image(*output_image_ptr, *image_ptr); + } + // write it to file + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, *output_density_sptr); + + return EXIT_SUCCESS; + } + + // old cmdline conventions + + char const * const output_filename = argv[1]; + char const * const input_filename = argv[2]; + const int sizexy= atoi(argv[3]); + float zoomxy=1.F; + float offset_in_mm_x=0.F; + float offset_in_mm_y=0.F; + int sizez=-1; // default + float zoomz=1.F; + float offset_in_mm_z=0.F; + + if (argc>4) + zoomxy = static_cast(atof(argv[4])); + if (argc>5) + offset_in_mm_x = static_cast(atof(argv[5])); + if (argc>6) + offset_in_mm_y = static_cast(atof(argv[6])); + if (argc>7) + sizez = atoi(argv[7]); + if (argc>8) + zoomz = static_cast(atof(argv[8])); + if (argc>9) + offset_in_mm_z = static_cast(atof(argv[9])); + + // read image + + shared_ptr > + density_ptr(read_from_file >(input_filename)); + + const VoxelsOnCartesianGrid * image_ptr = + dynamic_cast *>(density_ptr.get()); + + if (image_ptr==NULL) + error("Image is not of VoxelsOnCartesianGrid type. Sorry\n"); + + // initialise zooming parameters + + if (sizez<0) + sizez = image_ptr->get_z_size(); + + const CartesianCoordinate3D + zooms(zoomz,zoomxy,zoomxy); + + const CartesianCoordinate3D + offsets_in_mm(offset_in_mm_z,offset_in_mm_y,offset_in_mm_x); + const CartesianCoordinate3D + new_sizes(sizez, sizexy, sizexy); + + + const VoxelsOnCartesianGrid new_image = + zoom_image(*image_ptr, zooms, offsets_in_mm, new_sizes); + + // write it to file + OutputFileFormat >::default_sptr()-> + write_to_file(output_filename, new_image); + + return EXIT_SUCCESS; + +} + + + +